| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139131401314113142131431314413145131461314713148131491315013151131521315313154131551315613157131581315913160131611316213163131641316513166131671316813169131701317113172131731317413175131761317713178131791318013181131821318313184131851318613187131881318913190131911319213193131941319513196131971319813199132001320113202132031320413205132061320713208132091321013211132121321313214132151321613217132181321913220132211322213223132241322513226132271322813229132301323113232132331323413235132361323713238132391324013241132421324313244132451324613247132481324913250132511325213253132541325513256132571325813259132601326113262132631326413265132661326713268132691327013271132721327313274132751327613277132781327913280132811328213283132841328513286132871328813289132901329113292132931329413295132961329713298132991330013301133021330313304133051330613307133081330913310133111331213313133141331513316133171331813319133201332113322133231332413325133261332713328133291333013331133321333313334133351333613337133381333913340133411334213343133441334513346133471334813349133501335113352133531335413355133561335713358133591336013361133621336313364133651336613367133681336913370133711337213373133741337513376133771337813379133801338113382133831338413385133861338713388133891339013391133921339313394133951339613397133981339913400134011340213403134041340513406134071340813409134101341113412134131341413415134161341713418134191342013421134221342313424134251342613427134281342913430134311343213433134341343513436134371343813439134401344113442134431344413445134461344713448134491345013451134521345313454134551345613457134581345913460134611346213463134641346513466134671346813469134701347113472134731347413475134761347713478134791348013481134821348313484134851348613487134881348913490134911349213493134941349513496134971349813499135001350113502135031350413505135061350713508135091351013511135121351313514135151351613517135181351913520135211352213523135241352513526135271352813529135301353113532135331353413535135361353713538135391354013541135421354313544135451354613547135481354913550135511355213553135541355513556135571355813559135601356113562135631356413565135661356713568135691357013571135721357313574135751357613577135781357913580135811358213583135841358513586135871358813589135901359113592135931359413595135961359713598135991360013601136021360313604136051360613607136081360913610136111361213613136141361513616136171361813619136201362113622136231362413625136261362713628136291363013631136321363313634136351363613637136381363913640136411364213643136441364513646136471364813649136501365113652136531365413655136561365713658136591366013661136621366313664136651366613667136681366913670136711367213673136741367513676136771367813679136801368113682136831368413685136861368713688136891369013691136921369313694136951369613697136981369913700137011370213703137041370513706137071370813709137101371113712137131371413715137161371713718137191372013721137221372313724137251372613727137281372913730137311373213733137341373513736137371373813739137401374113742137431374413745137461374713748137491375013751137521375313754137551375613757137581375913760137611376213763137641376513766137671376813769137701377113772137731377413775137761377713778137791378013781137821378313784137851378613787137881378913790137911379213793137941379513796137971379813799138001380113802138031380413805138061380713808138091381013811138121381313814138151381613817138181381913820138211382213823138241382513826138271382813829138301383113832138331383413835138361383713838138391384013841138421384313844138451384613847138481384913850138511385213853138541385513856138571385813859138601386113862138631386413865138661386713868138691387013871138721387313874138751387613877138781387913880138811388213883138841388513886138871388813889138901389113892138931389413895138961389713898138991390013901139021390313904139051390613907139081390913910139111391213913139141391513916139171391813919139201392113922139231392413925139261392713928139291393013931139321393313934139351393613937139381393913940139411394213943139441394513946139471394813949139501395113952139531395413955139561395713958139591396013961139621396313964139651396613967139681396913970139711397213973139741397513976139771397813979139801398113982139831398413985139861398713988139891399013991139921399313994139951399613997139981399914000140011400214003140041400514006140071400814009140101401114012140131401414015140161401714018140191402014021140221402314024140251402614027140281402914030140311403214033140341403514036140371403814039140401404114042140431404414045140461404714048140491405014051140521405314054140551405614057140581405914060140611406214063140641406514066140671406814069140701407114072140731407414075140761407714078140791408014081140821408314084140851408614087140881408914090140911409214093140941409514096140971409814099141001410114102141031410414105141061410714108141091411014111141121411314114141151411614117141181411914120141211412214123141241412514126141271412814129141301413114132141331413414135141361413714138141391414014141141421414314144141451414614147141481414914150141511415214153141541415514156141571415814159141601416114162141631416414165141661416714168141691417014171141721417314174141751417614177141781417914180141811418214183141841418514186141871418814189141901419114192141931419414195141961419714198141991420014201142021420314204142051420614207142081420914210142111421214213142141421514216142171421814219142201422114222142231422414225142261422714228142291423014231142321423314234142351423614237142381423914240142411424214243142441424514246142471424814249142501425114252142531425414255142561425714258142591426014261142621426314264142651426614267142681426914270142711427214273142741427514276142771427814279142801428114282142831428414285142861428714288142891429014291142921429314294142951429614297142981429914300143011430214303143041430514306143071430814309143101431114312143131431414315143161431714318143191432014321143221432314324143251432614327143281432914330143311433214333143341433514336143371433814339143401434114342143431434414345143461434714348143491435014351143521435314354143551435614357143581435914360143611436214363143641436514366143671436814369143701437114372143731437414375143761437714378143791438014381143821438314384143851438614387143881438914390143911439214393143941439514396143971439814399144001440114402144031440414405144061440714408144091441014411144121441314414144151441614417144181441914420144211442214423144241442514426144271442814429144301443114432144331443414435144361443714438144391444014441144421444314444144451444614447144481444914450144511445214453144541445514456144571445814459144601446114462144631446414465144661446714468144691447014471144721447314474144751447614477144781447914480144811448214483144841448514486144871448814489144901449114492144931449414495144961449714498144991450014501145021450314504145051450614507145081450914510145111451214513145141451514516145171451814519145201452114522145231452414525145261452714528145291453014531145321453314534145351453614537145381453914540145411454214543145441454514546145471454814549145501455114552145531455414555145561455714558145591456014561145621456314564145651456614567145681456914570145711457214573145741457514576145771457814579145801458114582145831458414585145861458714588145891459014591145921459314594145951459614597145981459914600146011460214603146041460514606146071460814609146101461114612146131461414615146161461714618146191462014621146221462314624146251462614627146281462914630146311463214633146341463514636146371463814639146401464114642146431464414645146461464714648146491465014651146521465314654146551465614657146581465914660146611466214663146641466514666146671466814669146701467114672146731467414675146761467714678146791468014681146821468314684146851468614687146881468914690146911469214693146941469514696146971469814699147001470114702147031470414705147061470714708147091471014711147121471314714147151471614717147181471914720147211472214723147241472514726147271472814729147301473114732147331473414735147361473714738147391474014741147421474314744147451474614747147481474914750147511475214753147541475514756147571475814759147601476114762147631476414765147661476714768147691477014771147721477314774147751477614777147781477914780147811478214783147841478514786147871478814789147901479114792147931479414795147961479714798147991480014801148021480314804148051480614807148081480914810148111481214813148141481514816148171481814819148201482114822148231482414825148261482714828148291483014831148321483314834148351483614837148381483914840148411484214843148441484514846148471484814849148501485114852148531485414855148561485714858148591486014861148621486314864148651486614867148681486914870148711487214873148741487514876148771487814879148801488114882148831488414885148861488714888148891489014891148921489314894148951489614897148981489914900149011490214903149041490514906149071490814909149101491114912149131491414915149161491714918149191492014921149221492314924149251492614927149281492914930149311493214933149341493514936149371493814939149401494114942149431494414945149461494714948149491495014951149521495314954149551495614957149581495914960149611496214963149641496514966149671496814969149701497114972149731497414975149761497714978149791498014981149821498314984149851498614987149881498914990149911499214993149941499514996149971499814999150001500115002150031500415005150061500715008150091501015011150121501315014150151501615017150181501915020150211502215023150241502515026150271502815029150301503115032150331503415035150361503715038150391504015041150421504315044150451504615047150481504915050150511505215053150541505515056150571505815059150601506115062150631506415065150661506715068150691507015071150721507315074150751507615077150781507915080150811508215083150841508515086150871508815089150901509115092150931509415095150961509715098150991510015101151021510315104151051510615107151081510915110151111511215113151141511515116151171511815119151201512115122151231512415125151261512715128151291513015131151321513315134151351513615137151381513915140151411514215143151441514515146151471514815149151501515115152151531515415155151561515715158151591516015161151621516315164151651516615167151681516915170151711517215173151741517515176151771517815179151801518115182151831518415185151861518715188151891519015191151921519315194151951519615197151981519915200152011520215203152041520515206152071520815209152101521115212152131521415215152161521715218152191522015221152221522315224152251522615227152281522915230152311523215233152341523515236152371523815239152401524115242152431524415245152461524715248152491525015251152521525315254152551525615257152581525915260152611526215263152641526515266152671526815269152701527115272152731527415275152761527715278152791528015281152821528315284152851528615287152881528915290152911529215293152941529515296152971529815299153001530115302153031530415305153061530715308153091531015311153121531315314153151531615317153181531915320153211532215323153241532515326153271532815329153301533115332153331533415335153361533715338153391534015341153421534315344153451534615347153481534915350153511535215353153541535515356153571535815359153601536115362153631536415365153661536715368153691537015371153721537315374153751537615377153781537915380153811538215383153841538515386153871538815389153901539115392153931539415395153961539715398153991540015401154021540315404154051540615407154081540915410154111541215413154141541515416154171541815419154201542115422154231542415425154261542715428154291543015431154321543315434154351543615437154381543915440154411544215443154441544515446154471544815449154501545115452154531545415455154561545715458154591546015461154621546315464154651546615467154681546915470154711547215473154741547515476154771547815479154801548115482154831548415485154861548715488154891549015491154921549315494154951549615497154981549915500155011550215503155041550515506155071550815509155101551115512155131551415515155161551715518155191552015521155221552315524155251552615527155281552915530155311553215533155341553515536155371553815539155401554115542155431554415545155461554715548155491555015551155521555315554155551555615557155581555915560155611556215563155641556515566155671556815569155701557115572155731557415575155761557715578155791558015581155821558315584155851558615587155881558915590155911559215593155941559515596155971559815599156001560115602156031560415605156061560715608156091561015611156121561315614156151561615617156181561915620156211562215623156241562515626156271562815629156301563115632156331563415635156361563715638156391564015641156421564315644156451564615647156481564915650156511565215653156541565515656156571565815659156601566115662156631566415665156661566715668156691567015671156721567315674156751567615677156781567915680156811568215683156841568515686156871568815689156901569115692156931569415695156961569715698156991570015701157021570315704157051570615707157081570915710157111571215713157141571515716157171571815719157201572115722157231572415725157261572715728157291573015731157321573315734157351573615737157381573915740157411574215743157441574515746157471574815749157501575115752157531575415755157561575715758157591576015761157621576315764157651576615767157681576915770157711577215773157741577515776157771577815779157801578115782157831578415785157861578715788157891579015791157921579315794157951579615797157981579915800158011580215803158041580515806158071580815809158101581115812158131581415815158161581715818158191582015821158221582315824158251582615827158281582915830158311583215833158341583515836158371583815839158401584115842158431584415845158461584715848158491585015851158521585315854158551585615857158581585915860158611586215863158641586515866158671586815869158701587115872158731587415875158761587715878158791588015881158821588315884158851588615887158881588915890158911589215893158941589515896158971589815899159001590115902159031590415905159061590715908159091591015911159121591315914159151591615917159181591915920159211592215923159241592515926159271592815929159301593115932159331593415935159361593715938159391594015941159421594315944159451594615947159481594915950159511595215953159541595515956159571595815959159601596115962159631596415965159661596715968159691597015971159721597315974159751597615977159781597915980159811598215983159841598515986159871598815989159901599115992159931599415995159961599715998159991600016001160021600316004160051600616007160081600916010160111601216013160141601516016160171601816019160201602116022160231602416025160261602716028160291603016031160321603316034160351603616037160381603916040160411604216043160441604516046160471604816049160501605116052160531605416055160561605716058160591606016061160621606316064160651606616067160681606916070160711607216073160741607516076160771607816079160801608116082160831608416085160861608716088160891609016091160921609316094160951609616097160981609916100161011610216103161041610516106161071610816109161101611116112161131611416115161161611716118161191612016121161221612316124161251612616127161281612916130161311613216133161341613516136161371613816139161401614116142161431614416145161461614716148161491615016151161521615316154161551615616157161581615916160161611616216163161641616516166161671616816169161701617116172161731617416175161761617716178161791618016181161821618316184161851618616187161881618916190161911619216193161941619516196161971619816199162001620116202162031620416205162061620716208162091621016211162121621316214162151621616217162181621916220162211622216223162241622516226162271622816229162301623116232162331623416235162361623716238162391624016241162421624316244162451624616247162481624916250162511625216253162541625516256162571625816259162601626116262162631626416265162661626716268162691627016271162721627316274162751627616277162781627916280162811628216283162841628516286162871628816289162901629116292162931629416295162961629716298162991630016301163021630316304163051630616307163081630916310163111631216313163141631516316163171631816319163201632116322163231632416325163261632716328163291633016331163321633316334163351633616337163381633916340163411634216343163441634516346163471634816349163501635116352163531635416355163561635716358163591636016361163621636316364163651636616367163681636916370163711637216373163741637516376163771637816379163801638116382163831638416385163861638716388163891639016391163921639316394163951639616397163981639916400164011640216403164041640516406164071640816409164101641116412164131641416415164161641716418164191642016421164221642316424164251642616427164281642916430164311643216433164341643516436164371643816439164401644116442164431644416445164461644716448164491645016451164521645316454164551645616457164581645916460164611646216463164641646516466164671646816469164701647116472164731647416475164761647716478164791648016481164821648316484164851648616487164881648916490164911649216493164941649516496164971649816499165001650116502165031650416505165061650716508165091651016511165121651316514165151651616517165181651916520165211652216523165241652516526165271652816529165301653116532165331653416535165361653716538165391654016541165421654316544165451654616547165481654916550165511655216553165541655516556165571655816559165601656116562165631656416565165661656716568165691657016571165721657316574165751657616577165781657916580165811658216583165841658516586165871658816589165901659116592165931659416595165961659716598165991660016601166021660316604166051660616607166081660916610166111661216613166141661516616166171661816619166201662116622166231662416625166261662716628166291663016631166321663316634166351663616637166381663916640166411664216643166441664516646166471664816649166501665116652166531665416655166561665716658166591666016661166621666316664166651666616667166681666916670166711667216673166741667516676166771667816679166801668116682166831668416685166861668716688166891669016691166921669316694166951669616697166981669916700167011670216703167041670516706167071670816709167101671116712167131671416715167161671716718167191672016721167221672316724167251672616727167281672916730167311673216733167341673516736167371673816739167401674116742167431674416745167461674716748167491675016751167521675316754167551675616757167581675916760167611676216763167641676516766167671676816769167701677116772167731677416775167761677716778167791678016781167821678316784167851678616787167881678916790167911679216793167941679516796167971679816799168001680116802168031680416805168061680716808168091681016811168121681316814168151681616817168181681916820168211682216823168241682516826168271682816829168301683116832168331683416835168361683716838168391684016841168421684316844168451684616847168481684916850168511685216853168541685516856168571685816859168601686116862168631686416865168661686716868168691687016871168721687316874168751687616877168781687916880168811688216883168841688516886168871688816889168901689116892168931689416895168961689716898168991690016901169021690316904169051690616907169081690916910169111691216913169141691516916169171691816919169201692116922169231692416925169261692716928169291693016931169321693316934169351693616937169381693916940169411694216943169441694516946169471694816949169501695116952169531695416955169561695716958169591696016961169621696316964169651696616967169681696916970169711697216973169741697516976169771697816979169801698116982169831698416985169861698716988169891699016991169921699316994169951699616997169981699917000170011700217003170041700517006170071700817009170101701117012170131701417015170161701717018170191702017021170221702317024170251702617027170281702917030170311703217033170341703517036170371703817039170401704117042170431704417045170461704717048170491705017051170521705317054170551705617057170581705917060170611706217063170641706517066170671706817069170701707117072170731707417075170761707717078170791708017081170821708317084170851708617087170881708917090170911709217093170941709517096170971709817099171001710117102171031710417105171061710717108171091711017111171121711317114171151711617117171181711917120171211712217123171241712517126171271712817129171301713117132171331713417135171361713717138171391714017141171421714317144171451714617147171481714917150171511715217153171541715517156171571715817159171601716117162171631716417165171661716717168171691717017171171721717317174171751717617177171781717917180171811718217183171841718517186171871718817189171901719117192171931719417195171961719717198171991720017201172021720317204172051720617207172081720917210172111721217213172141721517216172171721817219172201722117222172231722417225172261722717228172291723017231172321723317234172351723617237172381723917240172411724217243172441724517246172471724817249172501725117252172531725417255172561725717258172591726017261172621726317264172651726617267172681726917270172711727217273172741727517276172771727817279172801728117282172831728417285172861728717288172891729017291172921729317294172951729617297172981729917300173011730217303173041730517306173071730817309173101731117312173131731417315173161731717318173191732017321173221732317324173251732617327173281732917330173311733217333173341733517336173371733817339173401734117342173431734417345173461734717348173491735017351173521735317354173551735617357173581735917360173611736217363173641736517366173671736817369173701737117372173731737417375173761737717378173791738017381173821738317384173851738617387173881738917390173911739217393173941739517396173971739817399174001740117402174031740417405174061740717408174091741017411174121741317414174151741617417174181741917420174211742217423174241742517426174271742817429174301743117432174331743417435174361743717438174391744017441174421744317444174451744617447174481744917450174511745217453174541745517456174571745817459174601746117462174631746417465174661746717468174691747017471174721747317474174751747617477174781747917480174811748217483174841748517486174871748817489174901749117492174931749417495174961749717498174991750017501175021750317504175051750617507175081750917510175111751217513175141751517516175171751817519175201752117522175231752417525175261752717528175291753017531175321753317534175351753617537175381753917540175411754217543175441754517546175471754817549175501755117552175531755417555175561755717558175591756017561175621756317564175651756617567175681756917570175711757217573175741757517576175771757817579175801758117582175831758417585175861758717588175891759017591175921759317594175951759617597175981759917600176011760217603176041760517606176071760817609176101761117612176131761417615176161761717618176191762017621176221762317624176251762617627176281762917630176311763217633176341763517636176371763817639176401764117642176431764417645176461764717648176491765017651176521765317654176551765617657176581765917660176611766217663176641766517666176671766817669176701767117672176731767417675176761767717678176791768017681176821768317684176851768617687176881768917690176911769217693176941769517696176971769817699177001770117702177031770417705177061770717708177091771017711177121771317714177151771617717177181771917720177211772217723177241772517726177271772817729177301773117732177331773417735177361773717738177391774017741177421774317744177451774617747177481774917750177511775217753177541775517756177571775817759177601776117762177631776417765177661776717768177691777017771177721777317774177751777617777177781777917780177811778217783177841778517786177871778817789177901779117792177931779417795177961779717798177991780017801178021780317804178051780617807178081780917810178111781217813178141781517816178171781817819178201782117822178231782417825178261782717828178291783017831178321783317834178351783617837178381783917840178411784217843178441784517846178471784817849178501785117852178531785417855178561785717858178591786017861178621786317864178651786617867178681786917870178711787217873178741787517876178771787817879178801788117882178831788417885178861788717888178891789017891178921789317894178951789617897178981789917900179011790217903179041790517906179071790817909179101791117912179131791417915179161791717918179191792017921179221792317924179251792617927179281792917930179311793217933179341793517936179371793817939179401794117942179431794417945179461794717948179491795017951179521795317954179551795617957179581795917960179611796217963179641796517966179671796817969179701797117972179731797417975179761797717978179791798017981179821798317984179851798617987179881798917990179911799217993179941799517996179971799817999180001800118002180031800418005180061800718008180091801018011180121801318014180151801618017180181801918020180211802218023180241802518026180271802818029180301803118032180331803418035180361803718038180391804018041180421804318044180451804618047180481804918050180511805218053180541805518056180571805818059180601806118062180631806418065180661806718068180691807018071180721807318074180751807618077180781807918080180811808218083180841808518086180871808818089180901809118092180931809418095180961809718098180991810018101181021810318104181051810618107181081810918110181111811218113181141811518116181171811818119181201812118122181231812418125181261812718128181291813018131181321813318134181351813618137181381813918140181411814218143181441814518146181471814818149181501815118152181531815418155181561815718158181591816018161181621816318164181651816618167181681816918170181711817218173181741817518176181771817818179181801818118182181831818418185181861818718188181891819018191181921819318194181951819618197181981819918200182011820218203182041820518206182071820818209182101821118212182131821418215182161821718218182191822018221182221822318224182251822618227182281822918230182311823218233182341823518236182371823818239182401824118242182431824418245182461824718248182491825018251182521825318254182551825618257182581825918260182611826218263182641826518266182671826818269182701827118272182731827418275182761827718278182791828018281182821828318284182851828618287182881828918290182911829218293182941829518296182971829818299183001830118302183031830418305183061830718308183091831018311183121831318314183151831618317183181831918320183211832218323183241832518326183271832818329183301833118332183331833418335183361833718338183391834018341183421834318344183451834618347183481834918350183511835218353183541835518356183571835818359183601836118362183631836418365183661836718368183691837018371183721837318374183751837618377183781837918380183811838218383183841838518386183871838818389183901839118392183931839418395183961839718398183991840018401184021840318404184051840618407184081840918410184111841218413184141841518416184171841818419184201842118422184231842418425184261842718428184291843018431184321843318434184351843618437184381843918440184411844218443184441844518446184471844818449184501845118452184531845418455184561845718458184591846018461184621846318464184651846618467184681846918470184711847218473184741847518476184771847818479184801848118482184831848418485184861848718488184891849018491184921849318494184951849618497184981849918500185011850218503185041850518506185071850818509185101851118512185131851418515185161851718518185191852018521185221852318524185251852618527185281852918530185311853218533185341853518536185371853818539185401854118542185431854418545185461854718548185491855018551185521855318554185551855618557185581855918560185611856218563185641856518566185671856818569185701857118572185731857418575185761857718578185791858018581185821858318584185851858618587185881858918590185911859218593185941859518596185971859818599186001860118602186031860418605186061860718608186091861018611186121861318614186151861618617186181861918620186211862218623186241862518626186271862818629186301863118632186331863418635186361863718638186391864018641186421864318644186451864618647186481864918650186511865218653186541865518656186571865818659186601866118662186631866418665186661866718668186691867018671186721867318674186751867618677186781867918680186811868218683186841868518686186871868818689186901869118692186931869418695186961869718698186991870018701187021870318704187051870618707187081870918710187111871218713187141871518716187171871818719187201872118722187231872418725187261872718728187291873018731187321873318734187351873618737187381873918740187411874218743187441874518746187471874818749187501875118752187531875418755187561875718758187591876018761187621876318764187651876618767187681876918770187711877218773187741877518776187771877818779187801878118782187831878418785187861878718788187891879018791187921879318794187951879618797187981879918800188011880218803188041880518806188071880818809188101881118812188131881418815188161881718818188191882018821188221882318824188251882618827188281882918830188311883218833188341883518836188371883818839188401884118842188431884418845188461884718848188491885018851188521885318854188551885618857188581885918860188611886218863188641886518866188671886818869188701887118872188731887418875188761887718878188791888018881188821888318884188851888618887188881888918890188911889218893188941889518896188971889818899189001890118902189031890418905189061890718908189091891018911189121891318914189151891618917189181891918920189211892218923189241892518926189271892818929189301893118932189331893418935189361893718938189391894018941189421894318944189451894618947189481894918950189511895218953189541895518956189571895818959189601896118962189631896418965189661896718968189691897018971189721897318974189751897618977189781897918980189811898218983189841898518986189871898818989189901899118992189931899418995189961899718998189991900019001190021900319004190051900619007190081900919010190111901219013190141901519016190171901819019190201902119022190231902419025190261902719028190291903019031190321903319034190351903619037190381903919040190411904219043190441904519046190471904819049190501905119052190531905419055190561905719058190591906019061190621906319064190651906619067190681906919070190711907219073190741907519076190771907819079190801908119082190831908419085190861908719088190891909019091190921909319094190951909619097190981909919100191011910219103191041910519106191071910819109191101911119112191131911419115191161911719118191191912019121191221912319124191251912619127191281912919130191311913219133191341913519136191371913819139191401914119142191431914419145191461914719148191491915019151191521915319154191551915619157191581915919160191611916219163191641916519166191671916819169191701917119172191731917419175191761917719178191791918019181191821918319184191851918619187191881918919190191911919219193191941919519196191971919819199192001920119202192031920419205192061920719208192091921019211192121921319214192151921619217192181921919220192211922219223192241922519226192271922819229192301923119232192331923419235192361923719238192391924019241192421924319244192451924619247192481924919250192511925219253192541925519256192571925819259192601926119262192631926419265192661926719268192691927019271192721927319274192751927619277192781927919280192811928219283192841928519286192871928819289192901929119292192931929419295192961929719298192991930019301193021930319304193051930619307193081930919310193111931219313193141931519316193171931819319193201932119322193231932419325193261932719328193291933019331193321933319334193351933619337193381933919340193411934219343193441934519346193471934819349193501935119352193531935419355193561935719358193591936019361193621936319364193651936619367193681936919370193711937219373193741937519376193771937819379193801938119382193831938419385193861938719388193891939019391193921939319394193951939619397193981939919400194011940219403194041940519406194071940819409194101941119412194131941419415194161941719418194191942019421194221942319424194251942619427194281942919430194311943219433194341943519436194371943819439194401944119442194431944419445194461944719448194491945019451194521945319454194551945619457194581945919460194611946219463194641946519466194671946819469194701947119472194731947419475194761947719478194791948019481194821948319484194851948619487194881948919490194911949219493194941949519496194971949819499195001950119502195031950419505195061950719508195091951019511195121951319514195151951619517195181951919520195211952219523195241952519526195271952819529195301953119532195331953419535195361953719538195391954019541195421954319544195451954619547195481954919550195511955219553195541955519556195571955819559195601956119562195631956419565195661956719568195691957019571195721957319574195751957619577195781957919580195811958219583195841958519586195871958819589195901959119592195931959419595195961959719598195991960019601196021960319604196051960619607196081960919610196111961219613196141961519616196171961819619196201962119622196231962419625196261962719628196291963019631196321963319634196351963619637196381963919640196411964219643196441964519646196471964819649196501965119652196531965419655196561965719658196591966019661196621966319664196651966619667196681966919670196711967219673196741967519676196771967819679196801968119682196831968419685196861968719688196891969019691196921969319694196951969619697196981969919700197011970219703197041970519706197071970819709197101971119712197131971419715197161971719718197191972019721197221972319724197251972619727197281972919730197311973219733197341973519736197371973819739197401974119742197431974419745197461974719748197491975019751197521975319754197551975619757197581975919760197611976219763197641976519766197671976819769197701977119772197731977419775197761977719778197791978019781197821978319784197851978619787197881978919790197911979219793197941979519796197971979819799198001980119802198031980419805198061980719808198091981019811198121981319814198151981619817198181981919820198211982219823198241982519826198271982819829198301983119832198331983419835198361983719838198391984019841198421984319844198451984619847198481984919850198511985219853198541985519856198571985819859198601986119862198631986419865198661986719868198691987019871198721987319874198751987619877198781987919880198811988219883198841988519886198871988819889198901989119892198931989419895198961989719898198991990019901199021990319904199051990619907199081990919910199111991219913199141991519916199171991819919199201992119922199231992419925199261992719928199291993019931199321993319934199351993619937199381993919940199411994219943199441994519946199471994819949199501995119952199531995419955199561995719958199591996019961199621996319964199651996619967199681996919970199711997219973199741997519976199771997819979199801998119982199831998419985199861998719988199891999019991199921999319994199951999619997199981999920000200012000220003200042000520006200072000820009200102001120012200132001420015200162001720018200192002020021200222002320024200252002620027200282002920030200312003220033200342003520036200372003820039200402004120042200432004420045200462004720048200492005020051200522005320054200552005620057200582005920060200612006220063200642006520066200672006820069200702007120072200732007420075200762007720078200792008020081200822008320084200852008620087200882008920090200912009220093200942009520096200972009820099201002010120102201032010420105201062010720108201092011020111201122011320114201152011620117201182011920120201212012220123201242012520126201272012820129201302013120132201332013420135201362013720138201392014020141201422014320144201452014620147201482014920150201512015220153201542015520156201572015820159201602016120162201632016420165201662016720168201692017020171201722017320174201752017620177201782017920180201812018220183201842018520186201872018820189201902019120192201932019420195201962019720198201992020020201202022020320204202052020620207202082020920210202112021220213202142021520216202172021820219202202022120222202232022420225202262022720228202292023020231202322023320234202352023620237202382023920240202412024220243202442024520246202472024820249202502025120252202532025420255202562025720258202592026020261202622026320264202652026620267202682026920270202712027220273202742027520276202772027820279202802028120282202832028420285202862028720288202892029020291202922029320294202952029620297202982029920300203012030220303203042030520306203072030820309203102031120312203132031420315203162031720318203192032020321203222032320324203252032620327203282032920330203312033220333203342033520336203372033820339203402034120342203432034420345203462034720348203492035020351203522035320354203552035620357203582035920360203612036220363203642036520366203672036820369203702037120372203732037420375203762037720378203792038020381203822038320384203852038620387203882038920390203912039220393203942039520396203972039820399204002040120402204032040420405204062040720408204092041020411204122041320414204152041620417204182041920420204212042220423204242042520426204272042820429204302043120432204332043420435204362043720438204392044020441204422044320444204452044620447204482044920450204512045220453204542045520456204572045820459204602046120462204632046420465204662046720468204692047020471204722047320474204752047620477204782047920480204812048220483204842048520486204872048820489204902049120492204932049420495204962049720498204992050020501205022050320504205052050620507205082050920510205112051220513205142051520516205172051820519205202052120522205232052420525205262052720528205292053020531205322053320534205352053620537205382053920540205412054220543205442054520546205472054820549205502055120552205532055420555205562055720558205592056020561205622056320564205652056620567205682056920570205712057220573205742057520576205772057820579205802058120582205832058420585205862058720588205892059020591205922059320594205952059620597205982059920600206012060220603206042060520606206072060820609206102061120612206132061420615206162061720618206192062020621206222062320624206252062620627206282062920630206312063220633206342063520636206372063820639206402064120642206432064420645206462064720648206492065020651206522065320654206552065620657206582065920660206612066220663206642066520666206672066820669206702067120672206732067420675206762067720678206792068020681206822068320684206852068620687206882068920690206912069220693206942069520696206972069820699207002070120702207032070420705207062070720708207092071020711207122071320714207152071620717207182071920720207212072220723207242072520726207272072820729207302073120732207332073420735207362073720738207392074020741207422074320744207452074620747207482074920750207512075220753207542075520756207572075820759207602076120762207632076420765207662076720768207692077020771207722077320774207752077620777207782077920780207812078220783207842078520786207872078820789207902079120792207932079420795207962079720798207992080020801208022080320804208052080620807208082080920810208112081220813208142081520816208172081820819208202082120822208232082420825208262082720828208292083020831208322083320834208352083620837208382083920840208412084220843208442084520846208472084820849208502085120852208532085420855208562085720858208592086020861208622086320864208652086620867208682086920870208712087220873208742087520876208772087820879208802088120882208832088420885208862088720888208892089020891208922089320894208952089620897208982089920900209012090220903209042090520906209072090820909209102091120912209132091420915209162091720918209192092020921209222092320924209252092620927209282092920930209312093220933209342093520936209372093820939209402094120942209432094420945209462094720948209492095020951209522095320954209552095620957209582095920960209612096220963209642096520966209672096820969209702097120972209732097420975209762097720978209792098020981209822098320984209852098620987209882098920990209912099220993209942099520996209972099820999210002100121002210032100421005210062100721008210092101021011210122101321014210152101621017210182101921020210212102221023210242102521026210272102821029210302103121032210332103421035210362103721038210392104021041210422104321044210452104621047210482104921050210512105221053210542105521056210572105821059210602106121062210632106421065210662106721068210692107021071210722107321074210752107621077210782107921080210812108221083210842108521086210872108821089210902109121092210932109421095210962109721098210992110021101211022110321104211052110621107211082110921110211112111221113211142111521116211172111821119211202112121122211232112421125211262112721128211292113021131211322113321134211352113621137211382113921140211412114221143211442114521146211472114821149211502115121152211532115421155211562115721158211592116021161211622116321164211652116621167211682116921170211712117221173211742117521176211772117821179211802118121182211832118421185211862118721188211892119021191211922119321194211952119621197211982119921200212012120221203212042120521206212072120821209212102121121212212132121421215212162121721218212192122021221212222122321224212252122621227212282122921230212312123221233212342123521236212372123821239212402124121242212432124421245212462124721248212492125021251212522125321254212552125621257212582125921260212612126221263212642126521266212672126821269212702127121272212732127421275212762127721278212792128021281212822128321284212852128621287212882128921290212912129221293212942129521296212972129821299213002130121302213032130421305213062130721308213092131021311213122131321314213152131621317213182131921320213212132221323213242132521326213272132821329213302133121332213332133421335213362133721338213392134021341213422134321344213452134621347213482134921350213512135221353213542135521356213572135821359213602136121362213632136421365213662136721368213692137021371213722137321374213752137621377213782137921380213812138221383213842138521386213872138821389213902139121392213932139421395213962139721398213992140021401214022140321404214052140621407214082140921410214112141221413214142141521416214172141821419214202142121422214232142421425214262142721428214292143021431214322143321434214352143621437214382143921440214412144221443214442144521446214472144821449214502145121452214532145421455214562145721458214592146021461214622146321464214652146621467214682146921470214712147221473214742147521476214772147821479214802148121482214832148421485214862148721488214892149021491214922149321494214952149621497214982149921500215012150221503215042150521506215072150821509215102151121512215132151421515215162151721518215192152021521215222152321524215252152621527215282152921530215312153221533215342153521536215372153821539215402154121542215432154421545215462154721548215492155021551215522155321554215552155621557215582155921560215612156221563215642156521566215672156821569215702157121572215732157421575215762157721578215792158021581215822158321584215852158621587215882158921590215912159221593215942159521596215972159821599216002160121602216032160421605216062160721608216092161021611216122161321614216152161621617216182161921620216212162221623216242162521626216272162821629216302163121632216332163421635216362163721638216392164021641216422164321644216452164621647216482164921650216512165221653216542165521656216572165821659216602166121662216632166421665216662166721668216692167021671216722167321674216752167621677216782167921680216812168221683216842168521686216872168821689216902169121692216932169421695216962169721698216992170021701217022170321704217052170621707217082170921710217112171221713217142171521716217172171821719217202172121722217232172421725217262172721728217292173021731217322173321734217352173621737217382173921740217412174221743217442174521746217472174821749217502175121752217532175421755217562175721758217592176021761217622176321764217652176621767217682176921770217712177221773217742177521776217772177821779217802178121782217832178421785217862178721788217892179021791217922179321794217952179621797217982179921800218012180221803218042180521806218072180821809218102181121812218132181421815218162181721818218192182021821218222182321824218252182621827218282182921830218312183221833218342183521836218372183821839218402184121842218432184421845218462184721848218492185021851218522185321854218552185621857218582185921860218612186221863218642186521866218672186821869218702187121872218732187421875218762187721878218792188021881218822188321884218852188621887218882188921890218912189221893218942189521896218972189821899219002190121902219032190421905219062190721908219092191021911219122191321914219152191621917219182191921920219212192221923219242192521926219272192821929219302193121932219332193421935219362193721938219392194021941219422194321944219452194621947219482194921950219512195221953219542195521956219572195821959219602196121962219632196421965219662196721968219692197021971219722197321974219752197621977219782197921980219812198221983219842198521986219872198821989219902199121992219932199421995219962199721998219992200022001220022200322004220052200622007220082200922010220112201222013220142201522016220172201822019220202202122022220232202422025220262202722028220292203022031220322203322034220352203622037220382203922040220412204222043220442204522046220472204822049220502205122052220532205422055220562205722058220592206022061220622206322064220652206622067220682206922070220712207222073220742207522076220772207822079220802208122082220832208422085220862208722088220892209022091220922209322094220952209622097220982209922100221012210222103221042210522106221072210822109221102211122112221132211422115221162211722118221192212022121221222212322124221252212622127221282212922130221312213222133221342213522136221372213822139221402214122142221432214422145221462214722148221492215022151221522215322154221552215622157221582215922160221612216222163221642216522166221672216822169221702217122172221732217422175221762217722178221792218022181221822218322184221852218622187221882218922190221912219222193221942219522196221972219822199222002220122202222032220422205222062220722208222092221022211222122221322214222152221622217222182221922220222212222222223222242222522226222272222822229222302223122232222332223422235222362223722238222392224022241222422224322244222452224622247222482224922250222512225222253222542225522256222572225822259222602226122262222632226422265222662226722268222692227022271222722227322274222752227622277222782227922280222812228222283222842228522286222872228822289222902229122292222932229422295222962229722298222992230022301223022230322304223052230622307223082230922310223112231222313223142231522316223172231822319223202232122322223232232422325223262232722328223292233022331223322233322334223352233622337223382233922340223412234222343223442234522346223472234822349223502235122352223532235422355223562235722358223592236022361223622236322364223652236622367223682236922370223712237222373223742237522376223772237822379223802238122382223832238422385223862238722388223892239022391223922239322394223952239622397223982239922400224012240222403224042240522406224072240822409224102241122412224132241422415224162241722418224192242022421224222242322424224252242622427224282242922430224312243222433224342243522436224372243822439224402244122442224432244422445224462244722448224492245022451224522245322454224552245622457224582245922460224612246222463224642246522466224672246822469224702247122472224732247422475224762247722478224792248022481224822248322484224852248622487224882248922490224912249222493224942249522496224972249822499225002250122502225032250422505225062250722508225092251022511225122251322514225152251622517225182251922520225212252222523225242252522526225272252822529225302253122532225332253422535225362253722538225392254022541225422254322544225452254622547225482254922550225512255222553225542255522556225572255822559225602256122562225632256422565225662256722568225692257022571225722257322574225752257622577225782257922580225812258222583225842258522586225872258822589225902259122592225932259422595225962259722598225992260022601226022260322604226052260622607226082260922610226112261222613226142261522616226172261822619226202262122622226232262422625226262262722628226292263022631226322263322634226352263622637226382263922640226412264222643226442264522646226472264822649226502265122652226532265422655226562265722658226592266022661226622266322664226652266622667226682266922670226712267222673226742267522676226772267822679226802268122682226832268422685226862268722688226892269022691226922269322694226952269622697226982269922700227012270222703227042270522706227072270822709227102271122712227132271422715227162271722718227192272022721227222272322724227252272622727227282272922730227312273222733227342273522736227372273822739227402274122742227432274422745227462274722748227492275022751227522275322754227552275622757227582275922760227612276222763227642276522766227672276822769227702277122772227732277422775227762277722778227792278022781227822278322784227852278622787227882278922790227912279222793227942279522796227972279822799228002280122802228032280422805228062280722808228092281022811228122281322814228152281622817228182281922820228212282222823228242282522826228272282822829228302283122832228332283422835228362283722838228392284022841228422284322844228452284622847228482284922850228512285222853228542285522856228572285822859228602286122862228632286422865228662286722868228692287022871228722287322874228752287622877228782287922880228812288222883228842288522886228872288822889228902289122892228932289422895228962289722898228992290022901229022290322904229052290622907229082290922910229112291222913229142291522916229172291822919229202292122922229232292422925229262292722928229292293022931229322293322934229352293622937229382293922940229412294222943229442294522946229472294822949229502295122952229532295422955229562295722958229592296022961229622296322964229652296622967229682296922970229712297222973229742297522976229772297822979229802298122982229832298422985229862298722988229892299022991229922299322994229952299622997229982299923000230012300223003230042300523006230072300823009230102301123012230132301423015230162301723018230192302023021230222302323024230252302623027230282302923030230312303223033230342303523036230372303823039230402304123042230432304423045230462304723048230492305023051230522305323054230552305623057230582305923060230612306223063230642306523066230672306823069230702307123072230732307423075230762307723078230792308023081230822308323084230852308623087230882308923090230912309223093230942309523096230972309823099231002310123102231032310423105231062310723108231092311023111231122311323114231152311623117231182311923120231212312223123231242312523126231272312823129231302313123132231332313423135231362313723138231392314023141231422314323144231452314623147231482314923150231512315223153231542315523156231572315823159231602316123162231632316423165231662316723168231692317023171231722317323174231752317623177231782317923180231812318223183231842318523186231872318823189231902319123192231932319423195231962319723198231992320023201232022320323204232052320623207232082320923210232112321223213232142321523216232172321823219232202322123222232232322423225232262322723228232292323023231232322323323234232352323623237232382323923240232412324223243232442324523246232472324823249232502325123252232532325423255232562325723258232592326023261232622326323264232652326623267232682326923270232712327223273232742327523276232772327823279232802328123282232832328423285232862328723288232892329023291232922329323294232952329623297232982329923300233012330223303233042330523306233072330823309233102331123312233132331423315233162331723318233192332023321233222332323324233252332623327233282332923330233312333223333233342333523336233372333823339233402334123342233432334423345233462334723348233492335023351233522335323354233552335623357233582335923360233612336223363233642336523366233672336823369233702337123372233732337423375233762337723378233792338023381233822338323384233852338623387233882338923390233912339223393233942339523396233972339823399234002340123402234032340423405234062340723408234092341023411234122341323414234152341623417234182341923420234212342223423234242342523426234272342823429234302343123432234332343423435234362343723438234392344023441234422344323444234452344623447234482344923450234512345223453234542345523456234572345823459234602346123462234632346423465234662346723468234692347023471234722347323474234752347623477234782347923480234812348223483234842348523486234872348823489234902349123492234932349423495234962349723498234992350023501235022350323504235052350623507235082350923510235112351223513235142351523516235172351823519235202352123522235232352423525235262352723528235292353023531235322353323534235352353623537235382353923540235412354223543235442354523546235472354823549235502355123552235532355423555235562355723558235592356023561235622356323564235652356623567235682356923570235712357223573235742357523576235772357823579235802358123582235832358423585235862358723588235892359023591235922359323594235952359623597235982359923600236012360223603236042360523606236072360823609236102361123612236132361423615236162361723618236192362023621236222362323624236252362623627236282362923630236312363223633236342363523636236372363823639236402364123642236432364423645236462364723648236492365023651236522365323654236552365623657236582365923660236612366223663236642366523666236672366823669236702367123672236732367423675236762367723678236792368023681236822368323684236852368623687236882368923690236912369223693236942369523696236972369823699237002370123702237032370423705237062370723708237092371023711237122371323714237152371623717237182371923720237212372223723237242372523726237272372823729237302373123732237332373423735237362373723738237392374023741237422374323744237452374623747237482374923750237512375223753237542375523756237572375823759237602376123762237632376423765237662376723768237692377023771237722377323774237752377623777237782377923780237812378223783237842378523786237872378823789237902379123792237932379423795237962379723798237992380023801238022380323804238052380623807238082380923810238112381223813238142381523816238172381823819238202382123822238232382423825238262382723828238292383023831238322383323834238352383623837238382383923840238412384223843238442384523846238472384823849238502385123852238532385423855238562385723858238592386023861238622386323864238652386623867238682386923870238712387223873238742387523876238772387823879238802388123882238832388423885238862388723888238892389023891238922389323894238952389623897238982389923900239012390223903239042390523906239072390823909239102391123912239132391423915239162391723918239192392023921239222392323924239252392623927239282392923930239312393223933239342393523936239372393823939239402394123942239432394423945239462394723948239492395023951239522395323954239552395623957239582395923960239612396223963239642396523966239672396823969239702397123972239732397423975239762397723978239792398023981239822398323984239852398623987239882398923990239912399223993239942399523996239972399823999240002400124002240032400424005240062400724008240092401024011240122401324014240152401624017240182401924020240212402224023240242402524026240272402824029240302403124032240332403424035240362403724038240392404024041240422404324044240452404624047240482404924050240512405224053240542405524056240572405824059240602406124062240632406424065240662406724068240692407024071240722407324074240752407624077240782407924080240812408224083240842408524086240872408824089240902409124092240932409424095240962409724098240992410024101241022410324104241052410624107241082410924110241112411224113241142411524116241172411824119241202412124122241232412424125241262412724128241292413024131241322413324134241352413624137241382413924140241412414224143241442414524146241472414824149241502415124152241532415424155241562415724158241592416024161241622416324164241652416624167241682416924170241712417224173241742417524176241772417824179241802418124182241832418424185241862418724188241892419024191241922419324194241952419624197241982419924200242012420224203242042420524206242072420824209242102421124212242132421424215242162421724218242192422024221242222422324224242252422624227242282422924230242312423224233242342423524236242372423824239242402424124242242432424424245242462424724248242492425024251242522425324254242552425624257242582425924260242612426224263242642426524266242672426824269242702427124272242732427424275242762427724278242792428024281242822428324284242852428624287242882428924290242912429224293242942429524296242972429824299243002430124302243032430424305243062430724308243092431024311243122431324314243152431624317243182431924320243212432224323243242432524326243272432824329243302433124332243332433424335243362433724338243392434024341243422434324344243452434624347243482434924350243512435224353243542435524356243572435824359243602436124362243632436424365243662436724368243692437024371243722437324374243752437624377243782437924380243812438224383243842438524386243872438824389243902439124392243932439424395243962439724398243992440024401244022440324404244052440624407244082440924410244112441224413244142441524416244172441824419244202442124422244232442424425244262442724428244292443024431244322443324434244352443624437244382443924440244412444224443244442444524446244472444824449244502445124452244532445424455244562445724458244592446024461244622446324464244652446624467244682446924470244712447224473244742447524476244772447824479244802448124482244832448424485244862448724488244892449024491244922449324494244952449624497244982449924500245012450224503245042450524506245072450824509245102451124512245132451424515245162451724518245192452024521245222452324524245252452624527245282452924530245312453224533245342453524536245372453824539245402454124542245432454424545245462454724548245492455024551245522455324554245552455624557245582455924560245612456224563245642456524566245672456824569245702457124572245732457424575245762457724578245792458024581245822458324584245852458624587245882458924590245912459224593245942459524596245972459824599246002460124602246032460424605246062460724608246092461024611246122461324614246152461624617246182461924620246212462224623246242462524626246272462824629246302463124632246332463424635246362463724638246392464024641246422464324644246452464624647246482464924650246512465224653246542465524656246572465824659246602466124662246632466424665246662466724668246692467024671246722467324674246752467624677246782467924680246812468224683246842468524686246872468824689246902469124692246932469424695246962469724698246992470024701247022470324704247052470624707247082470924710247112471224713247142471524716247172471824719247202472124722247232472424725247262472724728247292473024731247322473324734247352473624737247382473924740247412474224743247442474524746247472474824749247502475124752247532475424755247562475724758247592476024761247622476324764247652476624767247682476924770247712477224773247742477524776247772477824779247802478124782247832478424785247862478724788247892479024791247922479324794247952479624797247982479924800248012480224803248042480524806248072480824809248102481124812248132481424815248162481724818248192482024821248222482324824248252482624827248282482924830248312483224833248342483524836248372483824839248402484124842248432484424845248462484724848248492485024851248522485324854248552485624857248582485924860248612486224863248642486524866248672486824869248702487124872248732487424875248762487724878248792488024881248822488324884248852488624887248882488924890248912489224893248942489524896248972489824899249002490124902249032490424905249062490724908249092491024911249122491324914249152491624917249182491924920249212492224923249242492524926249272492824929249302493124932249332493424935249362493724938249392494024941249422494324944249452494624947249482494924950249512495224953249542495524956249572495824959249602496124962249632496424965249662496724968249692497024971249722497324974249752497624977249782497924980249812498224983249842498524986249872498824989249902499124992249932499424995249962499724998249992500025001250022500325004250052500625007250082500925010250112501225013250142501525016250172501825019250202502125022250232502425025250262502725028250292503025031250322503325034250352503625037250382503925040250412504225043250442504525046250472504825049250502505125052250532505425055250562505725058250592506025061250622506325064250652506625067250682506925070250712507225073250742507525076250772507825079250802508125082250832508425085250862508725088250892509025091250922509325094250952509625097250982509925100251012510225103251042510525106251072510825109251102511125112251132511425115251162511725118251192512025121251222512325124251252512625127251282512925130251312513225133251342513525136251372513825139251402514125142251432514425145251462514725148251492515025151251522515325154251552515625157251582515925160251612516225163251642516525166251672516825169251702517125172251732517425175251762517725178251792518025181251822518325184251852518625187251882518925190251912519225193251942519525196251972519825199252002520125202252032520425205252062520725208252092521025211252122521325214252152521625217252182521925220252212522225223252242522525226252272522825229252302523125232252332523425235252362523725238252392524025241252422524325244252452524625247252482524925250252512525225253252542525525256252572525825259252602526125262252632526425265252662526725268252692527025271252722527325274252752527625277252782527925280252812528225283252842528525286252872528825289252902529125292252932529425295252962529725298252992530025301253022530325304253052530625307253082530925310253112531225313253142531525316253172531825319253202532125322253232532425325253262532725328253292533025331253322533325334253352533625337253382533925340253412534225343253442534525346253472534825349253502535125352253532535425355253562535725358253592536025361253622536325364253652536625367253682536925370253712537225373253742537525376253772537825379253802538125382253832538425385253862538725388253892539025391253922539325394253952539625397253982539925400254012540225403254042540525406254072540825409254102541125412254132541425415254162541725418254192542025421254222542325424254252542625427254282542925430254312543225433254342543525436254372543825439254402544125442254432544425445254462544725448254492545025451254522545325454254552545625457254582545925460254612546225463254642546525466254672546825469254702547125472254732547425475254762547725478254792548025481254822548325484254852548625487254882548925490254912549225493254942549525496254972549825499255002550125502255032550425505255062550725508255092551025511255122551325514255152551625517255182551925520255212552225523255242552525526255272552825529255302553125532255332553425535255362553725538255392554025541255422554325544255452554625547255482554925550255512555225553255542555525556255572555825559255602556125562255632556425565255662556725568255692557025571255722557325574255752557625577255782557925580255812558225583255842558525586255872558825589255902559125592255932559425595255962559725598255992560025601256022560325604256052560625607256082560925610256112561225613256142561525616256172561825619256202562125622256232562425625256262562725628256292563025631256322563325634256352563625637256382563925640256412564225643256442564525646256472564825649256502565125652256532565425655256562565725658256592566025661256622566325664256652566625667256682566925670256712567225673256742567525676256772567825679256802568125682256832568425685256862568725688256892569025691256922569325694256952569625697256982569925700257012570225703257042570525706257072570825709257102571125712257132571425715257162571725718257192572025721257222572325724257252572625727257282572925730257312573225733257342573525736257372573825739257402574125742257432574425745257462574725748257492575025751257522575325754257552575625757257582575925760257612576225763257642576525766257672576825769257702577125772257732577425775257762577725778257792578025781257822578325784257852578625787257882578925790257912579225793257942579525796257972579825799258002580125802258032580425805258062580725808258092581025811258122581325814258152581625817258182581925820258212582225823258242582525826258272582825829258302583125832258332583425835258362583725838258392584025841258422584325844258452584625847258482584925850258512585225853258542585525856258572585825859258602586125862258632586425865258662586725868258692587025871258722587325874258752587625877258782587925880258812588225883258842588525886258872588825889258902589125892258932589425895258962589725898258992590025901259022590325904259052590625907259082590925910259112591225913259142591525916259172591825919259202592125922259232592425925259262592725928259292593025931259322593325934259352593625937259382593925940259412594225943259442594525946259472594825949259502595125952259532595425955259562595725958259592596025961259622596325964259652596625967259682596925970259712597225973259742597525976259772597825979259802598125982259832598425985259862598725988259892599025991259922599325994259952599625997259982599926000260012600226003260042600526006260072600826009260102601126012260132601426015260162601726018260192602026021260222602326024260252602626027260282602926030260312603226033260342603526036260372603826039260402604126042260432604426045260462604726048260492605026051260522605326054260552605626057260582605926060260612606226063260642606526066260672606826069260702607126072260732607426075260762607726078260792608026081260822608326084260852608626087260882608926090260912609226093260942609526096260972609826099261002610126102261032610426105261062610726108261092611026111261122611326114261152611626117261182611926120261212612226123261242612526126261272612826129261302613126132261332613426135261362613726138261392614026141261422614326144261452614626147261482614926150261512615226153261542615526156261572615826159261602616126162261632616426165261662616726168261692617026171261722617326174261752617626177261782617926180261812618226183261842618526186261872618826189261902619126192261932619426195261962619726198261992620026201262022620326204262052620626207262082620926210262112621226213262142621526216262172621826219262202622126222262232622426225262262622726228262292623026231262322623326234262352623626237262382623926240262412624226243262442624526246262472624826249262502625126252262532625426255262562625726258262592626026261262622626326264262652626626267262682626926270262712627226273262742627526276262772627826279262802628126282262832628426285262862628726288262892629026291262922629326294262952629626297262982629926300263012630226303263042630526306263072630826309263102631126312263132631426315263162631726318263192632026321263222632326324263252632626327263282632926330263312633226333263342633526336263372633826339263402634126342263432634426345263462634726348263492635026351263522635326354263552635626357263582635926360263612636226363263642636526366263672636826369263702637126372263732637426375263762637726378263792638026381263822638326384263852638626387263882638926390263912639226393263942639526396263972639826399264002640126402264032640426405264062640726408264092641026411264122641326414264152641626417264182641926420264212642226423264242642526426264272642826429264302643126432264332643426435264362643726438264392644026441264422644326444264452644626447264482644926450264512645226453264542645526456264572645826459264602646126462264632646426465264662646726468264692647026471264722647326474264752647626477264782647926480264812648226483264842648526486264872648826489264902649126492264932649426495264962649726498264992650026501265022650326504265052650626507265082650926510265112651226513265142651526516265172651826519265202652126522265232652426525265262652726528265292653026531265322653326534265352653626537265382653926540265412654226543265442654526546265472654826549265502655126552265532655426555265562655726558265592656026561265622656326564265652656626567265682656926570265712657226573265742657526576265772657826579265802658126582265832658426585265862658726588265892659026591265922659326594265952659626597265982659926600266012660226603266042660526606266072660826609266102661126612266132661426615266162661726618266192662026621266222662326624266252662626627266282662926630266312663226633266342663526636266372663826639266402664126642266432664426645266462664726648266492665026651266522665326654266552665626657266582665926660266612666226663266642666526666266672666826669266702667126672266732667426675266762667726678266792668026681266822668326684266852668626687266882668926690266912669226693266942669526696266972669826699267002670126702267032670426705267062670726708267092671026711267122671326714267152671626717267182671926720267212672226723267242672526726267272672826729267302673126732267332673426735267362673726738267392674026741267422674326744267452674626747267482674926750267512675226753267542675526756267572675826759267602676126762267632676426765267662676726768267692677026771267722677326774267752677626777267782677926780267812678226783267842678526786267872678826789267902679126792267932679426795267962679726798267992680026801268022680326804268052680626807268082680926810268112681226813268142681526816268172681826819268202682126822268232682426825268262682726828268292683026831268322683326834268352683626837268382683926840268412684226843268442684526846268472684826849268502685126852268532685426855268562685726858268592686026861268622686326864268652686626867268682686926870268712687226873268742687526876268772687826879268802688126882268832688426885268862688726888268892689026891268922689326894268952689626897268982689926900269012690226903269042690526906269072690826909269102691126912269132691426915269162691726918269192692026921269222692326924269252692626927269282692926930269312693226933269342693526936269372693826939269402694126942269432694426945269462694726948269492695026951269522695326954269552695626957269582695926960269612696226963269642696526966269672696826969269702697126972269732697426975269762697726978269792698026981269822698326984269852698626987269882698926990269912699226993269942699526996269972699826999270002700127002270032700427005270062700727008270092701027011270122701327014270152701627017270182701927020270212702227023270242702527026270272702827029270302703127032270332703427035270362703727038270392704027041270422704327044270452704627047270482704927050270512705227053270542705527056270572705827059270602706127062270632706427065270662706727068270692707027071270722707327074270752707627077270782707927080270812708227083270842708527086270872708827089270902709127092270932709427095270962709727098270992710027101271022710327104271052710627107271082710927110271112711227113271142711527116271172711827119271202712127122271232712427125271262712727128271292713027131271322713327134271352713627137271382713927140271412714227143271442714527146271472714827149271502715127152271532715427155271562715727158271592716027161271622716327164271652716627167271682716927170271712717227173271742717527176271772717827179271802718127182271832718427185271862718727188271892719027191271922719327194271952719627197271982719927200272012720227203272042720527206272072720827209272102721127212272132721427215272162721727218272192722027221272222722327224272252722627227272282722927230272312723227233272342723527236272372723827239272402724127242272432724427245272462724727248272492725027251272522725327254272552725627257272582725927260272612726227263272642726527266272672726827269272702727127272272732727427275272762727727278272792728027281272822728327284272852728627287272882728927290272912729227293272942729527296272972729827299273002730127302273032730427305273062730727308273092731027311273122731327314273152731627317273182731927320273212732227323273242732527326273272732827329273302733127332273332733427335273362733727338273392734027341273422734327344273452734627347273482734927350273512735227353273542735527356273572735827359273602736127362273632736427365273662736727368273692737027371273722737327374273752737627377273782737927380273812738227383273842738527386273872738827389273902739127392273932739427395273962739727398273992740027401274022740327404274052740627407274082740927410274112741227413274142741527416274172741827419274202742127422274232742427425274262742727428274292743027431274322743327434274352743627437274382743927440274412744227443274442744527446274472744827449274502745127452274532745427455274562745727458274592746027461274622746327464274652746627467274682746927470274712747227473274742747527476274772747827479274802748127482274832748427485274862748727488274892749027491274922749327494274952749627497274982749927500275012750227503275042750527506275072750827509275102751127512275132751427515275162751727518275192752027521275222752327524275252752627527275282752927530275312753227533275342753527536275372753827539275402754127542275432754427545275462754727548275492755027551275522755327554275552755627557275582755927560275612756227563275642756527566275672756827569275702757127572275732757427575275762757727578275792758027581275822758327584275852758627587275882758927590275912759227593275942759527596275972759827599276002760127602276032760427605276062760727608276092761027611276122761327614276152761627617276182761927620276212762227623276242762527626276272762827629276302763127632276332763427635276362763727638276392764027641276422764327644276452764627647276482764927650276512765227653276542765527656276572765827659276602766127662276632766427665276662766727668276692767027671276722767327674276752767627677276782767927680276812768227683276842768527686276872768827689276902769127692276932769427695276962769727698276992770027701277022770327704277052770627707277082770927710277112771227713277142771527716277172771827719277202772127722277232772427725277262772727728277292773027731277322773327734277352773627737277382773927740277412774227743277442774527746277472774827749277502775127752277532775427755277562775727758277592776027761277622776327764277652776627767277682776927770277712777227773277742777527776277772777827779277802778127782277832778427785277862778727788277892779027791277922779327794277952779627797277982779927800278012780227803278042780527806278072780827809278102781127812278132781427815278162781727818278192782027821278222782327824278252782627827278282782927830278312783227833278342783527836278372783827839278402784127842278432784427845278462784727848278492785027851278522785327854278552785627857278582785927860278612786227863278642786527866278672786827869278702787127872278732787427875278762787727878278792788027881278822788327884278852788627887278882788927890278912789227893278942789527896278972789827899279002790127902279032790427905279062790727908279092791027911279122791327914279152791627917279182791927920279212792227923279242792527926279272792827929279302793127932279332793427935279362793727938279392794027941279422794327944279452794627947279482794927950279512795227953279542795527956279572795827959279602796127962279632796427965279662796727968279692797027971279722797327974279752797627977279782797927980279812798227983279842798527986279872798827989279902799127992279932799427995279962799727998279992800028001280022800328004280052800628007280082800928010280112801228013280142801528016280172801828019280202802128022280232802428025280262802728028280292803028031280322803328034280352803628037280382803928040280412804228043280442804528046280472804828049280502805128052280532805428055280562805728058280592806028061280622806328064280652806628067280682806928070280712807228073280742807528076280772807828079280802808128082280832808428085280862808728088280892809028091280922809328094280952809628097280982809928100281012810228103281042810528106281072810828109281102811128112281132811428115281162811728118281192812028121281222812328124281252812628127281282812928130281312813228133281342813528136281372813828139281402814128142281432814428145281462814728148281492815028151281522815328154281552815628157281582815928160281612816228163281642816528166281672816828169281702817128172281732817428175281762817728178281792818028181281822818328184281852818628187281882818928190281912819228193281942819528196281972819828199282002820128202282032820428205282062820728208282092821028211282122821328214282152821628217282182821928220282212822228223282242822528226282272822828229282302823128232282332823428235282362823728238282392824028241282422824328244282452824628247282482824928250282512825228253282542825528256282572825828259282602826128262282632826428265282662826728268282692827028271282722827328274282752827628277282782827928280282812828228283282842828528286282872828828289282902829128292282932829428295282962829728298282992830028301283022830328304283052830628307283082830928310283112831228313283142831528316283172831828319283202832128322283232832428325283262832728328283292833028331283322833328334283352833628337283382833928340283412834228343283442834528346283472834828349283502835128352283532835428355283562835728358283592836028361283622836328364283652836628367283682836928370283712837228373283742837528376283772837828379283802838128382283832838428385283862838728388283892839028391283922839328394283952839628397283982839928400284012840228403284042840528406284072840828409284102841128412284132841428415284162841728418284192842028421284222842328424284252842628427284282842928430284312843228433284342843528436284372843828439284402844128442284432844428445284462844728448284492845028451284522845328454284552845628457284582845928460284612846228463284642846528466284672846828469284702847128472284732847428475284762847728478284792848028481284822848328484284852848628487284882848928490284912849228493284942849528496284972849828499285002850128502285032850428505285062850728508285092851028511285122851328514285152851628517285182851928520285212852228523285242852528526285272852828529285302853128532285332853428535285362853728538285392854028541285422854328544285452854628547285482854928550285512855228553285542855528556285572855828559285602856128562285632856428565285662856728568285692857028571285722857328574285752857628577285782857928580285812858228583285842858528586285872858828589285902859128592285932859428595285962859728598285992860028601286022860328604286052860628607286082860928610286112861228613286142861528616286172861828619286202862128622286232862428625286262862728628286292863028631286322863328634286352863628637286382863928640286412864228643286442864528646286472864828649286502865128652286532865428655286562865728658286592866028661286622866328664286652866628667286682866928670286712867228673286742867528676286772867828679286802868128682286832868428685286862868728688286892869028691286922869328694286952869628697286982869928700287012870228703287042870528706287072870828709287102871128712287132871428715287162871728718287192872028721287222872328724287252872628727287282872928730287312873228733287342873528736287372873828739287402874128742287432874428745287462874728748287492875028751287522875328754287552875628757287582875928760287612876228763287642876528766287672876828769287702877128772287732877428775287762877728778287792878028781287822878328784287852878628787287882878928790287912879228793287942879528796287972879828799288002880128802288032880428805288062880728808288092881028811288122881328814288152881628817288182881928820288212882228823288242882528826288272882828829288302883128832288332883428835288362883728838288392884028841288422884328844288452884628847288482884928850288512885228853288542885528856288572885828859288602886128862288632886428865288662886728868288692887028871288722887328874288752887628877288782887928880288812888228883288842888528886288872888828889288902889128892288932889428895288962889728898288992890028901289022890328904289052890628907289082890928910289112891228913289142891528916289172891828919289202892128922289232892428925289262892728928289292893028931289322893328934289352893628937289382893928940289412894228943289442894528946289472894828949289502895128952289532895428955289562895728958289592896028961289622896328964289652896628967289682896928970289712897228973289742897528976289772897828979289802898128982289832898428985289862898728988289892899028991289922899328994289952899628997289982899929000290012900229003290042900529006290072900829009290102901129012290132901429015290162901729018290192902029021290222902329024290252902629027290282902929030290312903229033290342903529036290372903829039290402904129042290432904429045290462904729048290492905029051290522905329054290552905629057290582905929060290612906229063290642906529066290672906829069290702907129072290732907429075290762907729078290792908029081290822908329084290852908629087290882908929090290912909229093290942909529096290972909829099291002910129102291032910429105291062910729108291092911029111291122911329114291152911629117291182911929120291212912229123291242912529126291272912829129291302913129132291332913429135291362913729138291392914029141291422914329144291452914629147291482914929150291512915229153291542915529156291572915829159291602916129162291632916429165291662916729168291692917029171291722917329174291752917629177291782917929180291812918229183291842918529186291872918829189291902919129192291932919429195291962919729198291992920029201292022920329204292052920629207292082920929210292112921229213292142921529216292172921829219292202922129222292232922429225292262922729228292292923029231292322923329234292352923629237292382923929240292412924229243292442924529246292472924829249292502925129252292532925429255292562925729258292592926029261292622926329264292652926629267292682926929270292712927229273292742927529276292772927829279292802928129282292832928429285292862928729288292892929029291292922929329294292952929629297292982929929300293012930229303293042930529306293072930829309293102931129312293132931429315293162931729318293192932029321293222932329324293252932629327293282932929330293312933229333293342933529336293372933829339293402934129342293432934429345293462934729348293492935029351293522935329354293552935629357293582935929360293612936229363293642936529366293672936829369293702937129372293732937429375293762937729378293792938029381293822938329384293852938629387293882938929390293912939229393293942939529396293972939829399294002940129402294032940429405294062940729408294092941029411294122941329414294152941629417294182941929420294212942229423294242942529426294272942829429294302943129432294332943429435294362943729438294392944029441294422944329444294452944629447294482944929450294512945229453294542945529456294572945829459294602946129462294632946429465294662946729468294692947029471294722947329474294752947629477294782947929480294812948229483294842948529486294872948829489294902949129492294932949429495294962949729498294992950029501295022950329504295052950629507295082950929510295112951229513295142951529516295172951829519295202952129522295232952429525295262952729528295292953029531295322953329534295352953629537295382953929540295412954229543295442954529546295472954829549295502955129552295532955429555295562955729558295592956029561295622956329564295652956629567295682956929570295712957229573295742957529576295772957829579295802958129582295832958429585295862958729588295892959029591295922959329594295952959629597295982959929600296012960229603296042960529606296072960829609296102961129612296132961429615296162961729618296192962029621296222962329624296252962629627296282962929630296312963229633296342963529636296372963829639296402964129642296432964429645296462964729648296492965029651296522965329654296552965629657296582965929660296612966229663296642966529666296672966829669296702967129672296732967429675296762967729678296792968029681296822968329684296852968629687296882968929690296912969229693296942969529696296972969829699297002970129702297032970429705297062970729708297092971029711297122971329714297152971629717297182971929720297212972229723297242972529726297272972829729297302973129732297332973429735297362973729738297392974029741297422974329744297452974629747297482974929750297512975229753297542975529756297572975829759297602976129762297632976429765297662976729768297692977029771297722977329774297752977629777297782977929780297812978229783297842978529786297872978829789297902979129792297932979429795297962979729798297992980029801298022980329804298052980629807298082980929810298112981229813298142981529816298172981829819298202982129822298232982429825298262982729828298292983029831298322983329834298352983629837298382983929840298412984229843298442984529846298472984829849298502985129852298532985429855298562985729858298592986029861298622986329864298652986629867298682986929870298712987229873298742987529876298772987829879298802988129882298832988429885298862988729888298892989029891298922989329894298952989629897298982989929900299012990229903299042990529906299072990829909299102991129912299132991429915299162991729918299192992029921299222992329924299252992629927299282992929930299312993229933299342993529936299372993829939299402994129942299432994429945299462994729948299492995029951299522995329954299552995629957299582995929960299612996229963299642996529966299672996829969299702997129972299732997429975299762997729978299792998029981299822998329984299852998629987299882998929990299912999229993299942999529996299972999829999300003000130002300033000430005300063000730008300093001030011300123001330014300153001630017300183001930020300213002230023300243002530026300273002830029300303003130032300333003430035300363003730038300393004030041300423004330044300453004630047300483004930050300513005230053300543005530056300573005830059300603006130062300633006430065300663006730068300693007030071300723007330074300753007630077300783007930080300813008230083300843008530086300873008830089300903009130092300933009430095300963009730098300993010030101301023010330104301053010630107301083010930110301113011230113301143011530116301173011830119301203012130122301233012430125301263012730128301293013030131301323013330134301353013630137301383013930140301413014230143301443014530146301473014830149301503015130152301533015430155301563015730158301593016030161301623016330164301653016630167301683016930170301713017230173301743017530176301773017830179301803018130182301833018430185301863018730188301893019030191301923019330194301953019630197301983019930200302013020230203302043020530206302073020830209302103021130212302133021430215302163021730218302193022030221302223022330224302253022630227302283022930230302313023230233302343023530236302373023830239302403024130242302433024430245302463024730248302493025030251302523025330254302553025630257302583025930260302613026230263302643026530266302673026830269302703027130272302733027430275302763027730278302793028030281302823028330284302853028630287302883028930290302913029230293302943029530296302973029830299303003030130302303033030430305303063030730308303093031030311303123031330314303153031630317303183031930320303213032230323303243032530326303273032830329303303033130332303333033430335303363033730338303393034030341303423034330344303453034630347303483034930350303513035230353303543035530356303573035830359303603036130362303633036430365303663036730368303693037030371303723037330374303753037630377303783037930380303813038230383303843038530386303873038830389303903039130392303933039430395303963039730398303993040030401304023040330404304053040630407304083040930410304113041230413304143041530416304173041830419304203042130422304233042430425304263042730428304293043030431304323043330434304353043630437304383043930440304413044230443304443044530446304473044830449304503045130452304533045430455304563045730458304593046030461304623046330464304653046630467304683046930470304713047230473304743047530476304773047830479304803048130482304833048430485304863048730488304893049030491304923049330494304953049630497304983049930500305013050230503305043050530506305073050830509305103051130512305133051430515305163051730518305193052030521305223052330524305253052630527305283052930530305313053230533305343053530536305373053830539305403054130542305433054430545305463054730548305493055030551305523055330554305553055630557305583055930560305613056230563305643056530566305673056830569305703057130572305733057430575305763057730578305793058030581305823058330584305853058630587305883058930590305913059230593305943059530596305973059830599306003060130602306033060430605306063060730608306093061030611306123061330614306153061630617306183061930620306213062230623306243062530626306273062830629306303063130632306333063430635306363063730638306393064030641306423064330644306453064630647306483064930650306513065230653306543065530656306573065830659306603066130662306633066430665306663066730668306693067030671306723067330674306753067630677306783067930680306813068230683306843068530686306873068830689306903069130692306933069430695306963069730698306993070030701307023070330704307053070630707307083070930710307113071230713307143071530716307173071830719307203072130722307233072430725307263072730728307293073030731307323073330734307353073630737307383073930740307413074230743307443074530746307473074830749307503075130752307533075430755307563075730758307593076030761307623076330764307653076630767307683076930770307713077230773307743077530776307773077830779307803078130782307833078430785307863078730788307893079030791307923079330794307953079630797307983079930800308013080230803308043080530806308073080830809308103081130812308133081430815308163081730818308193082030821308223082330824308253082630827308283082930830308313083230833308343083530836308373083830839308403084130842308433084430845308463084730848308493085030851308523085330854308553085630857308583085930860308613086230863308643086530866308673086830869308703087130872308733087430875308763087730878308793088030881308823088330884308853088630887308883088930890308913089230893308943089530896308973089830899309003090130902309033090430905309063090730908309093091030911309123091330914309153091630917309183091930920309213092230923309243092530926309273092830929309303093130932309333093430935309363093730938309393094030941309423094330944309453094630947309483094930950309513095230953309543095530956309573095830959309603096130962309633096430965309663096730968309693097030971309723097330974309753097630977309783097930980309813098230983309843098530986309873098830989309903099130992309933099430995309963099730998309993100031001310023100331004310053100631007310083100931010310113101231013310143101531016310173101831019310203102131022310233102431025310263102731028310293103031031310323103331034310353103631037310383103931040310413104231043310443104531046310473104831049310503105131052310533105431055310563105731058310593106031061310623106331064310653106631067310683106931070310713107231073310743107531076310773107831079310803108131082310833108431085310863108731088310893109031091310923109331094310953109631097310983109931100311013110231103311043110531106311073110831109311103111131112311133111431115311163111731118311193112031121311223112331124311253112631127311283112931130311313113231133311343113531136311373113831139311403114131142311433114431145311463114731148311493115031151311523115331154311553115631157311583115931160311613116231163311643116531166311673116831169311703117131172311733117431175311763117731178311793118031181311823118331184311853118631187311883118931190311913119231193311943119531196311973119831199312003120131202312033120431205312063120731208312093121031211312123121331214312153121631217312183121931220312213122231223312243122531226312273122831229312303123131232312333123431235312363123731238312393124031241312423124331244312453124631247312483124931250312513125231253312543125531256312573125831259312603126131262312633126431265312663126731268312693127031271312723127331274312753127631277312783127931280312813128231283312843128531286312873128831289312903129131292312933129431295312963129731298312993130031301313023130331304313053130631307313083130931310313113131231313313143131531316313173131831319313203132131322313233132431325313263132731328313293133031331313323133331334313353133631337313383133931340313413134231343313443134531346313473134831349313503135131352313533135431355313563135731358313593136031361313623136331364313653136631367313683136931370313713137231373313743137531376313773137831379313803138131382313833138431385313863138731388313893139031391313923139331394313953139631397313983139931400314013140231403314043140531406314073140831409314103141131412314133141431415314163141731418314193142031421314223142331424314253142631427314283142931430314313143231433314343143531436314373143831439314403144131442314433144431445314463144731448314493145031451314523145331454314553145631457314583145931460314613146231463314643146531466314673146831469314703147131472314733147431475314763147731478314793148031481314823148331484314853148631487314883148931490314913149231493314943149531496314973149831499315003150131502315033150431505315063150731508315093151031511315123151331514315153151631517315183151931520315213152231523315243152531526315273152831529315303153131532315333153431535315363153731538315393154031541315423154331544315453154631547315483154931550315513155231553315543155531556315573155831559315603156131562315633156431565315663156731568315693157031571315723157331574315753157631577315783157931580315813158231583315843158531586315873158831589315903159131592315933159431595315963159731598315993160031601316023160331604316053160631607316083160931610316113161231613316143161531616316173161831619316203162131622316233162431625316263162731628316293163031631316323163331634316353163631637316383163931640316413164231643316443164531646316473164831649316503165131652316533165431655316563165731658316593166031661316623166331664316653166631667316683166931670316713167231673316743167531676316773167831679316803168131682316833168431685316863168731688316893169031691316923169331694316953169631697316983169931700317013170231703317043170531706317073170831709317103171131712317133171431715317163171731718317193172031721317223172331724317253172631727317283172931730317313173231733317343173531736317373173831739317403174131742317433174431745317463174731748317493175031751317523175331754317553175631757317583175931760317613176231763317643176531766317673176831769317703177131772317733177431775317763177731778317793178031781317823178331784317853178631787317883178931790317913179231793317943179531796317973179831799318003180131802318033180431805318063180731808318093181031811318123181331814318153181631817318183181931820318213182231823318243182531826318273182831829318303183131832318333183431835318363183731838318393184031841318423184331844318453184631847318483184931850318513185231853318543185531856318573185831859318603186131862318633186431865318663186731868318693187031871318723187331874318753187631877318783187931880318813188231883318843188531886318873188831889318903189131892318933189431895318963189731898318993190031901319023190331904319053190631907319083190931910319113191231913319143191531916319173191831919319203192131922319233192431925319263192731928319293193031931319323193331934319353193631937319383193931940319413194231943319443194531946319473194831949319503195131952319533195431955319563195731958319593196031961319623196331964319653196631967319683196931970319713197231973319743197531976319773197831979319803198131982319833198431985319863198731988319893199031991319923199331994319953199631997319983199932000320013200232003320043200532006320073200832009320103201132012320133201432015320163201732018320193202032021320223202332024320253202632027320283202932030320313203232033320343203532036320373203832039320403204132042320433204432045320463204732048320493205032051320523205332054320553205632057320583205932060320613206232063320643206532066320673206832069320703207132072320733207432075320763207732078320793208032081320823208332084320853208632087320883208932090320913209232093320943209532096320973209832099321003210132102321033210432105321063210732108321093211032111321123211332114321153211632117321183211932120321213212232123321243212532126321273212832129321303213132132321333213432135321363213732138321393214032141321423214332144321453214632147321483214932150321513215232153321543215532156321573215832159321603216132162321633216432165321663216732168321693217032171321723217332174321753217632177321783217932180321813218232183321843218532186321873218832189321903219132192321933219432195321963219732198321993220032201322023220332204322053220632207322083220932210322113221232213322143221532216322173221832219322203222132222322233222432225322263222732228322293223032231322323223332234322353223632237322383223932240322413224232243322443224532246322473224832249322503225132252322533225432255322563225732258322593226032261322623226332264322653226632267322683226932270322713227232273322743227532276322773227832279322803228132282322833228432285322863228732288322893229032291322923229332294322953229632297322983229932300323013230232303323043230532306323073230832309323103231132312323133231432315323163231732318323193232032321323223232332324323253232632327323283232932330323313233232333323343233532336323373233832339323403234132342323433234432345323463234732348323493235032351323523235332354323553235632357323583235932360323613236232363323643236532366323673236832369323703237132372323733237432375323763237732378323793238032381323823238332384323853238632387323883238932390323913239232393323943239532396323973239832399324003240132402324033240432405324063240732408324093241032411324123241332414324153241632417324183241932420324213242232423324243242532426324273242832429324303243132432324333243432435324363243732438324393244032441324423244332444324453244632447324483244932450324513245232453324543245532456324573245832459324603246132462324633246432465324663246732468324693247032471324723247332474324753247632477324783247932480324813248232483324843248532486324873248832489324903249132492324933249432495324963249732498324993250032501325023250332504325053250632507325083250932510325113251232513325143251532516325173251832519325203252132522325233252432525325263252732528325293253032531325323253332534325353253632537325383253932540325413254232543325443254532546325473254832549325503255132552325533255432555325563255732558325593256032561325623256332564325653256632567325683256932570325713257232573325743257532576325773257832579325803258132582325833258432585325863258732588325893259032591325923259332594325953259632597325983259932600326013260232603326043260532606326073260832609326103261132612326133261432615326163261732618326193262032621326223262332624326253262632627326283262932630326313263232633326343263532636326373263832639326403264132642326433264432645326463264732648326493265032651326523265332654326553265632657326583265932660326613266232663326643266532666326673266832669326703267132672326733267432675326763267732678326793268032681326823268332684326853268632687326883268932690326913269232693326943269532696326973269832699327003270132702327033270432705327063270732708327093271032711327123271332714327153271632717327183271932720327213272232723327243272532726327273272832729327303273132732327333273432735327363273732738327393274032741327423274332744327453274632747327483274932750327513275232753327543275532756327573275832759327603276132762327633276432765327663276732768327693277032771327723277332774327753277632777327783277932780327813278232783327843278532786327873278832789327903279132792327933279432795327963279732798327993280032801328023280332804328053280632807328083280932810328113281232813328143281532816328173281832819328203282132822328233282432825328263282732828328293283032831328323283332834328353283632837328383283932840328413284232843328443284532846328473284832849328503285132852328533285432855328563285732858328593286032861328623286332864328653286632867328683286932870328713287232873328743287532876328773287832879328803288132882328833288432885328863288732888328893289032891328923289332894328953289632897328983289932900329013290232903329043290532906329073290832909329103291132912329133291432915329163291732918329193292032921329223292332924329253292632927329283292932930329313293232933329343293532936329373293832939329403294132942329433294432945329463294732948329493295032951329523295332954329553295632957329583295932960329613296232963329643296532966329673296832969329703297132972329733297432975329763297732978329793298032981329823298332984329853298632987329883298932990329913299232993329943299532996329973299832999330003300133002330033300433005330063300733008330093301033011330123301333014330153301633017330183301933020330213302233023330243302533026330273302833029330303303133032330333303433035330363303733038330393304033041330423304333044330453304633047330483304933050330513305233053330543305533056330573305833059330603306133062330633306433065330663306733068330693307033071330723307333074330753307633077330783307933080330813308233083330843308533086330873308833089330903309133092330933309433095330963309733098330993310033101331023310333104331053310633107331083310933110331113311233113331143311533116331173311833119331203312133122331233312433125331263312733128331293313033131331323313333134331353313633137331383313933140331413314233143331443314533146331473314833149331503315133152331533315433155331563315733158331593316033161331623316333164331653316633167331683316933170331713317233173331743317533176331773317833179331803318133182331833318433185331863318733188331893319033191331923319333194331953319633197331983319933200332013320233203332043320533206332073320833209332103321133212332133321433215332163321733218332193322033221332223322333224332253322633227332283322933230332313323233233332343323533236332373323833239332403324133242332433324433245332463324733248332493325033251332523325333254332553325633257332583325933260332613326233263332643326533266332673326833269332703327133272332733327433275332763327733278332793328033281332823328333284332853328633287332883328933290332913329233293332943329533296332973329833299333003330133302333033330433305333063330733308333093331033311333123331333314333153331633317333183331933320333213332233323333243332533326333273332833329333303333133332333333333433335333363333733338333393334033341333423334333344333453334633347333483334933350333513335233353333543335533356333573335833359333603336133362333633336433365333663336733368333693337033371333723337333374333753337633377333783337933380333813338233383333843338533386333873338833389333903339133392333933339433395333963339733398333993340033401334023340333404334053340633407334083340933410334113341233413334143341533416334173341833419334203342133422334233342433425334263342733428334293343033431334323343333434334353343633437334383343933440334413344233443334443344533446334473344833449334503345133452334533345433455334563345733458334593346033461334623346333464334653346633467334683346933470334713347233473334743347533476334773347833479334803348133482334833348433485334863348733488334893349033491334923349333494334953349633497334983349933500335013350233503335043350533506335073350833509335103351133512335133351433515335163351733518335193352033521335223352333524335253352633527335283352933530335313353233533335343353533536335373353833539335403354133542335433354433545335463354733548335493355033551335523355333554335553355633557335583355933560335613356233563335643356533566335673356833569335703357133572335733357433575335763357733578335793358033581335823358333584335853358633587335883358933590335913359233593335943359533596335973359833599336003360133602336033360433605336063360733608336093361033611336123361333614336153361633617336183361933620336213362233623336243362533626336273362833629336303363133632336333363433635336363363733638336393364033641336423364333644336453364633647336483364933650336513365233653336543365533656336573365833659336603366133662336633366433665336663366733668336693367033671336723367333674336753367633677336783367933680336813368233683336843368533686336873368833689336903369133692336933369433695336963369733698336993370033701337023370333704337053370633707337083370933710337113371233713337143371533716337173371833719337203372133722337233372433725337263372733728337293373033731337323373333734337353373633737337383373933740337413374233743337443374533746337473374833749337503375133752337533375433755337563375733758337593376033761337623376333764337653376633767337683376933770337713377233773337743377533776337773377833779337803378133782337833378433785337863378733788337893379033791337923379333794337953379633797337983379933800338013380233803338043380533806338073380833809338103381133812338133381433815338163381733818338193382033821338223382333824338253382633827338283382933830338313383233833338343383533836338373383833839338403384133842338433384433845338463384733848338493385033851338523385333854338553385633857338583385933860338613386233863338643386533866338673386833869338703387133872338733387433875338763387733878338793388033881338823388333884338853388633887338883388933890338913389233893338943389533896338973389833899339003390133902339033390433905339063390733908339093391033911339123391333914339153391633917339183391933920339213392233923339243392533926339273392833929339303393133932339333393433935339363393733938339393394033941339423394333944339453394633947339483394933950339513395233953339543395533956339573395833959339603396133962339633396433965339663396733968339693397033971339723397333974339753397633977339783397933980339813398233983339843398533986339873398833989339903399133992339933399433995339963399733998339993400034001340023400334004340053400634007340083400934010340113401234013340143401534016340173401834019340203402134022340233402434025340263402734028340293403034031340323403334034340353403634037340383403934040340413404234043340443404534046340473404834049340503405134052340533405434055340563405734058340593406034061340623406334064340653406634067340683406934070340713407234073340743407534076340773407834079340803408134082340833408434085340863408734088340893409034091340923409334094340953409634097340983409934100341013410234103341043410534106341073410834109341103411134112341133411434115341163411734118341193412034121341223412334124341253412634127341283412934130341313413234133341343413534136341373413834139341403414134142341433414434145341463414734148341493415034151341523415334154341553415634157341583415934160341613416234163341643416534166341673416834169341703417134172341733417434175341763417734178341793418034181341823418334184341853418634187341883418934190341913419234193341943419534196341973419834199342003420134202342033420434205342063420734208342093421034211342123421334214342153421634217342183421934220342213422234223342243422534226342273422834229342303423134232342333423434235342363423734238342393424034241342423424334244342453424634247342483424934250342513425234253342543425534256342573425834259342603426134262342633426434265342663426734268342693427034271342723427334274342753427634277342783427934280342813428234283342843428534286342873428834289342903429134292342933429434295342963429734298342993430034301343023430334304343053430634307343083430934310343113431234313343143431534316343173431834319343203432134322343233432434325343263432734328343293433034331343323433334334343353433634337343383433934340343413434234343343443434534346343473434834349343503435134352343533435434355343563435734358343593436034361343623436334364343653436634367343683436934370343713437234373343743437534376343773437834379343803438134382343833438434385343863438734388343893439034391343923439334394343953439634397343983439934400344013440234403344043440534406344073440834409344103441134412344133441434415344163441734418344193442034421344223442334424344253442634427344283442934430344313443234433344343443534436344373443834439344403444134442344433444434445344463444734448344493445034451344523445334454344553445634457344583445934460344613446234463344643446534466344673446834469344703447134472344733447434475344763447734478344793448034481344823448334484344853448634487344883448934490344913449234493344943449534496344973449834499345003450134502345033450434505345063450734508345093451034511345123451334514345153451634517345183451934520345213452234523345243452534526345273452834529345303453134532345333453434535345363453734538345393454034541345423454334544345453454634547345483454934550345513455234553345543455534556345573455834559345603456134562345633456434565345663456734568345693457034571345723457334574345753457634577345783457934580345813458234583345843458534586345873458834589345903459134592345933459434595345963459734598345993460034601346023460334604346053460634607346083460934610346113461234613346143461534616346173461834619346203462134622346233462434625346263462734628346293463034631346323463334634346353463634637346383463934640346413464234643346443464534646346473464834649346503465134652346533465434655346563465734658346593466034661346623466334664346653466634667346683466934670346713467234673346743467534676346773467834679346803468134682346833468434685346863468734688346893469034691346923469334694346953469634697346983469934700347013470234703347043470534706347073470834709347103471134712347133471434715347163471734718347193472034721347223472334724347253472634727347283472934730347313473234733347343473534736347373473834739347403474134742347433474434745347463474734748347493475034751347523475334754347553475634757347583475934760347613476234763347643476534766347673476834769347703477134772347733477434775347763477734778347793478034781347823478334784347853478634787347883478934790347913479234793347943479534796347973479834799348003480134802348033480434805348063480734808348093481034811348123481334814348153481634817348183481934820348213482234823348243482534826348273482834829348303483134832348333483434835348363483734838348393484034841348423484334844348453484634847348483484934850348513485234853348543485534856348573485834859348603486134862348633486434865348663486734868348693487034871348723487334874348753487634877348783487934880348813488234883348843488534886348873488834889348903489134892348933489434895348963489734898348993490034901349023490334904349053490634907349083490934910349113491234913349143491534916349173491834919349203492134922349233492434925349263492734928349293493034931349323493334934349353493634937349383493934940349413494234943349443494534946349473494834949349503495134952349533495434955349563495734958349593496034961349623496334964349653496634967349683496934970349713497234973349743497534976349773497834979349803498134982349833498434985349863498734988349893499034991349923499334994349953499634997349983499935000350013500235003350043500535006350073500835009350103501135012350133501435015350163501735018350193502035021350223502335024350253502635027350283502935030350313503235033350343503535036350373503835039350403504135042350433504435045350463504735048350493505035051350523505335054350553505635057350583505935060350613506235063350643506535066350673506835069350703507135072350733507435075350763507735078350793508035081350823508335084350853508635087350883508935090350913509235093350943509535096350973509835099351003510135102351033510435105351063510735108351093511035111351123511335114351153511635117351183511935120351213512235123351243512535126351273512835129351303513135132351333513435135351363513735138351393514035141351423514335144351453514635147351483514935150351513515235153351543515535156351573515835159351603516135162351633516435165351663516735168351693517035171351723517335174351753517635177351783517935180351813518235183351843518535186351873518835189351903519135192351933519435195351963519735198351993520035201352023520335204352053520635207352083520935210352113521235213352143521535216352173521835219352203522135222352233522435225352263522735228352293523035231352323523335234352353523635237352383523935240352413524235243352443524535246352473524835249352503525135252352533525435255352563525735258352593526035261352623526335264352653526635267352683526935270352713527235273352743527535276352773527835279352803528135282352833528435285352863528735288352893529035291352923529335294352953529635297352983529935300353013530235303353043530535306353073530835309353103531135312353133531435315353163531735318353193532035321353223532335324353253532635327353283532935330353313533235333353343533535336353373533835339353403534135342353433534435345353463534735348353493535035351353523535335354353553535635357353583535935360353613536235363353643536535366353673536835369353703537135372353733537435375353763537735378353793538035381353823538335384353853538635387353883538935390353913539235393353943539535396353973539835399354003540135402354033540435405354063540735408354093541035411354123541335414354153541635417354183541935420354213542235423354243542535426354273542835429354303543135432354333543435435354363543735438354393544035441354423544335444354453544635447354483544935450354513545235453354543545535456354573545835459354603546135462354633546435465354663546735468354693547035471354723547335474354753547635477354783547935480354813548235483354843548535486354873548835489354903549135492354933549435495354963549735498354993550035501355023550335504355053550635507355083550935510355113551235513355143551535516355173551835519355203552135522355233552435525355263552735528355293553035531355323553335534355353553635537355383553935540355413554235543355443554535546355473554835549355503555135552355533555435555355563555735558355593556035561355623556335564355653556635567355683556935570355713557235573355743557535576355773557835579355803558135582355833558435585355863558735588355893559035591355923559335594355953559635597355983559935600356013560235603356043560535606356073560835609356103561135612356133561435615356163561735618356193562035621356223562335624356253562635627356283562935630356313563235633356343563535636356373563835639356403564135642356433564435645356463564735648356493565035651356523565335654356553565635657356583565935660356613566235663356643566535666356673566835669356703567135672356733567435675356763567735678356793568035681356823568335684356853568635687356883568935690356913569235693356943569535696356973569835699357003570135702357033570435705357063570735708357093571035711357123571335714357153571635717357183571935720357213572235723357243572535726357273572835729357303573135732357333573435735357363573735738357393574035741357423574335744357453574635747357483574935750357513575235753357543575535756357573575835759357603576135762357633576435765357663576735768357693577035771357723577335774357753577635777357783577935780357813578235783357843578535786357873578835789357903579135792357933579435795357963579735798357993580035801358023580335804358053580635807358083580935810358113581235813358143581535816358173581835819358203582135822358233582435825358263582735828358293583035831358323583335834358353583635837358383583935840358413584235843358443584535846358473584835849358503585135852358533585435855358563585735858358593586035861358623586335864358653586635867358683586935870358713587235873358743587535876358773587835879358803588135882358833588435885358863588735888358893589035891358923589335894358953589635897358983589935900359013590235903359043590535906359073590835909359103591135912359133591435915359163591735918359193592035921359223592335924359253592635927359283592935930359313593235933359343593535936359373593835939359403594135942359433594435945359463594735948359493595035951359523595335954359553595635957359583595935960359613596235963359643596535966359673596835969359703597135972359733597435975359763597735978359793598035981359823598335984359853598635987359883598935990359913599235993359943599535996359973599835999360003600136002360033600436005360063600736008360093601036011360123601336014360153601636017360183601936020360213602236023360243602536026360273602836029360303603136032360333603436035360363603736038360393604036041360423604336044360453604636047360483604936050360513605236053360543605536056360573605836059360603606136062360633606436065360663606736068360693607036071360723607336074360753607636077360783607936080360813608236083360843608536086360873608836089360903609136092360933609436095360963609736098360993610036101361023610336104361053610636107361083610936110361113611236113361143611536116361173611836119361203612136122361233612436125361263612736128361293613036131361323613336134361353613636137361383613936140361413614236143361443614536146361473614836149361503615136152361533615436155361563615736158361593616036161361623616336164361653616636167361683616936170361713617236173361743617536176361773617836179361803618136182361833618436185361863618736188361893619036191361923619336194361953619636197361983619936200362013620236203362043620536206362073620836209362103621136212362133621436215362163621736218362193622036221362223622336224362253622636227362283622936230362313623236233362343623536236362373623836239362403624136242362433624436245362463624736248362493625036251362523625336254362553625636257362583625936260362613626236263362643626536266362673626836269362703627136272362733627436275362763627736278362793628036281362823628336284362853628636287362883628936290362913629236293362943629536296362973629836299363003630136302363033630436305363063630736308363093631036311363123631336314363153631636317363183631936320363213632236323363243632536326363273632836329363303633136332363333633436335363363633736338363393634036341363423634336344363453634636347363483634936350363513635236353363543635536356363573635836359363603636136362363633636436365363663636736368363693637036371363723637336374363753637636377363783637936380363813638236383363843638536386363873638836389363903639136392363933639436395363963639736398363993640036401364023640336404364053640636407364083640936410364113641236413364143641536416364173641836419364203642136422364233642436425364263642736428364293643036431364323643336434364353643636437364383643936440364413644236443364443644536446364473644836449364503645136452364533645436455364563645736458364593646036461364623646336464364653646636467364683646936470364713647236473364743647536476364773647836479364803648136482364833648436485364863648736488364893649036491364923649336494364953649636497364983649936500365013650236503365043650536506365073650836509365103651136512365133651436515365163651736518365193652036521365223652336524365253652636527365283652936530365313653236533365343653536536365373653836539365403654136542365433654436545365463654736548365493655036551365523655336554365553655636557365583655936560365613656236563365643656536566365673656836569365703657136572365733657436575365763657736578365793658036581365823658336584365853658636587365883658936590365913659236593365943659536596365973659836599366003660136602366033660436605366063660736608366093661036611366123661336614366153661636617366183661936620366213662236623366243662536626366273662836629366303663136632366333663436635366363663736638366393664036641366423664336644366453664636647366483664936650366513665236653366543665536656366573665836659366603666136662366633666436665366663666736668366693667036671366723667336674366753667636677366783667936680366813668236683366843668536686366873668836689366903669136692366933669436695366963669736698366993670036701367023670336704367053670636707367083670936710367113671236713367143671536716367173671836719367203672136722367233672436725367263672736728367293673036731367323673336734367353673636737367383673936740367413674236743367443674536746367473674836749367503675136752367533675436755367563675736758367593676036761367623676336764367653676636767367683676936770367713677236773367743677536776367773677836779367803678136782367833678436785367863678736788367893679036791367923679336794367953679636797367983679936800368013680236803368043680536806368073680836809368103681136812368133681436815368163681736818368193682036821368223682336824368253682636827368283682936830368313683236833368343683536836368373683836839368403684136842368433684436845368463684736848368493685036851368523685336854368553685636857368583685936860368613686236863368643686536866368673686836869368703687136872368733687436875368763687736878368793688036881368823688336884368853688636887368883688936890368913689236893368943689536896368973689836899369003690136902369033690436905369063690736908369093691036911369123691336914369153691636917369183691936920369213692236923369243692536926369273692836929369303693136932369333693436935369363693736938369393694036941369423694336944369453694636947369483694936950369513695236953369543695536956369573695836959369603696136962369633696436965369663696736968369693697036971369723697336974369753697636977369783697936980369813698236983369843698536986369873698836989369903699136992369933699436995369963699736998369993700037001370023700337004370053700637007370083700937010370113701237013370143701537016370173701837019370203702137022370233702437025370263702737028370293703037031370323703337034370353703637037370383703937040370413704237043370443704537046370473704837049370503705137052370533705437055370563705737058370593706037061370623706337064370653706637067370683706937070370713707237073370743707537076370773707837079370803708137082370833708437085370863708737088370893709037091370923709337094370953709637097370983709937100371013710237103371043710537106371073710837109371103711137112371133711437115371163711737118371193712037121371223712337124371253712637127371283712937130371313713237133371343713537136371373713837139371403714137142371433714437145371463714737148371493715037151371523715337154371553715637157371583715937160371613716237163371643716537166371673716837169371703717137172371733717437175371763717737178371793718037181371823718337184371853718637187371883718937190371913719237193371943719537196371973719837199372003720137202372033720437205372063720737208372093721037211372123721337214372153721637217372183721937220372213722237223372243722537226372273722837229372303723137232372333723437235372363723737238372393724037241372423724337244372453724637247372483724937250372513725237253372543725537256372573725837259372603726137262372633726437265372663726737268372693727037271372723727337274372753727637277372783727937280372813728237283372843728537286372873728837289372903729137292372933729437295372963729737298372993730037301373023730337304373053730637307373083730937310373113731237313373143731537316373173731837319373203732137322373233732437325373263732737328373293733037331373323733337334373353733637337373383733937340373413734237343373443734537346373473734837349373503735137352373533735437355373563735737358373593736037361373623736337364373653736637367373683736937370373713737237373373743737537376373773737837379373803738137382373833738437385373863738737388373893739037391373923739337394373953739637397373983739937400374013740237403374043740537406374073740837409374103741137412374133741437415374163741737418374193742037421374223742337424374253742637427374283742937430374313743237433374343743537436374373743837439374403744137442374433744437445374463744737448374493745037451374523745337454374553745637457374583745937460374613746237463374643746537466374673746837469374703747137472374733747437475374763747737478374793748037481374823748337484374853748637487374883748937490374913749237493374943749537496374973749837499375003750137502375033750437505375063750737508375093751037511375123751337514375153751637517375183751937520375213752237523375243752537526375273752837529375303753137532375333753437535375363753737538375393754037541375423754337544375453754637547375483754937550375513755237553375543755537556375573755837559375603756137562375633756437565375663756737568375693757037571375723757337574375753757637577375783757937580375813758237583375843758537586375873758837589375903759137592375933759437595375963759737598375993760037601376023760337604376053760637607376083760937610376113761237613376143761537616376173761837619376203762137622376233762437625376263762737628376293763037631376323763337634376353763637637376383763937640376413764237643376443764537646376473764837649376503765137652376533765437655376563765737658376593766037661376623766337664376653766637667376683766937670376713767237673376743767537676376773767837679376803768137682376833768437685376863768737688376893769037691376923769337694376953769637697376983769937700377013770237703377043770537706377073770837709377103771137712377133771437715377163771737718377193772037721377223772337724377253772637727377283772937730377313773237733377343773537736377373773837739377403774137742377433774437745377463774737748377493775037751377523775337754377553775637757377583775937760377613776237763377643776537766377673776837769377703777137772377733777437775377763777737778377793778037781377823778337784377853778637787377883778937790377913779237793377943779537796377973779837799378003780137802378033780437805378063780737808378093781037811378123781337814378153781637817378183781937820378213782237823378243782537826378273782837829378303783137832378333783437835378363783737838378393784037841378423784337844378453784637847378483784937850378513785237853378543785537856378573785837859378603786137862378633786437865378663786737868378693787037871378723787337874378753787637877378783787937880378813788237883378843788537886378873788837889378903789137892378933789437895378963789737898378993790037901379023790337904379053790637907379083790937910379113791237913379143791537916379173791837919379203792137922379233792437925379263792737928379293793037931379323793337934379353793637937379383793937940379413794237943379443794537946379473794837949379503795137952379533795437955379563795737958379593796037961379623796337964379653796637967379683796937970379713797237973379743797537976379773797837979379803798137982379833798437985379863798737988379893799037991379923799337994379953799637997379983799938000380013800238003380043800538006380073800838009380103801138012380133801438015380163801738018380193802038021380223802338024380253802638027380283802938030380313803238033380343803538036380373803838039380403804138042380433804438045380463804738048380493805038051380523805338054380553805638057380583805938060380613806238063380643806538066380673806838069380703807138072380733807438075380763807738078380793808038081380823808338084380853808638087380883808938090380913809238093380943809538096380973809838099381003810138102381033810438105381063810738108381093811038111381123811338114381153811638117381183811938120381213812238123381243812538126381273812838129381303813138132381333813438135381363813738138381393814038141381423814338144381453814638147381483814938150381513815238153381543815538156381573815838159381603816138162381633816438165381663816738168381693817038171381723817338174381753817638177381783817938180381813818238183381843818538186381873818838189381903819138192381933819438195381963819738198381993820038201382023820338204382053820638207382083820938210382113821238213382143821538216382173821838219382203822138222382233822438225382263822738228382293823038231382323823338234382353823638237382383823938240382413824238243382443824538246382473824838249382503825138252382533825438255382563825738258382593826038261382623826338264382653826638267382683826938270382713827238273382743827538276382773827838279382803828138282382833828438285382863828738288382893829038291382923829338294382953829638297382983829938300383013830238303383043830538306383073830838309383103831138312383133831438315383163831738318383193832038321383223832338324383253832638327383283832938330383313833238333383343833538336383373833838339383403834138342383433834438345383463834738348383493835038351383523835338354383553835638357383583835938360383613836238363383643836538366383673836838369383703837138372383733837438375383763837738378383793838038381383823838338384383853838638387383883838938390383913839238393383943839538396383973839838399384003840138402384033840438405384063840738408384093841038411384123841338414384153841638417384183841938420384213842238423384243842538426384273842838429384303843138432384333843438435384363843738438384393844038441384423844338444384453844638447384483844938450384513845238453384543845538456384573845838459384603846138462384633846438465384663846738468384693847038471384723847338474384753847638477384783847938480384813848238483384843848538486384873848838489384903849138492384933849438495384963849738498384993850038501385023850338504385053850638507385083850938510385113851238513385143851538516385173851838519385203852138522385233852438525385263852738528385293853038531385323853338534385353853638537385383853938540385413854238543385443854538546385473854838549385503855138552385533855438555385563855738558385593856038561385623856338564385653856638567385683856938570385713857238573385743857538576385773857838579385803858138582385833858438585385863858738588385893859038591385923859338594385953859638597385983859938600386013860238603386043860538606386073860838609386103861138612386133861438615386163861738618386193862038621386223862338624386253862638627386283862938630386313863238633386343863538636386373863838639386403864138642386433864438645386463864738648386493865038651386523865338654386553865638657386583865938660386613866238663386643866538666386673866838669386703867138672386733867438675386763867738678386793868038681386823868338684386853868638687386883868938690386913869238693386943869538696386973869838699387003870138702387033870438705387063870738708387093871038711387123871338714387153871638717387183871938720387213872238723387243872538726387273872838729387303873138732387333873438735387363873738738387393874038741387423874338744387453874638747387483874938750387513875238753387543875538756387573875838759387603876138762387633876438765387663876738768387693877038771387723877338774387753877638777387783877938780387813878238783387843878538786387873878838789387903879138792387933879438795387963879738798387993880038801388023880338804388053880638807388083880938810388113881238813388143881538816388173881838819388203882138822388233882438825388263882738828388293883038831388323883338834388353883638837388383883938840388413884238843388443884538846388473884838849388503885138852388533885438855388563885738858388593886038861388623886338864388653886638867388683886938870388713887238873388743887538876388773887838879388803888138882388833888438885388863888738888388893889038891388923889338894388953889638897388983889938900389013890238903389043890538906389073890838909389103891138912389133891438915389163891738918389193892038921389223892338924389253892638927389283892938930389313893238933389343893538936389373893838939389403894138942389433894438945389463894738948389493895038951389523895338954389553895638957389583895938960389613896238963389643896538966389673896838969389703897138972389733897438975389763897738978389793898038981389823898338984389853898638987389883898938990389913899238993389943899538996389973899838999390003900139002390033900439005390063900739008390093901039011390123901339014390153901639017390183901939020390213902239023390243902539026390273902839029390303903139032390333903439035390363903739038390393904039041390423904339044390453904639047390483904939050390513905239053390543905539056390573905839059390603906139062390633906439065390663906739068390693907039071390723907339074390753907639077390783907939080390813908239083390843908539086390873908839089390903909139092390933909439095390963909739098390993910039101391023910339104391053910639107391083910939110391113911239113391143911539116391173911839119391203912139122391233912439125391263912739128391293913039131391323913339134391353913639137391383913939140391413914239143391443914539146391473914839149391503915139152391533915439155391563915739158391593916039161391623916339164391653916639167391683916939170391713917239173391743917539176391773917839179391803918139182391833918439185391863918739188391893919039191391923919339194391953919639197391983919939200392013920239203392043920539206392073920839209392103921139212392133921439215392163921739218392193922039221392223922339224392253922639227392283922939230392313923239233392343923539236392373923839239392403924139242392433924439245392463924739248392493925039251392523925339254392553925639257392583925939260392613926239263392643926539266392673926839269392703927139272392733927439275392763927739278392793928039281392823928339284392853928639287392883928939290392913929239293392943929539296392973929839299393003930139302393033930439305393063930739308393093931039311393123931339314393153931639317393183931939320393213932239323393243932539326393273932839329393303933139332393333933439335393363933739338393393934039341393423934339344393453934639347393483934939350393513935239353393543935539356393573935839359393603936139362393633936439365393663936739368393693937039371393723937339374393753937639377393783937939380393813938239383393843938539386393873938839389393903939139392393933939439395393963939739398393993940039401394023940339404394053940639407394083940939410394113941239413394143941539416394173941839419394203942139422394233942439425394263942739428394293943039431394323943339434394353943639437394383943939440394413944239443394443944539446394473944839449394503945139452394533945439455394563945739458394593946039461394623946339464394653946639467394683946939470394713947239473394743947539476394773947839479394803948139482394833948439485394863948739488394893949039491394923949339494394953949639497394983949939500395013950239503395043950539506395073950839509395103951139512395133951439515 |
- (function webpackUniversalModuleDefinition(root, factory) {
- if(typeof exports === 'object' && typeof module === 'object')
- module.exports = factory(require("Rx"), require("rxjs/observable/fromPromise"), require("rxjs/operator/toPromise"), require("rxjs/subject/ReplaySubject"), require("rxjs/operator/take"));
- else if(typeof define === 'function' && define.amd)
- define(["Rx", "rxjs/observable/fromPromise", "rxjs/operator/toPromise", "rxjs/subject/ReplaySubject", "rxjs/operator/take"], factory);
- else if(typeof exports === 'object')
- exports["ng"] = factory(require("Rx"), require("rxjs/observable/fromPromise"), require("rxjs/operator/toPromise"), require("rxjs/subject/ReplaySubject"), require("rxjs/operator/take"));
- else
- root["ng"] = factory(root["Rx"], root["Rx"]["Observable"], root["Rx"]["Observable"]["prototype"], root["Rx"], root["Rx"]["Observable"]["prototype"]);
- })(this, function(__WEBPACK_EXTERNAL_MODULE_62__, __WEBPACK_EXTERNAL_MODULE_63__, __WEBPACK_EXTERNAL_MODULE_64__, __WEBPACK_EXTERNAL_MODULE_279__, __WEBPACK_EXTERNAL_MODULE_280__) {
- return /******/ (function(modules) { // webpackBootstrap
- /******/ // The module cache
- /******/ var installedModules = {};
- /******/
- /******/ // The require function
- /******/ function __webpack_require__(moduleId) {
- /******/
- /******/ // Check if module is in cache
- /******/ if(installedModules[moduleId])
- /******/ return installedModules[moduleId].exports;
- /******/
- /******/ // Create a new module (and put it into the cache)
- /******/ var module = installedModules[moduleId] = {
- /******/ exports: {},
- /******/ id: moduleId,
- /******/ loaded: false
- /******/ };
- /******/
- /******/ // Execute the module function
- /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
- /******/
- /******/ // Flag the module as loaded
- /******/ module.loaded = true;
- /******/
- /******/ // Return the exports of the module
- /******/ return module.exports;
- /******/ }
- /******/
- /******/
- /******/ // expose the modules object (__webpack_modules__)
- /******/ __webpack_require__.m = modules;
- /******/
- /******/ // expose the module cache
- /******/ __webpack_require__.c = installedModules;
- /******/
- /******/ // __webpack_public_path__
- /******/ __webpack_require__.p = "";
- /******/
- /******/ // Load entry module and return exports
- /******/ return __webpack_require__(0);
- /******/ })
- /************************************************************************/
- /******/ ([
- /* 0 */
- /***/ function(module, exports, __webpack_require__) {
- module.exports = __webpack_require__(1);
- /***/ },
- /* 1 */
- /***/ function(module, exports, __webpack_require__) {
- // this bundle is almost identical to the angular2.umd.js
- // the only difference being "testing" export
- exports.core = __webpack_require__(2);
- exports.common = __webpack_require__(104);
- exports.compiler = __webpack_require__(147);
- exports.platform = {
- browser: __webpack_require__(179),
- common_dom: __webpack_require__(203)
- };
- exports.http = __webpack_require__(209);
- exports.router = __webpack_require__(224);
- exports.router_link_dsl = __webpack_require__(248);
- exports.instrumentation = __webpack_require__(250);
- exports.upgrade = __webpack_require__(251);
- // this is the only difference as compared to the angular2-all.umd.js bundle
- exports.testing = __webpack_require__(259);
- exports.http.testing = __webpack_require__(277);
- exports.router.testing = __webpack_require__(281);
- /***/ },
- /* 2 */
- /***/ function(module, exports, __webpack_require__) {
- function __export(m) {
- for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
- }
- /**
- * @module
- * @description
- * Starting point to import all public core APIs.
- */
- __export(__webpack_require__(3));
- __export(__webpack_require__(57));
- __export(__webpack_require__(58));
- __export(__webpack_require__(6));
- __export(__webpack_require__(59));
- var lang_1 = __webpack_require__(5);
- exports.enableProdMode = lang_1.enableProdMode;
- var application_ref_1 = __webpack_require__(65);
- exports.platform = application_ref_1.platform;
- exports.createNgZone = application_ref_1.createNgZone;
- exports.PlatformRef = application_ref_1.PlatformRef;
- exports.ApplicationRef = application_ref_1.ApplicationRef;
- var application_tokens_1 = __webpack_require__(67);
- exports.APP_ID = application_tokens_1.APP_ID;
- exports.APP_COMPONENT = application_tokens_1.APP_COMPONENT;
- exports.APP_INITIALIZER = application_tokens_1.APP_INITIALIZER;
- exports.PACKAGE_ROOT_URL = application_tokens_1.PACKAGE_ROOT_URL;
- exports.PLATFORM_INITIALIZER = application_tokens_1.PLATFORM_INITIALIZER;
- __export(__webpack_require__(98));
- __export(__webpack_require__(99));
- __export(__webpack_require__(100));
- var debug_element_1 = __webpack_require__(101);
- exports.DebugElement = debug_element_1.DebugElement;
- exports.Scope = debug_element_1.Scope;
- exports.inspectElement = debug_element_1.inspectElement;
- exports.asNativeElements = debug_element_1.asNativeElements;
- __export(__webpack_require__(68));
- __export(__webpack_require__(24));
- __export(__webpack_require__(95));
- __export(__webpack_require__(102));
- __export(__webpack_require__(103));
- __export(__webpack_require__(16));
- /***/ },
- /* 3 */
- /***/ function(module, exports, __webpack_require__) {
- /**
- * This indirection is needed to free up Component, etc symbols in the public API
- * to be used by the decorator versions of these annotations.
- */
- var di_1 = __webpack_require__(4);
- exports.QueryMetadata = di_1.QueryMetadata;
- exports.ContentChildrenMetadata = di_1.ContentChildrenMetadata;
- exports.ContentChildMetadata = di_1.ContentChildMetadata;
- exports.ViewChildrenMetadata = di_1.ViewChildrenMetadata;
- exports.ViewQueryMetadata = di_1.ViewQueryMetadata;
- exports.ViewChildMetadata = di_1.ViewChildMetadata;
- exports.AttributeMetadata = di_1.AttributeMetadata;
- var directives_1 = __webpack_require__(23);
- exports.ComponentMetadata = directives_1.ComponentMetadata;
- exports.DirectiveMetadata = directives_1.DirectiveMetadata;
- exports.PipeMetadata = directives_1.PipeMetadata;
- exports.InputMetadata = directives_1.InputMetadata;
- exports.OutputMetadata = directives_1.OutputMetadata;
- exports.HostBindingMetadata = directives_1.HostBindingMetadata;
- exports.HostListenerMetadata = directives_1.HostListenerMetadata;
- var view_1 = __webpack_require__(56);
- exports.ViewMetadata = view_1.ViewMetadata;
- exports.ViewEncapsulation = view_1.ViewEncapsulation;
- var di_2 = __webpack_require__(4);
- var directives_2 = __webpack_require__(23);
- var view_2 = __webpack_require__(56);
- var decorators_1 = __webpack_require__(9);
- // TODO(alexeagle): remove the duplication of this doc. It is copied from ComponentMetadata.
- /**
- * Declare reusable UI building blocks for an application.
- *
- * Each Angular component requires a single `@Component` and at least one `@View` annotation. The
- * `@Component`
- * annotation specifies when a component is instantiated, and which properties and hostListeners it
- * binds to.
- *
- * When a component is instantiated, Angular
- * - creates a shadow DOM for the component.
- * - loads the selected template into the shadow DOM.
- * - creates all the injectable objects configured with `providers` and `viewProviders`.
- *
- * All template expressions and statements are then evaluated against the component instance.
- *
- * For details on the `@View` annotation, see {@link ViewMetadata}.
- *
- * ## Lifecycle hooks
- *
- * When the component class implements some {@link angular2/lifecycle_hooks} the callbacks are
- * called by the change detection at defined points in time during the life of the component.
- *
- * ### Example
- *
- * {@example core/ts/metadata/metadata.ts region='component'}
- */
- exports.Component = decorators_1.makeDecorator(directives_2.ComponentMetadata, function (fn) { return fn.View = exports.View; });
- // TODO(alexeagle): remove the duplication of this doc. It is copied from DirectiveMetadata.
- /**
- * Directives allow you to attach behavior to elements in the DOM.
- *
- * {@link DirectiveMetadata}s with an embedded view are called {@link ComponentMetadata}s.
- *
- * A directive consists of a single directive annotation and a controller class. When the
- * directive's `selector` matches
- * elements in the DOM, the following steps occur:
- *
- * 1. For each directive, the `ElementInjector` attempts to resolve the directive's constructor
- * arguments.
- * 2. Angular instantiates directives for each matched element using `ElementInjector` in a
- * depth-first order,
- * as declared in the HTML.
- *
- * ## Understanding How Injection Works
- *
- * There are three stages of injection resolution.
- * - *Pre-existing Injectors*:
- * - The terminal {@link Injector} cannot resolve dependencies. It either throws an error or, if
- * the dependency was
- * specified as `@Optional`, returns `null`.
- * - The platform injector resolves browser singleton resources, such as: cookies, title,
- * location, and others.
- * - *Component Injectors*: Each component instance has its own {@link Injector}, and they follow
- * the same parent-child hierarchy
- * as the component instances in the DOM.
- * - *Element Injectors*: Each component instance has a Shadow DOM. Within the Shadow DOM each
- * element has an `ElementInjector`
- * which follow the same parent-child hierarchy as the DOM elements themselves.
- *
- * When a template is instantiated, it also must instantiate the corresponding directives in a
- * depth-first order. The
- * current `ElementInjector` resolves the constructor dependencies for each directive.
- *
- * Angular then resolves dependencies as follows, according to the order in which they appear in the
- * {@link ViewMetadata}:
- *
- * 1. Dependencies on the current element
- * 2. Dependencies on element injectors and their parents until it encounters a Shadow DOM boundary
- * 3. Dependencies on component injectors and their parents until it encounters the root component
- * 4. Dependencies on pre-existing injectors
- *
- *
- * The `ElementInjector` can inject other directives, element-specific special objects, or it can
- * delegate to the parent
- * injector.
- *
- * To inject other directives, declare the constructor parameter as:
- * - `directive:DirectiveType`: a directive on the current element only
- * - `@Host() directive:DirectiveType`: any directive that matches the type between the current
- * element and the
- * Shadow DOM root.
- * - `@Query(DirectiveType) query:QueryList<DirectiveType>`: A live collection of direct child
- * directives.
- * - `@QueryDescendants(DirectiveType) query:QueryList<DirectiveType>`: A live collection of any
- * child directives.
- *
- * To inject element-specific special objects, declare the constructor parameter as:
- * - `element: ElementRef` to obtain a reference to logical element in the view.
- * - `viewContainer: ViewContainerRef` to control child template instantiation, for
- * {@link DirectiveMetadata} directives only
- * - `bindingPropagation: BindingPropagation` to control change detection in a more granular way.
- *
- * ### Example
- *
- * The following example demonstrates how dependency injection resolves constructor arguments in
- * practice.
- *
- *
- * Assume this HTML template:
- *
- * ```
- * <div dependency="1">
- * <div dependency="2">
- * <div dependency="3" my-directive>
- * <div dependency="4">
- * <div dependency="5"></div>
- * </div>
- * <div dependency="6"></div>
- * </div>
- * </div>
- * </div>
- * ```
- *
- * With the following `dependency` decorator and `SomeService` injectable class.
- *
- * ```
- * @Injectable()
- * class SomeService {
- * }
- *
- * @Directive({
- * selector: '[dependency]',
- * inputs: [
- * 'id: dependency'
- * ]
- * })
- * class Dependency {
- * id:string;
- * }
- * ```
- *
- * Let's step through the different ways in which `MyDirective` could be declared...
- *
- *
- * ### No injection
- *
- * Here the constructor is declared with no arguments, therefore nothing is injected into
- * `MyDirective`.
- *
- * ```
- * @Directive({ selector: '[my-directive]' })
- * class MyDirective {
- * constructor() {
- * }
- * }
- * ```
- *
- * This directive would be instantiated with no dependencies.
- *
- *
- * ### Component-level injection
- *
- * Directives can inject any injectable instance from the closest component injector or any of its
- * parents.
- *
- * Here, the constructor declares a parameter, `someService`, and injects the `SomeService` type
- * from the parent
- * component's injector.
- * ```
- * @Directive({ selector: '[my-directive]' })
- * class MyDirective {
- * constructor(someService: SomeService) {
- * }
- * }
- * ```
- *
- * This directive would be instantiated with a dependency on `SomeService`.
- *
- *
- * ### Injecting a directive from the current element
- *
- * Directives can inject other directives declared on the current element.
- *
- * ```
- * @Directive({ selector: '[my-directive]' })
- * class MyDirective {
- * constructor(dependency: Dependency) {
- * expect(dependency.id).toEqual(3);
- * }
- * }
- * ```
- * This directive would be instantiated with `Dependency` declared at the same element, in this case
- * `dependency="3"`.
- *
- * ### Injecting a directive from any ancestor elements
- *
- * Directives can inject other directives declared on any ancestor element (in the current Shadow
- * DOM), i.e. on the current element, the
- * parent element, or its parents.
- * ```
- * @Directive({ selector: '[my-directive]' })
- * class MyDirective {
- * constructor(@Host() dependency: Dependency) {
- * expect(dependency.id).toEqual(2);
- * }
- * }
- * ```
- *
- * `@Host` checks the current element, the parent, as well as its parents recursively. If
- * `dependency="2"` didn't
- * exist on the direct parent, this injection would
- * have returned
- * `dependency="1"`.
- *
- *
- * ### Injecting a live collection of direct child directives
- *
- *
- * A directive can also query for other child directives. Since parent directives are instantiated
- * before child directives, a directive can't simply inject the list of child directives. Instead,
- * the directive injects a {@link QueryList}, which updates its contents as children are added,
- * removed, or moved by a directive that uses a {@link ViewContainerRef} such as a `ngFor`, an
- * `ngIf`, or an `ngSwitch`.
- *
- * ```
- * @Directive({ selector: '[my-directive]' })
- * class MyDirective {
- * constructor(@Query(Dependency) dependencies:QueryList<Dependency>) {
- * }
- * }
- * ```
- *
- * This directive would be instantiated with a {@link QueryList} which contains `Dependency` 4 and
- * 6. Here, `Dependency` 5 would not be included, because it is not a direct child.
- *
- * ### Injecting a live collection of descendant directives
- *
- * By passing the descendant flag to `@Query` above, we can include the children of the child
- * elements.
- *
- * ```
- * @Directive({ selector: '[my-directive]' })
- * class MyDirective {
- * constructor(@Query(Dependency, {descendants: true}) dependencies:QueryList<Dependency>) {
- * }
- * }
- * ```
- *
- * This directive would be instantiated with a Query which would contain `Dependency` 4, 5 and 6.
- *
- * ### Optional injection
- *
- * The normal behavior of directives is to return an error when a specified dependency cannot be
- * resolved. If you
- * would like to inject `null` on unresolved dependency instead, you can annotate that dependency
- * with `@Optional()`.
- * This explicitly permits the author of a template to treat some of the surrounding directives as
- * optional.
- *
- * ```
- * @Directive({ selector: '[my-directive]' })
- * class MyDirective {
- * constructor(@Optional() dependency:Dependency) {
- * }
- * }
- * ```
- *
- * This directive would be instantiated with a `Dependency` directive found on the current element.
- * If none can be
- * found, the injector supplies `null` instead of throwing an error.
- *
- * ### Example
- *
- * Here we use a decorator directive to simply define basic tool-tip behavior.
- *
- * ```
- * @Directive({
- * selector: '[tooltip]',
- * inputs: [
- * 'text: tooltip'
- * ],
- * host: {
- * '(mouseenter)': 'onMouseEnter()',
- * '(mouseleave)': 'onMouseLeave()'
- * }
- * })
- * class Tooltip{
- * text:string;
- * overlay:Overlay; // NOT YET IMPLEMENTED
- * overlayManager:OverlayManager; // NOT YET IMPLEMENTED
- *
- * constructor(overlayManager:OverlayManager) {
- * this.overlay = overlay;
- * }
- *
- * onMouseEnter() {
- * // exact signature to be determined
- * this.overlay = this.overlayManager.open(text, ...);
- * }
- *
- * onMouseLeave() {
- * this.overlay.close();
- * this.overlay = null;
- * }
- * }
- * ```
- * In our HTML template, we can then add this behavior to a `<div>` or any other element with the
- * `tooltip` selector,
- * like so:
- *
- * ```
- * <div tooltip="some text here"></div>
- * ```
- *
- * Directives can also control the instantiation, destruction, and positioning of inline template
- * elements:
- *
- * A directive uses a {@link ViewContainerRef} to instantiate, insert, move, and destroy views at
- * runtime.
- * The {@link ViewContainerRef} is created as a result of `<template>` element, and represents a
- * location in the current view
- * where these actions are performed.
- *
- * Views are always created as children of the current {@link ViewMetadata}, and as siblings of the
- * `<template>` element. Thus a
- * directive in a child view cannot inject the directive that created it.
- *
- * Since directives that create views via ViewContainers are common in Angular, and using the full
- * `<template>` element syntax is wordy, Angular
- * also supports a shorthand notation: `<li *foo="bar">` and `<li template="foo: bar">` are
- * equivalent.
- *
- * Thus,
- *
- * ```
- * <ul>
- * <li *foo="bar" title="text"></li>
- * </ul>
- * ```
- *
- * Expands in use to:
- *
- * ```
- * <ul>
- * <template [foo]="bar">
- * <li title="text"></li>
- * </template>
- * </ul>
- * ```
- *
- * Notice that although the shorthand places `*foo="bar"` within the `<li>` element, the binding for
- * the directive
- * controller is correctly instantiated on the `<template>` element rather than the `<li>` element.
- *
- * ## Lifecycle hooks
- *
- * When the directive class implements some {@link angular2/lifecycle_hooks} the callbacks are
- * called by the change detection at defined points in time during the life of the directive.
- *
- * ### Example
- *
- * Let's suppose we want to implement the `unless` behavior, to conditionally include a template.
- *
- * Here is a simple directive that triggers on an `unless` selector:
- *
- * ```
- * @Directive({
- * selector: '[unless]',
- * inputs: ['unless']
- * })
- * export class Unless {
- * viewContainer: ViewContainerRef;
- * templateRef: TemplateRef;
- * prevCondition: boolean;
- *
- * constructor(viewContainer: ViewContainerRef, templateRef: TemplateRef) {
- * this.viewContainer = viewContainer;
- * this.templateRef = templateRef;
- * this.prevCondition = null;
- * }
- *
- * set unless(newCondition) {
- * if (newCondition && (isBlank(this.prevCondition) || !this.prevCondition)) {
- * this.prevCondition = true;
- * this.viewContainer.clear();
- * } else if (!newCondition && (isBlank(this.prevCondition) || this.prevCondition)) {
- * this.prevCondition = false;
- * this.viewContainer.create(this.templateRef);
- * }
- * }
- * }
- * ```
- *
- * We can then use this `unless` selector in a template:
- * ```
- * <ul>
- * <li *unless="expr"></li>
- * </ul>
- * ```
- *
- * Once the directive instantiates the child view, the shorthand notation for the template expands
- * and the result is:
- *
- * ```
- * <ul>
- * <template [unless]="exp">
- * <li></li>
- * </template>
- * <li></li>
- * </ul>
- * ```
- *
- * Note also that although the `<li></li>` template still exists inside the `<template></template>`,
- * the instantiated
- * view occurs on the second `<li></li>` which is a sibling to the `<template>` element.
- */
- exports.Directive = decorators_1.makeDecorator(directives_2.DirectiveMetadata);
- // TODO(alexeagle): remove the duplication of this doc. It is copied from ViewMetadata.
- /**
- * Metadata properties available for configuring Views.
- *
- * Each Angular component requires a single `@Component` and at least one `@View` annotation. The
- * `@View` annotation specifies the HTML template to use, and lists the directives that are active
- * within the template.
- *
- * When a component is instantiated, the template is loaded into the component's shadow root, and
- * the expressions and statements in the template are evaluated against the component.
- *
- * For details on the `@Component` annotation, see {@link ComponentMetadata}.
- *
- * ### Example
- *
- * ```
- * @Component({
- * selector: 'greet',
- * template: 'Hello {{name}}!',
- * directives: [GreetUser, Bold]
- * })
- * class Greet {
- * name: string;
- *
- * constructor() {
- * this.name = 'World';
- * }
- * }
- * ```
- */
- exports.View = decorators_1.makeDecorator(view_2.ViewMetadata, function (fn) { return fn.View = exports.View; });
- /**
- * Specifies that a constant attribute value should be injected.
- *
- * The directive can inject constant string literals of host element attributes.
- *
- * ### Example
- *
- * Suppose we have an `<input>` element and want to know its `type`.
- *
- * ```html
- * <input type="text">
- * ```
- *
- * A decorator can inject string literal `text` like so:
- *
- * {@example core/ts/metadata/metadata.ts region='attributeMetadata'}
- */
- exports.Attribute = decorators_1.makeParamDecorator(di_2.AttributeMetadata);
- // TODO(alexeagle): remove the duplication of this doc. It is copied from QueryMetadata.
- /**
- * Declares an injectable parameter to be a live list of directives or variable
- * bindings from the content children of a directive.
- *
- * ### Example ([live demo](http://plnkr.co/edit/lY9m8HLy7z06vDoUaSN2?p=preview))
- *
- * Assume that `<tabs>` component would like to get a list its children `<pane>`
- * components as shown in this example:
- *
- * ```html
- * <tabs>
- * <pane title="Overview">...</pane>
- * <pane *ngFor="#o of objects" [title]="o.title">{{o.text}}</pane>
- * </tabs>
- * ```
- *
- * The preferred solution is to query for `Pane` directives using this decorator.
- *
- * ```javascript
- * @Component({
- * selector: 'pane',
- * inputs: ['title']
- * })
- * class Pane {
- * title:string;
- * }
- *
- * @Component({
- * selector: 'tabs',
- * template: `
- * <ul>
- * <li *ngFor="#pane of panes">{{pane.title}}</li>
- * </ul>
- * <content></content>
- * `
- * })
- * class Tabs {
- * panes: QueryList<Pane>;
- * constructor(@Query(Pane) panes:QueryList<Pane>) {
- * this.panes = panes;
- * }
- * }
- * ```
- *
- * A query can look for variable bindings by passing in a string with desired binding symbol.
- *
- * ### Example ([live demo](http://plnkr.co/edit/sT2j25cH1dURAyBRCKx1?p=preview))
- * ```html
- * <seeker>
- * <div #findme>...</div>
- * </seeker>
- *
- * @Component({ selector: 'foo' })
- * class seeker {
- * constructor(@Query('findme') elList: QueryList<ElementRef>) {...}
- * }
- * ```
- *
- * In this case the object that is injected depend on the type of the variable
- * binding. It can be an ElementRef, a directive or a component.
- *
- * Passing in a comma separated list of variable bindings will query for all of them.
- *
- * ```html
- * <seeker>
- * <div #findMe>...</div>
- * <div #findMeToo>...</div>
- * </seeker>
- *
- * @Component({
- * selector: 'foo'
- * })
- * class Seeker {
- * constructor(@Query('findMe, findMeToo') elList: QueryList<ElementRef>) {...}
- * }
- * ```
- *
- * Configure whether query looks for direct children or all descendants
- * of the querying element, by using the `descendants` parameter.
- * It is set to `false` by default.
- *
- * ### Example ([live demo](http://plnkr.co/edit/wtGeB977bv7qvA5FTYl9?p=preview))
- * ```html
- * <container #first>
- * <item>a</item>
- * <item>b</item>
- * <container #second>
- * <item>c</item>
- * </container>
- * </container>
- * ```
- *
- * When querying for items, the first container will see only `a` and `b` by default,
- * but with `Query(TextDirective, {descendants: true})` it will see `c` too.
- *
- * The queried directives are kept in a depth-first pre-order with respect to their
- * positions in the DOM.
- *
- * Query does not look deep into any subcomponent views.
- *
- * Query is updated as part of the change-detection cycle. Since change detection
- * happens after construction of a directive, QueryList will always be empty when observed in the
- * constructor.
- *
- * The injected object is an unmodifiable live list.
- * See {@link QueryList} for more details.
- */
- exports.Query = decorators_1.makeParamDecorator(di_2.QueryMetadata);
- // TODO(alexeagle): remove the duplication of this doc. It is copied from ContentChildrenMetadata.
- /**
- * Configures a content query.
- *
- * Content queries are set before the `ngAfterContentInit` callback is called.
- *
- * ### Example
- *
- * ```
- * @Directive({
- * selector: 'someDir'
- * })
- * class SomeDir {
- * @ContentChildren(ChildDirective) contentChildren: QueryList<ChildDirective>;
- *
- * ngAfterContentInit() {
- * // contentChildren is set
- * }
- * }
- * ```
- */
- exports.ContentChildren = decorators_1.makePropDecorator(di_2.ContentChildrenMetadata);
- // TODO(alexeagle): remove the duplication of this doc. It is copied from ContentChildMetadata.
- /**
- * Configures a content query.
- *
- * Content queries are set before the `ngAfterContentInit` callback is called.
- *
- * ### Example
- *
- * ```
- * @Directive({
- * selector: 'someDir'
- * })
- * class SomeDir {
- * @ContentChild(ChildDirective) contentChild;
- *
- * ngAfterContentInit() {
- * // contentChild is set
- * }
- * }
- * ```
- */
- exports.ContentChild = decorators_1.makePropDecorator(di_2.ContentChildMetadata);
- // TODO(alexeagle): remove the duplication of this doc. It is copied from ViewChildrenMetadata.
- /**
- * Configures a view query.
- *
- * View queries are set before the `ngAfterViewInit` callback is called.
- *
- * ### Example
- *
- * ```
- * @Component({
- * selector: 'someDir',
- * templateUrl: 'someTemplate',
- * directives: [ItemDirective]
- * })
- * class SomeDir {
- * @ViewChildren(ItemDirective) viewChildren: QueryList<ItemDirective>;
- *
- * ngAfterViewInit() {
- * // viewChildren is set
- * }
- * }
- * ```
- */
- exports.ViewChildren = decorators_1.makePropDecorator(di_2.ViewChildrenMetadata);
- // TODO(alexeagle): remove the duplication of this doc. It is copied from ViewChildMetadata.
- /**
- * Configures a view query.
- *
- * View queries are set before the `ngAfterViewInit` callback is called.
- *
- * ### Example
- *
- * ```
- * @Component({
- * selector: 'someDir',
- * templateUrl: 'someTemplate',
- * directives: [ItemDirective]
- * })
- * class SomeDir {
- * @ViewChild(ItemDirective) viewChild:ItemDirective;
- *
- * ngAfterViewInit() {
- * // viewChild is set
- * }
- * }
- * ```
- */
- exports.ViewChild = decorators_1.makePropDecorator(di_2.ViewChildMetadata);
- // TODO(alexeagle): remove the duplication of this doc. It is copied from ViewQueryMetadata.
- /**
- * Similar to {@link QueryMetadata}, but querying the component view, instead of
- * the content children.
- *
- * ### Example ([live demo](http://plnkr.co/edit/eNsFHDf7YjyM6IzKxM1j?p=preview))
- *
- * ```javascript
- * @Component({...})
- * @View({
- * template: `
- * <item> a </item>
- * <item> b </item>
- * <item> c </item>
- * `
- * })
- * class MyComponent {
- * shown: boolean;
- *
- * constructor(private @Query(Item) items:QueryList<Item>) {
- * items.onChange(() => console.log(items.length));
- * }
- * }
- * ```
- *
- * Supports the same querying parameters as {@link QueryMetadata}, except
- * `descendants`. This always queries the whole view.
- *
- * As `shown` is flipped between true and false, items will contain zero of one
- * items.
- *
- * Specifies that a {@link QueryList} should be injected.
- *
- * The injected object is an iterable and observable live list.
- * See {@link QueryList} for more details.
- */
- exports.ViewQuery = decorators_1.makeParamDecorator(di_2.ViewQueryMetadata);
- // TODO(alexeagle): remove the duplication of this doc. It is copied from PipeMetadata.
- /**
- * Declare reusable pipe function.
- *
- * ### Example
- *
- * {@example core/ts/metadata/metadata.ts region='pipe'}
- */
- exports.Pipe = decorators_1.makeDecorator(directives_2.PipeMetadata);
- // TODO(alexeagle): remove the duplication of this doc. It is copied from InputMetadata.
- /**
- * Declares a data-bound input property.
- *
- * Angular automatically updates data-bound properties during change detection.
- *
- * `InputMetadata` takes an optional parameter that specifies the name
- * used when instantiating a component in the template. When not provided,
- * the name of the decorated property is used.
- *
- * ### Example
- *
- * The following example creates a component with two input properties.
- *
- * ```typescript
- * @Component({
- * selector: 'bank-account',
- * template: `
- * Bank Name: {{bankName}}
- * Account Id: {{id}}
- * `
- * })
- * class BankAccount {
- * @Input() bankName: string;
- * @Input('account-id') id: string;
- *
- * // this property is not bound, and won't be automatically updated by Angular
- * normalizedBankName: string;
- * }
- *
- * @Component({
- * selector: 'app',
- * template: `
- * <bank-account bank-name="RBC" account-id="4747"></bank-account>
- * `,
- * directives: [BankAccount]
- * })
- * class App {}
- *
- * bootstrap(App);
- * ```
- */
- exports.Input = decorators_1.makePropDecorator(directives_2.InputMetadata);
- // TODO(alexeagle): remove the duplication of this doc. It is copied from OutputMetadata.
- /**
- * Declares an event-bound output property.
- *
- * When an output property emits an event, an event handler attached to that event
- * the template is invoked.
- *
- * `OutputMetadata` takes an optional parameter that specifies the name
- * used when instantiating a component in the template. When not provided,
- * the name of the decorated property is used.
- *
- * ### Example
- *
- * ```typescript
- * @Directive({
- * selector: 'interval-dir',
- * })
- * class IntervalDir {
- * @Output() everySecond = new EventEmitter();
- * @Output('everyFiveSeconds') five5Secs = new EventEmitter();
- *
- * constructor() {
- * setInterval(() => this.everySecond.emit("event"), 1000);
- * setInterval(() => this.five5Secs.emit("event"), 5000);
- * }
- * }
- *
- * @Component({
- * selector: 'app',
- * template: `
- * <interval-dir (every-second)="everySecond()" (every-five-seconds)="everyFiveSeconds()">
- * </interval-dir>
- * `,
- * directives: [IntervalDir]
- * })
- * class App {
- * everySecond() { console.log('second'); }
- * everyFiveSeconds() { console.log('five seconds'); }
- * }
- * bootstrap(App);
- * ```
- */
- exports.Output = decorators_1.makePropDecorator(directives_2.OutputMetadata);
- // TODO(alexeagle): remove the duplication of this doc. It is copied from HostBindingMetadata.
- /**
- * Declares a host property binding.
- *
- * Angular automatically checks host property bindings during change detection.
- * If a binding changes, it will update the host element of the directive.
- *
- * `HostBindingMetadata` takes an optional parameter that specifies the property
- * name of the host element that will be updated. When not provided,
- * the class property name is used.
- *
- * ### Example
- *
- * The following example creates a directive that sets the `valid` and `invalid` classes
- * on the DOM element that has ngModel directive on it.
- *
- * ```typescript
- * @Directive({selector: '[ngModel]'})
- * class NgModelStatus {
- * constructor(public control:NgModel) {}
- * @HostBinding('[class.valid]') get valid { return this.control.valid; }
- * @HostBinding('[class.invalid]') get invalid { return this.control.invalid; }
- * }
- *
- * @Component({
- * selector: 'app',
- * template: `<input [(ngModel)]="prop">`,
- * directives: [FORM_DIRECTIVES, NgModelStatus]
- * })
- * class App {
- * prop;
- * }
- *
- * bootstrap(App);
- * ```
- */
- exports.HostBinding = decorators_1.makePropDecorator(directives_2.HostBindingMetadata);
- // TODO(alexeagle): remove the duplication of this doc. It is copied from HostListenerMetadata.
- /**
- * Declares a host listener.
- *
- * Angular will invoke the decorated method when the host element emits the specified event.
- *
- * If the decorated method returns `false`, then `preventDefault` is applied on the DOM
- * event.
- *
- * ### Example
- *
- * The following example declares a directive that attaches a click listener to the button and
- * counts clicks.
- *
- * ```typescript
- * @Directive({selector: 'button[counting]'})
- * class CountClicks {
- * numberOfClicks = 0;
- *
- * @HostListener('click', ['$event.target'])
- * onClick(btn) {
- * console.log("button", btn, "number of clicks:", this.numberOfClicks++);
- * }
- * }
- *
- * @Component({
- * selector: 'app',
- * template: `<button counting>Increment</button>`,
- * directives: [CountClicks]
- * })
- * class App {}
- *
- * bootstrap(App);
- * ```
- */
- exports.HostListener = decorators_1.makePropDecorator(directives_2.HostListenerMetadata);
- /***/ },
- /* 4 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var lang_1 = __webpack_require__(5);
- var di_1 = __webpack_require__(6);
- var metadata_1 = __webpack_require__(7);
- /**
- * Specifies that a constant attribute value should be injected.
- *
- * The directive can inject constant string literals of host element attributes.
- *
- * ### Example
- *
- * Suppose we have an `<input>` element and want to know its `type`.
- *
- * ```html
- * <input type="text">
- * ```
- *
- * A decorator can inject string literal `text` like so:
- *
- * {@example core/ts/metadata/metadata.ts region='attributeMetadata'}
- */
- var AttributeMetadata = (function (_super) {
- __extends(AttributeMetadata, _super);
- function AttributeMetadata(attributeName) {
- _super.call(this);
- this.attributeName = attributeName;
- }
- Object.defineProperty(AttributeMetadata.prototype, "token", {
- get: function () {
- // Normally one would default a token to a type of an injected value but here
- // the type of a variable is "string" and we can't use primitive type as a return value
- // so we use instance of Attribute instead. This doesn't matter much in practice as arguments
- // with @Attribute annotation are injected by ElementInjector that doesn't take tokens into
- // account.
- return this;
- },
- enumerable: true,
- configurable: true
- });
- AttributeMetadata.prototype.toString = function () { return "@Attribute(" + lang_1.stringify(this.attributeName) + ")"; };
- AttributeMetadata = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [String])
- ], AttributeMetadata);
- return AttributeMetadata;
- })(metadata_1.DependencyMetadata);
- exports.AttributeMetadata = AttributeMetadata;
- /**
- * Declares an injectable parameter to be a live list of directives or variable
- * bindings from the content children of a directive.
- *
- * ### Example ([live demo](http://plnkr.co/edit/lY9m8HLy7z06vDoUaSN2?p=preview))
- *
- * Assume that `<tabs>` component would like to get a list its children `<pane>`
- * components as shown in this example:
- *
- * ```html
- * <tabs>
- * <pane title="Overview">...</pane>
- * <pane *ngFor="#o of objects" [title]="o.title">{{o.text}}</pane>
- * </tabs>
- * ```
- *
- * The preferred solution is to query for `Pane` directives using this decorator.
- *
- * ```javascript
- * @Component({
- * selector: 'pane',
- * inputs: ['title']
- * })
- * class Pane {
- * title:string;
- * }
- *
- * @Component({
- * selector: 'tabs',
- * template: `
- * <ul>
- * <li *ngFor="#pane of panes">{{pane.title}}</li>
- * </ul>
- * <content></content>
- * `
- * })
- * class Tabs {
- * panes: QueryList<Pane>;
- * constructor(@Query(Pane) panes:QueryList<Pane>) {
- * this.panes = panes;
- * }
- * }
- * ```
- *
- * A query can look for variable bindings by passing in a string with desired binding symbol.
- *
- * ### Example ([live demo](http://plnkr.co/edit/sT2j25cH1dURAyBRCKx1?p=preview))
- * ```html
- * <seeker>
- * <div #findme>...</div>
- * </seeker>
- *
- * @Component({ selector: 'seeker' })
- * class Seeker {
- * constructor(@Query('findme') elList: QueryList<ElementRef>) {...}
- * }
- * ```
- *
- * In this case the object that is injected depend on the type of the variable
- * binding. It can be an ElementRef, a directive or a component.
- *
- * Passing in a comma separated list of variable bindings will query for all of them.
- *
- * ```html
- * <seeker>
- * <div #find-me>...</div>
- * <div #find-me-too>...</div>
- * </seeker>
- *
- * @Component({
- * selector: 'seeker'
- * })
- * class Seeker {
- * constructor(@Query('findMe, findMeToo') elList: QueryList<ElementRef>) {...}
- * }
- * ```
- *
- * Configure whether query looks for direct children or all descendants
- * of the querying element, by using the `descendants` parameter.
- * It is set to `false` by default.
- *
- * ### Example ([live demo](http://plnkr.co/edit/wtGeB977bv7qvA5FTYl9?p=preview))
- * ```html
- * <container #first>
- * <item>a</item>
- * <item>b</item>
- * <container #second>
- * <item>c</item>
- * </container>
- * </container>
- * ```
- *
- * When querying for items, the first container will see only `a` and `b` by default,
- * but with `Query(TextDirective, {descendants: true})` it will see `c` too.
- *
- * The queried directives are kept in a depth-first pre-order with respect to their
- * positions in the DOM.
- *
- * Query does not look deep into any subcomponent views.
- *
- * Query is updated as part of the change-detection cycle. Since change detection
- * happens after construction of a directive, QueryList will always be empty when observed in the
- * constructor.
- *
- * The injected object is an unmodifiable live list.
- * See {@link QueryList} for more details.
- */
- var QueryMetadata = (function (_super) {
- __extends(QueryMetadata, _super);
- function QueryMetadata(_selector, _a) {
- var _b = _a === void 0 ? {} : _a, _c = _b.descendants, descendants = _c === void 0 ? false : _c, _d = _b.first, first = _d === void 0 ? false : _d;
- _super.call(this);
- this._selector = _selector;
- this.descendants = descendants;
- this.first = first;
- }
- Object.defineProperty(QueryMetadata.prototype, "isViewQuery", {
- /**
- * always `false` to differentiate it with {@link ViewQueryMetadata}.
- */
- get: function () { return false; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(QueryMetadata.prototype, "selector", {
- /**
- * what this is querying for.
- */
- get: function () { return di_1.resolveForwardRef(this._selector); },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(QueryMetadata.prototype, "isVarBindingQuery", {
- /**
- * whether this is querying for a variable binding or a directive.
- */
- get: function () { return lang_1.isString(this.selector); },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(QueryMetadata.prototype, "varBindings", {
- /**
- * returns a list of variable bindings this is querying for.
- * Only applicable if this is a variable bindings query.
- */
- get: function () { return this.selector.split(','); },
- enumerable: true,
- configurable: true
- });
- QueryMetadata.prototype.toString = function () { return "@Query(" + lang_1.stringify(this.selector) + ")"; };
- QueryMetadata = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [Object, Object])
- ], QueryMetadata);
- return QueryMetadata;
- })(metadata_1.DependencyMetadata);
- exports.QueryMetadata = QueryMetadata;
- // TODO: add an example after ContentChildren and ViewChildren are in master
- /**
- * Configures a content query.
- *
- * Content queries are set before the `ngAfterContentInit` callback is called.
- *
- * ### Example
- *
- * ```
- * @Directive({
- * selector: 'someDir'
- * })
- * class SomeDir {
- * @ContentChildren(ChildDirective) contentChildren: QueryList<ChildDirective>;
- *
- * ngAfterContentInit() {
- * // contentChildren is set
- * }
- * }
- * ```
- */
- var ContentChildrenMetadata = (function (_super) {
- __extends(ContentChildrenMetadata, _super);
- function ContentChildrenMetadata(_selector, _a) {
- var _b = (_a === void 0 ? {} : _a).descendants, descendants = _b === void 0 ? false : _b;
- _super.call(this, _selector, { descendants: descendants });
- }
- ContentChildrenMetadata = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [Object, Object])
- ], ContentChildrenMetadata);
- return ContentChildrenMetadata;
- })(QueryMetadata);
- exports.ContentChildrenMetadata = ContentChildrenMetadata;
- // TODO: add an example after ContentChild and ViewChild are in master
- /**
- * Configures a content query.
- *
- * Content queries are set before the `ngAfterContentInit` callback is called.
- *
- * ### Example
- *
- * ```
- * @Directive({
- * selector: 'someDir'
- * })
- * class SomeDir {
- * @ContentChild(ChildDirective) contentChild;
- *
- * ngAfterContentInit() {
- * // contentChild is set
- * }
- * }
- * ```
- */
- var ContentChildMetadata = (function (_super) {
- __extends(ContentChildMetadata, _super);
- function ContentChildMetadata(_selector) {
- _super.call(this, _selector, { descendants: true, first: true });
- }
- ContentChildMetadata = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [Object])
- ], ContentChildMetadata);
- return ContentChildMetadata;
- })(QueryMetadata);
- exports.ContentChildMetadata = ContentChildMetadata;
- /**
- * Similar to {@link QueryMetadata}, but querying the component view, instead of
- * the content children.
- *
- * ### Example ([live demo](http://plnkr.co/edit/eNsFHDf7YjyM6IzKxM1j?p=preview))
- *
- * ```javascript
- * @Component({...})
- * @View({
- * template: `
- * <item> a </item>
- * <item> b </item>
- * <item> c </item>
- * `
- * })
- * class MyComponent {
- * shown: boolean;
- *
- * constructor(private @Query(Item) items:QueryList<Item>) {
- * items.onChange(() => console.log(items.length));
- * }
- * }
- * ```
- *
- * Supports the same querying parameters as {@link QueryMetadata}, except
- * `descendants`. This always queries the whole view.
- *
- * As `shown` is flipped between true and false, items will contain zero of one
- * items.
- *
- * Specifies that a {@link QueryList} should be injected.
- *
- * The injected object is an iterable and observable live list.
- * See {@link QueryList} for more details.
- */
- var ViewQueryMetadata = (function (_super) {
- __extends(ViewQueryMetadata, _super);
- function ViewQueryMetadata(_selector, _a) {
- var _b = _a === void 0 ? {} : _a, _c = _b.descendants, descendants = _c === void 0 ? false : _c, _d = _b.first, first = _d === void 0 ? false : _d;
- _super.call(this, _selector, { descendants: descendants, first: first });
- }
- Object.defineProperty(ViewQueryMetadata.prototype, "isViewQuery", {
- /**
- * always `true` to differentiate it with {@link QueryMetadata}.
- */
- get: function () { return true; },
- enumerable: true,
- configurable: true
- });
- ViewQueryMetadata.prototype.toString = function () { return "@ViewQuery(" + lang_1.stringify(this.selector) + ")"; };
- ViewQueryMetadata = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [Object, Object])
- ], ViewQueryMetadata);
- return ViewQueryMetadata;
- })(QueryMetadata);
- exports.ViewQueryMetadata = ViewQueryMetadata;
- /**
- * Configures a view query.
- *
- * View queries are set before the `ngAfterViewInit` callback is called.
- *
- * ### Example
- *
- * ```
- * @Component({
- * selector: 'someDir',
- * templateUrl: 'someTemplate',
- * directives: [ItemDirective]
- * })
- * class SomeDir {
- * @ViewChildren(ItemDirective) viewChildren: QueryList<ItemDirective>;
- *
- * ngAfterViewInit() {
- * // viewChildren is set
- * }
- * }
- * ```
- */
- var ViewChildrenMetadata = (function (_super) {
- __extends(ViewChildrenMetadata, _super);
- function ViewChildrenMetadata(_selector) {
- _super.call(this, _selector, { descendants: true });
- }
- ViewChildrenMetadata = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [Object])
- ], ViewChildrenMetadata);
- return ViewChildrenMetadata;
- })(ViewQueryMetadata);
- exports.ViewChildrenMetadata = ViewChildrenMetadata;
- /**
- * Configures a view query.
- *
- * View queries are set before the `ngAfterViewInit` callback is called.
- *
- * ### Example
- *
- * ```
- * @Component({
- * selector: 'someDir',
- * templateUrl: 'someTemplate',
- * directives: [ItemDirective]
- * })
- * class SomeDir {
- * @ViewChild(ItemDirective) viewChild:ItemDirective;
- *
- * ngAfterViewInit() {
- * // viewChild is set
- * }
- * }
- * ```
- */
- var ViewChildMetadata = (function (_super) {
- __extends(ViewChildMetadata, _super);
- function ViewChildMetadata(_selector) {
- _super.call(this, _selector, { descendants: true, first: true });
- }
- ViewChildMetadata = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [Object])
- ], ViewChildMetadata);
- return ViewChildMetadata;
- })(ViewQueryMetadata);
- exports.ViewChildMetadata = ViewChildMetadata;
- /***/ },
- /* 5 */
- /***/ function(module, exports) {
- /* WEBPACK VAR INJECTION */(function(global) {var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var globalScope;
- if (typeof window === 'undefined') {
- if (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope) {
- // TODO: Replace any with WorkerGlobalScope from lib.webworker.d.ts #3492
- globalScope = self;
- }
- else {
- globalScope = global;
- }
- }
- else {
- globalScope = window;
- }
- ;
- exports.IS_DART = false;
- // Need to declare a new variable for global here since TypeScript
- // exports the original value of the symbol.
- var _global = globalScope;
- exports.global = _global;
- exports.Type = Function;
- function getTypeNameForDebugging(type) {
- return type['name'];
- }
- exports.getTypeNameForDebugging = getTypeNameForDebugging;
- exports.Math = _global.Math;
- exports.Date = _global.Date;
- var _devMode = true;
- var _modeLocked = false;
- function lockMode() {
- _modeLocked = true;
- }
- exports.lockMode = lockMode;
- /**
- * Disable Angular's development mode, which turns off assertions and other
- * checks within the framework.
- *
- * One important assertion this disables verifies that a change detection pass
- * does not result in additional changes to any bindings (also known as
- * unidirectional data flow).
- */
- function enableProdMode() {
- if (_modeLocked) {
- // Cannot use BaseException as that ends up importing from facade/lang.
- throw 'Cannot enable prod mode after platform setup.';
- }
- _devMode = false;
- }
- exports.enableProdMode = enableProdMode;
- function assertionsEnabled() {
- return _devMode;
- }
- exports.assertionsEnabled = assertionsEnabled;
- // TODO: remove calls to assert in production environment
- // Note: Can't just export this and import in in other files
- // as `assert` is a reserved keyword in Dart
- _global.assert = function assert(condition) {
- // TODO: to be fixed properly via #2830, noop for now
- };
- // This function is needed only to properly support Dart's const expressions
- // see https://github.com/angular/ts2dart/pull/151 for more info
- function CONST_EXPR(expr) {
- return expr;
- }
- exports.CONST_EXPR = CONST_EXPR;
- function CONST() {
- return function (target) { return target; };
- }
- exports.CONST = CONST;
- function isPresent(obj) {
- return obj !== undefined && obj !== null;
- }
- exports.isPresent = isPresent;
- function isBlank(obj) {
- return obj === undefined || obj === null;
- }
- exports.isBlank = isBlank;
- function isString(obj) {
- return typeof obj === "string";
- }
- exports.isString = isString;
- function isFunction(obj) {
- return typeof obj === "function";
- }
- exports.isFunction = isFunction;
- function isType(obj) {
- return isFunction(obj);
- }
- exports.isType = isType;
- function isStringMap(obj) {
- return typeof obj === 'object' && obj !== null;
- }
- exports.isStringMap = isStringMap;
- function isPromise(obj) {
- return obj instanceof _global.Promise;
- }
- exports.isPromise = isPromise;
- function isArray(obj) {
- return Array.isArray(obj);
- }
- exports.isArray = isArray;
- function isNumber(obj) {
- return typeof obj === 'number';
- }
- exports.isNumber = isNumber;
- function isDate(obj) {
- return obj instanceof exports.Date && !isNaN(obj.valueOf());
- }
- exports.isDate = isDate;
- function noop() { }
- exports.noop = noop;
- function stringify(token) {
- if (typeof token === 'string') {
- return token;
- }
- if (token === undefined || token === null) {
- return '' + token;
- }
- if (token.name) {
- return token.name;
- }
- var res = token.toString();
- var newLineIndex = res.indexOf("\n");
- return (newLineIndex === -1) ? res : res.substring(0, newLineIndex);
- }
- exports.stringify = stringify;
- // serialize / deserialize enum exist only for consistency with dart API
- // enums in typescript don't need to be serialized
- function serializeEnum(val) {
- return val;
- }
- exports.serializeEnum = serializeEnum;
- function deserializeEnum(val, values) {
- return val;
- }
- exports.deserializeEnum = deserializeEnum;
- var StringWrapper = (function () {
- function StringWrapper() {
- }
- StringWrapper.fromCharCode = function (code) { return String.fromCharCode(code); };
- StringWrapper.charCodeAt = function (s, index) { return s.charCodeAt(index); };
- StringWrapper.split = function (s, regExp) { return s.split(regExp); };
- StringWrapper.equals = function (s, s2) { return s === s2; };
- StringWrapper.stripLeft = function (s, charVal) {
- if (s && s.length) {
- var pos = 0;
- for (var i = 0; i < s.length; i++) {
- if (s[i] != charVal)
- break;
- pos++;
- }
- s = s.substring(pos);
- }
- return s;
- };
- StringWrapper.stripRight = function (s, charVal) {
- if (s && s.length) {
- var pos = s.length;
- for (var i = s.length - 1; i >= 0; i--) {
- if (s[i] != charVal)
- break;
- pos--;
- }
- s = s.substring(0, pos);
- }
- return s;
- };
- StringWrapper.replace = function (s, from, replace) {
- return s.replace(from, replace);
- };
- StringWrapper.replaceAll = function (s, from, replace) {
- return s.replace(from, replace);
- };
- StringWrapper.slice = function (s, from, to) {
- if (from === void 0) { from = 0; }
- if (to === void 0) { to = null; }
- return s.slice(from, to === null ? undefined : to);
- };
- StringWrapper.replaceAllMapped = function (s, from, cb) {
- return s.replace(from, function () {
- var matches = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- matches[_i - 0] = arguments[_i];
- }
- // Remove offset & string from the result array
- matches.splice(-2, 2);
- // The callback receives match, p1, ..., pn
- return cb(matches);
- });
- };
- StringWrapper.contains = function (s, substr) { return s.indexOf(substr) != -1; };
- StringWrapper.compare = function (a, b) {
- if (a < b) {
- return -1;
- }
- else if (a > b) {
- return 1;
- }
- else {
- return 0;
- }
- };
- return StringWrapper;
- })();
- exports.StringWrapper = StringWrapper;
- var StringJoiner = (function () {
- function StringJoiner(parts) {
- if (parts === void 0) { parts = []; }
- this.parts = parts;
- }
- StringJoiner.prototype.add = function (part) { this.parts.push(part); };
- StringJoiner.prototype.toString = function () { return this.parts.join(""); };
- return StringJoiner;
- })();
- exports.StringJoiner = StringJoiner;
- var NumberParseError = (function (_super) {
- __extends(NumberParseError, _super);
- function NumberParseError(message) {
- _super.call(this);
- this.message = message;
- }
- NumberParseError.prototype.toString = function () { return this.message; };
- return NumberParseError;
- })(Error);
- exports.NumberParseError = NumberParseError;
- var NumberWrapper = (function () {
- function NumberWrapper() {
- }
- NumberWrapper.toFixed = function (n, fractionDigits) { return n.toFixed(fractionDigits); };
- NumberWrapper.equal = function (a, b) { return a === b; };
- NumberWrapper.parseIntAutoRadix = function (text) {
- var result = parseInt(text);
- if (isNaN(result)) {
- throw new NumberParseError("Invalid integer literal when parsing " + text);
- }
- return result;
- };
- NumberWrapper.parseInt = function (text, radix) {
- if (radix == 10) {
- if (/^(\-|\+)?[0-9]+$/.test(text)) {
- return parseInt(text, radix);
- }
- }
- else if (radix == 16) {
- if (/^(\-|\+)?[0-9ABCDEFabcdef]+$/.test(text)) {
- return parseInt(text, radix);
- }
- }
- else {
- var result = parseInt(text, radix);
- if (!isNaN(result)) {
- return result;
- }
- }
- throw new NumberParseError("Invalid integer literal when parsing " + text + " in base " +
- radix);
- };
- // TODO: NaN is a valid literal but is returned by parseFloat to indicate an error.
- NumberWrapper.parseFloat = function (text) { return parseFloat(text); };
- Object.defineProperty(NumberWrapper, "NaN", {
- get: function () { return NaN; },
- enumerable: true,
- configurable: true
- });
- NumberWrapper.isNaN = function (value) { return isNaN(value); };
- NumberWrapper.isInteger = function (value) { return Number.isInteger(value); };
- return NumberWrapper;
- })();
- exports.NumberWrapper = NumberWrapper;
- exports.RegExp = _global.RegExp;
- var RegExpWrapper = (function () {
- function RegExpWrapper() {
- }
- RegExpWrapper.create = function (regExpStr, flags) {
- if (flags === void 0) { flags = ''; }
- flags = flags.replace(/g/g, '');
- return new _global.RegExp(regExpStr, flags + 'g');
- };
- RegExpWrapper.firstMatch = function (regExp, input) {
- // Reset multimatch regex state
- regExp.lastIndex = 0;
- return regExp.exec(input);
- };
- RegExpWrapper.test = function (regExp, input) {
- regExp.lastIndex = 0;
- return regExp.test(input);
- };
- RegExpWrapper.matcher = function (regExp, input) {
- // Reset regex state for the case
- // someone did not loop over all matches
- // last time.
- regExp.lastIndex = 0;
- return { re: regExp, input: input };
- };
- return RegExpWrapper;
- })();
- exports.RegExpWrapper = RegExpWrapper;
- var RegExpMatcherWrapper = (function () {
- function RegExpMatcherWrapper() {
- }
- RegExpMatcherWrapper.next = function (matcher) {
- return matcher.re.exec(matcher.input);
- };
- return RegExpMatcherWrapper;
- })();
- exports.RegExpMatcherWrapper = RegExpMatcherWrapper;
- var FunctionWrapper = (function () {
- function FunctionWrapper() {
- }
- FunctionWrapper.apply = function (fn, posArgs) { return fn.apply(null, posArgs); };
- return FunctionWrapper;
- })();
- exports.FunctionWrapper = FunctionWrapper;
- // JS has NaN !== NaN
- function looseIdentical(a, b) {
- return a === b || typeof a === "number" && typeof b === "number" && isNaN(a) && isNaN(b);
- }
- exports.looseIdentical = looseIdentical;
- // JS considers NaN is the same as NaN for map Key (while NaN !== NaN otherwise)
- // see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
- function getMapKey(value) {
- return value;
- }
- exports.getMapKey = getMapKey;
- function normalizeBlank(obj) {
- return isBlank(obj) ? null : obj;
- }
- exports.normalizeBlank = normalizeBlank;
- function normalizeBool(obj) {
- return isBlank(obj) ? false : obj;
- }
- exports.normalizeBool = normalizeBool;
- function isJsObject(o) {
- return o !== null && (typeof o === "function" || typeof o === "object");
- }
- exports.isJsObject = isJsObject;
- function print(obj) {
- console.log(obj);
- }
- exports.print = print;
- // Can't be all uppercase as our transpiler would think it is a special directive...
- var Json = (function () {
- function Json() {
- }
- Json.parse = function (s) { return _global.JSON.parse(s); };
- Json.stringify = function (data) {
- // Dart doesn't take 3 arguments
- return _global.JSON.stringify(data, null, 2);
- };
- return Json;
- })();
- exports.Json = Json;
- var DateWrapper = (function () {
- function DateWrapper() {
- }
- DateWrapper.create = function (year, month, day, hour, minutes, seconds, milliseconds) {
- if (month === void 0) { month = 1; }
- if (day === void 0) { day = 1; }
- if (hour === void 0) { hour = 0; }
- if (minutes === void 0) { minutes = 0; }
- if (seconds === void 0) { seconds = 0; }
- if (milliseconds === void 0) { milliseconds = 0; }
- return new exports.Date(year, month - 1, day, hour, minutes, seconds, milliseconds);
- };
- DateWrapper.fromISOString = function (str) { return new exports.Date(str); };
- DateWrapper.fromMillis = function (ms) { return new exports.Date(ms); };
- DateWrapper.toMillis = function (date) { return date.getTime(); };
- DateWrapper.now = function () { return new exports.Date(); };
- DateWrapper.toJson = function (date) { return date.toJSON(); };
- return DateWrapper;
- })();
- exports.DateWrapper = DateWrapper;
- function setValueOnPath(global, path, value) {
- var parts = path.split('.');
- var obj = global;
- while (parts.length > 1) {
- var name = parts.shift();
- if (obj.hasOwnProperty(name) && isPresent(obj[name])) {
- obj = obj[name];
- }
- else {
- obj = obj[name] = {};
- }
- }
- if (obj === undefined || obj === null) {
- obj = {};
- }
- obj[parts.shift()] = value;
- }
- exports.setValueOnPath = setValueOnPath;
- var _symbolIterator = null;
- function getSymbolIterator() {
- if (isBlank(_symbolIterator)) {
- if (isPresent(Symbol) && isPresent(Symbol.iterator)) {
- _symbolIterator = Symbol.iterator;
- }
- else {
- // es6-shim specific logic
- var keys = Object.getOwnPropertyNames(Map.prototype);
- for (var i = 0; i < keys.length; ++i) {
- var key = keys[i];
- if (key !== 'entries' && key !== 'size' &&
- Map.prototype[key] === Map.prototype['entries']) {
- _symbolIterator = key;
- }
- }
- }
- }
- return _symbolIterator;
- }
- exports.getSymbolIterator = getSymbolIterator;
-
- /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))
- /***/ },
- /* 6 */
- /***/ function(module, exports, __webpack_require__) {
- /**
- * @module
- * @description
- * The `di` module provides dependency injection container services.
- */
- function __export(m) {
- for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
- }
- var metadata_1 = __webpack_require__(7);
- exports.InjectMetadata = metadata_1.InjectMetadata;
- exports.OptionalMetadata = metadata_1.OptionalMetadata;
- exports.InjectableMetadata = metadata_1.InjectableMetadata;
- exports.SelfMetadata = metadata_1.SelfMetadata;
- exports.HostMetadata = metadata_1.HostMetadata;
- exports.SkipSelfMetadata = metadata_1.SkipSelfMetadata;
- exports.DependencyMetadata = metadata_1.DependencyMetadata;
- // we have to reexport * because Dart and TS export two different sets of types
- __export(__webpack_require__(8));
- var forward_ref_1 = __webpack_require__(10);
- exports.forwardRef = forward_ref_1.forwardRef;
- exports.resolveForwardRef = forward_ref_1.resolveForwardRef;
- var injector_1 = __webpack_require__(11);
- exports.Injector = injector_1.Injector;
- var provider_1 = __webpack_require__(13);
- exports.Binding = provider_1.Binding;
- exports.ProviderBuilder = provider_1.ProviderBuilder;
- exports.ResolvedFactory = provider_1.ResolvedFactory;
- exports.Dependency = provider_1.Dependency;
- exports.bind = provider_1.bind;
- exports.Provider = provider_1.Provider;
- exports.provide = provider_1.provide;
- var key_1 = __webpack_require__(19);
- exports.Key = key_1.Key;
- exports.TypeLiteral = key_1.TypeLiteral;
- var exceptions_1 = __webpack_require__(21);
- exports.NoProviderError = exceptions_1.NoProviderError;
- exports.AbstractProviderError = exceptions_1.AbstractProviderError;
- exports.CyclicDependencyError = exceptions_1.CyclicDependencyError;
- exports.InstantiationError = exceptions_1.InstantiationError;
- exports.InvalidProviderError = exceptions_1.InvalidProviderError;
- exports.NoAnnotationError = exceptions_1.NoAnnotationError;
- exports.OutOfBoundsError = exceptions_1.OutOfBoundsError;
- var opaque_token_1 = __webpack_require__(22);
- exports.OpaqueToken = opaque_token_1.OpaqueToken;
- /***/ },
- /* 7 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var lang_1 = __webpack_require__(5);
- /**
- * A parameter metadata that specifies a dependency.
- *
- * ### Example ([live demo](http://plnkr.co/edit/6uHYJK?p=preview))
- *
- * ```typescript
- * class Engine {}
- *
- * @Injectable()
- * class Car {
- * engine;
- * constructor(@Inject("MyEngine") engine:Engine) {
- * this.engine = engine;
- * }
- * }
- *
- * var injector = Injector.resolveAndCreate([
- * provide("MyEngine", {useClass: Engine}),
- * Car
- * ]);
- *
- * expect(injector.get(Car).engine instanceof Engine).toBe(true);
- * ```
- *
- * When `@Inject()` is not present, {@link Injector} will use the type annotation of the parameter.
- *
- * ### Example
- *
- * ```typescript
- * class Engine {}
- *
- * @Injectable()
- * class Car {
- * constructor(public engine: Engine) {} //same as constructor(@Inject(Engine) engine:Engine)
- * }
- *
- * var injector = Injector.resolveAndCreate([Engine, Car]);
- * expect(injector.get(Car).engine instanceof Engine).toBe(true);
- * ```
- */
- var InjectMetadata = (function () {
- function InjectMetadata(token) {
- this.token = token;
- }
- InjectMetadata.prototype.toString = function () { return "@Inject(" + lang_1.stringify(this.token) + ")"; };
- InjectMetadata = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [Object])
- ], InjectMetadata);
- return InjectMetadata;
- })();
- exports.InjectMetadata = InjectMetadata;
- /**
- * A parameter metadata that marks a dependency as optional. {@link Injector} provides `null` if
- * the dependency is not found.
- *
- * ### Example ([live demo](http://plnkr.co/edit/AsryOm?p=preview))
- *
- * ```typescript
- * class Engine {}
- *
- * @Injectable()
- * class Car {
- * engine;
- * constructor(@Optional() engine:Engine) {
- * this.engine = engine;
- * }
- * }
- *
- * var injector = Injector.resolveAndCreate([Car]);
- * expect(injector.get(Car).engine).toBeNull();
- * ```
- */
- var OptionalMetadata = (function () {
- function OptionalMetadata() {
- }
- OptionalMetadata.prototype.toString = function () { return "@Optional()"; };
- OptionalMetadata = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [])
- ], OptionalMetadata);
- return OptionalMetadata;
- })();
- exports.OptionalMetadata = OptionalMetadata;
- /**
- * `DependencyMetadata` is used by the framework to extend DI.
- * This is internal to Angular and should not be used directly.
- */
- var DependencyMetadata = (function () {
- function DependencyMetadata() {
- }
- Object.defineProperty(DependencyMetadata.prototype, "token", {
- get: function () { return null; },
- enumerable: true,
- configurable: true
- });
- DependencyMetadata = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [])
- ], DependencyMetadata);
- return DependencyMetadata;
- })();
- exports.DependencyMetadata = DependencyMetadata;
- /**
- * A marker metadata that marks a class as available to {@link Injector} for creation.
- *
- * ### Example ([live demo](http://plnkr.co/edit/Wk4DMQ?p=preview))
- *
- * ```typescript
- * @Injectable()
- * class UsefulService {}
- *
- * @Injectable()
- * class NeedsService {
- * constructor(public service:UsefulService) {}
- * }
- *
- * var injector = Injector.resolveAndCreate([NeedsService, UsefulService]);
- * expect(injector.get(NeedsService).service instanceof UsefulService).toBe(true);
- * ```
- * {@link Injector} will throw {@link NoAnnotationError} when trying to instantiate a class that
- * does not have `@Injectable` marker, as shown in the example below.
- *
- * ```typescript
- * class UsefulService {}
- *
- * class NeedsService {
- * constructor(public service:UsefulService) {}
- * }
- *
- * var injector = Injector.resolveAndCreate([NeedsService, UsefulService]);
- * expect(() => injector.get(NeedsService)).toThrowError();
- * ```
- */
- var InjectableMetadata = (function () {
- function InjectableMetadata() {
- }
- InjectableMetadata = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [])
- ], InjectableMetadata);
- return InjectableMetadata;
- })();
- exports.InjectableMetadata = InjectableMetadata;
- /**
- * Specifies that an {@link Injector} should retrieve a dependency only from itself.
- *
- * ### Example ([live demo](http://plnkr.co/edit/NeagAg?p=preview))
- *
- * ```typescript
- * class Dependency {
- * }
- *
- * @Injectable()
- * class NeedsDependency {
- * dependency;
- * constructor(@Self() dependency:Dependency) {
- * this.dependency = dependency;
- * }
- * }
- *
- * var inj = Injector.resolveAndCreate([Dependency, NeedsDependency]);
- * var nd = inj.get(NeedsDependency);
- *
- * expect(nd.dependency instanceof Dependency).toBe(true);
- *
- * var inj = Injector.resolveAndCreate([Dependency]);
- * var child = inj.resolveAndCreateChild([NeedsDependency]);
- * expect(() => child.get(NeedsDependency)).toThrowError();
- * ```
- */
- var SelfMetadata = (function () {
- function SelfMetadata() {
- }
- SelfMetadata.prototype.toString = function () { return "@Self()"; };
- SelfMetadata = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [])
- ], SelfMetadata);
- return SelfMetadata;
- })();
- exports.SelfMetadata = SelfMetadata;
- /**
- * Specifies that the dependency resolution should start from the parent injector.
- *
- * ### Example ([live demo](http://plnkr.co/edit/Wchdzb?p=preview))
- *
- * ```typescript
- * class Dependency {
- * }
- *
- * @Injectable()
- * class NeedsDependency {
- * dependency;
- * constructor(@SkipSelf() dependency:Dependency) {
- * this.dependency = dependency;
- * }
- * }
- *
- * var parent = Injector.resolveAndCreate([Dependency]);
- * var child = parent.resolveAndCreateChild([NeedsDependency]);
- * expect(child.get(NeedsDependency).dependency instanceof Depedency).toBe(true);
- *
- * var inj = Injector.resolveAndCreate([Dependency, NeedsDependency]);
- * expect(() => inj.get(NeedsDependency)).toThrowError();
- * ```
- */
- var SkipSelfMetadata = (function () {
- function SkipSelfMetadata() {
- }
- SkipSelfMetadata.prototype.toString = function () { return "@SkipSelf()"; };
- SkipSelfMetadata = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [])
- ], SkipSelfMetadata);
- return SkipSelfMetadata;
- })();
- exports.SkipSelfMetadata = SkipSelfMetadata;
- /**
- * Specifies that an injector should retrieve a dependency from any injector until reaching the
- * closest host.
- *
- * In Angular, a component element is automatically declared as a host for all the injectors in
- * its view.
- *
- * ### Example ([live demo](http://plnkr.co/edit/GX79pV?p=preview))
- *
- * In the following example `App` contains `ParentCmp`, which contains `ChildDirective`.
- * So `ParentCmp` is the host of `ChildDirective`.
- *
- * `ChildDirective` depends on two services: `HostService` and `OtherService`.
- * `HostService` is defined at `ParentCmp`, and `OtherService` is defined at `App`.
- *
- *```typescript
- * class OtherService {}
- * class HostService {}
- *
- * @Directive({
- * selector: 'child-directive'
- * })
- * class ChildDirective {
- * constructor(@Optional() @Host() os:OtherService, @Optional() @Host() hs:HostService){
- * console.log("os is null", os);
- * console.log("hs is NOT null", hs);
- * }
- * }
- *
- * @Component({
- * selector: 'parent-cmp',
- * providers: [HostService],
- * template: `
- * Dir: <child-directive></child-directive>
- * `,
- * directives: [ChildDirective]
- * })
- * class ParentCmp {
- * }
- *
- * @Component({
- * selector: 'app',
- * providers: [OtherService],
- * template: `
- * Parent: <parent-cmp></parent-cmp>
- * `,
- * directives: [ParentCmp]
- * })
- * class App {
- * }
- *
- * bootstrap(App);
- *```
- */
- var HostMetadata = (function () {
- function HostMetadata() {
- }
- HostMetadata.prototype.toString = function () { return "@Host()"; };
- HostMetadata = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [])
- ], HostMetadata);
- return HostMetadata;
- })();
- exports.HostMetadata = HostMetadata;
- /***/ },
- /* 8 */
- /***/ function(module, exports, __webpack_require__) {
- var metadata_1 = __webpack_require__(7);
- var decorators_1 = __webpack_require__(9);
- /**
- * Factory for creating {@link InjectMetadata}.
- */
- exports.Inject = decorators_1.makeParamDecorator(metadata_1.InjectMetadata);
- /**
- * Factory for creating {@link OptionalMetadata}.
- */
- exports.Optional = decorators_1.makeParamDecorator(metadata_1.OptionalMetadata);
- /**
- * Factory for creating {@link InjectableMetadata}.
- */
- exports.Injectable = decorators_1.makeDecorator(metadata_1.InjectableMetadata);
- /**
- * Factory for creating {@link SelfMetadata}.
- */
- exports.Self = decorators_1.makeParamDecorator(metadata_1.SelfMetadata);
- /**
- * Factory for creating {@link HostMetadata}.
- */
- exports.Host = decorators_1.makeParamDecorator(metadata_1.HostMetadata);
- /**
- * Factory for creating {@link SkipSelfMetadata}.
- */
- exports.SkipSelf = decorators_1.makeParamDecorator(metadata_1.SkipSelfMetadata);
- /***/ },
- /* 9 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- function extractAnnotation(annotation) {
- if (lang_1.isFunction(annotation) && annotation.hasOwnProperty('annotation')) {
- // it is a decorator, extract annotation
- annotation = annotation.annotation;
- }
- return annotation;
- }
- function applyParams(fnOrArray, key) {
- if (fnOrArray === Object || fnOrArray === String || fnOrArray === Function ||
- fnOrArray === Number || fnOrArray === Array) {
- throw new Error("Can not use native " + lang_1.stringify(fnOrArray) + " as constructor");
- }
- if (lang_1.isFunction(fnOrArray)) {
- return fnOrArray;
- }
- else if (fnOrArray instanceof Array) {
- var annotations = fnOrArray;
- var fn = fnOrArray[fnOrArray.length - 1];
- if (!lang_1.isFunction(fn)) {
- throw new Error("Last position of Class method array must be Function in key " + key + " was '" + lang_1.stringify(fn) + "'");
- }
- var annoLength = annotations.length - 1;
- if (annoLength != fn.length) {
- throw new Error("Number of annotations (" + annoLength + ") does not match number of arguments (" + fn.length + ") in the function: " + lang_1.stringify(fn));
- }
- var paramsAnnotations = [];
- for (var i = 0, ii = annotations.length - 1; i < ii; i++) {
- var paramAnnotations = [];
- paramsAnnotations.push(paramAnnotations);
- var annotation = annotations[i];
- if (annotation instanceof Array) {
- for (var j = 0; j < annotation.length; j++) {
- paramAnnotations.push(extractAnnotation(annotation[j]));
- }
- }
- else if (lang_1.isFunction(annotation)) {
- paramAnnotations.push(extractAnnotation(annotation));
- }
- else {
- paramAnnotations.push(annotation);
- }
- }
- Reflect.defineMetadata('parameters', paramsAnnotations, fn);
- return fn;
- }
- else {
- throw new Error("Only Function or Array is supported in Class definition for key '" + key + "' is '" + lang_1.stringify(fnOrArray) + "'");
- }
- }
- /**
- * Provides a way for expressing ES6 classes with parameter annotations in ES5.
- *
- * ## Basic Example
- *
- * ```
- * var Greeter = ng.Class({
- * constructor: function(name) {
- * this.name = name;
- * },
- *
- * greet: function() {
- * alert('Hello ' + this.name + '!');
- * }
- * });
- * ```
- *
- * is equivalent to ES6:
- *
- * ```
- * class Greeter {
- * constructor(name) {
- * this.name = name;
- * }
- *
- * greet() {
- * alert('Hello ' + this.name + '!');
- * }
- * }
- * ```
- *
- * or equivalent to ES5:
- *
- * ```
- * var Greeter = function (name) {
- * this.name = name;
- * }
- *
- * Greeter.prototype.greet = function () {
- * alert('Hello ' + this.name + '!');
- * }
- * ```
- *
- * ### Example with parameter annotations
- *
- * ```
- * var MyService = ng.Class({
- * constructor: [String, [new Query(), QueryList], function(name, queryList) {
- * ...
- * }]
- * });
- * ```
- *
- * is equivalent to ES6:
- *
- * ```
- * class MyService {
- * constructor(name: string, @Query() queryList: QueryList) {
- * ...
- * }
- * }
- * ```
- *
- * ### Example with inheritance
- *
- * ```
- * var Shape = ng.Class({
- * constructor: (color) {
- * this.color = color;
- * }
- * });
- *
- * var Square = ng.Class({
- * extends: Shape,
- * constructor: function(color, size) {
- * Shape.call(this, color);
- * this.size = size;
- * }
- * });
- * ```
- */
- function Class(clsDef) {
- var constructor = applyParams(clsDef.hasOwnProperty('constructor') ? clsDef.constructor : undefined, 'constructor');
- var proto = constructor.prototype;
- if (clsDef.hasOwnProperty('extends')) {
- if (lang_1.isFunction(clsDef.extends)) {
- constructor.prototype = proto =
- Object.create(clsDef.extends.prototype);
- }
- else {
- throw new Error("Class definition 'extends' property must be a constructor function was: " + lang_1.stringify(clsDef.extends));
- }
- }
- for (var key in clsDef) {
- if (key != 'extends' && key != 'prototype' && clsDef.hasOwnProperty(key)) {
- proto[key] = applyParams(clsDef[key], key);
- }
- }
- if (this && this.annotations instanceof Array) {
- Reflect.defineMetadata('annotations', this.annotations, constructor);
- }
- return constructor;
- }
- exports.Class = Class;
- var Reflect = lang_1.global.Reflect;
- if (!(Reflect && Reflect.getMetadata)) {
- throw 'reflect-metadata shim is required when using class decorators';
- }
- function makeDecorator(annotationCls, chainFn) {
- if (chainFn === void 0) { chainFn = null; }
- function DecoratorFactory(objOrType) {
- var annotationInstance = new annotationCls(objOrType);
- if (this instanceof annotationCls) {
- return annotationInstance;
- }
- else {
- var chainAnnotation = lang_1.isFunction(this) && this.annotations instanceof Array ? this.annotations : [];
- chainAnnotation.push(annotationInstance);
- var TypeDecorator = function TypeDecorator(cls) {
- var annotations = Reflect.getOwnMetadata('annotations', cls);
- annotations = annotations || [];
- annotations.push(annotationInstance);
- Reflect.defineMetadata('annotations', annotations, cls);
- return cls;
- };
- TypeDecorator.annotations = chainAnnotation;
- TypeDecorator.Class = Class;
- if (chainFn)
- chainFn(TypeDecorator);
- return TypeDecorator;
- }
- }
- DecoratorFactory.prototype = Object.create(annotationCls.prototype);
- return DecoratorFactory;
- }
- exports.makeDecorator = makeDecorator;
- function makeParamDecorator(annotationCls) {
- function ParamDecoratorFactory() {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i - 0] = arguments[_i];
- }
- var annotationInstance = Object.create(annotationCls.prototype);
- annotationCls.apply(annotationInstance, args);
- if (this instanceof annotationCls) {
- return annotationInstance;
- }
- else {
- ParamDecorator.annotation = annotationInstance;
- return ParamDecorator;
- }
- function ParamDecorator(cls, unusedKey, index) {
- var parameters = Reflect.getMetadata('parameters', cls);
- parameters = parameters || [];
- // there might be gaps if some in between parameters do not have annotations.
- // we pad with nulls.
- while (parameters.length <= index) {
- parameters.push(null);
- }
- parameters[index] = parameters[index] || [];
- var annotationsForParam = parameters[index];
- annotationsForParam.push(annotationInstance);
- Reflect.defineMetadata('parameters', parameters, cls);
- return cls;
- }
- }
- ParamDecoratorFactory.prototype = Object.create(annotationCls.prototype);
- return ParamDecoratorFactory;
- }
- exports.makeParamDecorator = makeParamDecorator;
- function makePropDecorator(decoratorCls) {
- function PropDecoratorFactory() {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i - 0] = arguments[_i];
- }
- var decoratorInstance = Object.create(decoratorCls.prototype);
- decoratorCls.apply(decoratorInstance, args);
- if (this instanceof decoratorCls) {
- return decoratorInstance;
- }
- else {
- return function PropDecorator(target, name) {
- var meta = Reflect.getOwnMetadata('propMetadata', target.constructor);
- meta = meta || {};
- meta[name] = meta[name] || [];
- meta[name].unshift(decoratorInstance);
- Reflect.defineMetadata('propMetadata', meta, target.constructor);
- };
- }
- }
- PropDecoratorFactory.prototype = Object.create(decoratorCls.prototype);
- return PropDecoratorFactory;
- }
- exports.makePropDecorator = makePropDecorator;
- /***/ },
- /* 10 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- /**
- * Allows to refer to references which are not yet defined.
- *
- * For instance, `forwardRef` is used when the `token` which we need to refer to for the purposes of
- * DI is declared,
- * but not yet defined. It is also used when the `token` which we use when creating a query is not
- * yet defined.
- *
- * ### Example
- * {@example core/di/ts/forward_ref/forward_ref.ts region='forward_ref'}
- */
- function forwardRef(forwardRefFn) {
- forwardRefFn.__forward_ref__ = forwardRef;
- forwardRefFn.toString = function () { return lang_1.stringify(this()); };
- return forwardRefFn;
- }
- exports.forwardRef = forwardRef;
- /**
- * Lazily retrieves the reference value from a forwardRef.
- *
- * Acts as the identity function when given a non-forward-ref value.
- *
- * ### Example ([live demo](http://plnkr.co/edit/GU72mJrk1fiodChcmiDR?p=preview))
- *
- * ```typescript
- * var ref = forwardRef(() => "refValue");
- * expect(resolveForwardRef(ref)).toEqual("refValue");
- * expect(resolveForwardRef("regularValue")).toEqual("regularValue");
- * ```
- *
- * See: {@link forwardRef}
- */
- function resolveForwardRef(type) {
- if (lang_1.isFunction(type) && type.hasOwnProperty('__forward_ref__') &&
- type.__forward_ref__ === forwardRef) {
- return type();
- }
- else {
- return type;
- }
- }
- exports.resolveForwardRef = resolveForwardRef;
- /***/ },
- /* 11 */
- /***/ function(module, exports, __webpack_require__) {
- var collection_1 = __webpack_require__(12);
- var provider_1 = __webpack_require__(13);
- var exceptions_1 = __webpack_require__(21);
- var lang_1 = __webpack_require__(5);
- var key_1 = __webpack_require__(19);
- var metadata_1 = __webpack_require__(7);
- // Threshold for the dynamic version
- var _MAX_CONSTRUCTION_COUNTER = 10;
- exports.UNDEFINED = lang_1.CONST_EXPR(new Object());
- /**
- * Visibility of a {@link Provider}.
- */
- (function (Visibility) {
- /**
- * A `Public` {@link Provider} is only visible to regular (as opposed to host) child injectors.
- */
- Visibility[Visibility["Public"] = 0] = "Public";
- /**
- * A `Private` {@link Provider} is only visible to host (as opposed to regular) child injectors.
- */
- Visibility[Visibility["Private"] = 1] = "Private";
- /**
- * A `PublicAndPrivate` {@link Provider} is visible to both host and regular child injectors.
- */
- Visibility[Visibility["PublicAndPrivate"] = 2] = "PublicAndPrivate";
- })(exports.Visibility || (exports.Visibility = {}));
- var Visibility = exports.Visibility;
- function canSee(src, dst) {
- return (src === dst) ||
- (dst === Visibility.PublicAndPrivate || src === Visibility.PublicAndPrivate);
- }
- var ProtoInjectorInlineStrategy = (function () {
- function ProtoInjectorInlineStrategy(protoEI, bwv) {
- this.provider0 = null;
- this.provider1 = null;
- this.provider2 = null;
- this.provider3 = null;
- this.provider4 = null;
- this.provider5 = null;
- this.provider6 = null;
- this.provider7 = null;
- this.provider8 = null;
- this.provider9 = null;
- this.keyId0 = null;
- this.keyId1 = null;
- this.keyId2 = null;
- this.keyId3 = null;
- this.keyId4 = null;
- this.keyId5 = null;
- this.keyId6 = null;
- this.keyId7 = null;
- this.keyId8 = null;
- this.keyId9 = null;
- this.visibility0 = null;
- this.visibility1 = null;
- this.visibility2 = null;
- this.visibility3 = null;
- this.visibility4 = null;
- this.visibility5 = null;
- this.visibility6 = null;
- this.visibility7 = null;
- this.visibility8 = null;
- this.visibility9 = null;
- var length = bwv.length;
- if (length > 0) {
- this.provider0 = bwv[0].provider;
- this.keyId0 = bwv[0].getKeyId();
- this.visibility0 = bwv[0].visibility;
- }
- if (length > 1) {
- this.provider1 = bwv[1].provider;
- this.keyId1 = bwv[1].getKeyId();
- this.visibility1 = bwv[1].visibility;
- }
- if (length > 2) {
- this.provider2 = bwv[2].provider;
- this.keyId2 = bwv[2].getKeyId();
- this.visibility2 = bwv[2].visibility;
- }
- if (length > 3) {
- this.provider3 = bwv[3].provider;
- this.keyId3 = bwv[3].getKeyId();
- this.visibility3 = bwv[3].visibility;
- }
- if (length > 4) {
- this.provider4 = bwv[4].provider;
- this.keyId4 = bwv[4].getKeyId();
- this.visibility4 = bwv[4].visibility;
- }
- if (length > 5) {
- this.provider5 = bwv[5].provider;
- this.keyId5 = bwv[5].getKeyId();
- this.visibility5 = bwv[5].visibility;
- }
- if (length > 6) {
- this.provider6 = bwv[6].provider;
- this.keyId6 = bwv[6].getKeyId();
- this.visibility6 = bwv[6].visibility;
- }
- if (length > 7) {
- this.provider7 = bwv[7].provider;
- this.keyId7 = bwv[7].getKeyId();
- this.visibility7 = bwv[7].visibility;
- }
- if (length > 8) {
- this.provider8 = bwv[8].provider;
- this.keyId8 = bwv[8].getKeyId();
- this.visibility8 = bwv[8].visibility;
- }
- if (length > 9) {
- this.provider9 = bwv[9].provider;
- this.keyId9 = bwv[9].getKeyId();
- this.visibility9 = bwv[9].visibility;
- }
- }
- ProtoInjectorInlineStrategy.prototype.getProviderAtIndex = function (index) {
- if (index == 0)
- return this.provider0;
- if (index == 1)
- return this.provider1;
- if (index == 2)
- return this.provider2;
- if (index == 3)
- return this.provider3;
- if (index == 4)
- return this.provider4;
- if (index == 5)
- return this.provider5;
- if (index == 6)
- return this.provider6;
- if (index == 7)
- return this.provider7;
- if (index == 8)
- return this.provider8;
- if (index == 9)
- return this.provider9;
- throw new exceptions_1.OutOfBoundsError(index);
- };
- ProtoInjectorInlineStrategy.prototype.createInjectorStrategy = function (injector) {
- return new InjectorInlineStrategy(injector, this);
- };
- return ProtoInjectorInlineStrategy;
- })();
- exports.ProtoInjectorInlineStrategy = ProtoInjectorInlineStrategy;
- var ProtoInjectorDynamicStrategy = (function () {
- function ProtoInjectorDynamicStrategy(protoInj, bwv) {
- var len = bwv.length;
- this.providers = collection_1.ListWrapper.createFixedSize(len);
- this.keyIds = collection_1.ListWrapper.createFixedSize(len);
- this.visibilities = collection_1.ListWrapper.createFixedSize(len);
- for (var i = 0; i < len; i++) {
- this.providers[i] = bwv[i].provider;
- this.keyIds[i] = bwv[i].getKeyId();
- this.visibilities[i] = bwv[i].visibility;
- }
- }
- ProtoInjectorDynamicStrategy.prototype.getProviderAtIndex = function (index) {
- if (index < 0 || index >= this.providers.length) {
- throw new exceptions_1.OutOfBoundsError(index);
- }
- return this.providers[index];
- };
- ProtoInjectorDynamicStrategy.prototype.createInjectorStrategy = function (ei) {
- return new InjectorDynamicStrategy(this, ei);
- };
- return ProtoInjectorDynamicStrategy;
- })();
- exports.ProtoInjectorDynamicStrategy = ProtoInjectorDynamicStrategy;
- var ProtoInjector = (function () {
- function ProtoInjector(bwv) {
- this.numberOfProviders = bwv.length;
- this._strategy = bwv.length > _MAX_CONSTRUCTION_COUNTER ?
- new ProtoInjectorDynamicStrategy(this, bwv) :
- new ProtoInjectorInlineStrategy(this, bwv);
- }
- ProtoInjector.prototype.getProviderAtIndex = function (index) { return this._strategy.getProviderAtIndex(index); };
- return ProtoInjector;
- })();
- exports.ProtoInjector = ProtoInjector;
- var InjectorInlineStrategy = (function () {
- function InjectorInlineStrategy(injector, protoStrategy) {
- this.injector = injector;
- this.protoStrategy = protoStrategy;
- this.obj0 = exports.UNDEFINED;
- this.obj1 = exports.UNDEFINED;
- this.obj2 = exports.UNDEFINED;
- this.obj3 = exports.UNDEFINED;
- this.obj4 = exports.UNDEFINED;
- this.obj5 = exports.UNDEFINED;
- this.obj6 = exports.UNDEFINED;
- this.obj7 = exports.UNDEFINED;
- this.obj8 = exports.UNDEFINED;
- this.obj9 = exports.UNDEFINED;
- }
- InjectorInlineStrategy.prototype.resetConstructionCounter = function () { this.injector._constructionCounter = 0; };
- InjectorInlineStrategy.prototype.instantiateProvider = function (provider, visibility) {
- return this.injector._new(provider, visibility);
- };
- InjectorInlineStrategy.prototype.attach = function (parent, isHost) {
- var inj = this.injector;
- inj._parent = parent;
- inj._isHost = isHost;
- };
- InjectorInlineStrategy.prototype.getObjByKeyId = function (keyId, visibility) {
- var p = this.protoStrategy;
- var inj = this.injector;
- if (p.keyId0 === keyId && canSee(p.visibility0, visibility)) {
- if (this.obj0 === exports.UNDEFINED) {
- this.obj0 = inj._new(p.provider0, p.visibility0);
- }
- return this.obj0;
- }
- if (p.keyId1 === keyId && canSee(p.visibility1, visibility)) {
- if (this.obj1 === exports.UNDEFINED) {
- this.obj1 = inj._new(p.provider1, p.visibility1);
- }
- return this.obj1;
- }
- if (p.keyId2 === keyId && canSee(p.visibility2, visibility)) {
- if (this.obj2 === exports.UNDEFINED) {
- this.obj2 = inj._new(p.provider2, p.visibility2);
- }
- return this.obj2;
- }
- if (p.keyId3 === keyId && canSee(p.visibility3, visibility)) {
- if (this.obj3 === exports.UNDEFINED) {
- this.obj3 = inj._new(p.provider3, p.visibility3);
- }
- return this.obj3;
- }
- if (p.keyId4 === keyId && canSee(p.visibility4, visibility)) {
- if (this.obj4 === exports.UNDEFINED) {
- this.obj4 = inj._new(p.provider4, p.visibility4);
- }
- return this.obj4;
- }
- if (p.keyId5 === keyId && canSee(p.visibility5, visibility)) {
- if (this.obj5 === exports.UNDEFINED) {
- this.obj5 = inj._new(p.provider5, p.visibility5);
- }
- return this.obj5;
- }
- if (p.keyId6 === keyId && canSee(p.visibility6, visibility)) {
- if (this.obj6 === exports.UNDEFINED) {
- this.obj6 = inj._new(p.provider6, p.visibility6);
- }
- return this.obj6;
- }
- if (p.keyId7 === keyId && canSee(p.visibility7, visibility)) {
- if (this.obj7 === exports.UNDEFINED) {
- this.obj7 = inj._new(p.provider7, p.visibility7);
- }
- return this.obj7;
- }
- if (p.keyId8 === keyId && canSee(p.visibility8, visibility)) {
- if (this.obj8 === exports.UNDEFINED) {
- this.obj8 = inj._new(p.provider8, p.visibility8);
- }
- return this.obj8;
- }
- if (p.keyId9 === keyId && canSee(p.visibility9, visibility)) {
- if (this.obj9 === exports.UNDEFINED) {
- this.obj9 = inj._new(p.provider9, p.visibility9);
- }
- return this.obj9;
- }
- return exports.UNDEFINED;
- };
- InjectorInlineStrategy.prototype.getObjAtIndex = function (index) {
- if (index == 0)
- return this.obj0;
- if (index == 1)
- return this.obj1;
- if (index == 2)
- return this.obj2;
- if (index == 3)
- return this.obj3;
- if (index == 4)
- return this.obj4;
- if (index == 5)
- return this.obj5;
- if (index == 6)
- return this.obj6;
- if (index == 7)
- return this.obj7;
- if (index == 8)
- return this.obj8;
- if (index == 9)
- return this.obj9;
- throw new exceptions_1.OutOfBoundsError(index);
- };
- InjectorInlineStrategy.prototype.getMaxNumberOfObjects = function () { return _MAX_CONSTRUCTION_COUNTER; };
- return InjectorInlineStrategy;
- })();
- exports.InjectorInlineStrategy = InjectorInlineStrategy;
- var InjectorDynamicStrategy = (function () {
- function InjectorDynamicStrategy(protoStrategy, injector) {
- this.protoStrategy = protoStrategy;
- this.injector = injector;
- this.objs = collection_1.ListWrapper.createFixedSize(protoStrategy.providers.length);
- collection_1.ListWrapper.fill(this.objs, exports.UNDEFINED);
- }
- InjectorDynamicStrategy.prototype.resetConstructionCounter = function () { this.injector._constructionCounter = 0; };
- InjectorDynamicStrategy.prototype.instantiateProvider = function (provider, visibility) {
- return this.injector._new(provider, visibility);
- };
- InjectorDynamicStrategy.prototype.attach = function (parent, isHost) {
- var inj = this.injector;
- inj._parent = parent;
- inj._isHost = isHost;
- };
- InjectorDynamicStrategy.prototype.getObjByKeyId = function (keyId, visibility) {
- var p = this.protoStrategy;
- for (var i = 0; i < p.keyIds.length; i++) {
- if (p.keyIds[i] === keyId && canSee(p.visibilities[i], visibility)) {
- if (this.objs[i] === exports.UNDEFINED) {
- this.objs[i] = this.injector._new(p.providers[i], p.visibilities[i]);
- }
- return this.objs[i];
- }
- }
- return exports.UNDEFINED;
- };
- InjectorDynamicStrategy.prototype.getObjAtIndex = function (index) {
- if (index < 0 || index >= this.objs.length) {
- throw new exceptions_1.OutOfBoundsError(index);
- }
- return this.objs[index];
- };
- InjectorDynamicStrategy.prototype.getMaxNumberOfObjects = function () { return this.objs.length; };
- return InjectorDynamicStrategy;
- })();
- exports.InjectorDynamicStrategy = InjectorDynamicStrategy;
- var ProviderWithVisibility = (function () {
- function ProviderWithVisibility(provider, visibility) {
- this.provider = provider;
- this.visibility = visibility;
- }
- ;
- ProviderWithVisibility.prototype.getKeyId = function () { return this.provider.key.id; };
- return ProviderWithVisibility;
- })();
- exports.ProviderWithVisibility = ProviderWithVisibility;
- /**
- * A dependency injection container used for instantiating objects and resolving dependencies.
- *
- * An `Injector` is a replacement for a `new` operator, which can automatically resolve the
- * constructor dependencies.
- *
- * In typical use, application code asks for the dependencies in the constructor and they are
- * resolved by the `Injector`.
- *
- * ### Example ([live demo](http://plnkr.co/edit/jzjec0?p=preview))
- *
- * The following example creates an `Injector` configured to create `Engine` and `Car`.
- *
- * ```typescript
- * @Injectable()
- * class Engine {
- * }
- *
- * @Injectable()
- * class Car {
- * constructor(public engine:Engine) {}
- * }
- *
- * var injector = Injector.resolveAndCreate([Car, Engine]);
- * var car = injector.get(Car);
- * expect(car instanceof Car).toBe(true);
- * expect(car.engine instanceof Engine).toBe(true);
- * ```
- *
- * Notice, we don't use the `new` operator because we explicitly want to have the `Injector`
- * resolve all of the object's dependencies automatically.
- */
- var Injector = (function () {
- /**
- * Private
- */
- function Injector(_proto /* ProtoInjector */, _parent, _depProvider, _debugContext) {
- if (_parent === void 0) { _parent = null; }
- if (_depProvider === void 0) { _depProvider = null; }
- if (_debugContext === void 0) { _debugContext = null; }
- this._depProvider = _depProvider;
- this._debugContext = _debugContext;
- /** @internal */
- this._isHost = false;
- /** @internal */
- this._constructionCounter = 0;
- this._proto = _proto;
- this._parent = _parent;
- this._strategy = _proto._strategy.createInjectorStrategy(this);
- }
- /**
- * Turns an array of provider definitions into an array of resolved providers.
- *
- * A resolution is a process of flattening multiple nested arrays and converting individual
- * providers into an array of {@link ResolvedProvider}s.
- *
- * ### Example ([live demo](http://plnkr.co/edit/AiXTHi?p=preview))
- *
- * ```typescript
- * @Injectable()
- * class Engine {
- * }
- *
- * @Injectable()
- * class Car {
- * constructor(public engine:Engine) {}
- * }
- *
- * var providers = Injector.resolve([Car, [[Engine]]]);
- *
- * expect(providers.length).toEqual(2);
- *
- * expect(providers[0] instanceof ResolvedProvider).toBe(true);
- * expect(providers[0].key.displayName).toBe("Car");
- * expect(providers[0].dependencies.length).toEqual(1);
- * expect(providers[0].factory).toBeDefined();
- *
- * expect(providers[1].key.displayName).toBe("Engine");
- * });
- * ```
- *
- * See {@link Injector#fromResolvedProviders} for more info.
- */
- Injector.resolve = function (providers) {
- return provider_1.resolveProviders(providers);
- };
- /**
- * Resolves an array of providers and creates an injector from those providers.
- *
- * The passed-in providers can be an array of `Type`, {@link Provider},
- * or a recursive array of more providers.
- *
- * ### Example ([live demo](http://plnkr.co/edit/ePOccA?p=preview))
- *
- * ```typescript
- * @Injectable()
- * class Engine {
- * }
- *
- * @Injectable()
- * class Car {
- * constructor(public engine:Engine) {}
- * }
- *
- * var injector = Injector.resolveAndCreate([Car, Engine]);
- * expect(injector.get(Car) instanceof Car).toBe(true);
- * ```
- *
- * This function is slower than the corresponding `fromResolvedProviders`
- * because it needs to resolve the passed-in providers first.
- * See {@link Injector#resolve} and {@link Injector#fromResolvedProviders}.
- */
- Injector.resolveAndCreate = function (providers) {
- var resolvedProviders = Injector.resolve(providers);
- return Injector.fromResolvedProviders(resolvedProviders);
- };
- /**
- * Creates an injector from previously resolved providers.
- *
- * This API is the recommended way to construct injectors in performance-sensitive parts.
- *
- * ### Example ([live demo](http://plnkr.co/edit/KrSMci?p=preview))
- *
- * ```typescript
- * @Injectable()
- * class Engine {
- * }
- *
- * @Injectable()
- * class Car {
- * constructor(public engine:Engine) {}
- * }
- *
- * var providers = Injector.resolve([Car, Engine]);
- * var injector = Injector.fromResolvedProviders(providers);
- * expect(injector.get(Car) instanceof Car).toBe(true);
- * ```
- */
- Injector.fromResolvedProviders = function (providers) {
- var bd = providers.map(function (b) { return new ProviderWithVisibility(b, Visibility.Public); });
- var proto = new ProtoInjector(bd);
- return new Injector(proto, null, null);
- };
- /**
- * @deprecated
- */
- Injector.fromResolvedBindings = function (providers) {
- return Injector.fromResolvedProviders(providers);
- };
- /**
- * @internal
- */
- Injector.prototype.debugContext = function () { return this._debugContext(); };
- /**
- * Retrieves an instance from the injector based on the provided token.
- * Throws {@link NoProviderError} if not found.
- *
- * ### Example ([live demo](http://plnkr.co/edit/HeXSHg?p=preview))
- *
- * ```typescript
- * var injector = Injector.resolveAndCreate([
- * provide("validToken", {useValue: "Value"})
- * ]);
- * expect(injector.get("validToken")).toEqual("Value");
- * expect(() => injector.get("invalidToken")).toThrowError();
- * ```
- *
- * `Injector` returns itself when given `Injector` as a token.
- *
- * ```typescript
- * var injector = Injector.resolveAndCreate([]);
- * expect(injector.get(Injector)).toBe(injector);
- * ```
- */
- Injector.prototype.get = function (token) {
- return this._getByKey(key_1.Key.get(token), null, null, false, Visibility.PublicAndPrivate);
- };
- /**
- * Retrieves an instance from the injector based on the provided token.
- * Returns null if not found.
- *
- * ### Example ([live demo](http://plnkr.co/edit/tpEbEy?p=preview))
- *
- * ```typescript
- * var injector = Injector.resolveAndCreate([
- * provide("validToken", {useValue: "Value"})
- * ]);
- * expect(injector.getOptional("validToken")).toEqual("Value");
- * expect(injector.getOptional("invalidToken")).toBe(null);
- * ```
- *
- * `Injector` returns itself when given `Injector` as a token.
- *
- * ```typescript
- * var injector = Injector.resolveAndCreate([]);
- * expect(injector.getOptional(Injector)).toBe(injector);
- * ```
- */
- Injector.prototype.getOptional = function (token) {
- return this._getByKey(key_1.Key.get(token), null, null, true, Visibility.PublicAndPrivate);
- };
- /**
- * @internal
- */
- Injector.prototype.getAt = function (index) { return this._strategy.getObjAtIndex(index); };
- Object.defineProperty(Injector.prototype, "parent", {
- /**
- * Parent of this injector.
- *
- * <!-- TODO: Add a link to the section of the user guide talking about hierarchical injection.
- * -->
- *
- * ### Example ([live demo](http://plnkr.co/edit/eosMGo?p=preview))
- *
- * ```typescript
- * var parent = Injector.resolveAndCreate([]);
- * var child = parent.resolveAndCreateChild([]);
- * expect(child.parent).toBe(parent);
- * ```
- */
- get: function () { return this._parent; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(Injector.prototype, "internalStrategy", {
- /**
- * @internal
- * Internal. Do not use.
- * We return `any` not to export the InjectorStrategy type.
- */
- get: function () { return this._strategy; },
- enumerable: true,
- configurable: true
- });
- /**
- * Resolves an array of providers and creates a child injector from those providers.
- *
- * <!-- TODO: Add a link to the section of the user guide talking about hierarchical injection.
- * -->
- *
- * The passed-in providers can be an array of `Type`, {@link Provider},
- * or a recursive array of more providers.
- *
- * ### Example ([live demo](http://plnkr.co/edit/opB3T4?p=preview))
- *
- * ```typescript
- * class ParentProvider {}
- * class ChildProvider {}
- *
- * var parent = Injector.resolveAndCreate([ParentProvider]);
- * var child = parent.resolveAndCreateChild([ChildProvider]);
- *
- * expect(child.get(ParentProvider) instanceof ParentProvider).toBe(true);
- * expect(child.get(ChildProvider) instanceof ChildProvider).toBe(true);
- * expect(child.get(ParentProvider)).toBe(parent.get(ParentProvider));
- * ```
- *
- * This function is slower than the corresponding `createChildFromResolved`
- * because it needs to resolve the passed-in providers first.
- * See {@link Injector#resolve} and {@link Injector#createChildFromResolved}.
- */
- Injector.prototype.resolveAndCreateChild = function (providers) {
- var resolvedProviders = Injector.resolve(providers);
- return this.createChildFromResolved(resolvedProviders);
- };
- /**
- * Creates a child injector from previously resolved providers.
- *
- * <!-- TODO: Add a link to the section of the user guide talking about hierarchical injection.
- * -->
- *
- * This API is the recommended way to construct injectors in performance-sensitive parts.
- *
- * ### Example ([live demo](http://plnkr.co/edit/VhyfjN?p=preview))
- *
- * ```typescript
- * class ParentProvider {}
- * class ChildProvider {}
- *
- * var parentProviders = Injector.resolve([ParentProvider]);
- * var childProviders = Injector.resolve([ChildProvider]);
- *
- * var parent = Injector.fromResolvedProviders(parentProviders);
- * var child = parent.createChildFromResolved(childProviders);
- *
- * expect(child.get(ParentProvider) instanceof ParentProvider).toBe(true);
- * expect(child.get(ChildProvider) instanceof ChildProvider).toBe(true);
- * expect(child.get(ParentProvider)).toBe(parent.get(ParentProvider));
- * ```
- */
- Injector.prototype.createChildFromResolved = function (providers) {
- var bd = providers.map(function (b) { return new ProviderWithVisibility(b, Visibility.Public); });
- var proto = new ProtoInjector(bd);
- var inj = new Injector(proto, null, null);
- inj._parent = this;
- return inj;
- };
- /**
- * Resolves a provider and instantiates an object in the context of the injector.
- *
- * The created object does not get cached by the injector.
- *
- * ### Example ([live demo](http://plnkr.co/edit/yvVXoB?p=preview))
- *
- * ```typescript
- * @Injectable()
- * class Engine {
- * }
- *
- * @Injectable()
- * class Car {
- * constructor(public engine:Engine) {}
- * }
- *
- * var injector = Injector.resolveAndCreate([Engine]);
- *
- * var car = injector.resolveAndInstantiate(Car);
- * expect(car.engine).toBe(injector.get(Engine));
- * expect(car).not.toBe(injector.resolveAndInstantiate(Car));
- * ```
- */
- Injector.prototype.resolveAndInstantiate = function (provider) {
- return this.instantiateResolved(Injector.resolve([provider])[0]);
- };
- /**
- * Instantiates an object using a resolved provider in the context of the injector.
- *
- * The created object does not get cached by the injector.
- *
- * ### Example ([live demo](http://plnkr.co/edit/ptCImQ?p=preview))
- *
- * ```typescript
- * @Injectable()
- * class Engine {
- * }
- *
- * @Injectable()
- * class Car {
- * constructor(public engine:Engine) {}
- * }
- *
- * var injector = Injector.resolveAndCreate([Engine]);
- * var carProvider = Injector.resolve([Car])[0];
- * var car = injector.instantiateResolved(carProvider);
- * expect(car.engine).toBe(injector.get(Engine));
- * expect(car).not.toBe(injector.instantiateResolved(carProvider));
- * ```
- */
- Injector.prototype.instantiateResolved = function (provider) {
- return this._instantiateProvider(provider, Visibility.PublicAndPrivate);
- };
- /** @internal */
- Injector.prototype._new = function (provider, visibility) {
- if (this._constructionCounter++ > this._strategy.getMaxNumberOfObjects()) {
- throw new exceptions_1.CyclicDependencyError(this, provider.key);
- }
- return this._instantiateProvider(provider, visibility);
- };
- Injector.prototype._instantiateProvider = function (provider, visibility) {
- if (provider.multiProvider) {
- var res = collection_1.ListWrapper.createFixedSize(provider.resolvedFactories.length);
- for (var i = 0; i < provider.resolvedFactories.length; ++i) {
- res[i] = this._instantiate(provider, provider.resolvedFactories[i], visibility);
- }
- return res;
- }
- else {
- return this._instantiate(provider, provider.resolvedFactories[0], visibility);
- }
- };
- Injector.prototype._instantiate = function (provider, resolvedFactory, visibility) {
- var factory = resolvedFactory.factory;
- var deps = resolvedFactory.dependencies;
- var length = deps.length;
- var d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15, d16, d17, d18, d19;
- try {
- d0 = length > 0 ? this._getByDependency(provider, deps[0], visibility) : null;
- d1 = length > 1 ? this._getByDependency(provider, deps[1], visibility) : null;
- d2 = length > 2 ? this._getByDependency(provider, deps[2], visibility) : null;
- d3 = length > 3 ? this._getByDependency(provider, deps[3], visibility) : null;
- d4 = length > 4 ? this._getByDependency(provider, deps[4], visibility) : null;
- d5 = length > 5 ? this._getByDependency(provider, deps[5], visibility) : null;
- d6 = length > 6 ? this._getByDependency(provider, deps[6], visibility) : null;
- d7 = length > 7 ? this._getByDependency(provider, deps[7], visibility) : null;
- d8 = length > 8 ? this._getByDependency(provider, deps[8], visibility) : null;
- d9 = length > 9 ? this._getByDependency(provider, deps[9], visibility) : null;
- d10 = length > 10 ? this._getByDependency(provider, deps[10], visibility) : null;
- d11 = length > 11 ? this._getByDependency(provider, deps[11], visibility) : null;
- d12 = length > 12 ? this._getByDependency(provider, deps[12], visibility) : null;
- d13 = length > 13 ? this._getByDependency(provider, deps[13], visibility) : null;
- d14 = length > 14 ? this._getByDependency(provider, deps[14], visibility) : null;
- d15 = length > 15 ? this._getByDependency(provider, deps[15], visibility) : null;
- d16 = length > 16 ? this._getByDependency(provider, deps[16], visibility) : null;
- d17 = length > 17 ? this._getByDependency(provider, deps[17], visibility) : null;
- d18 = length > 18 ? this._getByDependency(provider, deps[18], visibility) : null;
- d19 = length > 19 ? this._getByDependency(provider, deps[19], visibility) : null;
- }
- catch (e) {
- if (e instanceof exceptions_1.AbstractProviderError || e instanceof exceptions_1.InstantiationError) {
- e.addKey(this, provider.key);
- }
- throw e;
- }
- var obj;
- try {
- switch (length) {
- case 0:
- obj = factory();
- break;
- case 1:
- obj = factory(d0);
- break;
- case 2:
- obj = factory(d0, d1);
- break;
- case 3:
- obj = factory(d0, d1, d2);
- break;
- case 4:
- obj = factory(d0, d1, d2, d3);
- break;
- case 5:
- obj = factory(d0, d1, d2, d3, d4);
- break;
- case 6:
- obj = factory(d0, d1, d2, d3, d4, d5);
- break;
- case 7:
- obj = factory(d0, d1, d2, d3, d4, d5, d6);
- break;
- case 8:
- obj = factory(d0, d1, d2, d3, d4, d5, d6, d7);
- break;
- case 9:
- obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8);
- break;
- case 10:
- obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9);
- break;
- case 11:
- obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10);
- break;
- case 12:
- obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11);
- break;
- case 13:
- obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12);
- break;
- case 14:
- obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13);
- break;
- case 15:
- obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14);
- break;
- case 16:
- obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15);
- break;
- case 17:
- obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15, d16);
- break;
- case 18:
- obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15, d16, d17);
- break;
- case 19:
- obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15, d16, d17, d18);
- break;
- case 20:
- obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15, d16, d17, d18, d19);
- break;
- }
- }
- catch (e) {
- throw new exceptions_1.InstantiationError(this, e, e.stack, provider.key);
- }
- return obj;
- };
- Injector.prototype._getByDependency = function (provider, dep, providerVisibility) {
- var special = lang_1.isPresent(this._depProvider) ?
- this._depProvider.getDependency(this, provider, dep) :
- exports.UNDEFINED;
- if (special !== exports.UNDEFINED) {
- return special;
- }
- else {
- return this._getByKey(dep.key, dep.lowerBoundVisibility, dep.upperBoundVisibility, dep.optional, providerVisibility);
- }
- };
- Injector.prototype._getByKey = function (key, lowerBoundVisibility, upperBoundVisibility, optional, providerVisibility) {
- if (key === INJECTOR_KEY) {
- return this;
- }
- if (upperBoundVisibility instanceof metadata_1.SelfMetadata) {
- return this._getByKeySelf(key, optional, providerVisibility);
- }
- else if (upperBoundVisibility instanceof metadata_1.HostMetadata) {
- return this._getByKeyHost(key, optional, providerVisibility, lowerBoundVisibility);
- }
- else {
- return this._getByKeyDefault(key, optional, providerVisibility, lowerBoundVisibility);
- }
- };
- /** @internal */
- Injector.prototype._throwOrNull = function (key, optional) {
- if (optional) {
- return null;
- }
- else {
- throw new exceptions_1.NoProviderError(this, key);
- }
- };
- /** @internal */
- Injector.prototype._getByKeySelf = function (key, optional, providerVisibility) {
- var obj = this._strategy.getObjByKeyId(key.id, providerVisibility);
- return (obj !== exports.UNDEFINED) ? obj : this._throwOrNull(key, optional);
- };
- /** @internal */
- Injector.prototype._getByKeyHost = function (key, optional, providerVisibility, lowerBoundVisibility) {
- var inj = this;
- if (lowerBoundVisibility instanceof metadata_1.SkipSelfMetadata) {
- if (inj._isHost) {
- return this._getPrivateDependency(key, optional, inj);
- }
- else {
- inj = inj._parent;
- }
- }
- while (inj != null) {
- var obj = inj._strategy.getObjByKeyId(key.id, providerVisibility);
- if (obj !== exports.UNDEFINED)
- return obj;
- if (lang_1.isPresent(inj._parent) && inj._isHost) {
- return this._getPrivateDependency(key, optional, inj);
- }
- else {
- inj = inj._parent;
- }
- }
- return this._throwOrNull(key, optional);
- };
- /** @internal */
- Injector.prototype._getPrivateDependency = function (key, optional, inj) {
- var obj = inj._parent._strategy.getObjByKeyId(key.id, Visibility.Private);
- return (obj !== exports.UNDEFINED) ? obj : this._throwOrNull(key, optional);
- };
- /** @internal */
- Injector.prototype._getByKeyDefault = function (key, optional, providerVisibility, lowerBoundVisibility) {
- var inj = this;
- if (lowerBoundVisibility instanceof metadata_1.SkipSelfMetadata) {
- providerVisibility = inj._isHost ? Visibility.PublicAndPrivate : Visibility.Public;
- inj = inj._parent;
- }
- while (inj != null) {
- var obj = inj._strategy.getObjByKeyId(key.id, providerVisibility);
- if (obj !== exports.UNDEFINED)
- return obj;
- providerVisibility = inj._isHost ? Visibility.PublicAndPrivate : Visibility.Public;
- inj = inj._parent;
- }
- return this._throwOrNull(key, optional);
- };
- Object.defineProperty(Injector.prototype, "displayName", {
- get: function () {
- return "Injector(providers: [" + _mapProviders(this, function (b) { return (" \"" + b.key.displayName + "\" "); }).join(", ") + "])";
- },
- enumerable: true,
- configurable: true
- });
- Injector.prototype.toString = function () { return this.displayName; };
- return Injector;
- })();
- exports.Injector = Injector;
- var INJECTOR_KEY = key_1.Key.get(Injector);
- function _mapProviders(injector, fn) {
- var res = [];
- for (var i = 0; i < injector._proto.numberOfProviders; ++i) {
- res.push(fn(injector._proto.getProviderAtIndex(i)));
- }
- return res;
- }
- /***/ },
- /* 12 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- exports.Map = lang_1.global.Map;
- exports.Set = lang_1.global.Set;
- // Safari and Internet Explorer do not support the iterable parameter to the
- // Map constructor. We work around that by manually adding the items.
- var createMapFromPairs = (function () {
- try {
- if (new exports.Map([[1, 2]]).size === 1) {
- return function createMapFromPairs(pairs) { return new exports.Map(pairs); };
- }
- }
- catch (e) {
- }
- return function createMapAndPopulateFromPairs(pairs) {
- var map = new exports.Map();
- for (var i = 0; i < pairs.length; i++) {
- var pair = pairs[i];
- map.set(pair[0], pair[1]);
- }
- return map;
- };
- })();
- var createMapFromMap = (function () {
- try {
- if (new exports.Map(new exports.Map())) {
- return function createMapFromMap(m) { return new exports.Map(m); };
- }
- }
- catch (e) {
- }
- return function createMapAndPopulateFromMap(m) {
- var map = new exports.Map();
- m.forEach(function (v, k) { map.set(k, v); });
- return map;
- };
- })();
- var _clearValues = (function () {
- if ((new exports.Map()).keys().next) {
- return function _clearValues(m) {
- var keyIterator = m.keys();
- var k;
- while (!((k = keyIterator.next()).done)) {
- m.set(k.value, null);
- }
- };
- }
- else {
- return function _clearValuesWithForeEach(m) {
- m.forEach(function (v, k) { m.set(k, null); });
- };
- }
- })();
- // Safari doesn't implement MapIterator.next(), which is used is Traceur's polyfill of Array.from
- // TODO(mlaval): remove the work around once we have a working polyfill of Array.from
- var _arrayFromMap = (function () {
- try {
- if ((new exports.Map()).values().next) {
- return function createArrayFromMap(m, getValues) {
- return getValues ? Array.from(m.values()) : Array.from(m.keys());
- };
- }
- }
- catch (e) {
- }
- return function createArrayFromMapWithForeach(m, getValues) {
- var res = ListWrapper.createFixedSize(m.size), i = 0;
- m.forEach(function (v, k) {
- res[i] = getValues ? v : k;
- i++;
- });
- return res;
- };
- })();
- var MapWrapper = (function () {
- function MapWrapper() {
- }
- MapWrapper.clone = function (m) { return createMapFromMap(m); };
- MapWrapper.createFromStringMap = function (stringMap) {
- var result = new exports.Map();
- for (var prop in stringMap) {
- result.set(prop, stringMap[prop]);
- }
- return result;
- };
- MapWrapper.toStringMap = function (m) {
- var r = {};
- m.forEach(function (v, k) { return r[k] = v; });
- return r;
- };
- MapWrapper.createFromPairs = function (pairs) { return createMapFromPairs(pairs); };
- MapWrapper.clearValues = function (m) { _clearValues(m); };
- MapWrapper.iterable = function (m) { return m; };
- MapWrapper.keys = function (m) { return _arrayFromMap(m, false); };
- MapWrapper.values = function (m) { return _arrayFromMap(m, true); };
- return MapWrapper;
- })();
- exports.MapWrapper = MapWrapper;
- /**
- * Wraps Javascript Objects
- */
- var StringMapWrapper = (function () {
- function StringMapWrapper() {
- }
- StringMapWrapper.create = function () {
- // Note: We are not using Object.create(null) here due to
- // performance!
- // http://jsperf.com/ng2-object-create-null
- return {};
- };
- StringMapWrapper.contains = function (map, key) {
- return map.hasOwnProperty(key);
- };
- StringMapWrapper.get = function (map, key) {
- return map.hasOwnProperty(key) ? map[key] : undefined;
- };
- StringMapWrapper.set = function (map, key, value) { map[key] = value; };
- StringMapWrapper.keys = function (map) { return Object.keys(map); };
- StringMapWrapper.isEmpty = function (map) {
- for (var prop in map) {
- return false;
- }
- return true;
- };
- StringMapWrapper.delete = function (map, key) { delete map[key]; };
- StringMapWrapper.forEach = function (map, callback) {
- for (var prop in map) {
- if (map.hasOwnProperty(prop)) {
- callback(map[prop], prop);
- }
- }
- };
- StringMapWrapper.merge = function (m1, m2) {
- var m = {};
- for (var attr in m1) {
- if (m1.hasOwnProperty(attr)) {
- m[attr] = m1[attr];
- }
- }
- for (var attr in m2) {
- if (m2.hasOwnProperty(attr)) {
- m[attr] = m2[attr];
- }
- }
- return m;
- };
- StringMapWrapper.equals = function (m1, m2) {
- var k1 = Object.keys(m1);
- var k2 = Object.keys(m2);
- if (k1.length != k2.length) {
- return false;
- }
- var key;
- for (var i = 0; i < k1.length; i++) {
- key = k1[i];
- if (m1[key] !== m2[key]) {
- return false;
- }
- }
- return true;
- };
- return StringMapWrapper;
- })();
- exports.StringMapWrapper = StringMapWrapper;
- var ListWrapper = (function () {
- function ListWrapper() {
- }
- // JS has no way to express a statically fixed size list, but dart does so we
- // keep both methods.
- ListWrapper.createFixedSize = function (size) { return new Array(size); };
- ListWrapper.createGrowableSize = function (size) { return new Array(size); };
- ListWrapper.clone = function (array) { return array.slice(0); };
- ListWrapper.forEachWithIndex = function (array, fn) {
- for (var i = 0; i < array.length; i++) {
- fn(array[i], i);
- }
- };
- ListWrapper.first = function (array) {
- if (!array)
- return null;
- return array[0];
- };
- ListWrapper.last = function (array) {
- if (!array || array.length == 0)
- return null;
- return array[array.length - 1];
- };
- ListWrapper.indexOf = function (array, value, startIndex) {
- if (startIndex === void 0) { startIndex = 0; }
- return array.indexOf(value, startIndex);
- };
- ListWrapper.contains = function (list, el) { return list.indexOf(el) !== -1; };
- ListWrapper.reversed = function (array) {
- var a = ListWrapper.clone(array);
- return a.reverse();
- };
- ListWrapper.concat = function (a, b) { return a.concat(b); };
- ListWrapper.insert = function (list, index, value) { list.splice(index, 0, value); };
- ListWrapper.removeAt = function (list, index) {
- var res = list[index];
- list.splice(index, 1);
- return res;
- };
- ListWrapper.removeAll = function (list, items) {
- for (var i = 0; i < items.length; ++i) {
- var index = list.indexOf(items[i]);
- list.splice(index, 1);
- }
- };
- ListWrapper.remove = function (list, el) {
- var index = list.indexOf(el);
- if (index > -1) {
- list.splice(index, 1);
- return true;
- }
- return false;
- };
- ListWrapper.clear = function (list) { list.length = 0; };
- ListWrapper.isEmpty = function (list) { return list.length == 0; };
- ListWrapper.fill = function (list, value, start, end) {
- if (start === void 0) { start = 0; }
- if (end === void 0) { end = null; }
- list.fill(value, start, end === null ? list.length : end);
- };
- ListWrapper.equals = function (a, b) {
- if (a.length != b.length)
- return false;
- for (var i = 0; i < a.length; ++i) {
- if (a[i] !== b[i])
- return false;
- }
- return true;
- };
- ListWrapper.slice = function (l, from, to) {
- if (from === void 0) { from = 0; }
- if (to === void 0) { to = null; }
- return l.slice(from, to === null ? undefined : to);
- };
- ListWrapper.splice = function (l, from, length) { return l.splice(from, length); };
- ListWrapper.sort = function (l, compareFn) {
- if (lang_1.isPresent(compareFn)) {
- l.sort(compareFn);
- }
- else {
- l.sort();
- }
- };
- ListWrapper.toString = function (l) { return l.toString(); };
- ListWrapper.toJSON = function (l) { return JSON.stringify(l); };
- ListWrapper.maximum = function (list, predicate) {
- if (list.length == 0) {
- return null;
- }
- var solution = null;
- var maxValue = -Infinity;
- for (var index = 0; index < list.length; index++) {
- var candidate = list[index];
- if (lang_1.isBlank(candidate)) {
- continue;
- }
- var candidateValue = predicate(candidate);
- if (candidateValue > maxValue) {
- solution = candidate;
- maxValue = candidateValue;
- }
- }
- return solution;
- };
- return ListWrapper;
- })();
- exports.ListWrapper = ListWrapper;
- function isListLikeIterable(obj) {
- if (!lang_1.isJsObject(obj))
- return false;
- return lang_1.isArray(obj) ||
- (!(obj instanceof exports.Map) &&
- lang_1.getSymbolIterator() in obj); // JS Iterable have a Symbol.iterator prop
- }
- exports.isListLikeIterable = isListLikeIterable;
- function iterateListLike(obj, fn) {
- if (lang_1.isArray(obj)) {
- for (var i = 0; i < obj.length; i++) {
- fn(obj[i]);
- }
- }
- else {
- var iterator = obj[lang_1.getSymbolIterator()]();
- var item;
- while (!((item = iterator.next()).done)) {
- fn(item.value);
- }
- }
- }
- exports.iterateListLike = iterateListLike;
- // Safari and Internet Explorer do not support the iterable parameter to the
- // Set constructor. We work around that by manually adding the items.
- var createSetFromList = (function () {
- var test = new exports.Set([1, 2, 3]);
- if (test.size === 3) {
- return function createSetFromList(lst) { return new exports.Set(lst); };
- }
- else {
- return function createSetAndPopulateFromList(lst) {
- var res = new exports.Set(lst);
- if (res.size !== lst.length) {
- for (var i = 0; i < lst.length; i++) {
- res.add(lst[i]);
- }
- }
- return res;
- };
- }
- })();
- var SetWrapper = (function () {
- function SetWrapper() {
- }
- SetWrapper.createFromList = function (lst) { return createSetFromList(lst); };
- SetWrapper.has = function (s, key) { return s.has(key); };
- SetWrapper.delete = function (m, k) { m.delete(k); };
- return SetWrapper;
- })();
- exports.SetWrapper = SetWrapper;
- /***/ },
- /* 13 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var collection_1 = __webpack_require__(12);
- var reflection_1 = __webpack_require__(16);
- var key_1 = __webpack_require__(19);
- var metadata_1 = __webpack_require__(7);
- var exceptions_2 = __webpack_require__(21);
- var forward_ref_1 = __webpack_require__(10);
- /**
- * `Dependency` is used by the framework to extend DI.
- * This is internal to Angular and should not be used directly.
- */
- var Dependency = (function () {
- function Dependency(key, optional, lowerBoundVisibility, upperBoundVisibility, properties) {
- this.key = key;
- this.optional = optional;
- this.lowerBoundVisibility = lowerBoundVisibility;
- this.upperBoundVisibility = upperBoundVisibility;
- this.properties = properties;
- }
- Dependency.fromKey = function (key) { return new Dependency(key, false, null, null, []); };
- return Dependency;
- })();
- exports.Dependency = Dependency;
- var _EMPTY_LIST = lang_1.CONST_EXPR([]);
- /**
- * Describes how the {@link Injector} should instantiate a given token.
- *
- * See {@link provide}.
- *
- * ### Example ([live demo](http://plnkr.co/edit/GNAyj6K6PfYg2NBzgwZ5?p%3Dpreview&p=preview))
- *
- * ```javascript
- * var injector = Injector.resolveAndCreate([
- * new Provider("message", { useValue: 'Hello' })
- * ]);
- *
- * expect(injector.get("message")).toEqual('Hello');
- * ```
- */
- var Provider = (function () {
- function Provider(token, _a) {
- var useClass = _a.useClass, useValue = _a.useValue, useExisting = _a.useExisting, useFactory = _a.useFactory, deps = _a.deps, multi = _a.multi;
- this.token = token;
- this.useClass = useClass;
- this.useValue = useValue;
- this.useExisting = useExisting;
- this.useFactory = useFactory;
- this.dependencies = deps;
- this._multi = multi;
- }
- Object.defineProperty(Provider.prototype, "multi", {
- // TODO: Provide a full working example after alpha38 is released.
- /**
- * Creates multiple providers matching the same token (a multi-provider).
- *
- * Multi-providers are used for creating pluggable service, where the system comes
- * with some default providers, and the user can register additonal providers.
- * The combination of the default providers and the additional providers will be
- * used to drive the behavior of the system.
- *
- * ### Example
- *
- * ```typescript
- * var injector = Injector.resolveAndCreate([
- * new Provider("Strings", { useValue: "String1", multi: true}),
- * new Provider("Strings", { useValue: "String2", multi: true})
- * ]);
- *
- * expect(injector.get("Strings")).toEqual(["String1", "String2"]);
- * ```
- *
- * Multi-providers and regular providers cannot be mixed. The following
- * will throw an exception:
- *
- * ```typescript
- * var injector = Injector.resolveAndCreate([
- * new Provider("Strings", { useValue: "String1", multi: true }),
- * new Provider("Strings", { useValue: "String2"})
- * ]);
- * ```
- */
- get: function () { return lang_1.normalizeBool(this._multi); },
- enumerable: true,
- configurable: true
- });
- Provider = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [Object, Object])
- ], Provider);
- return Provider;
- })();
- exports.Provider = Provider;
- /**
- * See {@link Provider} instead.
- *
- * @deprecated
- */
- var Binding = (function (_super) {
- __extends(Binding, _super);
- function Binding(token, _a) {
- var toClass = _a.toClass, toValue = _a.toValue, toAlias = _a.toAlias, toFactory = _a.toFactory, deps = _a.deps, multi = _a.multi;
- _super.call(this, token, {
- useClass: toClass,
- useValue: toValue,
- useExisting: toAlias,
- useFactory: toFactory,
- deps: deps,
- multi: multi
- });
- }
- Object.defineProperty(Binding.prototype, "toClass", {
- /**
- * @deprecated
- */
- get: function () { return this.useClass; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(Binding.prototype, "toAlias", {
- /**
- * @deprecated
- */
- get: function () { return this.useExisting; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(Binding.prototype, "toFactory", {
- /**
- * @deprecated
- */
- get: function () { return this.useFactory; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(Binding.prototype, "toValue", {
- /**
- * @deprecated
- */
- get: function () { return this.useValue; },
- enumerable: true,
- configurable: true
- });
- Binding = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [Object, Object])
- ], Binding);
- return Binding;
- })(Provider);
- exports.Binding = Binding;
- var ResolvedProvider_ = (function () {
- function ResolvedProvider_(key, resolvedFactories, multiProvider) {
- this.key = key;
- this.resolvedFactories = resolvedFactories;
- this.multiProvider = multiProvider;
- }
- Object.defineProperty(ResolvedProvider_.prototype, "resolvedFactory", {
- get: function () { return this.resolvedFactories[0]; },
- enumerable: true,
- configurable: true
- });
- return ResolvedProvider_;
- })();
- exports.ResolvedProvider_ = ResolvedProvider_;
- /**
- * An internal resolved representation of a factory function created by resolving {@link Provider}.
- */
- var ResolvedFactory = (function () {
- function ResolvedFactory(
- /**
- * Factory function which can return an instance of an object represented by a key.
- */
- factory,
- /**
- * Arguments (dependencies) to the `factory` function.
- */
- dependencies) {
- this.factory = factory;
- this.dependencies = dependencies;
- }
- return ResolvedFactory;
- })();
- exports.ResolvedFactory = ResolvedFactory;
- /**
- * Creates a {@link Provider}.
- *
- * To construct a {@link Provider}, bind a `token` to either a class, a value, a factory function,
- * or
- * to an existing `token`.
- * See {@link ProviderBuilder} for more details.
- *
- * The `token` is most commonly a class or {@link angular2/di/OpaqueToken}.
- *
- * @deprecated
- */
- function bind(token) {
- return new ProviderBuilder(token);
- }
- exports.bind = bind;
- /**
- * Creates a {@link Provider}.
- *
- * See {@link Provider} for more details.
- *
- * <!-- TODO: improve the docs -->
- */
- function provide(token, _a) {
- var useClass = _a.useClass, useValue = _a.useValue, useExisting = _a.useExisting, useFactory = _a.useFactory, deps = _a.deps, multi = _a.multi;
- return new Provider(token, {
- useClass: useClass,
- useValue: useValue,
- useExisting: useExisting,
- useFactory: useFactory,
- deps: deps,
- multi: multi
- });
- }
- exports.provide = provide;
- /**
- * Helper class for the {@link bind} function.
- */
- var ProviderBuilder = (function () {
- function ProviderBuilder(token) {
- this.token = token;
- }
- /**
- * Binds a DI token to a class.
- *
- * ### Example ([live demo](http://plnkr.co/edit/ZpBCSYqv6e2ud5KXLdxQ?p=preview))
- *
- * Because `toAlias` and `toClass` are often confused, the example contains
- * both use cases for easy comparison.
- *
- * ```typescript
- * class Vehicle {}
- *
- * class Car extends Vehicle {}
- *
- * var injectorClass = Injector.resolveAndCreate([
- * Car,
- * provide(Vehicle, {useClass: Car})
- * ]);
- * var injectorAlias = Injector.resolveAndCreate([
- * Car,
- * provide(Vehicle, {useExisting: Car})
- * ]);
- *
- * expect(injectorClass.get(Vehicle)).not.toBe(injectorClass.get(Car));
- * expect(injectorClass.get(Vehicle) instanceof Car).toBe(true);
- *
- * expect(injectorAlias.get(Vehicle)).toBe(injectorAlias.get(Car));
- * expect(injectorAlias.get(Vehicle) instanceof Car).toBe(true);
- * ```
- */
- ProviderBuilder.prototype.toClass = function (type) {
- if (!lang_1.isType(type)) {
- throw new exceptions_1.BaseException("Trying to create a class provider but \"" + lang_1.stringify(type) + "\" is not a class!");
- }
- return new Provider(this.token, { useClass: type });
- };
- /**
- * Binds a DI token to a value.
- *
- * ### Example ([live demo](http://plnkr.co/edit/G024PFHmDL0cJFgfZK8O?p=preview))
- *
- * ```typescript
- * var injector = Injector.resolveAndCreate([
- * provide('message', {useValue: 'Hello'})
- * ]);
- *
- * expect(injector.get('message')).toEqual('Hello');
- * ```
- */
- ProviderBuilder.prototype.toValue = function (value) { return new Provider(this.token, { useValue: value }); };
- /**
- * Binds a DI token to an existing token.
- *
- * Angular will return the same instance as if the provided token was used. (This is
- * in contrast to `useClass` where a separate instance of `useClass` will be returned.)
- *
- * ### Example ([live demo](http://plnkr.co/edit/uBaoF2pN5cfc5AfZapNw?p=preview))
- *
- * Because `toAlias` and `toClass` are often confused, the example contains
- * both use cases for easy comparison.
- *
- * ```typescript
- * class Vehicle {}
- *
- * class Car extends Vehicle {}
- *
- * var injectorAlias = Injector.resolveAndCreate([
- * Car,
- * provide(Vehicle, {useExisting: Car})
- * ]);
- * var injectorClass = Injector.resolveAndCreate([
- * Car,
- * provide(Vehicle, {useClass: Car})
- * ]);
- *
- * expect(injectorAlias.get(Vehicle)).toBe(injectorAlias.get(Car));
- * expect(injectorAlias.get(Vehicle) instanceof Car).toBe(true);
- *
- * expect(injectorClass.get(Vehicle)).not.toBe(injectorClass.get(Car));
- * expect(injectorClass.get(Vehicle) instanceof Car).toBe(true);
- * ```
- */
- ProviderBuilder.prototype.toAlias = function (aliasToken) {
- if (lang_1.isBlank(aliasToken)) {
- throw new exceptions_1.BaseException("Can not alias " + lang_1.stringify(this.token) + " to a blank value!");
- }
- return new Provider(this.token, { useExisting: aliasToken });
- };
- /**
- * Binds a DI token to a function which computes the value.
- *
- * ### Example ([live demo](http://plnkr.co/edit/OejNIfTT3zb1iBxaIYOb?p=preview))
- *
- * ```typescript
- * var injector = Injector.resolveAndCreate([
- * provide(Number, {useFactory: () => { return 1+2; }}),
- * provide(String, {useFactory: (v) => { return "Value: " + v; }, deps: [Number]})
- * ]);
- *
- * expect(injector.get(Number)).toEqual(3);
- * expect(injector.get(String)).toEqual('Value: 3');
- * ```
- */
- ProviderBuilder.prototype.toFactory = function (factory, dependencies) {
- if (!lang_1.isFunction(factory)) {
- throw new exceptions_1.BaseException("Trying to create a factory provider but \"" + lang_1.stringify(factory) + "\" is not a function!");
- }
- return new Provider(this.token, { useFactory: factory, deps: dependencies });
- };
- return ProviderBuilder;
- })();
- exports.ProviderBuilder = ProviderBuilder;
- /**
- * Resolve a single provider.
- */
- function resolveFactory(provider) {
- var factoryFn;
- var resolvedDeps;
- if (lang_1.isPresent(provider.useClass)) {
- var useClass = forward_ref_1.resolveForwardRef(provider.useClass);
- factoryFn = reflection_1.reflector.factory(useClass);
- resolvedDeps = _dependenciesFor(useClass);
- }
- else if (lang_1.isPresent(provider.useExisting)) {
- factoryFn = function (aliasInstance) { return aliasInstance; };
- resolvedDeps = [Dependency.fromKey(key_1.Key.get(provider.useExisting))];
- }
- else if (lang_1.isPresent(provider.useFactory)) {
- factoryFn = provider.useFactory;
- resolvedDeps = _constructDependencies(provider.useFactory, provider.dependencies);
- }
- else {
- factoryFn = function () { return provider.useValue; };
- resolvedDeps = _EMPTY_LIST;
- }
- return new ResolvedFactory(factoryFn, resolvedDeps);
- }
- exports.resolveFactory = resolveFactory;
- /**
- * Converts the {@link Provider} into {@link ResolvedProvider}.
- *
- * {@link Injector} internally only uses {@link ResolvedProvider}, {@link Provider} contains
- * convenience provider syntax.
- */
- function resolveProvider(provider) {
- return new ResolvedProvider_(key_1.Key.get(provider.token), [resolveFactory(provider)], false);
- }
- exports.resolveProvider = resolveProvider;
- /**
- * Resolve a list of Providers.
- */
- function resolveProviders(providers) {
- var normalized = _createListOfProviders(_normalizeProviders(providers, new Map()));
- return normalized.map(function (b) {
- if (b instanceof _NormalizedProvider) {
- return new ResolvedProvider_(b.key, [b.resolvedFactory], false);
- }
- else {
- var arr = b;
- return new ResolvedProvider_(arr[0].key, arr.map(function (_) { return _.resolvedFactory; }), true);
- }
- });
- }
- exports.resolveProviders = resolveProviders;
- /**
- * The algorithm works as follows:
- *
- * [Provider] -> [_NormalizedProvider|[_NormalizedProvider]] -> [ResolvedProvider]
- *
- * _NormalizedProvider is essentially a resolved provider before it was grouped by key.
- */
- var _NormalizedProvider = (function () {
- function _NormalizedProvider(key, resolvedFactory) {
- this.key = key;
- this.resolvedFactory = resolvedFactory;
- }
- return _NormalizedProvider;
- })();
- function _createListOfProviders(flattenedProviders) {
- return collection_1.MapWrapper.values(flattenedProviders);
- }
- function _normalizeProviders(providers, res) {
- providers.forEach(function (b) {
- if (b instanceof lang_1.Type) {
- _normalizeProvider(provide(b, { useClass: b }), res);
- }
- else if (b instanceof Provider) {
- _normalizeProvider(b, res);
- }
- else if (b instanceof Array) {
- _normalizeProviders(b, res);
- }
- else if (b instanceof ProviderBuilder) {
- throw new exceptions_2.InvalidProviderError(b.token);
- }
- else {
- throw new exceptions_2.InvalidProviderError(b);
- }
- });
- return res;
- }
- function _normalizeProvider(b, res) {
- var key = key_1.Key.get(b.token);
- var factory = resolveFactory(b);
- var normalized = new _NormalizedProvider(key, factory);
- if (b.multi) {
- var existingProvider = res.get(key.id);
- if (existingProvider instanceof Array) {
- existingProvider.push(normalized);
- }
- else if (lang_1.isBlank(existingProvider)) {
- res.set(key.id, [normalized]);
- }
- else {
- throw new exceptions_2.MixingMultiProvidersWithRegularProvidersError(existingProvider, b);
- }
- }
- else {
- var existingProvider = res.get(key.id);
- if (existingProvider instanceof Array) {
- throw new exceptions_2.MixingMultiProvidersWithRegularProvidersError(existingProvider, b);
- }
- res.set(key.id, normalized);
- }
- }
- function _constructDependencies(factoryFunction, dependencies) {
- if (lang_1.isBlank(dependencies)) {
- return _dependenciesFor(factoryFunction);
- }
- else {
- var params = dependencies.map(function (t) { return [t]; });
- return dependencies.map(function (t) { return _extractToken(factoryFunction, t, params); });
- }
- }
- function _dependenciesFor(typeOrFunc) {
- var params = reflection_1.reflector.parameters(typeOrFunc);
- if (lang_1.isBlank(params))
- return [];
- if (params.some(lang_1.isBlank)) {
- throw new exceptions_2.NoAnnotationError(typeOrFunc, params);
- }
- return params.map(function (p) { return _extractToken(typeOrFunc, p, params); });
- }
- function _extractToken(typeOrFunc, metadata /*any[] | any*/, params) {
- var depProps = [];
- var token = null;
- var optional = false;
- if (!lang_1.isArray(metadata)) {
- if (metadata instanceof metadata_1.InjectMetadata) {
- return _createDependency(metadata.token, optional, null, null, depProps);
- }
- else {
- return _createDependency(metadata, optional, null, null, depProps);
- }
- }
- var lowerBoundVisibility = null;
- var upperBoundVisibility = null;
- for (var i = 0; i < metadata.length; ++i) {
- var paramMetadata = metadata[i];
- if (paramMetadata instanceof lang_1.Type) {
- token = paramMetadata;
- }
- else if (paramMetadata instanceof metadata_1.InjectMetadata) {
- token = paramMetadata.token;
- }
- else if (paramMetadata instanceof metadata_1.OptionalMetadata) {
- optional = true;
- }
- else if (paramMetadata instanceof metadata_1.SelfMetadata) {
- upperBoundVisibility = paramMetadata;
- }
- else if (paramMetadata instanceof metadata_1.HostMetadata) {
- upperBoundVisibility = paramMetadata;
- }
- else if (paramMetadata instanceof metadata_1.SkipSelfMetadata) {
- lowerBoundVisibility = paramMetadata;
- }
- else if (paramMetadata instanceof metadata_1.DependencyMetadata) {
- if (lang_1.isPresent(paramMetadata.token)) {
- token = paramMetadata.token;
- }
- depProps.push(paramMetadata);
- }
- }
- token = forward_ref_1.resolveForwardRef(token);
- if (lang_1.isPresent(token)) {
- return _createDependency(token, optional, lowerBoundVisibility, upperBoundVisibility, depProps);
- }
- else {
- throw new exceptions_2.NoAnnotationError(typeOrFunc, params);
- }
- }
- function _createDependency(token, optional, lowerBoundVisibility, upperBoundVisibility, depProps) {
- return new Dependency(key_1.Key.get(token), optional, lowerBoundVisibility, upperBoundVisibility, depProps);
- }
- /***/ },
- /* 14 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var exception_handler_1 = __webpack_require__(15);
- var exception_handler_2 = __webpack_require__(15);
- exports.ExceptionHandler = exception_handler_2.ExceptionHandler;
- var BaseException = (function (_super) {
- __extends(BaseException, _super);
- function BaseException(message) {
- if (message === void 0) { message = "--"; }
- _super.call(this, message);
- this.message = message;
- this.stack = (new Error(message)).stack;
- }
- BaseException.prototype.toString = function () { return this.message; };
- return BaseException;
- })(Error);
- exports.BaseException = BaseException;
- /**
- * Wraps an exception and provides additional context or information.
- */
- var WrappedException = (function (_super) {
- __extends(WrappedException, _super);
- function WrappedException(_wrapperMessage, _originalException, _originalStack, _context) {
- _super.call(this, _wrapperMessage);
- this._wrapperMessage = _wrapperMessage;
- this._originalException = _originalException;
- this._originalStack = _originalStack;
- this._context = _context;
- this._wrapperStack = (new Error(_wrapperMessage)).stack;
- }
- Object.defineProperty(WrappedException.prototype, "wrapperMessage", {
- get: function () { return this._wrapperMessage; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(WrappedException.prototype, "wrapperStack", {
- get: function () { return this._wrapperStack; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(WrappedException.prototype, "originalException", {
- get: function () { return this._originalException; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(WrappedException.prototype, "originalStack", {
- get: function () { return this._originalStack; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(WrappedException.prototype, "context", {
- get: function () { return this._context; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(WrappedException.prototype, "message", {
- get: function () { return exception_handler_1.ExceptionHandler.exceptionToString(this); },
- enumerable: true,
- configurable: true
- });
- WrappedException.prototype.toString = function () { return this.message; };
- return WrappedException;
- })(Error);
- exports.WrappedException = WrappedException;
- function makeTypeError(message) {
- return new TypeError(message);
- }
- exports.makeTypeError = makeTypeError;
- function unimplemented() {
- throw new BaseException('unimplemented');
- }
- exports.unimplemented = unimplemented;
- /***/ },
- /* 15 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var collection_1 = __webpack_require__(12);
- var _ArrayLogger = (function () {
- function _ArrayLogger() {
- this.res = [];
- }
- _ArrayLogger.prototype.log = function (s) { this.res.push(s); };
- _ArrayLogger.prototype.logError = function (s) { this.res.push(s); };
- _ArrayLogger.prototype.logGroup = function (s) { this.res.push(s); };
- _ArrayLogger.prototype.logGroupEnd = function () { };
- ;
- return _ArrayLogger;
- })();
- /**
- * Provides a hook for centralized exception handling.
- *
- * The default implementation of `ExceptionHandler` prints error messages to the `Console`. To
- * intercept error handling,
- * write a custom exception handler that replaces this default as appropriate for your app.
- *
- * ### Example
- *
- * ```javascript
- *
- * class MyExceptionHandler implements ExceptionHandler {
- * call(error, stackTrace = null, reason = null) {
- * // do something with the exception
- * }
- * }
- *
- * bootstrap(MyApp, [provide(ExceptionHandler, {useClass: MyExceptionHandler})])
- *
- * ```
- */
- var ExceptionHandler = (function () {
- function ExceptionHandler(_logger, _rethrowException) {
- if (_rethrowException === void 0) { _rethrowException = true; }
- this._logger = _logger;
- this._rethrowException = _rethrowException;
- }
- ExceptionHandler.exceptionToString = function (exception, stackTrace, reason) {
- if (stackTrace === void 0) { stackTrace = null; }
- if (reason === void 0) { reason = null; }
- var l = new _ArrayLogger();
- var e = new ExceptionHandler(l, false);
- e.call(exception, stackTrace, reason);
- return l.res.join("\n");
- };
- ExceptionHandler.prototype.call = function (exception, stackTrace, reason) {
- if (stackTrace === void 0) { stackTrace = null; }
- if (reason === void 0) { reason = null; }
- var originalException = this._findOriginalException(exception);
- var originalStack = this._findOriginalStack(exception);
- var context = this._findContext(exception);
- this._logger.logGroup("EXCEPTION: " + this._extractMessage(exception));
- if (lang_1.isPresent(stackTrace) && lang_1.isBlank(originalStack)) {
- this._logger.logError("STACKTRACE:");
- this._logger.logError(this._longStackTrace(stackTrace));
- }
- if (lang_1.isPresent(reason)) {
- this._logger.logError("REASON: " + reason);
- }
- if (lang_1.isPresent(originalException)) {
- this._logger.logError("ORIGINAL EXCEPTION: " + this._extractMessage(originalException));
- }
- if (lang_1.isPresent(originalStack)) {
- this._logger.logError("ORIGINAL STACKTRACE:");
- this._logger.logError(this._longStackTrace(originalStack));
- }
- if (lang_1.isPresent(context)) {
- this._logger.logError("ERROR CONTEXT:");
- this._logger.logError(context);
- }
- this._logger.logGroupEnd();
- // We rethrow exceptions, so operations like 'bootstrap' will result in an error
- // when an exception happens. If we do not rethrow, bootstrap will always succeed.
- if (this._rethrowException)
- throw exception;
- };
- /** @internal */
- ExceptionHandler.prototype._extractMessage = function (exception) {
- return exception instanceof exceptions_1.WrappedException ? exception.wrapperMessage : exception.toString();
- };
- /** @internal */
- ExceptionHandler.prototype._longStackTrace = function (stackTrace) {
- return collection_1.isListLikeIterable(stackTrace) ? stackTrace.join("\n\n-----async gap-----\n") :
- stackTrace.toString();
- };
- /** @internal */
- ExceptionHandler.prototype._findContext = function (exception) {
- try {
- if (!(exception instanceof exceptions_1.WrappedException))
- return null;
- return lang_1.isPresent(exception.context) ? exception.context :
- this._findContext(exception.originalException);
- }
- catch (e) {
- // exception.context can throw an exception. if it happens, we ignore the context.
- return null;
- }
- };
- /** @internal */
- ExceptionHandler.prototype._findOriginalException = function (exception) {
- if (!(exception instanceof exceptions_1.WrappedException))
- return null;
- var e = exception.originalException;
- while (e instanceof exceptions_1.WrappedException && lang_1.isPresent(e.originalException)) {
- e = e.originalException;
- }
- return e;
- };
- /** @internal */
- ExceptionHandler.prototype._findOriginalStack = function (exception) {
- if (!(exception instanceof exceptions_1.WrappedException))
- return null;
- var e = exception;
- var stack = exception.originalStack;
- while (e instanceof exceptions_1.WrappedException && lang_1.isPresent(e.originalException)) {
- e = e.originalException;
- if (e instanceof exceptions_1.WrappedException && lang_1.isPresent(e.originalException)) {
- stack = e.originalStack;
- }
- }
- return stack;
- };
- return ExceptionHandler;
- })();
- exports.ExceptionHandler = ExceptionHandler;
- /***/ },
- /* 16 */
- /***/ function(module, exports, __webpack_require__) {
- var reflector_1 = __webpack_require__(17);
- var reflector_2 = __webpack_require__(17);
- exports.Reflector = reflector_2.Reflector;
- exports.ReflectionInfo = reflector_2.ReflectionInfo;
- var reflection_capabilities_1 = __webpack_require__(18);
- /**
- * The {@link Reflector} used internally in Angular to access metadata
- * about symbols.
- */
- exports.reflector = new reflector_1.Reflector(new reflection_capabilities_1.ReflectionCapabilities());
- /***/ },
- /* 17 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var collection_1 = __webpack_require__(12);
- /**
- * Reflective information about a symbol, including annotations, interfaces, and other metadata.
- */
- var ReflectionInfo = (function () {
- function ReflectionInfo(annotations, parameters, factory, interfaces, propMetadata) {
- this.annotations = annotations;
- this.parameters = parameters;
- this.factory = factory;
- this.interfaces = interfaces;
- this.propMetadata = propMetadata;
- }
- return ReflectionInfo;
- })();
- exports.ReflectionInfo = ReflectionInfo;
- /**
- * Provides access to reflection data about symbols. Used internally by Angular
- * to power dependency injection and compilation.
- */
- var Reflector = (function () {
- function Reflector(reflectionCapabilities) {
- /** @internal */
- this._injectableInfo = new collection_1.Map();
- /** @internal */
- this._getters = new collection_1.Map();
- /** @internal */
- this._setters = new collection_1.Map();
- /** @internal */
- this._methods = new collection_1.Map();
- this._usedKeys = null;
- this.reflectionCapabilities = reflectionCapabilities;
- }
- Reflector.prototype.isReflectionEnabled = function () { return this.reflectionCapabilities.isReflectionEnabled(); };
- /**
- * Causes `this` reflector to track keys used to access
- * {@link ReflectionInfo} objects.
- */
- Reflector.prototype.trackUsage = function () { this._usedKeys = new collection_1.Set(); };
- /**
- * Lists types for which reflection information was not requested since
- * {@link #trackUsage} was called. This list could later be audited as
- * potential dead code.
- */
- Reflector.prototype.listUnusedKeys = function () {
- var _this = this;
- if (this._usedKeys == null) {
- throw new exceptions_1.BaseException('Usage tracking is disabled');
- }
- var allTypes = collection_1.MapWrapper.keys(this._injectableInfo);
- return allTypes.filter(function (key) { return !collection_1.SetWrapper.has(_this._usedKeys, key); });
- };
- Reflector.prototype.registerFunction = function (func, funcInfo) {
- this._injectableInfo.set(func, funcInfo);
- };
- Reflector.prototype.registerType = function (type, typeInfo) {
- this._injectableInfo.set(type, typeInfo);
- };
- Reflector.prototype.registerGetters = function (getters) { _mergeMaps(this._getters, getters); };
- Reflector.prototype.registerSetters = function (setters) { _mergeMaps(this._setters, setters); };
- Reflector.prototype.registerMethods = function (methods) { _mergeMaps(this._methods, methods); };
- Reflector.prototype.factory = function (type) {
- if (this._containsReflectionInfo(type)) {
- var res = this._getReflectionInfo(type).factory;
- return lang_1.isPresent(res) ? res : null;
- }
- else {
- return this.reflectionCapabilities.factory(type);
- }
- };
- Reflector.prototype.parameters = function (typeOrFunc) {
- if (this._injectableInfo.has(typeOrFunc)) {
- var res = this._getReflectionInfo(typeOrFunc).parameters;
- return lang_1.isPresent(res) ? res : [];
- }
- else {
- return this.reflectionCapabilities.parameters(typeOrFunc);
- }
- };
- Reflector.prototype.annotations = function (typeOrFunc) {
- if (this._injectableInfo.has(typeOrFunc)) {
- var res = this._getReflectionInfo(typeOrFunc).annotations;
- return lang_1.isPresent(res) ? res : [];
- }
- else {
- return this.reflectionCapabilities.annotations(typeOrFunc);
- }
- };
- Reflector.prototype.propMetadata = function (typeOrFunc) {
- if (this._injectableInfo.has(typeOrFunc)) {
- var res = this._getReflectionInfo(typeOrFunc).propMetadata;
- return lang_1.isPresent(res) ? res : {};
- }
- else {
- return this.reflectionCapabilities.propMetadata(typeOrFunc);
- }
- };
- Reflector.prototype.interfaces = function (type) {
- if (this._injectableInfo.has(type)) {
- var res = this._getReflectionInfo(type).interfaces;
- return lang_1.isPresent(res) ? res : [];
- }
- else {
- return this.reflectionCapabilities.interfaces(type);
- }
- };
- Reflector.prototype.getter = function (name) {
- if (this._getters.has(name)) {
- return this._getters.get(name);
- }
- else {
- return this.reflectionCapabilities.getter(name);
- }
- };
- Reflector.prototype.setter = function (name) {
- if (this._setters.has(name)) {
- return this._setters.get(name);
- }
- else {
- return this.reflectionCapabilities.setter(name);
- }
- };
- Reflector.prototype.method = function (name) {
- if (this._methods.has(name)) {
- return this._methods.get(name);
- }
- else {
- return this.reflectionCapabilities.method(name);
- }
- };
- /** @internal */
- Reflector.prototype._getReflectionInfo = function (typeOrFunc) {
- if (lang_1.isPresent(this._usedKeys)) {
- this._usedKeys.add(typeOrFunc);
- }
- return this._injectableInfo.get(typeOrFunc);
- };
- /** @internal */
- Reflector.prototype._containsReflectionInfo = function (typeOrFunc) { return this._injectableInfo.has(typeOrFunc); };
- Reflector.prototype.importUri = function (type) { return this.reflectionCapabilities.importUri(type); };
- return Reflector;
- })();
- exports.Reflector = Reflector;
- function _mergeMaps(target, config) {
- collection_1.StringMapWrapper.forEach(config, function (v, k) { return target.set(k, v); });
- }
- /***/ },
- /* 18 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var ReflectionCapabilities = (function () {
- function ReflectionCapabilities(reflect) {
- this._reflect = lang_1.isPresent(reflect) ? reflect : lang_1.global.Reflect;
- }
- ReflectionCapabilities.prototype.isReflectionEnabled = function () { return true; };
- ReflectionCapabilities.prototype.factory = function (t) {
- switch (t.length) {
- case 0:
- return function () { return new t(); };
- case 1:
- return function (a1) { return new t(a1); };
- case 2:
- return function (a1, a2) { return new t(a1, a2); };
- case 3:
- return function (a1, a2, a3) { return new t(a1, a2, a3); };
- case 4:
- return function (a1, a2, a3, a4) { return new t(a1, a2, a3, a4); };
- case 5:
- return function (a1, a2, a3, a4, a5) { return new t(a1, a2, a3, a4, a5); };
- case 6:
- return function (a1, a2, a3, a4, a5, a6) { return new t(a1, a2, a3, a4, a5, a6); };
- case 7:
- return function (a1, a2, a3, a4, a5, a6, a7) { return new t(a1, a2, a3, a4, a5, a6, a7); };
- case 8:
- return function (a1, a2, a3, a4, a5, a6, a7, a8) { return new t(a1, a2, a3, a4, a5, a6, a7, a8); };
- case 9:
- return function (a1, a2, a3, a4, a5, a6, a7, a8, a9) { return new t(a1, a2, a3, a4, a5, a6, a7, a8, a9); };
- case 10:
- return function (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) {
- return new t(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
- };
- case 11:
- return function (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) {
- return new t(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
- };
- case 12:
- return function (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) {
- return new t(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12);
- };
- case 13:
- return function (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) {
- return new t(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13);
- };
- case 14:
- return function (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) {
- return new t(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14);
- };
- case 15:
- return function (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) {
- return new t(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15);
- };
- case 16:
- return function (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) {
- return new t(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16);
- };
- case 17:
- return function (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17) {
- return new t(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17);
- };
- case 18:
- return function (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18) {
- return new t(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18);
- };
- case 19:
- return function (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19) {
- return new t(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19);
- };
- case 20:
- return function (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) {
- return new t(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);
- };
- }
- ;
- throw new Error("Cannot create a factory for '" + lang_1.stringify(t) + "' because its constructor has more than 20 arguments");
- };
- /** @internal */
- ReflectionCapabilities.prototype._zipTypesAndAnnotaions = function (paramTypes, paramAnnotations) {
- var result;
- if (typeof paramTypes === 'undefined') {
- result = new Array(paramAnnotations.length);
- }
- else {
- result = new Array(paramTypes.length);
- }
- for (var i = 0; i < result.length; i++) {
- // TS outputs Object for parameters without types, while Traceur omits
- // the annotations. For now we preserve the Traceur behavior to aid
- // migration, but this can be revisited.
- if (typeof paramTypes === 'undefined') {
- result[i] = [];
- }
- else if (paramTypes[i] != Object) {
- result[i] = [paramTypes[i]];
- }
- else {
- result[i] = [];
- }
- if (lang_1.isPresent(paramAnnotations) && lang_1.isPresent(paramAnnotations[i])) {
- result[i] = result[i].concat(paramAnnotations[i]);
- }
- }
- return result;
- };
- ReflectionCapabilities.prototype.parameters = function (typeOrFunc) {
- // Prefer the direct API.
- if (lang_1.isPresent(typeOrFunc.parameters)) {
- return typeOrFunc.parameters;
- }
- if (lang_1.isPresent(this._reflect) && lang_1.isPresent(this._reflect.getMetadata)) {
- var paramAnnotations = this._reflect.getMetadata('parameters', typeOrFunc);
- var paramTypes = this._reflect.getMetadata('design:paramtypes', typeOrFunc);
- if (lang_1.isPresent(paramTypes) || lang_1.isPresent(paramAnnotations)) {
- return this._zipTypesAndAnnotaions(paramTypes, paramAnnotations);
- }
- }
- // The array has to be filled with `undefined` because holes would be skipped by `some`
- var parameters = new Array(typeOrFunc.length);
- parameters.fill(undefined);
- return parameters;
- };
- ReflectionCapabilities.prototype.annotations = function (typeOrFunc) {
- // Prefer the direct API.
- if (lang_1.isPresent(typeOrFunc.annotations)) {
- var annotations = typeOrFunc.annotations;
- if (lang_1.isFunction(annotations) && annotations.annotations) {
- annotations = annotations.annotations;
- }
- return annotations;
- }
- if (lang_1.isPresent(this._reflect) && lang_1.isPresent(this._reflect.getMetadata)) {
- var annotations = this._reflect.getMetadata('annotations', typeOrFunc);
- if (lang_1.isPresent(annotations))
- return annotations;
- }
- return [];
- };
- ReflectionCapabilities.prototype.propMetadata = function (typeOrFunc) {
- // Prefer the direct API.
- if (lang_1.isPresent(typeOrFunc.propMetadata)) {
- var propMetadata = typeOrFunc.propMetadata;
- if (lang_1.isFunction(propMetadata) && propMetadata.propMetadata) {
- propMetadata = propMetadata.propMetadata;
- }
- return propMetadata;
- }
- if (lang_1.isPresent(this._reflect) && lang_1.isPresent(this._reflect.getMetadata)) {
- var propMetadata = this._reflect.getMetadata('propMetadata', typeOrFunc);
- if (lang_1.isPresent(propMetadata))
- return propMetadata;
- }
- return {};
- };
- ReflectionCapabilities.prototype.interfaces = function (type) {
- throw new exceptions_1.BaseException("JavaScript does not support interfaces");
- };
- ReflectionCapabilities.prototype.getter = function (name) { return new Function('o', 'return o.' + name + ';'); };
- ReflectionCapabilities.prototype.setter = function (name) {
- return new Function('o', 'v', 'return o.' + name + ' = v;');
- };
- ReflectionCapabilities.prototype.method = function (name) {
- var functionBody = "if (!o." + name + ") throw new Error('\"" + name + "\" is undefined');\n return o." + name + ".apply(o, args);";
- return new Function('o', 'args', functionBody);
- };
- // There is not a concept of import uri in Js, but this is useful in developing Dart applications.
- ReflectionCapabilities.prototype.importUri = function (type) { return './'; };
- return ReflectionCapabilities;
- })();
- exports.ReflectionCapabilities = ReflectionCapabilities;
- /***/ },
- /* 19 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var type_literal_1 = __webpack_require__(20);
- var forward_ref_1 = __webpack_require__(10);
- var type_literal_2 = __webpack_require__(20);
- exports.TypeLiteral = type_literal_2.TypeLiteral;
- /**
- * A unique object used for retrieving items from the {@link Injector}.
- *
- * Keys have:
- * - a system-wide unique `id`.
- * - a `token`.
- *
- * `Key` is used internally by {@link Injector} because its system-wide unique `id` allows the
- * injector to store created objects in a more efficient way.
- *
- * `Key` should not be created directly. {@link Injector} creates keys automatically when resolving
- * providers.
- */
- var Key = (function () {
- /**
- * Private
- */
- function Key(token, id) {
- this.token = token;
- this.id = id;
- if (lang_1.isBlank(token)) {
- throw new exceptions_1.BaseException('Token must be defined!');
- }
- }
- Object.defineProperty(Key.prototype, "displayName", {
- /**
- * Returns a stringified token.
- */
- get: function () { return lang_1.stringify(this.token); },
- enumerable: true,
- configurable: true
- });
- /**
- * Retrieves a `Key` for a token.
- */
- Key.get = function (token) { return _globalKeyRegistry.get(forward_ref_1.resolveForwardRef(token)); };
- Object.defineProperty(Key, "numberOfKeys", {
- /**
- * @returns the number of keys registered in the system.
- */
- get: function () { return _globalKeyRegistry.numberOfKeys; },
- enumerable: true,
- configurable: true
- });
- return Key;
- })();
- exports.Key = Key;
- /**
- * @internal
- */
- var KeyRegistry = (function () {
- function KeyRegistry() {
- this._allKeys = new Map();
- }
- KeyRegistry.prototype.get = function (token) {
- if (token instanceof Key)
- return token;
- // TODO: workaround for https://github.com/Microsoft/TypeScript/issues/3123
- var theToken = token;
- if (token instanceof type_literal_1.TypeLiteral) {
- theToken = token.type;
- }
- token = theToken;
- if (this._allKeys.has(token)) {
- return this._allKeys.get(token);
- }
- var newKey = new Key(token, Key.numberOfKeys);
- this._allKeys.set(token, newKey);
- return newKey;
- };
- Object.defineProperty(KeyRegistry.prototype, "numberOfKeys", {
- get: function () { return this._allKeys.size; },
- enumerable: true,
- configurable: true
- });
- return KeyRegistry;
- })();
- exports.KeyRegistry = KeyRegistry;
- var _globalKeyRegistry = new KeyRegistry();
- /***/ },
- /* 20 */
- /***/ function(module, exports) {
- /**
- * Type literals is a Dart-only feature. This is here only so we can x-compile
- * to multiple languages.
- */
- var TypeLiteral = (function () {
- function TypeLiteral() {
- }
- Object.defineProperty(TypeLiteral.prototype, "type", {
- get: function () { throw new Error("Type literals are only supported in Dart"); },
- enumerable: true,
- configurable: true
- });
- return TypeLiteral;
- })();
- exports.TypeLiteral = TypeLiteral;
- /***/ },
- /* 21 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var collection_1 = __webpack_require__(12);
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- function findFirstClosedCycle(keys) {
- var res = [];
- for (var i = 0; i < keys.length; ++i) {
- if (collection_1.ListWrapper.contains(res, keys[i])) {
- res.push(keys[i]);
- return res;
- }
- else {
- res.push(keys[i]);
- }
- }
- return res;
- }
- function constructResolvingPath(keys) {
- if (keys.length > 1) {
- var reversed = findFirstClosedCycle(collection_1.ListWrapper.reversed(keys));
- var tokenStrs = reversed.map(function (k) { return lang_1.stringify(k.token); });
- return " (" + tokenStrs.join(' -> ') + ")";
- }
- else {
- return "";
- }
- }
- /**
- * Base class for all errors arising from misconfigured providers.
- */
- var AbstractProviderError = (function (_super) {
- __extends(AbstractProviderError, _super);
- function AbstractProviderError(injector, key, constructResolvingMessage) {
- _super.call(this, "DI Exception");
- this.keys = [key];
- this.injectors = [injector];
- this.constructResolvingMessage = constructResolvingMessage;
- this.message = this.constructResolvingMessage(this.keys);
- }
- AbstractProviderError.prototype.addKey = function (injector, key) {
- this.injectors.push(injector);
- this.keys.push(key);
- this.message = this.constructResolvingMessage(this.keys);
- };
- Object.defineProperty(AbstractProviderError.prototype, "context", {
- get: function () { return this.injectors[this.injectors.length - 1].debugContext(); },
- enumerable: true,
- configurable: true
- });
- return AbstractProviderError;
- })(exceptions_1.BaseException);
- exports.AbstractProviderError = AbstractProviderError;
- /**
- * Thrown when trying to retrieve a dependency by `Key` from {@link Injector}, but the
- * {@link Injector} does not have a {@link Provider} for {@link Key}.
- *
- * ### Example ([live demo](http://plnkr.co/edit/vq8D3FRB9aGbnWJqtEPE?p=preview))
- *
- * ```typescript
- * class A {
- * constructor(b:B) {}
- * }
- *
- * expect(() => Injector.resolveAndCreate([A])).toThrowError();
- * ```
- */
- var NoProviderError = (function (_super) {
- __extends(NoProviderError, _super);
- function NoProviderError(injector, key) {
- _super.call(this, injector, key, function (keys) {
- var first = lang_1.stringify(collection_1.ListWrapper.first(keys).token);
- return "No provider for " + first + "!" + constructResolvingPath(keys);
- });
- }
- return NoProviderError;
- })(AbstractProviderError);
- exports.NoProviderError = NoProviderError;
- /**
- * Thrown when dependencies form a cycle.
- *
- * ### Example ([live demo](http://plnkr.co/edit/wYQdNos0Tzql3ei1EV9j?p=info))
- *
- * ```typescript
- * var injector = Injector.resolveAndCreate([
- * provide("one", {useFactory: (two) => "two", deps: [[new Inject("two")]]}),
- * provide("two", {useFactory: (one) => "one", deps: [[new Inject("one")]]})
- * ]);
- *
- * expect(() => injector.get("one")).toThrowError();
- * ```
- *
- * Retrieving `A` or `B` throws a `CyclicDependencyError` as the graph above cannot be constructed.
- */
- var CyclicDependencyError = (function (_super) {
- __extends(CyclicDependencyError, _super);
- function CyclicDependencyError(injector, key) {
- _super.call(this, injector, key, function (keys) {
- return "Cannot instantiate cyclic dependency!" + constructResolvingPath(keys);
- });
- }
- return CyclicDependencyError;
- })(AbstractProviderError);
- exports.CyclicDependencyError = CyclicDependencyError;
- /**
- * Thrown when a constructing type returns with an Error.
- *
- * The `InstantiationError` class contains the original error plus the dependency graph which caused
- * this object to be instantiated.
- *
- * ### Example ([live demo](http://plnkr.co/edit/7aWYdcqTQsP0eNqEdUAf?p=preview))
- *
- * ```typescript
- * class A {
- * constructor() {
- * throw new Error('message');
- * }
- * }
- *
- * var injector = Injector.resolveAndCreate([A]);
-
- * try {
- * injector.get(A);
- * } catch (e) {
- * expect(e instanceof InstantiationError).toBe(true);
- * expect(e.originalException.message).toEqual("message");
- * expect(e.originalStack).toBeDefined();
- * }
- * ```
- */
- var InstantiationError = (function (_super) {
- __extends(InstantiationError, _super);
- function InstantiationError(injector, originalException, originalStack, key) {
- _super.call(this, "DI Exception", originalException, originalStack, null);
- this.keys = [key];
- this.injectors = [injector];
- }
- InstantiationError.prototype.addKey = function (injector, key) {
- this.injectors.push(injector);
- this.keys.push(key);
- };
- Object.defineProperty(InstantiationError.prototype, "wrapperMessage", {
- get: function () {
- var first = lang_1.stringify(collection_1.ListWrapper.first(this.keys).token);
- return "Error during instantiation of " + first + "!" + constructResolvingPath(this.keys) + ".";
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(InstantiationError.prototype, "causeKey", {
- get: function () { return this.keys[0]; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(InstantiationError.prototype, "context", {
- get: function () { return this.injectors[this.injectors.length - 1].debugContext(); },
- enumerable: true,
- configurable: true
- });
- return InstantiationError;
- })(exceptions_1.WrappedException);
- exports.InstantiationError = InstantiationError;
- /**
- * Thrown when an object other then {@link Provider} (or `Type`) is passed to {@link Injector}
- * creation.
- *
- * ### Example ([live demo](http://plnkr.co/edit/YatCFbPAMCL0JSSQ4mvH?p=preview))
- *
- * ```typescript
- * expect(() => Injector.resolveAndCreate(["not a type"])).toThrowError();
- * ```
- */
- var InvalidProviderError = (function (_super) {
- __extends(InvalidProviderError, _super);
- function InvalidProviderError(provider) {
- _super.call(this, "Invalid provider - only instances of Provider and Type are allowed, got: " +
- provider.toString());
- }
- return InvalidProviderError;
- })(exceptions_1.BaseException);
- exports.InvalidProviderError = InvalidProviderError;
- /**
- * Thrown when the class has no annotation information.
- *
- * Lack of annotation information prevents the {@link Injector} from determining which dependencies
- * need to be injected into the constructor.
- *
- * ### Example ([live demo](http://plnkr.co/edit/rHnZtlNS7vJOPQ6pcVkm?p=preview))
- *
- * ```typescript
- * class A {
- * constructor(b) {}
- * }
- *
- * expect(() => Injector.resolveAndCreate([A])).toThrowError();
- * ```
- *
- * This error is also thrown when the class not marked with {@link Injectable} has parameter types.
- *
- * ```typescript
- * class B {}
- *
- * class A {
- * constructor(b:B) {} // no information about the parameter types of A is available at runtime.
- * }
- *
- * expect(() => Injector.resolveAndCreate([A,B])).toThrowError();
- * ```
- */
- var NoAnnotationError = (function (_super) {
- __extends(NoAnnotationError, _super);
- function NoAnnotationError(typeOrFunc, params) {
- _super.call(this, NoAnnotationError._genMessage(typeOrFunc, params));
- }
- NoAnnotationError._genMessage = function (typeOrFunc, params) {
- var signature = [];
- for (var i = 0, ii = params.length; i < ii; i++) {
- var parameter = params[i];
- if (lang_1.isBlank(parameter) || parameter.length == 0) {
- signature.push('?');
- }
- else {
- signature.push(parameter.map(lang_1.stringify).join(' '));
- }
- }
- return "Cannot resolve all parameters for " + lang_1.stringify(typeOrFunc) + "(" +
- signature.join(', ') + "). " + 'Make sure they all have valid type or annotations.';
- };
- return NoAnnotationError;
- })(exceptions_1.BaseException);
- exports.NoAnnotationError = NoAnnotationError;
- /**
- * Thrown when getting an object by index.
- *
- * ### Example ([live demo](http://plnkr.co/edit/bRs0SX2OTQiJzqvjgl8P?p=preview))
- *
- * ```typescript
- * class A {}
- *
- * var injector = Injector.resolveAndCreate([A]);
- *
- * expect(() => injector.getAt(100)).toThrowError();
- * ```
- */
- var OutOfBoundsError = (function (_super) {
- __extends(OutOfBoundsError, _super);
- function OutOfBoundsError(index) {
- _super.call(this, "Index " + index + " is out-of-bounds.");
- }
- return OutOfBoundsError;
- })(exceptions_1.BaseException);
- exports.OutOfBoundsError = OutOfBoundsError;
- // TODO: add a working example after alpha38 is released
- /**
- * Thrown when a multi provider and a regular provider are bound to the same token.
- *
- * ### Example
- *
- * ```typescript
- * expect(() => Injector.resolveAndCreate([
- * new Provider("Strings", {useValue: "string1", multi: true}),
- * new Provider("Strings", {useValue: "string2", multi: false})
- * ])).toThrowError();
- * ```
- */
- var MixingMultiProvidersWithRegularProvidersError = (function (_super) {
- __extends(MixingMultiProvidersWithRegularProvidersError, _super);
- function MixingMultiProvidersWithRegularProvidersError(provider1, provider2) {
- _super.call(this, "Cannot mix multi providers and regular providers, got: " + provider1.toString() + " " +
- provider2.toString());
- }
- return MixingMultiProvidersWithRegularProvidersError;
- })(exceptions_1.BaseException);
- exports.MixingMultiProvidersWithRegularProvidersError = MixingMultiProvidersWithRegularProvidersError;
- /***/ },
- /* 22 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var lang_1 = __webpack_require__(5);
- /**
- * Creates a token that can be used in a DI Provider.
- *
- * ### Example ([live demo](http://plnkr.co/edit/Ys9ezXpj2Mnoy3Uc8KBp?p=preview))
- *
- * ```typescript
- * var t = new OpaqueToken("value");
- *
- * var injector = Injector.resolveAndCreate([
- * provide(t, {useValue: "providedValue"})
- * ]);
- *
- * expect(injector.get(t)).toEqual("bindingValue");
- * ```
- *
- * Using an `OpaqueToken` is preferable to using strings as tokens because of possible collisions
- * caused by multiple providers using the same string as two different tokens.
- *
- * Using an `OpaqueToken` is preferable to using an `Object` as tokens because it provides better
- * error messages.
- */
- var OpaqueToken = (function () {
- function OpaqueToken(_desc) {
- this._desc = _desc;
- }
- OpaqueToken.prototype.toString = function () { return "Token " + this._desc; };
- OpaqueToken = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [String])
- ], OpaqueToken);
- return OpaqueToken;
- })();
- exports.OpaqueToken = OpaqueToken;
- /***/ },
- /* 23 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var lang_1 = __webpack_require__(5);
- var metadata_1 = __webpack_require__(7);
- var change_detection_1 = __webpack_require__(24);
- /**
- * Directives allow you to attach behavior to elements in the DOM.
- *
- * {@link DirectiveMetadata}s with an embedded view are called {@link ComponentMetadata}s.
- *
- * A directive consists of a single directive annotation and a controller class. When the
- * directive's `selector` matches
- * elements in the DOM, the following steps occur:
- *
- * 1. For each directive, the `ElementInjector` attempts to resolve the directive's constructor
- * arguments.
- * 2. Angular instantiates directives for each matched element using `ElementInjector` in a
- * depth-first order,
- * as declared in the HTML.
- *
- * ## Understanding How Injection Works
- *
- * There are three stages of injection resolution.
- * - *Pre-existing Injectors*:
- * - The terminal {@link Injector} cannot resolve dependencies. It either throws an error or, if
- * the dependency was
- * specified as `@Optional`, returns `null`.
- * - The platform injector resolves browser singleton resources, such as: cookies, title,
- * location, and others.
- * - *Component Injectors*: Each component instance has its own {@link Injector}, and they follow
- * the same parent-child hierarchy
- * as the component instances in the DOM.
- * - *Element Injectors*: Each component instance has a Shadow DOM. Within the Shadow DOM each
- * element has an `ElementInjector`
- * which follow the same parent-child hierarchy as the DOM elements themselves.
- *
- * When a template is instantiated, it also must instantiate the corresponding directives in a
- * depth-first order. The
- * current `ElementInjector` resolves the constructor dependencies for each directive.
- *
- * Angular then resolves dependencies as follows, according to the order in which they appear in the
- * {@link ViewMetadata}:
- *
- * 1. Dependencies on the current element
- * 2. Dependencies on element injectors and their parents until it encounters a Shadow DOM boundary
- * 3. Dependencies on component injectors and their parents until it encounters the root component
- * 4. Dependencies on pre-existing injectors
- *
- *
- * The `ElementInjector` can inject other directives, element-specific special objects, or it can
- * delegate to the parent
- * injector.
- *
- * To inject other directives, declare the constructor parameter as:
- * - `directive:DirectiveType`: a directive on the current element only
- * - `@Host() directive:DirectiveType`: any directive that matches the type between the current
- * element and the
- * Shadow DOM root.
- * - `@Query(DirectiveType) query:QueryList<DirectiveType>`: A live collection of direct child
- * directives.
- * - `@QueryDescendants(DirectiveType) query:QueryList<DirectiveType>`: A live collection of any
- * child directives.
- *
- * To inject element-specific special objects, declare the constructor parameter as:
- * - `element: ElementRef` to obtain a reference to logical element in the view.
- * - `viewContainer: ViewContainerRef` to control child template instantiation, for
- * {@link DirectiveMetadata} directives only
- * - `bindingPropagation: BindingPropagation` to control change detection in a more granular way.
- *
- * ### Example
- *
- * The following example demonstrates how dependency injection resolves constructor arguments in
- * practice.
- *
- *
- * Assume this HTML template:
- *
- * ```
- * <div dependency="1">
- * <div dependency="2">
- * <div dependency="3" my-directive>
- * <div dependency="4">
- * <div dependency="5"></div>
- * </div>
- * <div dependency="6"></div>
- * </div>
- * </div>
- * </div>
- * ```
- *
- * With the following `dependency` decorator and `SomeService` injectable class.
- *
- * ```
- * @Injectable()
- * class SomeService {
- * }
- *
- * @Directive({
- * selector: '[dependency]',
- * inputs: [
- * 'id: dependency'
- * ]
- * })
- * class Dependency {
- * id:string;
- * }
- * ```
- *
- * Let's step through the different ways in which `MyDirective` could be declared...
- *
- *
- * ### No injection
- *
- * Here the constructor is declared with no arguments, therefore nothing is injected into
- * `MyDirective`.
- *
- * ```
- * @Directive({ selector: '[my-directive]' })
- * class MyDirective {
- * constructor() {
- * }
- * }
- * ```
- *
- * This directive would be instantiated with no dependencies.
- *
- *
- * ### Component-level injection
- *
- * Directives can inject any injectable instance from the closest component injector or any of its
- * parents.
- *
- * Here, the constructor declares a parameter, `someService`, and injects the `SomeService` type
- * from the parent
- * component's injector.
- * ```
- * @Directive({ selector: '[my-directive]' })
- * class MyDirective {
- * constructor(someService: SomeService) {
- * }
- * }
- * ```
- *
- * This directive would be instantiated with a dependency on `SomeService`.
- *
- *
- * ### Injecting a directive from the current element
- *
- * Directives can inject other directives declared on the current element.
- *
- * ```
- * @Directive({ selector: '[my-directive]' })
- * class MyDirective {
- * constructor(dependency: Dependency) {
- * expect(dependency.id).toEqual(3);
- * }
- * }
- * ```
- * This directive would be instantiated with `Dependency` declared at the same element, in this case
- * `dependency="3"`.
- *
- * ### Injecting a directive from any ancestor elements
- *
- * Directives can inject other directives declared on any ancestor element (in the current Shadow
- * DOM), i.e. on the current element, the
- * parent element, or its parents.
- * ```
- * @Directive({ selector: '[my-directive]' })
- * class MyDirective {
- * constructor(@Host() dependency: Dependency) {
- * expect(dependency.id).toEqual(2);
- * }
- * }
- * ```
- *
- * `@Host` checks the current element, the parent, as well as its parents recursively. If
- * `dependency="2"` didn't
- * exist on the direct parent, this injection would
- * have returned
- * `dependency="1"`.
- *
- *
- * ### Injecting a live collection of direct child directives
- *
- *
- * A directive can also query for other child directives. Since parent directives are instantiated
- * before child directives, a directive can't simply inject the list of child directives. Instead,
- * the directive injects a {@link QueryList}, which updates its contents as children are added,
- * removed, or moved by a directive that uses a {@link ViewContainerRef} such as a `ngFor`, an
- * `ngIf`, or an `ngSwitch`.
- *
- * ```
- * @Directive({ selector: '[my-directive]' })
- * class MyDirective {
- * constructor(@Query(Dependency) dependencies:QueryList<Dependency>) {
- * }
- * }
- * ```
- *
- * This directive would be instantiated with a {@link QueryList} which contains `Dependency` 4 and
- * `Dependency` 6. Here, `Dependency` 5 would not be included, because it is not a direct child.
- *
- * ### Injecting a live collection of descendant directives
- *
- * By passing the descendant flag to `@Query` above, we can include the children of the child
- * elements.
- *
- * ```
- * @Directive({ selector: '[my-directive]' })
- * class MyDirective {
- * constructor(@Query(Dependency, {descendants: true}) dependencies:QueryList<Dependency>) {
- * }
- * }
- * ```
- *
- * This directive would be instantiated with a Query which would contain `Dependency` 4, 5 and 6.
- *
- * ### Optional injection
- *
- * The normal behavior of directives is to return an error when a specified dependency cannot be
- * resolved. If you
- * would like to inject `null` on unresolved dependency instead, you can annotate that dependency
- * with `@Optional()`.
- * This explicitly permits the author of a template to treat some of the surrounding directives as
- * optional.
- *
- * ```
- * @Directive({ selector: '[my-directive]' })
- * class MyDirective {
- * constructor(@Optional() dependency:Dependency) {
- * }
- * }
- * ```
- *
- * This directive would be instantiated with a `Dependency` directive found on the current element.
- * If none can be
- * found, the injector supplies `null` instead of throwing an error.
- *
- * ### Example
- *
- * Here we use a decorator directive to simply define basic tool-tip behavior.
- *
- * ```
- * @Directive({
- * selector: '[tooltip]',
- * inputs: [
- * 'text: tooltip'
- * ],
- * host: {
- * '(mouseenter)': 'onMouseEnter()',
- * '(mouseleave)': 'onMouseLeave()'
- * }
- * })
- * class Tooltip{
- * text:string;
- * overlay:Overlay; // NOT YET IMPLEMENTED
- * overlayManager:OverlayManager; // NOT YET IMPLEMENTED
- *
- * constructor(overlayManager:OverlayManager) {
- * this.overlay = overlay;
- * }
- *
- * onMouseEnter() {
- * // exact signature to be determined
- * this.overlay = this.overlayManager.open(text, ...);
- * }
- *
- * onMouseLeave() {
- * this.overlay.close();
- * this.overlay = null;
- * }
- * }
- * ```
- * In our HTML template, we can then add this behavior to a `<div>` or any other element with the
- * `tooltip` selector,
- * like so:
- *
- * ```
- * <div tooltip="some text here"></div>
- * ```
- *
- * Directives can also control the instantiation, destruction, and positioning of inline template
- * elements:
- *
- * A directive uses a {@link ViewContainerRef} to instantiate, insert, move, and destroy views at
- * runtime.
- * The {@link ViewContainerRef} is created as a result of `<template>` element, and represents a
- * location in the current view
- * where these actions are performed.
- *
- * Views are always created as children of the current {@link ViewMetadata}, and as siblings of the
- * `<template>` element. Thus a
- * directive in a child view cannot inject the directive that created it.
- *
- * Since directives that create views via ViewContainers are common in Angular, and using the full
- * `<template>` element syntax is wordy, Angular
- * also supports a shorthand notation: `<li *foo="bar">` and `<li template="foo: bar">` are
- * equivalent.
- *
- * Thus,
- *
- * ```
- * <ul>
- * <li *foo="bar" title="text"></li>
- * </ul>
- * ```
- *
- * Expands in use to:
- *
- * ```
- * <ul>
- * <template [foo]="bar">
- * <li title="text"></li>
- * </template>
- * </ul>
- * ```
- *
- * Notice that although the shorthand places `*foo="bar"` within the `<li>` element, the binding for
- * the directive
- * controller is correctly instantiated on the `<template>` element rather than the `<li>` element.
- *
- * ## Lifecycle hooks
- *
- * When the directive class implements some {@link angular2/lifecycle_hooks} the callbacks are
- * called by the change detection at defined points in time during the life of the directive.
- *
- * ### Example
- *
- * Let's suppose we want to implement the `unless` behavior, to conditionally include a template.
- *
- * Here is a simple directive that triggers on an `unless` selector:
- *
- * ```
- * @Directive({
- * selector: '[unless]',
- * inputs: ['unless']
- * })
- * export class Unless {
- * viewContainer: ViewContainerRef;
- * templateRef: TemplateRef;
- * prevCondition: boolean;
- *
- * constructor(viewContainer: ViewContainerRef, templateRef: TemplateRef) {
- * this.viewContainer = viewContainer;
- * this.templateRef = templateRef;
- * this.prevCondition = null;
- * }
- *
- * set unless(newCondition) {
- * if (newCondition && (isBlank(this.prevCondition) || !this.prevCondition)) {
- * this.prevCondition = true;
- * this.viewContainer.clear();
- * } else if (!newCondition && (isBlank(this.prevCondition) || this.prevCondition)) {
- * this.prevCondition = false;
- * this.viewContainer.create(this.templateRef);
- * }
- * }
- * }
- * ```
- *
- * We can then use this `unless` selector in a template:
- * ```
- * <ul>
- * <li *unless="expr"></li>
- * </ul>
- * ```
- *
- * Once the directive instantiates the child view, the shorthand notation for the template expands
- * and the result is:
- *
- * ```
- * <ul>
- * <template [unless]="exp">
- * <li></li>
- * </template>
- * <li></li>
- * </ul>
- * ```
- *
- * Note also that although the `<li></li>` template still exists inside the `<template></template>`,
- * the instantiated
- * view occurs on the second `<li></li>` which is a sibling to the `<template>` element.
- */
- var DirectiveMetadata = (function (_super) {
- __extends(DirectiveMetadata, _super);
- function DirectiveMetadata(_a) {
- var _b = _a === void 0 ? {} : _a, selector = _b.selector, inputs = _b.inputs, outputs = _b.outputs, properties = _b.properties, events = _b.events, host = _b.host, bindings = _b.bindings, providers = _b.providers, exportAs = _b.exportAs, queries = _b.queries;
- _super.call(this);
- this.selector = selector;
- this._inputs = inputs;
- this._properties = properties;
- this._outputs = outputs;
- this._events = events;
- this.host = host;
- this.exportAs = exportAs;
- this.queries = queries;
- this._providers = providers;
- this._bindings = bindings;
- }
- Object.defineProperty(DirectiveMetadata.prototype, "inputs", {
- /**
- * Enumerates the set of data-bound input properties for a directive
- *
- * Angular automatically updates input properties during change detection.
- *
- * The `inputs` property defines a set of `directiveProperty` to `bindingProperty`
- * configuration:
- *
- * - `directiveProperty` specifies the component property where the value is written.
- * - `bindingProperty` specifies the DOM property where the value is read from.
- *
- * When `bindingProperty` is not provided, it is assumed to be equal to `directiveProperty`.
- *
- * ### Example ([live demo](http://plnkr.co/edit/ivhfXY?p=preview))
- *
- * The following example creates a component with two data-bound properties.
- *
- * ```typescript
- * @Component({
- * selector: 'bank-account',
- * inputs: ['bankName', 'id: account-id'],
- * template: `
- * Bank Name: {{bankName}}
- * Account Id: {{id}}
- * `
- * })
- * class BankAccount {
- * bankName: string;
- * id: string;
- *
- * // this property is not bound, and won't be automatically updated by Angular
- * normalizedBankName: string;
- * }
- *
- * @Component({
- * selector: 'app',
- * template: `
- * <bank-account bank-name="RBC" account-id="4747"></bank-account>
- * `,
- * directives: [BankAccount]
- * })
- * class App {}
- *
- * bootstrap(App);
- * ```
- *
- */
- get: function () {
- return lang_1.isPresent(this._properties) && this._properties.length > 0 ? this._properties :
- this._inputs;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(DirectiveMetadata.prototype, "properties", {
- get: function () { return this.inputs; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(DirectiveMetadata.prototype, "outputs", {
- /**
- * Enumerates the set of event-bound output properties.
- *
- * When an output property emits an event, an event handler attached to that event
- * the template is invoked.
- *
- * The `outputs` property defines a set of `directiveProperty` to `bindingProperty`
- * configuration:
- *
- * - `directiveProperty` specifies the component property that emits events.
- * - `bindingProperty` specifies the DOM property the event handler is attached to.
- *
- * ### Example ([live demo](http://plnkr.co/edit/d5CNq7?p=preview))
- *
- * ```typescript
- * @Directive({
- * selector: 'interval-dir',
- * outputs: ['everySecond', 'five5Secs: everyFiveSeconds']
- * })
- * class IntervalDir {
- * everySecond = new EventEmitter();
- * five5Secs = new EventEmitter();
- *
- * constructor() {
- * setInterval(() => this.everySecond.emit("event"), 1000);
- * setInterval(() => this.five5Secs.emit("event"), 5000);
- * }
- * }
- *
- * @Component({
- * selector: 'app',
- * template: `
- * <interval-dir (every-second)="everySecond()" (every-five-seconds)="everyFiveSeconds()">
- * </interval-dir>
- * `,
- * directives: [IntervalDir]
- * })
- * class App {
- * everySecond() { console.log('second'); }
- * everyFiveSeconds() { console.log('five seconds'); }
- * }
- * bootstrap(App);
- * ```
- *
- */
- get: function () {
- return lang_1.isPresent(this._events) && this._events.length > 0 ? this._events : this._outputs;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(DirectiveMetadata.prototype, "events", {
- get: function () { return this.outputs; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(DirectiveMetadata.prototype, "providers", {
- /**
- * Defines the set of injectable objects that are visible to a Directive and its light DOM
- * children.
- *
- * ## Simple Example
- *
- * Here is an example of a class that can be injected:
- *
- * ```
- * class Greeter {
- * greet(name:string) {
- * return 'Hello ' + name + '!';
- * }
- * }
- *
- * @Directive({
- * selector: 'greet',
- * bindings: [
- * Greeter
- * ]
- * })
- * class HelloWorld {
- * greeter:Greeter;
- *
- * constructor(greeter:Greeter) {
- * this.greeter = greeter;
- * }
- * }
- * ```
- */
- get: function () {
- return lang_1.isPresent(this._bindings) && this._bindings.length > 0 ? this._bindings :
- this._providers;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(DirectiveMetadata.prototype, "bindings", {
- /** @deprecated */
- get: function () { return this.providers; },
- enumerable: true,
- configurable: true
- });
- DirectiveMetadata = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [Object])
- ], DirectiveMetadata);
- return DirectiveMetadata;
- })(metadata_1.InjectableMetadata);
- exports.DirectiveMetadata = DirectiveMetadata;
- /**
- * Declare reusable UI building blocks for an application.
- *
- * Each Angular component requires a single `@Component` annotation. The
- * `@Component`
- * annotation specifies when a component is instantiated, and which properties and hostListeners it
- * binds to.
- *
- * When a component is instantiated, Angular
- * - creates a shadow DOM for the component.
- * - loads the selected template into the shadow DOM.
- * - creates all the injectable objects configured with `providers` and `viewProviders`.
- *
- * All template expressions and statements are then evaluated against the component instance.
- *
- * For details on the `@View` annotation, see {@link ViewMetadata}.
- *
- * ## Lifecycle hooks
- *
- * When the component class implements some {@link angular2/lifecycle_hooks} the callbacks are
- * called by the change detection at defined points in time during the life of the component.
- *
- * ### Example
- *
- * {@example core/ts/metadata/metadata.ts region='component'}
- */
- var ComponentMetadata = (function (_super) {
- __extends(ComponentMetadata, _super);
- function ComponentMetadata(_a) {
- var _b = _a === void 0 ? {} : _a, selector = _b.selector, inputs = _b.inputs, outputs = _b.outputs, properties = _b.properties, events = _b.events, host = _b.host, exportAs = _b.exportAs, moduleId = _b.moduleId, bindings = _b.bindings, providers = _b.providers, viewBindings = _b.viewBindings, viewProviders = _b.viewProviders, _c = _b.changeDetection, changeDetection = _c === void 0 ? change_detection_1.ChangeDetectionStrategy.Default : _c, queries = _b.queries, templateUrl = _b.templateUrl, template = _b.template, styleUrls = _b.styleUrls, styles = _b.styles, directives = _b.directives, pipes = _b.pipes, encapsulation = _b.encapsulation;
- _super.call(this, {
- selector: selector,
- inputs: inputs,
- outputs: outputs,
- properties: properties,
- events: events,
- host: host,
- exportAs: exportAs,
- bindings: bindings,
- providers: providers,
- queries: queries
- });
- this.changeDetection = changeDetection;
- this._viewProviders = viewProviders;
- this._viewBindings = viewBindings;
- this.templateUrl = templateUrl;
- this.template = template;
- this.styleUrls = styleUrls;
- this.styles = styles;
- this.directives = directives;
- this.pipes = pipes;
- this.encapsulation = encapsulation;
- this.moduleId = moduleId;
- }
- Object.defineProperty(ComponentMetadata.prototype, "viewProviders", {
- /**
- * Defines the set of injectable objects that are visible to its view DOM children.
- *
- * ## Simple Example
- *
- * Here is an example of a class that can be injected:
- *
- * ```
- * class Greeter {
- * greet(name:string) {
- * return 'Hello ' + name + '!';
- * }
- * }
- *
- * @Directive({
- * selector: 'needs-greeter'
- * })
- * class NeedsGreeter {
- * greeter:Greeter;
- *
- * constructor(greeter:Greeter) {
- * this.greeter = greeter;
- * }
- * }
- *
- * @Component({
- * selector: 'greet',
- * viewProviders: [
- * Greeter
- * ],
- * template: `<needs-greeter></needs-greeter>`,
- * directives: [NeedsGreeter]
- * })
- * class HelloWorld {
- * }
- *
- * ```
- */
- get: function () {
- return lang_1.isPresent(this._viewBindings) && this._viewBindings.length > 0 ? this._viewBindings :
- this._viewProviders;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(ComponentMetadata.prototype, "viewBindings", {
- get: function () { return this.viewProviders; },
- enumerable: true,
- configurable: true
- });
- ComponentMetadata = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [Object])
- ], ComponentMetadata);
- return ComponentMetadata;
- })(DirectiveMetadata);
- exports.ComponentMetadata = ComponentMetadata;
- /**
- * Declare reusable pipe function.
- *
- * A "pure" pipe is only re-evaluated when either the input or any of the arguments change.
- *
- * When not specified, pipes default to being pure.
- *
- * ### Example
- *
- * {@example core/ts/metadata/metadata.ts region='pipe'}
- */
- var PipeMetadata = (function (_super) {
- __extends(PipeMetadata, _super);
- function PipeMetadata(_a) {
- var name = _a.name, pure = _a.pure;
- _super.call(this);
- this.name = name;
- this._pure = pure;
- }
- Object.defineProperty(PipeMetadata.prototype, "pure", {
- get: function () { return lang_1.isPresent(this._pure) ? this._pure : true; },
- enumerable: true,
- configurable: true
- });
- PipeMetadata = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [Object])
- ], PipeMetadata);
- return PipeMetadata;
- })(metadata_1.InjectableMetadata);
- exports.PipeMetadata = PipeMetadata;
- /**
- * Declares a data-bound input property.
- *
- * Angular automatically updates data-bound properties during change detection.
- *
- * `InputMetadata` takes an optional parameter that specifies the name
- * used when instantiating a component in the template. When not provided,
- * the name of the decorated property is used.
- *
- * ### Example
- *
- * The following example creates a component with two input properties.
- *
- * ```typescript
- * @Component({
- * selector: 'bank-account',
- * template: `
- * Bank Name: {{bankName}}
- * Account Id: {{id}}
- * `
- * })
- * class BankAccount {
- * @Input() bankName: string;
- * @Input('account-id') id: string;
- *
- * // this property is not bound, and won't be automatically updated by Angular
- * normalizedBankName: string;
- * }
- *
- * @Component({
- * selector: 'app',
- * template: `
- * <bank-account bank-name="RBC" account-id="4747"></bank-account>
- * `,
- * directives: [BankAccount]
- * })
- * class App {}
- *
- * bootstrap(App);
- * ```
- */
- var InputMetadata = (function () {
- function InputMetadata(
- /**
- * Name used when instantiating a component in the temlate.
- */
- bindingPropertyName) {
- this.bindingPropertyName = bindingPropertyName;
- }
- InputMetadata = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [String])
- ], InputMetadata);
- return InputMetadata;
- })();
- exports.InputMetadata = InputMetadata;
- /**
- * Declares an event-bound output property.
- *
- * When an output property emits an event, an event handler attached to that event
- * the template is invoked.
- *
- * `OutputMetadata` takes an optional parameter that specifies the name
- * used when instantiating a component in the template. When not provided,
- * the name of the decorated property is used.
- *
- * ### Example
- *
- * ```typescript
- * @Directive({
- * selector: 'interval-dir',
- * })
- * class IntervalDir {
- * @Output() everySecond = new EventEmitter();
- * @Output('everyFiveSeconds') five5Secs = new EventEmitter();
- *
- * constructor() {
- * setInterval(() => this.everySecond.emit("event"), 1000);
- * setInterval(() => this.five5Secs.emit("event"), 5000);
- * }
- * }
- *
- * @Component({
- * selector: 'app',
- * template: `
- * <interval-dir (every-second)="everySecond()" (every-five-seconds)="everyFiveSeconds()">
- * </interval-dir>
- * `,
- * directives: [IntervalDir]
- * })
- * class App {
- * everySecond() { console.log('second'); }
- * everyFiveSeconds() { console.log('five seconds'); }
- * }
- * bootstrap(App);
- * ```
- */
- var OutputMetadata = (function () {
- function OutputMetadata(bindingPropertyName) {
- this.bindingPropertyName = bindingPropertyName;
- }
- OutputMetadata = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [String])
- ], OutputMetadata);
- return OutputMetadata;
- })();
- exports.OutputMetadata = OutputMetadata;
- /**
- * Declares a host property binding.
- *
- * Angular automatically checks host property bindings during change detection.
- * If a binding changes, it will update the host element of the directive.
- *
- * `HostBindingMetadata` takes an optional parameter that specifies the property
- * name of the host element that will be updated. When not provided,
- * the class property name is used.
- *
- * ### Example
- *
- * The following example creates a directive that sets the `valid` and `invalid` classes
- * on the DOM element that has ngModel directive on it.
- *
- * ```typescript
- * @Directive({selector: '[ngModel]'})
- * class NgModelStatus {
- * constructor(public control:NgModel) {}
- * @HostBinding('[class.valid]') get valid { return this.control.valid; }
- * @HostBinding('[class.invalid]') get invalid { return this.control.invalid; }
- * }
- *
- * @Component({
- * selector: 'app',
- * template: `<input [(ngModel)]="prop">`,
- * directives: [FORM_DIRECTIVES, NgModelStatus]
- * })
- * class App {
- * prop;
- * }
- *
- * bootstrap(App);
- * ```
- */
- var HostBindingMetadata = (function () {
- function HostBindingMetadata(hostPropertyName) {
- this.hostPropertyName = hostPropertyName;
- }
- HostBindingMetadata = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [String])
- ], HostBindingMetadata);
- return HostBindingMetadata;
- })();
- exports.HostBindingMetadata = HostBindingMetadata;
- /**
- * Declares a host listener.
- *
- * Angular will invoke the decorated method when the host element emits the specified event.
- *
- * If the decorated method returns `false`, then `preventDefault` is applied on the DOM
- * event.
- *
- * ### Example
- *
- * The following example declares a directive that attaches a click listener to the button and
- * counts clicks.
- *
- * ```typescript
- * @Directive({selector: 'button[counting]'})
- * class CountClicks {
- * numberOfClicks = 0;
- *
- * @HostListener('click', ['$event.target'])
- * onClick(btn) {
- * console.log("button", btn, "number of clicks:", this.numberOfClicks++);
- * }
- * }
- *
- * @Component({
- * selector: 'app',
- * template: `<button counting>Increment</button>`,
- * directives: [CountClicks]
- * })
- * class App {}
- *
- * bootstrap(App);
- * ```
- */
- var HostListenerMetadata = (function () {
- function HostListenerMetadata(eventName, args) {
- this.eventName = eventName;
- this.args = args;
- }
- HostListenerMetadata = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [String, Array])
- ], HostListenerMetadata);
- return HostListenerMetadata;
- })();
- exports.HostListenerMetadata = HostListenerMetadata;
- /***/ },
- /* 24 */
- /***/ function(module, exports, __webpack_require__) {
- /**
- * @module
- * @description
- * Change detection enables data binding in Angular.
- */
- var change_detection_1 = __webpack_require__(25);
- exports.ChangeDetectionStrategy = change_detection_1.ChangeDetectionStrategy;
- exports.ExpressionChangedAfterItHasBeenCheckedException = change_detection_1.ExpressionChangedAfterItHasBeenCheckedException;
- exports.ChangeDetectionError = change_detection_1.ChangeDetectionError;
- exports.ChangeDetectorRef = change_detection_1.ChangeDetectorRef;
- exports.WrappedValue = change_detection_1.WrappedValue;
- exports.SimpleChange = change_detection_1.SimpleChange;
- exports.IterableDiffers = change_detection_1.IterableDiffers;
- exports.KeyValueDiffers = change_detection_1.KeyValueDiffers;
- /***/ },
- /* 25 */
- /***/ function(module, exports, __webpack_require__) {
- var iterable_differs_1 = __webpack_require__(26);
- var default_iterable_differ_1 = __webpack_require__(27);
- var keyvalue_differs_1 = __webpack_require__(28);
- var default_keyvalue_differ_1 = __webpack_require__(29);
- var lang_1 = __webpack_require__(5);
- var ast_1 = __webpack_require__(30);
- exports.ASTWithSource = ast_1.ASTWithSource;
- exports.AST = ast_1.AST;
- exports.AstTransformer = ast_1.AstTransformer;
- exports.PropertyRead = ast_1.PropertyRead;
- exports.LiteralArray = ast_1.LiteralArray;
- exports.ImplicitReceiver = ast_1.ImplicitReceiver;
- var lexer_1 = __webpack_require__(31);
- exports.Lexer = lexer_1.Lexer;
- var parser_1 = __webpack_require__(32);
- exports.Parser = parser_1.Parser;
- var locals_1 = __webpack_require__(33);
- exports.Locals = locals_1.Locals;
- var exceptions_1 = __webpack_require__(34);
- exports.DehydratedException = exceptions_1.DehydratedException;
- exports.ExpressionChangedAfterItHasBeenCheckedException = exceptions_1.ExpressionChangedAfterItHasBeenCheckedException;
- exports.ChangeDetectionError = exceptions_1.ChangeDetectionError;
- var interfaces_1 = __webpack_require__(35);
- exports.ChangeDetectorDefinition = interfaces_1.ChangeDetectorDefinition;
- exports.DebugContext = interfaces_1.DebugContext;
- exports.ChangeDetectorGenConfig = interfaces_1.ChangeDetectorGenConfig;
- var constants_1 = __webpack_require__(36);
- exports.ChangeDetectionStrategy = constants_1.ChangeDetectionStrategy;
- exports.CHANGE_DETECTION_STRATEGY_VALUES = constants_1.CHANGE_DETECTION_STRATEGY_VALUES;
- var proto_change_detector_1 = __webpack_require__(37);
- exports.DynamicProtoChangeDetector = proto_change_detector_1.DynamicProtoChangeDetector;
- var jit_proto_change_detector_1 = __webpack_require__(51);
- exports.JitProtoChangeDetector = jit_proto_change_detector_1.JitProtoChangeDetector;
- var binding_record_1 = __webpack_require__(40);
- exports.BindingRecord = binding_record_1.BindingRecord;
- exports.BindingTarget = binding_record_1.BindingTarget;
- var directive_record_1 = __webpack_require__(41);
- exports.DirectiveIndex = directive_record_1.DirectiveIndex;
- exports.DirectiveRecord = directive_record_1.DirectiveRecord;
- var dynamic_change_detector_1 = __webpack_require__(42);
- exports.DynamicChangeDetector = dynamic_change_detector_1.DynamicChangeDetector;
- var change_detector_ref_1 = __webpack_require__(44);
- exports.ChangeDetectorRef = change_detector_ref_1.ChangeDetectorRef;
- var iterable_differs_2 = __webpack_require__(26);
- exports.IterableDiffers = iterable_differs_2.IterableDiffers;
- var keyvalue_differs_2 = __webpack_require__(28);
- exports.KeyValueDiffers = keyvalue_differs_2.KeyValueDiffers;
- var change_detection_util_1 = __webpack_require__(38);
- exports.WrappedValue = change_detection_util_1.WrappedValue;
- exports.SimpleChange = change_detection_util_1.SimpleChange;
- /**
- * Structural diffing for `Object`s and `Map`s.
- */
- exports.keyValDiff = lang_1.CONST_EXPR([lang_1.CONST_EXPR(new default_keyvalue_differ_1.DefaultKeyValueDifferFactory())]);
- /**
- * Structural diffing for `Iterable` types such as `Array`s.
- */
- exports.iterableDiff = lang_1.CONST_EXPR([lang_1.CONST_EXPR(new default_iterable_differ_1.DefaultIterableDifferFactory())]);
- exports.defaultIterableDiffers = lang_1.CONST_EXPR(new iterable_differs_1.IterableDiffers(exports.iterableDiff));
- exports.defaultKeyValueDiffers = lang_1.CONST_EXPR(new keyvalue_differs_1.KeyValueDiffers(exports.keyValDiff));
- /***/ },
- /* 26 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var collection_1 = __webpack_require__(12);
- var di_1 = __webpack_require__(6);
- /**
- * A repository of different iterable diffing strategies used by NgFor, NgClass, and others.
- */
- var IterableDiffers = (function () {
- function IterableDiffers(factories) {
- this.factories = factories;
- }
- IterableDiffers.create = function (factories, parent) {
- if (lang_1.isPresent(parent)) {
- var copied = collection_1.ListWrapper.clone(parent.factories);
- factories = factories.concat(copied);
- return new IterableDiffers(factories);
- }
- else {
- return new IterableDiffers(factories);
- }
- };
- /**
- * Takes an array of {@link IterableDifferFactory} and returns a provider used to extend the
- * inherited {@link IterableDiffers} instance with the provided factories and return a new
- * {@link IterableDiffers} instance.
- *
- * The following example shows how to extend an existing list of factories,
- * which will only be applied to the injector for this component and its children.
- * This step is all that's required to make a new {@link IterableDiffer} available.
- *
- * ### Example
- *
- * ```
- * @Component({
- * viewProviders: [
- * IterableDiffers.extend([new ImmutableListDiffer()])
- * ]
- * })
- * ```
- */
- IterableDiffers.extend = function (factories) {
- return new di_1.Provider(IterableDiffers, {
- useFactory: function (parent) {
- if (lang_1.isBlank(parent)) {
- // Typically would occur when calling IterableDiffers.extend inside of dependencies passed
- // to
- // bootstrap(), which would override default pipes instead of extending them.
- throw new exceptions_1.BaseException('Cannot extend IterableDiffers without a parent injector');
- }
- return IterableDiffers.create(factories, parent);
- },
- // Dependency technically isn't optional, but we can provide a better error message this way.
- deps: [[IterableDiffers, new di_1.SkipSelfMetadata(), new di_1.OptionalMetadata()]]
- });
- };
- IterableDiffers.prototype.find = function (iterable) {
- var factory = this.factories.find(function (f) { return f.supports(iterable); });
- if (lang_1.isPresent(factory)) {
- return factory;
- }
- else {
- throw new exceptions_1.BaseException("Cannot find a differ supporting object '" + iterable + "'");
- }
- };
- IterableDiffers = __decorate([
- di_1.Injectable(),
- lang_1.CONST(),
- __metadata('design:paramtypes', [Array])
- ], IterableDiffers);
- return IterableDiffers;
- })();
- exports.IterableDiffers = IterableDiffers;
- /***/ },
- /* 27 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var collection_1 = __webpack_require__(12);
- var lang_2 = __webpack_require__(5);
- var DefaultIterableDifferFactory = (function () {
- function DefaultIterableDifferFactory() {
- }
- DefaultIterableDifferFactory.prototype.supports = function (obj) { return collection_1.isListLikeIterable(obj); };
- DefaultIterableDifferFactory.prototype.create = function (cdRef) { return new DefaultIterableDiffer(); };
- DefaultIterableDifferFactory = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [])
- ], DefaultIterableDifferFactory);
- return DefaultIterableDifferFactory;
- })();
- exports.DefaultIterableDifferFactory = DefaultIterableDifferFactory;
- var DefaultIterableDiffer = (function () {
- function DefaultIterableDiffer() {
- this._collection = null;
- this._length = null;
- // Keeps track of the used records at any point in time (during & across `_check()` calls)
- this._linkedRecords = null;
- // Keeps track of the removed records at any point in time during `_check()` calls.
- this._unlinkedRecords = null;
- this._previousItHead = null;
- this._itHead = null;
- this._itTail = null;
- this._additionsHead = null;
- this._additionsTail = null;
- this._movesHead = null;
- this._movesTail = null;
- this._removalsHead = null;
- this._removalsTail = null;
- }
- Object.defineProperty(DefaultIterableDiffer.prototype, "collection", {
- get: function () { return this._collection; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(DefaultIterableDiffer.prototype, "length", {
- get: function () { return this._length; },
- enumerable: true,
- configurable: true
- });
- DefaultIterableDiffer.prototype.forEachItem = function (fn) {
- var record;
- for (record = this._itHead; record !== null; record = record._next) {
- fn(record);
- }
- };
- DefaultIterableDiffer.prototype.forEachPreviousItem = function (fn) {
- var record;
- for (record = this._previousItHead; record !== null; record = record._nextPrevious) {
- fn(record);
- }
- };
- DefaultIterableDiffer.prototype.forEachAddedItem = function (fn) {
- var record;
- for (record = this._additionsHead; record !== null; record = record._nextAdded) {
- fn(record);
- }
- };
- DefaultIterableDiffer.prototype.forEachMovedItem = function (fn) {
- var record;
- for (record = this._movesHead; record !== null; record = record._nextMoved) {
- fn(record);
- }
- };
- DefaultIterableDiffer.prototype.forEachRemovedItem = function (fn) {
- var record;
- for (record = this._removalsHead; record !== null; record = record._nextRemoved) {
- fn(record);
- }
- };
- DefaultIterableDiffer.prototype.diff = function (collection) {
- if (lang_2.isBlank(collection))
- collection = [];
- if (!collection_1.isListLikeIterable(collection)) {
- throw new exceptions_1.BaseException("Error trying to diff '" + collection + "'");
- }
- if (this.check(collection)) {
- return this;
- }
- else {
- return null;
- }
- };
- DefaultIterableDiffer.prototype.onDestroy = function () { };
- // todo(vicb): optim for UnmodifiableListView (frozen arrays)
- DefaultIterableDiffer.prototype.check = function (collection) {
- var _this = this;
- this._reset();
- var record = this._itHead;
- var mayBeDirty = false;
- var index;
- var item;
- if (lang_2.isArray(collection)) {
- var list = collection;
- this._length = collection.length;
- for (index = 0; index < this._length; index++) {
- item = list[index];
- if (record === null || !lang_2.looseIdentical(record.item, item)) {
- record = this._mismatch(record, item, index);
- mayBeDirty = true;
- }
- else if (mayBeDirty) {
- // TODO(misko): can we limit this to duplicates only?
- record = this._verifyReinsertion(record, item, index);
- }
- record = record._next;
- }
- }
- else {
- index = 0;
- collection_1.iterateListLike(collection, function (item) {
- if (record === null || !lang_2.looseIdentical(record.item, item)) {
- record = _this._mismatch(record, item, index);
- mayBeDirty = true;
- }
- else if (mayBeDirty) {
- // TODO(misko): can we limit this to duplicates only?
- record = _this._verifyReinsertion(record, item, index);
- }
- record = record._next;
- index++;
- });
- this._length = index;
- }
- this._truncate(record);
- this._collection = collection;
- return this.isDirty;
- };
- Object.defineProperty(DefaultIterableDiffer.prototype, "isDirty", {
- // CollectionChanges is considered dirty if it has any additions, moves or removals.
- get: function () {
- return this._additionsHead !== null || this._movesHead !== null || this._removalsHead !== null;
- },
- enumerable: true,
- configurable: true
- });
- /**
- * Reset the state of the change objects to show no changes. This means set previousKey to
- * currentKey, and clear all of the queues (additions, moves, removals).
- * Set the previousIndexes of moved and added items to their currentIndexes
- * Reset the list of additions, moves and removals
- *
- * @internal
- */
- DefaultIterableDiffer.prototype._reset = function () {
- if (this.isDirty) {
- var record;
- var nextRecord;
- for (record = this._previousItHead = this._itHead; record !== null; record = record._next) {
- record._nextPrevious = record._next;
- }
- for (record = this._additionsHead; record !== null; record = record._nextAdded) {
- record.previousIndex = record.currentIndex;
- }
- this._additionsHead = this._additionsTail = null;
- for (record = this._movesHead; record !== null; record = nextRecord) {
- record.previousIndex = record.currentIndex;
- nextRecord = record._nextMoved;
- }
- this._movesHead = this._movesTail = null;
- this._removalsHead = this._removalsTail = null;
- }
- };
- /**
- * This is the core function which handles differences between collections.
- *
- * - `record` is the record which we saw at this position last time. If null then it is a new
- * item.
- * - `item` is the current item in the collection
- * - `index` is the position of the item in the collection
- *
- * @internal
- */
- DefaultIterableDiffer.prototype._mismatch = function (record, item, index) {
- // The previous record after which we will append the current one.
- var previousRecord;
- if (record === null) {
- previousRecord = this._itTail;
- }
- else {
- previousRecord = record._prev;
- // Remove the record from the collection since we know it does not match the item.
- this._remove(record);
- }
- // Attempt to see if we have seen the item before.
- record = this._linkedRecords === null ? null : this._linkedRecords.get(item, index);
- if (record !== null) {
- // We have seen this before, we need to move it forward in the collection.
- this._moveAfter(record, previousRecord, index);
- }
- else {
- // Never seen it, check evicted list.
- record = this._unlinkedRecords === null ? null : this._unlinkedRecords.get(item);
- if (record !== null) {
- // It is an item which we have evicted earlier: reinsert it back into the list.
- this._reinsertAfter(record, previousRecord, index);
- }
- else {
- // It is a new item: add it.
- record = this._addAfter(new CollectionChangeRecord(item), previousRecord, index);
- }
- }
- return record;
- };
- /**
- * This check is only needed if an array contains duplicates. (Short circuit of nothing dirty)
- *
- * Use case: `[a, a]` => `[b, a, a]`
- *
- * If we did not have this check then the insertion of `b` would:
- * 1) evict first `a`
- * 2) insert `b` at `0` index.
- * 3) leave `a` at index `1` as is. <-- this is wrong!
- * 3) reinsert `a` at index 2. <-- this is wrong!
- *
- * The correct behavior is:
- * 1) evict first `a`
- * 2) insert `b` at `0` index.
- * 3) reinsert `a` at index 1.
- * 3) move `a` at from `1` to `2`.
- *
- *
- * Double check that we have not evicted a duplicate item. We need to check if the item type may
- * have already been removed:
- * The insertion of b will evict the first 'a'. If we don't reinsert it now it will be reinserted
- * at the end. Which will show up as the two 'a's switching position. This is incorrect, since a
- * better way to think of it is as insert of 'b' rather then switch 'a' with 'b' and then add 'a'
- * at the end.
- *
- * @internal
- */
- DefaultIterableDiffer.prototype._verifyReinsertion = function (record, item, index) {
- var reinsertRecord = this._unlinkedRecords === null ? null : this._unlinkedRecords.get(item);
- if (reinsertRecord !== null) {
- record = this._reinsertAfter(reinsertRecord, record._prev, index);
- }
- else if (record.currentIndex != index) {
- record.currentIndex = index;
- this._addToMoves(record, index);
- }
- return record;
- };
- /**
- * Get rid of any excess {@link CollectionChangeRecord}s from the previous collection
- *
- * - `record` The first excess {@link CollectionChangeRecord}.
- *
- * @internal
- */
- DefaultIterableDiffer.prototype._truncate = function (record) {
- // Anything after that needs to be removed;
- while (record !== null) {
- var nextRecord = record._next;
- this._addToRemovals(this._unlink(record));
- record = nextRecord;
- }
- if (this._unlinkedRecords !== null) {
- this._unlinkedRecords.clear();
- }
- if (this._additionsTail !== null) {
- this._additionsTail._nextAdded = null;
- }
- if (this._movesTail !== null) {
- this._movesTail._nextMoved = null;
- }
- if (this._itTail !== null) {
- this._itTail._next = null;
- }
- if (this._removalsTail !== null) {
- this._removalsTail._nextRemoved = null;
- }
- };
- /** @internal */
- DefaultIterableDiffer.prototype._reinsertAfter = function (record, prevRecord, index) {
- if (this._unlinkedRecords !== null) {
- this._unlinkedRecords.remove(record);
- }
- var prev = record._prevRemoved;
- var next = record._nextRemoved;
- if (prev === null) {
- this._removalsHead = next;
- }
- else {
- prev._nextRemoved = next;
- }
- if (next === null) {
- this._removalsTail = prev;
- }
- else {
- next._prevRemoved = prev;
- }
- this._insertAfter(record, prevRecord, index);
- this._addToMoves(record, index);
- return record;
- };
- /** @internal */
- DefaultIterableDiffer.prototype._moveAfter = function (record, prevRecord, index) {
- this._unlink(record);
- this._insertAfter(record, prevRecord, index);
- this._addToMoves(record, index);
- return record;
- };
- /** @internal */
- DefaultIterableDiffer.prototype._addAfter = function (record, prevRecord, index) {
- this._insertAfter(record, prevRecord, index);
- if (this._additionsTail === null) {
- // todo(vicb)
- // assert(this._additionsHead === null);
- this._additionsTail = this._additionsHead = record;
- }
- else {
- // todo(vicb)
- // assert(_additionsTail._nextAdded === null);
- // assert(record._nextAdded === null);
- this._additionsTail = this._additionsTail._nextAdded = record;
- }
- return record;
- };
- /** @internal */
- DefaultIterableDiffer.prototype._insertAfter = function (record, prevRecord, index) {
- // todo(vicb)
- // assert(record != prevRecord);
- // assert(record._next === null);
- // assert(record._prev === null);
- var next = prevRecord === null ? this._itHead : prevRecord._next;
- // todo(vicb)
- // assert(next != record);
- // assert(prevRecord != record);
- record._next = next;
- record._prev = prevRecord;
- if (next === null) {
- this._itTail = record;
- }
- else {
- next._prev = record;
- }
- if (prevRecord === null) {
- this._itHead = record;
- }
- else {
- prevRecord._next = record;
- }
- if (this._linkedRecords === null) {
- this._linkedRecords = new _DuplicateMap();
- }
- this._linkedRecords.put(record);
- record.currentIndex = index;
- return record;
- };
- /** @internal */
- DefaultIterableDiffer.prototype._remove = function (record) {
- return this._addToRemovals(this._unlink(record));
- };
- /** @internal */
- DefaultIterableDiffer.prototype._unlink = function (record) {
- if (this._linkedRecords !== null) {
- this._linkedRecords.remove(record);
- }
- var prev = record._prev;
- var next = record._next;
- // todo(vicb)
- // assert((record._prev = null) === null);
- // assert((record._next = null) === null);
- if (prev === null) {
- this._itHead = next;
- }
- else {
- prev._next = next;
- }
- if (next === null) {
- this._itTail = prev;
- }
- else {
- next._prev = prev;
- }
- return record;
- };
- /** @internal */
- DefaultIterableDiffer.prototype._addToMoves = function (record, toIndex) {
- // todo(vicb)
- // assert(record._nextMoved === null);
- if (record.previousIndex === toIndex) {
- return record;
- }
- if (this._movesTail === null) {
- // todo(vicb)
- // assert(_movesHead === null);
- this._movesTail = this._movesHead = record;
- }
- else {
- // todo(vicb)
- // assert(_movesTail._nextMoved === null);
- this._movesTail = this._movesTail._nextMoved = record;
- }
- return record;
- };
- /** @internal */
- DefaultIterableDiffer.prototype._addToRemovals = function (record) {
- if (this._unlinkedRecords === null) {
- this._unlinkedRecords = new _DuplicateMap();
- }
- this._unlinkedRecords.put(record);
- record.currentIndex = null;
- record._nextRemoved = null;
- if (this._removalsTail === null) {
- // todo(vicb)
- // assert(_removalsHead === null);
- this._removalsTail = this._removalsHead = record;
- record._prevRemoved = null;
- }
- else {
- // todo(vicb)
- // assert(_removalsTail._nextRemoved === null);
- // assert(record._nextRemoved === null);
- record._prevRemoved = this._removalsTail;
- this._removalsTail = this._removalsTail._nextRemoved = record;
- }
- return record;
- };
- DefaultIterableDiffer.prototype.toString = function () {
- var record;
- var list = [];
- for (record = this._itHead; record !== null; record = record._next) {
- list.push(record);
- }
- var previous = [];
- for (record = this._previousItHead; record !== null; record = record._nextPrevious) {
- previous.push(record);
- }
- var additions = [];
- for (record = this._additionsHead; record !== null; record = record._nextAdded) {
- additions.push(record);
- }
- var moves = [];
- for (record = this._movesHead; record !== null; record = record._nextMoved) {
- moves.push(record);
- }
- var removals = [];
- for (record = this._removalsHead; record !== null; record = record._nextRemoved) {
- removals.push(record);
- }
- return "collection: " + list.join(', ') + "\n" + "previous: " + previous.join(', ') + "\n" +
- "additions: " + additions.join(', ') + "\n" + "moves: " + moves.join(', ') + "\n" +
- "removals: " + removals.join(', ') + "\n";
- };
- return DefaultIterableDiffer;
- })();
- exports.DefaultIterableDiffer = DefaultIterableDiffer;
- var CollectionChangeRecord = (function () {
- function CollectionChangeRecord(item) {
- this.item = item;
- this.currentIndex = null;
- this.previousIndex = null;
- /** @internal */
- this._nextPrevious = null;
- /** @internal */
- this._prev = null;
- /** @internal */
- this._next = null;
- /** @internal */
- this._prevDup = null;
- /** @internal */
- this._nextDup = null;
- /** @internal */
- this._prevRemoved = null;
- /** @internal */
- this._nextRemoved = null;
- /** @internal */
- this._nextAdded = null;
- /** @internal */
- this._nextMoved = null;
- }
- CollectionChangeRecord.prototype.toString = function () {
- return this.previousIndex === this.currentIndex ?
- lang_2.stringify(this.item) :
- lang_2.stringify(this.item) + '[' + lang_2.stringify(this.previousIndex) + '->' +
- lang_2.stringify(this.currentIndex) + ']';
- };
- return CollectionChangeRecord;
- })();
- exports.CollectionChangeRecord = CollectionChangeRecord;
- // A linked list of CollectionChangeRecords with the same CollectionChangeRecord.item
- var _DuplicateItemRecordList = (function () {
- function _DuplicateItemRecordList() {
- /** @internal */
- this._head = null;
- /** @internal */
- this._tail = null;
- }
- /**
- * Append the record to the list of duplicates.
- *
- * Note: by design all records in the list of duplicates hold the same value in record.item.
- */
- _DuplicateItemRecordList.prototype.add = function (record) {
- if (this._head === null) {
- this._head = this._tail = record;
- record._nextDup = null;
- record._prevDup = null;
- }
- else {
- // todo(vicb)
- // assert(record.item == _head.item ||
- // record.item is num && record.item.isNaN && _head.item is num && _head.item.isNaN);
- this._tail._nextDup = record;
- record._prevDup = this._tail;
- record._nextDup = null;
- this._tail = record;
- }
- };
- // Returns a CollectionChangeRecord having CollectionChangeRecord.item == item and
- // CollectionChangeRecord.currentIndex >= afterIndex
- _DuplicateItemRecordList.prototype.get = function (item, afterIndex) {
- var record;
- for (record = this._head; record !== null; record = record._nextDup) {
- if ((afterIndex === null || afterIndex < record.currentIndex) &&
- lang_2.looseIdentical(record.item, item)) {
- return record;
- }
- }
- return null;
- };
- /**
- * Remove one {@link CollectionChangeRecord} from the list of duplicates.
- *
- * Returns whether the list of duplicates is empty.
- */
- _DuplicateItemRecordList.prototype.remove = function (record) {
- // todo(vicb)
- // assert(() {
- // // verify that the record being removed is in the list.
- // for (CollectionChangeRecord cursor = _head; cursor != null; cursor = cursor._nextDup) {
- // if (identical(cursor, record)) return true;
- // }
- // return false;
- //});
- var prev = record._prevDup;
- var next = record._nextDup;
- if (prev === null) {
- this._head = next;
- }
- else {
- prev._nextDup = next;
- }
- if (next === null) {
- this._tail = prev;
- }
- else {
- next._prevDup = prev;
- }
- return this._head === null;
- };
- return _DuplicateItemRecordList;
- })();
- var _DuplicateMap = (function () {
- function _DuplicateMap() {
- this.map = new Map();
- }
- _DuplicateMap.prototype.put = function (record) {
- // todo(vicb) handle corner cases
- var key = lang_2.getMapKey(record.item);
- var duplicates = this.map.get(key);
- if (!lang_2.isPresent(duplicates)) {
- duplicates = new _DuplicateItemRecordList();
- this.map.set(key, duplicates);
- }
- duplicates.add(record);
- };
- /**
- * Retrieve the `value` using key. Because the CollectionChangeRecord value maybe one which we
- * have already iterated over, we use the afterIndex to pretend it is not there.
- *
- * Use case: `[a, b, c, a, a]` if we are at index `3` which is the second `a` then asking if we
- * have any more `a`s needs to return the last `a` not the first or second.
- */
- _DuplicateMap.prototype.get = function (value, afterIndex) {
- if (afterIndex === void 0) { afterIndex = null; }
- var key = lang_2.getMapKey(value);
- var recordList = this.map.get(key);
- return lang_2.isBlank(recordList) ? null : recordList.get(value, afterIndex);
- };
- /**
- * Removes a {@link CollectionChangeRecord} from the list of duplicates.
- *
- * The list of duplicates also is removed from the map if it gets empty.
- */
- _DuplicateMap.prototype.remove = function (record) {
- var key = lang_2.getMapKey(record.item);
- // todo(vicb)
- // assert(this.map.containsKey(key));
- var recordList = this.map.get(key);
- // Remove the list of duplicates when it gets empty
- if (recordList.remove(record)) {
- this.map.delete(key);
- }
- return record;
- };
- Object.defineProperty(_DuplicateMap.prototype, "isEmpty", {
- get: function () { return this.map.size === 0; },
- enumerable: true,
- configurable: true
- });
- _DuplicateMap.prototype.clear = function () { this.map.clear(); };
- _DuplicateMap.prototype.toString = function () { return '_DuplicateMap(' + lang_2.stringify(this.map) + ')'; };
- return _DuplicateMap;
- })();
- /***/ },
- /* 28 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var collection_1 = __webpack_require__(12);
- var di_1 = __webpack_require__(6);
- /**
- * A repository of different Map diffing strategies used by NgClass, NgStyle, and others.
- */
- var KeyValueDiffers = (function () {
- function KeyValueDiffers(factories) {
- this.factories = factories;
- }
- KeyValueDiffers.create = function (factories, parent) {
- if (lang_1.isPresent(parent)) {
- var copied = collection_1.ListWrapper.clone(parent.factories);
- factories = factories.concat(copied);
- return new KeyValueDiffers(factories);
- }
- else {
- return new KeyValueDiffers(factories);
- }
- };
- /**
- * Takes an array of {@link KeyValueDifferFactory} and returns a provider used to extend the
- * inherited {@link KeyValueDiffers} instance with the provided factories and return a new
- * {@link KeyValueDiffers} instance.
- *
- * The following example shows how to extend an existing list of factories,
- * which will only be applied to the injector for this component and its children.
- * This step is all that's required to make a new {@link KeyValueDiffer} available.
- *
- * ### Example
- *
- * ```
- * @Component({
- * viewProviders: [
- * KeyValueDiffers.extend([new ImmutableMapDiffer()])
- * ]
- * })
- * ```
- */
- KeyValueDiffers.extend = function (factories) {
- return new di_1.Provider(KeyValueDiffers, {
- useFactory: function (parent) {
- if (lang_1.isBlank(parent)) {
- // Typically would occur when calling KeyValueDiffers.extend inside of dependencies passed
- // to
- // bootstrap(), which would override default pipes instead of extending them.
- throw new exceptions_1.BaseException('Cannot extend KeyValueDiffers without a parent injector');
- }
- return KeyValueDiffers.create(factories, parent);
- },
- // Dependency technically isn't optional, but we can provide a better error message this way.
- deps: [[KeyValueDiffers, new di_1.SkipSelfMetadata(), new di_1.OptionalMetadata()]]
- });
- };
- KeyValueDiffers.prototype.find = function (kv) {
- var factory = this.factories.find(function (f) { return f.supports(kv); });
- if (lang_1.isPresent(factory)) {
- return factory;
- }
- else {
- throw new exceptions_1.BaseException("Cannot find a differ supporting object '" + kv + "'");
- }
- };
- KeyValueDiffers = __decorate([
- di_1.Injectable(),
- lang_1.CONST(),
- __metadata('design:paramtypes', [Array])
- ], KeyValueDiffers);
- return KeyValueDiffers;
- })();
- exports.KeyValueDiffers = KeyValueDiffers;
- /***/ },
- /* 29 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var collection_1 = __webpack_require__(12);
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var DefaultKeyValueDifferFactory = (function () {
- function DefaultKeyValueDifferFactory() {
- }
- DefaultKeyValueDifferFactory.prototype.supports = function (obj) { return obj instanceof Map || lang_1.isJsObject(obj); };
- DefaultKeyValueDifferFactory.prototype.create = function (cdRef) { return new DefaultKeyValueDiffer(); };
- DefaultKeyValueDifferFactory = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [])
- ], DefaultKeyValueDifferFactory);
- return DefaultKeyValueDifferFactory;
- })();
- exports.DefaultKeyValueDifferFactory = DefaultKeyValueDifferFactory;
- var DefaultKeyValueDiffer = (function () {
- function DefaultKeyValueDiffer() {
- this._records = new Map();
- this._mapHead = null;
- this._previousMapHead = null;
- this._changesHead = null;
- this._changesTail = null;
- this._additionsHead = null;
- this._additionsTail = null;
- this._removalsHead = null;
- this._removalsTail = null;
- }
- Object.defineProperty(DefaultKeyValueDiffer.prototype, "isDirty", {
- get: function () {
- return this._additionsHead !== null || this._changesHead !== null ||
- this._removalsHead !== null;
- },
- enumerable: true,
- configurable: true
- });
- DefaultKeyValueDiffer.prototype.forEachItem = function (fn) {
- var record;
- for (record = this._mapHead; record !== null; record = record._next) {
- fn(record);
- }
- };
- DefaultKeyValueDiffer.prototype.forEachPreviousItem = function (fn) {
- var record;
- for (record = this._previousMapHead; record !== null; record = record._nextPrevious) {
- fn(record);
- }
- };
- DefaultKeyValueDiffer.prototype.forEachChangedItem = function (fn) {
- var record;
- for (record = this._changesHead; record !== null; record = record._nextChanged) {
- fn(record);
- }
- };
- DefaultKeyValueDiffer.prototype.forEachAddedItem = function (fn) {
- var record;
- for (record = this._additionsHead; record !== null; record = record._nextAdded) {
- fn(record);
- }
- };
- DefaultKeyValueDiffer.prototype.forEachRemovedItem = function (fn) {
- var record;
- for (record = this._removalsHead; record !== null; record = record._nextRemoved) {
- fn(record);
- }
- };
- DefaultKeyValueDiffer.prototype.diff = function (map) {
- if (lang_1.isBlank(map))
- map = collection_1.MapWrapper.createFromPairs([]);
- if (!(map instanceof Map || lang_1.isJsObject(map))) {
- throw new exceptions_1.BaseException("Error trying to diff '" + map + "'");
- }
- if (this.check(map)) {
- return this;
- }
- else {
- return null;
- }
- };
- DefaultKeyValueDiffer.prototype.onDestroy = function () { };
- DefaultKeyValueDiffer.prototype.check = function (map) {
- var _this = this;
- this._reset();
- var records = this._records;
- var oldSeqRecord = this._mapHead;
- var lastOldSeqRecord = null;
- var lastNewSeqRecord = null;
- var seqChanged = false;
- this._forEach(map, function (value, key) {
- var newSeqRecord;
- if (oldSeqRecord !== null && key === oldSeqRecord.key) {
- newSeqRecord = oldSeqRecord;
- if (!lang_1.looseIdentical(value, oldSeqRecord.currentValue)) {
- oldSeqRecord.previousValue = oldSeqRecord.currentValue;
- oldSeqRecord.currentValue = value;
- _this._addToChanges(oldSeqRecord);
- }
- }
- else {
- seqChanged = true;
- if (oldSeqRecord !== null) {
- oldSeqRecord._next = null;
- _this._removeFromSeq(lastOldSeqRecord, oldSeqRecord);
- _this._addToRemovals(oldSeqRecord);
- }
- if (records.has(key)) {
- newSeqRecord = records.get(key);
- }
- else {
- newSeqRecord = new KVChangeRecord(key);
- records.set(key, newSeqRecord);
- newSeqRecord.currentValue = value;
- _this._addToAdditions(newSeqRecord);
- }
- }
- if (seqChanged) {
- if (_this._isInRemovals(newSeqRecord)) {
- _this._removeFromRemovals(newSeqRecord);
- }
- if (lastNewSeqRecord == null) {
- _this._mapHead = newSeqRecord;
- }
- else {
- lastNewSeqRecord._next = newSeqRecord;
- }
- }
- lastOldSeqRecord = oldSeqRecord;
- lastNewSeqRecord = newSeqRecord;
- oldSeqRecord = oldSeqRecord === null ? null : oldSeqRecord._next;
- });
- this._truncate(lastOldSeqRecord, oldSeqRecord);
- return this.isDirty;
- };
- /** @internal */
- DefaultKeyValueDiffer.prototype._reset = function () {
- if (this.isDirty) {
- var record;
- // Record the state of the mapping
- for (record = this._previousMapHead = this._mapHead; record !== null; record = record._next) {
- record._nextPrevious = record._next;
- }
- for (record = this._changesHead; record !== null; record = record._nextChanged) {
- record.previousValue = record.currentValue;
- }
- for (record = this._additionsHead; record != null; record = record._nextAdded) {
- record.previousValue = record.currentValue;
- }
- // todo(vicb) once assert is supported
- // assert(() {
- // var r = _changesHead;
- // while (r != null) {
- // var nextRecord = r._nextChanged;
- // r._nextChanged = null;
- // r = nextRecord;
- // }
- //
- // r = _additionsHead;
- // while (r != null) {
- // var nextRecord = r._nextAdded;
- // r._nextAdded = null;
- // r = nextRecord;
- // }
- //
- // r = _removalsHead;
- // while (r != null) {
- // var nextRecord = r._nextRemoved;
- // r._nextRemoved = null;
- // r = nextRecord;
- // }
- //
- // return true;
- //});
- this._changesHead = this._changesTail = null;
- this._additionsHead = this._additionsTail = null;
- this._removalsHead = this._removalsTail = null;
- }
- };
- /** @internal */
- DefaultKeyValueDiffer.prototype._truncate = function (lastRecord, record) {
- while (record !== null) {
- if (lastRecord === null) {
- this._mapHead = null;
- }
- else {
- lastRecord._next = null;
- }
- var nextRecord = record._next;
- // todo(vicb) assert
- // assert((() {
- // record._next = null;
- // return true;
- //}));
- this._addToRemovals(record);
- lastRecord = record;
- record = nextRecord;
- }
- for (var rec = this._removalsHead; rec !== null; rec = rec._nextRemoved) {
- rec.previousValue = rec.currentValue;
- rec.currentValue = null;
- this._records.delete(rec.key);
- }
- };
- /** @internal */
- DefaultKeyValueDiffer.prototype._isInRemovals = function (record) {
- return record === this._removalsHead || record._nextRemoved !== null ||
- record._prevRemoved !== null;
- };
- /** @internal */
- DefaultKeyValueDiffer.prototype._addToRemovals = function (record) {
- // todo(vicb) assert
- // assert(record._next == null);
- // assert(record._nextAdded == null);
- // assert(record._nextChanged == null);
- // assert(record._nextRemoved == null);
- // assert(record._prevRemoved == null);
- if (this._removalsHead === null) {
- this._removalsHead = this._removalsTail = record;
- }
- else {
- this._removalsTail._nextRemoved = record;
- record._prevRemoved = this._removalsTail;
- this._removalsTail = record;
- }
- };
- /** @internal */
- DefaultKeyValueDiffer.prototype._removeFromSeq = function (prev, record) {
- var next = record._next;
- if (prev === null) {
- this._mapHead = next;
- }
- else {
- prev._next = next;
- }
- // todo(vicb) assert
- // assert((() {
- // record._next = null;
- // return true;
- //})());
- };
- /** @internal */
- DefaultKeyValueDiffer.prototype._removeFromRemovals = function (record) {
- // todo(vicb) assert
- // assert(record._next == null);
- // assert(record._nextAdded == null);
- // assert(record._nextChanged == null);
- var prev = record._prevRemoved;
- var next = record._nextRemoved;
- if (prev === null) {
- this._removalsHead = next;
- }
- else {
- prev._nextRemoved = next;
- }
- if (next === null) {
- this._removalsTail = prev;
- }
- else {
- next._prevRemoved = prev;
- }
- record._prevRemoved = record._nextRemoved = null;
- };
- /** @internal */
- DefaultKeyValueDiffer.prototype._addToAdditions = function (record) {
- // todo(vicb): assert
- // assert(record._next == null);
- // assert(record._nextAdded == null);
- // assert(record._nextChanged == null);
- // assert(record._nextRemoved == null);
- // assert(record._prevRemoved == null);
- if (this._additionsHead === null) {
- this._additionsHead = this._additionsTail = record;
- }
- else {
- this._additionsTail._nextAdded = record;
- this._additionsTail = record;
- }
- };
- /** @internal */
- DefaultKeyValueDiffer.prototype._addToChanges = function (record) {
- // todo(vicb) assert
- // assert(record._nextAdded == null);
- // assert(record._nextChanged == null);
- // assert(record._nextRemoved == null);
- // assert(record._prevRemoved == null);
- if (this._changesHead === null) {
- this._changesHead = this._changesTail = record;
- }
- else {
- this._changesTail._nextChanged = record;
- this._changesTail = record;
- }
- };
- DefaultKeyValueDiffer.prototype.toString = function () {
- var items = [];
- var previous = [];
- var changes = [];
- var additions = [];
- var removals = [];
- var record;
- for (record = this._mapHead; record !== null; record = record._next) {
- items.push(lang_1.stringify(record));
- }
- for (record = this._previousMapHead; record !== null; record = record._nextPrevious) {
- previous.push(lang_1.stringify(record));
- }
- for (record = this._changesHead; record !== null; record = record._nextChanged) {
- changes.push(lang_1.stringify(record));
- }
- for (record = this._additionsHead; record !== null; record = record._nextAdded) {
- additions.push(lang_1.stringify(record));
- }
- for (record = this._removalsHead; record !== null; record = record._nextRemoved) {
- removals.push(lang_1.stringify(record));
- }
- return "map: " + items.join(', ') + "\n" + "previous: " + previous.join(', ') + "\n" +
- "additions: " + additions.join(', ') + "\n" + "changes: " + changes.join(', ') + "\n" +
- "removals: " + removals.join(', ') + "\n";
- };
- /** @internal */
- DefaultKeyValueDiffer.prototype._forEach = function (obj, fn) {
- if (obj instanceof Map) {
- obj.forEach(fn);
- }
- else {
- collection_1.StringMapWrapper.forEach(obj, fn);
- }
- };
- return DefaultKeyValueDiffer;
- })();
- exports.DefaultKeyValueDiffer = DefaultKeyValueDiffer;
- var KVChangeRecord = (function () {
- function KVChangeRecord(key) {
- this.key = key;
- this.previousValue = null;
- this.currentValue = null;
- /** @internal */
- this._nextPrevious = null;
- /** @internal */
- this._next = null;
- /** @internal */
- this._nextAdded = null;
- /** @internal */
- this._nextRemoved = null;
- /** @internal */
- this._prevRemoved = null;
- /** @internal */
- this._nextChanged = null;
- }
- KVChangeRecord.prototype.toString = function () {
- return lang_1.looseIdentical(this.previousValue, this.currentValue) ?
- lang_1.stringify(this.key) :
- (lang_1.stringify(this.key) + '[' + lang_1.stringify(this.previousValue) + '->' +
- lang_1.stringify(this.currentValue) + ']');
- };
- return KVChangeRecord;
- })();
- exports.KVChangeRecord = KVChangeRecord;
- /***/ },
- /* 30 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var collection_1 = __webpack_require__(12);
- var AST = (function () {
- function AST() {
- }
- AST.prototype.visit = function (visitor) { return null; };
- AST.prototype.toString = function () { return "AST"; };
- return AST;
- })();
- exports.AST = AST;
- /**
- * Represents a quoted expression of the form:
- *
- * quote = prefix `:` uninterpretedExpression
- * prefix = identifier
- * uninterpretedExpression = arbitrary string
- *
- * A quoted expression is meant to be pre-processed by an AST transformer that
- * converts it into another AST that no longer contains quoted expressions.
- * It is meant to allow third-party developers to extend Angular template
- * expression language. The `uninterpretedExpression` part of the quote is
- * therefore not interpreted by the Angular's own expression parser.
- */
- var Quote = (function (_super) {
- __extends(Quote, _super);
- function Quote(prefix, uninterpretedExpression, location) {
- _super.call(this);
- this.prefix = prefix;
- this.uninterpretedExpression = uninterpretedExpression;
- this.location = location;
- }
- Quote.prototype.visit = function (visitor) { return visitor.visitQuote(this); };
- Quote.prototype.toString = function () { return "Quote"; };
- return Quote;
- })(AST);
- exports.Quote = Quote;
- var EmptyExpr = (function (_super) {
- __extends(EmptyExpr, _super);
- function EmptyExpr() {
- _super.apply(this, arguments);
- }
- EmptyExpr.prototype.visit = function (visitor) {
- // do nothing
- };
- return EmptyExpr;
- })(AST);
- exports.EmptyExpr = EmptyExpr;
- var ImplicitReceiver = (function (_super) {
- __extends(ImplicitReceiver, _super);
- function ImplicitReceiver() {
- _super.apply(this, arguments);
- }
- ImplicitReceiver.prototype.visit = function (visitor) { return visitor.visitImplicitReceiver(this); };
- return ImplicitReceiver;
- })(AST);
- exports.ImplicitReceiver = ImplicitReceiver;
- /**
- * Multiple expressions separated by a semicolon.
- */
- var Chain = (function (_super) {
- __extends(Chain, _super);
- function Chain(expressions) {
- _super.call(this);
- this.expressions = expressions;
- }
- Chain.prototype.visit = function (visitor) { return visitor.visitChain(this); };
- return Chain;
- })(AST);
- exports.Chain = Chain;
- var Conditional = (function (_super) {
- __extends(Conditional, _super);
- function Conditional(condition, trueExp, falseExp) {
- _super.call(this);
- this.condition = condition;
- this.trueExp = trueExp;
- this.falseExp = falseExp;
- }
- Conditional.prototype.visit = function (visitor) { return visitor.visitConditional(this); };
- return Conditional;
- })(AST);
- exports.Conditional = Conditional;
- var PropertyRead = (function (_super) {
- __extends(PropertyRead, _super);
- function PropertyRead(receiver, name, getter) {
- _super.call(this);
- this.receiver = receiver;
- this.name = name;
- this.getter = getter;
- }
- PropertyRead.prototype.visit = function (visitor) { return visitor.visitPropertyRead(this); };
- return PropertyRead;
- })(AST);
- exports.PropertyRead = PropertyRead;
- var PropertyWrite = (function (_super) {
- __extends(PropertyWrite, _super);
- function PropertyWrite(receiver, name, setter, value) {
- _super.call(this);
- this.receiver = receiver;
- this.name = name;
- this.setter = setter;
- this.value = value;
- }
- PropertyWrite.prototype.visit = function (visitor) { return visitor.visitPropertyWrite(this); };
- return PropertyWrite;
- })(AST);
- exports.PropertyWrite = PropertyWrite;
- var SafePropertyRead = (function (_super) {
- __extends(SafePropertyRead, _super);
- function SafePropertyRead(receiver, name, getter) {
- _super.call(this);
- this.receiver = receiver;
- this.name = name;
- this.getter = getter;
- }
- SafePropertyRead.prototype.visit = function (visitor) { return visitor.visitSafePropertyRead(this); };
- return SafePropertyRead;
- })(AST);
- exports.SafePropertyRead = SafePropertyRead;
- var KeyedRead = (function (_super) {
- __extends(KeyedRead, _super);
- function KeyedRead(obj, key) {
- _super.call(this);
- this.obj = obj;
- this.key = key;
- }
- KeyedRead.prototype.visit = function (visitor) { return visitor.visitKeyedRead(this); };
- return KeyedRead;
- })(AST);
- exports.KeyedRead = KeyedRead;
- var KeyedWrite = (function (_super) {
- __extends(KeyedWrite, _super);
- function KeyedWrite(obj, key, value) {
- _super.call(this);
- this.obj = obj;
- this.key = key;
- this.value = value;
- }
- KeyedWrite.prototype.visit = function (visitor) { return visitor.visitKeyedWrite(this); };
- return KeyedWrite;
- })(AST);
- exports.KeyedWrite = KeyedWrite;
- var BindingPipe = (function (_super) {
- __extends(BindingPipe, _super);
- function BindingPipe(exp, name, args) {
- _super.call(this);
- this.exp = exp;
- this.name = name;
- this.args = args;
- }
- BindingPipe.prototype.visit = function (visitor) { return visitor.visitPipe(this); };
- return BindingPipe;
- })(AST);
- exports.BindingPipe = BindingPipe;
- var LiteralPrimitive = (function (_super) {
- __extends(LiteralPrimitive, _super);
- function LiteralPrimitive(value) {
- _super.call(this);
- this.value = value;
- }
- LiteralPrimitive.prototype.visit = function (visitor) { return visitor.visitLiteralPrimitive(this); };
- return LiteralPrimitive;
- })(AST);
- exports.LiteralPrimitive = LiteralPrimitive;
- var LiteralArray = (function (_super) {
- __extends(LiteralArray, _super);
- function LiteralArray(expressions) {
- _super.call(this);
- this.expressions = expressions;
- }
- LiteralArray.prototype.visit = function (visitor) { return visitor.visitLiteralArray(this); };
- return LiteralArray;
- })(AST);
- exports.LiteralArray = LiteralArray;
- var LiteralMap = (function (_super) {
- __extends(LiteralMap, _super);
- function LiteralMap(keys, values) {
- _super.call(this);
- this.keys = keys;
- this.values = values;
- }
- LiteralMap.prototype.visit = function (visitor) { return visitor.visitLiteralMap(this); };
- return LiteralMap;
- })(AST);
- exports.LiteralMap = LiteralMap;
- var Interpolation = (function (_super) {
- __extends(Interpolation, _super);
- function Interpolation(strings, expressions) {
- _super.call(this);
- this.strings = strings;
- this.expressions = expressions;
- }
- Interpolation.prototype.visit = function (visitor) { return visitor.visitInterpolation(this); };
- return Interpolation;
- })(AST);
- exports.Interpolation = Interpolation;
- var Binary = (function (_super) {
- __extends(Binary, _super);
- function Binary(operation, left, right) {
- _super.call(this);
- this.operation = operation;
- this.left = left;
- this.right = right;
- }
- Binary.prototype.visit = function (visitor) { return visitor.visitBinary(this); };
- return Binary;
- })(AST);
- exports.Binary = Binary;
- var PrefixNot = (function (_super) {
- __extends(PrefixNot, _super);
- function PrefixNot(expression) {
- _super.call(this);
- this.expression = expression;
- }
- PrefixNot.prototype.visit = function (visitor) { return visitor.visitPrefixNot(this); };
- return PrefixNot;
- })(AST);
- exports.PrefixNot = PrefixNot;
- var MethodCall = (function (_super) {
- __extends(MethodCall, _super);
- function MethodCall(receiver, name, fn, args) {
- _super.call(this);
- this.receiver = receiver;
- this.name = name;
- this.fn = fn;
- this.args = args;
- }
- MethodCall.prototype.visit = function (visitor) { return visitor.visitMethodCall(this); };
- return MethodCall;
- })(AST);
- exports.MethodCall = MethodCall;
- var SafeMethodCall = (function (_super) {
- __extends(SafeMethodCall, _super);
- function SafeMethodCall(receiver, name, fn, args) {
- _super.call(this);
- this.receiver = receiver;
- this.name = name;
- this.fn = fn;
- this.args = args;
- }
- SafeMethodCall.prototype.visit = function (visitor) { return visitor.visitSafeMethodCall(this); };
- return SafeMethodCall;
- })(AST);
- exports.SafeMethodCall = SafeMethodCall;
- var FunctionCall = (function (_super) {
- __extends(FunctionCall, _super);
- function FunctionCall(target, args) {
- _super.call(this);
- this.target = target;
- this.args = args;
- }
- FunctionCall.prototype.visit = function (visitor) { return visitor.visitFunctionCall(this); };
- return FunctionCall;
- })(AST);
- exports.FunctionCall = FunctionCall;
- var ASTWithSource = (function (_super) {
- __extends(ASTWithSource, _super);
- function ASTWithSource(ast, source, location) {
- _super.call(this);
- this.ast = ast;
- this.source = source;
- this.location = location;
- }
- ASTWithSource.prototype.visit = function (visitor) { return this.ast.visit(visitor); };
- ASTWithSource.prototype.toString = function () { return this.source + " in " + this.location; };
- return ASTWithSource;
- })(AST);
- exports.ASTWithSource = ASTWithSource;
- var TemplateBinding = (function () {
- function TemplateBinding(key, keyIsVar, name, expression) {
- this.key = key;
- this.keyIsVar = keyIsVar;
- this.name = name;
- this.expression = expression;
- }
- return TemplateBinding;
- })();
- exports.TemplateBinding = TemplateBinding;
- var RecursiveAstVisitor = (function () {
- function RecursiveAstVisitor() {
- }
- RecursiveAstVisitor.prototype.visitBinary = function (ast) {
- ast.left.visit(this);
- ast.right.visit(this);
- return null;
- };
- RecursiveAstVisitor.prototype.visitChain = function (ast) { return this.visitAll(ast.expressions); };
- RecursiveAstVisitor.prototype.visitConditional = function (ast) {
- ast.condition.visit(this);
- ast.trueExp.visit(this);
- ast.falseExp.visit(this);
- return null;
- };
- RecursiveAstVisitor.prototype.visitPipe = function (ast) {
- ast.exp.visit(this);
- this.visitAll(ast.args);
- return null;
- };
- RecursiveAstVisitor.prototype.visitFunctionCall = function (ast) {
- ast.target.visit(this);
- this.visitAll(ast.args);
- return null;
- };
- RecursiveAstVisitor.prototype.visitImplicitReceiver = function (ast) { return null; };
- RecursiveAstVisitor.prototype.visitInterpolation = function (ast) { return this.visitAll(ast.expressions); };
- RecursiveAstVisitor.prototype.visitKeyedRead = function (ast) {
- ast.obj.visit(this);
- ast.key.visit(this);
- return null;
- };
- RecursiveAstVisitor.prototype.visitKeyedWrite = function (ast) {
- ast.obj.visit(this);
- ast.key.visit(this);
- ast.value.visit(this);
- return null;
- };
- RecursiveAstVisitor.prototype.visitLiteralArray = function (ast) { return this.visitAll(ast.expressions); };
- RecursiveAstVisitor.prototype.visitLiteralMap = function (ast) { return this.visitAll(ast.values); };
- RecursiveAstVisitor.prototype.visitLiteralPrimitive = function (ast) { return null; };
- RecursiveAstVisitor.prototype.visitMethodCall = function (ast) {
- ast.receiver.visit(this);
- return this.visitAll(ast.args);
- };
- RecursiveAstVisitor.prototype.visitPrefixNot = function (ast) {
- ast.expression.visit(this);
- return null;
- };
- RecursiveAstVisitor.prototype.visitPropertyRead = function (ast) {
- ast.receiver.visit(this);
- return null;
- };
- RecursiveAstVisitor.prototype.visitPropertyWrite = function (ast) {
- ast.receiver.visit(this);
- ast.value.visit(this);
- return null;
- };
- RecursiveAstVisitor.prototype.visitSafePropertyRead = function (ast) {
- ast.receiver.visit(this);
- return null;
- };
- RecursiveAstVisitor.prototype.visitSafeMethodCall = function (ast) {
- ast.receiver.visit(this);
- return this.visitAll(ast.args);
- };
- RecursiveAstVisitor.prototype.visitAll = function (asts) {
- var _this = this;
- asts.forEach(function (ast) { return ast.visit(_this); });
- return null;
- };
- RecursiveAstVisitor.prototype.visitQuote = function (ast) { return null; };
- return RecursiveAstVisitor;
- })();
- exports.RecursiveAstVisitor = RecursiveAstVisitor;
- var AstTransformer = (function () {
- function AstTransformer() {
- }
- AstTransformer.prototype.visitImplicitReceiver = function (ast) { return ast; };
- AstTransformer.prototype.visitInterpolation = function (ast) {
- return new Interpolation(ast.strings, this.visitAll(ast.expressions));
- };
- AstTransformer.prototype.visitLiteralPrimitive = function (ast) { return new LiteralPrimitive(ast.value); };
- AstTransformer.prototype.visitPropertyRead = function (ast) {
- return new PropertyRead(ast.receiver.visit(this), ast.name, ast.getter);
- };
- AstTransformer.prototype.visitPropertyWrite = function (ast) {
- return new PropertyWrite(ast.receiver.visit(this), ast.name, ast.setter, ast.value);
- };
- AstTransformer.prototype.visitSafePropertyRead = function (ast) {
- return new SafePropertyRead(ast.receiver.visit(this), ast.name, ast.getter);
- };
- AstTransformer.prototype.visitMethodCall = function (ast) {
- return new MethodCall(ast.receiver.visit(this), ast.name, ast.fn, this.visitAll(ast.args));
- };
- AstTransformer.prototype.visitSafeMethodCall = function (ast) {
- return new SafeMethodCall(ast.receiver.visit(this), ast.name, ast.fn, this.visitAll(ast.args));
- };
- AstTransformer.prototype.visitFunctionCall = function (ast) {
- return new FunctionCall(ast.target.visit(this), this.visitAll(ast.args));
- };
- AstTransformer.prototype.visitLiteralArray = function (ast) {
- return new LiteralArray(this.visitAll(ast.expressions));
- };
- AstTransformer.prototype.visitLiteralMap = function (ast) {
- return new LiteralMap(ast.keys, this.visitAll(ast.values));
- };
- AstTransformer.prototype.visitBinary = function (ast) {
- return new Binary(ast.operation, ast.left.visit(this), ast.right.visit(this));
- };
- AstTransformer.prototype.visitPrefixNot = function (ast) { return new PrefixNot(ast.expression.visit(this)); };
- AstTransformer.prototype.visitConditional = function (ast) {
- return new Conditional(ast.condition.visit(this), ast.trueExp.visit(this), ast.falseExp.visit(this));
- };
- AstTransformer.prototype.visitPipe = function (ast) {
- return new BindingPipe(ast.exp.visit(this), ast.name, this.visitAll(ast.args));
- };
- AstTransformer.prototype.visitKeyedRead = function (ast) {
- return new KeyedRead(ast.obj.visit(this), ast.key.visit(this));
- };
- AstTransformer.prototype.visitKeyedWrite = function (ast) {
- return new KeyedWrite(ast.obj.visit(this), ast.key.visit(this), ast.value.visit(this));
- };
- AstTransformer.prototype.visitAll = function (asts) {
- var res = collection_1.ListWrapper.createFixedSize(asts.length);
- for (var i = 0; i < asts.length; ++i) {
- res[i] = asts[i].visit(this);
- }
- return res;
- };
- AstTransformer.prototype.visitChain = function (ast) { return new Chain(this.visitAll(ast.expressions)); };
- AstTransformer.prototype.visitQuote = function (ast) {
- return new Quote(ast.prefix, ast.uninterpretedExpression, ast.location);
- };
- return AstTransformer;
- })();
- exports.AstTransformer = AstTransformer;
- /***/ },
- /* 31 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var decorators_1 = __webpack_require__(8);
- var collection_1 = __webpack_require__(12);
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- (function (TokenType) {
- TokenType[TokenType["Character"] = 0] = "Character";
- TokenType[TokenType["Identifier"] = 1] = "Identifier";
- TokenType[TokenType["Keyword"] = 2] = "Keyword";
- TokenType[TokenType["String"] = 3] = "String";
- TokenType[TokenType["Operator"] = 4] = "Operator";
- TokenType[TokenType["Number"] = 5] = "Number";
- })(exports.TokenType || (exports.TokenType = {}));
- var TokenType = exports.TokenType;
- var Lexer = (function () {
- function Lexer() {
- }
- Lexer.prototype.tokenize = function (text) {
- var scanner = new _Scanner(text);
- var tokens = [];
- var token = scanner.scanToken();
- while (token != null) {
- tokens.push(token);
- token = scanner.scanToken();
- }
- return tokens;
- };
- Lexer = __decorate([
- decorators_1.Injectable(),
- __metadata('design:paramtypes', [])
- ], Lexer);
- return Lexer;
- })();
- exports.Lexer = Lexer;
- var Token = (function () {
- function Token(index, type, numValue, strValue) {
- this.index = index;
- this.type = type;
- this.numValue = numValue;
- this.strValue = strValue;
- }
- Token.prototype.isCharacter = function (code) {
- return (this.type == TokenType.Character && this.numValue == code);
- };
- Token.prototype.isNumber = function () { return (this.type == TokenType.Number); };
- Token.prototype.isString = function () { return (this.type == TokenType.String); };
- Token.prototype.isOperator = function (operater) {
- return (this.type == TokenType.Operator && this.strValue == operater);
- };
- Token.prototype.isIdentifier = function () { return (this.type == TokenType.Identifier); };
- Token.prototype.isKeyword = function () { return (this.type == TokenType.Keyword); };
- Token.prototype.isKeywordVar = function () { return (this.type == TokenType.Keyword && this.strValue == "var"); };
- Token.prototype.isKeywordNull = function () { return (this.type == TokenType.Keyword && this.strValue == "null"); };
- Token.prototype.isKeywordUndefined = function () {
- return (this.type == TokenType.Keyword && this.strValue == "undefined");
- };
- Token.prototype.isKeywordTrue = function () { return (this.type == TokenType.Keyword && this.strValue == "true"); };
- Token.prototype.isKeywordFalse = function () { return (this.type == TokenType.Keyword && this.strValue == "false"); };
- Token.prototype.toNumber = function () {
- // -1 instead of NULL ok?
- return (this.type == TokenType.Number) ? this.numValue : -1;
- };
- Token.prototype.toString = function () {
- switch (this.type) {
- case TokenType.Character:
- case TokenType.Identifier:
- case TokenType.Keyword:
- case TokenType.Operator:
- case TokenType.String:
- return this.strValue;
- case TokenType.Number:
- return this.numValue.toString();
- default:
- return null;
- }
- };
- return Token;
- })();
- exports.Token = Token;
- function newCharacterToken(index, code) {
- return new Token(index, TokenType.Character, code, lang_1.StringWrapper.fromCharCode(code));
- }
- function newIdentifierToken(index, text) {
- return new Token(index, TokenType.Identifier, 0, text);
- }
- function newKeywordToken(index, text) {
- return new Token(index, TokenType.Keyword, 0, text);
- }
- function newOperatorToken(index, text) {
- return new Token(index, TokenType.Operator, 0, text);
- }
- function newStringToken(index, text) {
- return new Token(index, TokenType.String, 0, text);
- }
- function newNumberToken(index, n) {
- return new Token(index, TokenType.Number, n, "");
- }
- exports.EOF = new Token(-1, TokenType.Character, 0, "");
- exports.$EOF = 0;
- exports.$TAB = 9;
- exports.$LF = 10;
- exports.$VTAB = 11;
- exports.$FF = 12;
- exports.$CR = 13;
- exports.$SPACE = 32;
- exports.$BANG = 33;
- exports.$DQ = 34;
- exports.$HASH = 35;
- exports.$$ = 36;
- exports.$PERCENT = 37;
- exports.$AMPERSAND = 38;
- exports.$SQ = 39;
- exports.$LPAREN = 40;
- exports.$RPAREN = 41;
- exports.$STAR = 42;
- exports.$PLUS = 43;
- exports.$COMMA = 44;
- exports.$MINUS = 45;
- exports.$PERIOD = 46;
- exports.$SLASH = 47;
- exports.$COLON = 58;
- exports.$SEMICOLON = 59;
- exports.$LT = 60;
- exports.$EQ = 61;
- exports.$GT = 62;
- exports.$QUESTION = 63;
- var $0 = 48;
- var $9 = 57;
- var $A = 65, $E = 69, $Z = 90;
- exports.$LBRACKET = 91;
- exports.$BACKSLASH = 92;
- exports.$RBRACKET = 93;
- var $CARET = 94;
- var $_ = 95;
- var $a = 97, $e = 101, $f = 102, $n = 110, $r = 114, $t = 116, $u = 117, $v = 118, $z = 122;
- exports.$LBRACE = 123;
- exports.$BAR = 124;
- exports.$RBRACE = 125;
- var $NBSP = 160;
- var ScannerError = (function (_super) {
- __extends(ScannerError, _super);
- function ScannerError(message) {
- _super.call(this);
- this.message = message;
- }
- ScannerError.prototype.toString = function () { return this.message; };
- return ScannerError;
- })(exceptions_1.BaseException);
- exports.ScannerError = ScannerError;
- var _Scanner = (function () {
- function _Scanner(input) {
- this.input = input;
- this.peek = 0;
- this.index = -1;
- this.length = input.length;
- this.advance();
- }
- _Scanner.prototype.advance = function () {
- this.peek =
- ++this.index >= this.length ? exports.$EOF : lang_1.StringWrapper.charCodeAt(this.input, this.index);
- };
- _Scanner.prototype.scanToken = function () {
- var input = this.input, length = this.length, peek = this.peek, index = this.index;
- // Skip whitespace.
- while (peek <= exports.$SPACE) {
- if (++index >= length) {
- peek = exports.$EOF;
- break;
- }
- else {
- peek = lang_1.StringWrapper.charCodeAt(input, index);
- }
- }
- this.peek = peek;
- this.index = index;
- if (index >= length) {
- return null;
- }
- // Handle identifiers and numbers.
- if (isIdentifierStart(peek))
- return this.scanIdentifier();
- if (isDigit(peek))
- return this.scanNumber(index);
- var start = index;
- switch (peek) {
- case exports.$PERIOD:
- this.advance();
- return isDigit(this.peek) ? this.scanNumber(start) : newCharacterToken(start, exports.$PERIOD);
- case exports.$LPAREN:
- case exports.$RPAREN:
- case exports.$LBRACE:
- case exports.$RBRACE:
- case exports.$LBRACKET:
- case exports.$RBRACKET:
- case exports.$COMMA:
- case exports.$COLON:
- case exports.$SEMICOLON:
- return this.scanCharacter(start, peek);
- case exports.$SQ:
- case exports.$DQ:
- return this.scanString();
- case exports.$HASH:
- case exports.$PLUS:
- case exports.$MINUS:
- case exports.$STAR:
- case exports.$SLASH:
- case exports.$PERCENT:
- case $CARET:
- return this.scanOperator(start, lang_1.StringWrapper.fromCharCode(peek));
- case exports.$QUESTION:
- return this.scanComplexOperator(start, '?', exports.$PERIOD, '.');
- case exports.$LT:
- case exports.$GT:
- return this.scanComplexOperator(start, lang_1.StringWrapper.fromCharCode(peek), exports.$EQ, '=');
- case exports.$BANG:
- case exports.$EQ:
- return this.scanComplexOperator(start, lang_1.StringWrapper.fromCharCode(peek), exports.$EQ, '=', exports.$EQ, '=');
- case exports.$AMPERSAND:
- return this.scanComplexOperator(start, '&', exports.$AMPERSAND, '&');
- case exports.$BAR:
- return this.scanComplexOperator(start, '|', exports.$BAR, '|');
- case $NBSP:
- while (isWhitespace(this.peek))
- this.advance();
- return this.scanToken();
- }
- this.error("Unexpected character [" + lang_1.StringWrapper.fromCharCode(peek) + "]", 0);
- return null;
- };
- _Scanner.prototype.scanCharacter = function (start, code) {
- assert(this.peek == code);
- this.advance();
- return newCharacterToken(start, code);
- };
- _Scanner.prototype.scanOperator = function (start, str) {
- assert(this.peek == lang_1.StringWrapper.charCodeAt(str, 0));
- assert(collection_1.SetWrapper.has(OPERATORS, str));
- this.advance();
- return newOperatorToken(start, str);
- };
- /**
- * Tokenize a 2/3 char long operator
- *
- * @param start start index in the expression
- * @param one first symbol (always part of the operator)
- * @param twoCode code point for the second symbol
- * @param two second symbol (part of the operator when the second code point matches)
- * @param threeCode code point for the third symbol
- * @param three third symbol (part of the operator when provided and matches source expression)
- * @returns {Token}
- */
- _Scanner.prototype.scanComplexOperator = function (start, one, twoCode, two, threeCode, three) {
- assert(this.peek == lang_1.StringWrapper.charCodeAt(one, 0));
- this.advance();
- var str = one;
- if (this.peek == twoCode) {
- this.advance();
- str += two;
- }
- if (lang_1.isPresent(threeCode) && this.peek == threeCode) {
- this.advance();
- str += three;
- }
- assert(collection_1.SetWrapper.has(OPERATORS, str));
- return newOperatorToken(start, str);
- };
- _Scanner.prototype.scanIdentifier = function () {
- assert(isIdentifierStart(this.peek));
- var start = this.index;
- this.advance();
- while (isIdentifierPart(this.peek))
- this.advance();
- var str = this.input.substring(start, this.index);
- if (collection_1.SetWrapper.has(KEYWORDS, str)) {
- return newKeywordToken(start, str);
- }
- else {
- return newIdentifierToken(start, str);
- }
- };
- _Scanner.prototype.scanNumber = function (start) {
- assert(isDigit(this.peek));
- var simple = (this.index === start);
- this.advance(); // Skip initial digit.
- while (true) {
- if (isDigit(this.peek)) {
- }
- else if (this.peek == exports.$PERIOD) {
- simple = false;
- }
- else if (isExponentStart(this.peek)) {
- this.advance();
- if (isExponentSign(this.peek))
- this.advance();
- if (!isDigit(this.peek))
- this.error('Invalid exponent', -1);
- simple = false;
- }
- else {
- break;
- }
- this.advance();
- }
- var str = this.input.substring(start, this.index);
- // TODO
- var value = simple ? lang_1.NumberWrapper.parseIntAutoRadix(str) : lang_1.NumberWrapper.parseFloat(str);
- return newNumberToken(start, value);
- };
- _Scanner.prototype.scanString = function () {
- assert(this.peek == exports.$SQ || this.peek == exports.$DQ);
- var start = this.index;
- var quote = this.peek;
- this.advance(); // Skip initial quote.
- var buffer;
- var marker = this.index;
- var input = this.input;
- while (this.peek != quote) {
- if (this.peek == exports.$BACKSLASH) {
- if (buffer == null)
- buffer = new lang_1.StringJoiner();
- buffer.add(input.substring(marker, this.index));
- this.advance();
- var unescapedCode;
- if (this.peek == $u) {
- // 4 character hex code for unicode character.
- var hex = input.substring(this.index + 1, this.index + 5);
- try {
- unescapedCode = lang_1.NumberWrapper.parseInt(hex, 16);
- }
- catch (e) {
- this.error("Invalid unicode escape [\\u" + hex + "]", 0);
- }
- for (var i = 0; i < 5; i++) {
- this.advance();
- }
- }
- else {
- unescapedCode = unescape(this.peek);
- this.advance();
- }
- buffer.add(lang_1.StringWrapper.fromCharCode(unescapedCode));
- marker = this.index;
- }
- else if (this.peek == exports.$EOF) {
- this.error('Unterminated quote', 0);
- }
- else {
- this.advance();
- }
- }
- var last = input.substring(marker, this.index);
- this.advance(); // Skip terminating quote.
- // Compute the unescaped string value.
- var unescaped = last;
- if (buffer != null) {
- buffer.add(last);
- unescaped = buffer.toString();
- }
- return newStringToken(start, unescaped);
- };
- _Scanner.prototype.error = function (message, offset) {
- var position = this.index + offset;
- throw new ScannerError("Lexer Error: " + message + " at column " + position + " in expression [" + this.input + "]");
- };
- return _Scanner;
- })();
- function isWhitespace(code) {
- return (code >= exports.$TAB && code <= exports.$SPACE) || (code == $NBSP);
- }
- function isIdentifierStart(code) {
- return ($a <= code && code <= $z) || ($A <= code && code <= $Z) || (code == $_) || (code == exports.$$);
- }
- function isIdentifier(input) {
- if (input.length == 0)
- return false;
- var scanner = new _Scanner(input);
- if (!isIdentifierStart(scanner.peek))
- return false;
- scanner.advance();
- while (scanner.peek !== exports.$EOF) {
- if (!isIdentifierPart(scanner.peek))
- return false;
- scanner.advance();
- }
- return true;
- }
- exports.isIdentifier = isIdentifier;
- function isIdentifierPart(code) {
- return ($a <= code && code <= $z) || ($A <= code && code <= $Z) || ($0 <= code && code <= $9) ||
- (code == $_) || (code == exports.$$);
- }
- function isDigit(code) {
- return $0 <= code && code <= $9;
- }
- function isExponentStart(code) {
- return code == $e || code == $E;
- }
- function isExponentSign(code) {
- return code == exports.$MINUS || code == exports.$PLUS;
- }
- function unescape(code) {
- switch (code) {
- case $n:
- return exports.$LF;
- case $f:
- return exports.$FF;
- case $r:
- return exports.$CR;
- case $t:
- return exports.$TAB;
- case $v:
- return exports.$VTAB;
- default:
- return code;
- }
- }
- var OPERATORS = collection_1.SetWrapper.createFromList([
- '+',
- '-',
- '*',
- '/',
- '%',
- '^',
- '=',
- '==',
- '!=',
- '===',
- '!==',
- '<',
- '>',
- '<=',
- '>=',
- '&&',
- '||',
- '&',
- '|',
- '!',
- '?',
- '#',
- '?.'
- ]);
- var KEYWORDS = collection_1.SetWrapper.createFromList(['var', 'null', 'undefined', 'true', 'false', 'if', 'else']);
- /***/ },
- /* 32 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var decorators_1 = __webpack_require__(8);
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var collection_1 = __webpack_require__(12);
- var lexer_1 = __webpack_require__(31);
- var reflection_1 = __webpack_require__(16);
- var ast_1 = __webpack_require__(30);
- var _implicitReceiver = new ast_1.ImplicitReceiver();
- // TODO(tbosch): Cannot make this const/final right now because of the transpiler...
- var INTERPOLATION_REGEXP = /\{\{(.*?)\}\}/g;
- var ParseException = (function (_super) {
- __extends(ParseException, _super);
- function ParseException(message, input, errLocation, ctxLocation) {
- _super.call(this, "Parser Error: " + message + " " + errLocation + " [" + input + "] in " + ctxLocation);
- }
- return ParseException;
- })(exceptions_1.BaseException);
- var Parser = (function () {
- function Parser(/** @internal */ _lexer, providedReflector) {
- if (providedReflector === void 0) { providedReflector = null; }
- this._lexer = _lexer;
- this._reflector = lang_1.isPresent(providedReflector) ? providedReflector : reflection_1.reflector;
- }
- Parser.prototype.parseAction = function (input, location) {
- this._checkNoInterpolation(input, location);
- var tokens = this._lexer.tokenize(input);
- var ast = new _ParseAST(input, location, tokens, this._reflector, true).parseChain();
- return new ast_1.ASTWithSource(ast, input, location);
- };
- Parser.prototype.parseBinding = function (input, location) {
- var ast = this._parseBindingAst(input, location);
- return new ast_1.ASTWithSource(ast, input, location);
- };
- Parser.prototype.parseSimpleBinding = function (input, location) {
- var ast = this._parseBindingAst(input, location);
- if (!SimpleExpressionChecker.check(ast)) {
- throw new ParseException('Host binding expression can only contain field access and constants', input, location);
- }
- return new ast_1.ASTWithSource(ast, input, location);
- };
- Parser.prototype._parseBindingAst = function (input, location) {
- // Quotes expressions use 3rd-party expression language. We don't want to use
- // our lexer or parser for that, so we check for that ahead of time.
- var quote = this._parseQuote(input, location);
- if (lang_1.isPresent(quote)) {
- return quote;
- }
- this._checkNoInterpolation(input, location);
- var tokens = this._lexer.tokenize(input);
- return new _ParseAST(input, location, tokens, this._reflector, false).parseChain();
- };
- Parser.prototype._parseQuote = function (input, location) {
- if (lang_1.isBlank(input))
- return null;
- var prefixSeparatorIndex = input.indexOf(':');
- if (prefixSeparatorIndex == -1)
- return null;
- var prefix = input.substring(0, prefixSeparatorIndex).trim();
- if (!lexer_1.isIdentifier(prefix))
- return null;
- var uninterpretedExpression = input.substring(prefixSeparatorIndex + 1);
- return new ast_1.Quote(prefix, uninterpretedExpression, location);
- };
- Parser.prototype.parseTemplateBindings = function (input, location) {
- var tokens = this._lexer.tokenize(input);
- return new _ParseAST(input, location, tokens, this._reflector, false).parseTemplateBindings();
- };
- Parser.prototype.parseInterpolation = function (input, location) {
- var parts = lang_1.StringWrapper.split(input, INTERPOLATION_REGEXP);
- if (parts.length <= 1) {
- return null;
- }
- var strings = [];
- var expressions = [];
- for (var i = 0; i < parts.length; i++) {
- var part = parts[i];
- if (i % 2 === 0) {
- // fixed string
- strings.push(part);
- }
- else if (part.trim().length > 0) {
- var tokens = this._lexer.tokenize(part);
- var ast = new _ParseAST(input, location, tokens, this._reflector, false).parseChain();
- expressions.push(ast);
- }
- else {
- throw new ParseException('Blank expressions are not allowed in interpolated strings', input, "at column " + this._findInterpolationErrorColumn(parts, i) + " in", location);
- }
- }
- return new ast_1.ASTWithSource(new ast_1.Interpolation(strings, expressions), input, location);
- };
- Parser.prototype.wrapLiteralPrimitive = function (input, location) {
- return new ast_1.ASTWithSource(new ast_1.LiteralPrimitive(input), input, location);
- };
- Parser.prototype._checkNoInterpolation = function (input, location) {
- var parts = lang_1.StringWrapper.split(input, INTERPOLATION_REGEXP);
- if (parts.length > 1) {
- throw new ParseException('Got interpolation ({{}}) where expression was expected', input, "at column " + this._findInterpolationErrorColumn(parts, 1) + " in", location);
- }
- };
- Parser.prototype._findInterpolationErrorColumn = function (parts, partInErrIdx) {
- var errLocation = '';
- for (var j = 0; j < partInErrIdx; j++) {
- errLocation += j % 2 === 0 ? parts[j] : "{{" + parts[j] + "}}";
- }
- return errLocation.length;
- };
- Parser = __decorate([
- decorators_1.Injectable(),
- __metadata('design:paramtypes', [lexer_1.Lexer, reflection_1.Reflector])
- ], Parser);
- return Parser;
- })();
- exports.Parser = Parser;
- var _ParseAST = (function () {
- function _ParseAST(input, location, tokens, reflector, parseAction) {
- this.input = input;
- this.location = location;
- this.tokens = tokens;
- this.reflector = reflector;
- this.parseAction = parseAction;
- this.index = 0;
- }
- _ParseAST.prototype.peek = function (offset) {
- var i = this.index + offset;
- return i < this.tokens.length ? this.tokens[i] : lexer_1.EOF;
- };
- Object.defineProperty(_ParseAST.prototype, "next", {
- get: function () { return this.peek(0); },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(_ParseAST.prototype, "inputIndex", {
- get: function () {
- return (this.index < this.tokens.length) ? this.next.index : this.input.length;
- },
- enumerable: true,
- configurable: true
- });
- _ParseAST.prototype.advance = function () { this.index++; };
- _ParseAST.prototype.optionalCharacter = function (code) {
- if (this.next.isCharacter(code)) {
- this.advance();
- return true;
- }
- else {
- return false;
- }
- };
- _ParseAST.prototype.optionalKeywordVar = function () {
- if (this.peekKeywordVar()) {
- this.advance();
- return true;
- }
- else {
- return false;
- }
- };
- _ParseAST.prototype.peekKeywordVar = function () { return this.next.isKeywordVar() || this.next.isOperator('#'); };
- _ParseAST.prototype.expectCharacter = function (code) {
- if (this.optionalCharacter(code))
- return;
- this.error("Missing expected " + lang_1.StringWrapper.fromCharCode(code));
- };
- _ParseAST.prototype.optionalOperator = function (op) {
- if (this.next.isOperator(op)) {
- this.advance();
- return true;
- }
- else {
- return false;
- }
- };
- _ParseAST.prototype.expectOperator = function (operator) {
- if (this.optionalOperator(operator))
- return;
- this.error("Missing expected operator " + operator);
- };
- _ParseAST.prototype.expectIdentifierOrKeyword = function () {
- var n = this.next;
- if (!n.isIdentifier() && !n.isKeyword()) {
- this.error("Unexpected token " + n + ", expected identifier or keyword");
- }
- this.advance();
- return n.toString();
- };
- _ParseAST.prototype.expectIdentifierOrKeywordOrString = function () {
- var n = this.next;
- if (!n.isIdentifier() && !n.isKeyword() && !n.isString()) {
- this.error("Unexpected token " + n + ", expected identifier, keyword, or string");
- }
- this.advance();
- return n.toString();
- };
- _ParseAST.prototype.parseChain = function () {
- var exprs = [];
- while (this.index < this.tokens.length) {
- var expr = this.parsePipe();
- exprs.push(expr);
- if (this.optionalCharacter(lexer_1.$SEMICOLON)) {
- if (!this.parseAction) {
- this.error("Binding expression cannot contain chained expression");
- }
- while (this.optionalCharacter(lexer_1.$SEMICOLON)) {
- } // read all semicolons
- }
- else if (this.index < this.tokens.length) {
- this.error("Unexpected token '" + this.next + "'");
- }
- }
- if (exprs.length == 0)
- return new ast_1.EmptyExpr();
- if (exprs.length == 1)
- return exprs[0];
- return new ast_1.Chain(exprs);
- };
- _ParseAST.prototype.parsePipe = function () {
- var result = this.parseExpression();
- if (this.optionalOperator("|")) {
- if (this.parseAction) {
- this.error("Cannot have a pipe in an action expression");
- }
- do {
- var name = this.expectIdentifierOrKeyword();
- var args = [];
- while (this.optionalCharacter(lexer_1.$COLON)) {
- args.push(this.parseExpression());
- }
- result = new ast_1.BindingPipe(result, name, args);
- } while (this.optionalOperator("|"));
- }
- return result;
- };
- _ParseAST.prototype.parseExpression = function () { return this.parseConditional(); };
- _ParseAST.prototype.parseConditional = function () {
- var start = this.inputIndex;
- var result = this.parseLogicalOr();
- if (this.optionalOperator('?')) {
- var yes = this.parsePipe();
- if (!this.optionalCharacter(lexer_1.$COLON)) {
- var end = this.inputIndex;
- var expression = this.input.substring(start, end);
- this.error("Conditional expression " + expression + " requires all 3 expressions");
- }
- var no = this.parsePipe();
- return new ast_1.Conditional(result, yes, no);
- }
- else {
- return result;
- }
- };
- _ParseAST.prototype.parseLogicalOr = function () {
- // '||'
- var result = this.parseLogicalAnd();
- while (this.optionalOperator('||')) {
- result = new ast_1.Binary('||', result, this.parseLogicalAnd());
- }
- return result;
- };
- _ParseAST.prototype.parseLogicalAnd = function () {
- // '&&'
- var result = this.parseEquality();
- while (this.optionalOperator('&&')) {
- result = new ast_1.Binary('&&', result, this.parseEquality());
- }
- return result;
- };
- _ParseAST.prototype.parseEquality = function () {
- // '==','!=','===','!=='
- var result = this.parseRelational();
- while (true) {
- if (this.optionalOperator('==')) {
- result = new ast_1.Binary('==', result, this.parseRelational());
- }
- else if (this.optionalOperator('===')) {
- result = new ast_1.Binary('===', result, this.parseRelational());
- }
- else if (this.optionalOperator('!=')) {
- result = new ast_1.Binary('!=', result, this.parseRelational());
- }
- else if (this.optionalOperator('!==')) {
- result = new ast_1.Binary('!==', result, this.parseRelational());
- }
- else {
- return result;
- }
- }
- };
- _ParseAST.prototype.parseRelational = function () {
- // '<', '>', '<=', '>='
- var result = this.parseAdditive();
- while (true) {
- if (this.optionalOperator('<')) {
- result = new ast_1.Binary('<', result, this.parseAdditive());
- }
- else if (this.optionalOperator('>')) {
- result = new ast_1.Binary('>', result, this.parseAdditive());
- }
- else if (this.optionalOperator('<=')) {
- result = new ast_1.Binary('<=', result, this.parseAdditive());
- }
- else if (this.optionalOperator('>=')) {
- result = new ast_1.Binary('>=', result, this.parseAdditive());
- }
- else {
- return result;
- }
- }
- };
- _ParseAST.prototype.parseAdditive = function () {
- // '+', '-'
- var result = this.parseMultiplicative();
- while (true) {
- if (this.optionalOperator('+')) {
- result = new ast_1.Binary('+', result, this.parseMultiplicative());
- }
- else if (this.optionalOperator('-')) {
- result = new ast_1.Binary('-', result, this.parseMultiplicative());
- }
- else {
- return result;
- }
- }
- };
- _ParseAST.prototype.parseMultiplicative = function () {
- // '*', '%', '/'
- var result = this.parsePrefix();
- while (true) {
- if (this.optionalOperator('*')) {
- result = new ast_1.Binary('*', result, this.parsePrefix());
- }
- else if (this.optionalOperator('%')) {
- result = new ast_1.Binary('%', result, this.parsePrefix());
- }
- else if (this.optionalOperator('/')) {
- result = new ast_1.Binary('/', result, this.parsePrefix());
- }
- else {
- return result;
- }
- }
- };
- _ParseAST.prototype.parsePrefix = function () {
- if (this.optionalOperator('+')) {
- return this.parsePrefix();
- }
- else if (this.optionalOperator('-')) {
- return new ast_1.Binary('-', new ast_1.LiteralPrimitive(0), this.parsePrefix());
- }
- else if (this.optionalOperator('!')) {
- return new ast_1.PrefixNot(this.parsePrefix());
- }
- else {
- return this.parseCallChain();
- }
- };
- _ParseAST.prototype.parseCallChain = function () {
- var result = this.parsePrimary();
- while (true) {
- if (this.optionalCharacter(lexer_1.$PERIOD)) {
- result = this.parseAccessMemberOrMethodCall(result, false);
- }
- else if (this.optionalOperator('?.')) {
- result = this.parseAccessMemberOrMethodCall(result, true);
- }
- else if (this.optionalCharacter(lexer_1.$LBRACKET)) {
- var key = this.parsePipe();
- this.expectCharacter(lexer_1.$RBRACKET);
- if (this.optionalOperator("=")) {
- var value = this.parseConditional();
- result = new ast_1.KeyedWrite(result, key, value);
- }
- else {
- result = new ast_1.KeyedRead(result, key);
- }
- }
- else if (this.optionalCharacter(lexer_1.$LPAREN)) {
- var args = this.parseCallArguments();
- this.expectCharacter(lexer_1.$RPAREN);
- result = new ast_1.FunctionCall(result, args);
- }
- else {
- return result;
- }
- }
- };
- _ParseAST.prototype.parsePrimary = function () {
- if (this.optionalCharacter(lexer_1.$LPAREN)) {
- var result = this.parsePipe();
- this.expectCharacter(lexer_1.$RPAREN);
- return result;
- }
- else if (this.next.isKeywordNull() || this.next.isKeywordUndefined()) {
- this.advance();
- return new ast_1.LiteralPrimitive(null);
- }
- else if (this.next.isKeywordTrue()) {
- this.advance();
- return new ast_1.LiteralPrimitive(true);
- }
- else if (this.next.isKeywordFalse()) {
- this.advance();
- return new ast_1.LiteralPrimitive(false);
- }
- else if (this.optionalCharacter(lexer_1.$LBRACKET)) {
- var elements = this.parseExpressionList(lexer_1.$RBRACKET);
- this.expectCharacter(lexer_1.$RBRACKET);
- return new ast_1.LiteralArray(elements);
- }
- else if (this.next.isCharacter(lexer_1.$LBRACE)) {
- return this.parseLiteralMap();
- }
- else if (this.next.isIdentifier()) {
- return this.parseAccessMemberOrMethodCall(_implicitReceiver, false);
- }
- else if (this.next.isNumber()) {
- var value = this.next.toNumber();
- this.advance();
- return new ast_1.LiteralPrimitive(value);
- }
- else if (this.next.isString()) {
- var literalValue = this.next.toString();
- this.advance();
- return new ast_1.LiteralPrimitive(literalValue);
- }
- else if (this.index >= this.tokens.length) {
- this.error("Unexpected end of expression: " + this.input);
- }
- else {
- this.error("Unexpected token " + this.next);
- }
- // error() throws, so we don't reach here.
- throw new exceptions_1.BaseException("Fell through all cases in parsePrimary");
- };
- _ParseAST.prototype.parseExpressionList = function (terminator) {
- var result = [];
- if (!this.next.isCharacter(terminator)) {
- do {
- result.push(this.parsePipe());
- } while (this.optionalCharacter(lexer_1.$COMMA));
- }
- return result;
- };
- _ParseAST.prototype.parseLiteralMap = function () {
- var keys = [];
- var values = [];
- this.expectCharacter(lexer_1.$LBRACE);
- if (!this.optionalCharacter(lexer_1.$RBRACE)) {
- do {
- var key = this.expectIdentifierOrKeywordOrString();
- keys.push(key);
- this.expectCharacter(lexer_1.$COLON);
- values.push(this.parsePipe());
- } while (this.optionalCharacter(lexer_1.$COMMA));
- this.expectCharacter(lexer_1.$RBRACE);
- }
- return new ast_1.LiteralMap(keys, values);
- };
- _ParseAST.prototype.parseAccessMemberOrMethodCall = function (receiver, isSafe) {
- if (isSafe === void 0) { isSafe = false; }
- var id = this.expectIdentifierOrKeyword();
- if (this.optionalCharacter(lexer_1.$LPAREN)) {
- var args = this.parseCallArguments();
- this.expectCharacter(lexer_1.$RPAREN);
- var fn = this.reflector.method(id);
- return isSafe ? new ast_1.SafeMethodCall(receiver, id, fn, args) :
- new ast_1.MethodCall(receiver, id, fn, args);
- }
- else {
- if (isSafe) {
- if (this.optionalOperator("=")) {
- this.error("The '?.' operator cannot be used in the assignment");
- }
- else {
- return new ast_1.SafePropertyRead(receiver, id, this.reflector.getter(id));
- }
- }
- else {
- if (this.optionalOperator("=")) {
- if (!this.parseAction) {
- this.error("Bindings cannot contain assignments");
- }
- var value = this.parseConditional();
- return new ast_1.PropertyWrite(receiver, id, this.reflector.setter(id), value);
- }
- else {
- return new ast_1.PropertyRead(receiver, id, this.reflector.getter(id));
- }
- }
- }
- return null;
- };
- _ParseAST.prototype.parseCallArguments = function () {
- if (this.next.isCharacter(lexer_1.$RPAREN))
- return [];
- var positionals = [];
- do {
- positionals.push(this.parsePipe());
- } while (this.optionalCharacter(lexer_1.$COMMA));
- return positionals;
- };
- _ParseAST.prototype.parseBlockContent = function () {
- if (!this.parseAction) {
- this.error("Binding expression cannot contain chained expression");
- }
- var exprs = [];
- while (this.index < this.tokens.length && !this.next.isCharacter(lexer_1.$RBRACE)) {
- var expr = this.parseExpression();
- exprs.push(expr);
- if (this.optionalCharacter(lexer_1.$SEMICOLON)) {
- while (this.optionalCharacter(lexer_1.$SEMICOLON)) {
- } // read all semicolons
- }
- }
- if (exprs.length == 0)
- return new ast_1.EmptyExpr();
- if (exprs.length == 1)
- return exprs[0];
- return new ast_1.Chain(exprs);
- };
- /**
- * An identifier, a keyword, a string with an optional `-` inbetween.
- */
- _ParseAST.prototype.expectTemplateBindingKey = function () {
- var result = '';
- var operatorFound = false;
- do {
- result += this.expectIdentifierOrKeywordOrString();
- operatorFound = this.optionalOperator('-');
- if (operatorFound) {
- result += '-';
- }
- } while (operatorFound);
- return result.toString();
- };
- _ParseAST.prototype.parseTemplateBindings = function () {
- var bindings = [];
- var prefix = null;
- while (this.index < this.tokens.length) {
- var keyIsVar = this.optionalKeywordVar();
- var key = this.expectTemplateBindingKey();
- if (!keyIsVar) {
- if (prefix == null) {
- prefix = key;
- }
- else {
- key = prefix + key[0].toUpperCase() + key.substring(1);
- }
- }
- this.optionalCharacter(lexer_1.$COLON);
- var name = null;
- var expression = null;
- if (keyIsVar) {
- if (this.optionalOperator("=")) {
- name = this.expectTemplateBindingKey();
- }
- else {
- name = '\$implicit';
- }
- }
- else if (this.next !== lexer_1.EOF && !this.peekKeywordVar()) {
- var start = this.inputIndex;
- var ast = this.parsePipe();
- var source = this.input.substring(start, this.inputIndex);
- expression = new ast_1.ASTWithSource(ast, source, this.location);
- }
- bindings.push(new ast_1.TemplateBinding(key, keyIsVar, name, expression));
- if (!this.optionalCharacter(lexer_1.$SEMICOLON)) {
- this.optionalCharacter(lexer_1.$COMMA);
- }
- }
- return bindings;
- };
- _ParseAST.prototype.error = function (message, index) {
- if (index === void 0) { index = null; }
- if (lang_1.isBlank(index))
- index = this.index;
- var location = (index < this.tokens.length) ? "at column " + (this.tokens[index].index + 1) + " in" :
- "at the end of the expression";
- throw new ParseException(message, this.input, location, this.location);
- };
- return _ParseAST;
- })();
- exports._ParseAST = _ParseAST;
- var SimpleExpressionChecker = (function () {
- function SimpleExpressionChecker() {
- this.simple = true;
- }
- SimpleExpressionChecker.check = function (ast) {
- var s = new SimpleExpressionChecker();
- ast.visit(s);
- return s.simple;
- };
- SimpleExpressionChecker.prototype.visitImplicitReceiver = function (ast) { };
- SimpleExpressionChecker.prototype.visitInterpolation = function (ast) { this.simple = false; };
- SimpleExpressionChecker.prototype.visitLiteralPrimitive = function (ast) { };
- SimpleExpressionChecker.prototype.visitPropertyRead = function (ast) { };
- SimpleExpressionChecker.prototype.visitPropertyWrite = function (ast) { this.simple = false; };
- SimpleExpressionChecker.prototype.visitSafePropertyRead = function (ast) { this.simple = false; };
- SimpleExpressionChecker.prototype.visitMethodCall = function (ast) { this.simple = false; };
- SimpleExpressionChecker.prototype.visitSafeMethodCall = function (ast) { this.simple = false; };
- SimpleExpressionChecker.prototype.visitFunctionCall = function (ast) { this.simple = false; };
- SimpleExpressionChecker.prototype.visitLiteralArray = function (ast) { this.visitAll(ast.expressions); };
- SimpleExpressionChecker.prototype.visitLiteralMap = function (ast) { this.visitAll(ast.values); };
- SimpleExpressionChecker.prototype.visitBinary = function (ast) { this.simple = false; };
- SimpleExpressionChecker.prototype.visitPrefixNot = function (ast) { this.simple = false; };
- SimpleExpressionChecker.prototype.visitConditional = function (ast) { this.simple = false; };
- SimpleExpressionChecker.prototype.visitPipe = function (ast) { this.simple = false; };
- SimpleExpressionChecker.prototype.visitKeyedRead = function (ast) { this.simple = false; };
- SimpleExpressionChecker.prototype.visitKeyedWrite = function (ast) { this.simple = false; };
- SimpleExpressionChecker.prototype.visitAll = function (asts) {
- var res = collection_1.ListWrapper.createFixedSize(asts.length);
- for (var i = 0; i < asts.length; ++i) {
- res[i] = asts[i].visit(this);
- }
- return res;
- };
- SimpleExpressionChecker.prototype.visitChain = function (ast) { this.simple = false; };
- SimpleExpressionChecker.prototype.visitQuote = function (ast) { this.simple = false; };
- return SimpleExpressionChecker;
- })();
- /***/ },
- /* 33 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var collection_1 = __webpack_require__(12);
- var Locals = (function () {
- function Locals(parent, current) {
- this.parent = parent;
- this.current = current;
- }
- Locals.prototype.contains = function (name) {
- if (this.current.has(name)) {
- return true;
- }
- if (lang_1.isPresent(this.parent)) {
- return this.parent.contains(name);
- }
- return false;
- };
- Locals.prototype.get = function (name) {
- if (this.current.has(name)) {
- return this.current.get(name);
- }
- if (lang_1.isPresent(this.parent)) {
- return this.parent.get(name);
- }
- throw new exceptions_1.BaseException("Cannot find '" + name + "'");
- };
- Locals.prototype.set = function (name, value) {
- // TODO(rado): consider removing this check if we can guarantee this is not
- // exposed to the public API.
- // TODO: vsavkin maybe it should check only the local map
- if (this.current.has(name)) {
- this.current.set(name, value);
- }
- else {
- throw new exceptions_1.BaseException("Setting of new keys post-construction is not supported. Key: " + name + ".");
- }
- };
- Locals.prototype.clearValues = function () { collection_1.MapWrapper.clearValues(this.current); };
- return Locals;
- })();
- exports.Locals = Locals;
- /***/ },
- /* 34 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var exceptions_1 = __webpack_require__(14);
- /**
- * An error thrown if application changes model breaking the top-down data flow.
- *
- * This exception is only thrown in dev mode.
- *
- * <!-- TODO: Add a link once the dev mode option is configurable -->
- *
- * ### Example
- *
- * ```typescript
- * @Component({
- * selector: 'parent',
- * template: `
- * <child [prop]="parentProp"></child>
- * `,
- * directives: [forwardRef(() => Child)]
- * })
- * class Parent {
- * parentProp = "init";
- * }
- *
- * @Directive({selector: 'child', inputs: ['prop']})
- * class Child {
- * constructor(public parent: Parent) {}
- *
- * set prop(v) {
- * // this updates the parent property, which is disallowed during change detection
- * // this will result in ExpressionChangedAfterItHasBeenCheckedException
- * this.parent.parentProp = "updated";
- * }
- * }
- * ```
- */
- var ExpressionChangedAfterItHasBeenCheckedException = (function (_super) {
- __extends(ExpressionChangedAfterItHasBeenCheckedException, _super);
- function ExpressionChangedAfterItHasBeenCheckedException(exp, oldValue, currValue, context) {
- _super.call(this, ("Expression '" + exp + "' has changed after it was checked. ") +
- ("Previous value: '" + oldValue + "'. Current value: '" + currValue + "'"));
- }
- return ExpressionChangedAfterItHasBeenCheckedException;
- })(exceptions_1.BaseException);
- exports.ExpressionChangedAfterItHasBeenCheckedException = ExpressionChangedAfterItHasBeenCheckedException;
- /**
- * Thrown when an expression evaluation raises an exception.
- *
- * This error wraps the original exception to attach additional contextual information that can
- * be useful for debugging.
- *
- * ### Example ([live demo](http://plnkr.co/edit/2Kywoz?p=preview))
- *
- * ```typescript
- * @Directive({selector: 'child', inputs: ['prop']})
- * class Child {
- * prop;
- * }
- *
- * @Component({
- * selector: 'app',
- * template: `
- * <child [prop]="field.first"></child>
- * `,
- * directives: [Child]
- * })
- * class App {
- * field = null;
- * }
- *
- * bootstrap(App);
- * ```
- *
- * You can access the original exception and stack through the `originalException` and
- * `originalStack` properties.
- */
- var ChangeDetectionError = (function (_super) {
- __extends(ChangeDetectionError, _super);
- function ChangeDetectionError(exp, originalException, originalStack, context) {
- _super.call(this, originalException + " in [" + exp + "]", originalException, originalStack, context);
- this.location = exp;
- }
- return ChangeDetectionError;
- })(exceptions_1.WrappedException);
- exports.ChangeDetectionError = ChangeDetectionError;
- /**
- * Thrown when change detector executes on dehydrated view.
- *
- * This error indicates a bug in the framework.
- *
- * This is an internal Angular error.
- */
- var DehydratedException = (function (_super) {
- __extends(DehydratedException, _super);
- function DehydratedException() {
- _super.call(this, 'Attempt to detect changes on a dehydrated detector.');
- }
- return DehydratedException;
- })(exceptions_1.BaseException);
- exports.DehydratedException = DehydratedException;
- /***/ },
- /* 35 */
- /***/ function(module, exports) {
- var DebugContext = (function () {
- function DebugContext(element, componentElement, directive, context, locals, injector) {
- this.element = element;
- this.componentElement = componentElement;
- this.directive = directive;
- this.context = context;
- this.locals = locals;
- this.injector = injector;
- }
- return DebugContext;
- })();
- exports.DebugContext = DebugContext;
- var ChangeDetectorGenConfig = (function () {
- function ChangeDetectorGenConfig(genDebugInfo, logBindingUpdate, useJit) {
- this.genDebugInfo = genDebugInfo;
- this.logBindingUpdate = logBindingUpdate;
- this.useJit = useJit;
- }
- return ChangeDetectorGenConfig;
- })();
- exports.ChangeDetectorGenConfig = ChangeDetectorGenConfig;
- var ChangeDetectorDefinition = (function () {
- function ChangeDetectorDefinition(id, strategy, variableNames, bindingRecords, eventRecords, directiveRecords, genConfig) {
- this.id = id;
- this.strategy = strategy;
- this.variableNames = variableNames;
- this.bindingRecords = bindingRecords;
- this.eventRecords = eventRecords;
- this.directiveRecords = directiveRecords;
- this.genConfig = genConfig;
- }
- return ChangeDetectorDefinition;
- })();
- exports.ChangeDetectorDefinition = ChangeDetectorDefinition;
- /***/ },
- /* 36 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- /**
- * Describes the current state of the change detector.
- */
- (function (ChangeDetectorState) {
- /**
- * `NeverChecked` means that the change detector has not been checked yet, and
- * initialization methods should be called during detection.
- */
- ChangeDetectorState[ChangeDetectorState["NeverChecked"] = 0] = "NeverChecked";
- /**
- * `CheckedBefore` means that the change detector has successfully completed at least
- * one detection previously.
- */
- ChangeDetectorState[ChangeDetectorState["CheckedBefore"] = 1] = "CheckedBefore";
- /**
- * `Errored` means that the change detector encountered an error checking a binding
- * or calling a directive lifecycle method and is now in an inconsistent state. Change
- * detectors in this state will no longer detect changes.
- */
- ChangeDetectorState[ChangeDetectorState["Errored"] = 2] = "Errored";
- })(exports.ChangeDetectorState || (exports.ChangeDetectorState = {}));
- var ChangeDetectorState = exports.ChangeDetectorState;
- /**
- * Describes within the change detector which strategy will be used the next time change
- * detection is triggered.
- */
- (function (ChangeDetectionStrategy) {
- /**
- * `CheckedOnce` means that after calling detectChanges the mode of the change detector
- * will become `Checked`.
- */
- ChangeDetectionStrategy[ChangeDetectionStrategy["CheckOnce"] = 0] = "CheckOnce";
- /**
- * `Checked` means that the change detector should be skipped until its mode changes to
- * `CheckOnce`.
- */
- ChangeDetectionStrategy[ChangeDetectionStrategy["Checked"] = 1] = "Checked";
- /**
- * `CheckAlways` means that after calling detectChanges the mode of the change detector
- * will remain `CheckAlways`.
- */
- ChangeDetectionStrategy[ChangeDetectionStrategy["CheckAlways"] = 2] = "CheckAlways";
- /**
- * `Detached` means that the change detector sub tree is not a part of the main tree and
- * should be skipped.
- */
- ChangeDetectionStrategy[ChangeDetectionStrategy["Detached"] = 3] = "Detached";
- /**
- * `OnPush` means that the change detector's mode will be set to `CheckOnce` during hydration.
- */
- ChangeDetectionStrategy[ChangeDetectionStrategy["OnPush"] = 4] = "OnPush";
- /**
- * `Default` means that the change detector's mode will be set to `CheckAlways` during hydration.
- */
- ChangeDetectionStrategy[ChangeDetectionStrategy["Default"] = 5] = "Default";
- /**
- * This is an experimental feature. Works only in Dart.
- */
- ChangeDetectionStrategy[ChangeDetectionStrategy["OnPushObserve"] = 6] = "OnPushObserve";
- })(exports.ChangeDetectionStrategy || (exports.ChangeDetectionStrategy = {}));
- var ChangeDetectionStrategy = exports.ChangeDetectionStrategy;
- /**
- * List of possible {@link ChangeDetectionStrategy} values.
- */
- exports.CHANGE_DETECTION_STRATEGY_VALUES = [
- ChangeDetectionStrategy.CheckOnce,
- ChangeDetectionStrategy.Checked,
- ChangeDetectionStrategy.CheckAlways,
- ChangeDetectionStrategy.Detached,
- ChangeDetectionStrategy.OnPush,
- ChangeDetectionStrategy.Default,
- ChangeDetectionStrategy.OnPushObserve
- ];
- /**
- * List of possible {@link ChangeDetectorState} values.
- */
- exports.CHANGE_DETECTOR_STATE_VALUES = [
- ChangeDetectorState.NeverChecked,
- ChangeDetectorState.CheckedBefore,
- ChangeDetectorState.Errored
- ];
- function isDefaultChangeDetectionStrategy(changeDetectionStrategy) {
- return lang_1.isBlank(changeDetectionStrategy) ||
- changeDetectionStrategy === ChangeDetectionStrategy.Default;
- }
- exports.isDefaultChangeDetectionStrategy = isDefaultChangeDetectionStrategy;
- /***/ },
- /* 37 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var collection_1 = __webpack_require__(12);
- var ast_1 = __webpack_require__(30);
- var change_detection_util_1 = __webpack_require__(38);
- var dynamic_change_detector_1 = __webpack_require__(42);
- var directive_record_1 = __webpack_require__(41);
- var event_binding_1 = __webpack_require__(49);
- var coalesce_1 = __webpack_require__(50);
- var proto_record_1 = __webpack_require__(48);
- var DynamicProtoChangeDetector = (function () {
- function DynamicProtoChangeDetector(_definition) {
- this._definition = _definition;
- this._propertyBindingRecords = createPropertyRecords(_definition);
- this._eventBindingRecords = createEventRecords(_definition);
- this._propertyBindingTargets = this._definition.bindingRecords.map(function (b) { return b.target; });
- this._directiveIndices = this._definition.directiveRecords.map(function (d) { return d.directiveIndex; });
- }
- DynamicProtoChangeDetector.prototype.instantiate = function (dispatcher) {
- return new dynamic_change_detector_1.DynamicChangeDetector(this._definition.id, dispatcher, this._propertyBindingRecords.length, this._propertyBindingTargets, this._directiveIndices, this._definition.strategy, this._propertyBindingRecords, this._eventBindingRecords, this._definition.directiveRecords, this._definition.genConfig);
- };
- return DynamicProtoChangeDetector;
- })();
- exports.DynamicProtoChangeDetector = DynamicProtoChangeDetector;
- function createPropertyRecords(definition) {
- var recordBuilder = new ProtoRecordBuilder();
- collection_1.ListWrapper.forEachWithIndex(definition.bindingRecords, function (b, index) { return recordBuilder.add(b, definition.variableNames, index); });
- return coalesce_1.coalesce(recordBuilder.records);
- }
- exports.createPropertyRecords = createPropertyRecords;
- function createEventRecords(definition) {
- // TODO: vsavkin: remove $event when the compiler handles render-side variables properly
- var varNames = collection_1.ListWrapper.concat(['$event'], definition.variableNames);
- return definition.eventRecords.map(function (er) {
- var records = _ConvertAstIntoProtoRecords.create(er, varNames);
- var dirIndex = er.implicitReceiver instanceof directive_record_1.DirectiveIndex ? er.implicitReceiver : null;
- return new event_binding_1.EventBinding(er.target.name, er.target.elementIndex, dirIndex, records);
- });
- }
- exports.createEventRecords = createEventRecords;
- var ProtoRecordBuilder = (function () {
- function ProtoRecordBuilder() {
- this.records = [];
- }
- ProtoRecordBuilder.prototype.add = function (b, variableNames, bindingIndex) {
- var oldLast = collection_1.ListWrapper.last(this.records);
- if (lang_1.isPresent(oldLast) && oldLast.bindingRecord.directiveRecord == b.directiveRecord) {
- oldLast.lastInDirective = false;
- }
- var numberOfRecordsBefore = this.records.length;
- this._appendRecords(b, variableNames, bindingIndex);
- var newLast = collection_1.ListWrapper.last(this.records);
- if (lang_1.isPresent(newLast) && newLast !== oldLast) {
- newLast.lastInBinding = true;
- newLast.lastInDirective = true;
- this._setArgumentToPureFunction(numberOfRecordsBefore);
- }
- };
- /** @internal */
- ProtoRecordBuilder.prototype._setArgumentToPureFunction = function (startIndex) {
- var _this = this;
- for (var i = startIndex; i < this.records.length; ++i) {
- var rec = this.records[i];
- if (rec.isPureFunction()) {
- rec.args.forEach(function (recordIndex) { return _this.records[recordIndex - 1].argumentToPureFunction =
- true; });
- }
- if (rec.mode === proto_record_1.RecordType.Pipe) {
- rec.args.forEach(function (recordIndex) { return _this.records[recordIndex - 1].argumentToPureFunction =
- true; });
- this.records[rec.contextIndex - 1].argumentToPureFunction = true;
- }
- }
- };
- /** @internal */
- ProtoRecordBuilder.prototype._appendRecords = function (b, variableNames, bindingIndex) {
- if (b.isDirectiveLifecycle()) {
- this.records.push(new proto_record_1.ProtoRecord(proto_record_1.RecordType.DirectiveLifecycle, b.lifecycleEvent, null, [], [], -1, null, this.records.length + 1, b, false, false, false, false, null));
- }
- else {
- _ConvertAstIntoProtoRecords.append(this.records, b, variableNames, bindingIndex);
- }
- };
- return ProtoRecordBuilder;
- })();
- exports.ProtoRecordBuilder = ProtoRecordBuilder;
- var _ConvertAstIntoProtoRecords = (function () {
- function _ConvertAstIntoProtoRecords(_records, _bindingRecord, _variableNames, _bindingIndex) {
- this._records = _records;
- this._bindingRecord = _bindingRecord;
- this._variableNames = _variableNames;
- this._bindingIndex = _bindingIndex;
- }
- _ConvertAstIntoProtoRecords.append = function (records, b, variableNames, bindingIndex) {
- var c = new _ConvertAstIntoProtoRecords(records, b, variableNames, bindingIndex);
- b.ast.visit(c);
- };
- _ConvertAstIntoProtoRecords.create = function (b, variableNames) {
- var rec = [];
- _ConvertAstIntoProtoRecords.append(rec, b, variableNames, null);
- rec[rec.length - 1].lastInBinding = true;
- return rec;
- };
- _ConvertAstIntoProtoRecords.prototype.visitImplicitReceiver = function (ast) { return this._bindingRecord.implicitReceiver; };
- _ConvertAstIntoProtoRecords.prototype.visitInterpolation = function (ast) {
- var args = this._visitAll(ast.expressions);
- return this._addRecord(proto_record_1.RecordType.Interpolate, "interpolate", _interpolationFn(ast.strings), args, ast.strings, 0);
- };
- _ConvertAstIntoProtoRecords.prototype.visitLiteralPrimitive = function (ast) {
- return this._addRecord(proto_record_1.RecordType.Const, "literal", ast.value, [], null, 0);
- };
- _ConvertAstIntoProtoRecords.prototype.visitPropertyRead = function (ast) {
- var receiver = ast.receiver.visit(this);
- if (lang_1.isPresent(this._variableNames) && collection_1.ListWrapper.contains(this._variableNames, ast.name) &&
- ast.receiver instanceof ast_1.ImplicitReceiver) {
- return this._addRecord(proto_record_1.RecordType.Local, ast.name, ast.name, [], null, receiver);
- }
- else {
- return this._addRecord(proto_record_1.RecordType.PropertyRead, ast.name, ast.getter, [], null, receiver);
- }
- };
- _ConvertAstIntoProtoRecords.prototype.visitPropertyWrite = function (ast) {
- if (lang_1.isPresent(this._variableNames) && collection_1.ListWrapper.contains(this._variableNames, ast.name) &&
- ast.receiver instanceof ast_1.ImplicitReceiver) {
- throw new exceptions_1.BaseException("Cannot reassign a variable binding " + ast.name);
- }
- else {
- var receiver = ast.receiver.visit(this);
- var value = ast.value.visit(this);
- return this._addRecord(proto_record_1.RecordType.PropertyWrite, ast.name, ast.setter, [value], null, receiver);
- }
- };
- _ConvertAstIntoProtoRecords.prototype.visitKeyedWrite = function (ast) {
- var obj = ast.obj.visit(this);
- var key = ast.key.visit(this);
- var value = ast.value.visit(this);
- return this._addRecord(proto_record_1.RecordType.KeyedWrite, null, null, [key, value], null, obj);
- };
- _ConvertAstIntoProtoRecords.prototype.visitSafePropertyRead = function (ast) {
- var receiver = ast.receiver.visit(this);
- return this._addRecord(proto_record_1.RecordType.SafeProperty, ast.name, ast.getter, [], null, receiver);
- };
- _ConvertAstIntoProtoRecords.prototype.visitMethodCall = function (ast) {
- var receiver = ast.receiver.visit(this);
- var args = this._visitAll(ast.args);
- if (lang_1.isPresent(this._variableNames) && collection_1.ListWrapper.contains(this._variableNames, ast.name)) {
- var target = this._addRecord(proto_record_1.RecordType.Local, ast.name, ast.name, [], null, receiver);
- return this._addRecord(proto_record_1.RecordType.InvokeClosure, "closure", null, args, null, target);
- }
- else {
- return this._addRecord(proto_record_1.RecordType.InvokeMethod, ast.name, ast.fn, args, null, receiver);
- }
- };
- _ConvertAstIntoProtoRecords.prototype.visitSafeMethodCall = function (ast) {
- var receiver = ast.receiver.visit(this);
- var args = this._visitAll(ast.args);
- return this._addRecord(proto_record_1.RecordType.SafeMethodInvoke, ast.name, ast.fn, args, null, receiver);
- };
- _ConvertAstIntoProtoRecords.prototype.visitFunctionCall = function (ast) {
- var target = ast.target.visit(this);
- var args = this._visitAll(ast.args);
- return this._addRecord(proto_record_1.RecordType.InvokeClosure, "closure", null, args, null, target);
- };
- _ConvertAstIntoProtoRecords.prototype.visitLiteralArray = function (ast) {
- var primitiveName = "arrayFn" + ast.expressions.length;
- return this._addRecord(proto_record_1.RecordType.CollectionLiteral, primitiveName, _arrayFn(ast.expressions.length), this._visitAll(ast.expressions), null, 0);
- };
- _ConvertAstIntoProtoRecords.prototype.visitLiteralMap = function (ast) {
- return this._addRecord(proto_record_1.RecordType.CollectionLiteral, _mapPrimitiveName(ast.keys), change_detection_util_1.ChangeDetectionUtil.mapFn(ast.keys), this._visitAll(ast.values), null, 0);
- };
- _ConvertAstIntoProtoRecords.prototype.visitBinary = function (ast) {
- var left = ast.left.visit(this);
- switch (ast.operation) {
- case '&&':
- var branchEnd = [null];
- this._addRecord(proto_record_1.RecordType.SkipRecordsIfNot, "SkipRecordsIfNot", null, [], branchEnd, left);
- var right = ast.right.visit(this);
- branchEnd[0] = right;
- return this._addRecord(proto_record_1.RecordType.PrimitiveOp, "cond", change_detection_util_1.ChangeDetectionUtil.cond, [left, right, left], null, 0);
- case '||':
- var branchEnd = [null];
- this._addRecord(proto_record_1.RecordType.SkipRecordsIf, "SkipRecordsIf", null, [], branchEnd, left);
- var right = ast.right.visit(this);
- branchEnd[0] = right;
- return this._addRecord(proto_record_1.RecordType.PrimitiveOp, "cond", change_detection_util_1.ChangeDetectionUtil.cond, [left, left, right], null, 0);
- default:
- var right = ast.right.visit(this);
- return this._addRecord(proto_record_1.RecordType.PrimitiveOp, _operationToPrimitiveName(ast.operation), _operationToFunction(ast.operation), [left, right], null, 0);
- }
- };
- _ConvertAstIntoProtoRecords.prototype.visitPrefixNot = function (ast) {
- var exp = ast.expression.visit(this);
- return this._addRecord(proto_record_1.RecordType.PrimitiveOp, "operation_negate", change_detection_util_1.ChangeDetectionUtil.operation_negate, [exp], null, 0);
- };
- _ConvertAstIntoProtoRecords.prototype.visitConditional = function (ast) {
- var condition = ast.condition.visit(this);
- var startOfFalseBranch = [null];
- var endOfFalseBranch = [null];
- this._addRecord(proto_record_1.RecordType.SkipRecordsIfNot, "SkipRecordsIfNot", null, [], startOfFalseBranch, condition);
- var whenTrue = ast.trueExp.visit(this);
- var skip = this._addRecord(proto_record_1.RecordType.SkipRecords, "SkipRecords", null, [], endOfFalseBranch, 0);
- var whenFalse = ast.falseExp.visit(this);
- startOfFalseBranch[0] = skip;
- endOfFalseBranch[0] = whenFalse;
- return this._addRecord(proto_record_1.RecordType.PrimitiveOp, "cond", change_detection_util_1.ChangeDetectionUtil.cond, [condition, whenTrue, whenFalse], null, 0);
- };
- _ConvertAstIntoProtoRecords.prototype.visitPipe = function (ast) {
- var value = ast.exp.visit(this);
- var args = this._visitAll(ast.args);
- return this._addRecord(proto_record_1.RecordType.Pipe, ast.name, ast.name, args, null, value);
- };
- _ConvertAstIntoProtoRecords.prototype.visitKeyedRead = function (ast) {
- var obj = ast.obj.visit(this);
- var key = ast.key.visit(this);
- return this._addRecord(proto_record_1.RecordType.KeyedRead, "keyedAccess", change_detection_util_1.ChangeDetectionUtil.keyedAccess, [key], null, obj);
- };
- _ConvertAstIntoProtoRecords.prototype.visitChain = function (ast) {
- var _this = this;
- var args = ast.expressions.map(function (e) { return e.visit(_this); });
- return this._addRecord(proto_record_1.RecordType.Chain, "chain", null, args, null, 0);
- };
- _ConvertAstIntoProtoRecords.prototype.visitQuote = function (ast) {
- throw new exceptions_1.BaseException(("Caught uninterpreted expression at " + ast.location + ": " + ast.uninterpretedExpression + ". ") +
- ("Expression prefix " + ast.prefix + " did not match a template transformer to interpret the expression."));
- };
- _ConvertAstIntoProtoRecords.prototype._visitAll = function (asts) {
- var res = collection_1.ListWrapper.createFixedSize(asts.length);
- for (var i = 0; i < asts.length; ++i) {
- res[i] = asts[i].visit(this);
- }
- return res;
- };
- /**
- * Adds a `ProtoRecord` and returns its selfIndex.
- */
- _ConvertAstIntoProtoRecords.prototype._addRecord = function (type, name, funcOrValue, args, fixedArgs, context) {
- var selfIndex = this._records.length + 1;
- if (context instanceof directive_record_1.DirectiveIndex) {
- this._records.push(new proto_record_1.ProtoRecord(type, name, funcOrValue, args, fixedArgs, -1, context, selfIndex, this._bindingRecord, false, false, false, false, this._bindingIndex));
- }
- else {
- this._records.push(new proto_record_1.ProtoRecord(type, name, funcOrValue, args, fixedArgs, context, null, selfIndex, this._bindingRecord, false, false, false, false, this._bindingIndex));
- }
- return selfIndex;
- };
- return _ConvertAstIntoProtoRecords;
- })();
- function _arrayFn(length) {
- switch (length) {
- case 0:
- return change_detection_util_1.ChangeDetectionUtil.arrayFn0;
- case 1:
- return change_detection_util_1.ChangeDetectionUtil.arrayFn1;
- case 2:
- return change_detection_util_1.ChangeDetectionUtil.arrayFn2;
- case 3:
- return change_detection_util_1.ChangeDetectionUtil.arrayFn3;
- case 4:
- return change_detection_util_1.ChangeDetectionUtil.arrayFn4;
- case 5:
- return change_detection_util_1.ChangeDetectionUtil.arrayFn5;
- case 6:
- return change_detection_util_1.ChangeDetectionUtil.arrayFn6;
- case 7:
- return change_detection_util_1.ChangeDetectionUtil.arrayFn7;
- case 8:
- return change_detection_util_1.ChangeDetectionUtil.arrayFn8;
- case 9:
- return change_detection_util_1.ChangeDetectionUtil.arrayFn9;
- default:
- throw new exceptions_1.BaseException("Does not support literal maps with more than 9 elements");
- }
- }
- function _mapPrimitiveName(keys) {
- var stringifiedKeys = keys.map(function (k) { return lang_1.isString(k) ? "\"" + k + "\"" : "" + k; }).join(', ');
- return "mapFn([" + stringifiedKeys + "])";
- }
- function _operationToPrimitiveName(operation) {
- switch (operation) {
- case '+':
- return "operation_add";
- case '-':
- return "operation_subtract";
- case '*':
- return "operation_multiply";
- case '/':
- return "operation_divide";
- case '%':
- return "operation_remainder";
- case '==':
- return "operation_equals";
- case '!=':
- return "operation_not_equals";
- case '===':
- return "operation_identical";
- case '!==':
- return "operation_not_identical";
- case '<':
- return "operation_less_then";
- case '>':
- return "operation_greater_then";
- case '<=':
- return "operation_less_or_equals_then";
- case '>=':
- return "operation_greater_or_equals_then";
- default:
- throw new exceptions_1.BaseException("Unsupported operation " + operation);
- }
- }
- function _operationToFunction(operation) {
- switch (operation) {
- case '+':
- return change_detection_util_1.ChangeDetectionUtil.operation_add;
- case '-':
- return change_detection_util_1.ChangeDetectionUtil.operation_subtract;
- case '*':
- return change_detection_util_1.ChangeDetectionUtil.operation_multiply;
- case '/':
- return change_detection_util_1.ChangeDetectionUtil.operation_divide;
- case '%':
- return change_detection_util_1.ChangeDetectionUtil.operation_remainder;
- case '==':
- return change_detection_util_1.ChangeDetectionUtil.operation_equals;
- case '!=':
- return change_detection_util_1.ChangeDetectionUtil.operation_not_equals;
- case '===':
- return change_detection_util_1.ChangeDetectionUtil.operation_identical;
- case '!==':
- return change_detection_util_1.ChangeDetectionUtil.operation_not_identical;
- case '<':
- return change_detection_util_1.ChangeDetectionUtil.operation_less_then;
- case '>':
- return change_detection_util_1.ChangeDetectionUtil.operation_greater_then;
- case '<=':
- return change_detection_util_1.ChangeDetectionUtil.operation_less_or_equals_then;
- case '>=':
- return change_detection_util_1.ChangeDetectionUtil.operation_greater_or_equals_then;
- default:
- throw new exceptions_1.BaseException("Unsupported operation " + operation);
- }
- }
- function s(v) {
- return lang_1.isPresent(v) ? "" + v : '';
- }
- function _interpolationFn(strings) {
- var length = strings.length;
- var c0 = length > 0 ? strings[0] : null;
- var c1 = length > 1 ? strings[1] : null;
- var c2 = length > 2 ? strings[2] : null;
- var c3 = length > 3 ? strings[3] : null;
- var c4 = length > 4 ? strings[4] : null;
- var c5 = length > 5 ? strings[5] : null;
- var c6 = length > 6 ? strings[6] : null;
- var c7 = length > 7 ? strings[7] : null;
- var c8 = length > 8 ? strings[8] : null;
- var c9 = length > 9 ? strings[9] : null;
- switch (length - 1) {
- case 1:
- return function (a1) { return c0 + s(a1) + c1; };
- case 2:
- return function (a1, a2) { return c0 + s(a1) + c1 + s(a2) + c2; };
- case 3:
- return function (a1, a2, a3) { return c0 + s(a1) + c1 + s(a2) + c2 + s(a3) + c3; };
- case 4:
- return function (a1, a2, a3, a4) { return c0 + s(a1) + c1 + s(a2) + c2 + s(a3) + c3 + s(a4) + c4; };
- case 5:
- return function (a1, a2, a3, a4, a5) {
- return c0 + s(a1) + c1 + s(a2) + c2 + s(a3) + c3 + s(a4) + c4 + s(a5) + c5;
- };
- case 6:
- return function (a1, a2, a3, a4, a5, a6) {
- return c0 + s(a1) + c1 + s(a2) + c2 + s(a3) + c3 + s(a4) + c4 + s(a5) + c5 + s(a6) + c6;
- };
- case 7:
- return function (a1, a2, a3, a4, a5, a6, a7) { return c0 + s(a1) + c1 + s(a2) + c2 + s(a3) + c3 + s(a4) +
- c4 + s(a5) + c5 + s(a6) + c6 + s(a7) + c7; };
- case 8:
- return function (a1, a2, a3, a4, a5, a6, a7, a8) { return c0 + s(a1) + c1 + s(a2) + c2 + s(a3) + c3 + s(a4) +
- c4 + s(a5) + c5 + s(a6) + c6 + s(a7) + c7 + s(a8) +
- c8; };
- case 9:
- return function (a1, a2, a3, a4, a5, a6, a7, a8, a9) { return c0 + s(a1) + c1 + s(a2) + c2 + s(a3) + c3 +
- s(a4) + c4 + s(a5) + c5 + s(a6) + c6 + s(a7) +
- c7 + s(a8) + c8 + s(a9) + c9; };
- default:
- throw new exceptions_1.BaseException("Does not support more than 9 expressions");
- }
- }
- /***/ },
- /* 38 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var collection_1 = __webpack_require__(12);
- var constants_1 = __webpack_require__(36);
- var pipe_lifecycle_reflector_1 = __webpack_require__(39);
- var binding_record_1 = __webpack_require__(40);
- var directive_record_1 = __webpack_require__(41);
- /**
- * Indicates that the result of a {@link PipeMetadata} transformation has changed even though the
- * reference
- * has not changed.
- *
- * The wrapped value will be unwrapped by change detection, and the unwrapped value will be stored.
- *
- * Example:
- *
- * ```
- * if (this._latestValue === this._latestReturnedValue) {
- * return this._latestReturnedValue;
- * } else {
- * this._latestReturnedValue = this._latestValue;
- * return WrappedValue.wrap(this._latestValue); // this will force update
- * }
- * ```
- */
- var WrappedValue = (function () {
- function WrappedValue(wrapped) {
- this.wrapped = wrapped;
- }
- WrappedValue.wrap = function (value) {
- var w = _wrappedValues[_wrappedIndex++ % 5];
- w.wrapped = value;
- return w;
- };
- return WrappedValue;
- })();
- exports.WrappedValue = WrappedValue;
- var _wrappedValues = [
- new WrappedValue(null),
- new WrappedValue(null),
- new WrappedValue(null),
- new WrappedValue(null),
- new WrappedValue(null)
- ];
- var _wrappedIndex = 0;
- /**
- * Represents a basic change from a previous to a new value.
- */
- var SimpleChange = (function () {
- function SimpleChange(previousValue, currentValue) {
- this.previousValue = previousValue;
- this.currentValue = currentValue;
- }
- /**
- * Check whether the new value is the first value assigned.
- */
- SimpleChange.prototype.isFirstChange = function () { return this.previousValue === ChangeDetectionUtil.uninitialized; };
- return SimpleChange;
- })();
- exports.SimpleChange = SimpleChange;
- var _simpleChangesIndex = 0;
- var _simpleChanges = [
- new SimpleChange(null, null),
- new SimpleChange(null, null),
- new SimpleChange(null, null),
- new SimpleChange(null, null),
- new SimpleChange(null, null),
- new SimpleChange(null, null),
- new SimpleChange(null, null),
- new SimpleChange(null, null),
- new SimpleChange(null, null),
- new SimpleChange(null, null),
- new SimpleChange(null, null),
- new SimpleChange(null, null),
- new SimpleChange(null, null),
- new SimpleChange(null, null),
- new SimpleChange(null, null),
- new SimpleChange(null, null),
- new SimpleChange(null, null),
- new SimpleChange(null, null),
- new SimpleChange(null, null),
- new SimpleChange(null, null)
- ];
- function _simpleChange(previousValue, currentValue) {
- var index = _simpleChangesIndex++ % 20;
- var s = _simpleChanges[index];
- s.previousValue = previousValue;
- s.currentValue = currentValue;
- return s;
- }
- /* tslint:disable:requireParameterType */
- var ChangeDetectionUtil = (function () {
- function ChangeDetectionUtil() {
- }
- ChangeDetectionUtil.arrayFn0 = function () { return []; };
- ChangeDetectionUtil.arrayFn1 = function (a1) { return [a1]; };
- ChangeDetectionUtil.arrayFn2 = function (a1, a2) { return [a1, a2]; };
- ChangeDetectionUtil.arrayFn3 = function (a1, a2, a3) { return [a1, a2, a3]; };
- ChangeDetectionUtil.arrayFn4 = function (a1, a2, a3, a4) { return [a1, a2, a3, a4]; };
- ChangeDetectionUtil.arrayFn5 = function (a1, a2, a3, a4, a5) { return [a1, a2, a3, a4, a5]; };
- ChangeDetectionUtil.arrayFn6 = function (a1, a2, a3, a4, a5, a6) { return [a1, a2, a3, a4, a5, a6]; };
- ChangeDetectionUtil.arrayFn7 = function (a1, a2, a3, a4, a5, a6, a7) { return [a1, a2, a3, a4, a5, a6, a7]; };
- ChangeDetectionUtil.arrayFn8 = function (a1, a2, a3, a4, a5, a6, a7, a8) {
- return [a1, a2, a3, a4, a5, a6, a7, a8];
- };
- ChangeDetectionUtil.arrayFn9 = function (a1, a2, a3, a4, a5, a6, a7, a8, a9) {
- return [a1, a2, a3, a4, a5, a6, a7, a8, a9];
- };
- ChangeDetectionUtil.operation_negate = function (value) { return !value; };
- ChangeDetectionUtil.operation_add = function (left, right) { return left + right; };
- ChangeDetectionUtil.operation_subtract = function (left, right) { return left - right; };
- ChangeDetectionUtil.operation_multiply = function (left, right) { return left * right; };
- ChangeDetectionUtil.operation_divide = function (left, right) { return left / right; };
- ChangeDetectionUtil.operation_remainder = function (left, right) { return left % right; };
- ChangeDetectionUtil.operation_equals = function (left, right) { return left == right; };
- ChangeDetectionUtil.operation_not_equals = function (left, right) { return left != right; };
- ChangeDetectionUtil.operation_identical = function (left, right) { return left === right; };
- ChangeDetectionUtil.operation_not_identical = function (left, right) { return left !== right; };
- ChangeDetectionUtil.operation_less_then = function (left, right) { return left < right; };
- ChangeDetectionUtil.operation_greater_then = function (left, right) { return left > right; };
- ChangeDetectionUtil.operation_less_or_equals_then = function (left, right) { return left <= right; };
- ChangeDetectionUtil.operation_greater_or_equals_then = function (left, right) { return left >= right; };
- ChangeDetectionUtil.cond = function (cond, trueVal, falseVal) { return cond ? trueVal : falseVal; };
- ChangeDetectionUtil.mapFn = function (keys) {
- function buildMap(values) {
- var res = collection_1.StringMapWrapper.create();
- for (var i = 0; i < keys.length; ++i) {
- collection_1.StringMapWrapper.set(res, keys[i], values[i]);
- }
- return res;
- }
- switch (keys.length) {
- case 0:
- return function () { return []; };
- case 1:
- return function (a1) { return buildMap([a1]); };
- case 2:
- return function (a1, a2) { return buildMap([a1, a2]); };
- case 3:
- return function (a1, a2, a3) { return buildMap([a1, a2, a3]); };
- case 4:
- return function (a1, a2, a3, a4) { return buildMap([a1, a2, a3, a4]); };
- case 5:
- return function (a1, a2, a3, a4, a5) { return buildMap([a1, a2, a3, a4, a5]); };
- case 6:
- return function (a1, a2, a3, a4, a5, a6) { return buildMap([a1, a2, a3, a4, a5, a6]); };
- case 7:
- return function (a1, a2, a3, a4, a5, a6, a7) { return buildMap([a1, a2, a3, a4, a5, a6, a7]); };
- case 8:
- return function (a1, a2, a3, a4, a5, a6, a7, a8) { return buildMap([a1, a2, a3, a4, a5, a6, a7, a8]); };
- case 9:
- return function (a1, a2, a3, a4, a5, a6, a7, a8, a9) {
- return buildMap([a1, a2, a3, a4, a5, a6, a7, a8, a9]);
- };
- default:
- throw new exceptions_1.BaseException("Does not support literal maps with more than 9 elements");
- }
- };
- ChangeDetectionUtil.keyedAccess = function (obj, args) { return obj[args[0]]; };
- ChangeDetectionUtil.unwrapValue = function (value) {
- if (value instanceof WrappedValue) {
- return value.wrapped;
- }
- else {
- return value;
- }
- };
- ChangeDetectionUtil.changeDetectionMode = function (strategy) {
- return constants_1.isDefaultChangeDetectionStrategy(strategy) ? constants_1.ChangeDetectionStrategy.CheckAlways :
- constants_1.ChangeDetectionStrategy.CheckOnce;
- };
- ChangeDetectionUtil.simpleChange = function (previousValue, currentValue) {
- return _simpleChange(previousValue, currentValue);
- };
- ChangeDetectionUtil.isValueBlank = function (value) { return lang_1.isBlank(value); };
- ChangeDetectionUtil.s = function (value) { return lang_1.isPresent(value) ? "" + value : ''; };
- ChangeDetectionUtil.protoByIndex = function (protos, selfIndex) {
- return selfIndex < 1 ?
- null :
- protos[selfIndex - 1]; // self index is shifted by one because of context
- };
- ChangeDetectionUtil.callPipeOnDestroy = function (selectedPipe) {
- if (pipe_lifecycle_reflector_1.implementsOnDestroy(selectedPipe.pipe)) {
- selectedPipe.pipe.ngOnDestroy();
- }
- };
- ChangeDetectionUtil.bindingTarget = function (mode, elementIndex, name, unit, debug) {
- return new binding_record_1.BindingTarget(mode, elementIndex, name, unit, debug);
- };
- ChangeDetectionUtil.directiveIndex = function (elementIndex, directiveIndex) {
- return new directive_record_1.DirectiveIndex(elementIndex, directiveIndex);
- };
- ChangeDetectionUtil.looseNotIdentical = function (a, b) { return !lang_1.looseIdentical(a, b); };
- ChangeDetectionUtil.uninitialized = lang_1.CONST_EXPR(new Object());
- return ChangeDetectionUtil;
- })();
- exports.ChangeDetectionUtil = ChangeDetectionUtil;
- /***/ },
- /* 39 */
- /***/ function(module, exports) {
- function implementsOnDestroy(pipe) {
- return pipe.constructor.prototype.ngOnDestroy;
- }
- exports.implementsOnDestroy = implementsOnDestroy;
- /***/ },
- /* 40 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var DIRECTIVE_LIFECYCLE = "directiveLifecycle";
- var BINDING = "native";
- var DIRECTIVE = "directive";
- var ELEMENT_PROPERTY = "elementProperty";
- var ELEMENT_ATTRIBUTE = "elementAttribute";
- var ELEMENT_CLASS = "elementClass";
- var ELEMENT_STYLE = "elementStyle";
- var TEXT_NODE = "textNode";
- var EVENT = "event";
- var HOST_EVENT = "hostEvent";
- var BindingTarget = (function () {
- function BindingTarget(mode, elementIndex, name, unit, debug) {
- this.mode = mode;
- this.elementIndex = elementIndex;
- this.name = name;
- this.unit = unit;
- this.debug = debug;
- }
- BindingTarget.prototype.isDirective = function () { return this.mode === DIRECTIVE; };
- BindingTarget.prototype.isElementProperty = function () { return this.mode === ELEMENT_PROPERTY; };
- BindingTarget.prototype.isElementAttribute = function () { return this.mode === ELEMENT_ATTRIBUTE; };
- BindingTarget.prototype.isElementClass = function () { return this.mode === ELEMENT_CLASS; };
- BindingTarget.prototype.isElementStyle = function () { return this.mode === ELEMENT_STYLE; };
- BindingTarget.prototype.isTextNode = function () { return this.mode === TEXT_NODE; };
- return BindingTarget;
- })();
- exports.BindingTarget = BindingTarget;
- var BindingRecord = (function () {
- function BindingRecord(mode, target, implicitReceiver, ast, setter, lifecycleEvent, directiveRecord) {
- this.mode = mode;
- this.target = target;
- this.implicitReceiver = implicitReceiver;
- this.ast = ast;
- this.setter = setter;
- this.lifecycleEvent = lifecycleEvent;
- this.directiveRecord = directiveRecord;
- }
- BindingRecord.prototype.isDirectiveLifecycle = function () { return this.mode === DIRECTIVE_LIFECYCLE; };
- BindingRecord.prototype.callOnChanges = function () {
- return lang_1.isPresent(this.directiveRecord) && this.directiveRecord.callOnChanges;
- };
- BindingRecord.prototype.isDefaultChangeDetection = function () {
- return lang_1.isBlank(this.directiveRecord) || this.directiveRecord.isDefaultChangeDetection();
- };
- BindingRecord.createDirectiveDoCheck = function (directiveRecord) {
- return new BindingRecord(DIRECTIVE_LIFECYCLE, null, 0, null, null, "DoCheck", directiveRecord);
- };
- BindingRecord.createDirectiveOnInit = function (directiveRecord) {
- return new BindingRecord(DIRECTIVE_LIFECYCLE, null, 0, null, null, "OnInit", directiveRecord);
- };
- BindingRecord.createDirectiveOnChanges = function (directiveRecord) {
- return new BindingRecord(DIRECTIVE_LIFECYCLE, null, 0, null, null, "OnChanges", directiveRecord);
- };
- BindingRecord.createForDirective = function (ast, propertyName, setter, directiveRecord) {
- var elementIndex = directiveRecord.directiveIndex.elementIndex;
- var t = new BindingTarget(DIRECTIVE, elementIndex, propertyName, null, ast.toString());
- return new BindingRecord(DIRECTIVE, t, 0, ast, setter, null, directiveRecord);
- };
- BindingRecord.createForElementProperty = function (ast, elementIndex, propertyName) {
- var t = new BindingTarget(ELEMENT_PROPERTY, elementIndex, propertyName, null, ast.toString());
- return new BindingRecord(BINDING, t, 0, ast, null, null, null);
- };
- BindingRecord.createForElementAttribute = function (ast, elementIndex, attributeName) {
- var t = new BindingTarget(ELEMENT_ATTRIBUTE, elementIndex, attributeName, null, ast.toString());
- return new BindingRecord(BINDING, t, 0, ast, null, null, null);
- };
- BindingRecord.createForElementClass = function (ast, elementIndex, className) {
- var t = new BindingTarget(ELEMENT_CLASS, elementIndex, className, null, ast.toString());
- return new BindingRecord(BINDING, t, 0, ast, null, null, null);
- };
- BindingRecord.createForElementStyle = function (ast, elementIndex, styleName, unit) {
- var t = new BindingTarget(ELEMENT_STYLE, elementIndex, styleName, unit, ast.toString());
- return new BindingRecord(BINDING, t, 0, ast, null, null, null);
- };
- BindingRecord.createForHostProperty = function (directiveIndex, ast, propertyName) {
- var t = new BindingTarget(ELEMENT_PROPERTY, directiveIndex.elementIndex, propertyName, null, ast.toString());
- return new BindingRecord(BINDING, t, directiveIndex, ast, null, null, null);
- };
- BindingRecord.createForHostAttribute = function (directiveIndex, ast, attributeName) {
- var t = new BindingTarget(ELEMENT_ATTRIBUTE, directiveIndex.elementIndex, attributeName, null, ast.toString());
- return new BindingRecord(BINDING, t, directiveIndex, ast, null, null, null);
- };
- BindingRecord.createForHostClass = function (directiveIndex, ast, className) {
- var t = new BindingTarget(ELEMENT_CLASS, directiveIndex.elementIndex, className, null, ast.toString());
- return new BindingRecord(BINDING, t, directiveIndex, ast, null, null, null);
- };
- BindingRecord.createForHostStyle = function (directiveIndex, ast, styleName, unit) {
- var t = new BindingTarget(ELEMENT_STYLE, directiveIndex.elementIndex, styleName, unit, ast.toString());
- return new BindingRecord(BINDING, t, directiveIndex, ast, null, null, null);
- };
- BindingRecord.createForTextNode = function (ast, elementIndex) {
- var t = new BindingTarget(TEXT_NODE, elementIndex, null, null, ast.toString());
- return new BindingRecord(BINDING, t, 0, ast, null, null, null);
- };
- BindingRecord.createForEvent = function (ast, eventName, elementIndex) {
- var t = new BindingTarget(EVENT, elementIndex, eventName, null, ast.toString());
- return new BindingRecord(EVENT, t, 0, ast, null, null, null);
- };
- BindingRecord.createForHostEvent = function (ast, eventName, directiveRecord) {
- var directiveIndex = directiveRecord.directiveIndex;
- var t = new BindingTarget(HOST_EVENT, directiveIndex.elementIndex, eventName, null, ast.toString());
- return new BindingRecord(HOST_EVENT, t, directiveIndex, ast, null, null, directiveRecord);
- };
- return BindingRecord;
- })();
- exports.BindingRecord = BindingRecord;
- /***/ },
- /* 41 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var constants_1 = __webpack_require__(36);
- var DirectiveIndex = (function () {
- function DirectiveIndex(elementIndex, directiveIndex) {
- this.elementIndex = elementIndex;
- this.directiveIndex = directiveIndex;
- }
- Object.defineProperty(DirectiveIndex.prototype, "name", {
- get: function () { return this.elementIndex + "_" + this.directiveIndex; },
- enumerable: true,
- configurable: true
- });
- return DirectiveIndex;
- })();
- exports.DirectiveIndex = DirectiveIndex;
- var DirectiveRecord = (function () {
- function DirectiveRecord(_a) {
- var _b = _a === void 0 ? {} : _a, directiveIndex = _b.directiveIndex, callAfterContentInit = _b.callAfterContentInit, callAfterContentChecked = _b.callAfterContentChecked, callAfterViewInit = _b.callAfterViewInit, callAfterViewChecked = _b.callAfterViewChecked, callOnChanges = _b.callOnChanges, callDoCheck = _b.callDoCheck, callOnInit = _b.callOnInit, changeDetection = _b.changeDetection;
- this.directiveIndex = directiveIndex;
- this.callAfterContentInit = lang_1.normalizeBool(callAfterContentInit);
- this.callAfterContentChecked = lang_1.normalizeBool(callAfterContentChecked);
- this.callOnChanges = lang_1.normalizeBool(callOnChanges);
- this.callAfterViewInit = lang_1.normalizeBool(callAfterViewInit);
- this.callAfterViewChecked = lang_1.normalizeBool(callAfterViewChecked);
- this.callDoCheck = lang_1.normalizeBool(callDoCheck);
- this.callOnInit = lang_1.normalizeBool(callOnInit);
- this.changeDetection = changeDetection;
- }
- DirectiveRecord.prototype.isDefaultChangeDetection = function () {
- return constants_1.isDefaultChangeDetectionStrategy(this.changeDetection);
- };
- return DirectiveRecord;
- })();
- exports.DirectiveRecord = DirectiveRecord;
- /***/ },
- /* 42 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var collection_1 = __webpack_require__(12);
- var abstract_change_detector_1 = __webpack_require__(43);
- var change_detection_util_1 = __webpack_require__(38);
- var constants_1 = __webpack_require__(36);
- var proto_record_1 = __webpack_require__(48);
- var DynamicChangeDetector = (function (_super) {
- __extends(DynamicChangeDetector, _super);
- function DynamicChangeDetector(id, dispatcher, numberOfPropertyProtoRecords, propertyBindingTargets, directiveIndices, strategy, _records, _eventBindings, _directiveRecords, _genConfig) {
- _super.call(this, id, dispatcher, numberOfPropertyProtoRecords, propertyBindingTargets, directiveIndices, strategy);
- this._records = _records;
- this._eventBindings = _eventBindings;
- this._directiveRecords = _directiveRecords;
- this._genConfig = _genConfig;
- this.directives = null;
- var len = _records.length + 1;
- this.values = collection_1.ListWrapper.createFixedSize(len);
- this.localPipes = collection_1.ListWrapper.createFixedSize(len);
- this.prevContexts = collection_1.ListWrapper.createFixedSize(len);
- this.changes = collection_1.ListWrapper.createFixedSize(len);
- this.dehydrateDirectives(false);
- }
- DynamicChangeDetector.prototype.handleEventInternal = function (eventName, elIndex, locals) {
- var _this = this;
- var preventDefault = false;
- this._matchingEventBindings(eventName, elIndex)
- .forEach(function (rec) {
- var res = _this._processEventBinding(rec, locals);
- if (res === false) {
- preventDefault = true;
- }
- });
- return preventDefault;
- };
- /** @internal */
- DynamicChangeDetector.prototype._processEventBinding = function (eb, locals) {
- var values = collection_1.ListWrapper.createFixedSize(eb.records.length);
- values[0] = this.values[0];
- for (var protoIdx = 0; protoIdx < eb.records.length; ++protoIdx) {
- var proto = eb.records[protoIdx];
- if (proto.isSkipRecord()) {
- protoIdx += this._computeSkipLength(protoIdx, proto, values);
- }
- else {
- var res = this._calculateCurrValue(proto, values, locals);
- if (proto.lastInBinding) {
- this._markPathAsCheckOnce(proto);
- return res;
- }
- else {
- this._writeSelf(proto, res, values);
- }
- }
- }
- throw new exceptions_1.BaseException("Cannot be reached");
- };
- DynamicChangeDetector.prototype._computeSkipLength = function (protoIndex, proto, values) {
- if (proto.mode === proto_record_1.RecordType.SkipRecords) {
- return proto.fixedArgs[0] - protoIndex - 1;
- }
- if (proto.mode === proto_record_1.RecordType.SkipRecordsIf) {
- var condition = this._readContext(proto, values);
- return condition ? proto.fixedArgs[0] - protoIndex - 1 : 0;
- }
- if (proto.mode === proto_record_1.RecordType.SkipRecordsIfNot) {
- var condition = this._readContext(proto, values);
- return condition ? 0 : proto.fixedArgs[0] - protoIndex - 1;
- }
- throw new exceptions_1.BaseException("Cannot be reached");
- };
- /** @internal */
- DynamicChangeDetector.prototype._markPathAsCheckOnce = function (proto) {
- if (!proto.bindingRecord.isDefaultChangeDetection()) {
- var dir = proto.bindingRecord.directiveRecord;
- this._getDetectorFor(dir.directiveIndex).markPathToRootAsCheckOnce();
- }
- };
- /** @internal */
- DynamicChangeDetector.prototype._matchingEventBindings = function (eventName, elIndex) {
- return this._eventBindings.filter(function (eb) { return eb.eventName == eventName && eb.elIndex === elIndex; });
- };
- DynamicChangeDetector.prototype.hydrateDirectives = function (directives) {
- this.values[0] = this.context;
- this.directives = directives;
- if (this.strategy === constants_1.ChangeDetectionStrategy.OnPushObserve) {
- for (var i = 0; i < this.directiveIndices.length; ++i) {
- var index = this.directiveIndices[i];
- _super.prototype.observeDirective.call(this, directives.getDirectiveFor(index), i);
- }
- }
- };
- DynamicChangeDetector.prototype.dehydrateDirectives = function (destroyPipes) {
- if (destroyPipes) {
- this._destroyPipes();
- }
- this.values[0] = null;
- this.directives = null;
- collection_1.ListWrapper.fill(this.values, change_detection_util_1.ChangeDetectionUtil.uninitialized, 1);
- collection_1.ListWrapper.fill(this.changes, false);
- collection_1.ListWrapper.fill(this.localPipes, null);
- collection_1.ListWrapper.fill(this.prevContexts, change_detection_util_1.ChangeDetectionUtil.uninitialized);
- };
- /** @internal */
- DynamicChangeDetector.prototype._destroyPipes = function () {
- for (var i = 0; i < this.localPipes.length; ++i) {
- if (lang_1.isPresent(this.localPipes[i])) {
- change_detection_util_1.ChangeDetectionUtil.callPipeOnDestroy(this.localPipes[i]);
- }
- }
- };
- DynamicChangeDetector.prototype.checkNoChanges = function () { this.runDetectChanges(true); };
- DynamicChangeDetector.prototype.detectChangesInRecordsInternal = function (throwOnChange) {
- var protos = this._records;
- var changes = null;
- var isChanged = false;
- for (var protoIdx = 0; protoIdx < protos.length; ++protoIdx) {
- var proto = protos[protoIdx];
- var bindingRecord = proto.bindingRecord;
- var directiveRecord = bindingRecord.directiveRecord;
- if (this._firstInBinding(proto)) {
- this.propertyBindingIndex = proto.propertyBindingIndex;
- }
- if (proto.isLifeCycleRecord()) {
- if (proto.name === "DoCheck" && !throwOnChange) {
- this._getDirectiveFor(directiveRecord.directiveIndex).ngDoCheck();
- }
- else if (proto.name === "OnInit" && !throwOnChange &&
- this.state == constants_1.ChangeDetectorState.NeverChecked) {
- this._getDirectiveFor(directiveRecord.directiveIndex).ngOnInit();
- }
- else if (proto.name === "OnChanges" && lang_1.isPresent(changes) && !throwOnChange) {
- this._getDirectiveFor(directiveRecord.directiveIndex).ngOnChanges(changes);
- }
- }
- else if (proto.isSkipRecord()) {
- protoIdx += this._computeSkipLength(protoIdx, proto, this.values);
- }
- else {
- var change = this._check(proto, throwOnChange, this.values, this.locals);
- if (lang_1.isPresent(change)) {
- this._updateDirectiveOrElement(change, bindingRecord);
- isChanged = true;
- changes = this._addChange(bindingRecord, change, changes);
- }
- }
- if (proto.lastInDirective) {
- changes = null;
- if (isChanged && !bindingRecord.isDefaultChangeDetection()) {
- this._getDetectorFor(directiveRecord.directiveIndex).markAsCheckOnce();
- }
- isChanged = false;
- }
- }
- };
- /** @internal */
- DynamicChangeDetector.prototype._firstInBinding = function (r) {
- var prev = change_detection_util_1.ChangeDetectionUtil.protoByIndex(this._records, r.selfIndex - 1);
- return lang_1.isBlank(prev) || prev.bindingRecord !== r.bindingRecord;
- };
- DynamicChangeDetector.prototype.afterContentLifecycleCallbacksInternal = function () {
- var dirs = this._directiveRecords;
- for (var i = dirs.length - 1; i >= 0; --i) {
- var dir = dirs[i];
- if (dir.callAfterContentInit && this.state == constants_1.ChangeDetectorState.NeverChecked) {
- this._getDirectiveFor(dir.directiveIndex).ngAfterContentInit();
- }
- if (dir.callAfterContentChecked) {
- this._getDirectiveFor(dir.directiveIndex).ngAfterContentChecked();
- }
- }
- };
- DynamicChangeDetector.prototype.afterViewLifecycleCallbacksInternal = function () {
- var dirs = this._directiveRecords;
- for (var i = dirs.length - 1; i >= 0; --i) {
- var dir = dirs[i];
- if (dir.callAfterViewInit && this.state == constants_1.ChangeDetectorState.NeverChecked) {
- this._getDirectiveFor(dir.directiveIndex).ngAfterViewInit();
- }
- if (dir.callAfterViewChecked) {
- this._getDirectiveFor(dir.directiveIndex).ngAfterViewChecked();
- }
- }
- };
- /** @internal */
- DynamicChangeDetector.prototype._updateDirectiveOrElement = function (change, bindingRecord) {
- if (lang_1.isBlank(bindingRecord.directiveRecord)) {
- _super.prototype.notifyDispatcher.call(this, change.currentValue);
- }
- else {
- var directiveIndex = bindingRecord.directiveRecord.directiveIndex;
- bindingRecord.setter(this._getDirectiveFor(directiveIndex), change.currentValue);
- }
- if (this._genConfig.logBindingUpdate) {
- _super.prototype.logBindingUpdate.call(this, change.currentValue);
- }
- };
- /** @internal */
- DynamicChangeDetector.prototype._addChange = function (bindingRecord, change, changes) {
- if (bindingRecord.callOnChanges()) {
- return _super.prototype.addChange.call(this, changes, change.previousValue, change.currentValue);
- }
- else {
- return changes;
- }
- };
- /** @internal */
- DynamicChangeDetector.prototype._getDirectiveFor = function (directiveIndex) {
- return this.directives.getDirectiveFor(directiveIndex);
- };
- /** @internal */
- DynamicChangeDetector.prototype._getDetectorFor = function (directiveIndex) { return this.directives.getDetectorFor(directiveIndex); };
- /** @internal */
- DynamicChangeDetector.prototype._check = function (proto, throwOnChange, values, locals) {
- if (proto.isPipeRecord()) {
- return this._pipeCheck(proto, throwOnChange, values);
- }
- else {
- return this._referenceCheck(proto, throwOnChange, values, locals);
- }
- };
- /** @internal */
- DynamicChangeDetector.prototype._referenceCheck = function (proto, throwOnChange, values, locals) {
- if (this._pureFuncAndArgsDidNotChange(proto)) {
- this._setChanged(proto, false);
- return null;
- }
- var currValue = this._calculateCurrValue(proto, values, locals);
- if (this.strategy === constants_1.ChangeDetectionStrategy.OnPushObserve) {
- _super.prototype.observeValue.call(this, currValue, proto.selfIndex);
- }
- if (proto.shouldBeChecked()) {
- var prevValue = this._readSelf(proto, values);
- if (change_detection_util_1.ChangeDetectionUtil.looseNotIdentical(prevValue, currValue)) {
- if (proto.lastInBinding) {
- var change = change_detection_util_1.ChangeDetectionUtil.simpleChange(prevValue, currValue);
- if (throwOnChange)
- this.throwOnChangeError(prevValue, currValue);
- this._writeSelf(proto, currValue, values);
- this._setChanged(proto, true);
- return change;
- }
- else {
- this._writeSelf(proto, currValue, values);
- this._setChanged(proto, true);
- return null;
- }
- }
- else {
- this._setChanged(proto, false);
- return null;
- }
- }
- else {
- this._writeSelf(proto, currValue, values);
- this._setChanged(proto, true);
- return null;
- }
- };
- DynamicChangeDetector.prototype._calculateCurrValue = function (proto, values, locals) {
- switch (proto.mode) {
- case proto_record_1.RecordType.Self:
- return this._readContext(proto, values);
- case proto_record_1.RecordType.Const:
- return proto.funcOrValue;
- case proto_record_1.RecordType.PropertyRead:
- var context = this._readContext(proto, values);
- return proto.funcOrValue(context);
- case proto_record_1.RecordType.SafeProperty:
- var context = this._readContext(proto, values);
- return lang_1.isBlank(context) ? null : proto.funcOrValue(context);
- case proto_record_1.RecordType.PropertyWrite:
- var context = this._readContext(proto, values);
- var value = this._readArgs(proto, values)[0];
- proto.funcOrValue(context, value);
- return value;
- case proto_record_1.RecordType.KeyedWrite:
- var context = this._readContext(proto, values);
- var key = this._readArgs(proto, values)[0];
- var value = this._readArgs(proto, values)[1];
- context[key] = value;
- return value;
- case proto_record_1.RecordType.Local:
- return locals.get(proto.name);
- case proto_record_1.RecordType.InvokeMethod:
- var context = this._readContext(proto, values);
- var args = this._readArgs(proto, values);
- return proto.funcOrValue(context, args);
- case proto_record_1.RecordType.SafeMethodInvoke:
- var context = this._readContext(proto, values);
- if (lang_1.isBlank(context)) {
- return null;
- }
- var args = this._readArgs(proto, values);
- return proto.funcOrValue(context, args);
- case proto_record_1.RecordType.KeyedRead:
- var arg = this._readArgs(proto, values)[0];
- return this._readContext(proto, values)[arg];
- case proto_record_1.RecordType.Chain:
- var args = this._readArgs(proto, values);
- return args[args.length - 1];
- case proto_record_1.RecordType.InvokeClosure:
- return lang_1.FunctionWrapper.apply(this._readContext(proto, values), this._readArgs(proto, values));
- case proto_record_1.RecordType.Interpolate:
- case proto_record_1.RecordType.PrimitiveOp:
- case proto_record_1.RecordType.CollectionLiteral:
- return lang_1.FunctionWrapper.apply(proto.funcOrValue, this._readArgs(proto, values));
- default:
- throw new exceptions_1.BaseException("Unknown operation " + proto.mode);
- }
- };
- DynamicChangeDetector.prototype._pipeCheck = function (proto, throwOnChange, values) {
- var context = this._readContext(proto, values);
- var selectedPipe = this._pipeFor(proto, context);
- if (!selectedPipe.pure || this._argsOrContextChanged(proto)) {
- var args = this._readArgs(proto, values);
- var currValue = selectedPipe.pipe.transform(context, args);
- if (proto.shouldBeChecked()) {
- var prevValue = this._readSelf(proto, values);
- if (change_detection_util_1.ChangeDetectionUtil.looseNotIdentical(prevValue, currValue)) {
- currValue = change_detection_util_1.ChangeDetectionUtil.unwrapValue(currValue);
- if (proto.lastInBinding) {
- var change = change_detection_util_1.ChangeDetectionUtil.simpleChange(prevValue, currValue);
- if (throwOnChange)
- this.throwOnChangeError(prevValue, currValue);
- this._writeSelf(proto, currValue, values);
- this._setChanged(proto, true);
- return change;
- }
- else {
- this._writeSelf(proto, currValue, values);
- this._setChanged(proto, true);
- return null;
- }
- }
- else {
- this._setChanged(proto, false);
- return null;
- }
- }
- else {
- this._writeSelf(proto, currValue, values);
- this._setChanged(proto, true);
- return null;
- }
- }
- };
- DynamicChangeDetector.prototype._pipeFor = function (proto, context) {
- var storedPipe = this._readPipe(proto);
- if (lang_1.isPresent(storedPipe))
- return storedPipe;
- var pipe = this.pipes.get(proto.name);
- this._writePipe(proto, pipe);
- return pipe;
- };
- DynamicChangeDetector.prototype._readContext = function (proto, values) {
- if (proto.contextIndex == -1) {
- return this._getDirectiveFor(proto.directiveIndex);
- }
- return values[proto.contextIndex];
- };
- DynamicChangeDetector.prototype._readSelf = function (proto, values) { return values[proto.selfIndex]; };
- DynamicChangeDetector.prototype._writeSelf = function (proto, value, values) { values[proto.selfIndex] = value; };
- DynamicChangeDetector.prototype._readPipe = function (proto) { return this.localPipes[proto.selfIndex]; };
- DynamicChangeDetector.prototype._writePipe = function (proto, value) { this.localPipes[proto.selfIndex] = value; };
- DynamicChangeDetector.prototype._setChanged = function (proto, value) {
- if (proto.argumentToPureFunction)
- this.changes[proto.selfIndex] = value;
- };
- DynamicChangeDetector.prototype._pureFuncAndArgsDidNotChange = function (proto) {
- return proto.isPureFunction() && !this._argsChanged(proto);
- };
- DynamicChangeDetector.prototype._argsChanged = function (proto) {
- var args = proto.args;
- for (var i = 0; i < args.length; ++i) {
- if (this.changes[args[i]]) {
- return true;
- }
- }
- return false;
- };
- DynamicChangeDetector.prototype._argsOrContextChanged = function (proto) {
- return this._argsChanged(proto) || this.changes[proto.contextIndex];
- };
- DynamicChangeDetector.prototype._readArgs = function (proto, values) {
- var res = collection_1.ListWrapper.createFixedSize(proto.args.length);
- var args = proto.args;
- for (var i = 0; i < args.length; ++i) {
- res[i] = values[args[i]];
- }
- return res;
- };
- return DynamicChangeDetector;
- })(abstract_change_detector_1.AbstractChangeDetector);
- exports.DynamicChangeDetector = DynamicChangeDetector;
- /***/ },
- /* 43 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var collection_1 = __webpack_require__(12);
- var change_detection_util_1 = __webpack_require__(38);
- var change_detector_ref_1 = __webpack_require__(44);
- var exceptions_1 = __webpack_require__(34);
- var constants_1 = __webpack_require__(36);
- var profile_1 = __webpack_require__(45);
- var observable_facade_1 = __webpack_require__(47);
- var _scope_check = profile_1.wtfCreateScope("ChangeDetector#check(ascii id, bool throwOnChange)");
- var _Context = (function () {
- function _Context(element, componentElement, context, locals, injector, expression) {
- this.element = element;
- this.componentElement = componentElement;
- this.context = context;
- this.locals = locals;
- this.injector = injector;
- this.expression = expression;
- }
- return _Context;
- })();
- var AbstractChangeDetector = (function () {
- function AbstractChangeDetector(id, dispatcher, numberOfPropertyProtoRecords, bindingTargets, directiveIndices, strategy) {
- this.id = id;
- this.dispatcher = dispatcher;
- this.numberOfPropertyProtoRecords = numberOfPropertyProtoRecords;
- this.bindingTargets = bindingTargets;
- this.directiveIndices = directiveIndices;
- this.strategy = strategy;
- this.contentChildren = [];
- this.viewChildren = [];
- // The names of the below fields must be kept in sync with codegen_name_util.ts or
- // change detection will fail.
- this.state = constants_1.ChangeDetectorState.NeverChecked;
- this.locals = null;
- this.mode = null;
- this.pipes = null;
- this.ref = new change_detector_ref_1.ChangeDetectorRef_(this);
- }
- AbstractChangeDetector.prototype.addContentChild = function (cd) {
- this.contentChildren.push(cd);
- cd.parent = this;
- };
- AbstractChangeDetector.prototype.removeContentChild = function (cd) { collection_1.ListWrapper.remove(this.contentChildren, cd); };
- AbstractChangeDetector.prototype.addViewChild = function (cd) {
- this.viewChildren.push(cd);
- cd.parent = this;
- };
- AbstractChangeDetector.prototype.removeViewChild = function (cd) { collection_1.ListWrapper.remove(this.viewChildren, cd); };
- AbstractChangeDetector.prototype.remove = function () { this.parent.removeContentChild(this); };
- AbstractChangeDetector.prototype.handleEvent = function (eventName, elIndex, locals) {
- var res = this.handleEventInternal(eventName, elIndex, locals);
- this.markPathToRootAsCheckOnce();
- return res;
- };
- AbstractChangeDetector.prototype.handleEventInternal = function (eventName, elIndex, locals) { return false; };
- AbstractChangeDetector.prototype.detectChanges = function () { this.runDetectChanges(false); };
- AbstractChangeDetector.prototype.checkNoChanges = function () {
- if (lang_1.assertionsEnabled()) {
- this.runDetectChanges(true);
- }
- };
- AbstractChangeDetector.prototype.runDetectChanges = function (throwOnChange) {
- if (this.mode === constants_1.ChangeDetectionStrategy.Detached ||
- this.mode === constants_1.ChangeDetectionStrategy.Checked || this.state === constants_1.ChangeDetectorState.Errored)
- return;
- var s = _scope_check(this.id, throwOnChange);
- this.detectChangesInRecords(throwOnChange);
- this._detectChangesContentChildren(throwOnChange);
- if (!throwOnChange)
- this.afterContentLifecycleCallbacks();
- this._detectChangesInViewChildren(throwOnChange);
- if (!throwOnChange)
- this.afterViewLifecycleCallbacks();
- if (this.mode === constants_1.ChangeDetectionStrategy.CheckOnce)
- this.mode = constants_1.ChangeDetectionStrategy.Checked;
- this.state = constants_1.ChangeDetectorState.CheckedBefore;
- profile_1.wtfLeave(s);
- };
- // This method is not intended to be overridden. Subclasses should instead provide an
- // implementation of `detectChangesInRecordsInternal` which does the work of detecting changes
- // and which this method will call.
- // This method expects that `detectChangesInRecordsInternal` will set the property
- // `this.propertyBindingIndex` to the propertyBindingIndex of the first proto record. This is to
- // facilitate error reporting.
- AbstractChangeDetector.prototype.detectChangesInRecords = function (throwOnChange) {
- if (!this.hydrated()) {
- this.throwDehydratedError();
- }
- try {
- this.detectChangesInRecordsInternal(throwOnChange);
- }
- catch (e) {
- // throwOnChange errors aren't counted as fatal errors.
- if (!(e instanceof exceptions_1.ExpressionChangedAfterItHasBeenCheckedException)) {
- this.state = constants_1.ChangeDetectorState.Errored;
- }
- this._throwError(e, e.stack);
- }
- };
- // Subclasses should override this method to perform any work necessary to detect and report
- // changes. For example, changes should be reported via `ChangeDetectionUtil.addChange`, lifecycle
- // methods should be called, etc.
- // This implementation should also set `this.propertyBindingIndex` to the propertyBindingIndex of
- // the
- // first proto record to facilitate error reporting. See {@link #detectChangesInRecords}.
- AbstractChangeDetector.prototype.detectChangesInRecordsInternal = function (throwOnChange) { };
- // This method is not intended to be overridden. Subclasses should instead provide an
- // implementation of `hydrateDirectives`.
- AbstractChangeDetector.prototype.hydrate = function (context, locals, directives, pipes) {
- this.mode = change_detection_util_1.ChangeDetectionUtil.changeDetectionMode(this.strategy);
- this.context = context;
- if (this.strategy === constants_1.ChangeDetectionStrategy.OnPushObserve) {
- this.observeComponent(context);
- }
- this.locals = locals;
- this.pipes = pipes;
- this.hydrateDirectives(directives);
- this.state = constants_1.ChangeDetectorState.NeverChecked;
- };
- // Subclasses should override this method to hydrate any directives.
- AbstractChangeDetector.prototype.hydrateDirectives = function (directives) { };
- // This method is not intended to be overridden. Subclasses should instead provide an
- // implementation of `dehydrateDirectives`.
- AbstractChangeDetector.prototype.dehydrate = function () {
- this.dehydrateDirectives(true);
- // This is an experimental feature. Works only in Dart.
- if (this.strategy === constants_1.ChangeDetectionStrategy.OnPushObserve) {
- this._unsubsribeFromObservables();
- }
- this.context = null;
- this.locals = null;
- this.pipes = null;
- };
- // Subclasses should override this method to dehydrate any directives. This method should reverse
- // any work done in `hydrateDirectives`.
- AbstractChangeDetector.prototype.dehydrateDirectives = function (destroyPipes) { };
- AbstractChangeDetector.prototype.hydrated = function () { return lang_1.isPresent(this.context); };
- AbstractChangeDetector.prototype.afterContentLifecycleCallbacks = function () {
- this.dispatcher.notifyAfterContentChecked();
- this.afterContentLifecycleCallbacksInternal();
- };
- AbstractChangeDetector.prototype.afterContentLifecycleCallbacksInternal = function () { };
- AbstractChangeDetector.prototype.afterViewLifecycleCallbacks = function () {
- this.dispatcher.notifyAfterViewChecked();
- this.afterViewLifecycleCallbacksInternal();
- };
- AbstractChangeDetector.prototype.afterViewLifecycleCallbacksInternal = function () { };
- /** @internal */
- AbstractChangeDetector.prototype._detectChangesContentChildren = function (throwOnChange) {
- var c = this.contentChildren;
- for (var i = 0; i < c.length; ++i) {
- c[i].runDetectChanges(throwOnChange);
- }
- };
- /** @internal */
- AbstractChangeDetector.prototype._detectChangesInViewChildren = function (throwOnChange) {
- var c = this.viewChildren;
- for (var i = 0; i < c.length; ++i) {
- c[i].runDetectChanges(throwOnChange);
- }
- };
- AbstractChangeDetector.prototype.markAsCheckOnce = function () { this.mode = constants_1.ChangeDetectionStrategy.CheckOnce; };
- AbstractChangeDetector.prototype.markPathToRootAsCheckOnce = function () {
- var c = this;
- while (lang_1.isPresent(c) && c.mode !== constants_1.ChangeDetectionStrategy.Detached) {
- if (c.mode === constants_1.ChangeDetectionStrategy.Checked)
- c.mode = constants_1.ChangeDetectionStrategy.CheckOnce;
- c = c.parent;
- }
- };
- // This is an experimental feature. Works only in Dart.
- AbstractChangeDetector.prototype._unsubsribeFromObservables = function () {
- if (lang_1.isPresent(this.subscriptions)) {
- for (var i = 0; i < this.subscriptions.length; ++i) {
- var s = this.subscriptions[i];
- if (lang_1.isPresent(this.subscriptions[i])) {
- s.cancel();
- this.subscriptions[i] = null;
- }
- }
- }
- };
- // This is an experimental feature. Works only in Dart.
- AbstractChangeDetector.prototype.observeValue = function (value, index) {
- var _this = this;
- if (observable_facade_1.isObservable(value)) {
- this._createArrayToStoreObservables();
- if (lang_1.isBlank(this.subscriptions[index])) {
- this.streams[index] = value.changes;
- this.subscriptions[index] = value.changes.listen(function (_) { return _this.ref.markForCheck(); });
- }
- else if (this.streams[index] !== value.changes) {
- this.subscriptions[index].cancel();
- this.streams[index] = value.changes;
- this.subscriptions[index] = value.changes.listen(function (_) { return _this.ref.markForCheck(); });
- }
- }
- return value;
- };
- // This is an experimental feature. Works only in Dart.
- AbstractChangeDetector.prototype.observeDirective = function (value, index) {
- var _this = this;
- if (observable_facade_1.isObservable(value)) {
- this._createArrayToStoreObservables();
- var arrayIndex = this.numberOfPropertyProtoRecords + index + 2; // +1 is component
- this.streams[arrayIndex] = value.changes;
- this.subscriptions[arrayIndex] = value.changes.listen(function (_) { return _this.ref.markForCheck(); });
- }
- return value;
- };
- // This is an experimental feature. Works only in Dart.
- AbstractChangeDetector.prototype.observeComponent = function (value) {
- var _this = this;
- if (observable_facade_1.isObservable(value)) {
- this._createArrayToStoreObservables();
- var index = this.numberOfPropertyProtoRecords + 1;
- this.streams[index] = value.changes;
- this.subscriptions[index] = value.changes.listen(function (_) { return _this.ref.markForCheck(); });
- }
- return value;
- };
- AbstractChangeDetector.prototype._createArrayToStoreObservables = function () {
- if (lang_1.isBlank(this.subscriptions)) {
- this.subscriptions = collection_1.ListWrapper.createFixedSize(this.numberOfPropertyProtoRecords +
- this.directiveIndices.length + 2);
- this.streams = collection_1.ListWrapper.createFixedSize(this.numberOfPropertyProtoRecords +
- this.directiveIndices.length + 2);
- }
- };
- AbstractChangeDetector.prototype.getDirectiveFor = function (directives, index) {
- return directives.getDirectiveFor(this.directiveIndices[index]);
- };
- AbstractChangeDetector.prototype.getDetectorFor = function (directives, index) {
- return directives.getDetectorFor(this.directiveIndices[index]);
- };
- AbstractChangeDetector.prototype.notifyDispatcher = function (value) {
- this.dispatcher.notifyOnBinding(this._currentBinding(), value);
- };
- AbstractChangeDetector.prototype.logBindingUpdate = function (value) {
- this.dispatcher.logBindingUpdate(this._currentBinding(), value);
- };
- AbstractChangeDetector.prototype.addChange = function (changes, oldValue, newValue) {
- if (lang_1.isBlank(changes)) {
- changes = {};
- }
- changes[this._currentBinding().name] = change_detection_util_1.ChangeDetectionUtil.simpleChange(oldValue, newValue);
- return changes;
- };
- AbstractChangeDetector.prototype._throwError = function (exception, stack) {
- var error;
- try {
- var c = this.dispatcher.getDebugContext(this._currentBinding().elementIndex, null);
- var context = lang_1.isPresent(c) ? new _Context(c.element, c.componentElement, c.context, c.locals, c.injector, this._currentBinding().debug) :
- null;
- error = new exceptions_1.ChangeDetectionError(this._currentBinding().debug, exception, stack, context);
- }
- catch (e) {
- // if an error happens during getting the debug context, we throw a ChangeDetectionError
- // without the extra information.
- error = new exceptions_1.ChangeDetectionError(null, exception, stack, null);
- }
- throw error;
- };
- AbstractChangeDetector.prototype.throwOnChangeError = function (oldValue, newValue) {
- throw new exceptions_1.ExpressionChangedAfterItHasBeenCheckedException(this._currentBinding().debug, oldValue, newValue, null);
- };
- AbstractChangeDetector.prototype.throwDehydratedError = function () { throw new exceptions_1.DehydratedException(); };
- AbstractChangeDetector.prototype._currentBinding = function () {
- return this.bindingTargets[this.propertyBindingIndex];
- };
- return AbstractChangeDetector;
- })();
- exports.AbstractChangeDetector = AbstractChangeDetector;
- /***/ },
- /* 44 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var constants_1 = __webpack_require__(36);
- var ChangeDetectorRef = (function () {
- function ChangeDetectorRef() {
- }
- return ChangeDetectorRef;
- })();
- exports.ChangeDetectorRef = ChangeDetectorRef;
- var ChangeDetectorRef_ = (function (_super) {
- __extends(ChangeDetectorRef_, _super);
- function ChangeDetectorRef_(_cd) {
- _super.call(this);
- this._cd = _cd;
- }
- ChangeDetectorRef_.prototype.markForCheck = function () { this._cd.markPathToRootAsCheckOnce(); };
- ChangeDetectorRef_.prototype.detach = function () { this._cd.mode = constants_1.ChangeDetectionStrategy.Detached; };
- ChangeDetectorRef_.prototype.detectChanges = function () { this._cd.detectChanges(); };
- ChangeDetectorRef_.prototype.checkNoChanges = function () { this._cd.checkNoChanges(); };
- ChangeDetectorRef_.prototype.reattach = function () {
- this._cd.mode = constants_1.ChangeDetectionStrategy.CheckAlways;
- this.markForCheck();
- };
- return ChangeDetectorRef_;
- })(ChangeDetectorRef);
- exports.ChangeDetectorRef_ = ChangeDetectorRef_;
- /***/ },
- /* 45 */
- /***/ function(module, exports, __webpack_require__) {
- var impl = __webpack_require__(46);
- // Change exports to const once https://github.com/angular/ts2dart/issues/150
- /**
- * True if WTF is enabled.
- */
- exports.wtfEnabled = impl.detectWTF();
- function noopScope(arg0, arg1) {
- return null;
- }
- /**
- * Create trace scope.
- *
- * Scopes must be strictly nested and are analogous to stack frames, but
- * do not have to follow the stack frames. Instead it is recommended that they follow logical
- * nesting. You may want to use
- * [Event
- * Signatures](http://google.github.io/tracing-framework/instrumenting-code.html#custom-events)
- * as they are defined in WTF.
- *
- * Used to mark scope entry. The return value is used to leave the scope.
- *
- * var myScope = wtfCreateScope('MyClass#myMethod(ascii someVal)');
- *
- * someMethod() {
- * var s = myScope('Foo'); // 'Foo' gets stored in tracing UI
- * // DO SOME WORK HERE
- * return wtfLeave(s, 123); // Return value 123
- * }
- *
- * Note, adding try-finally block around the work to ensure that `wtfLeave` gets called can
- * negatively impact the performance of your application. For this reason we recommend that
- * you don't add them to ensure that `wtfLeave` gets called. In production `wtfLeave` is a noop and
- * so try-finally block has no value. When debugging perf issues, skipping `wtfLeave`, do to
- * exception, will produce incorrect trace, but presence of exception signifies logic error which
- * needs to be fixed before the app should be profiled. Add try-finally only when you expect that
- * an exception is expected during normal execution while profiling.
- *
- */
- exports.wtfCreateScope = exports.wtfEnabled ? impl.createScope : function (signature, flags) { return noopScope; };
- /**
- * Used to mark end of Scope.
- *
- * - `scope` to end.
- * - `returnValue` (optional) to be passed to the WTF.
- *
- * Returns the `returnValue for easy chaining.
- */
- exports.wtfLeave = exports.wtfEnabled ? impl.leave : function (s, r) { return r; };
- /**
- * Used to mark Async start. Async are similar to scope but they don't have to be strictly nested.
- * The return value is used in the call to [endAsync]. Async ranges only work if WTF has been
- * enabled.
- *
- * someMethod() {
- * var s = wtfStartTimeRange('HTTP:GET', 'some.url');
- * var future = new Future.delay(5).then((_) {
- * wtfEndTimeRange(s);
- * });
- * }
- */
- exports.wtfStartTimeRange = exports.wtfEnabled ? impl.startTimeRange : function (rangeType, action) { return null; };
- /**
- * Ends a async time range operation.
- * [range] is the return value from [wtfStartTimeRange] Async ranges only work if WTF has been
- * enabled.
- */
- exports.wtfEndTimeRange = exports.wtfEnabled ? impl.endTimeRange : function (r) {
- return null;
- };
- /***/ },
- /* 46 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var trace;
- var events;
- function detectWTF() {
- var wtf = lang_1.global['wtf'];
- if (wtf) {
- trace = wtf['trace'];
- if (trace) {
- events = trace['events'];
- return true;
- }
- }
- return false;
- }
- exports.detectWTF = detectWTF;
- function createScope(signature, flags) {
- if (flags === void 0) { flags = null; }
- return events.createScope(signature, flags);
- }
- exports.createScope = createScope;
- function leave(scope, returnValue) {
- trace.leaveScope(scope, returnValue);
- return returnValue;
- }
- exports.leave = leave;
- function startTimeRange(rangeType, action) {
- return trace.beginTimeRange(rangeType, action);
- }
- exports.startTimeRange = startTimeRange;
- function endTimeRange(range) {
- trace.endTimeRange(range);
- }
- exports.endTimeRange = endTimeRange;
- /***/ },
- /* 47 */
- /***/ function(module, exports) {
- function isObservable(value) {
- return false;
- }
- exports.isObservable = isObservable;
- /***/ },
- /* 48 */
- /***/ function(module, exports) {
- (function (RecordType) {
- RecordType[RecordType["Self"] = 0] = "Self";
- RecordType[RecordType["Const"] = 1] = "Const";
- RecordType[RecordType["PrimitiveOp"] = 2] = "PrimitiveOp";
- RecordType[RecordType["PropertyRead"] = 3] = "PropertyRead";
- RecordType[RecordType["PropertyWrite"] = 4] = "PropertyWrite";
- RecordType[RecordType["Local"] = 5] = "Local";
- RecordType[RecordType["InvokeMethod"] = 6] = "InvokeMethod";
- RecordType[RecordType["InvokeClosure"] = 7] = "InvokeClosure";
- RecordType[RecordType["KeyedRead"] = 8] = "KeyedRead";
- RecordType[RecordType["KeyedWrite"] = 9] = "KeyedWrite";
- RecordType[RecordType["Pipe"] = 10] = "Pipe";
- RecordType[RecordType["Interpolate"] = 11] = "Interpolate";
- RecordType[RecordType["SafeProperty"] = 12] = "SafeProperty";
- RecordType[RecordType["CollectionLiteral"] = 13] = "CollectionLiteral";
- RecordType[RecordType["SafeMethodInvoke"] = 14] = "SafeMethodInvoke";
- RecordType[RecordType["DirectiveLifecycle"] = 15] = "DirectiveLifecycle";
- RecordType[RecordType["Chain"] = 16] = "Chain";
- RecordType[RecordType["SkipRecordsIf"] = 17] = "SkipRecordsIf";
- RecordType[RecordType["SkipRecordsIfNot"] = 18] = "SkipRecordsIfNot";
- RecordType[RecordType["SkipRecords"] = 19] = "SkipRecords"; // Skip records unconditionally
- })(exports.RecordType || (exports.RecordType = {}));
- var RecordType = exports.RecordType;
- var ProtoRecord = (function () {
- function ProtoRecord(mode, name, funcOrValue, args, fixedArgs, contextIndex, directiveIndex, selfIndex, bindingRecord, lastInBinding, lastInDirective, argumentToPureFunction, referencedBySelf, propertyBindingIndex) {
- this.mode = mode;
- this.name = name;
- this.funcOrValue = funcOrValue;
- this.args = args;
- this.fixedArgs = fixedArgs;
- this.contextIndex = contextIndex;
- this.directiveIndex = directiveIndex;
- this.selfIndex = selfIndex;
- this.bindingRecord = bindingRecord;
- this.lastInBinding = lastInBinding;
- this.lastInDirective = lastInDirective;
- this.argumentToPureFunction = argumentToPureFunction;
- this.referencedBySelf = referencedBySelf;
- this.propertyBindingIndex = propertyBindingIndex;
- }
- ProtoRecord.prototype.isPureFunction = function () {
- return this.mode === RecordType.Interpolate || this.mode === RecordType.CollectionLiteral;
- };
- ProtoRecord.prototype.isUsedByOtherRecord = function () { return !this.lastInBinding || this.referencedBySelf; };
- ProtoRecord.prototype.shouldBeChecked = function () {
- return this.argumentToPureFunction || this.lastInBinding || this.isPureFunction() ||
- this.isPipeRecord();
- };
- ProtoRecord.prototype.isPipeRecord = function () { return this.mode === RecordType.Pipe; };
- ProtoRecord.prototype.isConditionalSkipRecord = function () {
- return this.mode === RecordType.SkipRecordsIfNot || this.mode === RecordType.SkipRecordsIf;
- };
- ProtoRecord.prototype.isUnconditionalSkipRecord = function () { return this.mode === RecordType.SkipRecords; };
- ProtoRecord.prototype.isSkipRecord = function () {
- return this.isConditionalSkipRecord() || this.isUnconditionalSkipRecord();
- };
- ProtoRecord.prototype.isLifeCycleRecord = function () { return this.mode === RecordType.DirectiveLifecycle; };
- return ProtoRecord;
- })();
- exports.ProtoRecord = ProtoRecord;
- /***/ },
- /* 49 */
- /***/ function(module, exports) {
- var EventBinding = (function () {
- function EventBinding(eventName, elIndex, dirIndex, records) {
- this.eventName = eventName;
- this.elIndex = elIndex;
- this.dirIndex = dirIndex;
- this.records = records;
- }
- return EventBinding;
- })();
- exports.EventBinding = EventBinding;
- /***/ },
- /* 50 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var collection_1 = __webpack_require__(12);
- var proto_record_1 = __webpack_require__(48);
- /**
- * Removes "duplicate" records. It assumes that record evaluation does not have side-effects.
- *
- * Records that are not last in bindings are removed and all the indices of the records that depend
- * on them are updated.
- *
- * Records that are last in bindings CANNOT be removed, and instead are replaced with very cheap
- * SELF records.
- *
- * @internal
- */
- function coalesce(srcRecords) {
- var dstRecords = [];
- var excludedIdxs = [];
- var indexMap = new collection_1.Map();
- var skipDepth = 0;
- var skipSources = collection_1.ListWrapper.createFixedSize(srcRecords.length);
- for (var protoIndex = 0; protoIndex < srcRecords.length; protoIndex++) {
- var skipRecord = skipSources[protoIndex];
- if (lang_1.isPresent(skipRecord)) {
- skipDepth--;
- skipRecord.fixedArgs[0] = dstRecords.length;
- }
- var src = srcRecords[protoIndex];
- var dst = _cloneAndUpdateIndexes(src, dstRecords, indexMap);
- if (dst.isSkipRecord()) {
- dstRecords.push(dst);
- skipDepth++;
- skipSources[dst.fixedArgs[0]] = dst;
- }
- else {
- var record = _mayBeAddRecord(dst, dstRecords, excludedIdxs, skipDepth > 0);
- indexMap.set(src.selfIndex, record.selfIndex);
- }
- }
- return _optimizeSkips(dstRecords);
- }
- exports.coalesce = coalesce;
- /**
- * - Conditional skip of 1 record followed by an unconditional skip of N are replaced by a
- * conditional skip of N with the negated condition,
- * - Skips of 0 records are removed
- */
- function _optimizeSkips(srcRecords) {
- var dstRecords = [];
- var skipSources = collection_1.ListWrapper.createFixedSize(srcRecords.length);
- var indexMap = new collection_1.Map();
- for (var protoIndex = 0; protoIndex < srcRecords.length; protoIndex++) {
- var skipRecord = skipSources[protoIndex];
- if (lang_1.isPresent(skipRecord)) {
- skipRecord.fixedArgs[0] = dstRecords.length;
- }
- var src = srcRecords[protoIndex];
- if (src.isSkipRecord()) {
- if (src.isConditionalSkipRecord() && src.fixedArgs[0] === protoIndex + 2 &&
- protoIndex < srcRecords.length - 1 &&
- srcRecords[protoIndex + 1].mode === proto_record_1.RecordType.SkipRecords) {
- src.mode = src.mode === proto_record_1.RecordType.SkipRecordsIf ? proto_record_1.RecordType.SkipRecordsIfNot :
- proto_record_1.RecordType.SkipRecordsIf;
- src.fixedArgs[0] = srcRecords[protoIndex + 1].fixedArgs[0];
- protoIndex++;
- }
- if (src.fixedArgs[0] > protoIndex + 1) {
- var dst = _cloneAndUpdateIndexes(src, dstRecords, indexMap);
- dstRecords.push(dst);
- skipSources[dst.fixedArgs[0]] = dst;
- }
- }
- else {
- var dst = _cloneAndUpdateIndexes(src, dstRecords, indexMap);
- dstRecords.push(dst);
- indexMap.set(src.selfIndex, dst.selfIndex);
- }
- }
- return dstRecords;
- }
- /**
- * Add a new record or re-use one of the existing records.
- */
- function _mayBeAddRecord(record, dstRecords, excludedIdxs, excluded) {
- var match = _findFirstMatch(record, dstRecords, excludedIdxs);
- if (lang_1.isPresent(match)) {
- if (record.lastInBinding) {
- dstRecords.push(_createSelfRecord(record, match.selfIndex, dstRecords.length + 1));
- match.referencedBySelf = true;
- }
- else {
- if (record.argumentToPureFunction) {
- match.argumentToPureFunction = true;
- }
- }
- return match;
- }
- if (excluded) {
- excludedIdxs.push(record.selfIndex);
- }
- dstRecords.push(record);
- return record;
- }
- /**
- * Returns the first `ProtoRecord` that matches the record.
- */
- function _findFirstMatch(record, dstRecords, excludedIdxs) {
- return dstRecords.find(
- // TODO(vicb): optimize excludedIdxs.indexOf (sorted array)
- function (rr) { return excludedIdxs.indexOf(rr.selfIndex) == -1 && rr.mode !== proto_record_1.RecordType.DirectiveLifecycle &&
- _haveSameDirIndex(rr, record) && rr.mode === record.mode &&
- lang_1.looseIdentical(rr.funcOrValue, record.funcOrValue) &&
- rr.contextIndex === record.contextIndex && lang_1.looseIdentical(rr.name, record.name) &&
- collection_1.ListWrapper.equals(rr.args, record.args); });
- }
- /**
- * Clone the `ProtoRecord` and changes the indexes for the ones in the destination array for:
- * - the arguments,
- * - the context,
- * - self
- */
- function _cloneAndUpdateIndexes(record, dstRecords, indexMap) {
- var args = record.args.map(function (src) { return _srcToDstSelfIndex(indexMap, src); });
- var contextIndex = _srcToDstSelfIndex(indexMap, record.contextIndex);
- var selfIndex = dstRecords.length + 1;
- return new proto_record_1.ProtoRecord(record.mode, record.name, record.funcOrValue, args, record.fixedArgs, contextIndex, record.directiveIndex, selfIndex, record.bindingRecord, record.lastInBinding, record.lastInDirective, record.argumentToPureFunction, record.referencedBySelf, record.propertyBindingIndex);
- }
- /**
- * Returns the index in the destination array corresponding to the index in the src array.
- * When the element is not present in the destination array, return the source index.
- */
- function _srcToDstSelfIndex(indexMap, srcIdx) {
- var dstIdx = indexMap.get(srcIdx);
- return lang_1.isPresent(dstIdx) ? dstIdx : srcIdx;
- }
- function _createSelfRecord(r, contextIndex, selfIndex) {
- return new proto_record_1.ProtoRecord(proto_record_1.RecordType.Self, "self", null, [], r.fixedArgs, contextIndex, r.directiveIndex, selfIndex, r.bindingRecord, r.lastInBinding, r.lastInDirective, false, false, r.propertyBindingIndex);
- }
- function _haveSameDirIndex(a, b) {
- var di1 = lang_1.isBlank(a.directiveIndex) ? null : a.directiveIndex.directiveIndex;
- var ei1 = lang_1.isBlank(a.directiveIndex) ? null : a.directiveIndex.elementIndex;
- var di2 = lang_1.isBlank(b.directiveIndex) ? null : b.directiveIndex.directiveIndex;
- var ei2 = lang_1.isBlank(b.directiveIndex) ? null : b.directiveIndex.elementIndex;
- return di1 === di2 && ei1 === ei2;
- }
- /***/ },
- /* 51 */
- /***/ function(module, exports, __webpack_require__) {
- var change_detection_jit_generator_1 = __webpack_require__(52);
- var JitProtoChangeDetector = (function () {
- function JitProtoChangeDetector(definition) {
- this.definition = definition;
- this._factory = this._createFactory(definition);
- }
- JitProtoChangeDetector.isSupported = function () { return true; };
- JitProtoChangeDetector.prototype.instantiate = function (dispatcher) { return this._factory(dispatcher); };
- /** @internal */
- JitProtoChangeDetector.prototype._createFactory = function (definition) {
- return new change_detection_jit_generator_1.ChangeDetectorJITGenerator(definition, 'util', 'AbstractChangeDetector', 'ChangeDetectorStatus')
- .generate();
- };
- return JitProtoChangeDetector;
- })();
- exports.JitProtoChangeDetector = JitProtoChangeDetector;
- /***/ },
- /* 52 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var collection_1 = __webpack_require__(12);
- var abstract_change_detector_1 = __webpack_require__(43);
- var change_detection_util_1 = __webpack_require__(38);
- var proto_record_1 = __webpack_require__(48);
- var codegen_name_util_1 = __webpack_require__(53);
- var codegen_logic_util_1 = __webpack_require__(54);
- var codegen_facade_1 = __webpack_require__(55);
- var constants_1 = __webpack_require__(36);
- var proto_change_detector_1 = __webpack_require__(37);
- /**
- * The code generator takes a list of proto records and creates a function/class
- * that "emulates" what the developer would write by hand to implement the same
- * kind of behaviour.
- *
- * This code should be kept in sync with the Dart transformer's
- * `angular2.transform.template_compiler.change_detector_codegen` library. If you make updates
- * here, please make equivalent changes there.
- */
- var IS_CHANGED_LOCAL = "isChanged";
- var CHANGES_LOCAL = "changes";
- var ChangeDetectorJITGenerator = (function () {
- function ChangeDetectorJITGenerator(definition, changeDetectionUtilVarName, abstractChangeDetectorVarName, changeDetectorStateVarName) {
- this.changeDetectionUtilVarName = changeDetectionUtilVarName;
- this.abstractChangeDetectorVarName = abstractChangeDetectorVarName;
- this.changeDetectorStateVarName = changeDetectorStateVarName;
- var propertyBindingRecords = proto_change_detector_1.createPropertyRecords(definition);
- var eventBindingRecords = proto_change_detector_1.createEventRecords(definition);
- var propertyBindingTargets = definition.bindingRecords.map(function (b) { return b.target; });
- this.id = definition.id;
- this.changeDetectionStrategy = definition.strategy;
- this.genConfig = definition.genConfig;
- this.records = propertyBindingRecords;
- this.propertyBindingTargets = propertyBindingTargets;
- this.eventBindings = eventBindingRecords;
- this.directiveRecords = definition.directiveRecords;
- this._names = new codegen_name_util_1.CodegenNameUtil(this.records, this.eventBindings, this.directiveRecords, this.changeDetectionUtilVarName);
- this._logic =
- new codegen_logic_util_1.CodegenLogicUtil(this._names, this.changeDetectionUtilVarName, this.changeDetectorStateVarName, this.changeDetectionStrategy);
- this.typeName = codegen_name_util_1.sanitizeName("ChangeDetector_" + this.id);
- }
- ChangeDetectorJITGenerator.prototype.generate = function () {
- var factorySource = "\n " + this.generateSource() + "\n return function(dispatcher) {\n return new " + this.typeName + "(dispatcher);\n }\n ";
- return new Function(this.abstractChangeDetectorVarName, this.changeDetectionUtilVarName, this.changeDetectorStateVarName, factorySource)(abstract_change_detector_1.AbstractChangeDetector, change_detection_util_1.ChangeDetectionUtil, constants_1.ChangeDetectorState);
- };
- ChangeDetectorJITGenerator.prototype.generateSource = function () {
- return "\n var " + this.typeName + " = function " + this.typeName + "(dispatcher) {\n " + this.abstractChangeDetectorVarName + ".call(\n this, " + JSON.stringify(this.id) + ", dispatcher, " + this.records.length + ",\n " + this.typeName + ".gen_propertyBindingTargets, " + this.typeName + ".gen_directiveIndices,\n " + codegen_facade_1.codify(this.changeDetectionStrategy) + ");\n this.dehydrateDirectives(false);\n }\n\n " + this.typeName + ".prototype = Object.create(" + this.abstractChangeDetectorVarName + ".prototype);\n\n " + this.typeName + ".prototype.detectChangesInRecordsInternal = function(throwOnChange) {\n " + this._names.genInitLocals() + "\n var " + IS_CHANGED_LOCAL + " = false;\n var " + CHANGES_LOCAL + " = null;\n\n " + this._genAllRecords(this.records) + "\n }\n\n " + this._maybeGenHandleEventInternal() + "\n\n " + this._maybeGenAfterContentLifecycleCallbacks() + "\n\n " + this._maybeGenAfterViewLifecycleCallbacks() + "\n\n " + this._maybeGenHydrateDirectives() + "\n\n " + this._maybeGenDehydrateDirectives() + "\n\n " + this._genPropertyBindingTargets() + "\n\n " + this._genDirectiveIndices() + "\n ";
- };
- /** @internal */
- ChangeDetectorJITGenerator.prototype._genPropertyBindingTargets = function () {
- var targets = this._logic.genPropertyBindingTargets(this.propertyBindingTargets, this.genConfig.genDebugInfo);
- return this.typeName + ".gen_propertyBindingTargets = " + targets + ";";
- };
- /** @internal */
- ChangeDetectorJITGenerator.prototype._genDirectiveIndices = function () {
- var indices = this._logic.genDirectiveIndices(this.directiveRecords);
- return this.typeName + ".gen_directiveIndices = " + indices + ";";
- };
- /** @internal */
- ChangeDetectorJITGenerator.prototype._maybeGenHandleEventInternal = function () {
- var _this = this;
- if (this.eventBindings.length > 0) {
- var handlers = this.eventBindings.map(function (eb) { return _this._genEventBinding(eb); }).join("\n");
- return "\n " + this.typeName + ".prototype.handleEventInternal = function(eventName, elIndex, locals) {\n var " + this._names.getPreventDefaultAccesor() + " = false;\n " + this._names.genInitEventLocals() + "\n " + handlers + "\n return " + this._names.getPreventDefaultAccesor() + ";\n }\n ";
- }
- else {
- return '';
- }
- };
- /** @internal */
- ChangeDetectorJITGenerator.prototype._genEventBinding = function (eb) {
- var _this = this;
- var codes = [];
- this._endOfBlockIdxs = [];
- collection_1.ListWrapper.forEachWithIndex(eb.records, function (r, i) {
- var code;
- if (r.isConditionalSkipRecord()) {
- code = _this._genConditionalSkip(r, _this._names.getEventLocalName(eb, i));
- }
- else if (r.isUnconditionalSkipRecord()) {
- code = _this._genUnconditionalSkip(r);
- }
- else {
- code = _this._genEventBindingEval(eb, r);
- }
- code += _this._genEndOfSkipBlock(i);
- codes.push(code);
- });
- return "\n if (eventName === \"" + eb.eventName + "\" && elIndex === " + eb.elIndex + ") {\n " + codes.join("\n") + "\n }";
- };
- /** @internal */
- ChangeDetectorJITGenerator.prototype._genEventBindingEval = function (eb, r) {
- if (r.lastInBinding) {
- var evalRecord = this._logic.genEventBindingEvalValue(eb, r);
- var markPath = this._genMarkPathToRootAsCheckOnce(r);
- var prevDefault = this._genUpdatePreventDefault(eb, r);
- return evalRecord + "\n" + markPath + "\n" + prevDefault;
- }
- else {
- return this._logic.genEventBindingEvalValue(eb, r);
- }
- };
- /** @internal */
- ChangeDetectorJITGenerator.prototype._genMarkPathToRootAsCheckOnce = function (r) {
- var br = r.bindingRecord;
- if (br.isDefaultChangeDetection()) {
- return "";
- }
- else {
- return this._names.getDetectorName(br.directiveRecord.directiveIndex) + ".markPathToRootAsCheckOnce();";
- }
- };
- /** @internal */
- ChangeDetectorJITGenerator.prototype._genUpdatePreventDefault = function (eb, r) {
- var local = this._names.getEventLocalName(eb, r.selfIndex);
- return "if (" + local + " === false) { " + this._names.getPreventDefaultAccesor() + " = true};";
- };
- /** @internal */
- ChangeDetectorJITGenerator.prototype._maybeGenDehydrateDirectives = function () {
- var destroyPipesCode = this._names.genPipeOnDestroy();
- if (destroyPipesCode) {
- destroyPipesCode = "if (destroyPipes) { " + destroyPipesCode + " }";
- }
- var dehydrateFieldsCode = this._names.genDehydrateFields();
- if (!destroyPipesCode && !dehydrateFieldsCode)
- return '';
- return this.typeName + ".prototype.dehydrateDirectives = function(destroyPipes) {\n " + destroyPipesCode + "\n " + dehydrateFieldsCode + "\n }";
- };
- /** @internal */
- ChangeDetectorJITGenerator.prototype._maybeGenHydrateDirectives = function () {
- var hydrateDirectivesCode = this._logic.genHydrateDirectives(this.directiveRecords);
- var hydrateDetectorsCode = this._logic.genHydrateDetectors(this.directiveRecords);
- if (!hydrateDirectivesCode && !hydrateDetectorsCode)
- return '';
- return this.typeName + ".prototype.hydrateDirectives = function(directives) {\n " + hydrateDirectivesCode + "\n " + hydrateDetectorsCode + "\n }";
- };
- /** @internal */
- ChangeDetectorJITGenerator.prototype._maybeGenAfterContentLifecycleCallbacks = function () {
- var notifications = this._logic.genContentLifecycleCallbacks(this.directiveRecords);
- if (notifications.length > 0) {
- var directiveNotifications = notifications.join("\n");
- return "\n " + this.typeName + ".prototype.afterContentLifecycleCallbacksInternal = function() {\n " + directiveNotifications + "\n }\n ";
- }
- else {
- return '';
- }
- };
- /** @internal */
- ChangeDetectorJITGenerator.prototype._maybeGenAfterViewLifecycleCallbacks = function () {
- var notifications = this._logic.genViewLifecycleCallbacks(this.directiveRecords);
- if (notifications.length > 0) {
- var directiveNotifications = notifications.join("\n");
- return "\n " + this.typeName + ".prototype.afterViewLifecycleCallbacksInternal = function() {\n " + directiveNotifications + "\n }\n ";
- }
- else {
- return '';
- }
- };
- /** @internal */
- ChangeDetectorJITGenerator.prototype._genAllRecords = function (rs) {
- var codes = [];
- this._endOfBlockIdxs = [];
- for (var i = 0; i < rs.length; i++) {
- var code = void 0;
- var r = rs[i];
- if (r.isLifeCycleRecord()) {
- code = this._genDirectiveLifecycle(r);
- }
- else if (r.isPipeRecord()) {
- code = this._genPipeCheck(r);
- }
- else if (r.isConditionalSkipRecord()) {
- code = this._genConditionalSkip(r, this._names.getLocalName(r.contextIndex));
- }
- else if (r.isUnconditionalSkipRecord()) {
- code = this._genUnconditionalSkip(r);
- }
- else {
- code = this._genReferenceCheck(r);
- }
- code = "\n " + this._maybeFirstInBinding(r) + "\n " + code + "\n " + this._maybeGenLastInDirective(r) + "\n " + this._genEndOfSkipBlock(i) + "\n ";
- codes.push(code);
- }
- return codes.join("\n");
- };
- /** @internal */
- ChangeDetectorJITGenerator.prototype._genConditionalSkip = function (r, condition) {
- var maybeNegate = r.mode === proto_record_1.RecordType.SkipRecordsIf ? '!' : '';
- this._endOfBlockIdxs.push(r.fixedArgs[0] - 1);
- return "if (" + maybeNegate + condition + ") {";
- };
- /** @internal */
- ChangeDetectorJITGenerator.prototype._genUnconditionalSkip = function (r) {
- this._endOfBlockIdxs.pop();
- this._endOfBlockIdxs.push(r.fixedArgs[0] - 1);
- return "} else {";
- };
- /** @internal */
- ChangeDetectorJITGenerator.prototype._genEndOfSkipBlock = function (protoIndex) {
- if (!collection_1.ListWrapper.isEmpty(this._endOfBlockIdxs)) {
- var endOfBlock = collection_1.ListWrapper.last(this._endOfBlockIdxs);
- if (protoIndex === endOfBlock) {
- this._endOfBlockIdxs.pop();
- return '}';
- }
- }
- return '';
- };
- /** @internal */
- ChangeDetectorJITGenerator.prototype._genDirectiveLifecycle = function (r) {
- if (r.name === "DoCheck") {
- return this._genOnCheck(r);
- }
- else if (r.name === "OnInit") {
- return this._genOnInit(r);
- }
- else if (r.name === "OnChanges") {
- return this._genOnChange(r);
- }
- else {
- throw new exceptions_1.BaseException("Unknown lifecycle event '" + r.name + "'");
- }
- };
- /** @internal */
- ChangeDetectorJITGenerator.prototype._genPipeCheck = function (r) {
- var _this = this;
- var context = this._names.getLocalName(r.contextIndex);
- var argString = r.args.map(function (arg) { return _this._names.getLocalName(arg); }).join(", ");
- var oldValue = this._names.getFieldName(r.selfIndex);
- var newValue = this._names.getLocalName(r.selfIndex);
- var pipe = this._names.getPipeName(r.selfIndex);
- var pipeName = r.name;
- var init = "\n if (" + pipe + " === " + this.changeDetectionUtilVarName + ".uninitialized) {\n " + pipe + " = " + this._names.getPipesAccessorName() + ".get('" + pipeName + "');\n }\n ";
- var read = newValue + " = " + pipe + ".pipe.transform(" + context + ", [" + argString + "]);";
- var contexOrArgCheck = r.args.map(function (a) { return _this._names.getChangeName(a); });
- contexOrArgCheck.push(this._names.getChangeName(r.contextIndex));
- var condition = "!" + pipe + ".pure || (" + contexOrArgCheck.join(" || ") + ")";
- var check = "\n if (" + this.changeDetectionUtilVarName + ".looseNotIdentical(" + oldValue + ", " + newValue + ")) {\n " + newValue + " = " + this.changeDetectionUtilVarName + ".unwrapValue(" + newValue + ")\n " + this._genChangeMarker(r) + "\n " + this._genUpdateDirectiveOrElement(r) + "\n " + this._genAddToChanges(r) + "\n " + oldValue + " = " + newValue + ";\n }\n ";
- var genCode = r.shouldBeChecked() ? "" + read + check : read;
- if (r.isUsedByOtherRecord()) {
- return init + " if (" + condition + ") { " + genCode + " } else { " + newValue + " = " + oldValue + "; }";
- }
- else {
- return init + " if (" + condition + ") { " + genCode + " }";
- }
- };
- /** @internal */
- ChangeDetectorJITGenerator.prototype._genReferenceCheck = function (r) {
- var _this = this;
- var oldValue = this._names.getFieldName(r.selfIndex);
- var newValue = this._names.getLocalName(r.selfIndex);
- var read = "\n " + this._logic.genPropertyBindingEvalValue(r) + "\n ";
- var check = "\n if (" + this.changeDetectionUtilVarName + ".looseNotIdentical(" + oldValue + ", " + newValue + ")) {\n " + this._genChangeMarker(r) + "\n " + this._genUpdateDirectiveOrElement(r) + "\n " + this._genAddToChanges(r) + "\n " + oldValue + " = " + newValue + ";\n }\n ";
- var genCode = r.shouldBeChecked() ? "" + read + check : read;
- if (r.isPureFunction()) {
- var condition = r.args.map(function (a) { return _this._names.getChangeName(a); }).join(" || ");
- if (r.isUsedByOtherRecord()) {
- return "if (" + condition + ") { " + genCode + " } else { " + newValue + " = " + oldValue + "; }";
- }
- else {
- return "if (" + condition + ") { " + genCode + " }";
- }
- }
- else {
- return genCode;
- }
- };
- /** @internal */
- ChangeDetectorJITGenerator.prototype._genChangeMarker = function (r) {
- return r.argumentToPureFunction ? this._names.getChangeName(r.selfIndex) + " = true" : "";
- };
- /** @internal */
- ChangeDetectorJITGenerator.prototype._genUpdateDirectiveOrElement = function (r) {
- if (!r.lastInBinding)
- return "";
- var newValue = this._names.getLocalName(r.selfIndex);
- var oldValue = this._names.getFieldName(r.selfIndex);
- var notifyDebug = this.genConfig.logBindingUpdate ? "this.logBindingUpdate(" + newValue + ");" : "";
- var br = r.bindingRecord;
- if (br.target.isDirective()) {
- var directiveProperty = this._names.getDirectiveName(br.directiveRecord.directiveIndex) + "." + br.target.name;
- return "\n " + this._genThrowOnChangeCheck(oldValue, newValue) + "\n " + directiveProperty + " = " + newValue + ";\n " + notifyDebug + "\n " + IS_CHANGED_LOCAL + " = true;\n ";
- }
- else {
- return "\n " + this._genThrowOnChangeCheck(oldValue, newValue) + "\n this.notifyDispatcher(" + newValue + ");\n " + notifyDebug + "\n ";
- }
- };
- /** @internal */
- ChangeDetectorJITGenerator.prototype._genThrowOnChangeCheck = function (oldValue, newValue) {
- if (lang_1.assertionsEnabled()) {
- return "\n if(throwOnChange) {\n this.throwOnChangeError(" + oldValue + ", " + newValue + ");\n }\n ";
- }
- else {
- return '';
- }
- };
- /** @internal */
- ChangeDetectorJITGenerator.prototype._genAddToChanges = function (r) {
- var newValue = this._names.getLocalName(r.selfIndex);
- var oldValue = this._names.getFieldName(r.selfIndex);
- if (!r.bindingRecord.callOnChanges())
- return "";
- return CHANGES_LOCAL + " = this.addChange(" + CHANGES_LOCAL + ", " + oldValue + ", " + newValue + ");";
- };
- /** @internal */
- ChangeDetectorJITGenerator.prototype._maybeFirstInBinding = function (r) {
- var prev = change_detection_util_1.ChangeDetectionUtil.protoByIndex(this.records, r.selfIndex - 1);
- var firstInBinding = lang_1.isBlank(prev) || prev.bindingRecord !== r.bindingRecord;
- return firstInBinding && !r.bindingRecord.isDirectiveLifecycle() ?
- this._names.getPropertyBindingIndex() + " = " + r.propertyBindingIndex + ";" :
- '';
- };
- /** @internal */
- ChangeDetectorJITGenerator.prototype._maybeGenLastInDirective = function (r) {
- if (!r.lastInDirective)
- return "";
- return "\n " + CHANGES_LOCAL + " = null;\n " + this._genNotifyOnPushDetectors(r) + "\n " + IS_CHANGED_LOCAL + " = false;\n ";
- };
- /** @internal */
- ChangeDetectorJITGenerator.prototype._genOnCheck = function (r) {
- var br = r.bindingRecord;
- return "if (!throwOnChange) " + this._names.getDirectiveName(br.directiveRecord.directiveIndex) + ".ngDoCheck();";
- };
- /** @internal */
- ChangeDetectorJITGenerator.prototype._genOnInit = function (r) {
- var br = r.bindingRecord;
- return "if (!throwOnChange && " + this._names.getStateName() + " === " + this.changeDetectorStateVarName + ".NeverChecked) " + this._names.getDirectiveName(br.directiveRecord.directiveIndex) + ".ngOnInit();";
- };
- /** @internal */
- ChangeDetectorJITGenerator.prototype._genOnChange = function (r) {
- var br = r.bindingRecord;
- return "if (!throwOnChange && " + CHANGES_LOCAL + ") " + this._names.getDirectiveName(br.directiveRecord.directiveIndex) + ".ngOnChanges(" + CHANGES_LOCAL + ");";
- };
- /** @internal */
- ChangeDetectorJITGenerator.prototype._genNotifyOnPushDetectors = function (r) {
- var br = r.bindingRecord;
- if (!r.lastInDirective || br.isDefaultChangeDetection())
- return "";
- var retVal = "\n if(" + IS_CHANGED_LOCAL + ") {\n " + this._names.getDetectorName(br.directiveRecord.directiveIndex) + ".markAsCheckOnce();\n }\n ";
- return retVal;
- };
- return ChangeDetectorJITGenerator;
- })();
- exports.ChangeDetectorJITGenerator = ChangeDetectorJITGenerator;
- /***/ },
- /* 53 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var collection_1 = __webpack_require__(12);
- // The names of these fields must be kept in sync with abstract_change_detector.ts or change
- // detection will fail.
- var _STATE_ACCESSOR = "state";
- var _CONTEXT_ACCESSOR = "context";
- var _PROP_BINDING_INDEX = "propertyBindingIndex";
- var _DIRECTIVES_ACCESSOR = "directiveIndices";
- var _DISPATCHER_ACCESSOR = "dispatcher";
- var _LOCALS_ACCESSOR = "locals";
- var _MODE_ACCESSOR = "mode";
- var _PIPES_ACCESSOR = "pipes";
- var _PROTOS_ACCESSOR = "protos";
- exports.CONTEXT_ACCESSOR = "context";
- // `context` is always first.
- exports.CONTEXT_INDEX = 0;
- var _FIELD_PREFIX = 'this.';
- var _whiteSpaceRegExp = /\W/g;
- /**
- * Returns `s` with all non-identifier characters removed.
- */
- function sanitizeName(s) {
- return lang_1.StringWrapper.replaceAll(s, _whiteSpaceRegExp, '');
- }
- exports.sanitizeName = sanitizeName;
- /**
- * Class responsible for providing field and local variable names for change detector classes.
- * Also provides some convenience functions, for example, declaring variables, destroying pipes,
- * and dehydrating the detector.
- */
- var CodegenNameUtil = (function () {
- function CodegenNameUtil(_records, _eventBindings, _directiveRecords, _utilName) {
- this._records = _records;
- this._eventBindings = _eventBindings;
- this._directiveRecords = _directiveRecords;
- this._utilName = _utilName;
- /** @internal */
- this._sanitizedEventNames = new collection_1.Map();
- this._sanitizedNames = collection_1.ListWrapper.createFixedSize(this._records.length + 1);
- this._sanitizedNames[exports.CONTEXT_INDEX] = exports.CONTEXT_ACCESSOR;
- for (var i = 0, iLen = this._records.length; i < iLen; ++i) {
- this._sanitizedNames[i + 1] = sanitizeName("" + this._records[i].name + i);
- }
- for (var ebIndex = 0; ebIndex < _eventBindings.length; ++ebIndex) {
- var eb = _eventBindings[ebIndex];
- var names = [exports.CONTEXT_ACCESSOR];
- for (var i = 0, iLen = eb.records.length; i < iLen; ++i) {
- names.push(sanitizeName("" + eb.records[i].name + i + "_" + ebIndex));
- }
- this._sanitizedEventNames.set(eb, names);
- }
- }
- /** @internal */
- CodegenNameUtil.prototype._addFieldPrefix = function (name) { return "" + _FIELD_PREFIX + name; };
- CodegenNameUtil.prototype.getDispatcherName = function () { return this._addFieldPrefix(_DISPATCHER_ACCESSOR); };
- CodegenNameUtil.prototype.getPipesAccessorName = function () { return this._addFieldPrefix(_PIPES_ACCESSOR); };
- CodegenNameUtil.prototype.getProtosName = function () { return this._addFieldPrefix(_PROTOS_ACCESSOR); };
- CodegenNameUtil.prototype.getDirectivesAccessorName = function () { return this._addFieldPrefix(_DIRECTIVES_ACCESSOR); };
- CodegenNameUtil.prototype.getLocalsAccessorName = function () { return this._addFieldPrefix(_LOCALS_ACCESSOR); };
- CodegenNameUtil.prototype.getStateName = function () { return this._addFieldPrefix(_STATE_ACCESSOR); };
- CodegenNameUtil.prototype.getModeName = function () { return this._addFieldPrefix(_MODE_ACCESSOR); };
- CodegenNameUtil.prototype.getPropertyBindingIndex = function () { return this._addFieldPrefix(_PROP_BINDING_INDEX); };
- CodegenNameUtil.prototype.getLocalName = function (idx) { return "l_" + this._sanitizedNames[idx]; };
- CodegenNameUtil.prototype.getEventLocalName = function (eb, idx) {
- return "l_" + this._sanitizedEventNames.get(eb)[idx];
- };
- CodegenNameUtil.prototype.getChangeName = function (idx) { return "c_" + this._sanitizedNames[idx]; };
- /**
- * Generate a statement initializing local variables used when detecting changes.
- */
- CodegenNameUtil.prototype.genInitLocals = function () {
- var declarations = [];
- var assignments = [];
- for (var i = 0, iLen = this.getFieldCount(); i < iLen; ++i) {
- if (i == exports.CONTEXT_INDEX) {
- declarations.push(this.getLocalName(i) + " = " + this.getFieldName(i));
- }
- else {
- var rec = this._records[i - 1];
- if (rec.argumentToPureFunction) {
- var changeName = this.getChangeName(i);
- declarations.push(this.getLocalName(i) + "," + changeName);
- assignments.push(changeName);
- }
- else {
- declarations.push("" + this.getLocalName(i));
- }
- }
- }
- var assignmentsCode = collection_1.ListWrapper.isEmpty(assignments) ? '' : assignments.join('=') + " = false;";
- return "var " + declarations.join(',') + ";" + assignmentsCode;
- };
- /**
- * Generate a statement initializing local variables for event handlers.
- */
- CodegenNameUtil.prototype.genInitEventLocals = function () {
- var _this = this;
- var res = [(this.getLocalName(exports.CONTEXT_INDEX) + " = " + this.getFieldName(exports.CONTEXT_INDEX))];
- this._sanitizedEventNames.forEach(function (names, eb) {
- for (var i = 0; i < names.length; ++i) {
- if (i !== exports.CONTEXT_INDEX) {
- res.push("" + _this.getEventLocalName(eb, i));
- }
- }
- });
- return res.length > 1 ? "var " + res.join(',') + ";" : '';
- };
- CodegenNameUtil.prototype.getPreventDefaultAccesor = function () { return "preventDefault"; };
- CodegenNameUtil.prototype.getFieldCount = function () { return this._sanitizedNames.length; };
- CodegenNameUtil.prototype.getFieldName = function (idx) { return this._addFieldPrefix(this._sanitizedNames[idx]); };
- CodegenNameUtil.prototype.getAllFieldNames = function () {
- var fieldList = [];
- for (var k = 0, kLen = this.getFieldCount(); k < kLen; ++k) {
- if (k === 0 || this._records[k - 1].shouldBeChecked()) {
- fieldList.push(this.getFieldName(k));
- }
- }
- for (var i = 0, iLen = this._records.length; i < iLen; ++i) {
- var rec = this._records[i];
- if (rec.isPipeRecord()) {
- fieldList.push(this.getPipeName(rec.selfIndex));
- }
- }
- for (var j = 0, jLen = this._directiveRecords.length; j < jLen; ++j) {
- var dRec = this._directiveRecords[j];
- fieldList.push(this.getDirectiveName(dRec.directiveIndex));
- if (!dRec.isDefaultChangeDetection()) {
- fieldList.push(this.getDetectorName(dRec.directiveIndex));
- }
- }
- return fieldList;
- };
- /**
- * Generates statements which clear all fields so that the change detector is dehydrated.
- */
- CodegenNameUtil.prototype.genDehydrateFields = function () {
- var fields = this.getAllFieldNames();
- collection_1.ListWrapper.removeAt(fields, exports.CONTEXT_INDEX);
- if (collection_1.ListWrapper.isEmpty(fields))
- return '';
- // At least one assignment.
- fields.push(this._utilName + ".uninitialized;");
- return fields.join(' = ');
- };
- /**
- * Generates statements destroying all pipe variables.
- */
- CodegenNameUtil.prototype.genPipeOnDestroy = function () {
- var _this = this;
- return this._records.filter(function (r) { return r.isPipeRecord(); })
- .map(function (r) { return (_this._utilName + ".callPipeOnDestroy(" + _this.getPipeName(r.selfIndex) + ");"); })
- .join('\n');
- };
- CodegenNameUtil.prototype.getPipeName = function (idx) {
- return this._addFieldPrefix(this._sanitizedNames[idx] + "_pipe");
- };
- CodegenNameUtil.prototype.getDirectiveName = function (d) {
- return this._addFieldPrefix("directive_" + d.name);
- };
- CodegenNameUtil.prototype.getDetectorName = function (d) { return this._addFieldPrefix("detector_" + d.name); };
- return CodegenNameUtil;
- })();
- exports.CodegenNameUtil = CodegenNameUtil;
- /***/ },
- /* 54 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var codegen_facade_1 = __webpack_require__(55);
- var proto_record_1 = __webpack_require__(48);
- var constants_1 = __webpack_require__(36);
- var exceptions_1 = __webpack_require__(14);
- /**
- * Class responsible for providing change detection logic for change detector classes.
- */
- var CodegenLogicUtil = (function () {
- function CodegenLogicUtil(_names, _utilName, _changeDetectorStateName, _changeDetection) {
- this._names = _names;
- this._utilName = _utilName;
- this._changeDetectorStateName = _changeDetectorStateName;
- this._changeDetection = _changeDetection;
- }
- /**
- * Generates a statement which updates the local variable representing `protoRec` with the current
- * value of the record. Used by property bindings.
- */
- CodegenLogicUtil.prototype.genPropertyBindingEvalValue = function (protoRec) {
- var _this = this;
- return this._genEvalValue(protoRec, function (idx) { return _this._names.getLocalName(idx); }, this._names.getLocalsAccessorName());
- };
- /**
- * Generates a statement which updates the local variable representing `protoRec` with the current
- * value of the record. Used by event bindings.
- */
- CodegenLogicUtil.prototype.genEventBindingEvalValue = function (eventRecord, protoRec) {
- var _this = this;
- return this._genEvalValue(protoRec, function (idx) { return _this._names.getEventLocalName(eventRecord, idx); }, "locals");
- };
- CodegenLogicUtil.prototype._genEvalValue = function (protoRec, getLocalName, localsAccessor) {
- var context = (protoRec.contextIndex == -1) ?
- this._names.getDirectiveName(protoRec.directiveIndex) :
- getLocalName(protoRec.contextIndex);
- var argString = protoRec.args.map(function (arg) { return getLocalName(arg); }).join(", ");
- var rhs;
- switch (protoRec.mode) {
- case proto_record_1.RecordType.Self:
- rhs = context;
- break;
- case proto_record_1.RecordType.Const:
- rhs = codegen_facade_1.codify(protoRec.funcOrValue);
- break;
- case proto_record_1.RecordType.PropertyRead:
- rhs = this._observe(context + "." + protoRec.name, protoRec);
- break;
- case proto_record_1.RecordType.SafeProperty:
- var read = this._observe(context + "." + protoRec.name, protoRec);
- rhs =
- this._utilName + ".isValueBlank(" + context + ") ? null : " + this._observe(read, protoRec);
- break;
- case proto_record_1.RecordType.PropertyWrite:
- rhs = context + "." + protoRec.name + " = " + getLocalName(protoRec.args[0]);
- break;
- case proto_record_1.RecordType.Local:
- rhs = this._observe(localsAccessor + ".get(" + codegen_facade_1.rawString(protoRec.name) + ")", protoRec);
- break;
- case proto_record_1.RecordType.InvokeMethod:
- rhs = this._observe(context + "." + protoRec.name + "(" + argString + ")", protoRec);
- break;
- case proto_record_1.RecordType.SafeMethodInvoke:
- var invoke = context + "." + protoRec.name + "(" + argString + ")";
- rhs =
- this._utilName + ".isValueBlank(" + context + ") ? null : " + this._observe(invoke, protoRec);
- break;
- case proto_record_1.RecordType.InvokeClosure:
- rhs = context + "(" + argString + ")";
- break;
- case proto_record_1.RecordType.PrimitiveOp:
- rhs = this._utilName + "." + protoRec.name + "(" + argString + ")";
- break;
- case proto_record_1.RecordType.CollectionLiteral:
- rhs = this._utilName + "." + protoRec.name + "(" + argString + ")";
- break;
- case proto_record_1.RecordType.Interpolate:
- rhs = this._genInterpolation(protoRec);
- break;
- case proto_record_1.RecordType.KeyedRead:
- rhs = this._observe(context + "[" + getLocalName(protoRec.args[0]) + "]", protoRec);
- break;
- case proto_record_1.RecordType.KeyedWrite:
- rhs = context + "[" + getLocalName(protoRec.args[0]) + "] = " + getLocalName(protoRec.args[1]);
- break;
- case proto_record_1.RecordType.Chain:
- rhs = 'null';
- break;
- default:
- throw new exceptions_1.BaseException("Unknown operation " + protoRec.mode);
- }
- return getLocalName(protoRec.selfIndex) + " = " + rhs + ";";
- };
- /** @internal */
- CodegenLogicUtil.prototype._observe = function (exp, rec) {
- // This is an experimental feature. Works only in Dart.
- if (this._changeDetection === constants_1.ChangeDetectionStrategy.OnPushObserve) {
- return "this.observeValue(" + exp + ", " + rec.selfIndex + ")";
- }
- else {
- return exp;
- }
- };
- CodegenLogicUtil.prototype.genPropertyBindingTargets = function (propertyBindingTargets, genDebugInfo) {
- var _this = this;
- var bs = propertyBindingTargets.map(function (b) {
- if (lang_1.isBlank(b))
- return "null";
- var debug = genDebugInfo ? codegen_facade_1.codify(b.debug) : "null";
- return _this._utilName + ".bindingTarget(" + codegen_facade_1.codify(b.mode) + ", " + b.elementIndex + ", " + codegen_facade_1.codify(b.name) + ", " + codegen_facade_1.codify(b.unit) + ", " + debug + ")";
- });
- return "[" + bs.join(", ") + "]";
- };
- CodegenLogicUtil.prototype.genDirectiveIndices = function (directiveRecords) {
- var _this = this;
- var bs = directiveRecords.map(function (b) {
- return (_this._utilName + ".directiveIndex(" + b.directiveIndex.elementIndex + ", " + b.directiveIndex.directiveIndex + ")");
- });
- return "[" + bs.join(", ") + "]";
- };
- /** @internal */
- CodegenLogicUtil.prototype._genInterpolation = function (protoRec) {
- var iVals = [];
- for (var i = 0; i < protoRec.args.length; ++i) {
- iVals.push(codegen_facade_1.codify(protoRec.fixedArgs[i]));
- iVals.push(this._utilName + ".s(" + this._names.getLocalName(protoRec.args[i]) + ")");
- }
- iVals.push(codegen_facade_1.codify(protoRec.fixedArgs[protoRec.args.length]));
- return codegen_facade_1.combineGeneratedStrings(iVals);
- };
- CodegenLogicUtil.prototype.genHydrateDirectives = function (directiveRecords) {
- var res = [];
- for (var i = 0; i < directiveRecords.length; ++i) {
- var r = directiveRecords[i];
- res.push(this._names.getDirectiveName(r.directiveIndex) + " = " + this._genReadDirective(i) + ";");
- }
- return res.join("\n");
- };
- CodegenLogicUtil.prototype._genReadDirective = function (index) {
- // This is an experimental feature. Works only in Dart.
- if (this._changeDetection === constants_1.ChangeDetectionStrategy.OnPushObserve) {
- return "this.observeDirective(this.getDirectiveFor(directives, " + index + "), " + index + ")";
- }
- else {
- return "this.getDirectiveFor(directives, " + index + ")";
- }
- };
- CodegenLogicUtil.prototype.genHydrateDetectors = function (directiveRecords) {
- var res = [];
- for (var i = 0; i < directiveRecords.length; ++i) {
- var r = directiveRecords[i];
- if (!r.isDefaultChangeDetection()) {
- res.push(this._names.getDetectorName(r.directiveIndex) + " = this.getDetectorFor(directives, " + i + ");");
- }
- }
- return res.join("\n");
- };
- CodegenLogicUtil.prototype.genContentLifecycleCallbacks = function (directiveRecords) {
- var res = [];
- var eq = lang_1.IS_DART ? '==' : '===';
- // NOTE(kegluneq): Order is important!
- for (var i = directiveRecords.length - 1; i >= 0; --i) {
- var dir = directiveRecords[i];
- if (dir.callAfterContentInit) {
- res.push("if(" + this._names.getStateName() + " " + eq + " " + this._changeDetectorStateName + ".NeverChecked) " + this._names.getDirectiveName(dir.directiveIndex) + ".ngAfterContentInit();");
- }
- if (dir.callAfterContentChecked) {
- res.push(this._names.getDirectiveName(dir.directiveIndex) + ".ngAfterContentChecked();");
- }
- }
- return res;
- };
- CodegenLogicUtil.prototype.genViewLifecycleCallbacks = function (directiveRecords) {
- var res = [];
- var eq = lang_1.IS_DART ? '==' : '===';
- // NOTE(kegluneq): Order is important!
- for (var i = directiveRecords.length - 1; i >= 0; --i) {
- var dir = directiveRecords[i];
- if (dir.callAfterViewInit) {
- res.push("if(" + this._names.getStateName() + " " + eq + " " + this._changeDetectorStateName + ".NeverChecked) " + this._names.getDirectiveName(dir.directiveIndex) + ".ngAfterViewInit();");
- }
- if (dir.callAfterViewChecked) {
- res.push(this._names.getDirectiveName(dir.directiveIndex) + ".ngAfterViewChecked();");
- }
- }
- return res;
- };
- return CodegenLogicUtil;
- })();
- exports.CodegenLogicUtil = CodegenLogicUtil;
- /***/ },
- /* 55 */
- /***/ function(module, exports) {
- /**
- * Converts `funcOrValue` to a string which can be used in generated code.
- */
- function codify(obj) {
- return JSON.stringify(obj);
- }
- exports.codify = codify;
- function rawString(str) {
- return "'" + str + "'";
- }
- exports.rawString = rawString;
- /**
- * Combine the strings of generated code into a single interpolated string.
- * Each element of `vals` is expected to be a string literal or a codegen'd
- * call to a method returning a string.
- */
- function combineGeneratedStrings(vals) {
- return vals.join(' + ');
- }
- exports.combineGeneratedStrings = combineGeneratedStrings;
- /***/ },
- /* 56 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var lang_1 = __webpack_require__(5);
- /**
- * Defines template and style encapsulation options available for Component's {@link View}.
- *
- * See {@link ViewMetadata#encapsulation}.
- */
- (function (ViewEncapsulation) {
- /**
- * Emulate `Native` scoping of styles by adding an attribute containing surrogate id to the Host
- * Element and pre-processing the style rules provided via
- * {@link ViewMetadata#styles} or {@link ViewMetadata#stylesUrls}, and adding the new Host Element
- * attribute to all selectors.
- *
- * This is the default option.
- */
- ViewEncapsulation[ViewEncapsulation["Emulated"] = 0] = "Emulated";
- /**
- * Use the native encapsulation mechanism of the renderer.
- *
- * For the DOM this means using [Shadow DOM](https://w3c.github.io/webcomponents/spec/shadow/) and
- * creating a ShadowRoot for Component's Host Element.
- */
- ViewEncapsulation[ViewEncapsulation["Native"] = 1] = "Native";
- /**
- * Don't provide any template or style encapsulation.
- */
- ViewEncapsulation[ViewEncapsulation["None"] = 2] = "None";
- })(exports.ViewEncapsulation || (exports.ViewEncapsulation = {}));
- var ViewEncapsulation = exports.ViewEncapsulation;
- exports.VIEW_ENCAPSULATION_VALUES = [ViewEncapsulation.Emulated, ViewEncapsulation.Native, ViewEncapsulation.None];
- /**
- * Metadata properties available for configuring Views.
- *
- * Each Angular component requires a single `@Component` and at least one `@View` annotation. The
- * `@View` annotation specifies the HTML template to use, and lists the directives that are active
- * within the template.
- *
- * When a component is instantiated, the template is loaded into the component's shadow root, and
- * the expressions and statements in the template are evaluated against the component.
- *
- * For details on the `@Component` annotation, see {@link ComponentMetadata}.
- *
- * ### Example
- *
- * ```
- * @Component({
- * selector: 'greet',
- * template: 'Hello {{name}}!',
- * directives: [GreetUser, Bold]
- * })
- * class Greet {
- * name: string;
- *
- * constructor() {
- * this.name = 'World';
- * }
- * }
- * ```
- */
- var ViewMetadata = (function () {
- function ViewMetadata(_a) {
- var _b = _a === void 0 ? {} : _a, templateUrl = _b.templateUrl, template = _b.template, directives = _b.directives, pipes = _b.pipes, encapsulation = _b.encapsulation, styles = _b.styles, styleUrls = _b.styleUrls;
- this.templateUrl = templateUrl;
- this.template = template;
- this.styleUrls = styleUrls;
- this.styles = styles;
- this.directives = directives;
- this.pipes = pipes;
- this.encapsulation = encapsulation;
- }
- ViewMetadata = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [Object])
- ], ViewMetadata);
- return ViewMetadata;
- })();
- exports.ViewMetadata = ViewMetadata;
- /***/ },
- /* 57 */
- /***/ function(module, exports, __webpack_require__) {
- // Public API for util
- var decorators_1 = __webpack_require__(9);
- exports.Class = decorators_1.Class;
- /***/ },
- /* 58 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- exports.enableProdMode = lang_1.enableProdMode;
- /***/ },
- /* 59 */
- /***/ function(module, exports, __webpack_require__) {
- // Public API for Facade
- var lang_1 = __webpack_require__(5);
- exports.Type = lang_1.Type;
- var async_1 = __webpack_require__(60);
- exports.EventEmitter = async_1.EventEmitter;
- var exceptions_1 = __webpack_require__(14);
- exports.WrappedException = exceptions_1.WrappedException;
- var exception_handler_1 = __webpack_require__(15);
- exports.ExceptionHandler = exception_handler_1.ExceptionHandler;
- /***/ },
- /* 60 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var lang_1 = __webpack_require__(5);
- var promise_1 = __webpack_require__(61);
- exports.PromiseWrapper = promise_1.PromiseWrapper;
- exports.Promise = promise_1.Promise;
- var Subject_1 = __webpack_require__(62);
- var fromPromise_1 = __webpack_require__(63);
- var toPromise_1 = __webpack_require__(64);
- var Observable_1 = __webpack_require__(62);
- exports.Observable = Observable_1.Observable;
- var Subject_2 = __webpack_require__(62);
- exports.Subject = Subject_2.Subject;
- var TimerWrapper = (function () {
- function TimerWrapper() {
- }
- TimerWrapper.setTimeout = function (fn, millis) {
- return lang_1.global.setTimeout(fn, millis);
- };
- TimerWrapper.clearTimeout = function (id) { lang_1.global.clearTimeout(id); };
- TimerWrapper.setInterval = function (fn, millis) {
- return lang_1.global.setInterval(fn, millis);
- };
- TimerWrapper.clearInterval = function (id) { lang_1.global.clearInterval(id); };
- return TimerWrapper;
- })();
- exports.TimerWrapper = TimerWrapper;
- var ObservableWrapper = (function () {
- function ObservableWrapper() {
- }
- // TODO(vsavkin): when we use rxnext, try inferring the generic type from the first arg
- ObservableWrapper.subscribe = function (emitter, onNext, onError, onComplete) {
- if (onComplete === void 0) { onComplete = function () { }; }
- onError = (typeof onError === "function") && onError || lang_1.noop;
- onComplete = (typeof onComplete === "function") && onComplete || lang_1.noop;
- return emitter.subscribe({ next: onNext, error: onError, complete: onComplete });
- };
- ObservableWrapper.isObservable = function (obs) { return !!obs.subscribe; };
- /**
- * Returns whether `obs` has any subscribers listening to events.
- */
- ObservableWrapper.hasSubscribers = function (obs) { return obs.observers.length > 0; };
- ObservableWrapper.dispose = function (subscription) { subscription.unsubscribe(); };
- /**
- * @deprecated - use callEmit() instead
- */
- ObservableWrapper.callNext = function (emitter, value) { emitter.next(value); };
- ObservableWrapper.callEmit = function (emitter, value) { emitter.emit(value); };
- ObservableWrapper.callError = function (emitter, error) { emitter.error(error); };
- ObservableWrapper.callComplete = function (emitter) { emitter.complete(); };
- ObservableWrapper.fromPromise = function (promise) {
- return fromPromise_1.PromiseObservable.create(promise);
- };
- ObservableWrapper.toPromise = function (obj) { return toPromise_1.toPromise.call(obj); };
- return ObservableWrapper;
- })();
- exports.ObservableWrapper = ObservableWrapper;
- /**
- * Use by directives and components to emit custom Events.
- *
- * ### Examples
- *
- * In the following example, `Zippy` alternatively emits `open` and `close` events when its
- * title gets clicked:
- *
- * ```
- * @Component({
- * selector: 'zippy',
- * template: `
- * <div class="zippy">
- * <div (click)="toggle()">Toggle</div>
- * <div [hidden]="!visible">
- * <ng-content></ng-content>
- * </div>
- * </div>`})
- * export class Zippy {
- * visible: boolean = true;
- * @Output() open: EventEmitter<any> = new EventEmitter();
- * @Output() close: EventEmitter<any> = new EventEmitter();
- *
- * toggle() {
- * this.visible = !this.visible;
- * if (this.visible) {
- * this.open.emit(null);
- * } else {
- * this.close.emit(null);
- * }
- * }
- * }
- * ```
- *
- * Use Rx.Observable but provides an adapter to make it work as specified here:
- * https://github.com/jhusain/observable-spec
- *
- * Once a reference implementation of the spec is available, switch to it.
- */
- var EventEmitter = (function (_super) {
- __extends(EventEmitter, _super);
- /**
- * Creates an instance of [EventEmitter], which depending on [isAsync],
- * delivers events synchronously or asynchronously.
- */
- function EventEmitter(isAsync) {
- if (isAsync === void 0) { isAsync = true; }
- _super.call(this);
- this._isAsync = isAsync;
- }
- EventEmitter.prototype.emit = function (value) { _super.prototype.next.call(this, value); };
- /**
- * @deprecated - use .emit(value) instead
- */
- EventEmitter.prototype.next = function (value) { _super.prototype.next.call(this, value); };
- EventEmitter.prototype.subscribe = function (generatorOrNext, error, complete) {
- var schedulerFn;
- var errorFn = function (err) { return null; };
- var completeFn = function () { return null; };
- if (generatorOrNext && typeof generatorOrNext === 'object') {
- schedulerFn = this._isAsync ? function (value) { setTimeout(function () { return generatorOrNext.next(value); }); } :
- function (value) { generatorOrNext.next(value); };
- if (generatorOrNext.error) {
- errorFn = this._isAsync ? function (err) { setTimeout(function () { return generatorOrNext.error(err); }); } :
- function (err) { generatorOrNext.error(err); };
- }
- if (generatorOrNext.complete) {
- completeFn = this._isAsync ? function () { setTimeout(function () { return generatorOrNext.complete(); }); } :
- function () { generatorOrNext.complete(); };
- }
- }
- else {
- schedulerFn = this._isAsync ? function (value) { setTimeout(function () { return generatorOrNext(value); }); } :
- function (value) { generatorOrNext(value); };
- if (error) {
- errorFn =
- this._isAsync ? function (err) { setTimeout(function () { return error(err); }); } : function (err) { error(err); };
- }
- if (complete) {
- completeFn =
- this._isAsync ? function () { setTimeout(function () { return complete(); }); } : function () { complete(); };
- }
- }
- return _super.prototype.subscribe.call(this, schedulerFn, errorFn, completeFn);
- };
- return EventEmitter;
- })(Subject_1.Subject);
- exports.EventEmitter = EventEmitter;
- /***/ },
- /* 61 */
- /***/ function(module, exports) {
- // Promises are put into their own facade file so that they can be used without
- // introducing a dependency on rxjs. They are re-exported through facade/async.
- var PromiseWrapper = (function () {
- function PromiseWrapper() {
- }
- PromiseWrapper.resolve = function (obj) { return Promise.resolve(obj); };
- PromiseWrapper.reject = function (obj, _) { return Promise.reject(obj); };
- // Note: We can't rename this method into `catch`, as this is not a valid
- // method name in Dart.
- PromiseWrapper.catchError = function (promise, onError) {
- return promise.catch(onError);
- };
- PromiseWrapper.all = function (promises) {
- if (promises.length == 0)
- return Promise.resolve([]);
- return Promise.all(promises);
- };
- PromiseWrapper.then = function (promise, success, rejection) {
- return promise.then(success, rejection);
- };
- PromiseWrapper.wrap = function (computation) {
- return new Promise(function (res, rej) {
- try {
- res(computation());
- }
- catch (e) {
- rej(e);
- }
- });
- };
- PromiseWrapper.scheduleMicrotask = function (computation) {
- PromiseWrapper.then(PromiseWrapper.resolve(null), computation, function (_) { });
- };
- PromiseWrapper.isPromise = function (obj) { return obj instanceof Promise; };
- PromiseWrapper.completer = function () {
- var resolve;
- var reject;
- var p = new Promise(function (res, rej) {
- resolve = res;
- reject = rej;
- });
- return { promise: p, resolve: resolve, reject: reject };
- };
- return PromiseWrapper;
- })();
- exports.PromiseWrapper = PromiseWrapper;
- /***/ },
- /* 62 */
- /***/ function(module, exports) {
- module.exports = __WEBPACK_EXTERNAL_MODULE_62__;
- /***/ },
- /* 63 */
- /***/ function(module, exports) {
- module.exports = __WEBPACK_EXTERNAL_MODULE_63__;
- /***/ },
- /* 64 */
- /***/ function(module, exports) {
- module.exports = __WEBPACK_EXTERNAL_MODULE_64__;
- /***/ },
- /* 65 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var ng_zone_1 = __webpack_require__(66);
- var lang_1 = __webpack_require__(5);
- var di_1 = __webpack_require__(6);
- var application_tokens_1 = __webpack_require__(67);
- var async_1 = __webpack_require__(60);
- var collection_1 = __webpack_require__(12);
- var testability_1 = __webpack_require__(68);
- var dynamic_component_loader_1 = __webpack_require__(69);
- var exceptions_1 = __webpack_require__(14);
- var view_ref_1 = __webpack_require__(77);
- var console_1 = __webpack_require__(97);
- var profile_1 = __webpack_require__(45);
- var lang_2 = __webpack_require__(5);
- /**
- * Construct providers specific to an individual root component.
- */
- function _componentProviders(appComponentType) {
- return [
- di_1.provide(application_tokens_1.APP_COMPONENT, { useValue: appComponentType }),
- di_1.provide(application_tokens_1.APP_COMPONENT_REF_PROMISE, {
- useFactory: function (dynamicComponentLoader, appRef, injector) {
- // Save the ComponentRef for disposal later.
- var ref;
- // TODO(rado): investigate whether to support providers on root component.
- return dynamicComponentLoader.loadAsRoot(appComponentType, null, injector, function () { appRef._unloadComponent(ref); })
- .then(function (componentRef) {
- ref = componentRef;
- if (lang_1.isPresent(componentRef.location.nativeElement)) {
- injector.get(testability_1.TestabilityRegistry)
- .registerApplication(componentRef.location.nativeElement, injector.get(testability_1.Testability));
- }
- return componentRef;
- });
- },
- deps: [dynamic_component_loader_1.DynamicComponentLoader, ApplicationRef, di_1.Injector]
- }),
- di_1.provide(appComponentType, {
- useFactory: function (p) { return p.then(function (ref) { return ref.instance; }); },
- deps: [application_tokens_1.APP_COMPONENT_REF_PROMISE]
- }),
- ];
- }
- /**
- * Create an Angular zone.
- */
- function createNgZone() {
- return new ng_zone_1.NgZone({ enableLongStackTrace: lang_1.assertionsEnabled() });
- }
- exports.createNgZone = createNgZone;
- var _platform;
- var _platformProviders;
- /**
- * Initialize the Angular 'platform' on the page.
- *
- * See {@link PlatformRef} for details on the Angular platform.
- *
- * It is also possible to specify providers to be made in the new platform. These providers
- * will be shared between all applications on the page. For example, an abstraction for
- * the browser cookie jar should be bound at the platform level, because there is only one
- * cookie jar regardless of how many applications on the page will be accessing it.
- *
- * The platform function can be called multiple times as long as the same list of providers
- * is passed into each call. If the platform function is called with a different set of
- * provides, Angular will throw an exception.
- */
- function platform(providers) {
- lang_2.lockMode();
- if (lang_1.isPresent(_platform)) {
- if (collection_1.ListWrapper.equals(_platformProviders, providers)) {
- return _platform;
- }
- else {
- throw new exceptions_1.BaseException("platform cannot be initialized with different sets of providers.");
- }
- }
- else {
- return _createPlatform(providers);
- }
- }
- exports.platform = platform;
- /**
- * Dispose the existing platform.
- */
- function disposePlatform() {
- if (lang_1.isPresent(_platform)) {
- _platform.dispose();
- _platform = null;
- }
- }
- exports.disposePlatform = disposePlatform;
- function _createPlatform(providers) {
- _platformProviders = providers;
- var injector = di_1.Injector.resolveAndCreate(providers);
- _platform = new PlatformRef_(injector, function () {
- _platform = null;
- _platformProviders = null;
- });
- _runPlatformInitializers(injector);
- return _platform;
- }
- function _runPlatformInitializers(injector) {
- var inits = injector.getOptional(application_tokens_1.PLATFORM_INITIALIZER);
- if (lang_1.isPresent(inits))
- inits.forEach(function (init) { return init(); });
- }
- /**
- * The Angular platform is the entry point for Angular on a web page. Each page
- * has exactly one platform, and services (such as reflection) which are common
- * to every Angular application running on the page are bound in its scope.
- *
- * A page's platform is initialized implicitly when {@link bootstrap}() is called, or
- * explicitly by calling {@link platform}().
- */
- var PlatformRef = (function () {
- function PlatformRef() {
- }
- Object.defineProperty(PlatformRef.prototype, "injector", {
- /**
- * Retrieve the platform {@link Injector}, which is the parent injector for
- * every Angular application on the page and provides singleton providers.
- */
- get: function () { return exceptions_1.unimplemented(); },
- enumerable: true,
- configurable: true
- });
- ;
- return PlatformRef;
- })();
- exports.PlatformRef = PlatformRef;
- var PlatformRef_ = (function (_super) {
- __extends(PlatformRef_, _super);
- function PlatformRef_(_injector, _dispose) {
- _super.call(this);
- this._injector = _injector;
- this._dispose = _dispose;
- /** @internal */
- this._applications = [];
- /** @internal */
- this._disposeListeners = [];
- }
- PlatformRef_.prototype.registerDisposeListener = function (dispose) { this._disposeListeners.push(dispose); };
- Object.defineProperty(PlatformRef_.prototype, "injector", {
- get: function () { return this._injector; },
- enumerable: true,
- configurable: true
- });
- PlatformRef_.prototype.application = function (providers) {
- var app = this._initApp(createNgZone(), providers);
- return app;
- };
- PlatformRef_.prototype.asyncApplication = function (bindingFn, additionalProviders) {
- var _this = this;
- var zone = createNgZone();
- var completer = async_1.PromiseWrapper.completer();
- zone.run(function () {
- async_1.PromiseWrapper.then(bindingFn(zone), function (providers) {
- if (lang_1.isPresent(additionalProviders)) {
- providers = collection_1.ListWrapper.concat(providers, additionalProviders);
- }
- completer.resolve(_this._initApp(zone, providers));
- });
- });
- return completer.promise;
- };
- PlatformRef_.prototype._initApp = function (zone, providers) {
- var _this = this;
- var injector;
- var app;
- zone.run(function () {
- providers = collection_1.ListWrapper.concat(providers, [
- di_1.provide(ng_zone_1.NgZone, { useValue: zone }),
- di_1.provide(ApplicationRef, { useFactory: function () { return app; }, deps: [] })
- ]);
- var exceptionHandler;
- try {
- injector = _this.injector.resolveAndCreateChild(providers);
- exceptionHandler = injector.get(exceptions_1.ExceptionHandler);
- zone.overrideOnErrorHandler(function (e, s) { return exceptionHandler.call(e, s); });
- }
- catch (e) {
- if (lang_1.isPresent(exceptionHandler)) {
- exceptionHandler.call(e, e.stack);
- }
- else {
- lang_1.print(e.toString());
- }
- }
- });
- app = new ApplicationRef_(this, zone, injector);
- this._applications.push(app);
- _runAppInitializers(injector);
- return app;
- };
- PlatformRef_.prototype.dispose = function () {
- collection_1.ListWrapper.clone(this._applications).forEach(function (app) { return app.dispose(); });
- this._disposeListeners.forEach(function (dispose) { return dispose(); });
- this._dispose();
- };
- /** @internal */
- PlatformRef_.prototype._applicationDisposed = function (app) { collection_1.ListWrapper.remove(this._applications, app); };
- return PlatformRef_;
- })(PlatformRef);
- exports.PlatformRef_ = PlatformRef_;
- function _runAppInitializers(injector) {
- var inits = injector.getOptional(application_tokens_1.APP_INITIALIZER);
- if (lang_1.isPresent(inits))
- inits.forEach(function (init) { return init(); });
- }
- /**
- * A reference to an Angular application running on a page.
- *
- * For more about Angular applications, see the documentation for {@link bootstrap}.
- */
- var ApplicationRef = (function () {
- function ApplicationRef() {
- }
- Object.defineProperty(ApplicationRef.prototype, "injector", {
- /**
- * Retrieve the application {@link Injector}.
- */
- get: function () { return exceptions_1.unimplemented(); },
- enumerable: true,
- configurable: true
- });
- ;
- Object.defineProperty(ApplicationRef.prototype, "zone", {
- /**
- * Retrieve the application {@link NgZone}.
- */
- get: function () { return exceptions_1.unimplemented(); },
- enumerable: true,
- configurable: true
- });
- ;
- Object.defineProperty(ApplicationRef.prototype, "componentTypes", {
- /**
- * Get a list of component types registered to this application.
- */
- get: function () { return exceptions_1.unimplemented(); },
- enumerable: true,
- configurable: true
- });
- ;
- return ApplicationRef;
- })();
- exports.ApplicationRef = ApplicationRef;
- var ApplicationRef_ = (function (_super) {
- __extends(ApplicationRef_, _super);
- function ApplicationRef_(_platform, _zone, _injector) {
- var _this = this;
- _super.call(this);
- this._platform = _platform;
- this._zone = _zone;
- this._injector = _injector;
- /** @internal */
- this._bootstrapListeners = [];
- /** @internal */
- this._disposeListeners = [];
- /** @internal */
- this._rootComponents = [];
- /** @internal */
- this._rootComponentTypes = [];
- /** @internal */
- this._changeDetectorRefs = [];
- /** @internal */
- this._runningTick = false;
- /** @internal */
- this._enforceNoNewChanges = false;
- if (lang_1.isPresent(this._zone)) {
- async_1.ObservableWrapper.subscribe(this._zone.onTurnDone, function (_) { _this._zone.run(function () { _this.tick(); }); });
- }
- this._enforceNoNewChanges = lang_1.assertionsEnabled();
- }
- ApplicationRef_.prototype.registerBootstrapListener = function (listener) {
- this._bootstrapListeners.push(listener);
- };
- ApplicationRef_.prototype.registerDisposeListener = function (dispose) { this._disposeListeners.push(dispose); };
- ApplicationRef_.prototype.registerChangeDetector = function (changeDetector) {
- this._changeDetectorRefs.push(changeDetector);
- };
- ApplicationRef_.prototype.unregisterChangeDetector = function (changeDetector) {
- collection_1.ListWrapper.remove(this._changeDetectorRefs, changeDetector);
- };
- ApplicationRef_.prototype.bootstrap = function (componentType, providers) {
- var _this = this;
- var completer = async_1.PromiseWrapper.completer();
- this._zone.run(function () {
- var componentProviders = _componentProviders(componentType);
- if (lang_1.isPresent(providers)) {
- componentProviders.push(providers);
- }
- var exceptionHandler = _this._injector.get(exceptions_1.ExceptionHandler);
- _this._rootComponentTypes.push(componentType);
- try {
- var injector = _this._injector.resolveAndCreateChild(componentProviders);
- var compRefToken = injector.get(application_tokens_1.APP_COMPONENT_REF_PROMISE);
- var tick = function (componentRef) {
- _this._loadComponent(componentRef);
- completer.resolve(componentRef);
- };
- var tickResult = async_1.PromiseWrapper.then(compRefToken, tick);
- // THIS MUST ONLY RUN IN DART.
- // This is required to report an error when no components with a matching selector found.
- // Otherwise the promise will never be completed.
- // Doing this in JS causes an extra error message to appear.
- if (lang_1.IS_DART) {
- async_1.PromiseWrapper.then(tickResult, function (_) { });
- }
- async_1.PromiseWrapper.then(tickResult, null, function (err, stackTrace) { return completer.reject(err, stackTrace); });
- }
- catch (e) {
- exceptionHandler.call(e, e.stack);
- completer.reject(e, e.stack);
- }
- });
- return completer.promise.then(function (_) {
- var c = _this._injector.get(console_1.Console);
- var modeDescription = lang_1.assertionsEnabled() ?
- "in the development mode. Call enableProdMode() to enable the production mode." :
- "in the production mode. Call enableDevMode() to enable the development mode.";
- c.log("Angular 2 is running " + modeDescription);
- return _;
- });
- };
- /** @internal */
- ApplicationRef_.prototype._loadComponent = function (ref) {
- var appChangeDetector = view_ref_1.internalView(ref.hostView).changeDetector;
- this._changeDetectorRefs.push(appChangeDetector.ref);
- this.tick();
- this._rootComponents.push(ref);
- this._bootstrapListeners.forEach(function (listener) { return listener(ref); });
- };
- /** @internal */
- ApplicationRef_.prototype._unloadComponent = function (ref) {
- if (!collection_1.ListWrapper.contains(this._rootComponents, ref)) {
- return;
- }
- this.unregisterChangeDetector(view_ref_1.internalView(ref.hostView).changeDetector.ref);
- collection_1.ListWrapper.remove(this._rootComponents, ref);
- };
- Object.defineProperty(ApplicationRef_.prototype, "injector", {
- get: function () { return this._injector; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(ApplicationRef_.prototype, "zone", {
- get: function () { return this._zone; },
- enumerable: true,
- configurable: true
- });
- ApplicationRef_.prototype.tick = function () {
- if (this._runningTick) {
- throw new exceptions_1.BaseException("ApplicationRef.tick is called recursively");
- }
- var s = ApplicationRef_._tickScope();
- try {
- this._runningTick = true;
- this._changeDetectorRefs.forEach(function (detector) { return detector.detectChanges(); });
- if (this._enforceNoNewChanges) {
- this._changeDetectorRefs.forEach(function (detector) { return detector.checkNoChanges(); });
- }
- }
- finally {
- this._runningTick = false;
- profile_1.wtfLeave(s);
- }
- };
- ApplicationRef_.prototype.dispose = function () {
- // TODO(alxhub): Dispose of the NgZone.
- collection_1.ListWrapper.clone(this._rootComponents).forEach(function (ref) { return ref.dispose(); });
- this._disposeListeners.forEach(function (dispose) { return dispose(); });
- this._platform._applicationDisposed(this);
- };
- Object.defineProperty(ApplicationRef_.prototype, "componentTypes", {
- get: function () { return this._rootComponentTypes; },
- enumerable: true,
- configurable: true
- });
- /** @internal */
- ApplicationRef_._tickScope = profile_1.wtfCreateScope('ApplicationRef#tick()');
- return ApplicationRef_;
- })(ApplicationRef);
- exports.ApplicationRef_ = ApplicationRef_;
- /***/ },
- /* 66 */
- /***/ function(module, exports, __webpack_require__) {
- var collection_1 = __webpack_require__(12);
- var lang_1 = __webpack_require__(5);
- var async_1 = __webpack_require__(60);
- var profile_1 = __webpack_require__(45);
- /**
- * Stores error information; delivered via [NgZone.onError] stream.
- */
- var NgZoneError = (function () {
- function NgZoneError(error, stackTrace) {
- this.error = error;
- this.stackTrace = stackTrace;
- }
- return NgZoneError;
- })();
- exports.NgZoneError = NgZoneError;
- /**
- * An injectable service for executing work inside or outside of the Angular zone.
- *
- * The most common use of this service is to optimize performance when starting a work consisting of
- * one or more asynchronous tasks that don't require UI updates or error handling to be handled by
- * Angular. Such tasks can be kicked off via {@link #runOutsideAngular} and if needed, these tasks
- * can reenter the Angular zone via {@link #run}.
- *
- * <!-- TODO: add/fix links to:
- * - docs explaining zones and the use of zones in Angular and change-detection
- * - link to runOutsideAngular/run (throughout this file!)
- * -->
- *
- * ### Example ([live demo](http://plnkr.co/edit/lY9m8HLy7z06vDoUaSN2?p=preview))
- * ```
- * import {Component, View, NgZone} from 'angular2/core';
- * import {NgIf} from 'angular2/common';
- *
- * @Component({
- * selector: 'ng-zone-demo'.
- * template: `
- * <h2>Demo: NgZone</h2>
- *
- * <p>Progress: {{progress}}%</p>
- * <p *ngIf="progress >= 100">Done processing {{label}} of Angular zone!</p>
- *
- * <button (click)="processWithinAngularZone()">Process within Angular zone</button>
- * <button (click)="processOutsideOfAngularZone()">Process outside of Angular zone</button>
- * `,
- * directives: [NgIf]
- * })
- * export class NgZoneDemo {
- * progress: number = 0;
- * label: string;
- *
- * constructor(private _ngZone: NgZone) {}
- *
- * // Loop inside the Angular zone
- * // so the UI DOES refresh after each setTimeout cycle
- * processWithinAngularZone() {
- * this.label = 'inside';
- * this.progress = 0;
- * this._increaseProgress(() => console.log('Inside Done!'));
- * }
- *
- * // Loop outside of the Angular zone
- * // so the UI DOES NOT refresh after each setTimeout cycle
- * processOutsideOfAngularZone() {
- * this.label = 'outside';
- * this.progress = 0;
- * this._ngZone.runOutsideAngular(() => {
- * this._increaseProgress(() => {
- * // reenter the Angular zone and display done
- * this._ngZone.run(() => {console.log('Outside Done!') });
- * }}));
- * }
- *
- *
- * _increaseProgress(doneCallback: () => void) {
- * this.progress += 1;
- * console.log(`Current progress: ${this.progress}%`);
- *
- * if (this.progress < 100) {
- * window.setTimeout(() => this._increaseProgress(doneCallback)), 10)
- * } else {
- * doneCallback();
- * }
- * }
- * }
- * ```
- */
- var NgZone = (function () {
- /**
- * @param {bool} enableLongStackTrace whether to enable long stack trace. They should only be
- * enabled in development mode as they significantly impact perf.
- */
- function NgZone(_a) {
- var enableLongStackTrace = _a.enableLongStackTrace;
- /** @internal */
- this._runScope = profile_1.wtfCreateScope("NgZone#run()");
- /** @internal */
- this._microtaskScope = profile_1.wtfCreateScope("NgZone#microtask()");
- // Number of microtasks pending from _innerZone (& descendants)
- /** @internal */
- this._pendingMicrotasks = 0;
- // Whether some code has been executed in the _innerZone (& descendants) in the current turn
- /** @internal */
- this._hasExecutedCodeInInnerZone = false;
- // run() call depth in _mountZone. 0 at the end of a macrotask
- // zone.run(() => { // top-level call
- // zone.run(() => {}); // nested call -> in-turn
- // });
- /** @internal */
- this._nestedRun = 0;
- /** @internal */
- this._inVmTurnDone = false;
- /** @internal */
- this._pendingTimeouts = [];
- if (lang_1.global.zone) {
- this._disabled = false;
- this._mountZone = lang_1.global.zone;
- this._innerZone = this._createInnerZone(this._mountZone, enableLongStackTrace);
- }
- else {
- this._disabled = true;
- this._mountZone = null;
- }
- this._onTurnStartEvents = new async_1.EventEmitter(false);
- this._onTurnDoneEvents = new async_1.EventEmitter(false);
- this._onEventDoneEvents = new async_1.EventEmitter(false);
- this._onErrorEvents = new async_1.EventEmitter(false);
- }
- /**
- * Sets the zone hook that is called just before a browser task that is handled by Angular
- * executes.
- *
- * The hook is called once per browser task that is handled by Angular.
- *
- * Setting the hook overrides any previously set hook.
- *
- * @deprecated this API will be removed in the future. Use `onTurnStart` instead.
- */
- NgZone.prototype.overrideOnTurnStart = function (onTurnStartHook) {
- this._onTurnStart = lang_1.normalizeBlank(onTurnStartHook);
- };
- Object.defineProperty(NgZone.prototype, "onTurnStart", {
- /**
- * Notifies subscribers just before Angular event turn starts.
- *
- * Emits an event once per browser task that is handled by Angular.
- */
- get: function () { return this._onTurnStartEvents; },
- enumerable: true,
- configurable: true
- });
- /** @internal */
- NgZone.prototype._notifyOnTurnStart = function (parentRun) {
- var _this = this;
- parentRun.call(this._innerZone, function () { _this._onTurnStartEvents.emit(null); });
- };
- /**
- * Sets the zone hook that is called immediately after Angular zone is done processing the current
- * task and any microtasks scheduled from that task.
- *
- * This is where we typically do change-detection.
- *
- * The hook is called once per browser task that is handled by Angular.
- *
- * Setting the hook overrides any previously set hook.
- *
- * @deprecated this API will be removed in the future. Use `onTurnDone` instead.
- */
- NgZone.prototype.overrideOnTurnDone = function (onTurnDoneHook) {
- this._onTurnDone = lang_1.normalizeBlank(onTurnDoneHook);
- };
- Object.defineProperty(NgZone.prototype, "onTurnDone", {
- /**
- * Notifies subscribers immediately after Angular zone is done processing
- * the current turn and any microtasks scheduled from that turn.
- *
- * Used by Angular as a signal to kick off change-detection.
- */
- get: function () { return this._onTurnDoneEvents; },
- enumerable: true,
- configurable: true
- });
- /** @internal */
- NgZone.prototype._notifyOnTurnDone = function (parentRun) {
- var _this = this;
- parentRun.call(this._innerZone, function () { _this._onTurnDoneEvents.emit(null); });
- };
- /**
- * Sets the zone hook that is called immediately after the `onTurnDone` callback is called and any
- * microstasks scheduled from within that callback are drained.
- *
- * `onEventDoneFn` is executed outside Angular zone, which means that we will no longer attempt to
- * sync the UI with any model changes that occur within this callback.
- *
- * This hook is useful for validating application state (e.g. in a test).
- *
- * Setting the hook overrides any previously set hook.
- *
- * @deprecated this API will be removed in the future. Use `onEventDone` instead.
- */
- NgZone.prototype.overrideOnEventDone = function (onEventDoneFn, opt_waitForAsync) {
- var _this = this;
- if (opt_waitForAsync === void 0) { opt_waitForAsync = false; }
- var normalizedOnEventDone = lang_1.normalizeBlank(onEventDoneFn);
- if (opt_waitForAsync) {
- this._onEventDone = function () {
- if (!_this._pendingTimeouts.length) {
- normalizedOnEventDone();
- }
- };
- }
- else {
- this._onEventDone = normalizedOnEventDone;
- }
- };
- Object.defineProperty(NgZone.prototype, "onEventDone", {
- /**
- * Notifies subscribers immediately after the final `onTurnDone` callback
- * before ending VM event.
- *
- * This event is useful for validating application state (e.g. in a test).
- */
- get: function () { return this._onEventDoneEvents; },
- enumerable: true,
- configurable: true
- });
- /** @internal */
- NgZone.prototype._notifyOnEventDone = function () {
- var _this = this;
- this.runOutsideAngular(function () { _this._onEventDoneEvents.emit(null); });
- };
- Object.defineProperty(NgZone.prototype, "hasPendingMicrotasks", {
- /**
- * Whether there are any outstanding microtasks.
- */
- get: function () { return this._pendingMicrotasks > 0; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(NgZone.prototype, "hasPendingTimers", {
- /**
- * Whether there are any outstanding timers.
- */
- get: function () { return this._pendingTimeouts.length > 0; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(NgZone.prototype, "hasPendingAsyncTasks", {
- /**
- * Whether there are any outstanding asychnronous tasks of any kind that are
- * scheduled to run within Angular zone.
- *
- * Useful as a signal of UI stability. For example, when a test reaches a
- * point when [hasPendingAsyncTasks] is `false` it might be a good time to run
- * test expectations.
- */
- get: function () { return this.hasPendingMicrotasks || this.hasPendingTimers; },
- enumerable: true,
- configurable: true
- });
- /**
- * Sets the zone hook that is called when an error is thrown in the Angular zone.
- *
- * Setting the hook overrides any previously set hook.
- *
- * @deprecated this API will be removed in the future. Use `onError` instead.
- */
- NgZone.prototype.overrideOnErrorHandler = function (errorHandler) {
- this._onErrorHandler = lang_1.normalizeBlank(errorHandler);
- };
- Object.defineProperty(NgZone.prototype, "onError", {
- get: function () { return this._onErrorEvents; },
- enumerable: true,
- configurable: true
- });
- /**
- * Executes the `fn` function synchronously within the Angular zone and returns value returned by
- * the function.
- *
- * Running functions via `run` allows you to reenter Angular zone from a task that was executed
- * outside of the Angular zone (typically started via {@link #runOutsideAngular}).
- *
- * Any future tasks or microtasks scheduled from within this function will continue executing from
- * within the Angular zone.
- */
- NgZone.prototype.run = function (fn) {
- if (this._disabled) {
- return fn();
- }
- else {
- var s = this._runScope();
- try {
- return this._innerZone.run(fn);
- }
- finally {
- profile_1.wtfLeave(s);
- }
- }
- };
- /**
- * Executes the `fn` function synchronously in Angular's parent zone and returns value returned by
- * the function.
- *
- * Running functions via `runOutsideAngular` allows you to escape Angular's zone and do work that
- * doesn't trigger Angular change-detection or is subject to Angular's error handling.
- *
- * Any future tasks or microtasks scheduled from within this function will continue executing from
- * outside of the Angular zone.
- *
- * Use {@link #run} to reenter the Angular zone and do work that updates the application model.
- */
- NgZone.prototype.runOutsideAngular = function (fn) {
- if (this._disabled) {
- return fn();
- }
- else {
- return this._mountZone.run(fn);
- }
- };
- /** @internal */
- NgZone.prototype._createInnerZone = function (zone, enableLongStackTrace) {
- var microtaskScope = this._microtaskScope;
- var ngZone = this;
- var errorHandling;
- if (enableLongStackTrace) {
- errorHandling = collection_1.StringMapWrapper.merge(Zone.longStackTraceZone, { onError: function (e) { ngZone._notifyOnError(this, e); } });
- }
- else {
- errorHandling = { onError: function (e) { ngZone._notifyOnError(this, e); } };
- }
- return zone.fork(errorHandling)
- .fork({
- '$run': function (parentRun) {
- return function () {
- try {
- ngZone._nestedRun++;
- if (!ngZone._hasExecutedCodeInInnerZone) {
- ngZone._hasExecutedCodeInInnerZone = true;
- ngZone._notifyOnTurnStart(parentRun);
- if (ngZone._onTurnStart) {
- parentRun.call(ngZone._innerZone, ngZone._onTurnStart);
- }
- }
- return parentRun.apply(this, arguments);
- }
- finally {
- ngZone._nestedRun--;
- // If there are no more pending microtasks, we are at the end of a VM turn (or in
- // onTurnStart)
- // _nestedRun will be 0 at the end of a macrotasks (it could be > 0 when there are
- // nested calls
- // to run()).
- if (ngZone._pendingMicrotasks == 0 && ngZone._nestedRun == 0 &&
- !this._inVmTurnDone) {
- if (ngZone._hasExecutedCodeInInnerZone) {
- try {
- this._inVmTurnDone = true;
- ngZone._notifyOnTurnDone(parentRun);
- if (ngZone._onTurnDone) {
- parentRun.call(ngZone._innerZone, ngZone._onTurnDone);
- }
- }
- finally {
- this._inVmTurnDone = false;
- ngZone._hasExecutedCodeInInnerZone = false;
- }
- }
- if (ngZone._pendingMicrotasks === 0) {
- ngZone._notifyOnEventDone();
- if (lang_1.isPresent(ngZone._onEventDone)) {
- ngZone.runOutsideAngular(ngZone._onEventDone);
- }
- }
- }
- }
- };
- },
- '$scheduleMicrotask': function (parentScheduleMicrotask) {
- return function (fn) {
- ngZone._pendingMicrotasks++;
- var microtask = function () {
- var s = microtaskScope();
- try {
- fn();
- }
- finally {
- ngZone._pendingMicrotasks--;
- profile_1.wtfLeave(s);
- }
- };
- parentScheduleMicrotask.call(this, microtask);
- };
- },
- '$setTimeout': function (parentSetTimeout) {
- return function (fn, delay) {
- var args = [];
- for (var _i = 2; _i < arguments.length; _i++) {
- args[_i - 2] = arguments[_i];
- }
- var id;
- var cb = function () {
- fn();
- collection_1.ListWrapper.remove(ngZone._pendingTimeouts, id);
- };
- id = parentSetTimeout(cb, delay, args);
- ngZone._pendingTimeouts.push(id);
- return id;
- };
- },
- '$clearTimeout': function (parentClearTimeout) {
- return function (id) {
- parentClearTimeout(id);
- collection_1.ListWrapper.remove(ngZone._pendingTimeouts, id);
- };
- },
- _innerZone: true
- });
- };
- /** @internal */
- NgZone.prototype._notifyOnError = function (zone, e) {
- if (lang_1.isPresent(this._onErrorHandler) || async_1.ObservableWrapper.hasSubscribers(this._onErrorEvents)) {
- var trace = [lang_1.normalizeBlank(e.stack)];
- while (zone && zone.constructedAtException) {
- trace.push(zone.constructedAtException.get());
- zone = zone.parent;
- }
- if (async_1.ObservableWrapper.hasSubscribers(this._onErrorEvents)) {
- async_1.ObservableWrapper.callEmit(this._onErrorEvents, new NgZoneError(e, trace));
- }
- if (lang_1.isPresent(this._onErrorHandler)) {
- this._onErrorHandler(e, trace);
- }
- }
- else {
- console.log('## _notifyOnError ##');
- console.log(e.stack);
- throw e;
- }
- };
- return NgZone;
- })();
- exports.NgZone = NgZone;
- /***/ },
- /* 67 */
- /***/ function(module, exports, __webpack_require__) {
- var di_1 = __webpack_require__(6);
- var lang_1 = __webpack_require__(5);
- /**
- * @internal
- */
- exports.APP_COMPONENT_REF_PROMISE = lang_1.CONST_EXPR(new di_1.OpaqueToken('Promise<ComponentRef>'));
- /**
- * An {@link angular2/di/OpaqueToken} representing the application root type in the {@link
- * Injector}.
- *
- * ```
- * @Component(...)
- * class MyApp {
- * ...
- * }
- *
- * bootstrap(MyApp).then((appRef:ApplicationRef) {
- * expect(appRef.injector.get(appComponentTypeToken)).toEqual(MyApp);
- * });
- *
- * ```
- */
- exports.APP_COMPONENT = lang_1.CONST_EXPR(new di_1.OpaqueToken('AppComponent'));
- /**
- * A DI Token representing a unique string id assigned to the application by Angular and used
- * primarily for prefixing application attributes and CSS styles when
- * {@link ViewEncapsulation#Emulated} is being used.
- *
- * If you need to avoid randomly generated value to be used as an application id, you can provide
- * a custom value via a DI provider <!-- TODO: provider --> configuring the root {@link Injector}
- * using this token.
- */
- exports.APP_ID = lang_1.CONST_EXPR(new di_1.OpaqueToken('AppId'));
- function _appIdRandomProviderFactory() {
- return "" + _randomChar() + _randomChar() + _randomChar();
- }
- /**
- * Providers that will generate a random APP_ID_TOKEN.
- */
- exports.APP_ID_RANDOM_PROVIDER = lang_1.CONST_EXPR(new di_1.Provider(exports.APP_ID, { useFactory: _appIdRandomProviderFactory, deps: [] }));
- function _randomChar() {
- return lang_1.StringWrapper.fromCharCode(97 + lang_1.Math.floor(lang_1.Math.random() * 25));
- }
- /**
- * A function that will be executed when a platform is initialized.
- */
- exports.PLATFORM_INITIALIZER = lang_1.CONST_EXPR(new di_1.OpaqueToken("Platform Initializer"));
- /**
- * A function that will be executed when an application is initialized.
- */
- exports.APP_INITIALIZER = lang_1.CONST_EXPR(new di_1.OpaqueToken("Application Initializer"));
- /**
- * A token which indicates the root directory of the application
- */
- exports.PACKAGE_ROOT_URL = lang_1.CONST_EXPR(new di_1.OpaqueToken("Application Packages Root URL"));
- /***/ },
- /* 68 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var di_1 = __webpack_require__(6);
- var collection_1 = __webpack_require__(12);
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var ng_zone_1 = __webpack_require__(66);
- var async_1 = __webpack_require__(60);
- /**
- * The Testability service provides testing hooks that can be accessed from
- * the browser and by services such as Protractor. Each bootstrapped Angular
- * application on the page will have an instance of Testability.
- */
- var Testability = (function () {
- function Testability(_ngZone) {
- /** @internal */
- this._pendingCount = 0;
- /** @internal */
- this._callbacks = [];
- /** @internal */
- this._isAngularEventPending = false;
- this._watchAngularEvents(_ngZone);
- }
- /** @internal */
- Testability.prototype._watchAngularEvents = function (_ngZone) {
- var _this = this;
- async_1.ObservableWrapper.subscribe(_ngZone.onTurnStart, function (_) { _this._isAngularEventPending = true; });
- _ngZone.runOutsideAngular(function () {
- async_1.ObservableWrapper.subscribe(_ngZone.onEventDone, function (_) {
- if (!_ngZone.hasPendingTimers) {
- _this._isAngularEventPending = false;
- _this._runCallbacksIfReady();
- }
- });
- });
- };
- Testability.prototype.increasePendingRequestCount = function () {
- this._pendingCount += 1;
- return this._pendingCount;
- };
- Testability.prototype.decreasePendingRequestCount = function () {
- this._pendingCount -= 1;
- if (this._pendingCount < 0) {
- throw new exceptions_1.BaseException('pending async requests below zero');
- }
- this._runCallbacksIfReady();
- return this._pendingCount;
- };
- Testability.prototype.isStable = function () { return this._pendingCount == 0 && !this._isAngularEventPending; };
- /** @internal */
- Testability.prototype._runCallbacksIfReady = function () {
- var _this = this;
- if (!this.isStable()) {
- return; // Not ready
- }
- // Schedules the call backs in a new frame so that it is always async.
- async_1.PromiseWrapper.resolve(null).then(function (_) {
- while (_this._callbacks.length !== 0) {
- (_this._callbacks.pop())();
- }
- });
- };
- Testability.prototype.whenStable = function (callback) {
- this._callbacks.push(callback);
- this._runCallbacksIfReady();
- };
- Testability.prototype.getPendingRequestCount = function () { return this._pendingCount; };
- // This only accounts for ngZone, and not pending counts. Use `whenStable` to
- // check for stability.
- Testability.prototype.isAngularEventPending = function () { return this._isAngularEventPending; };
- Testability.prototype.findBindings = function (using, provider, exactMatch) {
- // TODO(juliemr): implement.
- return [];
- };
- Testability.prototype.findProviders = function (using, provider, exactMatch) {
- // TODO(juliemr): implement.
- return [];
- };
- Testability = __decorate([
- di_1.Injectable(),
- __metadata('design:paramtypes', [ng_zone_1.NgZone])
- ], Testability);
- return Testability;
- })();
- exports.Testability = Testability;
- /**
- * A global registry of {@link Testability} instances for specific elements.
- */
- var TestabilityRegistry = (function () {
- function TestabilityRegistry() {
- /** @internal */
- this._applications = new collection_1.Map();
- _testabilityGetter.addToWindow(this);
- }
- TestabilityRegistry.prototype.registerApplication = function (token, testability) {
- this._applications.set(token, testability);
- };
- TestabilityRegistry.prototype.getTestability = function (elem) { return this._applications.get(elem); };
- TestabilityRegistry.prototype.getAllTestabilities = function () { return collection_1.MapWrapper.values(this._applications); };
- TestabilityRegistry.prototype.findTestabilityInTree = function (elem, findInAncestors) {
- if (findInAncestors === void 0) { findInAncestors = true; }
- return _testabilityGetter.findTestabilityInTree(this, elem, findInAncestors);
- };
- TestabilityRegistry = __decorate([
- di_1.Injectable(),
- __metadata('design:paramtypes', [])
- ], TestabilityRegistry);
- return TestabilityRegistry;
- })();
- exports.TestabilityRegistry = TestabilityRegistry;
- var _NoopGetTestability = (function () {
- function _NoopGetTestability() {
- }
- _NoopGetTestability.prototype.addToWindow = function (registry) { };
- _NoopGetTestability.prototype.findTestabilityInTree = function (registry, elem, findInAncestors) {
- return null;
- };
- _NoopGetTestability = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [])
- ], _NoopGetTestability);
- return _NoopGetTestability;
- })();
- /**
- * Set the {@link GetTestability} implementation used by the Angular testing framework.
- */
- function setTestabilityGetter(getter) {
- _testabilityGetter = getter;
- }
- exports.setTestabilityGetter = setTestabilityGetter;
- var _testabilityGetter = lang_1.CONST_EXPR(new _NoopGetTestability());
- /***/ },
- /* 69 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var di_1 = __webpack_require__(6);
- var compiler_1 = __webpack_require__(70);
- var lang_1 = __webpack_require__(5);
- var view_manager_1 = __webpack_require__(81);
- /**
- * Represents an instance of a Component created via {@link DynamicComponentLoader}.
- *
- * `ComponentRef` provides access to the Component Instance as well other objects related to this
- * Component Instance and allows you to destroy the Component Instance via the {@link #dispose}
- * method.
- */
- var ComponentRef = (function () {
- function ComponentRef() {
- }
- Object.defineProperty(ComponentRef.prototype, "hostView", {
- /**
- * The {@link ViewRef} of the Host View of this Component instance.
- */
- get: function () { return this.location.parentView; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(ComponentRef.prototype, "hostComponent", {
- /**
- * @internal
- *
- * The instance of the component.
- *
- * TODO(i): this api should be removed
- */
- get: function () { return this.instance; },
- enumerable: true,
- configurable: true
- });
- return ComponentRef;
- })();
- exports.ComponentRef = ComponentRef;
- var ComponentRef_ = (function (_super) {
- __extends(ComponentRef_, _super);
- /**
- * TODO(i): refactor into public/private fields
- */
- function ComponentRef_(location, instance, componentType, injector, _dispose) {
- _super.call(this);
- this._dispose = _dispose;
- this.location = location;
- this.instance = instance;
- this.componentType = componentType;
- this.injector = injector;
- }
- Object.defineProperty(ComponentRef_.prototype, "hostComponentType", {
- /**
- * @internal
- *
- * Returns the type of this Component instance.
- *
- * TODO(i): this api should be removed
- */
- get: function () { return this.componentType; },
- enumerable: true,
- configurable: true
- });
- ComponentRef_.prototype.dispose = function () { this._dispose(); };
- return ComponentRef_;
- })(ComponentRef);
- exports.ComponentRef_ = ComponentRef_;
- /**
- * Service for instantiating a Component and attaching it to a View at a specified location.
- */
- var DynamicComponentLoader = (function () {
- function DynamicComponentLoader() {
- }
- return DynamicComponentLoader;
- })();
- exports.DynamicComponentLoader = DynamicComponentLoader;
- var DynamicComponentLoader_ = (function (_super) {
- __extends(DynamicComponentLoader_, _super);
- function DynamicComponentLoader_(_compiler, _viewManager) {
- _super.call(this);
- this._compiler = _compiler;
- this._viewManager = _viewManager;
- }
- DynamicComponentLoader_.prototype.loadAsRoot = function (type, overrideSelector, injector, onDispose) {
- var _this = this;
- return this._compiler.compileInHost(type).then(function (hostProtoViewRef) {
- var hostViewRef = _this._viewManager.createRootHostView(hostProtoViewRef, overrideSelector, injector);
- var newLocation = _this._viewManager.getHostElement(hostViewRef);
- var component = _this._viewManager.getComponent(newLocation);
- var dispose = function () {
- if (lang_1.isPresent(onDispose)) {
- onDispose();
- }
- _this._viewManager.destroyRootHostView(hostViewRef);
- };
- return new ComponentRef_(newLocation, component, type, injector, dispose);
- });
- };
- DynamicComponentLoader_.prototype.loadIntoLocation = function (type, hostLocation, anchorName, providers) {
- if (providers === void 0) { providers = null; }
- return this.loadNextToLocation(type, this._viewManager.getNamedElementInComponentView(hostLocation, anchorName), providers);
- };
- DynamicComponentLoader_.prototype.loadNextToLocation = function (type, location, providers) {
- var _this = this;
- if (providers === void 0) { providers = null; }
- return this._compiler.compileInHost(type).then(function (hostProtoViewRef) {
- var viewContainer = _this._viewManager.getViewContainer(location);
- var hostViewRef = viewContainer.createHostView(hostProtoViewRef, viewContainer.length, providers);
- var newLocation = _this._viewManager.getHostElement(hostViewRef);
- var component = _this._viewManager.getComponent(newLocation);
- var dispose = function () {
- var index = viewContainer.indexOf(hostViewRef);
- if (index !== -1) {
- viewContainer.remove(index);
- }
- };
- return new ComponentRef_(newLocation, component, type, null, dispose);
- });
- };
- DynamicComponentLoader_ = __decorate([
- di_1.Injectable(),
- __metadata('design:paramtypes', [compiler_1.Compiler, view_manager_1.AppViewManager])
- ], DynamicComponentLoader_);
- return DynamicComponentLoader_;
- })(DynamicComponentLoader);
- exports.DynamicComponentLoader_ = DynamicComponentLoader_;
- /***/ },
- /* 70 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var proto_view_factory_1 = __webpack_require__(71);
- var di_1 = __webpack_require__(6);
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var async_1 = __webpack_require__(60);
- var reflection_1 = __webpack_require__(16);
- var template_commands_1 = __webpack_require__(96);
- /**
- * Low-level service for compiling {@link Component}s into {@link ProtoViewRef ProtoViews}s, which
- * can later be used to create and render a Component instance.
- *
- * Most applications should instead use higher-level {@link DynamicComponentLoader} service, which
- * both compiles and instantiates a Component.
- */
- var Compiler = (function () {
- function Compiler() {
- }
- return Compiler;
- })();
- exports.Compiler = Compiler;
- function _isCompiledHostTemplate(type) {
- return type instanceof template_commands_1.CompiledHostTemplate;
- }
- var Compiler_ = (function (_super) {
- __extends(Compiler_, _super);
- function Compiler_(_protoViewFactory) {
- _super.call(this);
- this._protoViewFactory = _protoViewFactory;
- }
- Compiler_.prototype.compileInHost = function (componentType) {
- var metadatas = reflection_1.reflector.annotations(componentType);
- var compiledHostTemplate = metadatas.find(_isCompiledHostTemplate);
- if (lang_1.isBlank(compiledHostTemplate)) {
- throw new exceptions_1.BaseException("No precompiled template for component " + lang_1.stringify(componentType) + " found");
- }
- return async_1.PromiseWrapper.resolve(this._createProtoView(compiledHostTemplate));
- };
- Compiler_.prototype._createProtoView = function (compiledHostTemplate) {
- return this._protoViewFactory.createHost(compiledHostTemplate).ref;
- };
- Compiler_.prototype.clearCache = function () { this._protoViewFactory.clearCache(); };
- Compiler_ = __decorate([
- di_1.Injectable(),
- __metadata('design:paramtypes', [proto_view_factory_1.ProtoViewFactory])
- ], Compiler_);
- return Compiler_;
- })(Compiler);
- exports.Compiler_ = Compiler_;
- function internalCreateProtoView(compiler, compiledHostTemplate) {
- return compiler._createProtoView(compiledHostTemplate);
- }
- exports.internalCreateProtoView = internalCreateProtoView;
- /***/ },
- /* 71 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var __param = (this && this.__param) || function (paramIndex, decorator) {
- return function (target, key) { decorator(target, key, paramIndex); }
- };
- var lang_1 = __webpack_require__(5);
- var api_1 = __webpack_require__(72);
- var di_1 = __webpack_require__(6);
- var pipe_provider_1 = __webpack_require__(73);
- var pipes_1 = __webpack_require__(74);
- var view_1 = __webpack_require__(76);
- var element_binder_1 = __webpack_require__(79);
- var element_injector_1 = __webpack_require__(80);
- var directive_resolver_1 = __webpack_require__(92);
- var view_resolver_1 = __webpack_require__(93);
- var pipe_resolver_1 = __webpack_require__(94);
- var view_2 = __webpack_require__(56);
- var platform_directives_and_pipes_1 = __webpack_require__(95);
- var template_commands_1 = __webpack_require__(96);
- var api_2 = __webpack_require__(72);
- var application_tokens_1 = __webpack_require__(67);
- var ProtoViewFactory = (function () {
- function ProtoViewFactory(_renderer, _platformPipes, _directiveResolver, _viewResolver, _pipeResolver, _appId) {
- this._renderer = _renderer;
- this._platformPipes = _platformPipes;
- this._directiveResolver = _directiveResolver;
- this._viewResolver = _viewResolver;
- this._pipeResolver = _pipeResolver;
- this._appId = _appId;
- this._cache = new Map();
- this._nextTemplateId = 0;
- }
- ProtoViewFactory.prototype.clearCache = function () { this._cache.clear(); };
- ProtoViewFactory.prototype.createHost = function (compiledHostTemplate) {
- var compiledTemplate = compiledHostTemplate.template;
- var result = this._cache.get(compiledTemplate.id);
- if (lang_1.isBlank(result)) {
- var emptyMap = {};
- var shortId = this._appId + "-" + this._nextTemplateId++;
- this._renderer.registerComponentTemplate(new api_1.RenderComponentTemplate(compiledTemplate.id, shortId, view_2.ViewEncapsulation.None, compiledTemplate.commands, []));
- result =
- new view_1.AppProtoView(compiledTemplate.id, compiledTemplate.commands, view_1.ViewType.HOST, true, compiledTemplate.changeDetectorFactory, null, new pipes_1.ProtoPipes(emptyMap));
- this._cache.set(compiledTemplate.id, result);
- }
- return result;
- };
- ProtoViewFactory.prototype._createComponent = function (cmd) {
- var _this = this;
- var nestedProtoView = this._cache.get(cmd.templateId);
- if (lang_1.isBlank(nestedProtoView)) {
- var component = cmd.directives[0];
- var view = this._viewResolver.resolve(component);
- var compiledTemplate = cmd.templateGetter();
- var styles = _flattenStyleArr(compiledTemplate.styles, []);
- var shortId = this._appId + "-" + this._nextTemplateId++;
- this._renderer.registerComponentTemplate(new api_1.RenderComponentTemplate(compiledTemplate.id, shortId, cmd.encapsulation, compiledTemplate.commands, styles));
- var boundPipes = this._flattenPipes(view).map(function (pipe) { return _this._bindPipe(pipe); });
- nestedProtoView = new view_1.AppProtoView(compiledTemplate.id, compiledTemplate.commands, view_1.ViewType.COMPONENT, true, compiledTemplate.changeDetectorFactory, null, pipes_1.ProtoPipes.fromProviders(boundPipes));
- // Note: The cache is updated before recursing
- // to be able to resolve cycles
- this._cache.set(compiledTemplate.id, nestedProtoView);
- this._initializeProtoView(nestedProtoView, null);
- }
- return nestedProtoView;
- };
- ProtoViewFactory.prototype._createEmbeddedTemplate = function (cmd, parent) {
- var nestedProtoView = new view_1.AppProtoView(parent.templateId, cmd.children, view_1.ViewType.EMBEDDED, cmd.isMerged, cmd.changeDetectorFactory, arrayToMap(cmd.variableNameAndValues, true), new pipes_1.ProtoPipes(parent.pipes.config));
- if (cmd.isMerged) {
- this.initializeProtoViewIfNeeded(nestedProtoView);
- }
- return nestedProtoView;
- };
- ProtoViewFactory.prototype.initializeProtoViewIfNeeded = function (protoView) {
- if (!protoView.isInitialized()) {
- var render = this._renderer.createProtoView(protoView.templateId, protoView.templateCmds);
- this._initializeProtoView(protoView, render);
- }
- };
- ProtoViewFactory.prototype._initializeProtoView = function (protoView, render) {
- var initializer = new _ProtoViewInitializer(protoView, this._directiveResolver, this);
- template_commands_1.visitAllCommands(initializer, protoView.templateCmds);
- var mergeInfo = new view_1.AppProtoViewMergeInfo(initializer.mergeEmbeddedViewCount, initializer.mergeElementCount, initializer.mergeViewCount);
- protoView.init(render, initializer.elementBinders, initializer.boundTextCount, mergeInfo, initializer.variableLocations);
- };
- ProtoViewFactory.prototype._bindPipe = function (typeOrProvider) {
- var meta = this._pipeResolver.resolve(typeOrProvider);
- return pipe_provider_1.PipeProvider.createFromType(typeOrProvider, meta);
- };
- ProtoViewFactory.prototype._flattenPipes = function (view) {
- var pipes = [];
- if (lang_1.isPresent(this._platformPipes)) {
- _flattenArray(this._platformPipes, pipes);
- }
- if (lang_1.isPresent(view.pipes)) {
- _flattenArray(view.pipes, pipes);
- }
- return pipes;
- };
- ProtoViewFactory = __decorate([
- di_1.Injectable(),
- __param(1, di_1.Optional()),
- __param(1, di_1.Inject(platform_directives_and_pipes_1.PLATFORM_PIPES)),
- __param(5, di_1.Inject(application_tokens_1.APP_ID)),
- __metadata('design:paramtypes', [api_2.Renderer, Array, directive_resolver_1.DirectiveResolver, view_resolver_1.ViewResolver, pipe_resolver_1.PipeResolver, String])
- ], ProtoViewFactory);
- return ProtoViewFactory;
- })();
- exports.ProtoViewFactory = ProtoViewFactory;
- function createComponent(protoViewFactory, cmd) {
- return protoViewFactory._createComponent(cmd);
- }
- function createEmbeddedTemplate(protoViewFactory, cmd, parent) {
- return protoViewFactory._createEmbeddedTemplate(cmd, parent);
- }
- var _ProtoViewInitializer = (function () {
- function _ProtoViewInitializer(_protoView, _directiveResolver, _protoViewFactory) {
- this._protoView = _protoView;
- this._directiveResolver = _directiveResolver;
- this._protoViewFactory = _protoViewFactory;
- this.variableLocations = new Map();
- this.boundTextCount = 0;
- this.boundElementIndex = 0;
- this.elementBinderStack = [];
- this.distanceToParentElementBinder = 0;
- this.distanceToParentProtoElementInjector = 0;
- this.elementBinders = [];
- this.mergeEmbeddedViewCount = 0;
- this.mergeElementCount = 0;
- this.mergeViewCount = 1;
- }
- _ProtoViewInitializer.prototype.visitText = function (cmd, context) {
- if (cmd.isBound) {
- this.boundTextCount++;
- }
- return null;
- };
- _ProtoViewInitializer.prototype.visitNgContent = function (cmd, context) { return null; };
- _ProtoViewInitializer.prototype.visitBeginElement = function (cmd, context) {
- if (cmd.isBound) {
- this._visitBeginBoundElement(cmd, null);
- }
- else {
- this._visitBeginElement(cmd, null, null);
- }
- return null;
- };
- _ProtoViewInitializer.prototype.visitEndElement = function (context) { return this._visitEndElement(); };
- _ProtoViewInitializer.prototype.visitBeginComponent = function (cmd, context) {
- var nestedProtoView = createComponent(this._protoViewFactory, cmd);
- return this._visitBeginBoundElement(cmd, nestedProtoView);
- };
- _ProtoViewInitializer.prototype.visitEndComponent = function (context) { return this._visitEndElement(); };
- _ProtoViewInitializer.prototype.visitEmbeddedTemplate = function (cmd, context) {
- var nestedProtoView = createEmbeddedTemplate(this._protoViewFactory, cmd, this._protoView);
- if (cmd.isMerged) {
- this.mergeEmbeddedViewCount++;
- }
- this._visitBeginBoundElement(cmd, nestedProtoView);
- return this._visitEndElement();
- };
- _ProtoViewInitializer.prototype._visitBeginBoundElement = function (cmd, nestedProtoView) {
- if (lang_1.isPresent(nestedProtoView) && nestedProtoView.isMergable) {
- this.mergeElementCount += nestedProtoView.mergeInfo.elementCount;
- this.mergeViewCount += nestedProtoView.mergeInfo.viewCount;
- this.mergeEmbeddedViewCount += nestedProtoView.mergeInfo.embeddedViewCount;
- }
- var elementBinder = _createElementBinder(this._directiveResolver, nestedProtoView, this.elementBinderStack, this.boundElementIndex, this.distanceToParentElementBinder, this.distanceToParentProtoElementInjector, cmd);
- this.elementBinders.push(elementBinder);
- var protoElementInjector = elementBinder.protoElementInjector;
- for (var i = 0; i < cmd.variableNameAndValues.length; i += 2) {
- this.variableLocations.set(cmd.variableNameAndValues[i], this.boundElementIndex);
- }
- this.boundElementIndex++;
- this.mergeElementCount++;
- return this._visitBeginElement(cmd, elementBinder, protoElementInjector);
- };
- _ProtoViewInitializer.prototype._visitBeginElement = function (cmd, elementBinder, protoElementInjector) {
- this.distanceToParentElementBinder =
- lang_1.isPresent(elementBinder) ? 1 : this.distanceToParentElementBinder + 1;
- this.distanceToParentProtoElementInjector =
- lang_1.isPresent(protoElementInjector) ? 1 : this.distanceToParentProtoElementInjector + 1;
- this.elementBinderStack.push(elementBinder);
- return null;
- };
- _ProtoViewInitializer.prototype._visitEndElement = function () {
- var parentElementBinder = this.elementBinderStack.pop();
- var parentProtoElementInjector = lang_1.isPresent(parentElementBinder) ? parentElementBinder.protoElementInjector : null;
- this.distanceToParentElementBinder = lang_1.isPresent(parentElementBinder) ?
- parentElementBinder.distanceToParent :
- this.distanceToParentElementBinder - 1;
- this.distanceToParentProtoElementInjector = lang_1.isPresent(parentProtoElementInjector) ?
- parentProtoElementInjector.distanceToParent :
- this.distanceToParentProtoElementInjector - 1;
- return null;
- };
- return _ProtoViewInitializer;
- })();
- function _createElementBinder(directiveResolver, nestedProtoView, elementBinderStack, boundElementIndex, distanceToParentBinder, distanceToParentPei, beginElementCmd) {
- var parentElementBinder = null;
- var parentProtoElementInjector = null;
- if (distanceToParentBinder > 0) {
- parentElementBinder = elementBinderStack[elementBinderStack.length - distanceToParentBinder];
- }
- if (lang_1.isBlank(parentElementBinder)) {
- distanceToParentBinder = -1;
- }
- if (distanceToParentPei > 0) {
- var peiBinder = elementBinderStack[elementBinderStack.length - distanceToParentPei];
- if (lang_1.isPresent(peiBinder)) {
- parentProtoElementInjector = peiBinder.protoElementInjector;
- }
- }
- if (lang_1.isBlank(parentProtoElementInjector)) {
- distanceToParentPei = -1;
- }
- var componentDirectiveProvider = null;
- var isEmbeddedTemplate = false;
- var directiveProviders = beginElementCmd.directives.map(function (type) { return provideDirective(directiveResolver, type); });
- if (beginElementCmd instanceof template_commands_1.BeginComponentCmd) {
- componentDirectiveProvider = directiveProviders[0];
- }
- else if (beginElementCmd instanceof template_commands_1.EmbeddedTemplateCmd) {
- isEmbeddedTemplate = true;
- }
- var protoElementInjector = null;
- // Create a protoElementInjector for any element that either has bindings *or* has one
- // or more var- defined *or* for <template> elements:
- // - Elements with a var- defined need a their own element injector
- // so that, when hydrating, $implicit can be set to the element.
- // - <template> elements need their own ElementInjector so that we can query their TemplateRef
- var hasVariables = beginElementCmd.variableNameAndValues.length > 0;
- if (directiveProviders.length > 0 || hasVariables || isEmbeddedTemplate) {
- var directiveVariableBindings = new Map();
- if (!isEmbeddedTemplate) {
- directiveVariableBindings = createDirectiveVariableBindings(beginElementCmd.variableNameAndValues, directiveProviders);
- }
- protoElementInjector = element_injector_1.ProtoElementInjector.create(parentProtoElementInjector, boundElementIndex, directiveProviders, lang_1.isPresent(componentDirectiveProvider), distanceToParentPei, directiveVariableBindings);
- protoElementInjector.attributes = arrayToMap(beginElementCmd.attrNameAndValues, false);
- }
- return new element_binder_1.ElementBinder(boundElementIndex, parentElementBinder, distanceToParentBinder, protoElementInjector, componentDirectiveProvider, nestedProtoView);
- }
- function provideDirective(directiveResolver, type) {
- var annotation = directiveResolver.resolve(type);
- return element_injector_1.DirectiveProvider.createFromType(type, annotation);
- }
- function createDirectiveVariableBindings(variableNameAndValues, directiveProviders) {
- var directiveVariableBindings = new Map();
- for (var i = 0; i < variableNameAndValues.length; i += 2) {
- var templateName = variableNameAndValues[i];
- var dirIndex = variableNameAndValues[i + 1];
- if (lang_1.isNumber(dirIndex)) {
- directiveVariableBindings.set(templateName, dirIndex);
- }
- else {
- // a variable without a directive index -> reference the element
- directiveVariableBindings.set(templateName, null);
- }
- }
- return directiveVariableBindings;
- }
- exports.createDirectiveVariableBindings = createDirectiveVariableBindings;
- function arrayToMap(arr, inverse) {
- var result = new Map();
- for (var i = 0; i < arr.length; i += 2) {
- if (inverse) {
- result.set(arr[i + 1], arr[i]);
- }
- else {
- result.set(arr[i], arr[i + 1]);
- }
- }
- return result;
- }
- function _flattenArray(tree, out) {
- for (var i = 0; i < tree.length; i++) {
- var item = di_1.resolveForwardRef(tree[i]);
- if (lang_1.isArray(item)) {
- _flattenArray(item, out);
- }
- else {
- out.push(item);
- }
- }
- }
- function _flattenStyleArr(arr, out) {
- for (var i = 0; i < arr.length; i++) {
- var entry = arr[i];
- if (lang_1.isArray(entry)) {
- _flattenStyleArr(entry, out);
- }
- else {
- out.push(entry);
- }
- }
- return out;
- }
- /***/ },
- /* 72 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var exceptions_1 = __webpack_require__(14);
- /**
- * Represents an Angular ProtoView in the Rendering Context.
- *
- * When you implement a custom {@link Renderer}, `RenderProtoViewRef` specifies what Render View
- * your renderer should create.
- *
- * `RenderProtoViewRef` is a counterpart to {@link ProtoViewRef} available in the Application
- * Context. But unlike `ProtoViewRef`, `RenderProtoViewRef` contains all static nested Proto Views
- * that are recursively merged into a single Render Proto View.
-
- *
- * <!-- TODO: this is created by Renderer#createProtoView in the new compiler -->
- */
- var RenderProtoViewRef = (function () {
- function RenderProtoViewRef() {
- }
- return RenderProtoViewRef;
- })();
- exports.RenderProtoViewRef = RenderProtoViewRef;
- /**
- * Represents a list of sibling Nodes that can be moved by the {@link Renderer} independently of
- * other Render Fragments.
- *
- * Any {@link RenderViewRef} has one Render Fragment.
- *
- * Additionally any View with an Embedded View that contains a {@link NgContentAst View Projection}
- * results in additional Render Fragment.
- */
- /*
- <div>foo</div>
- {{bar}}
-
-
- <div>foo</div> -> view 1 / fragment 1
- <ul>
- <template ngFor>
- <li>{{fg}}</li> -> view 2 / fragment 1
- </template>
- </ul>
- {{bar}}
-
-
- <div>foo</div> -> view 1 / fragment 1
- <ul>
- <template ngIf>
- <li><ng-content></></li> -> view 1 / fragment 2
- </template>
- <template ngFor>
- <li><ng-content></></li> ->
- <li></li> -> view 1 / fragment 2 + view 2 / fragment 1..n-1
- </template>
- </ul>
- {{bar}}
- */
- // TODO(i): refactor into an interface
- var RenderFragmentRef = (function () {
- function RenderFragmentRef() {
- }
- return RenderFragmentRef;
- })();
- exports.RenderFragmentRef = RenderFragmentRef;
- /**
- * Represents an Angular View in the Rendering Context.
- *
- * `RenderViewRef` specifies to the {@link Renderer} what View to update or destroy.
- *
- * Unlike a {@link ViewRef} available in the Application Context, Render View contains all the
- * static Component Views that have been recursively merged into a single Render View.
- *
- * Each `RenderViewRef` contains one or more {@link RenderFragmentRef Render Fragments}, these
- * Fragments are created, hydrated, dehydrated and destroyed as a single unit together with the
- * View.
- */
- // TODO(i): refactor into an interface
- var RenderViewRef = (function () {
- function RenderViewRef() {
- }
- return RenderViewRef;
- })();
- exports.RenderViewRef = RenderViewRef;
- /**
- * Abstract base class for commands to the Angular renderer, using the visitor pattern.
- */
- var RenderTemplateCmd = (function () {
- function RenderTemplateCmd() {
- }
- return RenderTemplateCmd;
- })();
- exports.RenderTemplateCmd = RenderTemplateCmd;
- /**
- * Command to begin rendering.
- */
- var RenderBeginCmd = (function (_super) {
- __extends(RenderBeginCmd, _super);
- function RenderBeginCmd() {
- _super.apply(this, arguments);
- }
- Object.defineProperty(RenderBeginCmd.prototype, "ngContentIndex", {
- get: function () { return exceptions_1.unimplemented(); },
- enumerable: true,
- configurable: true
- });
- ;
- Object.defineProperty(RenderBeginCmd.prototype, "isBound", {
- get: function () { return exceptions_1.unimplemented(); },
- enumerable: true,
- configurable: true
- });
- ;
- return RenderBeginCmd;
- })(RenderTemplateCmd);
- exports.RenderBeginCmd = RenderBeginCmd;
- /**
- * Command to render text.
- */
- var RenderTextCmd = (function (_super) {
- __extends(RenderTextCmd, _super);
- function RenderTextCmd() {
- _super.apply(this, arguments);
- }
- Object.defineProperty(RenderTextCmd.prototype, "value", {
- get: function () { return exceptions_1.unimplemented(); },
- enumerable: true,
- configurable: true
- });
- ;
- return RenderTextCmd;
- })(RenderBeginCmd);
- exports.RenderTextCmd = RenderTextCmd;
- /**
- * Command to render projected content.
- */
- var RenderNgContentCmd = (function (_super) {
- __extends(RenderNgContentCmd, _super);
- function RenderNgContentCmd() {
- _super.apply(this, arguments);
- }
- Object.defineProperty(RenderNgContentCmd.prototype, "index", {
- // The index of this NgContent element
- get: function () { return exceptions_1.unimplemented(); },
- enumerable: true,
- configurable: true
- });
- ;
- Object.defineProperty(RenderNgContentCmd.prototype, "ngContentIndex", {
- // The index of the NgContent element into which this
- // NgContent element should be projected (if any)
- get: function () { return exceptions_1.unimplemented(); },
- enumerable: true,
- configurable: true
- });
- ;
- return RenderNgContentCmd;
- })(RenderTemplateCmd);
- exports.RenderNgContentCmd = RenderNgContentCmd;
- /**
- * Command to begin rendering an element.
- */
- var RenderBeginElementCmd = (function (_super) {
- __extends(RenderBeginElementCmd, _super);
- function RenderBeginElementCmd() {
- _super.apply(this, arguments);
- }
- Object.defineProperty(RenderBeginElementCmd.prototype, "name", {
- get: function () { return exceptions_1.unimplemented(); },
- enumerable: true,
- configurable: true
- });
- ;
- Object.defineProperty(RenderBeginElementCmd.prototype, "attrNameAndValues", {
- get: function () { return exceptions_1.unimplemented(); },
- enumerable: true,
- configurable: true
- });
- ;
- Object.defineProperty(RenderBeginElementCmd.prototype, "eventTargetAndNames", {
- get: function () { return exceptions_1.unimplemented(); },
- enumerable: true,
- configurable: true
- });
- ;
- return RenderBeginElementCmd;
- })(RenderBeginCmd);
- exports.RenderBeginElementCmd = RenderBeginElementCmd;
- /**
- * Command to begin rendering a component.
- */
- var RenderBeginComponentCmd = (function (_super) {
- __extends(RenderBeginComponentCmd, _super);
- function RenderBeginComponentCmd() {
- _super.apply(this, arguments);
- }
- Object.defineProperty(RenderBeginComponentCmd.prototype, "templateId", {
- get: function () { return exceptions_1.unimplemented(); },
- enumerable: true,
- configurable: true
- });
- ;
- return RenderBeginComponentCmd;
- })(RenderBeginElementCmd);
- exports.RenderBeginComponentCmd = RenderBeginComponentCmd;
- /**
- * Command to render a component's template.
- */
- var RenderEmbeddedTemplateCmd = (function (_super) {
- __extends(RenderEmbeddedTemplateCmd, _super);
- function RenderEmbeddedTemplateCmd() {
- _super.apply(this, arguments);
- }
- Object.defineProperty(RenderEmbeddedTemplateCmd.prototype, "isMerged", {
- get: function () { return exceptions_1.unimplemented(); },
- enumerable: true,
- configurable: true
- });
- ;
- Object.defineProperty(RenderEmbeddedTemplateCmd.prototype, "children", {
- get: function () { return exceptions_1.unimplemented(); },
- enumerable: true,
- configurable: true
- });
- ;
- return RenderEmbeddedTemplateCmd;
- })(RenderBeginElementCmd);
- exports.RenderEmbeddedTemplateCmd = RenderEmbeddedTemplateCmd;
- /**
- * Container class produced by a {@link Renderer} when creating a Render View.
- *
- * An instance of `RenderViewWithFragments` contains a {@link RenderViewRef} and an array of
- * {@link RenderFragmentRef}s belonging to this Render View.
- */
- // TODO(i): refactor this by RenderViewWithFragments and adding fragments directly to RenderViewRef
- var RenderViewWithFragments = (function () {
- function RenderViewWithFragments(
- /**
- * Reference to the {@link RenderViewRef}.
- */
- viewRef,
- /**
- * Array of {@link RenderFragmentRef}s ordered in the depth-first order.
- */
- fragmentRefs) {
- this.viewRef = viewRef;
- this.fragmentRefs = fragmentRefs;
- }
- return RenderViewWithFragments;
- })();
- exports.RenderViewWithFragments = RenderViewWithFragments;
- /**
- * Template for rendering a component, including commands and styles.
- */
- var RenderComponentTemplate = (function () {
- function RenderComponentTemplate(id, shortId, encapsulation, commands, styles) {
- this.id = id;
- this.shortId = shortId;
- this.encapsulation = encapsulation;
- this.commands = commands;
- this.styles = styles;
- }
- return RenderComponentTemplate;
- })();
- exports.RenderComponentTemplate = RenderComponentTemplate;
- /**
- * Injectable service that provides a low-level interface for modifying the UI.
- *
- * Use this service to bypass Angular's templating and make custom UI changes that can't be
- * expressed declaratively. For example if you need to set a property or an attribute whose name is
- * not statically known, use {@link #setElementProperty} or {@link #setElementAttribute}
- * respectively.
- *
- * If you are implementing a custom renderer, you must implement this interface.
- *
- * The default Renderer implementation is `DomRenderer`. Also available is `WebWorkerRenderer`.
- */
- var Renderer = (function () {
- function Renderer() {
- }
- return Renderer;
- })();
- exports.Renderer = Renderer;
- /***/ },
- /* 73 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var provider_1 = __webpack_require__(13);
- var di_1 = __webpack_require__(6);
- var PipeProvider = (function (_super) {
- __extends(PipeProvider, _super);
- function PipeProvider(name, pure, key, resolvedFactories, multiBinding) {
- _super.call(this, key, resolvedFactories, multiBinding);
- this.name = name;
- this.pure = pure;
- }
- PipeProvider.createFromType = function (type, metadata) {
- var provider = new di_1.Provider(type, { useClass: type });
- var rb = provider_1.resolveProvider(provider);
- return new PipeProvider(metadata.name, metadata.pure, rb.key, rb.resolvedFactories, rb.multiProvider);
- };
- return PipeProvider;
- })(provider_1.ResolvedProvider_);
- exports.PipeProvider = PipeProvider;
- /***/ },
- /* 74 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var collection_1 = __webpack_require__(12);
- var cd = __webpack_require__(75);
- var ProtoPipes = (function () {
- function ProtoPipes(
- /**
- * Map of {@link PipeMetadata} names to {@link PipeMetadata} implementations.
- */
- config) {
- this.config = config;
- this.config = config;
- }
- ProtoPipes.fromProviders = function (providers) {
- var config = {};
- providers.forEach(function (b) { return config[b.name] = b; });
- return new ProtoPipes(config);
- };
- ProtoPipes.prototype.get = function (name) {
- var provider = this.config[name];
- if (lang_1.isBlank(provider))
- throw new exceptions_1.BaseException("Cannot find pipe '" + name + "'.");
- return provider;
- };
- return ProtoPipes;
- })();
- exports.ProtoPipes = ProtoPipes;
- var Pipes = (function () {
- function Pipes(proto, injector) {
- this.proto = proto;
- this.injector = injector;
- /** @internal */
- this._config = {};
- }
- Pipes.prototype.get = function (name) {
- var cached = collection_1.StringMapWrapper.get(this._config, name);
- if (lang_1.isPresent(cached))
- return cached;
- var p = this.proto.get(name);
- var transform = this.injector.instantiateResolved(p);
- var res = new cd.SelectedPipe(transform, p.pure);
- if (p.pure) {
- collection_1.StringMapWrapper.set(this._config, name, res);
- }
- return res;
- };
- return Pipes;
- })();
- exports.Pipes = Pipes;
- /***/ },
- /* 75 */
- /***/ function(module, exports) {
- var SelectedPipe = (function () {
- function SelectedPipe(pipe, pure) {
- this.pipe = pipe;
- this.pure = pure;
- }
- return SelectedPipe;
- })();
- exports.SelectedPipe = SelectedPipe;
- /***/ },
- /* 76 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var collection_1 = __webpack_require__(12);
- var change_detection_1 = __webpack_require__(25);
- var interfaces_1 = __webpack_require__(35);
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var view_ref_1 = __webpack_require__(77);
- var util_1 = __webpack_require__(78);
- var view_ref_2 = __webpack_require__(77);
- var interfaces_2 = __webpack_require__(35);
- exports.DebugContext = interfaces_2.DebugContext;
- var REFLECT_PREFIX = 'ng-reflect-';
- (function (ViewType) {
- // A view that contains the host element with bound component directive.
- // Contains a COMPONENT view
- ViewType[ViewType["HOST"] = 0] = "HOST";
- // The view of the component
- // Can contain 0 to n EMBEDDED views
- ViewType[ViewType["COMPONENT"] = 1] = "COMPONENT";
- // A view that is embedded into another View via a <template> element
- // inside of a COMPONENT view
- ViewType[ViewType["EMBEDDED"] = 2] = "EMBEDDED";
- })(exports.ViewType || (exports.ViewType = {}));
- var ViewType = exports.ViewType;
- var AppViewContainer = (function () {
- function AppViewContainer() {
- // The order in this list matches the DOM order.
- this.views = [];
- }
- return AppViewContainer;
- })();
- exports.AppViewContainer = AppViewContainer;
- /**
- * Cost of making objects: http://jsperf.com/instantiate-size-of-object
- *
- */
- var AppView = (function () {
- function AppView(renderer, proto, viewOffset, elementOffset, textOffset, protoLocals, render, renderFragment, containerElementInjector) {
- this.renderer = renderer;
- this.proto = proto;
- this.viewOffset = viewOffset;
- this.elementOffset = elementOffset;
- this.textOffset = textOffset;
- this.render = render;
- this.renderFragment = renderFragment;
- this.containerElementInjector = containerElementInjector;
- // AppViews that have been merged in depth first order.
- // This list is shared between all merged views. Use this.elementOffset to get the local
- // entries.
- this.views = null;
- // ElementInjectors of all AppViews in views grouped by view.
- // This list is shared between all merged views. Use this.elementOffset to get the local
- // entries.
- this.elementInjectors = null;
- // ViewContainers of all AppViews in views grouped by view.
- // This list is shared between all merged views. Use this.elementOffset to get the local
- // entries.
- this.viewContainers = null;
- // PreBuiltObjects of all AppViews in views grouped by view.
- // This list is shared between all merged views. Use this.elementOffset to get the local
- // entries.
- this.preBuiltObjects = null;
- this.changeDetector = null;
- /**
- * The context against which data-binding expressions in this view are evaluated against.
- * This is always a component instance.
- */
- this.context = null;
- this.ref = new view_ref_2.ViewRef_(this);
- this.locals = new change_detection_1.Locals(null, collection_1.MapWrapper.clone(protoLocals)); // TODO optimize this
- }
- AppView.prototype.init = function (changeDetector, elementInjectors, rootElementInjectors, preBuiltObjects, views, elementRefs, viewContainers) {
- this.changeDetector = changeDetector;
- this.elementInjectors = elementInjectors;
- this.rootElementInjectors = rootElementInjectors;
- this.preBuiltObjects = preBuiltObjects;
- this.views = views;
- this.elementRefs = elementRefs;
- this.viewContainers = viewContainers;
- };
- AppView.prototype.setLocal = function (contextName, value) {
- if (!this.hydrated())
- throw new exceptions_1.BaseException('Cannot set locals on dehydrated view.');
- if (!this.proto.templateVariableBindings.has(contextName)) {
- return;
- }
- var templateName = this.proto.templateVariableBindings.get(contextName);
- this.locals.set(templateName, value);
- };
- AppView.prototype.hydrated = function () { return lang_1.isPresent(this.context); };
- /**
- * Triggers the event handlers for the element and the directives.
- *
- * This method is intended to be called from directive EventEmitters.
- *
- * @param {string} eventName
- * @param {*} eventObj
- * @param {number} boundElementIndex
- */
- AppView.prototype.triggerEventHandlers = function (eventName, eventObj, boundElementIndex) {
- var locals = new collection_1.Map();
- locals.set('$event', eventObj);
- this.dispatchEvent(boundElementIndex, eventName, locals);
- };
- // dispatch to element injector or text nodes based on context
- AppView.prototype.notifyOnBinding = function (b, currentValue) {
- if (b.isTextNode()) {
- this.renderer.setText(this.render, b.elementIndex + this.textOffset, currentValue);
- }
- else {
- var elementRef = this.elementRefs[this.elementOffset + b.elementIndex];
- if (b.isElementProperty()) {
- this.renderer.setElementProperty(elementRef, b.name, currentValue);
- }
- else if (b.isElementAttribute()) {
- this.renderer.setElementAttribute(elementRef, b.name, lang_1.isPresent(currentValue) ? "" + currentValue : null);
- }
- else if (b.isElementClass()) {
- this.renderer.setElementClass(elementRef, b.name, currentValue);
- }
- else if (b.isElementStyle()) {
- var unit = lang_1.isPresent(b.unit) ? b.unit : '';
- this.renderer.setElementStyle(elementRef, b.name, lang_1.isPresent(currentValue) ? "" + currentValue + unit : null);
- }
- else {
- throw new exceptions_1.BaseException('Unsupported directive record');
- }
- }
- };
- AppView.prototype.logBindingUpdate = function (b, value) {
- if (b.isDirective() || b.isElementProperty()) {
- var elementRef = this.elementRefs[this.elementOffset + b.elementIndex];
- this.renderer.setBindingDebugInfo(elementRef, "" + REFLECT_PREFIX + util_1.camelCaseToDashCase(b.name), "" + value);
- }
- };
- AppView.prototype.notifyAfterContentChecked = function () {
- var eiCount = this.proto.elementBinders.length;
- var ei = this.elementInjectors;
- for (var i = eiCount - 1; i >= 0; i--) {
- if (lang_1.isPresent(ei[i + this.elementOffset]))
- ei[i + this.elementOffset].ngAfterContentChecked();
- }
- };
- AppView.prototype.notifyAfterViewChecked = function () {
- var eiCount = this.proto.elementBinders.length;
- var ei = this.elementInjectors;
- for (var i = eiCount - 1; i >= 0; i--) {
- if (lang_1.isPresent(ei[i + this.elementOffset]))
- ei[i + this.elementOffset].ngAfterViewChecked();
- }
- };
- AppView.prototype.getDirectiveFor = function (directive) {
- var elementInjector = this.elementInjectors[this.elementOffset + directive.elementIndex];
- return elementInjector.getDirectiveAtIndex(directive.directiveIndex);
- };
- AppView.prototype.getNestedView = function (boundElementIndex) {
- var eli = this.elementInjectors[boundElementIndex];
- return lang_1.isPresent(eli) ? eli.getNestedView() : null;
- };
- AppView.prototype.getContainerElement = function () {
- return lang_1.isPresent(this.containerElementInjector) ?
- this.containerElementInjector.getElementRef() :
- null;
- };
- AppView.prototype.getDebugContext = function (elementIndex, directiveIndex) {
- try {
- var offsettedIndex = this.elementOffset + elementIndex;
- var hasRefForIndex = offsettedIndex < this.elementRefs.length;
- var elementRef = hasRefForIndex ? this.elementRefs[this.elementOffset + elementIndex] : null;
- var container = this.getContainerElement();
- var ei = hasRefForIndex ? this.elementInjectors[this.elementOffset + elementIndex] : null;
- var element = lang_1.isPresent(elementRef) ? elementRef.nativeElement : null;
- var componentElement = lang_1.isPresent(container) ? container.nativeElement : null;
- var directive = lang_1.isPresent(directiveIndex) ? this.getDirectiveFor(directiveIndex) : null;
- var injector = lang_1.isPresent(ei) ? ei.getInjector() : null;
- return new interfaces_1.DebugContext(element, componentElement, directive, this.context, _localsToStringMap(this.locals), injector);
- }
- catch (e) {
- // TODO: vsavkin log the exception once we have a good way to log errors and warnings
- // if an error happens during getting the debug context, we return null.
- return null;
- }
- };
- AppView.prototype.getDetectorFor = function (directive) {
- var childView = this.getNestedView(this.elementOffset + directive.elementIndex);
- return lang_1.isPresent(childView) ? childView.changeDetector : null;
- };
- AppView.prototype.invokeElementMethod = function (elementIndex, methodName, args) {
- this.renderer.invokeElementMethod(this.elementRefs[elementIndex], methodName, args);
- };
- // implementation of RenderEventDispatcher#dispatchRenderEvent
- AppView.prototype.dispatchRenderEvent = function (boundElementIndex, eventName, locals) {
- var elementRef = this.elementRefs[boundElementIndex];
- var view = view_ref_1.internalView(elementRef.parentView);
- return view.dispatchEvent(elementRef.boundElementIndex, eventName, locals);
- };
- // returns false if preventDefault must be applied to the DOM event
- AppView.prototype.dispatchEvent = function (boundElementIndex, eventName, locals) {
- try {
- if (this.hydrated()) {
- return !this.changeDetector.handleEvent(eventName, boundElementIndex - this.elementOffset, new change_detection_1.Locals(this.locals, locals));
- }
- else {
- return true;
- }
- }
- catch (e) {
- var c = this.getDebugContext(boundElementIndex - this.elementOffset, null);
- var context = lang_1.isPresent(c) ? new _Context(c.element, c.componentElement, c.context, c.locals, c.injector) :
- null;
- throw new EventEvaluationError(eventName, e, e.stack, context);
- }
- };
- Object.defineProperty(AppView.prototype, "ownBindersCount", {
- get: function () { return this.proto.elementBinders.length; },
- enumerable: true,
- configurable: true
- });
- return AppView;
- })();
- exports.AppView = AppView;
- function _localsToStringMap(locals) {
- var res = {};
- var c = locals;
- while (lang_1.isPresent(c)) {
- res = collection_1.StringMapWrapper.merge(res, collection_1.MapWrapper.toStringMap(c.current));
- c = c.parent;
- }
- return res;
- }
- /**
- * Error context included when an event handler throws an exception.
- */
- var _Context = (function () {
- function _Context(element, componentElement, context, locals, injector) {
- this.element = element;
- this.componentElement = componentElement;
- this.context = context;
- this.locals = locals;
- this.injector = injector;
- }
- return _Context;
- })();
- /**
- * Wraps an exception thrown by an event handler.
- */
- var EventEvaluationError = (function (_super) {
- __extends(EventEvaluationError, _super);
- function EventEvaluationError(eventName, originalException, originalStack, context) {
- _super.call(this, "Error during evaluation of \"" + eventName + "\"", originalException, originalStack, context);
- }
- return EventEvaluationError;
- })(exceptions_1.WrappedException);
- var AppProtoViewMergeInfo = (function () {
- function AppProtoViewMergeInfo(embeddedViewCount, elementCount, viewCount) {
- this.embeddedViewCount = embeddedViewCount;
- this.elementCount = elementCount;
- this.viewCount = viewCount;
- }
- return AppProtoViewMergeInfo;
- })();
- exports.AppProtoViewMergeInfo = AppProtoViewMergeInfo;
- /**
- *
- */
- var AppProtoView = (function () {
- function AppProtoView(templateId, templateCmds, type, isMergable, changeDetectorFactory, templateVariableBindings, pipes) {
- this.templateId = templateId;
- this.templateCmds = templateCmds;
- this.type = type;
- this.isMergable = isMergable;
- this.changeDetectorFactory = changeDetectorFactory;
- this.templateVariableBindings = templateVariableBindings;
- this.pipes = pipes;
- this.elementBinders = null;
- this.mergeInfo = null;
- this.variableLocations = null;
- this.textBindingCount = null;
- this.render = null;
- this.ref = new view_ref_2.ProtoViewRef_(this);
- }
- AppProtoView.prototype.init = function (render, elementBinders, textBindingCount, mergeInfo, variableLocations) {
- var _this = this;
- this.render = render;
- this.elementBinders = elementBinders;
- this.textBindingCount = textBindingCount;
- this.mergeInfo = mergeInfo;
- this.variableLocations = variableLocations;
- this.protoLocals = new collection_1.Map();
- if (lang_1.isPresent(this.templateVariableBindings)) {
- this.templateVariableBindings.forEach(function (templateName, _) { _this.protoLocals.set(templateName, null); });
- }
- if (lang_1.isPresent(variableLocations)) {
- // The view's locals needs to have a full set of variable names at construction time
- // in order to prevent new variables from being set later in the lifecycle. Since we don't
- // want
- // to actually create variable bindings for the $implicit bindings, add to the
- // protoLocals manually.
- variableLocations.forEach(function (_, templateName) { _this.protoLocals.set(templateName, null); });
- }
- };
- AppProtoView.prototype.isInitialized = function () { return lang_1.isPresent(this.elementBinders); };
- return AppProtoView;
- })();
- exports.AppProtoView = AppProtoView;
- /***/ },
- /* 77 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- // This is a workaround for privacy in Dart as we don't have library parts
- function internalView(viewRef) {
- return viewRef._view;
- }
- exports.internalView = internalView;
- // This is a workaround for privacy in Dart as we don't have library parts
- function internalProtoView(protoViewRef) {
- return lang_1.isPresent(protoViewRef) ? protoViewRef._protoView : null;
- }
- exports.internalProtoView = internalProtoView;
- /**
- * Represents an Angular View.
- *
- * <!-- TODO: move the next two paragraphs to the dev guide -->
- * A View is a fundamental building block of the application UI. It is the smallest grouping of
- * Elements which are created and destroyed together.
- *
- * Properties of elements in a View can change, but the structure (number and order) of elements in
- * a View cannot. Changing the structure of Elements can only be done by inserting, moving or
- * removing nested Views via a {@link ViewContainerRef}. Each View can contain many View Containers.
- * <!-- /TODO -->
- *
- * ### Example
- *
- * Given this template...
- *
- * ```
- * Count: {{items.length}}
- * <ul>
- * <li *ngFor="var item of items">{{item}}</li>
- * </ul>
- * ```
- *
- * ... we have two {@link ProtoViewRef}s:
- *
- * Outer {@link ProtoViewRef}:
- * ```
- * Count: {{items.length}}
- * <ul>
- * <template ngFor var-item [ngForOf]="items"></template>
- * </ul>
- * ```
- *
- * Inner {@link ProtoViewRef}:
- * ```
- * <li>{{item}}</li>
- * ```
- *
- * Notice that the original template is broken down into two separate {@link ProtoViewRef}s.
- *
- * The outer/inner {@link ProtoViewRef}s are then assembled into views like so:
- *
- * ```
- * <!-- ViewRef: outer-0 -->
- * Count: 2
- * <ul>
- * <template view-container-ref></template>
- * <!-- ViewRef: inner-1 --><li>first</li><!-- /ViewRef: inner-1 -->
- * <!-- ViewRef: inner-2 --><li>second</li><!-- /ViewRef: inner-2 -->
- * </ul>
- * <!-- /ViewRef: outer-0 -->
- * ```
- */
- var ViewRef = (function () {
- function ViewRef() {
- }
- Object.defineProperty(ViewRef.prototype, "changeDetectorRef", {
- get: function () { return exceptions_1.unimplemented(); },
- set: function (value) {
- exceptions_1.unimplemented(); // TODO: https://github.com/Microsoft/TypeScript/issues/12
- },
- enumerable: true,
- configurable: true
- });
- return ViewRef;
- })();
- exports.ViewRef = ViewRef;
- var ViewRef_ = (function (_super) {
- __extends(ViewRef_, _super);
- function ViewRef_(_view) {
- _super.call(this);
- this._changeDetectorRef = null;
- this._view = _view;
- }
- Object.defineProperty(ViewRef_.prototype, "render", {
- /**
- * Return `RenderViewRef`
- */
- get: function () { return this._view.render; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(ViewRef_.prototype, "renderFragment", {
- /**
- * Return `RenderFragmentRef`
- */
- get: function () { return this._view.renderFragment; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(ViewRef_.prototype, "changeDetectorRef", {
- /**
- * Return `ChangeDetectorRef`
- */
- get: function () {
- if (this._changeDetectorRef === null) {
- this._changeDetectorRef = this._view.changeDetector.ref;
- }
- return this._changeDetectorRef;
- },
- enumerable: true,
- configurable: true
- });
- ViewRef_.prototype.setLocal = function (variableName, value) { this._view.setLocal(variableName, value); };
- return ViewRef_;
- })(ViewRef);
- exports.ViewRef_ = ViewRef_;
- /**
- * Represents an Angular ProtoView.
- *
- * A ProtoView is a prototypical {@link ViewRef View} that is the result of Template compilation and
- * is used by Angular to efficiently create an instance of this View based on the compiled Template.
- *
- * Most ProtoViews are created and used internally by Angular and you don't need to know about them,
- * except in advanced use-cases where you compile components yourself via the low-level
- * {@link Compiler#compileInHost} API.
- *
- *
- * ### Example
- *
- * Given this template:
- *
- * ```
- * Count: {{items.length}}
- * <ul>
- * <li *ngFor="var item of items">{{item}}</li>
- * </ul>
- * ```
- *
- * Angular desugars and compiles the template into two ProtoViews:
- *
- * Outer ProtoView:
- * ```
- * Count: {{items.length}}
- * <ul>
- * <template ngFor var-item [ngForOf]="items"></template>
- * </ul>
- * ```
- *
- * Inner ProtoView:
- * ```
- * <li>{{item}}</li>
- * ```
- *
- * Notice that the original template is broken down into two separate ProtoViews.
- */
- var ProtoViewRef = (function () {
- function ProtoViewRef() {
- }
- return ProtoViewRef;
- })();
- exports.ProtoViewRef = ProtoViewRef;
- var ProtoViewRef_ = (function (_super) {
- __extends(ProtoViewRef_, _super);
- function ProtoViewRef_(_protoView) {
- _super.call(this);
- this._protoView = _protoView;
- }
- return ProtoViewRef_;
- })(ProtoViewRef);
- exports.ProtoViewRef_ = ProtoViewRef_;
- /***/ },
- /* 78 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var CAMEL_CASE_REGEXP = /([A-Z])/g;
- var DASH_CASE_REGEXP = /-([a-z])/g;
- function camelCaseToDashCase(input) {
- return lang_1.StringWrapper.replaceAllMapped(input, CAMEL_CASE_REGEXP, function (m) { return '-' + m[1].toLowerCase(); });
- }
- exports.camelCaseToDashCase = camelCaseToDashCase;
- function dashCaseToCamelCase(input) {
- return lang_1.StringWrapper.replaceAllMapped(input, DASH_CASE_REGEXP, function (m) { return m[1].toUpperCase(); });
- }
- exports.dashCaseToCamelCase = dashCaseToCamelCase;
- /***/ },
- /* 79 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var ElementBinder = (function () {
- function ElementBinder(index, parent, distanceToParent, protoElementInjector, componentDirective, nestedProtoView) {
- this.index = index;
- this.parent = parent;
- this.distanceToParent = distanceToParent;
- this.protoElementInjector = protoElementInjector;
- this.componentDirective = componentDirective;
- this.nestedProtoView = nestedProtoView;
- if (lang_1.isBlank(index)) {
- throw new exceptions_1.BaseException('null index not allowed.');
- }
- }
- return ElementBinder;
- })();
- exports.ElementBinder = ElementBinder;
- /***/ },
- /* 80 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var async_1 = __webpack_require__(60);
- var collection_1 = __webpack_require__(12);
- var di_1 = __webpack_require__(6);
- var injector_1 = __webpack_require__(11);
- var provider_1 = __webpack_require__(13);
- var di_2 = __webpack_require__(4);
- /* circular */ var avmModule = __webpack_require__(81);
- var view_container_ref_1 = __webpack_require__(87);
- var element_ref_1 = __webpack_require__(83);
- var template_ref_1 = __webpack_require__(84);
- var directives_1 = __webpack_require__(23);
- var directive_lifecycle_reflector_1 = __webpack_require__(88);
- var change_detection_1 = __webpack_require__(25);
- var query_list_1 = __webpack_require__(90);
- var reflection_1 = __webpack_require__(16);
- var event_config_1 = __webpack_require__(91);
- var pipe_provider_1 = __webpack_require__(73);
- var interfaces_1 = __webpack_require__(89);
- var view_container_ref_2 = __webpack_require__(87);
- var _staticKeys;
- var StaticKeys = (function () {
- function StaticKeys() {
- this.viewManagerId = di_1.Key.get(avmModule.AppViewManager).id;
- this.templateRefId = di_1.Key.get(template_ref_1.TemplateRef).id;
- this.viewContainerId = di_1.Key.get(view_container_ref_1.ViewContainerRef).id;
- this.changeDetectorRefId = di_1.Key.get(change_detection_1.ChangeDetectorRef).id;
- this.elementRefId = di_1.Key.get(element_ref_1.ElementRef).id;
- }
- StaticKeys.instance = function () {
- if (lang_1.isBlank(_staticKeys))
- _staticKeys = new StaticKeys();
- return _staticKeys;
- };
- return StaticKeys;
- })();
- exports.StaticKeys = StaticKeys;
- var TreeNode = (function () {
- function TreeNode(parent) {
- if (lang_1.isPresent(parent)) {
- parent.addChild(this);
- }
- else {
- this._parent = null;
- }
- }
- TreeNode.prototype.addChild = function (child) { child._parent = this; };
- TreeNode.prototype.remove = function () { this._parent = null; };
- Object.defineProperty(TreeNode.prototype, "parent", {
- get: function () { return this._parent; },
- enumerable: true,
- configurable: true
- });
- return TreeNode;
- })();
- exports.TreeNode = TreeNode;
- var DirectiveDependency = (function (_super) {
- __extends(DirectiveDependency, _super);
- function DirectiveDependency(key, optional, lowerBoundVisibility, upperBoundVisibility, properties, attributeName, queryDecorator) {
- _super.call(this, key, optional, lowerBoundVisibility, upperBoundVisibility, properties);
- this.attributeName = attributeName;
- this.queryDecorator = queryDecorator;
- this._verify();
- }
- /** @internal */
- DirectiveDependency.prototype._verify = function () {
- var count = 0;
- if (lang_1.isPresent(this.queryDecorator))
- count++;
- if (lang_1.isPresent(this.attributeName))
- count++;
- if (count > 1)
- throw new exceptions_1.BaseException('A directive injectable can contain only one of the following @Attribute or @Query.');
- };
- DirectiveDependency.createFrom = function (d) {
- return new DirectiveDependency(d.key, d.optional, d.lowerBoundVisibility, d.upperBoundVisibility, d.properties, DirectiveDependency._attributeName(d.properties), DirectiveDependency._query(d.properties));
- };
- /** @internal */
- DirectiveDependency._attributeName = function (properties) {
- var p = properties.find(function (p) { return p instanceof di_2.AttributeMetadata; });
- return lang_1.isPresent(p) ? p.attributeName : null;
- };
- /** @internal */
- DirectiveDependency._query = function (properties) {
- return properties.find(function (p) { return p instanceof di_2.QueryMetadata; });
- };
- return DirectiveDependency;
- })(di_1.Dependency);
- exports.DirectiveDependency = DirectiveDependency;
- var DirectiveProvider = (function (_super) {
- __extends(DirectiveProvider, _super);
- function DirectiveProvider(key, factory, deps, metadata, providers, viewProviders) {
- _super.call(this, key, [new provider_1.ResolvedFactory(factory, deps)], false);
- this.metadata = metadata;
- this.providers = providers;
- this.viewProviders = viewProviders;
- this.callOnDestroy = directive_lifecycle_reflector_1.hasLifecycleHook(interfaces_1.LifecycleHooks.OnDestroy, key.token);
- }
- Object.defineProperty(DirectiveProvider.prototype, "displayName", {
- get: function () { return this.key.displayName; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(DirectiveProvider.prototype, "queries", {
- get: function () {
- if (lang_1.isBlank(this.metadata.queries))
- return [];
- var res = [];
- collection_1.StringMapWrapper.forEach(this.metadata.queries, function (meta, fieldName) {
- var setter = reflection_1.reflector.setter(fieldName);
- res.push(new QueryMetadataWithSetter(setter, meta));
- });
- return res;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(DirectiveProvider.prototype, "eventEmitters", {
- get: function () {
- return lang_1.isPresent(this.metadata) && lang_1.isPresent(this.metadata.outputs) ? this.metadata.outputs :
- [];
- },
- enumerable: true,
- configurable: true
- });
- DirectiveProvider.createFromProvider = function (provider, meta) {
- if (lang_1.isBlank(meta)) {
- meta = new directives_1.DirectiveMetadata();
- }
- var rb = provider_1.resolveProvider(provider);
- var rf = rb.resolvedFactories[0];
- var deps = rf.dependencies.map(DirectiveDependency.createFrom);
- var providers = lang_1.isPresent(meta.providers) ? meta.providers : [];
- var viewBindigs = meta instanceof directives_1.ComponentMetadata && lang_1.isPresent(meta.viewProviders) ?
- meta.viewProviders :
- [];
- return new DirectiveProvider(rb.key, rf.factory, deps, meta, providers, viewBindigs);
- };
- DirectiveProvider.createFromType = function (type, annotation) {
- var provider = new di_1.Provider(type, { useClass: type });
- return DirectiveProvider.createFromProvider(provider, annotation);
- };
- return DirectiveProvider;
- })(provider_1.ResolvedProvider_);
- exports.DirectiveProvider = DirectiveProvider;
- // TODO(rado): benchmark and consider rolling in as ElementInjector fields.
- var PreBuiltObjects = (function () {
- function PreBuiltObjects(viewManager, view, elementRef, templateRef) {
- this.viewManager = viewManager;
- this.view = view;
- this.elementRef = elementRef;
- this.templateRef = templateRef;
- this.nestedView = null;
- }
- return PreBuiltObjects;
- })();
- exports.PreBuiltObjects = PreBuiltObjects;
- var QueryMetadataWithSetter = (function () {
- function QueryMetadataWithSetter(setter, metadata) {
- this.setter = setter;
- this.metadata = metadata;
- }
- return QueryMetadataWithSetter;
- })();
- exports.QueryMetadataWithSetter = QueryMetadataWithSetter;
- var EventEmitterAccessor = (function () {
- function EventEmitterAccessor(eventName, getter) {
- this.eventName = eventName;
- this.getter = getter;
- }
- EventEmitterAccessor.prototype.subscribe = function (view, boundElementIndex, directive) {
- var _this = this;
- var eventEmitter = this.getter(directive);
- return async_1.ObservableWrapper.subscribe(eventEmitter, function (eventObj) { return view.triggerEventHandlers(_this.eventName, eventObj, boundElementIndex); });
- };
- return EventEmitterAccessor;
- })();
- exports.EventEmitterAccessor = EventEmitterAccessor;
- function _createEventEmitterAccessors(bwv) {
- var provider = bwv.provider;
- if (!(provider instanceof DirectiveProvider))
- return [];
- var db = provider;
- return db.eventEmitters.map(function (eventConfig) {
- var parsedEvent = event_config_1.EventConfig.parse(eventConfig);
- return new EventEmitterAccessor(parsedEvent.eventName, reflection_1.reflector.getter(parsedEvent.fieldName));
- });
- }
- function _createProtoQueryRefs(providers) {
- var res = [];
- collection_1.ListWrapper.forEachWithIndex(providers, function (b, i) {
- if (b.provider instanceof DirectiveProvider) {
- var directiveProvider = b.provider;
- // field queries
- var queries = directiveProvider.queries;
- queries.forEach(function (q) { return res.push(new ProtoQueryRef(i, q.setter, q.metadata)); });
- // queries passed into the constructor.
- // TODO: remove this after constructor queries are no longer supported
- var deps = directiveProvider.resolvedFactory.dependencies;
- deps.forEach(function (d) {
- if (lang_1.isPresent(d.queryDecorator))
- res.push(new ProtoQueryRef(i, null, d.queryDecorator));
- });
- }
- });
- return res;
- }
- var ProtoElementInjector = (function () {
- function ProtoElementInjector(parent, index, bwv, distanceToParent, _firstProviderIsComponent, directiveVariableBindings) {
- this.parent = parent;
- this.index = index;
- this.distanceToParent = distanceToParent;
- this.directiveVariableBindings = directiveVariableBindings;
- this._firstProviderIsComponent = _firstProviderIsComponent;
- var length = bwv.length;
- this.protoInjector = new injector_1.ProtoInjector(bwv);
- this.eventEmitterAccessors = collection_1.ListWrapper.createFixedSize(length);
- for (var i = 0; i < length; ++i) {
- this.eventEmitterAccessors[i] = _createEventEmitterAccessors(bwv[i]);
- }
- this.protoQueryRefs = _createProtoQueryRefs(bwv);
- }
- ProtoElementInjector.create = function (parent, index, providers, firstProviderIsComponent, distanceToParent, directiveVariableBindings) {
- var bd = [];
- ProtoElementInjector._createDirectiveProviderWithVisibility(providers, bd, firstProviderIsComponent);
- if (firstProviderIsComponent) {
- ProtoElementInjector._createViewProvidersWithVisibility(providers, bd);
- }
- ProtoElementInjector._createProvidersWithVisibility(providers, bd);
- return new ProtoElementInjector(parent, index, bd, distanceToParent, firstProviderIsComponent, directiveVariableBindings);
- };
- ProtoElementInjector._createDirectiveProviderWithVisibility = function (dirProviders, bd, firstProviderIsComponent) {
- dirProviders.forEach(function (dirProvider) {
- bd.push(ProtoElementInjector._createProviderWithVisibility(firstProviderIsComponent, dirProvider, dirProviders, dirProvider));
- });
- };
- ProtoElementInjector._createProvidersWithVisibility = function (dirProviders, bd) {
- var providersFromAllDirectives = [];
- dirProviders.forEach(function (dirProvider) {
- providersFromAllDirectives =
- collection_1.ListWrapper.concat(providersFromAllDirectives, dirProvider.providers);
- });
- var resolved = di_1.Injector.resolve(providersFromAllDirectives);
- resolved.forEach(function (b) { return bd.push(new injector_1.ProviderWithVisibility(b, injector_1.Visibility.Public)); });
- };
- ProtoElementInjector._createProviderWithVisibility = function (firstProviderIsComponent, dirProvider, dirProviders, provider) {
- var isComponent = firstProviderIsComponent && dirProviders[0] === dirProvider;
- return new injector_1.ProviderWithVisibility(provider, isComponent ? injector_1.Visibility.PublicAndPrivate : injector_1.Visibility.Public);
- };
- ProtoElementInjector._createViewProvidersWithVisibility = function (dirProviders, bd) {
- var resolvedViewProviders = di_1.Injector.resolve(dirProviders[0].viewProviders);
- resolvedViewProviders.forEach(function (b) { return bd.push(new injector_1.ProviderWithVisibility(b, injector_1.Visibility.Private)); });
- };
- ProtoElementInjector.prototype.instantiate = function (parent) {
- return new ElementInjector(this, parent);
- };
- ProtoElementInjector.prototype.directParent = function () { return this.distanceToParent < 2 ? this.parent : null; };
- Object.defineProperty(ProtoElementInjector.prototype, "hasBindings", {
- get: function () { return this.eventEmitterAccessors.length > 0; },
- enumerable: true,
- configurable: true
- });
- ProtoElementInjector.prototype.getProviderAtIndex = function (index) { return this.protoInjector.getProviderAtIndex(index); };
- return ProtoElementInjector;
- })();
- exports.ProtoElementInjector = ProtoElementInjector;
- var _Context = (function () {
- function _Context(element, componentElement, injector) {
- this.element = element;
- this.componentElement = componentElement;
- this.injector = injector;
- }
- return _Context;
- })();
- var ElementInjector = (function (_super) {
- __extends(ElementInjector, _super);
- function ElementInjector(_proto, parent) {
- var _this = this;
- _super.call(this, parent);
- this._preBuiltObjects = null;
- this._proto = _proto;
- this._injector =
- new di_1.Injector(this._proto.protoInjector, null, this, function () { return _this._debugContext(); });
- // we couple ourselves to the injector strategy to avoid polymoprhic calls
- var injectorStrategy = this._injector.internalStrategy;
- this._strategy = injectorStrategy instanceof injector_1.InjectorInlineStrategy ?
- new ElementInjectorInlineStrategy(injectorStrategy, this) :
- new ElementInjectorDynamicStrategy(injectorStrategy, this);
- this.hydrated = false;
- this._queryStrategy = this._buildQueryStrategy();
- }
- ElementInjector.prototype.dehydrate = function () {
- this.hydrated = false;
- this._host = null;
- this._preBuiltObjects = null;
- this._strategy.callOnDestroy();
- this._strategy.dehydrate();
- this._queryStrategy.dehydrate();
- };
- ElementInjector.prototype.hydrate = function (imperativelyCreatedInjector, host, preBuiltObjects) {
- this._host = host;
- this._preBuiltObjects = preBuiltObjects;
- this._reattachInjectors(imperativelyCreatedInjector);
- this._queryStrategy.hydrate();
- this._strategy.hydrate();
- this.hydrated = true;
- };
- ElementInjector.prototype._debugContext = function () {
- var p = this._preBuiltObjects;
- var index = p.elementRef.boundElementIndex - p.view.elementOffset;
- var c = this._preBuiltObjects.view.getDebugContext(index, null);
- return lang_1.isPresent(c) ? new _Context(c.element, c.componentElement, c.injector) : null;
- };
- ElementInjector.prototype._reattachInjectors = function (imperativelyCreatedInjector) {
- // Dynamically-loaded component in the template. Not a root ElementInjector.
- if (lang_1.isPresent(this._parent)) {
- if (lang_1.isPresent(imperativelyCreatedInjector)) {
- // The imperative injector is similar to having an element between
- // the dynamic-loaded component and its parent => no boundaries.
- this._reattachInjector(this._injector, imperativelyCreatedInjector, false);
- this._reattachInjector(imperativelyCreatedInjector, this._parent._injector, false);
- }
- else {
- this._reattachInjector(this._injector, this._parent._injector, false);
- }
- }
- else if (lang_1.isPresent(this._host)) {
- // The imperative injector is similar to having an element between
- // the dynamic-loaded component and its parent => no boundary between
- // the component and imperativelyCreatedInjector.
- // But since it is a root ElementInjector, we need to create a boundary
- // between imperativelyCreatedInjector and _host.
- if (lang_1.isPresent(imperativelyCreatedInjector)) {
- this._reattachInjector(this._injector, imperativelyCreatedInjector, false);
- this._reattachInjector(imperativelyCreatedInjector, this._host._injector, true);
- }
- else {
- this._reattachInjector(this._injector, this._host._injector, true);
- }
- }
- else {
- if (lang_1.isPresent(imperativelyCreatedInjector)) {
- this._reattachInjector(this._injector, imperativelyCreatedInjector, true);
- }
- }
- };
- ElementInjector.prototype._reattachInjector = function (injector, parentInjector, isBoundary) {
- injector.internalStrategy.attach(parentInjector, isBoundary);
- };
- ElementInjector.prototype.hasVariableBinding = function (name) {
- var vb = this._proto.directiveVariableBindings;
- return lang_1.isPresent(vb) && vb.has(name);
- };
- ElementInjector.prototype.getVariableBinding = function (name) {
- var index = this._proto.directiveVariableBindings.get(name);
- return lang_1.isPresent(index) ? this.getDirectiveAtIndex(index) : this.getElementRef();
- };
- ElementInjector.prototype.get = function (token) { return this._injector.get(token); };
- ElementInjector.prototype.hasDirective = function (type) { return lang_1.isPresent(this._injector.getOptional(type)); };
- ElementInjector.prototype.getEventEmitterAccessors = function () { return this._proto.eventEmitterAccessors; };
- ElementInjector.prototype.getDirectiveVariableBindings = function () {
- return this._proto.directiveVariableBindings;
- };
- ElementInjector.prototype.getComponent = function () { return this._strategy.getComponent(); };
- ElementInjector.prototype.getInjector = function () { return this._injector; };
- ElementInjector.prototype.getElementRef = function () { return this._preBuiltObjects.elementRef; };
- ElementInjector.prototype.getViewContainerRef = function () {
- return new view_container_ref_2.ViewContainerRef_(this._preBuiltObjects.viewManager, this.getElementRef());
- };
- ElementInjector.prototype.getNestedView = function () { return this._preBuiltObjects.nestedView; };
- ElementInjector.prototype.getView = function () { return this._preBuiltObjects.view; };
- ElementInjector.prototype.directParent = function () { return this._proto.distanceToParent < 2 ? this.parent : null; };
- ElementInjector.prototype.isComponentKey = function (key) { return this._strategy.isComponentKey(key); };
- ElementInjector.prototype.getDependency = function (injector, provider, dep) {
- var key = dep.key;
- if (provider instanceof DirectiveProvider) {
- var dirDep = dep;
- var dirProvider = provider;
- var staticKeys = StaticKeys.instance();
- if (key.id === staticKeys.viewManagerId)
- return this._preBuiltObjects.viewManager;
- if (lang_1.isPresent(dirDep.attributeName))
- return this._buildAttribute(dirDep);
- if (lang_1.isPresent(dirDep.queryDecorator))
- return this._queryStrategy.findQuery(dirDep.queryDecorator).list;
- if (dirDep.key.id === StaticKeys.instance().changeDetectorRefId) {
- // We provide the component's view change detector to components and
- // the surrounding component's change detector to directives.
- if (dirProvider.metadata instanceof directives_1.ComponentMetadata) {
- var componentView = this._preBuiltObjects.view.getNestedView(this._preBuiltObjects.elementRef.boundElementIndex);
- return componentView.changeDetector.ref;
- }
- else {
- return this._preBuiltObjects.view.changeDetector.ref;
- }
- }
- if (dirDep.key.id === StaticKeys.instance().elementRefId) {
- return this.getElementRef();
- }
- if (dirDep.key.id === StaticKeys.instance().viewContainerId) {
- return this.getViewContainerRef();
- }
- if (dirDep.key.id === StaticKeys.instance().templateRefId) {
- if (lang_1.isBlank(this._preBuiltObjects.templateRef)) {
- if (dirDep.optional) {
- return null;
- }
- throw new di_1.NoProviderError(null, dirDep.key);
- }
- return this._preBuiltObjects.templateRef;
- }
- }
- else if (provider instanceof pipe_provider_1.PipeProvider) {
- if (dep.key.id === StaticKeys.instance().changeDetectorRefId) {
- var componentView = this._preBuiltObjects.view.getNestedView(this._preBuiltObjects.elementRef.boundElementIndex);
- return componentView.changeDetector.ref;
- }
- }
- return injector_1.UNDEFINED;
- };
- ElementInjector.prototype._buildAttribute = function (dep) {
- var attributes = this._proto.attributes;
- if (lang_1.isPresent(attributes) && attributes.has(dep.attributeName)) {
- return attributes.get(dep.attributeName);
- }
- else {
- return null;
- }
- };
- ElementInjector.prototype.addDirectivesMatchingQuery = function (query, list) {
- var templateRef = lang_1.isBlank(this._preBuiltObjects) ? null : this._preBuiltObjects.templateRef;
- if (query.selector === template_ref_1.TemplateRef && lang_1.isPresent(templateRef)) {
- list.push(templateRef);
- }
- this._strategy.addDirectivesMatchingQuery(query, list);
- };
- ElementInjector.prototype._buildQueryStrategy = function () {
- if (this._proto.protoQueryRefs.length === 0) {
- return _emptyQueryStrategy;
- }
- else if (this._proto.protoQueryRefs.length <=
- InlineQueryStrategy.NUMBER_OF_SUPPORTED_QUERIES) {
- return new InlineQueryStrategy(this);
- }
- else {
- return new DynamicQueryStrategy(this);
- }
- };
- ElementInjector.prototype.link = function (parent) { parent.addChild(this); };
- ElementInjector.prototype.unlink = function () { this.remove(); };
- ElementInjector.prototype.getDirectiveAtIndex = function (index) { return this._injector.getAt(index); };
- ElementInjector.prototype.hasInstances = function () { return this._proto.hasBindings && this.hydrated; };
- ElementInjector.prototype.getHost = function () { return this._host; };
- ElementInjector.prototype.getBoundElementIndex = function () { return this._proto.index; };
- ElementInjector.prototype.getRootViewInjectors = function () {
- if (!this.hydrated)
- return [];
- var view = this._preBuiltObjects.view;
- var nestedView = view.getNestedView(view.elementOffset + this.getBoundElementIndex());
- return lang_1.isPresent(nestedView) ? nestedView.rootElementInjectors : [];
- };
- ElementInjector.prototype.ngAfterViewChecked = function () { this._queryStrategy.updateViewQueries(); };
- ElementInjector.prototype.ngAfterContentChecked = function () { this._queryStrategy.updateContentQueries(); };
- ElementInjector.prototype.traverseAndSetQueriesAsDirty = function () {
- var inj = this;
- while (lang_1.isPresent(inj)) {
- inj._setQueriesAsDirty();
- inj = inj.parent;
- }
- };
- ElementInjector.prototype._setQueriesAsDirty = function () {
- this._queryStrategy.setContentQueriesAsDirty();
- if (lang_1.isPresent(this._host))
- this._host._queryStrategy.setViewQueriesAsDirty();
- };
- return ElementInjector;
- })(TreeNode);
- exports.ElementInjector = ElementInjector;
- var _EmptyQueryStrategy = (function () {
- function _EmptyQueryStrategy() {
- }
- _EmptyQueryStrategy.prototype.setContentQueriesAsDirty = function () { };
- _EmptyQueryStrategy.prototype.setViewQueriesAsDirty = function () { };
- _EmptyQueryStrategy.prototype.hydrate = function () { };
- _EmptyQueryStrategy.prototype.dehydrate = function () { };
- _EmptyQueryStrategy.prototype.updateContentQueries = function () { };
- _EmptyQueryStrategy.prototype.updateViewQueries = function () { };
- _EmptyQueryStrategy.prototype.findQuery = function (query) {
- throw new exceptions_1.BaseException("Cannot find query for directive " + query + ".");
- };
- return _EmptyQueryStrategy;
- })();
- var _emptyQueryStrategy = new _EmptyQueryStrategy();
- var InlineQueryStrategy = (function () {
- function InlineQueryStrategy(ei) {
- var protoRefs = ei._proto.protoQueryRefs;
- if (protoRefs.length > 0)
- this.query0 = new QueryRef(protoRefs[0], ei);
- if (protoRefs.length > 1)
- this.query1 = new QueryRef(protoRefs[1], ei);
- if (protoRefs.length > 2)
- this.query2 = new QueryRef(protoRefs[2], ei);
- }
- InlineQueryStrategy.prototype.setContentQueriesAsDirty = function () {
- if (lang_1.isPresent(this.query0) && !this.query0.isViewQuery)
- this.query0.dirty = true;
- if (lang_1.isPresent(this.query1) && !this.query1.isViewQuery)
- this.query1.dirty = true;
- if (lang_1.isPresent(this.query2) && !this.query2.isViewQuery)
- this.query2.dirty = true;
- };
- InlineQueryStrategy.prototype.setViewQueriesAsDirty = function () {
- if (lang_1.isPresent(this.query0) && this.query0.isViewQuery)
- this.query0.dirty = true;
- if (lang_1.isPresent(this.query1) && this.query1.isViewQuery)
- this.query1.dirty = true;
- if (lang_1.isPresent(this.query2) && this.query2.isViewQuery)
- this.query2.dirty = true;
- };
- InlineQueryStrategy.prototype.hydrate = function () {
- if (lang_1.isPresent(this.query0))
- this.query0.hydrate();
- if (lang_1.isPresent(this.query1))
- this.query1.hydrate();
- if (lang_1.isPresent(this.query2))
- this.query2.hydrate();
- };
- InlineQueryStrategy.prototype.dehydrate = function () {
- if (lang_1.isPresent(this.query0))
- this.query0.dehydrate();
- if (lang_1.isPresent(this.query1))
- this.query1.dehydrate();
- if (lang_1.isPresent(this.query2))
- this.query2.dehydrate();
- };
- InlineQueryStrategy.prototype.updateContentQueries = function () {
- if (lang_1.isPresent(this.query0) && !this.query0.isViewQuery) {
- this.query0.update();
- }
- if (lang_1.isPresent(this.query1) && !this.query1.isViewQuery) {
- this.query1.update();
- }
- if (lang_1.isPresent(this.query2) && !this.query2.isViewQuery) {
- this.query2.update();
- }
- };
- InlineQueryStrategy.prototype.updateViewQueries = function () {
- if (lang_1.isPresent(this.query0) && this.query0.isViewQuery) {
- this.query0.update();
- }
- if (lang_1.isPresent(this.query1) && this.query1.isViewQuery) {
- this.query1.update();
- }
- if (lang_1.isPresent(this.query2) && this.query2.isViewQuery) {
- this.query2.update();
- }
- };
- InlineQueryStrategy.prototype.findQuery = function (query) {
- if (lang_1.isPresent(this.query0) && this.query0.protoQueryRef.query === query) {
- return this.query0;
- }
- if (lang_1.isPresent(this.query1) && this.query1.protoQueryRef.query === query) {
- return this.query1;
- }
- if (lang_1.isPresent(this.query2) && this.query2.protoQueryRef.query === query) {
- return this.query2;
- }
- throw new exceptions_1.BaseException("Cannot find query for directive " + query + ".");
- };
- InlineQueryStrategy.NUMBER_OF_SUPPORTED_QUERIES = 3;
- return InlineQueryStrategy;
- })();
- var DynamicQueryStrategy = (function () {
- function DynamicQueryStrategy(ei) {
- this.queries = ei._proto.protoQueryRefs.map(function (p) { return new QueryRef(p, ei); });
- }
- DynamicQueryStrategy.prototype.setContentQueriesAsDirty = function () {
- for (var i = 0; i < this.queries.length; ++i) {
- var q = this.queries[i];
- if (!q.isViewQuery)
- q.dirty = true;
- }
- };
- DynamicQueryStrategy.prototype.setViewQueriesAsDirty = function () {
- for (var i = 0; i < this.queries.length; ++i) {
- var q = this.queries[i];
- if (q.isViewQuery)
- q.dirty = true;
- }
- };
- DynamicQueryStrategy.prototype.hydrate = function () {
- for (var i = 0; i < this.queries.length; ++i) {
- var q = this.queries[i];
- q.hydrate();
- }
- };
- DynamicQueryStrategy.prototype.dehydrate = function () {
- for (var i = 0; i < this.queries.length; ++i) {
- var q = this.queries[i];
- q.dehydrate();
- }
- };
- DynamicQueryStrategy.prototype.updateContentQueries = function () {
- for (var i = 0; i < this.queries.length; ++i) {
- var q = this.queries[i];
- if (!q.isViewQuery) {
- q.update();
- }
- }
- };
- DynamicQueryStrategy.prototype.updateViewQueries = function () {
- for (var i = 0; i < this.queries.length; ++i) {
- var q = this.queries[i];
- if (q.isViewQuery) {
- q.update();
- }
- }
- };
- DynamicQueryStrategy.prototype.findQuery = function (query) {
- for (var i = 0; i < this.queries.length; ++i) {
- var q = this.queries[i];
- if (q.protoQueryRef.query === query) {
- return q;
- }
- }
- throw new exceptions_1.BaseException("Cannot find query for directive " + query + ".");
- };
- return DynamicQueryStrategy;
- })();
- /**
- * Strategy used by the `ElementInjector` when the number of providers is 10 or less.
- * In such a case, inlining fields is beneficial for performances.
- */
- var ElementInjectorInlineStrategy = (function () {
- function ElementInjectorInlineStrategy(injectorStrategy, _ei) {
- this.injectorStrategy = injectorStrategy;
- this._ei = _ei;
- }
- ElementInjectorInlineStrategy.prototype.hydrate = function () {
- var i = this.injectorStrategy;
- var p = i.protoStrategy;
- i.resetConstructionCounter();
- if (p.provider0 instanceof DirectiveProvider && lang_1.isPresent(p.keyId0) && i.obj0 === injector_1.UNDEFINED)
- i.obj0 = i.instantiateProvider(p.provider0, p.visibility0);
- if (p.provider1 instanceof DirectiveProvider && lang_1.isPresent(p.keyId1) && i.obj1 === injector_1.UNDEFINED)
- i.obj1 = i.instantiateProvider(p.provider1, p.visibility1);
- if (p.provider2 instanceof DirectiveProvider && lang_1.isPresent(p.keyId2) && i.obj2 === injector_1.UNDEFINED)
- i.obj2 = i.instantiateProvider(p.provider2, p.visibility2);
- if (p.provider3 instanceof DirectiveProvider && lang_1.isPresent(p.keyId3) && i.obj3 === injector_1.UNDEFINED)
- i.obj3 = i.instantiateProvider(p.provider3, p.visibility3);
- if (p.provider4 instanceof DirectiveProvider && lang_1.isPresent(p.keyId4) && i.obj4 === injector_1.UNDEFINED)
- i.obj4 = i.instantiateProvider(p.provider4, p.visibility4);
- if (p.provider5 instanceof DirectiveProvider && lang_1.isPresent(p.keyId5) && i.obj5 === injector_1.UNDEFINED)
- i.obj5 = i.instantiateProvider(p.provider5, p.visibility5);
- if (p.provider6 instanceof DirectiveProvider && lang_1.isPresent(p.keyId6) && i.obj6 === injector_1.UNDEFINED)
- i.obj6 = i.instantiateProvider(p.provider6, p.visibility6);
- if (p.provider7 instanceof DirectiveProvider && lang_1.isPresent(p.keyId7) && i.obj7 === injector_1.UNDEFINED)
- i.obj7 = i.instantiateProvider(p.provider7, p.visibility7);
- if (p.provider8 instanceof DirectiveProvider && lang_1.isPresent(p.keyId8) && i.obj8 === injector_1.UNDEFINED)
- i.obj8 = i.instantiateProvider(p.provider8, p.visibility8);
- if (p.provider9 instanceof DirectiveProvider && lang_1.isPresent(p.keyId9) && i.obj9 === injector_1.UNDEFINED)
- i.obj9 = i.instantiateProvider(p.provider9, p.visibility9);
- };
- ElementInjectorInlineStrategy.prototype.dehydrate = function () {
- var i = this.injectorStrategy;
- i.obj0 = injector_1.UNDEFINED;
- i.obj1 = injector_1.UNDEFINED;
- i.obj2 = injector_1.UNDEFINED;
- i.obj3 = injector_1.UNDEFINED;
- i.obj4 = injector_1.UNDEFINED;
- i.obj5 = injector_1.UNDEFINED;
- i.obj6 = injector_1.UNDEFINED;
- i.obj7 = injector_1.UNDEFINED;
- i.obj8 = injector_1.UNDEFINED;
- i.obj9 = injector_1.UNDEFINED;
- };
- ElementInjectorInlineStrategy.prototype.callOnDestroy = function () {
- var i = this.injectorStrategy;
- var p = i.protoStrategy;
- if (p.provider0 instanceof DirectiveProvider &&
- p.provider0.callOnDestroy) {
- i.obj0.ngOnDestroy();
- }
- if (p.provider1 instanceof DirectiveProvider &&
- p.provider1.callOnDestroy) {
- i.obj1.ngOnDestroy();
- }
- if (p.provider2 instanceof DirectiveProvider &&
- p.provider2.callOnDestroy) {
- i.obj2.ngOnDestroy();
- }
- if (p.provider3 instanceof DirectiveProvider &&
- p.provider3.callOnDestroy) {
- i.obj3.ngOnDestroy();
- }
- if (p.provider4 instanceof DirectiveProvider &&
- p.provider4.callOnDestroy) {
- i.obj4.ngOnDestroy();
- }
- if (p.provider5 instanceof DirectiveProvider &&
- p.provider5.callOnDestroy) {
- i.obj5.ngOnDestroy();
- }
- if (p.provider6 instanceof DirectiveProvider &&
- p.provider6.callOnDestroy) {
- i.obj6.ngOnDestroy();
- }
- if (p.provider7 instanceof DirectiveProvider &&
- p.provider7.callOnDestroy) {
- i.obj7.ngOnDestroy();
- }
- if (p.provider8 instanceof DirectiveProvider &&
- p.provider8.callOnDestroy) {
- i.obj8.ngOnDestroy();
- }
- if (p.provider9 instanceof DirectiveProvider &&
- p.provider9.callOnDestroy) {
- i.obj9.ngOnDestroy();
- }
- };
- ElementInjectorInlineStrategy.prototype.getComponent = function () { return this.injectorStrategy.obj0; };
- ElementInjectorInlineStrategy.prototype.isComponentKey = function (key) {
- return this._ei._proto._firstProviderIsComponent && lang_1.isPresent(key) &&
- key.id === this.injectorStrategy.protoStrategy.keyId0;
- };
- ElementInjectorInlineStrategy.prototype.addDirectivesMatchingQuery = function (query, list) {
- var i = this.injectorStrategy;
- var p = i.protoStrategy;
- if (lang_1.isPresent(p.provider0) && p.provider0.key.token === query.selector) {
- if (i.obj0 === injector_1.UNDEFINED)
- i.obj0 = i.instantiateProvider(p.provider0, p.visibility0);
- list.push(i.obj0);
- }
- if (lang_1.isPresent(p.provider1) && p.provider1.key.token === query.selector) {
- if (i.obj1 === injector_1.UNDEFINED)
- i.obj1 = i.instantiateProvider(p.provider1, p.visibility1);
- list.push(i.obj1);
- }
- if (lang_1.isPresent(p.provider2) && p.provider2.key.token === query.selector) {
- if (i.obj2 === injector_1.UNDEFINED)
- i.obj2 = i.instantiateProvider(p.provider2, p.visibility2);
- list.push(i.obj2);
- }
- if (lang_1.isPresent(p.provider3) && p.provider3.key.token === query.selector) {
- if (i.obj3 === injector_1.UNDEFINED)
- i.obj3 = i.instantiateProvider(p.provider3, p.visibility3);
- list.push(i.obj3);
- }
- if (lang_1.isPresent(p.provider4) && p.provider4.key.token === query.selector) {
- if (i.obj4 === injector_1.UNDEFINED)
- i.obj4 = i.instantiateProvider(p.provider4, p.visibility4);
- list.push(i.obj4);
- }
- if (lang_1.isPresent(p.provider5) && p.provider5.key.token === query.selector) {
- if (i.obj5 === injector_1.UNDEFINED)
- i.obj5 = i.instantiateProvider(p.provider5, p.visibility5);
- list.push(i.obj5);
- }
- if (lang_1.isPresent(p.provider6) && p.provider6.key.token === query.selector) {
- if (i.obj6 === injector_1.UNDEFINED)
- i.obj6 = i.instantiateProvider(p.provider6, p.visibility6);
- list.push(i.obj6);
- }
- if (lang_1.isPresent(p.provider7) && p.provider7.key.token === query.selector) {
- if (i.obj7 === injector_1.UNDEFINED)
- i.obj7 = i.instantiateProvider(p.provider7, p.visibility7);
- list.push(i.obj7);
- }
- if (lang_1.isPresent(p.provider8) && p.provider8.key.token === query.selector) {
- if (i.obj8 === injector_1.UNDEFINED)
- i.obj8 = i.instantiateProvider(p.provider8, p.visibility8);
- list.push(i.obj8);
- }
- if (lang_1.isPresent(p.provider9) && p.provider9.key.token === query.selector) {
- if (i.obj9 === injector_1.UNDEFINED)
- i.obj9 = i.instantiateProvider(p.provider9, p.visibility9);
- list.push(i.obj9);
- }
- };
- return ElementInjectorInlineStrategy;
- })();
- /**
- * Strategy used by the `ElementInjector` when the number of bindings is 11 or more.
- * In such a case, there are too many fields to inline (see ElementInjectorInlineStrategy).
- */
- var ElementInjectorDynamicStrategy = (function () {
- function ElementInjectorDynamicStrategy(injectorStrategy, _ei) {
- this.injectorStrategy = injectorStrategy;
- this._ei = _ei;
- }
- ElementInjectorDynamicStrategy.prototype.hydrate = function () {
- var inj = this.injectorStrategy;
- var p = inj.protoStrategy;
- inj.resetConstructionCounter();
- for (var i = 0; i < p.keyIds.length; i++) {
- if (p.providers[i] instanceof DirectiveProvider && lang_1.isPresent(p.keyIds[i]) &&
- inj.objs[i] === injector_1.UNDEFINED) {
- inj.objs[i] = inj.instantiateProvider(p.providers[i], p.visibilities[i]);
- }
- }
- };
- ElementInjectorDynamicStrategy.prototype.dehydrate = function () {
- var inj = this.injectorStrategy;
- collection_1.ListWrapper.fill(inj.objs, injector_1.UNDEFINED);
- };
- ElementInjectorDynamicStrategy.prototype.callOnDestroy = function () {
- var ist = this.injectorStrategy;
- var p = ist.protoStrategy;
- for (var i = 0; i < p.providers.length; i++) {
- if (p.providers[i] instanceof DirectiveProvider &&
- p.providers[i].callOnDestroy) {
- ist.objs[i].ngOnDestroy();
- }
- }
- };
- ElementInjectorDynamicStrategy.prototype.getComponent = function () { return this.injectorStrategy.objs[0]; };
- ElementInjectorDynamicStrategy.prototype.isComponentKey = function (key) {
- var p = this.injectorStrategy.protoStrategy;
- return this._ei._proto._firstProviderIsComponent && lang_1.isPresent(key) && key.id === p.keyIds[0];
- };
- ElementInjectorDynamicStrategy.prototype.addDirectivesMatchingQuery = function (query, list) {
- var ist = this.injectorStrategy;
- var p = ist.protoStrategy;
- for (var i = 0; i < p.providers.length; i++) {
- if (p.providers[i].key.token === query.selector) {
- if (ist.objs[i] === injector_1.UNDEFINED) {
- ist.objs[i] = ist.instantiateProvider(p.providers[i], p.visibilities[i]);
- }
- list.push(ist.objs[i]);
- }
- }
- };
- return ElementInjectorDynamicStrategy;
- })();
- var ProtoQueryRef = (function () {
- function ProtoQueryRef(dirIndex, setter, query) {
- this.dirIndex = dirIndex;
- this.setter = setter;
- this.query = query;
- }
- Object.defineProperty(ProtoQueryRef.prototype, "usesPropertySyntax", {
- get: function () { return lang_1.isPresent(this.setter); },
- enumerable: true,
- configurable: true
- });
- return ProtoQueryRef;
- })();
- exports.ProtoQueryRef = ProtoQueryRef;
- var QueryRef = (function () {
- function QueryRef(protoQueryRef, originator) {
- this.protoQueryRef = protoQueryRef;
- this.originator = originator;
- }
- Object.defineProperty(QueryRef.prototype, "isViewQuery", {
- get: function () { return this.protoQueryRef.query.isViewQuery; },
- enumerable: true,
- configurable: true
- });
- QueryRef.prototype.update = function () {
- if (!this.dirty)
- return;
- this._update();
- this.dirty = false;
- // TODO delete the check once only field queries are supported
- if (this.protoQueryRef.usesPropertySyntax) {
- var dir = this.originator.getDirectiveAtIndex(this.protoQueryRef.dirIndex);
- if (this.protoQueryRef.query.first) {
- this.protoQueryRef.setter(dir, this.list.length > 0 ? this.list.first : null);
- }
- else {
- this.protoQueryRef.setter(dir, this.list);
- }
- }
- this.list.notifyOnChanges();
- };
- QueryRef.prototype._update = function () {
- var aggregator = [];
- if (this.protoQueryRef.query.isViewQuery) {
- var view = this.originator.getView();
- // intentionally skipping originator for view queries.
- var nestedView = view.getNestedView(view.elementOffset + this.originator.getBoundElementIndex());
- if (lang_1.isPresent(nestedView))
- this._visitView(nestedView, aggregator);
- }
- else {
- this._visit(this.originator, aggregator);
- }
- this.list.reset(aggregator);
- };
- ;
- QueryRef.prototype._visit = function (inj, aggregator) {
- var view = inj.getView();
- var startIdx = view.elementOffset + inj._proto.index;
- for (var i = startIdx; i < view.elementOffset + view.ownBindersCount; i++) {
- var curInj = view.elementInjectors[i];
- if (lang_1.isBlank(curInj))
- continue;
- // The first injector after inj, that is outside the subtree rooted at
- // inj has to have a null parent or a parent that is an ancestor of inj.
- if (i > startIdx && (lang_1.isBlank(curInj) || lang_1.isBlank(curInj.parent) ||
- view.elementOffset + curInj.parent._proto.index < startIdx)) {
- break;
- }
- if (!this.protoQueryRef.query.descendants &&
- !(curInj.parent == this.originator || curInj == this.originator))
- continue;
- // We visit the view container(VC) views right after the injector that contains
- // the VC. Theoretically, that might not be the right order if there are
- // child injectors of said injector. Not clear whether if such case can
- // even be constructed with the current apis.
- this._visitInjector(curInj, aggregator);
- var vc = view.viewContainers[i];
- if (lang_1.isPresent(vc))
- this._visitViewContainer(vc, aggregator);
- }
- };
- QueryRef.prototype._visitInjector = function (inj, aggregator) {
- if (this.protoQueryRef.query.isVarBindingQuery) {
- this._aggregateVariableBinding(inj, aggregator);
- }
- else {
- this._aggregateDirective(inj, aggregator);
- }
- };
- QueryRef.prototype._visitViewContainer = function (vc, aggregator) {
- for (var j = 0; j < vc.views.length; j++) {
- this._visitView(vc.views[j], aggregator);
- }
- };
- QueryRef.prototype._visitView = function (view, aggregator) {
- for (var i = view.elementOffset; i < view.elementOffset + view.ownBindersCount; i++) {
- var inj = view.elementInjectors[i];
- if (lang_1.isBlank(inj))
- continue;
- this._visitInjector(inj, aggregator);
- var vc = view.viewContainers[i];
- if (lang_1.isPresent(vc))
- this._visitViewContainer(vc, aggregator);
- }
- };
- QueryRef.prototype._aggregateVariableBinding = function (inj, aggregator) {
- var vb = this.protoQueryRef.query.varBindings;
- for (var i = 0; i < vb.length; ++i) {
- if (inj.hasVariableBinding(vb[i])) {
- aggregator.push(inj.getVariableBinding(vb[i]));
- }
- }
- };
- QueryRef.prototype._aggregateDirective = function (inj, aggregator) {
- inj.addDirectivesMatchingQuery(this.protoQueryRef.query, aggregator);
- };
- QueryRef.prototype.dehydrate = function () { this.list = null; };
- QueryRef.prototype.hydrate = function () {
- this.list = new query_list_1.QueryList();
- this.dirty = true;
- };
- return QueryRef;
- })();
- exports.QueryRef = QueryRef;
- /***/ },
- /* 81 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var __param = (this && this.__param) || function (paramIndex, decorator) {
- return function (target, key) { decorator(target, key, paramIndex); }
- };
- var di_1 = __webpack_require__(6);
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var viewModule = __webpack_require__(76);
- var view_ref_1 = __webpack_require__(77);
- var api_1 = __webpack_require__(72);
- var view_manager_utils_1 = __webpack_require__(82);
- var view_pool_1 = __webpack_require__(85);
- var view_listener_1 = __webpack_require__(86);
- var profile_1 = __webpack_require__(45);
- var proto_view_factory_1 = __webpack_require__(71);
- /**
- * Service exposing low level API for creating, moving and destroying Views.
- *
- * Most applications should use higher-level abstractions like {@link DynamicComponentLoader} and
- * {@link ViewContainerRef} instead.
- */
- var AppViewManager = (function () {
- function AppViewManager() {
- }
- /**
- * Returns the {@link ElementRef} that makes up the specified Host View.
- */
- AppViewManager.prototype.getHostElement = function (hostViewRef) {
- var hostView = view_ref_1.internalView(hostViewRef);
- if (hostView.proto.type !== viewModule.ViewType.HOST) {
- throw new exceptions_1.BaseException('This operation is only allowed on host views');
- }
- return hostView.elementRefs[hostView.elementOffset];
- };
- return AppViewManager;
- })();
- exports.AppViewManager = AppViewManager;
- var AppViewManager_ = (function (_super) {
- __extends(AppViewManager_, _super);
- function AppViewManager_(_viewPool, _viewListener, _utils, _renderer, _protoViewFactory) {
- _super.call(this);
- this._viewPool = _viewPool;
- this._viewListener = _viewListener;
- this._utils = _utils;
- this._renderer = _renderer;
- /** @internal */
- this._createRootHostViewScope = profile_1.wtfCreateScope('AppViewManager#createRootHostView()');
- /** @internal */
- this._destroyRootHostViewScope = profile_1.wtfCreateScope('AppViewManager#destroyRootHostView()');
- /** @internal */
- this._createEmbeddedViewInContainerScope = profile_1.wtfCreateScope('AppViewManager#createEmbeddedViewInContainer()');
- /** @internal */
- this._createHostViewInContainerScope = profile_1.wtfCreateScope('AppViewManager#createHostViewInContainer()');
- /** @internal */
- this._destroyViewInContainerScope = profile_1.wtfCreateScope('AppViewMananger#destroyViewInContainer()');
- /** @internal */
- this._attachViewInContainerScope = profile_1.wtfCreateScope('AppViewMananger#attachViewInContainer()');
- /** @internal */
- this._detachViewInContainerScope = profile_1.wtfCreateScope('AppViewMananger#detachViewInContainer()');
- this._protoViewFactory = _protoViewFactory;
- }
- AppViewManager_.prototype.getViewContainer = function (location) {
- var hostView = view_ref_1.internalView(location.parentView);
- return hostView.elementInjectors[location.boundElementIndex]
- .getViewContainerRef();
- };
- AppViewManager_.prototype.getNamedElementInComponentView = function (hostLocation, variableName) {
- var hostView = view_ref_1.internalView(hostLocation.parentView);
- var boundElementIndex = hostLocation.boundElementIndex;
- var componentView = hostView.getNestedView(boundElementIndex);
- if (lang_1.isBlank(componentView)) {
- throw new exceptions_1.BaseException("There is no component directive at element " + boundElementIndex);
- }
- var binderIdx = componentView.proto.variableLocations.get(variableName);
- if (lang_1.isBlank(binderIdx)) {
- throw new exceptions_1.BaseException("Could not find variable " + variableName);
- }
- return componentView.elementRefs[componentView.elementOffset + binderIdx];
- };
- AppViewManager_.prototype.getComponent = function (hostLocation) {
- var hostView = view_ref_1.internalView(hostLocation.parentView);
- var boundElementIndex = hostLocation.boundElementIndex;
- return this._utils.getComponentInstance(hostView, boundElementIndex);
- };
- AppViewManager_.prototype.createRootHostView = function (hostProtoViewRef, overrideSelector, injector) {
- var s = this._createRootHostViewScope();
- var hostProtoView = view_ref_1.internalProtoView(hostProtoViewRef);
- this._protoViewFactory.initializeProtoViewIfNeeded(hostProtoView);
- var hostElementSelector = overrideSelector;
- if (lang_1.isBlank(hostElementSelector)) {
- hostElementSelector = hostProtoView.elementBinders[0].componentDirective.metadata.selector;
- }
- var renderViewWithFragments = this._renderer.createRootHostView(hostProtoView.render, hostProtoView.mergeInfo.embeddedViewCount + 1, hostElementSelector);
- var hostView = this._createMainView(hostProtoView, renderViewWithFragments);
- this._renderer.hydrateView(hostView.render);
- this._utils.hydrateRootHostView(hostView, injector);
- return profile_1.wtfLeave(s, hostView.ref);
- };
- AppViewManager_.prototype.destroyRootHostView = function (hostViewRef) {
- // Note: Don't put the hostView into the view pool
- // as it is depending on the element for which it was created.
- var s = this._destroyRootHostViewScope();
- var hostView = view_ref_1.internalView(hostViewRef);
- this._renderer.detachFragment(hostView.renderFragment);
- this._renderer.dehydrateView(hostView.render);
- this._viewDehydrateRecurse(hostView);
- this._viewListener.onViewDestroyed(hostView);
- this._renderer.destroyView(hostView.render);
- profile_1.wtfLeave(s);
- };
- AppViewManager_.prototype.createEmbeddedViewInContainer = function (viewContainerLocation, index, templateRef) {
- var s = this._createEmbeddedViewInContainerScope();
- var protoView = view_ref_1.internalProtoView(templateRef.protoViewRef);
- if (protoView.type !== viewModule.ViewType.EMBEDDED) {
- throw new exceptions_1.BaseException('This method can only be called with embedded ProtoViews!');
- }
- this._protoViewFactory.initializeProtoViewIfNeeded(protoView);
- return profile_1.wtfLeave(s, this._createViewInContainer(viewContainerLocation, index, protoView, templateRef.elementRef, null));
- };
- AppViewManager_.prototype.createHostViewInContainer = function (viewContainerLocation, index, protoViewRef, imperativelyCreatedInjector) {
- var s = this._createHostViewInContainerScope();
- var protoView = view_ref_1.internalProtoView(protoViewRef);
- if (protoView.type !== viewModule.ViewType.HOST) {
- throw new exceptions_1.BaseException('This method can only be called with host ProtoViews!');
- }
- this._protoViewFactory.initializeProtoViewIfNeeded(protoView);
- return profile_1.wtfLeave(s, this._createViewInContainer(viewContainerLocation, index, protoView, viewContainerLocation, imperativelyCreatedInjector));
- };
- /**
- *
- * See {@link AppViewManager#destroyViewInContainer}.
- * @internal
- */
- AppViewManager_.prototype._createViewInContainer = function (viewContainerLocation, index, protoView, context, imperativelyCreatedInjector) {
- var parentView = view_ref_1.internalView(viewContainerLocation.parentView);
- var boundElementIndex = viewContainerLocation.boundElementIndex;
- var contextView = view_ref_1.internalView(context.parentView);
- var contextBoundElementIndex = context.boundElementIndex;
- var embeddedFragmentView = contextView.getNestedView(contextBoundElementIndex);
- var view;
- if (protoView.type === viewModule.ViewType.EMBEDDED && lang_1.isPresent(embeddedFragmentView) &&
- !embeddedFragmentView.hydrated()) {
- // Case 1: instantiate the first view of a template that has been merged into a parent
- view = embeddedFragmentView;
- this._attachRenderView(parentView, boundElementIndex, index, view);
- }
- else {
- // Case 2: instantiate another copy of the template or a host ProtoView.
- // This is a separate case
- // as we only inline one copy of the template into the parent view.
- view = this._createPooledView(protoView);
- this._attachRenderView(parentView, boundElementIndex, index, view);
- this._renderer.hydrateView(view.render);
- }
- this._utils.attachViewInContainer(parentView, boundElementIndex, contextView, contextBoundElementIndex, index, view);
- try {
- this._utils.hydrateViewInContainer(parentView, boundElementIndex, contextView, contextBoundElementIndex, index, imperativelyCreatedInjector);
- }
- catch (e) {
- this._utils.detachViewInContainer(parentView, boundElementIndex, index);
- throw e;
- }
- return view.ref;
- };
- /** @internal */
- AppViewManager_.prototype._attachRenderView = function (parentView, boundElementIndex, index, view) {
- var elementRef = parentView.elementRefs[boundElementIndex];
- if (index === 0) {
- this._renderer.attachFragmentAfterElement(elementRef, view.renderFragment);
- }
- else {
- var prevView = parentView.viewContainers[boundElementIndex].views[index - 1];
- this._renderer.attachFragmentAfterFragment(prevView.renderFragment, view.renderFragment);
- }
- };
- AppViewManager_.prototype.destroyViewInContainer = function (viewContainerLocation, index) {
- var s = this._destroyViewInContainerScope();
- var parentView = view_ref_1.internalView(viewContainerLocation.parentView);
- var boundElementIndex = viewContainerLocation.boundElementIndex;
- this._destroyViewInContainer(parentView, boundElementIndex, index);
- profile_1.wtfLeave(s);
- };
- // TODO(i): refactor detachViewInContainer+attachViewInContainer to moveViewInContainer
- AppViewManager_.prototype.attachViewInContainer = function (viewContainerLocation, index, viewRef) {
- var s = this._attachViewInContainerScope();
- var view = view_ref_1.internalView(viewRef);
- var parentView = view_ref_1.internalView(viewContainerLocation.parentView);
- var boundElementIndex = viewContainerLocation.boundElementIndex;
- // TODO(tbosch): the public methods attachViewInContainer/detachViewInContainer
- // are used for moving elements without the same container.
- // We will change this into an atomic `move` operation, which should preserve the
- // previous parent injector (see https://github.com/angular/angular/issues/1377).
- // Right now we are destroying any special
- // context view that might have been used.
- this._utils.attachViewInContainer(parentView, boundElementIndex, null, null, index, view);
- this._attachRenderView(parentView, boundElementIndex, index, view);
- return profile_1.wtfLeave(s, viewRef);
- };
- // TODO(i): refactor detachViewInContainer+attachViewInContainer to moveViewInContainer
- AppViewManager_.prototype.detachViewInContainer = function (viewContainerLocation, index) {
- var s = this._detachViewInContainerScope();
- var parentView = view_ref_1.internalView(viewContainerLocation.parentView);
- var boundElementIndex = viewContainerLocation.boundElementIndex;
- var viewContainer = parentView.viewContainers[boundElementIndex];
- var view = viewContainer.views[index];
- this._utils.detachViewInContainer(parentView, boundElementIndex, index);
- this._renderer.detachFragment(view.renderFragment);
- return profile_1.wtfLeave(s, view.ref);
- };
- /** @internal */
- AppViewManager_.prototype._createMainView = function (protoView, renderViewWithFragments) {
- var mergedParentView = this._utils.createView(protoView, renderViewWithFragments, this, this._renderer);
- this._renderer.setEventDispatcher(mergedParentView.render, mergedParentView);
- this._viewListener.onViewCreated(mergedParentView);
- return mergedParentView;
- };
- /** @internal */
- AppViewManager_.prototype._createPooledView = function (protoView) {
- var view = this._viewPool.getView(protoView);
- if (lang_1.isBlank(view)) {
- view = this._createMainView(protoView, this._renderer.createView(protoView.render, protoView.mergeInfo.embeddedViewCount + 1));
- }
- return view;
- };
- /** @internal */
- AppViewManager_.prototype._destroyPooledView = function (view) {
- var wasReturned = this._viewPool.returnView(view);
- if (!wasReturned) {
- this._viewListener.onViewDestroyed(view);
- this._renderer.destroyView(view.render);
- }
- };
- /** @internal */
- AppViewManager_.prototype._destroyViewInContainer = function (parentView, boundElementIndex, index) {
- var viewContainer = parentView.viewContainers[boundElementIndex];
- var view = viewContainer.views[index];
- this._viewDehydrateRecurse(view);
- this._utils.detachViewInContainer(parentView, boundElementIndex, index);
- if (view.viewOffset > 0) {
- // Case 1: a view that is part of another view.
- // Just detach the fragment
- this._renderer.detachFragment(view.renderFragment);
- }
- else {
- // Case 2: a view that is not part of another view.
- // dehydrate and destroy it.
- this._renderer.dehydrateView(view.render);
- this._renderer.detachFragment(view.renderFragment);
- this._destroyPooledView(view);
- }
- };
- /** @internal */
- AppViewManager_.prototype._viewDehydrateRecurse = function (view) {
- if (view.hydrated()) {
- this._utils.dehydrateView(view);
- }
- var viewContainers = view.viewContainers;
- var startViewOffset = view.viewOffset;
- var endViewOffset = view.viewOffset + view.proto.mergeInfo.viewCount - 1;
- var elementOffset = view.elementOffset;
- for (var viewIdx = startViewOffset; viewIdx <= endViewOffset; viewIdx++) {
- var currView = view.views[viewIdx];
- for (var binderIdx = 0; binderIdx < currView.proto.elementBinders.length; binderIdx++, elementOffset++) {
- var vc = viewContainers[elementOffset];
- if (lang_1.isPresent(vc)) {
- for (var j = vc.views.length - 1; j >= 0; j--) {
- this._destroyViewInContainer(currView, elementOffset, j);
- }
- }
- }
- }
- };
- AppViewManager_ = __decorate([
- di_1.Injectable(),
- __param(4, di_1.Inject(di_1.forwardRef(function () { return proto_view_factory_1.ProtoViewFactory; }))),
- __metadata('design:paramtypes', [view_pool_1.AppViewPool, view_listener_1.AppViewListener, view_manager_utils_1.AppViewManagerUtils, api_1.Renderer, Object])
- ], AppViewManager_);
- return AppViewManager_;
- })(AppViewManager);
- exports.AppViewManager_ = AppViewManager_;
- /***/ },
- /* 82 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var di_1 = __webpack_require__(6);
- var collection_1 = __webpack_require__(12);
- var eli = __webpack_require__(80);
- var lang_1 = __webpack_require__(5);
- var viewModule = __webpack_require__(76);
- var element_ref_1 = __webpack_require__(83);
- var template_ref_1 = __webpack_require__(84);
- var pipes_1 = __webpack_require__(74);
- var AppViewManagerUtils = (function () {
- function AppViewManagerUtils() {
- }
- AppViewManagerUtils.prototype.getComponentInstance = function (parentView, boundElementIndex) {
- var eli = parentView.elementInjectors[boundElementIndex];
- return eli.getComponent();
- };
- AppViewManagerUtils.prototype.createView = function (mergedParentViewProto, renderViewWithFragments, viewManager, renderer) {
- var renderFragments = renderViewWithFragments.fragmentRefs;
- var renderView = renderViewWithFragments.viewRef;
- var elementCount = mergedParentViewProto.mergeInfo.elementCount;
- var viewCount = mergedParentViewProto.mergeInfo.viewCount;
- var elementRefs = collection_1.ListWrapper.createFixedSize(elementCount);
- var viewContainers = collection_1.ListWrapper.createFixedSize(elementCount);
- var preBuiltObjects = collection_1.ListWrapper.createFixedSize(elementCount);
- var elementInjectors = collection_1.ListWrapper.createFixedSize(elementCount);
- var views = collection_1.ListWrapper.createFixedSize(viewCount);
- var elementOffset = 0;
- var textOffset = 0;
- var fragmentIdx = 0;
- var containerElementIndicesByViewIndex = collection_1.ListWrapper.createFixedSize(viewCount);
- for (var viewOffset = 0; viewOffset < viewCount; viewOffset++) {
- var containerElementIndex = containerElementIndicesByViewIndex[viewOffset];
- var containerElementInjector = lang_1.isPresent(containerElementIndex) ? elementInjectors[containerElementIndex] : null;
- var parentView = lang_1.isPresent(containerElementInjector) ? preBuiltObjects[containerElementIndex].view : null;
- var protoView = lang_1.isPresent(containerElementIndex) ?
- parentView.proto.elementBinders[containerElementIndex - parentView.elementOffset]
- .nestedProtoView :
- mergedParentViewProto;
- var renderFragment = null;
- if (viewOffset === 0 || protoView.type === viewModule.ViewType.EMBEDDED) {
- renderFragment = renderFragments[fragmentIdx++];
- }
- var currentView = new viewModule.AppView(renderer, protoView, viewOffset, elementOffset, textOffset, protoView.protoLocals, renderView, renderFragment, containerElementInjector);
- views[viewOffset] = currentView;
- if (lang_1.isPresent(containerElementIndex)) {
- preBuiltObjects[containerElementIndex].nestedView = currentView;
- }
- var rootElementInjectors = [];
- var nestedViewOffset = viewOffset + 1;
- for (var binderIdx = 0; binderIdx < protoView.elementBinders.length; binderIdx++) {
- var binder = protoView.elementBinders[binderIdx];
- var boundElementIndex = elementOffset + binderIdx;
- var elementInjector = null;
- if (lang_1.isPresent(binder.nestedProtoView) && binder.nestedProtoView.isMergable) {
- containerElementIndicesByViewIndex[nestedViewOffset] = boundElementIndex;
- nestedViewOffset += binder.nestedProtoView.mergeInfo.viewCount;
- }
- // elementInjectors and rootElementInjectors
- var protoElementInjector = binder.protoElementInjector;
- if (lang_1.isPresent(protoElementInjector)) {
- if (lang_1.isPresent(protoElementInjector.parent)) {
- var parentElementInjector = elementInjectors[elementOffset + protoElementInjector.parent.index];
- elementInjector = protoElementInjector.instantiate(parentElementInjector);
- }
- else {
- elementInjector = protoElementInjector.instantiate(null);
- rootElementInjectors.push(elementInjector);
- }
- }
- elementInjectors[boundElementIndex] = elementInjector;
- // elementRefs
- var el = new element_ref_1.ElementRef_(currentView.ref, boundElementIndex, renderer);
- elementRefs[el.boundElementIndex] = el;
- // preBuiltObjects
- if (lang_1.isPresent(elementInjector)) {
- var templateRef = lang_1.isPresent(binder.nestedProtoView) &&
- binder.nestedProtoView.type === viewModule.ViewType.EMBEDDED ?
- new template_ref_1.TemplateRef_(el) :
- null;
- preBuiltObjects[boundElementIndex] =
- new eli.PreBuiltObjects(viewManager, currentView, el, templateRef);
- }
- }
- currentView.init(protoView.changeDetectorFactory(currentView), elementInjectors, rootElementInjectors, preBuiltObjects, views, elementRefs, viewContainers);
- if (lang_1.isPresent(parentView) && protoView.type === viewModule.ViewType.COMPONENT) {
- parentView.changeDetector.addViewChild(currentView.changeDetector);
- }
- elementOffset += protoView.elementBinders.length;
- textOffset += protoView.textBindingCount;
- }
- return views[0];
- };
- AppViewManagerUtils.prototype.hydrateRootHostView = function (hostView, injector) {
- this._hydrateView(hostView, injector, null, new Object(), null);
- };
- // Misnomer: this method is attaching next to the view container.
- AppViewManagerUtils.prototype.attachViewInContainer = function (parentView, boundElementIndex, contextView, contextBoundElementIndex, index, view) {
- if (lang_1.isBlank(contextView)) {
- contextView = parentView;
- contextBoundElementIndex = boundElementIndex;
- }
- parentView.changeDetector.addContentChild(view.changeDetector);
- var viewContainer = parentView.viewContainers[boundElementIndex];
- if (lang_1.isBlank(viewContainer)) {
- viewContainer = new viewModule.AppViewContainer();
- parentView.viewContainers[boundElementIndex] = viewContainer;
- }
- collection_1.ListWrapper.insert(viewContainer.views, index, view);
- var elementInjector = contextView.elementInjectors[contextBoundElementIndex];
- for (var i = view.rootElementInjectors.length - 1; i >= 0; i--) {
- if (lang_1.isPresent(elementInjector.parent)) {
- view.rootElementInjectors[i].link(elementInjector.parent);
- }
- }
- elementInjector.traverseAndSetQueriesAsDirty();
- };
- AppViewManagerUtils.prototype.detachViewInContainer = function (parentView, boundElementIndex, index) {
- var viewContainer = parentView.viewContainers[boundElementIndex];
- var view = viewContainer.views[index];
- parentView.elementInjectors[boundElementIndex].traverseAndSetQueriesAsDirty();
- view.changeDetector.remove();
- collection_1.ListWrapper.removeAt(viewContainer.views, index);
- for (var i = 0; i < view.rootElementInjectors.length; ++i) {
- var inj = view.rootElementInjectors[i];
- inj.unlink();
- }
- };
- AppViewManagerUtils.prototype.hydrateViewInContainer = function (parentView, boundElementIndex, contextView, contextBoundElementIndex, index, imperativelyCreatedProviders) {
- if (lang_1.isBlank(contextView)) {
- contextView = parentView;
- contextBoundElementIndex = boundElementIndex;
- }
- var viewContainer = parentView.viewContainers[boundElementIndex];
- var view = viewContainer.views[index];
- var elementInjector = contextView.elementInjectors[contextBoundElementIndex];
- var injector = lang_1.isPresent(imperativelyCreatedProviders) ?
- di_1.Injector.fromResolvedProviders(imperativelyCreatedProviders) :
- null;
- this._hydrateView(view, injector, elementInjector.getHost(), contextView.context, contextView.locals);
- };
- /** @internal */
- AppViewManagerUtils.prototype._hydrateView = function (initView, imperativelyCreatedInjector, hostElementInjector, context, parentLocals) {
- var viewIdx = initView.viewOffset;
- var endViewOffset = viewIdx + initView.proto.mergeInfo.viewCount - 1;
- while (viewIdx <= endViewOffset) {
- var currView = initView.views[viewIdx];
- var currProtoView = currView.proto;
- if (currView !== initView && currView.proto.type === viewModule.ViewType.EMBEDDED) {
- // Don't hydrate components of embedded fragment views.
- viewIdx += currView.proto.mergeInfo.viewCount;
- }
- else {
- if (currView !== initView) {
- // hydrate a nested component view
- imperativelyCreatedInjector = null;
- parentLocals = null;
- hostElementInjector = currView.containerElementInjector;
- context = hostElementInjector.getComponent();
- }
- currView.context = context;
- currView.locals.parent = parentLocals;
- var binders = currProtoView.elementBinders;
- for (var binderIdx = 0; binderIdx < binders.length; binderIdx++) {
- var boundElementIndex = binderIdx + currView.elementOffset;
- var elementInjector = initView.elementInjectors[boundElementIndex];
- if (lang_1.isPresent(elementInjector)) {
- elementInjector.hydrate(imperativelyCreatedInjector, hostElementInjector, currView.preBuiltObjects[boundElementIndex]);
- this._populateViewLocals(currView, elementInjector, boundElementIndex);
- this._setUpEventEmitters(currView, elementInjector, boundElementIndex);
- }
- }
- var pipes = lang_1.isPresent(hostElementInjector) ?
- new pipes_1.Pipes(currView.proto.pipes, hostElementInjector.getInjector()) :
- null;
- currView.changeDetector.hydrate(currView.context, currView.locals, currView, pipes);
- viewIdx++;
- }
- }
- };
- /** @internal */
- AppViewManagerUtils.prototype._populateViewLocals = function (view, elementInjector, boundElementIdx) {
- if (lang_1.isPresent(elementInjector.getDirectiveVariableBindings())) {
- elementInjector.getDirectiveVariableBindings().forEach(function (directiveIndex, name) {
- if (lang_1.isBlank(directiveIndex)) {
- view.locals.set(name, view.elementRefs[boundElementIdx].nativeElement);
- }
- else {
- view.locals.set(name, elementInjector.getDirectiveAtIndex(directiveIndex));
- }
- });
- }
- };
- /** @internal */
- AppViewManagerUtils.prototype._setUpEventEmitters = function (view, elementInjector, boundElementIndex) {
- var emitters = elementInjector.getEventEmitterAccessors();
- for (var directiveIndex = 0; directiveIndex < emitters.length; ++directiveIndex) {
- var directiveEmitters = emitters[directiveIndex];
- var directive = elementInjector.getDirectiveAtIndex(directiveIndex);
- for (var eventIndex = 0; eventIndex < directiveEmitters.length; ++eventIndex) {
- var eventEmitterAccessor = directiveEmitters[eventIndex];
- eventEmitterAccessor.subscribe(view, boundElementIndex, directive);
- }
- }
- };
- AppViewManagerUtils.prototype.dehydrateView = function (initView) {
- var endViewOffset = initView.viewOffset + initView.proto.mergeInfo.viewCount - 1;
- for (var viewIdx = initView.viewOffset; viewIdx <= endViewOffset; viewIdx++) {
- var currView = initView.views[viewIdx];
- if (currView.hydrated()) {
- if (lang_1.isPresent(currView.locals)) {
- currView.locals.clearValues();
- }
- currView.context = null;
- currView.changeDetector.dehydrate();
- var binders = currView.proto.elementBinders;
- for (var binderIdx = 0; binderIdx < binders.length; binderIdx++) {
- var eli = initView.elementInjectors[currView.elementOffset + binderIdx];
- if (lang_1.isPresent(eli)) {
- eli.dehydrate();
- }
- }
- }
- }
- };
- AppViewManagerUtils = __decorate([
- di_1.Injectable(),
- __metadata('design:paramtypes', [])
- ], AppViewManagerUtils);
- return AppViewManagerUtils;
- })();
- exports.AppViewManagerUtils = AppViewManagerUtils;
- /***/ },
- /* 83 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var exceptions_1 = __webpack_require__(14);
- /**
- * Represents a location in a View that has an injection, change-detection and render context
- * associated with it.
- *
- * An `ElementRef` is created for each element in the Template that contains a Directive, Component
- * or data-binding.
- *
- * An `ElementRef` is backed by a render-specific element. In the browser, this is usually a DOM
- * element.
- */
- var ElementRef = (function () {
- function ElementRef() {
- }
- Object.defineProperty(ElementRef.prototype, "nativeElement", {
- /**
- * The underlying native element or `null` if direct access to native elements is not supported
- * (e.g. when the application runs in a web worker).
- *
- * <div class="callout is-critical">
- * <header>Use with caution</header>
- * <p>
- * Use this API as the last resort when direct access to DOM is needed. Use templating and
- * data-binding provided by Angular instead. Alternatively you take a look at {@link Renderer}
- * which provides API that can safely be used even when direct access to native elements is not
- * supported.
- * </p>
- * <p>
- * Relying on direct DOM access creates tight coupling between your application and rendering
- * layers which will make it impossible to separate the two and deploy your application into a
- * web worker.
- * </p>
- * </div>
- */
- get: function () { return exceptions_1.unimplemented(); },
- enumerable: true,
- configurable: true
- });
- ;
- Object.defineProperty(ElementRef.prototype, "renderView", {
- get: function () { return exceptions_1.unimplemented(); },
- enumerable: true,
- configurable: true
- });
- return ElementRef;
- })();
- exports.ElementRef = ElementRef;
- var ElementRef_ = (function (_super) {
- __extends(ElementRef_, _super);
- function ElementRef_(parentView,
- /**
- * Index of the element inside the {@link ViewRef}.
- *
- * This is used internally by the Angular framework to locate elements.
- */
- boundElementIndex, _renderer) {
- _super.call(this);
- this.parentView = parentView;
- this.boundElementIndex = boundElementIndex;
- this._renderer = _renderer;
- }
- Object.defineProperty(ElementRef_.prototype, "renderView", {
- get: function () { return this.parentView.render; },
- set: function (value) { exceptions_1.unimplemented(); },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(ElementRef_.prototype, "nativeElement", {
- get: function () { return this._renderer.getNativeElementSync(this); },
- enumerable: true,
- configurable: true
- });
- return ElementRef_;
- })(ElementRef);
- exports.ElementRef_ = ElementRef_;
- /***/ },
- /* 84 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var view_ref_1 = __webpack_require__(77);
- /**
- * Represents an Embedded Template that can be used to instantiate Embedded Views.
- *
- * You can access a `TemplateRef`, in two ways. Via a directive placed on a `<template>` element (or
- * directive prefixed with `*`) and have the `TemplateRef` for this Embedded View injected into the
- * constructor of the directive using the `TemplateRef` Token. Alternatively you can query for the
- * `TemplateRef` from a Component or a Directive via {@link Query}.
- *
- * To instantiate Embedded Views based on a Template, use
- * {@link ViewContainerRef#createEmbeddedView}, which will create the View and attach it to the
- * View Container.
- */
- var TemplateRef = (function () {
- function TemplateRef() {
- }
- return TemplateRef;
- })();
- exports.TemplateRef = TemplateRef;
- var TemplateRef_ = (function (_super) {
- __extends(TemplateRef_, _super);
- function TemplateRef_(elementRef) {
- _super.call(this);
- this.elementRef = elementRef;
- }
- TemplateRef_.prototype._getProtoView = function () {
- var elementRef = this.elementRef;
- var parentView = view_ref_1.internalView(elementRef.parentView);
- return parentView.proto.elementBinders[elementRef.boundElementIndex - parentView.elementOffset]
- .nestedProtoView;
- };
- Object.defineProperty(TemplateRef_.prototype, "protoViewRef", {
- /**
- * Reference to the ProtoView used for creating Embedded Views that are based on the compiled
- * Embedded Template.
- */
- get: function () { return this._getProtoView().ref; },
- enumerable: true,
- configurable: true
- });
- TemplateRef_.prototype.hasLocal = function (name) {
- return this._getProtoView().templateVariableBindings.has(name);
- };
- return TemplateRef_;
- })(TemplateRef);
- exports.TemplateRef_ = TemplateRef_;
- /***/ },
- /* 85 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var __param = (this && this.__param) || function (paramIndex, decorator) {
- return function (target, key) { decorator(target, key, paramIndex); }
- };
- var di_1 = __webpack_require__(6);
- var lang_1 = __webpack_require__(5);
- var collection_1 = __webpack_require__(12);
- exports.APP_VIEW_POOL_CAPACITY = lang_1.CONST_EXPR(new di_1.OpaqueToken('AppViewPool.viewPoolCapacity'));
- var AppViewPool = (function () {
- function AppViewPool(poolCapacityPerProtoView) {
- /** @internal */
- this._pooledViewsPerProtoView = new collection_1.Map();
- this._poolCapacityPerProtoView = poolCapacityPerProtoView;
- }
- AppViewPool.prototype.getView = function (protoView) {
- var pooledViews = this._pooledViewsPerProtoView.get(protoView);
- if (lang_1.isPresent(pooledViews) && pooledViews.length > 0) {
- return pooledViews.pop();
- }
- return null;
- };
- AppViewPool.prototype.returnView = function (view) {
- var protoView = view.proto;
- var pooledViews = this._pooledViewsPerProtoView.get(protoView);
- if (lang_1.isBlank(pooledViews)) {
- pooledViews = [];
- this._pooledViewsPerProtoView.set(protoView, pooledViews);
- }
- var haveRemainingCapacity = pooledViews.length < this._poolCapacityPerProtoView;
- if (haveRemainingCapacity) {
- pooledViews.push(view);
- }
- return haveRemainingCapacity;
- };
- AppViewPool = __decorate([
- di_1.Injectable(),
- __param(0, di_1.Inject(exports.APP_VIEW_POOL_CAPACITY)),
- __metadata('design:paramtypes', [Object])
- ], AppViewPool);
- return AppViewPool;
- })();
- exports.AppViewPool = AppViewPool;
- /***/ },
- /* 86 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var di_1 = __webpack_require__(6);
- /**
- * Listener for view creation / destruction.
- */
- var AppViewListener = (function () {
- function AppViewListener() {
- }
- AppViewListener.prototype.onViewCreated = function (view) { };
- AppViewListener.prototype.onViewDestroyed = function (view) { };
- AppViewListener = __decorate([
- di_1.Injectable(),
- __metadata('design:paramtypes', [])
- ], AppViewListener);
- return AppViewListener;
- })();
- exports.AppViewListener = AppViewListener;
- /***/ },
- /* 87 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var collection_1 = __webpack_require__(12);
- var exceptions_1 = __webpack_require__(14);
- var lang_1 = __webpack_require__(5);
- var view_ref_1 = __webpack_require__(77);
- /**
- * Represents a container where one or more Views can be attached.
- *
- * The container can contain two kinds of Views. Host Views, created by instantiating a
- * {@link Component} via {@link #createHostView}, and Embedded Views, created by instantiating an
- * {@link TemplateRef Embedded Template} via {@link #createEmbeddedView}.
- *
- * The location of the View Container within the containing View is specified by the Anchor
- * `element`. Each View Container can have only one Anchor Element and each Anchor Element can only
- * have a single View Container.
- *
- * Root elements of Views attached to this container become siblings of the Anchor Element in
- * the Rendered View.
- *
- * To access a `ViewContainerRef` of an Element, you can either place a {@link Directive} injected
- * with `ViewContainerRef` on the Element, or you obtain it via
- * {@link AppViewManager#getViewContainer}.
- *
- * <!-- TODO(i): we are also considering ElementRef#viewContainer api -->
- */
- var ViewContainerRef = (function () {
- function ViewContainerRef() {
- }
- /**
- * Destroys all Views in this container.
- */
- ViewContainerRef.prototype.clear = function () {
- for (var i = this.length - 1; i >= 0; i--) {
- this.remove(i);
- }
- };
- Object.defineProperty(ViewContainerRef.prototype, "length", {
- /**
- * Returns the number of Views currently attached to this container.
- */
- get: function () { return exceptions_1.unimplemented(); },
- enumerable: true,
- configurable: true
- });
- ;
- return ViewContainerRef;
- })();
- exports.ViewContainerRef = ViewContainerRef;
- var ViewContainerRef_ = (function (_super) {
- __extends(ViewContainerRef_, _super);
- function ViewContainerRef_(viewManager, element) {
- _super.call(this);
- this.viewManager = viewManager;
- this.element = element;
- }
- ViewContainerRef_.prototype._getViews = function () {
- var element = this.element;
- var vc = view_ref_1.internalView(element.parentView).viewContainers[element.boundElementIndex];
- return lang_1.isPresent(vc) ? vc.views : [];
- };
- ViewContainerRef_.prototype.get = function (index) { return this._getViews()[index].ref; };
- Object.defineProperty(ViewContainerRef_.prototype, "length", {
- get: function () { return this._getViews().length; },
- enumerable: true,
- configurable: true
- });
- // TODO(rado): profile and decide whether bounds checks should be added
- // to the methods below.
- ViewContainerRef_.prototype.createEmbeddedView = function (templateRef, index) {
- if (index === void 0) { index = -1; }
- if (index == -1)
- index = this.length;
- return this.viewManager.createEmbeddedViewInContainer(this.element, index, templateRef);
- };
- ViewContainerRef_.prototype.createHostView = function (protoViewRef, index, dynamicallyCreatedProviders) {
- if (protoViewRef === void 0) { protoViewRef = null; }
- if (index === void 0) { index = -1; }
- if (dynamicallyCreatedProviders === void 0) { dynamicallyCreatedProviders = null; }
- if (index == -1)
- index = this.length;
- return this.viewManager.createHostViewInContainer(this.element, index, protoViewRef, dynamicallyCreatedProviders);
- };
- // TODO(i): refactor insert+remove into move
- ViewContainerRef_.prototype.insert = function (viewRef, index) {
- if (index === void 0) { index = -1; }
- if (index == -1)
- index = this.length;
- return this.viewManager.attachViewInContainer(this.element, index, viewRef);
- };
- ViewContainerRef_.prototype.indexOf = function (viewRef) {
- return collection_1.ListWrapper.indexOf(this._getViews(), view_ref_1.internalView(viewRef));
- };
- // TODO(i): rename to destroy
- ViewContainerRef_.prototype.remove = function (index) {
- if (index === void 0) { index = -1; }
- if (index == -1)
- index = this.length - 1;
- this.viewManager.destroyViewInContainer(this.element, index);
- // view is intentionally not returned to the client.
- };
- // TODO(i): refactor insert+remove into move
- ViewContainerRef_.prototype.detach = function (index) {
- if (index === void 0) { index = -1; }
- if (index == -1)
- index = this.length - 1;
- return this.viewManager.detachViewInContainer(this.element, index);
- };
- return ViewContainerRef_;
- })(ViewContainerRef);
- exports.ViewContainerRef_ = ViewContainerRef_;
- /***/ },
- /* 88 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var interfaces_1 = __webpack_require__(89);
- function hasLifecycleHook(lcInterface, token) {
- if (!(token instanceof lang_1.Type))
- return false;
- var proto = token.prototype;
- switch (lcInterface) {
- case interfaces_1.LifecycleHooks.AfterContentInit:
- return !!proto.ngAfterContentInit;
- case interfaces_1.LifecycleHooks.AfterContentChecked:
- return !!proto.ngAfterContentChecked;
- case interfaces_1.LifecycleHooks.AfterViewInit:
- return !!proto.ngAfterViewInit;
- case interfaces_1.LifecycleHooks.AfterViewChecked:
- return !!proto.ngAfterViewChecked;
- case interfaces_1.LifecycleHooks.OnChanges:
- return !!proto.ngOnChanges;
- case interfaces_1.LifecycleHooks.DoCheck:
- return !!proto.ngDoCheck;
- case interfaces_1.LifecycleHooks.OnDestroy:
- return !!proto.ngOnDestroy;
- case interfaces_1.LifecycleHooks.OnInit:
- return !!proto.ngOnInit;
- default:
- return false;
- }
- }
- exports.hasLifecycleHook = hasLifecycleHook;
- /***/ },
- /* 89 */
- /***/ function(module, exports) {
- (function (LifecycleHooks) {
- LifecycleHooks[LifecycleHooks["OnInit"] = 0] = "OnInit";
- LifecycleHooks[LifecycleHooks["OnDestroy"] = 1] = "OnDestroy";
- LifecycleHooks[LifecycleHooks["DoCheck"] = 2] = "DoCheck";
- LifecycleHooks[LifecycleHooks["OnChanges"] = 3] = "OnChanges";
- LifecycleHooks[LifecycleHooks["AfterContentInit"] = 4] = "AfterContentInit";
- LifecycleHooks[LifecycleHooks["AfterContentChecked"] = 5] = "AfterContentChecked";
- LifecycleHooks[LifecycleHooks["AfterViewInit"] = 6] = "AfterViewInit";
- LifecycleHooks[LifecycleHooks["AfterViewChecked"] = 7] = "AfterViewChecked";
- })(exports.LifecycleHooks || (exports.LifecycleHooks = {}));
- var LifecycleHooks = exports.LifecycleHooks;
- /**
- * @internal
- */
- exports.LIFECYCLE_HOOKS_VALUES = [
- LifecycleHooks.OnInit,
- LifecycleHooks.OnDestroy,
- LifecycleHooks.DoCheck,
- LifecycleHooks.OnChanges,
- LifecycleHooks.AfterContentInit,
- LifecycleHooks.AfterContentChecked,
- LifecycleHooks.AfterViewInit,
- LifecycleHooks.AfterViewChecked
- ];
- /***/ },
- /* 90 */
- /***/ function(module, exports, __webpack_require__) {
- var collection_1 = __webpack_require__(12);
- var lang_1 = __webpack_require__(5);
- var async_1 = __webpack_require__(60);
- /**
- * An unmodifiable list of items that Angular keeps up to date when the state
- * of the application changes.
- *
- * The type of object that {@link QueryMetadata} and {@link ViewQueryMetadata} provide.
- *
- * Implements an iterable interface, therefore it can be used in both ES6
- * javascript `for (var i of items)` loops as well as in Angular templates with
- * `*ngFor="#i of myList"`.
- *
- * Changes can be observed by subscribing to the changes `Observable`.
- *
- * NOTE: In the future this class will implement an `Observable` interface.
- *
- * ### Example ([live demo](http://plnkr.co/edit/RX8sJnQYl9FWuSCWme5z?p=preview))
- * ```typescript
- * @Component({...})
- * class Container {
- * constructor(@Query(Item) items: QueryList<Item>) {
- * items.changes.subscribe(_ => console.log(items.length));
- * }
- * }
- * ```
- */
- var QueryList = (function () {
- function QueryList() {
- this._results = [];
- this._emitter = new async_1.EventEmitter();
- }
- Object.defineProperty(QueryList.prototype, "changes", {
- get: function () { return this._emitter; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(QueryList.prototype, "length", {
- get: function () { return this._results.length; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(QueryList.prototype, "first", {
- get: function () { return collection_1.ListWrapper.first(this._results); },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(QueryList.prototype, "last", {
- get: function () { return collection_1.ListWrapper.last(this._results); },
- enumerable: true,
- configurable: true
- });
- /**
- * returns a new array with the passed in function applied to each element.
- */
- QueryList.prototype.map = function (fn) { return this._results.map(fn); };
- /**
- * returns a filtered array.
- */
- QueryList.prototype.filter = function (fn) { return this._results.filter(fn); };
- /**
- * returns a reduced value.
- */
- QueryList.prototype.reduce = function (fn, init) { return this._results.reduce(fn, init); };
- /**
- * converts QueryList into an array
- */
- QueryList.prototype.toArray = function () { return collection_1.ListWrapper.clone(this._results); };
- QueryList.prototype[lang_1.getSymbolIterator()] = function () { return this._results[lang_1.getSymbolIterator()](); };
- QueryList.prototype.toString = function () { return this._results.toString(); };
- /**
- * @internal
- */
- QueryList.prototype.reset = function (res) { this._results = res; };
- /** @internal */
- QueryList.prototype.notifyOnChanges = function () { this._emitter.emit(this); };
- return QueryList;
- })();
- exports.QueryList = QueryList;
- /***/ },
- /* 91 */
- /***/ function(module, exports) {
- exports.EVENT_TARGET_SEPARATOR = ':';
- var EventConfig = (function () {
- function EventConfig(fieldName, eventName, isLongForm) {
- this.fieldName = fieldName;
- this.eventName = eventName;
- this.isLongForm = isLongForm;
- }
- EventConfig.parse = function (eventConfig) {
- var fieldName = eventConfig, eventName = eventConfig, isLongForm = false;
- var separatorIdx = eventConfig.indexOf(exports.EVENT_TARGET_SEPARATOR);
- if (separatorIdx > -1) {
- // long format: 'fieldName: eventName'
- fieldName = eventConfig.substring(0, separatorIdx).trim();
- eventName = eventConfig.substring(separatorIdx + 1).trim();
- isLongForm = true;
- }
- return new EventConfig(fieldName, eventName, isLongForm);
- };
- EventConfig.prototype.getFullName = function () {
- return this.isLongForm ? "" + this.fieldName + exports.EVENT_TARGET_SEPARATOR + this.eventName :
- this.eventName;
- };
- return EventConfig;
- })();
- exports.EventConfig = EventConfig;
- /***/ },
- /* 92 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var di_1 = __webpack_require__(6);
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var collection_1 = __webpack_require__(12);
- var metadata_1 = __webpack_require__(3);
- var reflection_1 = __webpack_require__(16);
- function _isDirectiveMetadata(type) {
- return type instanceof metadata_1.DirectiveMetadata;
- }
- /*
- * Resolve a `Type` for {@link DirectiveMetadata}.
- *
- * This interface can be overridden by the application developer to create custom behavior.
- *
- * See {@link Compiler}
- */
- var DirectiveResolver = (function () {
- function DirectiveResolver() {
- }
- /**
- * Return {@link DirectiveMetadata} for a given `Type`.
- */
- DirectiveResolver.prototype.resolve = function (type) {
- var typeMetadata = reflection_1.reflector.annotations(di_1.resolveForwardRef(type));
- if (lang_1.isPresent(typeMetadata)) {
- var metadata = typeMetadata.find(_isDirectiveMetadata);
- if (lang_1.isPresent(metadata)) {
- var propertyMetadata = reflection_1.reflector.propMetadata(type);
- return this._mergeWithPropertyMetadata(metadata, propertyMetadata);
- }
- }
- throw new exceptions_1.BaseException("No Directive annotation found on " + lang_1.stringify(type));
- };
- DirectiveResolver.prototype._mergeWithPropertyMetadata = function (dm, propertyMetadata) {
- var inputs = [];
- var outputs = [];
- var host = {};
- var queries = {};
- collection_1.StringMapWrapper.forEach(propertyMetadata, function (metadata, propName) {
- metadata.forEach(function (a) {
- if (a instanceof metadata_1.InputMetadata) {
- if (lang_1.isPresent(a.bindingPropertyName)) {
- inputs.push(propName + ": " + a.bindingPropertyName);
- }
- else {
- inputs.push(propName);
- }
- }
- if (a instanceof metadata_1.OutputMetadata) {
- if (lang_1.isPresent(a.bindingPropertyName)) {
- outputs.push(propName + ": " + a.bindingPropertyName);
- }
- else {
- outputs.push(propName);
- }
- }
- if (a instanceof metadata_1.HostBindingMetadata) {
- if (lang_1.isPresent(a.hostPropertyName)) {
- host[("[" + a.hostPropertyName + "]")] = propName;
- }
- else {
- host[("[" + propName + "]")] = propName;
- }
- }
- if (a instanceof metadata_1.HostListenerMetadata) {
- var args = lang_1.isPresent(a.args) ? a.args.join(', ') : '';
- host[("(" + a.eventName + ")")] = propName + "(" + args + ")";
- }
- if (a instanceof metadata_1.ContentChildrenMetadata) {
- queries[propName] = a;
- }
- if (a instanceof metadata_1.ViewChildrenMetadata) {
- queries[propName] = a;
- }
- if (a instanceof metadata_1.ContentChildMetadata) {
- queries[propName] = a;
- }
- if (a instanceof metadata_1.ViewChildMetadata) {
- queries[propName] = a;
- }
- });
- });
- return this._merge(dm, inputs, outputs, host, queries);
- };
- DirectiveResolver.prototype._merge = function (dm, inputs, outputs, host, queries) {
- var mergedInputs = lang_1.isPresent(dm.inputs) ? collection_1.ListWrapper.concat(dm.inputs, inputs) : inputs;
- var mergedOutputs = lang_1.isPresent(dm.outputs) ? collection_1.ListWrapper.concat(dm.outputs, outputs) : outputs;
- var mergedHost = lang_1.isPresent(dm.host) ? collection_1.StringMapWrapper.merge(dm.host, host) : host;
- var mergedQueries = lang_1.isPresent(dm.queries) ? collection_1.StringMapWrapper.merge(dm.queries, queries) : queries;
- if (dm instanceof metadata_1.ComponentMetadata) {
- return new metadata_1.ComponentMetadata({
- selector: dm.selector,
- inputs: mergedInputs,
- outputs: mergedOutputs,
- host: mergedHost,
- exportAs: dm.exportAs,
- moduleId: dm.moduleId,
- queries: mergedQueries,
- changeDetection: dm.changeDetection,
- providers: dm.providers,
- viewProviders: dm.viewProviders
- });
- }
- else {
- return new metadata_1.DirectiveMetadata({
- selector: dm.selector,
- inputs: mergedInputs,
- outputs: mergedOutputs,
- host: mergedHost,
- exportAs: dm.exportAs,
- queries: mergedQueries,
- providers: dm.providers
- });
- }
- };
- DirectiveResolver = __decorate([
- di_1.Injectable(),
- __metadata('design:paramtypes', [])
- ], DirectiveResolver);
- return DirectiveResolver;
- })();
- exports.DirectiveResolver = DirectiveResolver;
- /***/ },
- /* 93 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var di_1 = __webpack_require__(6);
- var view_1 = __webpack_require__(56);
- var directives_1 = __webpack_require__(23);
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var collection_1 = __webpack_require__(12);
- var reflection_1 = __webpack_require__(16);
- /**
- * Resolves types to {@link ViewMetadata}.
- */
- var ViewResolver = (function () {
- function ViewResolver() {
- /** @internal */
- this._cache = new collection_1.Map();
- }
- ViewResolver.prototype.resolve = function (component) {
- var view = this._cache.get(component);
- if (lang_1.isBlank(view)) {
- view = this._resolve(component);
- this._cache.set(component, view);
- }
- return view;
- };
- /** @internal */
- ViewResolver.prototype._resolve = function (component) {
- var compMeta;
- var viewMeta;
- reflection_1.reflector.annotations(component).forEach(function (m) {
- if (m instanceof view_1.ViewMetadata) {
- viewMeta = m;
- }
- if (m instanceof directives_1.ComponentMetadata) {
- compMeta = m;
- }
- });
- if (lang_1.isPresent(compMeta)) {
- if (lang_1.isBlank(compMeta.template) && lang_1.isBlank(compMeta.templateUrl) && lang_1.isBlank(viewMeta)) {
- throw new exceptions_1.BaseException("Component '" + lang_1.stringify(component) + "' must have either 'template', 'templateUrl', or '@View' set.");
- }
- else if (lang_1.isPresent(compMeta.template) && lang_1.isPresent(viewMeta)) {
- this._throwMixingViewAndComponent("template", component);
- }
- else if (lang_1.isPresent(compMeta.templateUrl) && lang_1.isPresent(viewMeta)) {
- this._throwMixingViewAndComponent("templateUrl", component);
- }
- else if (lang_1.isPresent(compMeta.directives) && lang_1.isPresent(viewMeta)) {
- this._throwMixingViewAndComponent("directives", component);
- }
- else if (lang_1.isPresent(compMeta.pipes) && lang_1.isPresent(viewMeta)) {
- this._throwMixingViewAndComponent("pipes", component);
- }
- else if (lang_1.isPresent(compMeta.encapsulation) && lang_1.isPresent(viewMeta)) {
- this._throwMixingViewAndComponent("encapsulation", component);
- }
- else if (lang_1.isPresent(compMeta.styles) && lang_1.isPresent(viewMeta)) {
- this._throwMixingViewAndComponent("styles", component);
- }
- else if (lang_1.isPresent(compMeta.styleUrls) && lang_1.isPresent(viewMeta)) {
- this._throwMixingViewAndComponent("styleUrls", component);
- }
- else if (lang_1.isPresent(viewMeta)) {
- return viewMeta;
- }
- else {
- return new view_1.ViewMetadata({
- templateUrl: compMeta.templateUrl,
- template: compMeta.template,
- directives: compMeta.directives,
- pipes: compMeta.pipes,
- encapsulation: compMeta.encapsulation,
- styles: compMeta.styles,
- styleUrls: compMeta.styleUrls
- });
- }
- }
- else {
- if (lang_1.isBlank(viewMeta)) {
- throw new exceptions_1.BaseException("No View decorator found on component '" + lang_1.stringify(component) + "'");
- }
- else {
- return viewMeta;
- }
- }
- return null;
- };
- /** @internal */
- ViewResolver.prototype._throwMixingViewAndComponent = function (propertyName, component) {
- throw new exceptions_1.BaseException("Component '" + lang_1.stringify(component) + "' cannot have both '" + propertyName + "' and '@View' set at the same time\"");
- };
- ViewResolver = __decorate([
- di_1.Injectable(),
- __metadata('design:paramtypes', [])
- ], ViewResolver);
- return ViewResolver;
- })();
- exports.ViewResolver = ViewResolver;
- /***/ },
- /* 94 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var di_1 = __webpack_require__(6);
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var metadata_1 = __webpack_require__(3);
- var reflection_1 = __webpack_require__(16);
- function _isPipeMetadata(type) {
- return type instanceof metadata_1.PipeMetadata;
- }
- /**
- * Resolve a `Type` for {@link PipeMetadata}.
- *
- * This interface can be overridden by the application developer to create custom behavior.
- *
- * See {@link Compiler}
- */
- var PipeResolver = (function () {
- function PipeResolver() {
- }
- /**
- * Return {@link PipeMetadata} for a given `Type`.
- */
- PipeResolver.prototype.resolve = function (type) {
- var metas = reflection_1.reflector.annotations(di_1.resolveForwardRef(type));
- if (lang_1.isPresent(metas)) {
- var annotation = metas.find(_isPipeMetadata);
- if (lang_1.isPresent(annotation)) {
- return annotation;
- }
- }
- throw new exceptions_1.BaseException("No Pipe decorator found on " + lang_1.stringify(type));
- };
- PipeResolver = __decorate([
- di_1.Injectable(),
- __metadata('design:paramtypes', [])
- ], PipeResolver);
- return PipeResolver;
- })();
- exports.PipeResolver = PipeResolver;
- /***/ },
- /* 95 */
- /***/ function(module, exports, __webpack_require__) {
- var di_1 = __webpack_require__(6);
- var lang_1 = __webpack_require__(5);
- /**
- * A token that can be provided when bootstraping an application to make an array of directives
- * available in every component of the application.
- *
- * ### Example
- *
- * ```typescript
- * import {PLATFORM_DIRECTIVES} from 'angular2/core';
- * import {OtherDirective} from './myDirectives';
- *
- * @Component({
- * selector: 'my-component',
- * template: `
- * <!-- can use other directive even though the component does not list it in `directives` -->
- * <other-directive></other-directive>
- * `
- * })
- * export class MyComponent {
- * ...
- * }
- *
- * bootstrap(MyComponent, [provide(PLATFORM_DIRECTIVES, {useValue: [OtherDirective], multi:true})]);
- * ```
- */
- exports.PLATFORM_DIRECTIVES = lang_1.CONST_EXPR(new di_1.OpaqueToken("Platform Directives"));
- /**
- * A token that can be provided when bootstraping an application to make an array of pipes
- * available in every component of the application.
- *
- * ### Example
- *
- * ```typescript
- * import {PLATFORM_PIPES} from 'angular2/core';
- * import {OtherPipe} from './myPipe';
- *
- * @Component({
- * selector: 'my-component',
- * template: `
- * {{123 | other-pipe}}
- * `
- * })
- * export class MyComponent {
- * ...
- * }
- *
- * bootstrap(MyComponent, [provide(PLATFORM_PIPES, {useValue: [OtherPipe], multi:true})]);
- * ```
- */
- exports.PLATFORM_PIPES = lang_1.CONST_EXPR(new di_1.OpaqueToken("Platform Pipes"));
- /***/ },
- /* 96 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var api_1 = __webpack_require__(72);
- var metadata_1 = __webpack_require__(3);
- // Export ViewEncapsulation so that compiled templates only need to depend
- // on template_commands.
- var metadata_2 = __webpack_require__(3);
- exports.ViewEncapsulation = metadata_2.ViewEncapsulation;
- /**
- * A compiled host template.
- *
- * This is const as we are storing it as annotation
- * for the compiled component type.
- */
- var CompiledHostTemplate = (function () {
- function CompiledHostTemplate(template) {
- this.template = template;
- }
- CompiledHostTemplate = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [CompiledComponentTemplate])
- ], CompiledHostTemplate);
- return CompiledHostTemplate;
- })();
- exports.CompiledHostTemplate = CompiledHostTemplate;
- /**
- * A compiled template.
- */
- var CompiledComponentTemplate = (function () {
- function CompiledComponentTemplate(id, changeDetectorFactory, commands, styles) {
- this.id = id;
- this.changeDetectorFactory = changeDetectorFactory;
- this.commands = commands;
- this.styles = styles;
- }
- CompiledComponentTemplate = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [String, Function, Array, Array])
- ], CompiledComponentTemplate);
- return CompiledComponentTemplate;
- })();
- exports.CompiledComponentTemplate = CompiledComponentTemplate;
- var EMPTY_ARR = lang_1.CONST_EXPR([]);
- var TextCmd = (function () {
- function TextCmd(value, isBound, ngContentIndex) {
- this.value = value;
- this.isBound = isBound;
- this.ngContentIndex = ngContentIndex;
- }
- TextCmd.prototype.visit = function (visitor, context) {
- return visitor.visitText(this, context);
- };
- TextCmd = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [String, Boolean, Number])
- ], TextCmd);
- return TextCmd;
- })();
- exports.TextCmd = TextCmd;
- var NgContentCmd = (function () {
- function NgContentCmd(index, ngContentIndex) {
- this.index = index;
- this.ngContentIndex = ngContentIndex;
- this.isBound = false;
- }
- NgContentCmd.prototype.visit = function (visitor, context) {
- return visitor.visitNgContent(this, context);
- };
- NgContentCmd = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [Number, Number])
- ], NgContentCmd);
- return NgContentCmd;
- })();
- exports.NgContentCmd = NgContentCmd;
- var IBeginElementCmd = (function (_super) {
- __extends(IBeginElementCmd, _super);
- function IBeginElementCmd() {
- _super.apply(this, arguments);
- }
- Object.defineProperty(IBeginElementCmd.prototype, "variableNameAndValues", {
- get: function () { return exceptions_1.unimplemented(); },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(IBeginElementCmd.prototype, "eventTargetAndNames", {
- get: function () { return exceptions_1.unimplemented(); },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(IBeginElementCmd.prototype, "directives", {
- get: function () { return exceptions_1.unimplemented(); },
- enumerable: true,
- configurable: true
- });
- return IBeginElementCmd;
- })(api_1.RenderBeginElementCmd);
- exports.IBeginElementCmd = IBeginElementCmd;
- var BeginElementCmd = (function () {
- function BeginElementCmd(name, attrNameAndValues, eventTargetAndNames, variableNameAndValues, directives, isBound, ngContentIndex) {
- this.name = name;
- this.attrNameAndValues = attrNameAndValues;
- this.eventTargetAndNames = eventTargetAndNames;
- this.variableNameAndValues = variableNameAndValues;
- this.directives = directives;
- this.isBound = isBound;
- this.ngContentIndex = ngContentIndex;
- }
- BeginElementCmd.prototype.visit = function (visitor, context) {
- return visitor.visitBeginElement(this, context);
- };
- BeginElementCmd = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [String, Array, Array, Array, Array, Boolean, Number])
- ], BeginElementCmd);
- return BeginElementCmd;
- })();
- exports.BeginElementCmd = BeginElementCmd;
- var EndElementCmd = (function () {
- function EndElementCmd() {
- }
- EndElementCmd.prototype.visit = function (visitor, context) {
- return visitor.visitEndElement(context);
- };
- EndElementCmd = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [])
- ], EndElementCmd);
- return EndElementCmd;
- })();
- exports.EndElementCmd = EndElementCmd;
- var BeginComponentCmd = (function () {
- function BeginComponentCmd(name, attrNameAndValues, eventTargetAndNames, variableNameAndValues, directives, encapsulation, ngContentIndex,
- // Note: the template needs to be stored as a function
- // so that we can resolve cycles
- templateGetter /*() => CompiledComponentTemplate*/) {
- this.name = name;
- this.attrNameAndValues = attrNameAndValues;
- this.eventTargetAndNames = eventTargetAndNames;
- this.variableNameAndValues = variableNameAndValues;
- this.directives = directives;
- this.encapsulation = encapsulation;
- this.ngContentIndex = ngContentIndex;
- this.templateGetter = templateGetter;
- this.isBound = true;
- }
- Object.defineProperty(BeginComponentCmd.prototype, "templateId", {
- get: function () { return this.templateGetter().id; },
- enumerable: true,
- configurable: true
- });
- BeginComponentCmd.prototype.visit = function (visitor, context) {
- return visitor.visitBeginComponent(this, context);
- };
- BeginComponentCmd = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [String, Array, Array, Array, Array, Number, Number, Function])
- ], BeginComponentCmd);
- return BeginComponentCmd;
- })();
- exports.BeginComponentCmd = BeginComponentCmd;
- var EndComponentCmd = (function () {
- function EndComponentCmd() {
- }
- EndComponentCmd.prototype.visit = function (visitor, context) {
- return visitor.visitEndComponent(context);
- };
- EndComponentCmd = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [])
- ], EndComponentCmd);
- return EndComponentCmd;
- })();
- exports.EndComponentCmd = EndComponentCmd;
- var EmbeddedTemplateCmd = (function () {
- function EmbeddedTemplateCmd(attrNameAndValues, variableNameAndValues, directives, isMerged, ngContentIndex, changeDetectorFactory, children) {
- this.attrNameAndValues = attrNameAndValues;
- this.variableNameAndValues = variableNameAndValues;
- this.directives = directives;
- this.isMerged = isMerged;
- this.ngContentIndex = ngContentIndex;
- this.changeDetectorFactory = changeDetectorFactory;
- this.children = children;
- this.isBound = true;
- this.name = null;
- this.eventTargetAndNames = EMPTY_ARR;
- }
- EmbeddedTemplateCmd.prototype.visit = function (visitor, context) {
- return visitor.visitEmbeddedTemplate(this, context);
- };
- EmbeddedTemplateCmd = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [Array, Array, Array, Boolean, Number, Function, Array])
- ], EmbeddedTemplateCmd);
- return EmbeddedTemplateCmd;
- })();
- exports.EmbeddedTemplateCmd = EmbeddedTemplateCmd;
- function visitAllCommands(visitor, cmds, context) {
- if (context === void 0) { context = null; }
- for (var i = 0; i < cmds.length; i++) {
- cmds[i].visit(visitor, context);
- }
- }
- exports.visitAllCommands = visitAllCommands;
- /***/ },
- /* 97 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var di_1 = __webpack_require__(6);
- var lang_1 = __webpack_require__(5);
- var Console = (function () {
- function Console() {
- }
- Console.prototype.log = function (message) { lang_1.print(message); };
- Console = __decorate([
- di_1.Injectable(),
- __metadata('design:paramtypes', [])
- ], Console);
- return Console;
- })();
- exports.Console = Console;
- /***/ },
- /* 98 */
- /***/ function(module, exports, __webpack_require__) {
- // Public API for Zone
- var ng_zone_1 = __webpack_require__(66);
- exports.NgZone = ng_zone_1.NgZone;
- exports.NgZoneError = ng_zone_1.NgZoneError;
- /***/ },
- /* 99 */
- /***/ function(module, exports, __webpack_require__) {
- // Public API for render
- var api_1 = __webpack_require__(72);
- exports.Renderer = api_1.Renderer;
- exports.RenderViewRef = api_1.RenderViewRef;
- exports.RenderProtoViewRef = api_1.RenderProtoViewRef;
- exports.RenderFragmentRef = api_1.RenderFragmentRef;
- exports.RenderViewWithFragments = api_1.RenderViewWithFragments;
- exports.RenderTemplateCmd = api_1.RenderTemplateCmd;
- exports.RenderTextCmd = api_1.RenderTextCmd;
- exports.RenderNgContentCmd = api_1.RenderNgContentCmd;
- exports.RenderBeginElementCmd = api_1.RenderBeginElementCmd;
- exports.RenderBeginComponentCmd = api_1.RenderBeginComponentCmd;
- exports.RenderEmbeddedTemplateCmd = api_1.RenderEmbeddedTemplateCmd;
- exports.RenderBeginCmd = api_1.RenderBeginCmd;
- exports.RenderComponentTemplate = api_1.RenderComponentTemplate;
- /***/ },
- /* 100 */
- /***/ function(module, exports, __webpack_require__) {
- // Public API for compiler
- var directive_resolver_1 = __webpack_require__(92);
- exports.DirectiveResolver = directive_resolver_1.DirectiveResolver;
- var view_resolver_1 = __webpack_require__(93);
- exports.ViewResolver = view_resolver_1.ViewResolver;
- var compiler_1 = __webpack_require__(70);
- exports.Compiler = compiler_1.Compiler;
- var view_manager_1 = __webpack_require__(81);
- exports.AppViewManager = view_manager_1.AppViewManager;
- var query_list_1 = __webpack_require__(90);
- exports.QueryList = query_list_1.QueryList;
- var dynamic_component_loader_1 = __webpack_require__(69);
- exports.DynamicComponentLoader = dynamic_component_loader_1.DynamicComponentLoader;
- var element_ref_1 = __webpack_require__(83);
- exports.ElementRef = element_ref_1.ElementRef;
- var template_ref_1 = __webpack_require__(84);
- exports.TemplateRef = template_ref_1.TemplateRef;
- var view_ref_1 = __webpack_require__(77);
- exports.ViewRef = view_ref_1.ViewRef;
- exports.ProtoViewRef = view_ref_1.ProtoViewRef;
- var view_container_ref_1 = __webpack_require__(87);
- exports.ViewContainerRef = view_container_ref_1.ViewContainerRef;
- var dynamic_component_loader_2 = __webpack_require__(69);
- exports.ComponentRef = dynamic_component_loader_2.ComponentRef;
- /***/ },
- /* 101 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var view_1 = __webpack_require__(76);
- var view_ref_1 = __webpack_require__(77);
- /**
- * A DebugElement contains information from the Angular compiler about an
- * element and provides access to the corresponding ElementInjector and
- * underlying DOM Element, as well as a way to query for children.
- *
- * A DebugElement can be obtained from a {@link ComponentFixture} or from an
- * {@link ElementRef} via {@link inspectElement}.
- */
- var DebugElement = (function () {
- function DebugElement() {
- }
- Object.defineProperty(DebugElement.prototype, "componentInstance", {
- /**
- * Return the instance of the component associated with this element, if any.
- */
- get: function () { return exceptions_1.unimplemented(); },
- enumerable: true,
- configurable: true
- });
- ;
- Object.defineProperty(DebugElement.prototype, "nativeElement", {
- /**
- * Return the native HTML element for this DebugElement.
- */
- get: function () { return exceptions_1.unimplemented(); },
- enumerable: true,
- configurable: true
- });
- ;
- Object.defineProperty(DebugElement.prototype, "elementRef", {
- /**
- * Return an Angular {@link ElementRef} for this element.
- */
- get: function () { return exceptions_1.unimplemented(); },
- enumerable: true,
- configurable: true
- });
- ;
- Object.defineProperty(DebugElement.prototype, "children", {
- /**
- * Get child DebugElements from within the Light DOM.
- *
- * @return {DebugElement[]}
- */
- get: function () { return exceptions_1.unimplemented(); },
- enumerable: true,
- configurable: true
- });
- ;
- Object.defineProperty(DebugElement.prototype, "componentViewChildren", {
- /**
- * Get the root DebugElement children of a component. Returns an empty
- * list if the current DebugElement is not a component root.
- *
- * @return {DebugElement[]}
- */
- get: function () { return exceptions_1.unimplemented(); },
- enumerable: true,
- configurable: true
- });
- ;
- /**
- * Return the first descendant TestElement matching the given predicate
- * and scope.
- *
- * @param {Function: boolean} predicate
- * @param {Scope} scope
- *
- * @return {DebugElement}
- */
- DebugElement.prototype.query = function (predicate, scope) {
- if (scope === void 0) { scope = Scope.all; }
- var results = this.queryAll(predicate, scope);
- return results.length > 0 ? results[0] : null;
- };
- /**
- * Return descendant TestElememts matching the given predicate
- * and scope.
- *
- * @param {Function: boolean} predicate
- * @param {Scope} scope
- *
- * @return {DebugElement[]}
- */
- DebugElement.prototype.queryAll = function (predicate, scope) {
- if (scope === void 0) { scope = Scope.all; }
- var elementsInScope = scope(this);
- return elementsInScope.filter(predicate);
- };
- return DebugElement;
- })();
- exports.DebugElement = DebugElement;
- var DebugElement_ = (function (_super) {
- __extends(DebugElement_, _super);
- function DebugElement_(_parentView, _boundElementIndex) {
- _super.call(this);
- this._parentView = _parentView;
- this._boundElementIndex = _boundElementIndex;
- this._elementInjector = this._parentView.elementInjectors[this._boundElementIndex];
- }
- Object.defineProperty(DebugElement_.prototype, "componentInstance", {
- get: function () {
- if (!lang_1.isPresent(this._elementInjector)) {
- return null;
- }
- return this._elementInjector.getComponent();
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(DebugElement_.prototype, "nativeElement", {
- get: function () { return this.elementRef.nativeElement; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(DebugElement_.prototype, "elementRef", {
- get: function () { return this._parentView.elementRefs[this._boundElementIndex]; },
- enumerable: true,
- configurable: true
- });
- DebugElement_.prototype.getDirectiveInstance = function (directiveIndex) {
- return this._elementInjector.getDirectiveAtIndex(directiveIndex);
- };
- Object.defineProperty(DebugElement_.prototype, "children", {
- get: function () {
- return this._getChildElements(this._parentView, this._boundElementIndex);
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(DebugElement_.prototype, "componentViewChildren", {
- get: function () {
- var shadowView = this._parentView.getNestedView(this._boundElementIndex);
- if (!lang_1.isPresent(shadowView) || shadowView.proto.type !== view_1.ViewType.COMPONENT) {
- // The current element is not a component.
- return [];
- }
- return this._getChildElements(shadowView, null);
- },
- enumerable: true,
- configurable: true
- });
- DebugElement_.prototype.triggerEventHandler = function (eventName, eventObj) {
- this._parentView.triggerEventHandlers(eventName, eventObj, this._boundElementIndex);
- };
- DebugElement_.prototype.hasDirective = function (type) {
- if (!lang_1.isPresent(this._elementInjector)) {
- return false;
- }
- return this._elementInjector.hasDirective(type);
- };
- DebugElement_.prototype.inject = function (type) {
- if (!lang_1.isPresent(this._elementInjector)) {
- return null;
- }
- return this._elementInjector.get(type);
- };
- DebugElement_.prototype.getLocal = function (name) { return this._parentView.locals.get(name); };
- /** @internal */
- DebugElement_.prototype._getChildElements = function (view, parentBoundElementIndex) {
- var _this = this;
- var els = [];
- var parentElementBinder = null;
- if (lang_1.isPresent(parentBoundElementIndex)) {
- parentElementBinder = view.proto.elementBinders[parentBoundElementIndex - view.elementOffset];
- }
- for (var i = 0; i < view.proto.elementBinders.length; ++i) {
- var binder = view.proto.elementBinders[i];
- if (binder.parent == parentElementBinder) {
- els.push(new DebugElement_(view, view.elementOffset + i));
- var views = view.viewContainers[view.elementOffset + i];
- if (lang_1.isPresent(views)) {
- views.views.forEach(function (nextView) { els = els.concat(_this._getChildElements(nextView, null)); });
- }
- }
- }
- return els;
- };
- return DebugElement_;
- })(DebugElement);
- exports.DebugElement_ = DebugElement_;
- /**
- * Returns a {@link DebugElement} for an {@link ElementRef}.
- *
- * @param {ElementRef}: elementRef
- * @return {DebugElement}
- */
- function inspectElement(elementRef) {
- return new DebugElement_(view_ref_1.internalView(elementRef.parentView), elementRef.boundElementIndex);
- }
- exports.inspectElement = inspectElement;
- /**
- * Maps an array of {@link DebugElement}s to an array of native DOM elements.
- */
- function asNativeElements(arr) {
- return arr.map(function (debugEl) { return debugEl.nativeElement; });
- }
- exports.asNativeElements = asNativeElements;
- /**
- * Set of scope functions used with {@link DebugElement}'s query functionality.
- */
- var Scope = (function () {
- function Scope() {
- }
- /**
- * Scope queries to both the light dom and view of an element and its
- * children.
- *
- * ## Example
- *
- * {@example core/debug/ts/debug_element/debug_element.ts region='scope_all'}
- */
- Scope.all = function (debugElement) {
- var scope = [];
- scope.push(debugElement);
- debugElement.children.forEach(function (child) { return scope = scope.concat(Scope.all(child)); });
- debugElement.componentViewChildren.forEach(function (child) { return scope = scope.concat(Scope.all(child)); });
- return scope;
- };
- /**
- * Scope queries to the light dom of an element and its children.
- *
- * ## Example
- *
- * {@example core/debug/ts/debug_element/debug_element.ts region='scope_light'}
- */
- Scope.light = function (debugElement) {
- var scope = [];
- debugElement.children.forEach(function (child) {
- scope.push(child);
- scope = scope.concat(Scope.light(child));
- });
- return scope;
- };
- /**
- * Scope queries to the view of an element of its children.
- *
- * ## Example
- *
- * {@example core/debug/ts/debug_element/debug_element.ts region='scope_view'}
- */
- Scope.view = function (debugElement) {
- var scope = [];
- debugElement.componentViewChildren.forEach(function (child) {
- scope.push(child);
- scope = scope.concat(Scope.light(child));
- });
- return scope;
- };
- return Scope;
- })();
- exports.Scope = Scope;
- /***/ },
- /* 102 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var di_1 = __webpack_require__(6);
- var console_1 = __webpack_require__(97);
- var reflection_1 = __webpack_require__(16);
- var testability_1 = __webpack_require__(68);
- function _reflector() {
- return reflection_1.reflector;
- }
- /**
- * A default set of providers which should be included in any Angular platform.
- */
- exports.PLATFORM_COMMON_PROVIDERS = lang_1.CONST_EXPR([new di_1.Provider(reflection_1.Reflector, { useFactory: _reflector, deps: [] }), testability_1.TestabilityRegistry, console_1.Console]);
- /***/ },
- /* 103 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var di_1 = __webpack_require__(6);
- var application_tokens_1 = __webpack_require__(67);
- var change_detection_1 = __webpack_require__(25);
- var view_pool_1 = __webpack_require__(85);
- var view_manager_1 = __webpack_require__(81);
- var view_manager_2 = __webpack_require__(81);
- var view_manager_utils_1 = __webpack_require__(82);
- var view_resolver_1 = __webpack_require__(93);
- var view_listener_1 = __webpack_require__(86);
- var proto_view_factory_1 = __webpack_require__(71);
- var directive_resolver_1 = __webpack_require__(92);
- var pipe_resolver_1 = __webpack_require__(94);
- var compiler_1 = __webpack_require__(70);
- var compiler_2 = __webpack_require__(70);
- var dynamic_component_loader_1 = __webpack_require__(69);
- var dynamic_component_loader_2 = __webpack_require__(69);
- /**
- * A default set of providers which should be included in any Angular
- * application, regardless of the platform it runs onto.
- */
- exports.APPLICATION_COMMON_PROVIDERS = lang_1.CONST_EXPR([
- new di_1.Provider(compiler_1.Compiler, { useClass: compiler_2.Compiler_ }),
- application_tokens_1.APP_ID_RANDOM_PROVIDER,
- view_pool_1.AppViewPool,
- new di_1.Provider(view_pool_1.APP_VIEW_POOL_CAPACITY, { useValue: 10000 }),
- new di_1.Provider(view_manager_1.AppViewManager, { useClass: view_manager_2.AppViewManager_ }),
- view_manager_utils_1.AppViewManagerUtils,
- view_listener_1.AppViewListener,
- proto_view_factory_1.ProtoViewFactory,
- view_resolver_1.ViewResolver,
- new di_1.Provider(change_detection_1.IterableDiffers, { useValue: change_detection_1.defaultIterableDiffers }),
- new di_1.Provider(change_detection_1.KeyValueDiffers, { useValue: change_detection_1.defaultKeyValueDiffers }),
- directive_resolver_1.DirectiveResolver,
- pipe_resolver_1.PipeResolver,
- new di_1.Provider(dynamic_component_loader_1.DynamicComponentLoader, { useClass: dynamic_component_loader_2.DynamicComponentLoader_ })
- ]);
- /***/ },
- /* 104 */
- /***/ function(module, exports, __webpack_require__) {
- function __export(m) {
- for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
- }
- __export(__webpack_require__(105));
- __export(__webpack_require__(115));
- __export(__webpack_require__(123));
- __export(__webpack_require__(146));
- /***/ },
- /* 105 */
- /***/ function(module, exports, __webpack_require__) {
- /**
- * @module
- * @description
- * This module provides a set of common Pipes.
- */
- var async_pipe_1 = __webpack_require__(106);
- var uppercase_pipe_1 = __webpack_require__(108);
- var lowercase_pipe_1 = __webpack_require__(109);
- var json_pipe_1 = __webpack_require__(110);
- var slice_pipe_1 = __webpack_require__(111);
- var date_pipe_1 = __webpack_require__(112);
- var number_pipe_1 = __webpack_require__(114);
- var lang_1 = __webpack_require__(5);
- var async_pipe_2 = __webpack_require__(106);
- exports.AsyncPipe = async_pipe_2.AsyncPipe;
- var date_pipe_2 = __webpack_require__(112);
- exports.DatePipe = date_pipe_2.DatePipe;
- var json_pipe_2 = __webpack_require__(110);
- exports.JsonPipe = json_pipe_2.JsonPipe;
- var slice_pipe_2 = __webpack_require__(111);
- exports.SlicePipe = slice_pipe_2.SlicePipe;
- var lowercase_pipe_2 = __webpack_require__(109);
- exports.LowerCasePipe = lowercase_pipe_2.LowerCasePipe;
- var number_pipe_2 = __webpack_require__(114);
- exports.NumberPipe = number_pipe_2.NumberPipe;
- exports.DecimalPipe = number_pipe_2.DecimalPipe;
- exports.PercentPipe = number_pipe_2.PercentPipe;
- exports.CurrencyPipe = number_pipe_2.CurrencyPipe;
- var uppercase_pipe_2 = __webpack_require__(108);
- exports.UpperCasePipe = uppercase_pipe_2.UpperCasePipe;
- /**
- * A collection of Angular core pipes that are likely to be used in each and every
- * application.
- *
- * This collection can be used to quickly enumerate all the built-in pipes in the `pipes`
- * property of the `@Component` or `@View` decorators.
- */
- exports.COMMON_PIPES = lang_1.CONST_EXPR([
- async_pipe_1.AsyncPipe,
- uppercase_pipe_1.UpperCasePipe,
- lowercase_pipe_1.LowerCasePipe,
- json_pipe_1.JsonPipe,
- slice_pipe_1.SlicePipe,
- number_pipe_1.DecimalPipe,
- number_pipe_1.PercentPipe,
- number_pipe_1.CurrencyPipe,
- date_pipe_1.DatePipe
- ]);
- /***/ },
- /* 106 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var lang_1 = __webpack_require__(5);
- var async_1 = __webpack_require__(60);
- var core_1 = __webpack_require__(2);
- var invalid_pipe_argument_exception_1 = __webpack_require__(107);
- var ObservableStrategy = (function () {
- function ObservableStrategy() {
- }
- ObservableStrategy.prototype.createSubscription = function (async, updateLatestValue) {
- return async_1.ObservableWrapper.subscribe(async, updateLatestValue, function (e) { throw e; });
- };
- ObservableStrategy.prototype.dispose = function (subscription) { async_1.ObservableWrapper.dispose(subscription); };
- ObservableStrategy.prototype.onDestroy = function (subscription) { async_1.ObservableWrapper.dispose(subscription); };
- return ObservableStrategy;
- })();
- var PromiseStrategy = (function () {
- function PromiseStrategy() {
- }
- PromiseStrategy.prototype.createSubscription = function (async, updateLatestValue) {
- return async.then(updateLatestValue);
- };
- PromiseStrategy.prototype.dispose = function (subscription) { };
- PromiseStrategy.prototype.onDestroy = function (subscription) { };
- return PromiseStrategy;
- })();
- var _promiseStrategy = new PromiseStrategy();
- var _observableStrategy = new ObservableStrategy();
- /**
- * The `async` pipe subscribes to an Observable or Promise and returns the latest value it has
- * emitted.
- * When a new value is emitted, the `async` pipe marks the component to be checked for changes.
- *
- * ### Example
- *
- * This example binds a `Promise` to the view. Clicking the `Resolve` button resolves the
- * promise.
- *
- * {@example core/pipes/ts/async_pipe/async_pipe_example.ts region='AsyncPipe'}
- *
- * It's also possible to use `async` with Observables. The example below binds the `time` Observable
- * to the view. Every 500ms, the `time` Observable updates the view with the current time.
- *
- * ```typescript
- * ```
- */
- var AsyncPipe = (function () {
- function AsyncPipe(_ref) {
- /** @internal */
- this._latestValue = null;
- /** @internal */
- this._latestReturnedValue = null;
- /** @internal */
- this._subscription = null;
- /** @internal */
- this._obj = null;
- this._strategy = null;
- this._ref = _ref;
- }
- AsyncPipe.prototype.ngOnDestroy = function () {
- if (lang_1.isPresent(this._subscription)) {
- this._dispose();
- }
- };
- AsyncPipe.prototype.transform = function (obj, args) {
- if (lang_1.isBlank(this._obj)) {
- if (lang_1.isPresent(obj)) {
- this._subscribe(obj);
- }
- return this._latestValue;
- }
- if (obj !== this._obj) {
- this._dispose();
- return this.transform(obj);
- }
- if (this._latestValue === this._latestReturnedValue) {
- return this._latestReturnedValue;
- }
- else {
- this._latestReturnedValue = this._latestValue;
- return core_1.WrappedValue.wrap(this._latestValue);
- }
- };
- /** @internal */
- AsyncPipe.prototype._subscribe = function (obj) {
- var _this = this;
- this._obj = obj;
- this._strategy = this._selectStrategy(obj);
- this._subscription =
- this._strategy.createSubscription(obj, function (value) { return _this._updateLatestValue(obj, value); });
- };
- /** @internal */
- AsyncPipe.prototype._selectStrategy = function (obj) {
- if (lang_1.isPromise(obj)) {
- return _promiseStrategy;
- }
- else if (async_1.ObservableWrapper.isObservable(obj)) {
- return _observableStrategy;
- }
- else {
- throw new invalid_pipe_argument_exception_1.InvalidPipeArgumentException(AsyncPipe, obj);
- }
- };
- /** @internal */
- AsyncPipe.prototype._dispose = function () {
- this._strategy.dispose(this._subscription);
- this._latestValue = null;
- this._latestReturnedValue = null;
- this._subscription = null;
- this._obj = null;
- };
- /** @internal */
- AsyncPipe.prototype._updateLatestValue = function (async, value) {
- if (async === this._obj) {
- this._latestValue = value;
- this._ref.markForCheck();
- }
- };
- AsyncPipe = __decorate([
- core_1.Pipe({ name: 'async', pure: false }),
- core_1.Injectable(),
- __metadata('design:paramtypes', [core_1.ChangeDetectorRef])
- ], AsyncPipe);
- return AsyncPipe;
- })();
- exports.AsyncPipe = AsyncPipe;
- /***/ },
- /* 107 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var InvalidPipeArgumentException = (function (_super) {
- __extends(InvalidPipeArgumentException, _super);
- function InvalidPipeArgumentException(type, value) {
- _super.call(this, "Invalid argument '" + value + "' for pipe '" + lang_1.stringify(type) + "'");
- }
- return InvalidPipeArgumentException;
- })(exceptions_1.BaseException);
- exports.InvalidPipeArgumentException = InvalidPipeArgumentException;
- /***/ },
- /* 108 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var lang_1 = __webpack_require__(5);
- var core_1 = __webpack_require__(2);
- var invalid_pipe_argument_exception_1 = __webpack_require__(107);
- /**
- * Implements uppercase transforms to text.
- *
- * ### Example
- *
- * {@example core/pipes/ts/lowerupper_pipe/lowerupper_pipe_example.ts region='LowerUpperPipe'}
- */
- var UpperCasePipe = (function () {
- function UpperCasePipe() {
- }
- UpperCasePipe.prototype.transform = function (value, args) {
- if (args === void 0) { args = null; }
- if (lang_1.isBlank(value))
- return value;
- if (!lang_1.isString(value)) {
- throw new invalid_pipe_argument_exception_1.InvalidPipeArgumentException(UpperCasePipe, value);
- }
- return value.toUpperCase();
- };
- UpperCasePipe = __decorate([
- lang_1.CONST(),
- core_1.Pipe({ name: 'uppercase' }),
- core_1.Injectable(),
- __metadata('design:paramtypes', [])
- ], UpperCasePipe);
- return UpperCasePipe;
- })();
- exports.UpperCasePipe = UpperCasePipe;
- /***/ },
- /* 109 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var lang_1 = __webpack_require__(5);
- var core_1 = __webpack_require__(2);
- var invalid_pipe_argument_exception_1 = __webpack_require__(107);
- /**
- * Transforms text to lowercase.
- *
- * ### Example
- *
- * {@example core/pipes/ts/lowerupper_pipe/lowerupper_pipe_example.ts region='LowerUpperPipe'}
- */
- var LowerCasePipe = (function () {
- function LowerCasePipe() {
- }
- LowerCasePipe.prototype.transform = function (value, args) {
- if (args === void 0) { args = null; }
- if (lang_1.isBlank(value))
- return value;
- if (!lang_1.isString(value)) {
- throw new invalid_pipe_argument_exception_1.InvalidPipeArgumentException(LowerCasePipe, value);
- }
- return value.toLowerCase();
- };
- LowerCasePipe = __decorate([
- lang_1.CONST(),
- core_1.Pipe({ name: 'lowercase' }),
- core_1.Injectable(),
- __metadata('design:paramtypes', [])
- ], LowerCasePipe);
- return LowerCasePipe;
- })();
- exports.LowerCasePipe = LowerCasePipe;
- /***/ },
- /* 110 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var lang_1 = __webpack_require__(5);
- var core_1 = __webpack_require__(2);
- /**
- * Transforms any input value using `JSON.stringify`. Useful for debugging.
- *
- * ### Example
- * {@example core/pipes/ts/json_pipe/json_pipe_example.ts region='JsonPipe'}
- */
- var JsonPipe = (function () {
- function JsonPipe() {
- }
- JsonPipe.prototype.transform = function (value, args) {
- if (args === void 0) { args = null; }
- return lang_1.Json.stringify(value);
- };
- JsonPipe = __decorate([
- lang_1.CONST(),
- core_1.Pipe({ name: 'json', pure: false }),
- core_1.Injectable(),
- __metadata('design:paramtypes', [])
- ], JsonPipe);
- return JsonPipe;
- })();
- exports.JsonPipe = JsonPipe;
- /***/ },
- /* 111 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var collection_1 = __webpack_require__(12);
- var core_1 = __webpack_require__(2);
- var invalid_pipe_argument_exception_1 = __webpack_require__(107);
- /**
- * Creates a new List or String containing only a subset (slice) of the
- * elements.
- *
- * The starting index of the subset to return is specified by the `start` parameter.
- *
- * The ending index of the subset to return is specified by the optional `end` parameter.
- *
- * ### Usage
- *
- * expression | slice:start[:end]
- *
- * All behavior is based on the expected behavior of the JavaScript API
- * Array.prototype.slice() and String.prototype.slice()
- *
- * Where the input expression is a [List] or [String], and `start` is:
- *
- * - **a positive integer**: return the item at _start_ index and all items after
- * in the list or string expression.
- * - **a negative integer**: return the item at _start_ index from the end and all items after
- * in the list or string expression.
- * - **`|start|` greater than the size of the expression**: return an empty list or string.
- * - **`|start|` negative greater than the size of the expression**: return entire list or
- * string expression.
- *
- * and where `end` is:
- *
- * - **omitted**: return all items until the end of the input
- * - **a positive integer**: return all items before _end_ index of the list or string
- * expression.
- * - **a negative integer**: return all items before _end_ index from the end of the list
- * or string expression.
- *
- * When operating on a [List], the returned list is always a copy even when all
- * the elements are being returned.
- *
- * ## List Example
- *
- * This `ngFor` example:
- *
- * {@example core/pipes/ts/slice_pipe/slice_pipe_example.ts region='SlicePipe_list'}
- *
- * produces the following:
- *
- * <li>b</li>
- * <li>c</li>
- *
- * ## String Examples
- *
- * {@example core/pipes/ts/slice_pipe/slice_pipe_example.ts region='SlicePipe_string'}
- */
- var SlicePipe = (function () {
- function SlicePipe() {
- }
- SlicePipe.prototype.transform = function (value, args) {
- if (args === void 0) { args = null; }
- if (lang_1.isBlank(args) || args.length == 0) {
- throw new exceptions_1.BaseException('Slice pipe requires one argument');
- }
- if (!this.supports(value)) {
- throw new invalid_pipe_argument_exception_1.InvalidPipeArgumentException(SlicePipe, value);
- }
- if (lang_1.isBlank(value))
- return value;
- var start = args[0];
- var end = args.length > 1 ? args[1] : null;
- if (lang_1.isString(value)) {
- return lang_1.StringWrapper.slice(value, start, end);
- }
- return collection_1.ListWrapper.slice(value, start, end);
- };
- SlicePipe.prototype.supports = function (obj) { return lang_1.isString(obj) || lang_1.isArray(obj); };
- SlicePipe = __decorate([
- core_1.Pipe({ name: 'slice', pure: false }),
- core_1.Injectable(),
- __metadata('design:paramtypes', [])
- ], SlicePipe);
- return SlicePipe;
- })();
- exports.SlicePipe = SlicePipe;
- /***/ },
- /* 112 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var lang_1 = __webpack_require__(5);
- var intl_1 = __webpack_require__(113);
- var core_1 = __webpack_require__(2);
- var collection_1 = __webpack_require__(12);
- var invalid_pipe_argument_exception_1 = __webpack_require__(107);
- // TODO: move to a global configurable location along with other i18n components.
- var defaultLocale = 'en-US';
- /**
- * Formats a date value to a string based on the requested format.
- *
- * WARNINGS:
- * - this pipe is marked as pure hence it will not be re-evaluated when the input is mutated.
- * Instead users should treat the date as an immutable object and change the reference when the
- * pipe needs to re-run (this is to avoid reformatting the date on every change detection run
- * which would be an expensive operation).
- * - this pipe uses the Internationalization API. Therefore it is only reliable in Chrome and Opera
- * browsers.
- *
- * ## Usage
- *
- * expression | date[:format]
- *
- * where `expression` is a date object or a number (milliseconds since UTC epoch) and
- * `format` indicates which date/time components to include:
- *
- * | Component | Symbol | Short Form | Long Form | Numeric | 2-digit |
- * |-----------|:------:|--------------|-------------------|-----------|-----------|
- * | era | G | G (AD) | GGGG (Anno Domini)| - | - |
- * | year | y | - | - | y (2015) | yy (15) |
- * | month | M | MMM (Sep) | MMMM (September) | M (9) | MM (09) |
- * | day | d | - | - | d (3) | dd (03) |
- * | weekday | E | EEE (Sun) | EEEE (Sunday) | - | - |
- * | hour | j | - | - | j (13) | jj (13) |
- * | hour12 | h | - | - | h (1 PM) | hh (01 PM)|
- * | hour24 | H | - | - | H (13) | HH (13) |
- * | minute | m | - | - | m (5) | mm (05) |
- * | second | s | - | - | s (9) | ss (09) |
- * | timezone | z | - | z (Pacific Standard Time)| - | - |
- * | timezone | Z | Z (GMT-8:00) | - | - | - |
- *
- * In javascript, only the components specified will be respected (not the ordering,
- * punctuations, ...) and details of the formatting will be dependent on the locale.
- * On the other hand in Dart version, you can also include quoted text as well as some extra
- * date/time components such as quarter. For more information see:
- * https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/intl/intl.DateFormat.
- *
- * `format` can also be one of the following predefined formats:
- *
- * - `'medium'`: equivalent to `'yMMMdjms'` (e.g. Sep 3, 2010, 12:05:08 PM for en-US)
- * - `'short'`: equivalent to `'yMdjm'` (e.g. 9/3/2010, 12:05 PM for en-US)
- * - `'fullDate'`: equivalent to `'yMMMMEEEEd'` (e.g. Friday, September 3, 2010 for en-US)
- * - `'longDate'`: equivalent to `'yMMMMd'` (e.g. September 3, 2010)
- * - `'mediumDate'`: equivalent to `'yMMMd'` (e.g. Sep 3, 2010 for en-US)
- * - `'shortDate'`: equivalent to `'yMd'` (e.g. 9/3/2010 for en-US)
- * - `'mediumTime'`: equivalent to `'jms'` (e.g. 12:05:08 PM for en-US)
- * - `'shortTime'`: equivalent to `'jm'` (e.g. 12:05 PM for en-US)
- *
- * Timezone of the formatted text will be the local system timezone of the end-users machine.
- *
- * ### Examples
- *
- * Assuming `dateObj` is (year: 2015, month: 6, day: 15, hour: 21, minute: 43, second: 11)
- * in the _local_ time and locale is 'en-US':
- *
- * ```
- * {{ dateObj | date }} // output is 'Jun 15, 2015'
- * {{ dateObj | date:'medium' }} // output is 'Jun 15, 2015, 9:43:11 PM'
- * {{ dateObj | date:'shortTime' }} // output is '9:43 PM'
- * {{ dateObj | date:'mmss' }} // output is '43:11'
- * ```
- *
- * {@example core/pipes/ts/date_pipe/date_pipe_example.ts region='DatePipe'}
- */
- var DatePipe = (function () {
- function DatePipe() {
- }
- DatePipe.prototype.transform = function (value, args) {
- if (lang_1.isBlank(value))
- return null;
- if (!this.supports(value)) {
- throw new invalid_pipe_argument_exception_1.InvalidPipeArgumentException(DatePipe, value);
- }
- var pattern = lang_1.isPresent(args) && args.length > 0 ? args[0] : 'mediumDate';
- if (lang_1.isNumber(value)) {
- value = lang_1.DateWrapper.fromMillis(value);
- }
- if (collection_1.StringMapWrapper.contains(DatePipe._ALIASES, pattern)) {
- pattern = collection_1.StringMapWrapper.get(DatePipe._ALIASES, pattern);
- }
- return intl_1.DateFormatter.format(value, defaultLocale, pattern);
- };
- DatePipe.prototype.supports = function (obj) { return lang_1.isDate(obj) || lang_1.isNumber(obj); };
- /** @internal */
- DatePipe._ALIASES = {
- 'medium': 'yMMMdjms',
- 'short': 'yMdjm',
- 'fullDate': 'yMMMMEEEEd',
- 'longDate': 'yMMMMd',
- 'mediumDate': 'yMMMd',
- 'shortDate': 'yMd',
- 'mediumTime': 'jms',
- 'shortTime': 'jm'
- };
- DatePipe = __decorate([
- lang_1.CONST(),
- core_1.Pipe({ name: 'date', pure: true }),
- core_1.Injectable(),
- __metadata('design:paramtypes', [])
- ], DatePipe);
- return DatePipe;
- })();
- exports.DatePipe = DatePipe;
- /***/ },
- /* 113 */
- /***/ function(module, exports) {
- (function (NumberFormatStyle) {
- NumberFormatStyle[NumberFormatStyle["Decimal"] = 0] = "Decimal";
- NumberFormatStyle[NumberFormatStyle["Percent"] = 1] = "Percent";
- NumberFormatStyle[NumberFormatStyle["Currency"] = 2] = "Currency";
- })(exports.NumberFormatStyle || (exports.NumberFormatStyle = {}));
- var NumberFormatStyle = exports.NumberFormatStyle;
- var NumberFormatter = (function () {
- function NumberFormatter() {
- }
- NumberFormatter.format = function (num, locale, style, _a) {
- var _b = _a === void 0 ? {} : _a, _c = _b.minimumIntegerDigits, minimumIntegerDigits = _c === void 0 ? 1 : _c, _d = _b.minimumFractionDigits, minimumFractionDigits = _d === void 0 ? 0 : _d, _e = _b.maximumFractionDigits, maximumFractionDigits = _e === void 0 ? 3 : _e, currency = _b.currency, _f = _b.currencyAsSymbol, currencyAsSymbol = _f === void 0 ? false : _f;
- var intlOptions = {
- minimumIntegerDigits: minimumIntegerDigits,
- minimumFractionDigits: minimumFractionDigits,
- maximumFractionDigits: maximumFractionDigits
- };
- intlOptions.style = NumberFormatStyle[style].toLowerCase();
- if (style == NumberFormatStyle.Currency) {
- intlOptions.currency = currency;
- intlOptions.currencyDisplay = currencyAsSymbol ? 'symbol' : 'code';
- }
- return new Intl.NumberFormat(locale, intlOptions).format(num);
- };
- return NumberFormatter;
- })();
- exports.NumberFormatter = NumberFormatter;
- function digitCondition(len) {
- return len == 2 ? '2-digit' : 'numeric';
- }
- function nameCondition(len) {
- return len < 4 ? 'short' : 'long';
- }
- function extractComponents(pattern) {
- var ret = {};
- var i = 0, j;
- while (i < pattern.length) {
- j = i;
- while (j < pattern.length && pattern[j] == pattern[i])
- j++;
- var len = j - i;
- switch (pattern[i]) {
- case 'G':
- ret.era = nameCondition(len);
- break;
- case 'y':
- ret.year = digitCondition(len);
- break;
- case 'M':
- if (len >= 3)
- ret.month = nameCondition(len);
- else
- ret.month = digitCondition(len);
- break;
- case 'd':
- ret.day = digitCondition(len);
- break;
- case 'E':
- ret.weekday = nameCondition(len);
- break;
- case 'j':
- ret.hour = digitCondition(len);
- break;
- case 'h':
- ret.hour = digitCondition(len);
- ret.hour12 = true;
- break;
- case 'H':
- ret.hour = digitCondition(len);
- ret.hour12 = false;
- break;
- case 'm':
- ret.minute = digitCondition(len);
- break;
- case 's':
- ret.second = digitCondition(len);
- break;
- case 'z':
- ret.timeZoneName = 'long';
- break;
- case 'Z':
- ret.timeZoneName = 'short';
- break;
- }
- i = j;
- }
- return ret;
- }
- var dateFormatterCache = new Map();
- var DateFormatter = (function () {
- function DateFormatter() {
- }
- DateFormatter.format = function (date, locale, pattern) {
- var key = locale + pattern;
- if (dateFormatterCache.has(key)) {
- return dateFormatterCache.get(key).format(date);
- }
- var formatter = new Intl.DateTimeFormat(locale, extractComponents(pattern));
- dateFormatterCache.set(key, formatter);
- return formatter.format(date);
- };
- return DateFormatter;
- })();
- exports.DateFormatter = DateFormatter;
- /***/ },
- /* 114 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var intl_1 = __webpack_require__(113);
- var core_1 = __webpack_require__(2);
- var collection_1 = __webpack_require__(12);
- var invalid_pipe_argument_exception_1 = __webpack_require__(107);
- var defaultLocale = 'en-US';
- var _re = lang_1.RegExpWrapper.create('^(\\d+)?\\.((\\d+)(\\-(\\d+))?)?$');
- /**
- * Internal base class for numeric pipes.
- */
- var NumberPipe = (function () {
- function NumberPipe() {
- }
- /** @internal */
- NumberPipe._format = function (value, style, digits, currency, currencyAsSymbol) {
- if (currency === void 0) { currency = null; }
- if (currencyAsSymbol === void 0) { currencyAsSymbol = false; }
- if (lang_1.isBlank(value))
- return null;
- if (!lang_1.isNumber(value)) {
- throw new invalid_pipe_argument_exception_1.InvalidPipeArgumentException(NumberPipe, value);
- }
- var minInt = 1, minFraction = 0, maxFraction = 3;
- if (lang_1.isPresent(digits)) {
- var parts = lang_1.RegExpWrapper.firstMatch(_re, digits);
- if (lang_1.isBlank(parts)) {
- throw new exceptions_1.BaseException(digits + " is not a valid digit info for number pipes");
- }
- if (lang_1.isPresent(parts[1])) {
- minInt = lang_1.NumberWrapper.parseIntAutoRadix(parts[1]);
- }
- if (lang_1.isPresent(parts[3])) {
- minFraction = lang_1.NumberWrapper.parseIntAutoRadix(parts[3]);
- }
- if (lang_1.isPresent(parts[5])) {
- maxFraction = lang_1.NumberWrapper.parseIntAutoRadix(parts[5]);
- }
- }
- return intl_1.NumberFormatter.format(value, defaultLocale, style, {
- minimumIntegerDigits: minInt,
- minimumFractionDigits: minFraction,
- maximumFractionDigits: maxFraction,
- currency: currency,
- currencyAsSymbol: currencyAsSymbol
- });
- };
- NumberPipe = __decorate([
- lang_1.CONST(),
- core_1.Injectable(),
- __metadata('design:paramtypes', [])
- ], NumberPipe);
- return NumberPipe;
- })();
- exports.NumberPipe = NumberPipe;
- /**
- * WARNING: this pipe uses the Internationalization API.
- * Therefore it is only reliable in Chrome and Opera browsers.
- *
- * Formats a number as local text. i.e. group sizing and separator and other locale-specific
- * configurations are based on the active locale.
- *
- * ### Usage
- *
- * expression | number[:digitInfo]
- *
- * where `expression` is a number and `digitInfo` has the following format:
- *
- * {minIntegerDigits}.{minFractionDigits}-{maxFractionDigits}
- *
- * - minIntegerDigits is the minimum number of integer digits to use. Defaults to 1.
- * - minFractionDigits is the minimum number of digits after fraction. Defaults to 0.
- * - maxFractionDigits is the maximum number of digits after fraction. Defaults to 3.
- *
- * For more information on the acceptable range for each of these numbers and other
- * details see your native internationalization library.
- *
- * ### Example
- *
- * {@example core/pipes/ts/number_pipe/number_pipe_example.ts region='NumberPipe'}
- */
- var DecimalPipe = (function (_super) {
- __extends(DecimalPipe, _super);
- function DecimalPipe() {
- _super.apply(this, arguments);
- }
- DecimalPipe.prototype.transform = function (value, args) {
- var digits = collection_1.ListWrapper.first(args);
- return NumberPipe._format(value, intl_1.NumberFormatStyle.Decimal, digits);
- };
- DecimalPipe = __decorate([
- lang_1.CONST(),
- core_1.Pipe({ name: 'number' }),
- core_1.Injectable(),
- __metadata('design:paramtypes', [])
- ], DecimalPipe);
- return DecimalPipe;
- })(NumberPipe);
- exports.DecimalPipe = DecimalPipe;
- /**
- * WARNING: this pipe uses the Internationalization API.
- * Therefore it is only reliable in Chrome and Opera browsers.
- *
- * Formats a number as local percent.
- *
- * ### Usage
- *
- * expression | percent[:digitInfo]
- *
- * For more information about `digitInfo` see {@link DecimalPipe}
- *
- * ### Example
- *
- * {@example core/pipes/ts/number_pipe/number_pipe_example.ts region='PercentPipe'}
- */
- var PercentPipe = (function (_super) {
- __extends(PercentPipe, _super);
- function PercentPipe() {
- _super.apply(this, arguments);
- }
- PercentPipe.prototype.transform = function (value, args) {
- var digits = collection_1.ListWrapper.first(args);
- return NumberPipe._format(value, intl_1.NumberFormatStyle.Percent, digits);
- };
- PercentPipe = __decorate([
- lang_1.CONST(),
- core_1.Pipe({ name: 'percent' }),
- core_1.Injectable(),
- __metadata('design:paramtypes', [])
- ], PercentPipe);
- return PercentPipe;
- })(NumberPipe);
- exports.PercentPipe = PercentPipe;
- /**
- * WARNING: this pipe uses the Internationalization API.
- * Therefore it is only reliable in Chrome and Opera browsers.
- *
- * Formats a number as local currency.
- *
- * ### Usage
- *
- * expression | currency[:currencyCode[:symbolDisplay[:digitInfo]]]
- *
- * where `currencyCode` is the ISO 4217 currency code, such as "USD" for the US dollar and
- * "EUR" for the euro. `symbolDisplay` is a boolean indicating whether to use the currency
- * symbol (e.g. $) or the currency code (e.g. USD) in the output. The default for this value
- * is `false`.
- * For more information about `digitInfo` see {@link DecimalPipe}
- *
- * ### Example
- *
- * {@example core/pipes/ts/number_pipe/number_pipe_example.ts region='CurrencyPipe'}
- */
- var CurrencyPipe = (function (_super) {
- __extends(CurrencyPipe, _super);
- function CurrencyPipe() {
- _super.apply(this, arguments);
- }
- CurrencyPipe.prototype.transform = function (value, args) {
- var currencyCode = lang_1.isPresent(args) && args.length > 0 ? args[0] : 'USD';
- var symbolDisplay = lang_1.isPresent(args) && args.length > 1 ? args[1] : false;
- var digits = lang_1.isPresent(args) && args.length > 2 ? args[2] : null;
- return NumberPipe._format(value, intl_1.NumberFormatStyle.Currency, digits, currencyCode, symbolDisplay);
- };
- CurrencyPipe = __decorate([
- lang_1.CONST(),
- core_1.Pipe({ name: 'currency' }),
- core_1.Injectable(),
- __metadata('design:paramtypes', [])
- ], CurrencyPipe);
- return CurrencyPipe;
- })(NumberPipe);
- exports.CurrencyPipe = CurrencyPipe;
- /***/ },
- /* 115 */
- /***/ function(module, exports, __webpack_require__) {
- function __export(m) {
- for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
- }
- /**
- * @module
- * @description
- * Common directives shipped with Angular.
- */
- var ng_class_1 = __webpack_require__(116);
- exports.NgClass = ng_class_1.NgClass;
- var ng_for_1 = __webpack_require__(117);
- exports.NgFor = ng_for_1.NgFor;
- var ng_if_1 = __webpack_require__(118);
- exports.NgIf = ng_if_1.NgIf;
- var ng_style_1 = __webpack_require__(119);
- exports.NgStyle = ng_style_1.NgStyle;
- var ng_switch_1 = __webpack_require__(120);
- exports.NgSwitch = ng_switch_1.NgSwitch;
- exports.NgSwitchWhen = ng_switch_1.NgSwitchWhen;
- exports.NgSwitchDefault = ng_switch_1.NgSwitchDefault;
- __export(__webpack_require__(121));
- var core_directives_1 = __webpack_require__(122);
- exports.CORE_DIRECTIVES = core_directives_1.CORE_DIRECTIVES;
- /***/ },
- /* 116 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var lang_1 = __webpack_require__(5);
- var core_1 = __webpack_require__(2);
- var collection_1 = __webpack_require__(12);
- /**
- * The `NgClass` directive conditionally adds and removes CSS classes on an HTML element based on
- * an expression's evaluation result.
- *
- * The result of an expression evaluation is interpreted differently depending on type of
- * the expression evaluation result:
- * - `string` - all the CSS classes listed in a string (space delimited) are added
- * - `Array` - all the CSS classes (Array elements) are added
- * - `Object` - each key corresponds to a CSS class name while values are interpreted as expressions
- * evaluating to `Boolean`. If a given expression evaluates to `true` a corresponding CSS class
- * is added - otherwise it is removed.
- *
- * While the `NgClass` directive can interpret expressions evaluating to `string`, `Array`
- * or `Object`, the `Object`-based version is the most often used and has an advantage of keeping
- * all the CSS class names in a template.
- *
- * ### Example ([live demo](http://plnkr.co/edit/a4YdtmWywhJ33uqfpPPn?p=preview)):
- *
- * ```
- * import {Component} from 'angular2/core';
- * import {NgClass} from 'angular2/common';
- *
- * @Component({
- * selector: 'toggle-button',
- * inputs: ['isDisabled'],
- * template: `
- * <div class="button" [ngClass]="{active: isOn, disabled: isDisabled}"
- * (click)="toggle(!isOn)">
- * Click me!
- * </div>`,
- * styles: [`
- * .button {
- * width: 120px;
- * border: medium solid black;
- * }
- *
- * .active {
- * background-color: red;
- * }
- *
- * .disabled {
- * color: gray;
- * border: medium solid gray;
- * }
- * `]
- * directives: [NgClass]
- * })
- * class ToggleButton {
- * isOn = false;
- * isDisabled = false;
- *
- * toggle(newState) {
- * if (!this.isDisabled) {
- * this.isOn = newState;
- * }
- * }
- * }
- * ```
- */
- var NgClass = (function () {
- function NgClass(_iterableDiffers, _keyValueDiffers, _ngEl, _renderer) {
- this._iterableDiffers = _iterableDiffers;
- this._keyValueDiffers = _keyValueDiffers;
- this._ngEl = _ngEl;
- this._renderer = _renderer;
- this._initialClasses = [];
- }
- Object.defineProperty(NgClass.prototype, "initialClasses", {
- set: function (v) {
- this._applyInitialClasses(true);
- this._initialClasses = lang_1.isPresent(v) && lang_1.isString(v) ? v.split(' ') : [];
- this._applyInitialClasses(false);
- this._applyClasses(this._rawClass, false);
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(NgClass.prototype, "rawClass", {
- set: function (v) {
- this._cleanupClasses(this._rawClass);
- if (lang_1.isString(v)) {
- v = v.split(' ');
- }
- this._rawClass = v;
- if (lang_1.isPresent(v)) {
- if (collection_1.isListLikeIterable(v)) {
- this._differ = this._iterableDiffers.find(v).create(null);
- this._mode = 'iterable';
- }
- else {
- this._differ = this._keyValueDiffers.find(v).create(null);
- this._mode = 'keyValue';
- }
- }
- else {
- this._differ = null;
- }
- },
- enumerable: true,
- configurable: true
- });
- NgClass.prototype.ngDoCheck = function () {
- if (lang_1.isPresent(this._differ)) {
- var changes = this._differ.diff(this._rawClass);
- if (lang_1.isPresent(changes)) {
- if (this._mode == 'iterable') {
- this._applyIterableChanges(changes);
- }
- else {
- this._applyKeyValueChanges(changes);
- }
- }
- }
- };
- NgClass.prototype.ngOnDestroy = function () { this._cleanupClasses(this._rawClass); };
- NgClass.prototype._cleanupClasses = function (rawClassVal) {
- this._applyClasses(rawClassVal, true);
- this._applyInitialClasses(false);
- };
- NgClass.prototype._applyKeyValueChanges = function (changes) {
- var _this = this;
- changes.forEachAddedItem(function (record) { _this._toggleClass(record.key, record.currentValue); });
- changes.forEachChangedItem(function (record) { _this._toggleClass(record.key, record.currentValue); });
- changes.forEachRemovedItem(function (record) {
- if (record.previousValue) {
- _this._toggleClass(record.key, false);
- }
- });
- };
- NgClass.prototype._applyIterableChanges = function (changes) {
- var _this = this;
- changes.forEachAddedItem(function (record) { _this._toggleClass(record.item, true); });
- changes.forEachRemovedItem(function (record) { _this._toggleClass(record.item, false); });
- };
- NgClass.prototype._applyInitialClasses = function (isCleanup) {
- var _this = this;
- this._initialClasses.forEach(function (className) { return _this._toggleClass(className, !isCleanup); });
- };
- NgClass.prototype._applyClasses = function (rawClassVal, isCleanup) {
- var _this = this;
- if (lang_1.isPresent(rawClassVal)) {
- if (lang_1.isArray(rawClassVal)) {
- rawClassVal.forEach(function (className) { return _this._toggleClass(className, !isCleanup); });
- }
- else if (rawClassVal instanceof Set) {
- rawClassVal.forEach(function (className) { return _this._toggleClass(className, !isCleanup); });
- }
- else {
- collection_1.StringMapWrapper.forEach(rawClassVal, function (expVal, className) {
- if (expVal)
- _this._toggleClass(className, !isCleanup);
- });
- }
- }
- };
- NgClass.prototype._toggleClass = function (className, enabled) {
- className = className.trim();
- if (className.length > 0) {
- if (className.indexOf(' ') > -1) {
- var classes = className.split(/\s+/g);
- for (var i = 0, len = classes.length; i < len; i++) {
- this._renderer.setElementClass(this._ngEl, classes[i], enabled);
- }
- }
- else {
- this._renderer.setElementClass(this._ngEl, className, enabled);
- }
- }
- };
- NgClass = __decorate([
- core_1.Directive({ selector: '[ngClass]', inputs: ['rawClass: ngClass', 'initialClasses: class'] }),
- __metadata('design:paramtypes', [core_1.IterableDiffers, core_1.KeyValueDiffers, core_1.ElementRef, core_1.Renderer])
- ], NgClass);
- return NgClass;
- })();
- exports.NgClass = NgClass;
- /***/ },
- /* 117 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var core_1 = __webpack_require__(2);
- var lang_1 = __webpack_require__(5);
- /**
- * The `NgFor` directive instantiates a template once per item from an iterable. The context for
- * each instantiated template inherits from the outer context with the given loop variable set
- * to the current item from the iterable.
- *
- * # Local Variables
- *
- * `NgFor` provides several exported values that can be aliased to local variables:
- *
- * * `index` will be set to the current loop iteration for each template context.
- * * `last` will be set to a boolean value indicating whether the item is the last one in the
- * iteration.
- * * `even` will be set to a boolean value indicating whether this item has an even index.
- * * `odd` will be set to a boolean value indicating whether this item has an odd index.
- *
- * # Change Propagation
- *
- * When the contents of the iterator changes, `NgFor` makes the corresponding changes to the DOM:
- *
- * * When an item is added, a new instance of the template is added to the DOM.
- * * When an item is removed, its template instance is removed from the DOM.
- * * When items are reordered, their respective templates are reordered in the DOM.
- * * Otherwise, the DOM element for that item will remain the same.
- *
- * Angular uses object identity to track insertions and deletions within the iterator and reproduce
- * those changes in the DOM. This has important implications for animations and any stateful
- * controls
- * (such as `<input>` elements which accept user input) that are present. Inserted rows can be
- * animated in, deleted rows can be animated out, and unchanged rows retain any unsaved state such
- * as user input.
- *
- * It is possible for the identities of elements in the iterator to change while the data does not.
- * This can happen, for example, if the iterator produced from an RPC to the server, and that
- * RPC is re-run. Even if the data hasn't changed, the second response will produce objects with
- * different identities, and Angular will tear down the entire DOM and rebuild it (as if all old
- * elements were deleted and all new elements inserted). This is an expensive operation and should
- * be avoided if possible.
- *
- * # Syntax
- *
- * - `<li *ngFor="#item of items; #i = index">...</li>`
- * - `<li template="ngFor #item of items; #i = index">...</li>`
- * - `<template ngFor #item [ngForOf]="items" #i="index"><li>...</li></template>`
- *
- * ### Example
- *
- * See a [live demo](http://plnkr.co/edit/KVuXxDp0qinGDyo307QW?p=preview) for a more detailed
- * example.
- */
- var NgFor = (function () {
- function NgFor(_viewContainer, _templateRef, _iterableDiffers, _cdr) {
- this._viewContainer = _viewContainer;
- this._templateRef = _templateRef;
- this._iterableDiffers = _iterableDiffers;
- this._cdr = _cdr;
- }
- Object.defineProperty(NgFor.prototype, "ngForOf", {
- set: function (value) {
- this._ngForOf = value;
- if (lang_1.isBlank(this._differ) && lang_1.isPresent(value)) {
- this._differ = this._iterableDiffers.find(value).create(this._cdr);
- }
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(NgFor.prototype, "ngForTemplate", {
- set: function (value) {
- if (lang_1.isPresent(value)) {
- this._templateRef = value;
- }
- },
- enumerable: true,
- configurable: true
- });
- NgFor.prototype.ngDoCheck = function () {
- if (lang_1.isPresent(this._differ)) {
- var changes = this._differ.diff(this._ngForOf);
- if (lang_1.isPresent(changes))
- this._applyChanges(changes);
- }
- };
- NgFor.prototype._applyChanges = function (changes) {
- // TODO(rado): check if change detection can produce a change record that is
- // easier to consume than current.
- var recordViewTuples = [];
- changes.forEachRemovedItem(function (removedRecord) {
- return recordViewTuples.push(new RecordViewTuple(removedRecord, null));
- });
- changes.forEachMovedItem(function (movedRecord) {
- return recordViewTuples.push(new RecordViewTuple(movedRecord, null));
- });
- var insertTuples = this._bulkRemove(recordViewTuples);
- changes.forEachAddedItem(function (addedRecord) {
- return insertTuples.push(new RecordViewTuple(addedRecord, null));
- });
- this._bulkInsert(insertTuples);
- for (var i = 0; i < insertTuples.length; i++) {
- this._perViewChange(insertTuples[i].view, insertTuples[i].record);
- }
- for (var i = 0, ilen = this._viewContainer.length; i < ilen; i++) {
- this._viewContainer.get(i).setLocal('last', i === ilen - 1);
- }
- };
- NgFor.prototype._perViewChange = function (view, record) {
- view.setLocal('\$implicit', record.item);
- view.setLocal('index', record.currentIndex);
- view.setLocal('even', (record.currentIndex % 2 == 0));
- view.setLocal('odd', (record.currentIndex % 2 == 1));
- };
- NgFor.prototype._bulkRemove = function (tuples) {
- tuples.sort(function (a, b) { return a.record.previousIndex - b.record.previousIndex; });
- var movedTuples = [];
- for (var i = tuples.length - 1; i >= 0; i--) {
- var tuple = tuples[i];
- // separate moved views from removed views.
- if (lang_1.isPresent(tuple.record.currentIndex)) {
- tuple.view = this._viewContainer.detach(tuple.record.previousIndex);
- movedTuples.push(tuple);
- }
- else {
- this._viewContainer.remove(tuple.record.previousIndex);
- }
- }
- return movedTuples;
- };
- NgFor.prototype._bulkInsert = function (tuples) {
- tuples.sort(function (a, b) { return a.record.currentIndex - b.record.currentIndex; });
- for (var i = 0; i < tuples.length; i++) {
- var tuple = tuples[i];
- if (lang_1.isPresent(tuple.view)) {
- this._viewContainer.insert(tuple.view, tuple.record.currentIndex);
- }
- else {
- tuple.view =
- this._viewContainer.createEmbeddedView(this._templateRef, tuple.record.currentIndex);
- }
- }
- return tuples;
- };
- NgFor = __decorate([
- core_1.Directive({ selector: '[ngFor][ngForOf]', inputs: ['ngForOf', 'ngForTemplate'] }),
- __metadata('design:paramtypes', [core_1.ViewContainerRef, core_1.TemplateRef, core_1.IterableDiffers, core_1.ChangeDetectorRef])
- ], NgFor);
- return NgFor;
- })();
- exports.NgFor = NgFor;
- var RecordViewTuple = (function () {
- function RecordViewTuple(record, view) {
- this.record = record;
- this.view = view;
- }
- return RecordViewTuple;
- })();
- /***/ },
- /* 118 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var core_1 = __webpack_require__(2);
- var lang_1 = __webpack_require__(5);
- /**
- * Removes or recreates a portion of the DOM tree based on an {expression}.
- *
- * If the expression assigned to `ngIf` evaluates to a false value then the element
- * is removed from the DOM, otherwise a clone of the element is reinserted into the DOM.
- *
- * ### Example ([live demo](http://plnkr.co/edit/fe0kgemFBtmQOY31b4tw?p=preview)):
- *
- * ```
- * <div *ngIf="errorCount > 0" class="error">
- * <!-- Error message displayed when the errorCount property on the current context is greater
- * than 0. -->
- * {{errorCount}} errors detected
- * </div>
- * ```
- *
- * ### Syntax
- *
- * - `<div *ngIf="condition">...</div>`
- * - `<div template="ngIf condition">...</div>`
- * - `<template [ngIf]="condition"><div>...</div></template>`
- */
- var NgIf = (function () {
- function NgIf(_viewContainer, _templateRef) {
- this._viewContainer = _viewContainer;
- this._templateRef = _templateRef;
- this._prevCondition = null;
- }
- Object.defineProperty(NgIf.prototype, "ngIf", {
- set: function (newCondition /* boolean */) {
- if (newCondition && (lang_1.isBlank(this._prevCondition) || !this._prevCondition)) {
- this._prevCondition = true;
- this._viewContainer.createEmbeddedView(this._templateRef);
- }
- else if (!newCondition && (lang_1.isBlank(this._prevCondition) || this._prevCondition)) {
- this._prevCondition = false;
- this._viewContainer.clear();
- }
- },
- enumerable: true,
- configurable: true
- });
- NgIf = __decorate([
- core_1.Directive({ selector: '[ngIf]', inputs: ['ngIf'] }),
- __metadata('design:paramtypes', [core_1.ViewContainerRef, core_1.TemplateRef])
- ], NgIf);
- return NgIf;
- })();
- exports.NgIf = NgIf;
- /***/ },
- /* 119 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var core_1 = __webpack_require__(2);
- var lang_1 = __webpack_require__(5);
- /**
- * The `NgStyle` directive changes styles based on a result of expression evaluation.
- *
- * An expression assigned to the `ngStyle` property must evaluate to an object and the
- * corresponding element styles are updated based on changes to this object. Style names to update
- * are taken from the object's keys, and values - from the corresponding object's values.
- *
- * ### Syntax
- *
- * - `<div [ngStyle]="{'font-style': style}"></div>`
- * - `<div [ngStyle]="styleExp"></div>` - here the `styleExp` must evaluate to an object
- *
- * ### Example ([live demo](http://plnkr.co/edit/YamGS6GkUh9GqWNQhCyM?p=preview)):
- *
- * ```
- * import {Component} from 'angular2/core';
- * import {NgStyle} from 'angular2/common';
- *
- * @Component({
- * selector: 'ngStyle-example',
- * template: `
- * <h1 [ngStyle]="{'font-style': style, 'font-size': size, 'font-weight': weight}">
- * Change style of this text!
- * </h1>
- *
- * <hr>
- *
- * <label>Italic: <input type="checkbox" (change)="changeStyle($event)"></label>
- * <label>Bold: <input type="checkbox" (change)="changeWeight($event)"></label>
- * <label>Size: <input type="text" [value]="size" (change)="size = $event.target.value"></label>
- * `,
- * directives: [NgStyle]
- * })
- * export class NgStyleExample {
- * style = 'normal';
- * weight = 'normal';
- * size = '20px';
- *
- * changeStyle($event: any) {
- * this.style = $event.target.checked ? 'italic' : 'normal';
- * }
- *
- * changeWeight($event: any) {
- * this.weight = $event.target.checked ? 'bold' : 'normal';
- * }
- * }
- * ```
- *
- * In this example the `font-style`, `font-size` and `font-weight` styles will be updated
- * based on the `style` property's value changes.
- */
- var NgStyle = (function () {
- function NgStyle(_differs, _ngEl, _renderer) {
- this._differs = _differs;
- this._ngEl = _ngEl;
- this._renderer = _renderer;
- }
- Object.defineProperty(NgStyle.prototype, "rawStyle", {
- set: function (v) {
- this._rawStyle = v;
- if (lang_1.isBlank(this._differ) && lang_1.isPresent(v)) {
- this._differ = this._differs.find(this._rawStyle).create(null);
- }
- },
- enumerable: true,
- configurable: true
- });
- NgStyle.prototype.ngDoCheck = function () {
- if (lang_1.isPresent(this._differ)) {
- var changes = this._differ.diff(this._rawStyle);
- if (lang_1.isPresent(changes)) {
- this._applyChanges(changes);
- }
- }
- };
- NgStyle.prototype._applyChanges = function (changes) {
- var _this = this;
- changes.forEachAddedItem(function (record) { _this._setStyle(record.key, record.currentValue); });
- changes.forEachChangedItem(function (record) { _this._setStyle(record.key, record.currentValue); });
- changes.forEachRemovedItem(function (record) { _this._setStyle(record.key, null); });
- };
- NgStyle.prototype._setStyle = function (name, val) {
- this._renderer.setElementStyle(this._ngEl, name, val);
- };
- NgStyle = __decorate([
- core_1.Directive({ selector: '[ngStyle]', inputs: ['rawStyle: ngStyle'] }),
- __metadata('design:paramtypes', [core_1.KeyValueDiffers, core_1.ElementRef, core_1.Renderer])
- ], NgStyle);
- return NgStyle;
- })();
- exports.NgStyle = NgStyle;
- /***/ },
- /* 120 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var __param = (this && this.__param) || function (paramIndex, decorator) {
- return function (target, key) { decorator(target, key, paramIndex); }
- };
- var core_1 = __webpack_require__(2);
- var lang_1 = __webpack_require__(5);
- var collection_1 = __webpack_require__(12);
- var _WHEN_DEFAULT = lang_1.CONST_EXPR(new Object());
- var SwitchView = (function () {
- function SwitchView(_viewContainerRef, _templateRef) {
- this._viewContainerRef = _viewContainerRef;
- this._templateRef = _templateRef;
- }
- SwitchView.prototype.create = function () { this._viewContainerRef.createEmbeddedView(this._templateRef); };
- SwitchView.prototype.destroy = function () { this._viewContainerRef.clear(); };
- return SwitchView;
- })();
- /**
- * Adds or removes DOM sub-trees when their match expressions match the switch expression.
- *
- * Elements within `NgSwitch` but without `NgSwitchWhen` or `NgSwitchDefault` directives will be
- * preserved at the location as specified in the template.
- *
- * `NgSwitch` simply inserts nested elements based on which match expression matches the value
- * obtained from the evaluated switch expression. In other words, you define a container element
- * (where you place the directive with a switch expression on the
- * **`[ngSwitch]="..."` attribute**), define any inner elements inside of the directive and
- * place a `[ngSwitchWhen]` attribute per element.
- *
- * The `ngSwitchWhen` property is used to inform `NgSwitch` which element to display when the
- * expression is evaluated. If a matching expression is not found via a `ngSwitchWhen` property
- * then an element with the `ngSwitchDefault` attribute is displayed.
- *
- * ### Example ([live demo](http://plnkr.co/edit/DQMTII95CbuqWrl3lYAs?p=preview))
- *
- * ```typescript
- * @Component({selector: 'app'})
- * @View({
- * template: `
- * <p>Value = {{value}}</p>
- * <button (click)="inc()">Increment</button>
- *
- * <div [ngSwitch]="value">
- * <p *ngSwitchWhen="'init'">increment to start</p>
- * <p *ngSwitchWhen="0">0, increment again</p>
- * <p *ngSwitchWhen="1">1, increment again</p>
- * <p *ngSwitchWhen="2">2, stop incrementing</p>
- * <p *ngSwitchDefault>> 2, STOP!</p>
- * </div>
- *
- * <!-- alternate syntax -->
- *
- * <p [ngSwitch]="value">
- * <template ngSwitchWhen="init">increment to start</template>
- * <template [ngSwitchWhen]="0">0, increment again</template>
- * <template [ngSwitchWhen]="1">1, increment again</template>
- * <template [ngSwitchWhen]="2">2, stop incrementing</template>
- * <template ngSwitchDefault>> 2, STOP!</template>
- * </p>
- * `,
- * directives: [NgSwitch, NgSwitchWhen, NgSwitchDefault]
- * })
- * export class App {
- * value = 'init';
- *
- * inc() {
- * this.value = this.value === 'init' ? 0 : this.value + 1;
- * }
- * }
- *
- * bootstrap(App).catch(err => console.error(err));
- * ```
- */
- var NgSwitch = (function () {
- function NgSwitch() {
- this._useDefault = false;
- this._valueViews = new collection_1.Map();
- this._activeViews = [];
- }
- Object.defineProperty(NgSwitch.prototype, "ngSwitch", {
- set: function (value) {
- // Empty the currently active ViewContainers
- this._emptyAllActiveViews();
- // Add the ViewContainers matching the value (with a fallback to default)
- this._useDefault = false;
- var views = this._valueViews.get(value);
- if (lang_1.isBlank(views)) {
- this._useDefault = true;
- views = lang_1.normalizeBlank(this._valueViews.get(_WHEN_DEFAULT));
- }
- this._activateViews(views);
- this._switchValue = value;
- },
- enumerable: true,
- configurable: true
- });
- /** @internal */
- NgSwitch.prototype._onWhenValueChanged = function (oldWhen, newWhen, view) {
- this._deregisterView(oldWhen, view);
- this._registerView(newWhen, view);
- if (oldWhen === this._switchValue) {
- view.destroy();
- collection_1.ListWrapper.remove(this._activeViews, view);
- }
- else if (newWhen === this._switchValue) {
- if (this._useDefault) {
- this._useDefault = false;
- this._emptyAllActiveViews();
- }
- view.create();
- this._activeViews.push(view);
- }
- // Switch to default when there is no more active ViewContainers
- if (this._activeViews.length === 0 && !this._useDefault) {
- this._useDefault = true;
- this._activateViews(this._valueViews.get(_WHEN_DEFAULT));
- }
- };
- /** @internal */
- NgSwitch.prototype._emptyAllActiveViews = function () {
- var activeContainers = this._activeViews;
- for (var i = 0; i < activeContainers.length; i++) {
- activeContainers[i].destroy();
- }
- this._activeViews = [];
- };
- /** @internal */
- NgSwitch.prototype._activateViews = function (views) {
- // TODO(vicb): assert(this._activeViews.length === 0);
- if (lang_1.isPresent(views)) {
- for (var i = 0; i < views.length; i++) {
- views[i].create();
- }
- this._activeViews = views;
- }
- };
- /** @internal */
- NgSwitch.prototype._registerView = function (value, view) {
- var views = this._valueViews.get(value);
- if (lang_1.isBlank(views)) {
- views = [];
- this._valueViews.set(value, views);
- }
- views.push(view);
- };
- /** @internal */
- NgSwitch.prototype._deregisterView = function (value, view) {
- // `_WHEN_DEFAULT` is used a marker for non-registered whens
- if (value === _WHEN_DEFAULT)
- return;
- var views = this._valueViews.get(value);
- if (views.length == 1) {
- this._valueViews.delete(value);
- }
- else {
- collection_1.ListWrapper.remove(views, view);
- }
- };
- NgSwitch = __decorate([
- core_1.Directive({ selector: '[ngSwitch]', inputs: ['ngSwitch'] }),
- __metadata('design:paramtypes', [])
- ], NgSwitch);
- return NgSwitch;
- })();
- exports.NgSwitch = NgSwitch;
- /**
- * Insert the sub-tree when the `ngSwitchWhen` expression evaluates to the same value as the
- * enclosing switch expression.
- *
- * If multiple match expression match the switch expression value, all of them are displayed.
- *
- * See {@link NgSwitch} for more details and example.
- */
- var NgSwitchWhen = (function () {
- function NgSwitchWhen(viewContainer, templateRef, ngSwitch) {
- // `_WHEN_DEFAULT` is used as a marker for a not yet initialized value
- /** @internal */
- this._value = _WHEN_DEFAULT;
- this._switch = ngSwitch;
- this._view = new SwitchView(viewContainer, templateRef);
- }
- Object.defineProperty(NgSwitchWhen.prototype, "ngSwitchWhen", {
- set: function (value) {
- this._switch._onWhenValueChanged(this._value, value, this._view);
- this._value = value;
- },
- enumerable: true,
- configurable: true
- });
- NgSwitchWhen = __decorate([
- core_1.Directive({ selector: '[ngSwitchWhen]', inputs: ['ngSwitchWhen'] }),
- __param(2, core_1.Host()),
- __metadata('design:paramtypes', [core_1.ViewContainerRef, core_1.TemplateRef, NgSwitch])
- ], NgSwitchWhen);
- return NgSwitchWhen;
- })();
- exports.NgSwitchWhen = NgSwitchWhen;
- /**
- * Default case statements are displayed when no match expression matches the switch expression
- * value.
- *
- * See {@link NgSwitch} for more details and example.
- */
- var NgSwitchDefault = (function () {
- function NgSwitchDefault(viewContainer, templateRef, sswitch) {
- sswitch._registerView(_WHEN_DEFAULT, new SwitchView(viewContainer, templateRef));
- }
- NgSwitchDefault = __decorate([
- core_1.Directive({ selector: '[ngSwitchDefault]' }),
- __param(2, core_1.Host()),
- __metadata('design:paramtypes', [core_1.ViewContainerRef, core_1.TemplateRef, NgSwitch])
- ], NgSwitchDefault);
- return NgSwitchDefault;
- })();
- exports.NgSwitchDefault = NgSwitchDefault;
- /***/ },
- /* 121 */
- /***/ function(module, exports) {
- // TS does not have Observables
- /***/ },
- /* 122 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var ng_class_1 = __webpack_require__(116);
- var ng_for_1 = __webpack_require__(117);
- var ng_if_1 = __webpack_require__(118);
- var ng_style_1 = __webpack_require__(119);
- var ng_switch_1 = __webpack_require__(120);
- /**
- * A collection of Angular core directives that are likely to be used in each and every Angular
- * application.
- *
- * This collection can be used to quickly enumerate all the built-in directives in the `directives`
- * property of the `@View` annotation.
- *
- * ### Example ([live demo](http://plnkr.co/edit/yakGwpCdUkg0qfzX5m8g?p=preview))
- *
- * Instead of writing:
- *
- * ```typescript
- * import {NgClass, NgIf, NgFor, NgSwitch, NgSwitchWhen, NgSwitchDefault} from 'angular2/common';
- * import {OtherDirective} from './myDirectives';
- *
- * @Component({
- * selector: 'my-component',
- * templateUrl: 'myComponent.html',
- * directives: [NgClass, NgIf, NgFor, NgSwitch, NgSwitchWhen, NgSwitchDefault, OtherDirective]
- * })
- * export class MyComponent {
- * ...
- * }
- * ```
- * one could import all the core directives at once:
- *
- * ```typescript
- * import {CORE_DIRECTIVES} from 'angular2/common';
- * import {OtherDirective} from './myDirectives';
- *
- * @Component({
- * selector: 'my-component',
- * templateUrl: 'myComponent.html',
- * directives: [CORE_DIRECTIVES, OtherDirective]
- * })
- * export class MyComponent {
- * ...
- * }
- * ```
- */
- exports.CORE_DIRECTIVES = lang_1.CONST_EXPR([ng_class_1.NgClass, ng_for_1.NgFor, ng_if_1.NgIf, ng_style_1.NgStyle, ng_switch_1.NgSwitch, ng_switch_1.NgSwitchWhen, ng_switch_1.NgSwitchDefault]);
- /***/ },
- /* 123 */
- /***/ function(module, exports, __webpack_require__) {
- /**
- * @module
- * @description
- * This module is used for handling user input, by defining and building a {@link ControlGroup} that
- * consists of
- * {@link Control} objects, and mapping them onto the DOM. {@link Control} objects can then be used
- * to read information
- * from the form DOM elements.
- *
- * This module is not included in the `angular2` module; you must import the forms module
- * explicitly.
- *
- */
- var model_1 = __webpack_require__(124);
- exports.AbstractControl = model_1.AbstractControl;
- exports.Control = model_1.Control;
- exports.ControlGroup = model_1.ControlGroup;
- exports.ControlArray = model_1.ControlArray;
- var abstract_control_directive_1 = __webpack_require__(125);
- exports.AbstractControlDirective = abstract_control_directive_1.AbstractControlDirective;
- var control_container_1 = __webpack_require__(126);
- exports.ControlContainer = control_container_1.ControlContainer;
- var ng_control_name_1 = __webpack_require__(127);
- exports.NgControlName = ng_control_name_1.NgControlName;
- var ng_form_control_1 = __webpack_require__(137);
- exports.NgFormControl = ng_form_control_1.NgFormControl;
- var ng_model_1 = __webpack_require__(138);
- exports.NgModel = ng_model_1.NgModel;
- var ng_control_1 = __webpack_require__(128);
- exports.NgControl = ng_control_1.NgControl;
- var ng_control_group_1 = __webpack_require__(139);
- exports.NgControlGroup = ng_control_group_1.NgControlGroup;
- var ng_form_model_1 = __webpack_require__(140);
- exports.NgFormModel = ng_form_model_1.NgFormModel;
- var ng_form_1 = __webpack_require__(141);
- exports.NgForm = ng_form_1.NgForm;
- var control_value_accessor_1 = __webpack_require__(129);
- exports.NG_VALUE_ACCESSOR = control_value_accessor_1.NG_VALUE_ACCESSOR;
- var default_value_accessor_1 = __webpack_require__(132);
- exports.DefaultValueAccessor = default_value_accessor_1.DefaultValueAccessor;
- var ng_control_status_1 = __webpack_require__(142);
- exports.NgControlStatus = ng_control_status_1.NgControlStatus;
- var checkbox_value_accessor_1 = __webpack_require__(134);
- exports.CheckboxControlValueAccessor = checkbox_value_accessor_1.CheckboxControlValueAccessor;
- var select_control_value_accessor_1 = __webpack_require__(135);
- exports.NgSelectOption = select_control_value_accessor_1.NgSelectOption;
- exports.SelectControlValueAccessor = select_control_value_accessor_1.SelectControlValueAccessor;
- var directives_1 = __webpack_require__(143);
- exports.FORM_DIRECTIVES = directives_1.FORM_DIRECTIVES;
- var validators_1 = __webpack_require__(131);
- exports.NG_VALIDATORS = validators_1.NG_VALIDATORS;
- exports.NG_ASYNC_VALIDATORS = validators_1.NG_ASYNC_VALIDATORS;
- exports.Validators = validators_1.Validators;
- var validators_2 = __webpack_require__(144);
- exports.RequiredValidator = validators_2.RequiredValidator;
- exports.MinLengthValidator = validators_2.MinLengthValidator;
- exports.MaxLengthValidator = validators_2.MaxLengthValidator;
- var form_builder_1 = __webpack_require__(145);
- exports.FormBuilder = form_builder_1.FormBuilder;
- exports.FORM_PROVIDERS = form_builder_1.FORM_PROVIDERS;
- exports.FORM_BINDINGS = form_builder_1.FORM_BINDINGS;
- /***/ },
- /* 124 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var lang_1 = __webpack_require__(5);
- var async_1 = __webpack_require__(60);
- var promise_1 = __webpack_require__(61);
- var collection_1 = __webpack_require__(12);
- /**
- * Indicates that a Control is valid, i.e. that no errors exist in the input value.
- */
- exports.VALID = "VALID";
- /**
- * Indicates that a Control is invalid, i.e. that an error exists in the input value.
- */
- exports.INVALID = "INVALID";
- /**
- * Indicates that a Control is pending, i.e. that async validation is occuring and
- * errors are not yet available for the input value.
- */
- exports.PENDING = "PENDING";
- function isControl(control) {
- return control instanceof AbstractControl;
- }
- exports.isControl = isControl;
- function _find(control, path) {
- if (lang_1.isBlank(path))
- return null;
- if (!(path instanceof Array)) {
- path = path.split("/");
- }
- if (path instanceof Array && collection_1.ListWrapper.isEmpty(path))
- return null;
- return path
- .reduce(function (v, name) {
- if (v instanceof ControlGroup) {
- return lang_1.isPresent(v.controls[name]) ? v.controls[name] : null;
- }
- else if (v instanceof ControlArray) {
- var index = name;
- return lang_1.isPresent(v.at(index)) ? v.at(index) : null;
- }
- else {
- return null;
- }
- }, control);
- }
- function toObservable(r) {
- return promise_1.PromiseWrapper.isPromise(r) ? async_1.ObservableWrapper.fromPromise(r) : r;
- }
- /**
- *
- */
- var AbstractControl = (function () {
- function AbstractControl(validator, asyncValidator) {
- this.validator = validator;
- this.asyncValidator = asyncValidator;
- this._pristine = true;
- this._touched = false;
- }
- Object.defineProperty(AbstractControl.prototype, "value", {
- get: function () { return this._value; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AbstractControl.prototype, "status", {
- get: function () { return this._status; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AbstractControl.prototype, "valid", {
- get: function () { return this._status === exports.VALID; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AbstractControl.prototype, "errors", {
- /**
- * Returns the errors of this control.
- */
- get: function () { return this._errors; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AbstractControl.prototype, "pristine", {
- get: function () { return this._pristine; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AbstractControl.prototype, "dirty", {
- get: function () { return !this.pristine; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AbstractControl.prototype, "touched", {
- get: function () { return this._touched; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AbstractControl.prototype, "untouched", {
- get: function () { return !this._touched; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AbstractControl.prototype, "valueChanges", {
- get: function () { return this._valueChanges; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AbstractControl.prototype, "statusChanges", {
- get: function () { return this._statusChanges; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AbstractControl.prototype, "pending", {
- get: function () { return this._status == exports.PENDING; },
- enumerable: true,
- configurable: true
- });
- AbstractControl.prototype.markAsTouched = function () { this._touched = true; };
- AbstractControl.prototype.markAsDirty = function (_a) {
- var onlySelf = (_a === void 0 ? {} : _a).onlySelf;
- onlySelf = lang_1.normalizeBool(onlySelf);
- this._pristine = false;
- if (lang_1.isPresent(this._parent) && !onlySelf) {
- this._parent.markAsDirty({ onlySelf: onlySelf });
- }
- };
- AbstractControl.prototype.markAsPending = function (_a) {
- var onlySelf = (_a === void 0 ? {} : _a).onlySelf;
- onlySelf = lang_1.normalizeBool(onlySelf);
- this._status = exports.PENDING;
- if (lang_1.isPresent(this._parent) && !onlySelf) {
- this._parent.markAsPending({ onlySelf: onlySelf });
- }
- };
- AbstractControl.prototype.setParent = function (parent) { this._parent = parent; };
- AbstractControl.prototype.updateValueAndValidity = function (_a) {
- var _b = _a === void 0 ? {} : _a, onlySelf = _b.onlySelf, emitEvent = _b.emitEvent;
- onlySelf = lang_1.normalizeBool(onlySelf);
- emitEvent = lang_1.isPresent(emitEvent) ? emitEvent : true;
- this._updateValue();
- this._errors = this._runValidator();
- this._status = this._calculateStatus();
- if (this._status == exports.VALID || this._status == exports.PENDING) {
- this._runAsyncValidator(emitEvent);
- }
- if (emitEvent) {
- async_1.ObservableWrapper.callEmit(this._valueChanges, this._value);
- async_1.ObservableWrapper.callEmit(this._statusChanges, this._status);
- }
- if (lang_1.isPresent(this._parent) && !onlySelf) {
- this._parent.updateValueAndValidity({ onlySelf: onlySelf, emitEvent: emitEvent });
- }
- };
- AbstractControl.prototype._runValidator = function () { return lang_1.isPresent(this.validator) ? this.validator(this) : null; };
- AbstractControl.prototype._runAsyncValidator = function (emitEvent) {
- var _this = this;
- if (lang_1.isPresent(this.asyncValidator)) {
- this._status = exports.PENDING;
- this._cancelExistingSubscription();
- var obs = toObservable(this.asyncValidator(this));
- this._asyncValidationSubscription =
- async_1.ObservableWrapper.subscribe(obs, function (res) { return _this.setErrors(res, { emitEvent: emitEvent }); });
- }
- };
- AbstractControl.prototype._cancelExistingSubscription = function () {
- if (lang_1.isPresent(this._asyncValidationSubscription)) {
- async_1.ObservableWrapper.dispose(this._asyncValidationSubscription);
- }
- };
- /**
- * Sets errors on a control.
- *
- * This is used when validations are run not automatically, but manually by the user.
- *
- * Calling `setErrors` will also update the validity of the parent control.
- *
- * ## Usage
- *
- * ```
- * var login = new Control("someLogin");
- * login.setErrors({
- * "notUnique": true
- * });
- *
- * expect(login.valid).toEqual(false);
- * expect(login.errors).toEqual({"notUnique": true});
- *
- * login.updateValue("someOtherLogin");
- *
- * expect(login.valid).toEqual(true);
- * ```
- */
- AbstractControl.prototype.setErrors = function (errors, _a) {
- var emitEvent = (_a === void 0 ? {} : _a).emitEvent;
- emitEvent = lang_1.isPresent(emitEvent) ? emitEvent : true;
- this._errors = errors;
- this._status = this._calculateStatus();
- if (emitEvent) {
- async_1.ObservableWrapper.callEmit(this._statusChanges, this._status);
- }
- if (lang_1.isPresent(this._parent)) {
- this._parent._updateControlsErrors();
- }
- };
- AbstractControl.prototype.find = function (path) { return _find(this, path); };
- AbstractControl.prototype.getError = function (errorCode, path) {
- if (path === void 0) { path = null; }
- var control = lang_1.isPresent(path) && !collection_1.ListWrapper.isEmpty(path) ? this.find(path) : this;
- if (lang_1.isPresent(control) && lang_1.isPresent(control._errors)) {
- return collection_1.StringMapWrapper.get(control._errors, errorCode);
- }
- else {
- return null;
- }
- };
- AbstractControl.prototype.hasError = function (errorCode, path) {
- if (path === void 0) { path = null; }
- return lang_1.isPresent(this.getError(errorCode, path));
- };
- /** @internal */
- AbstractControl.prototype._updateControlsErrors = function () {
- this._status = this._calculateStatus();
- if (lang_1.isPresent(this._parent)) {
- this._parent._updateControlsErrors();
- }
- };
- /** @internal */
- AbstractControl.prototype._initObservables = function () {
- this._valueChanges = new async_1.EventEmitter();
- this._statusChanges = new async_1.EventEmitter();
- };
- AbstractControl.prototype._calculateStatus = function () {
- if (lang_1.isPresent(this._errors))
- return exports.INVALID;
- if (this._anyControlsHaveStatus(exports.PENDING))
- return exports.PENDING;
- if (this._anyControlsHaveStatus(exports.INVALID))
- return exports.INVALID;
- return exports.VALID;
- };
- return AbstractControl;
- })();
- exports.AbstractControl = AbstractControl;
- /**
- * Defines a part of a form that cannot be divided into other controls. `Control`s have values and
- * validation state, which is determined by an optional validation function.
- *
- * `Control` is one of the three fundamental building blocks used to define forms in Angular, along
- * with {@link ControlGroup} and {@link ControlArray}.
- *
- * ## Usage
- *
- * By default, a `Control` is created for every `<input>` or other form component.
- * With {@link NgFormControl} or {@link NgFormModel} an existing {@link Control} can be
- * bound to a DOM element instead. This `Control` can be configured with a custom
- * validation function.
- *
- * ### Example ([live demo](http://plnkr.co/edit/23DESOpbNnBpBHZt1BR4?p=preview))
- */
- var Control = (function (_super) {
- __extends(Control, _super);
- function Control(value, validator, asyncValidator) {
- if (value === void 0) { value = null; }
- if (validator === void 0) { validator = null; }
- if (asyncValidator === void 0) { asyncValidator = null; }
- _super.call(this, validator, asyncValidator);
- this._value = value;
- this.updateValueAndValidity({ onlySelf: true, emitEvent: false });
- this._initObservables();
- }
- /**
- * Set the value of the control to `value`.
- *
- * If `onlySelf` is `true`, this change will only affect the validation of this `Control`
- * and not its parent component. If `emitEvent` is `true`, this change will cause a
- * `valueChanges` event on the `Control` to be emitted. Both of these options default to
- * `false`.
- *
- * If `emitModelToViewChange` is `true`, the view will be notified about the new value
- * via an `onChange` event. This is the default behavior if `emitModelToViewChange` is not
- * specified.
- */
- Control.prototype.updateValue = function (value, _a) {
- var _b = _a === void 0 ? {} : _a, onlySelf = _b.onlySelf, emitEvent = _b.emitEvent, emitModelToViewChange = _b.emitModelToViewChange;
- emitModelToViewChange = lang_1.isPresent(emitModelToViewChange) ? emitModelToViewChange : true;
- this._value = value;
- if (lang_1.isPresent(this._onChange) && emitModelToViewChange)
- this._onChange(this._value);
- this.updateValueAndValidity({ onlySelf: onlySelf, emitEvent: emitEvent });
- };
- /**
- * @internal
- */
- Control.prototype._updateValue = function () { };
- /**
- * @internal
- */
- Control.prototype._anyControlsHaveStatus = function (status) { return false; };
- /**
- * Register a listener for change events.
- */
- Control.prototype.registerOnChange = function (fn) { this._onChange = fn; };
- return Control;
- })(AbstractControl);
- exports.Control = Control;
- /**
- * Defines a part of a form, of fixed length, that can contain other controls.
- *
- * A `ControlGroup` aggregates the values and errors of each {@link Control} in the group. Thus, if
- * one of the controls in a group is invalid, the entire group is invalid. Similarly, if a control
- * changes its value, the entire group changes as well.
- *
- * `ControlGroup` is one of the three fundamental building blocks used to define forms in Angular,
- * along with {@link Control} and {@link ControlArray}. {@link ControlArray} can also contain other
- * controls, but is of variable length.
- *
- * ### Example ([live demo](http://plnkr.co/edit/23DESOpbNnBpBHZt1BR4?p=preview))
- */
- var ControlGroup = (function (_super) {
- __extends(ControlGroup, _super);
- function ControlGroup(controls, optionals, validator, asyncValidator) {
- if (optionals === void 0) { optionals = null; }
- if (validator === void 0) { validator = null; }
- if (asyncValidator === void 0) { asyncValidator = null; }
- _super.call(this, validator, asyncValidator);
- this.controls = controls;
- this._optionals = lang_1.isPresent(optionals) ? optionals : {};
- this._initObservables();
- this._setParentForControls();
- this.updateValueAndValidity({ onlySelf: true, emitEvent: false });
- }
- /**
- * Add a control to this group.
- */
- ControlGroup.prototype.addControl = function (name, control) {
- this.controls[name] = control;
- control.setParent(this);
- };
- /**
- * Remove a control from this group.
- */
- ControlGroup.prototype.removeControl = function (name) { collection_1.StringMapWrapper.delete(this.controls, name); };
- /**
- * Mark the named control as non-optional.
- */
- ControlGroup.prototype.include = function (controlName) {
- collection_1.StringMapWrapper.set(this._optionals, controlName, true);
- this.updateValueAndValidity();
- };
- /**
- * Mark the named control as optional.
- */
- ControlGroup.prototype.exclude = function (controlName) {
- collection_1.StringMapWrapper.set(this._optionals, controlName, false);
- this.updateValueAndValidity();
- };
- /**
- * Check whether there is a control with the given name in the group.
- */
- ControlGroup.prototype.contains = function (controlName) {
- var c = collection_1.StringMapWrapper.contains(this.controls, controlName);
- return c && this._included(controlName);
- };
- /** @internal */
- ControlGroup.prototype._setParentForControls = function () {
- var _this = this;
- collection_1.StringMapWrapper.forEach(this.controls, function (control, name) { control.setParent(_this); });
- };
- /** @internal */
- ControlGroup.prototype._updateValue = function () { this._value = this._reduceValue(); };
- /** @internal */
- ControlGroup.prototype._anyControlsHaveStatus = function (status) {
- var _this = this;
- var res = false;
- collection_1.StringMapWrapper.forEach(this.controls, function (control, name) {
- res = res || (_this.contains(name) && control.status == status);
- });
- return res;
- };
- /** @internal */
- ControlGroup.prototype._reduceValue = function () {
- return this._reduceChildren({}, function (acc, control, name) {
- acc[name] = control.value;
- return acc;
- });
- };
- /** @internal */
- ControlGroup.prototype._reduceChildren = function (initValue, fn) {
- var _this = this;
- var res = initValue;
- collection_1.StringMapWrapper.forEach(this.controls, function (control, name) {
- if (_this._included(name)) {
- res = fn(res, control, name);
- }
- });
- return res;
- };
- /** @internal */
- ControlGroup.prototype._included = function (controlName) {
- var isOptional = collection_1.StringMapWrapper.contains(this._optionals, controlName);
- return !isOptional || collection_1.StringMapWrapper.get(this._optionals, controlName);
- };
- return ControlGroup;
- })(AbstractControl);
- exports.ControlGroup = ControlGroup;
- /**
- * Defines a part of a form, of variable length, that can contain other controls.
- *
- * A `ControlArray` aggregates the values and errors of each {@link Control} in the group. Thus, if
- * one of the controls in a group is invalid, the entire group is invalid. Similarly, if a control
- * changes its value, the entire group changes as well.
- *
- * `ControlArray` is one of the three fundamental building blocks used to define forms in Angular,
- * along with {@link Control} and {@link ControlGroup}. {@link ControlGroup} can also contain
- * other controls, but is of fixed length.
- *
- * ## Adding or removing controls
- *
- * To change the controls in the array, use the `push`, `insert`, or `removeAt` methods
- * in `ControlArray` itself. These methods ensure the controls are properly tracked in the
- * form's hierarchy. Do not modify the array of `AbstractControl`s used to instantiate
- * the `ControlArray` directly, as that will result in strange and unexpected behavior such
- * as broken change detection.
- *
- * ### Example ([live demo](http://plnkr.co/edit/23DESOpbNnBpBHZt1BR4?p=preview))
- */
- var ControlArray = (function (_super) {
- __extends(ControlArray, _super);
- function ControlArray(controls, validator, asyncValidator) {
- if (validator === void 0) { validator = null; }
- if (asyncValidator === void 0) { asyncValidator = null; }
- _super.call(this, validator, asyncValidator);
- this.controls = controls;
- this._initObservables();
- this._setParentForControls();
- this.updateValueAndValidity({ onlySelf: true, emitEvent: false });
- }
- /**
- * Get the {@link AbstractControl} at the given `index` in the array.
- */
- ControlArray.prototype.at = function (index) { return this.controls[index]; };
- /**
- * Insert a new {@link AbstractControl} at the end of the array.
- */
- ControlArray.prototype.push = function (control) {
- this.controls.push(control);
- control.setParent(this);
- this.updateValueAndValidity();
- };
- /**
- * Insert a new {@link AbstractControl} at the given `index` in the array.
- */
- ControlArray.prototype.insert = function (index, control) {
- collection_1.ListWrapper.insert(this.controls, index, control);
- control.setParent(this);
- this.updateValueAndValidity();
- };
- /**
- * Remove the control at the given `index` in the array.
- */
- ControlArray.prototype.removeAt = function (index) {
- collection_1.ListWrapper.removeAt(this.controls, index);
- this.updateValueAndValidity();
- };
- Object.defineProperty(ControlArray.prototype, "length", {
- /**
- * Length of the control array.
- */
- get: function () { return this.controls.length; },
- enumerable: true,
- configurable: true
- });
- /** @internal */
- ControlArray.prototype._updateValue = function () { this._value = this.controls.map(function (control) { return control.value; }); };
- /** @internal */
- ControlArray.prototype._anyControlsHaveStatus = function (status) {
- return this.controls.some(function (c) { return c.status == status; });
- };
- /** @internal */
- ControlArray.prototype._setParentForControls = function () {
- var _this = this;
- this.controls.forEach(function (control) { control.setParent(_this); });
- };
- return ControlArray;
- })(AbstractControl);
- exports.ControlArray = ControlArray;
- /***/ },
- /* 125 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- /**
- * Base class for control directives.
- *
- * Only used internally in the forms module.
- */
- var AbstractControlDirective = (function () {
- function AbstractControlDirective() {
- }
- Object.defineProperty(AbstractControlDirective.prototype, "control", {
- get: function () { return exceptions_1.unimplemented(); },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AbstractControlDirective.prototype, "value", {
- get: function () { return lang_1.isPresent(this.control) ? this.control.value : null; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AbstractControlDirective.prototype, "valid", {
- get: function () { return lang_1.isPresent(this.control) ? this.control.valid : null; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AbstractControlDirective.prototype, "errors", {
- get: function () {
- return lang_1.isPresent(this.control) ? this.control.errors : null;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AbstractControlDirective.prototype, "pristine", {
- get: function () { return lang_1.isPresent(this.control) ? this.control.pristine : null; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AbstractControlDirective.prototype, "dirty", {
- get: function () { return lang_1.isPresent(this.control) ? this.control.dirty : null; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AbstractControlDirective.prototype, "touched", {
- get: function () { return lang_1.isPresent(this.control) ? this.control.touched : null; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AbstractControlDirective.prototype, "untouched", {
- get: function () { return lang_1.isPresent(this.control) ? this.control.untouched : null; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AbstractControlDirective.prototype, "path", {
- get: function () { return null; },
- enumerable: true,
- configurable: true
- });
- return AbstractControlDirective;
- })();
- exports.AbstractControlDirective = AbstractControlDirective;
- /***/ },
- /* 126 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var abstract_control_directive_1 = __webpack_require__(125);
- /**
- * A directive that contains multiple {@link NgControl}s.
- *
- * Only used by the forms module.
- */
- var ControlContainer = (function (_super) {
- __extends(ControlContainer, _super);
- function ControlContainer() {
- _super.apply(this, arguments);
- }
- Object.defineProperty(ControlContainer.prototype, "formDirective", {
- /**
- * Get the form to which this container belongs.
- */
- get: function () { return null; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(ControlContainer.prototype, "path", {
- /**
- * Get the path to this container.
- */
- get: function () { return null; },
- enumerable: true,
- configurable: true
- });
- return ControlContainer;
- })(abstract_control_directive_1.AbstractControlDirective);
- exports.ControlContainer = ControlContainer;
- /***/ },
- /* 127 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var __param = (this && this.__param) || function (paramIndex, decorator) {
- return function (target, key) { decorator(target, key, paramIndex); }
- };
- var lang_1 = __webpack_require__(5);
- var async_1 = __webpack_require__(60);
- var core_1 = __webpack_require__(2);
- var control_container_1 = __webpack_require__(126);
- var ng_control_1 = __webpack_require__(128);
- var control_value_accessor_1 = __webpack_require__(129);
- var shared_1 = __webpack_require__(130);
- var validators_1 = __webpack_require__(131);
- var controlNameBinding = lang_1.CONST_EXPR(new core_1.Provider(ng_control_1.NgControl, { useExisting: core_1.forwardRef(function () { return NgControlName; }) }));
- /**
- * Creates and binds a control with a specified name to a DOM element.
- *
- * This directive can only be used as a child of {@link NgForm} or {@link NgFormModel}.
-
- * ### Example
- *
- * In this example, we create the login and password controls.
- * We can work with each control separately: check its validity, get its value, listen to its
- * changes.
- *
- * ```
- * @Component({
- * selector: "login-comp",
- * directives: [FORM_DIRECTIVES],
- * template: `
- * <form #f="ngForm" (submit)='onLogIn(f.value)'>
- * Login <input type='text' ngControl='login' #l="form">
- * <div *ngIf="!l.valid">Login is invalid</div>
- *
- * Password <input type='password' ngControl='password'>
- * <button type='submit'>Log in!</button>
- * </form>
- * `})
- * class LoginComp {
- * onLogIn(value): void {
- * // value === {login: 'some login', password: 'some password'}
- * }
- * }
- * ```
- *
- * We can also use ngModel to bind a domain model to the form.
- *
- * ```
- * @Component({
- * selector: "login-comp",
- * directives: [FORM_DIRECTIVES],
- * template: `
- * <form (submit)='onLogIn()'>
- * Login <input type='text' ngControl='login' [(ngModel)]="credentials.login">
- * Password <input type='password' ngControl='password'
- * [(ngModel)]="credentials.password">
- * <button type='submit'>Log in!</button>
- * </form>
- * `})
- * class LoginComp {
- * credentials: {login:string, password:string};
- *
- * onLogIn(): void {
- * // this.credentials.login === "some login"
- * // this.credentials.password === "some password"
- * }
- * }
- * ```
- */
- var NgControlName = (function (_super) {
- __extends(NgControlName, _super);
- function NgControlName(_parent, _validators, _asyncValidators, valueAccessors) {
- _super.call(this);
- this._parent = _parent;
- this._validators = _validators;
- this._asyncValidators = _asyncValidators;
- /** @internal */
- this.update = new async_1.EventEmitter();
- this._added = false;
- this.valueAccessor = shared_1.selectValueAccessor(this, valueAccessors);
- }
- NgControlName.prototype.ngOnChanges = function (changes) {
- if (!this._added) {
- this.formDirective.addControl(this);
- this._added = true;
- }
- if (shared_1.isPropertyUpdated(changes, this.viewModel)) {
- this.viewModel = this.model;
- this.formDirective.updateModel(this, this.model);
- }
- };
- NgControlName.prototype.ngOnDestroy = function () { this.formDirective.removeControl(this); };
- NgControlName.prototype.viewToModelUpdate = function (newValue) {
- this.viewModel = newValue;
- async_1.ObservableWrapper.callEmit(this.update, newValue);
- };
- Object.defineProperty(NgControlName.prototype, "path", {
- get: function () { return shared_1.controlPath(this.name, this._parent); },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(NgControlName.prototype, "formDirective", {
- get: function () { return this._parent.formDirective; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(NgControlName.prototype, "validator", {
- get: function () { return shared_1.composeValidators(this._validators); },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(NgControlName.prototype, "asyncValidator", {
- get: function () { return shared_1.composeAsyncValidators(this._asyncValidators); },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(NgControlName.prototype, "control", {
- get: function () { return this.formDirective.getControl(this); },
- enumerable: true,
- configurable: true
- });
- NgControlName = __decorate([
- core_1.Directive({
- selector: '[ngControl]',
- bindings: [controlNameBinding],
- inputs: ['name: ngControl', 'model: ngModel'],
- outputs: ['update: ngModelChange'],
- exportAs: 'ngForm'
- }),
- __param(0, core_1.Host()),
- __param(0, core_1.SkipSelf()),
- __param(1, core_1.Optional()),
- __param(1, core_1.Self()),
- __param(1, core_1.Inject(validators_1.NG_VALIDATORS)),
- __param(2, core_1.Optional()),
- __param(2, core_1.Self()),
- __param(2, core_1.Inject(validators_1.NG_ASYNC_VALIDATORS)),
- __param(3, core_1.Optional()),
- __param(3, core_1.Self()),
- __param(3, core_1.Inject(control_value_accessor_1.NG_VALUE_ACCESSOR)),
- __metadata('design:paramtypes', [control_container_1.ControlContainer, Array, Array, Array])
- ], NgControlName);
- return NgControlName;
- })(ng_control_1.NgControl);
- exports.NgControlName = NgControlName;
- /***/ },
- /* 128 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var abstract_control_directive_1 = __webpack_require__(125);
- var exceptions_1 = __webpack_require__(14);
- /**
- * A base class that all control directive extend.
- * It binds a {@link Control} object to a DOM element.
- *
- * Used internally by Angular forms.
- */
- var NgControl = (function (_super) {
- __extends(NgControl, _super);
- function NgControl() {
- _super.apply(this, arguments);
- this.name = null;
- this.valueAccessor = null;
- }
- Object.defineProperty(NgControl.prototype, "validator", {
- get: function () { return exceptions_1.unimplemented(); },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(NgControl.prototype, "asyncValidator", {
- get: function () { return exceptions_1.unimplemented(); },
- enumerable: true,
- configurable: true
- });
- return NgControl;
- })(abstract_control_directive_1.AbstractControlDirective);
- exports.NgControl = NgControl;
- /***/ },
- /* 129 */
- /***/ function(module, exports, __webpack_require__) {
- var core_1 = __webpack_require__(2);
- var lang_1 = __webpack_require__(5);
- /**
- * Used to provide a {@link ControlValueAccessor} for form controls.
- *
- * See {@link DefaultValueAccessor} for how to implement one.
- */
- exports.NG_VALUE_ACCESSOR = lang_1.CONST_EXPR(new core_1.OpaqueToken("NgValueAccessor"));
- /***/ },
- /* 130 */
- /***/ function(module, exports, __webpack_require__) {
- var collection_1 = __webpack_require__(12);
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var validators_1 = __webpack_require__(131);
- var default_value_accessor_1 = __webpack_require__(132);
- var number_value_accessor_1 = __webpack_require__(133);
- var checkbox_value_accessor_1 = __webpack_require__(134);
- var select_control_value_accessor_1 = __webpack_require__(135);
- var normalize_validator_1 = __webpack_require__(136);
- function controlPath(name, parent) {
- var p = collection_1.ListWrapper.clone(parent.path);
- p.push(name);
- return p;
- }
- exports.controlPath = controlPath;
- function setUpControl(control, dir) {
- if (lang_1.isBlank(control))
- _throwError(dir, "Cannot find control");
- if (lang_1.isBlank(dir.valueAccessor))
- _throwError(dir, "No value accessor for");
- control.validator = validators_1.Validators.compose([control.validator, dir.validator]);
- control.asyncValidator = validators_1.Validators.composeAsync([control.asyncValidator, dir.asyncValidator]);
- dir.valueAccessor.writeValue(control.value);
- // view -> model
- dir.valueAccessor.registerOnChange(function (newValue) {
- dir.viewToModelUpdate(newValue);
- control.updateValue(newValue, { emitModelToViewChange: false });
- control.markAsDirty();
- });
- // model -> view
- control.registerOnChange(function (newValue) { return dir.valueAccessor.writeValue(newValue); });
- // touched
- dir.valueAccessor.registerOnTouched(function () { return control.markAsTouched(); });
- }
- exports.setUpControl = setUpControl;
- function setUpControlGroup(control, dir) {
- if (lang_1.isBlank(control))
- _throwError(dir, "Cannot find control");
- control.validator = validators_1.Validators.compose([control.validator, dir.validator]);
- control.asyncValidator = validators_1.Validators.composeAsync([control.asyncValidator, dir.asyncValidator]);
- }
- exports.setUpControlGroup = setUpControlGroup;
- function _throwError(dir, message) {
- var path = dir.path.join(" -> ");
- throw new exceptions_1.BaseException(message + " '" + path + "'");
- }
- function composeValidators(validators) {
- return lang_1.isPresent(validators) ? validators_1.Validators.compose(validators.map(normalize_validator_1.normalizeValidator)) : null;
- }
- exports.composeValidators = composeValidators;
- function composeAsyncValidators(validators) {
- return lang_1.isPresent(validators) ? validators_1.Validators.composeAsync(validators.map(normalize_validator_1.normalizeValidator)) : null;
- }
- exports.composeAsyncValidators = composeAsyncValidators;
- function isPropertyUpdated(changes, viewModel) {
- if (!collection_1.StringMapWrapper.contains(changes, "model"))
- return false;
- var change = changes["model"];
- if (change.isFirstChange())
- return true;
- return !lang_1.looseIdentical(viewModel, change.currentValue);
- }
- exports.isPropertyUpdated = isPropertyUpdated;
- // TODO: vsavkin remove it once https://github.com/angular/angular/issues/3011 is implemented
- function selectValueAccessor(dir, valueAccessors) {
- if (lang_1.isBlank(valueAccessors))
- return null;
- var defaultAccessor;
- var builtinAccessor;
- var customAccessor;
- valueAccessors.forEach(function (v) {
- if (v instanceof default_value_accessor_1.DefaultValueAccessor) {
- defaultAccessor = v;
- }
- else if (v instanceof checkbox_value_accessor_1.CheckboxControlValueAccessor || v instanceof number_value_accessor_1.NumberValueAccessor ||
- v instanceof select_control_value_accessor_1.SelectControlValueAccessor) {
- if (lang_1.isPresent(builtinAccessor))
- _throwError(dir, "More than one built-in value accessor matches");
- builtinAccessor = v;
- }
- else {
- if (lang_1.isPresent(customAccessor))
- _throwError(dir, "More than one custom value accessor matches");
- customAccessor = v;
- }
- });
- if (lang_1.isPresent(customAccessor))
- return customAccessor;
- if (lang_1.isPresent(builtinAccessor))
- return builtinAccessor;
- if (lang_1.isPresent(defaultAccessor))
- return defaultAccessor;
- _throwError(dir, "No valid value accessor for");
- return null;
- }
- exports.selectValueAccessor = selectValueAccessor;
- /***/ },
- /* 131 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var promise_1 = __webpack_require__(61);
- var async_1 = __webpack_require__(60);
- var collection_1 = __webpack_require__(12);
- var core_1 = __webpack_require__(2);
- /**
- * Providers for validators to be used for {@link Control}s in a form.
- *
- * Provide this using `multi: true` to add validators.
- *
- * ### Example
- *
- * {@example core/forms/ts/ng_validators/ng_validators.ts region='ng_validators'}
- */
- exports.NG_VALIDATORS = lang_1.CONST_EXPR(new core_1.OpaqueToken("NgValidators"));
- /**
- * Providers for asynchronous validators to be used for {@link Control}s
- * in a form.
- *
- * Provide this using `multi: true` to add validators.
- *
- * See {@link NG_VALIDATORS} for more details.
- */
- exports.NG_ASYNC_VALIDATORS = lang_1.CONST_EXPR(new core_1.OpaqueToken("NgAsyncValidators"));
- /**
- * Provides a set of validators used by form controls.
- *
- * A validator is a function that processes a {@link Control} or collection of
- * controls and returns a map of errors. A null map means that validation has passed.
- *
- * ### Example
- *
- * ```typescript
- * var loginControl = new Control("", Validators.required)
- * ```
- */
- var Validators = (function () {
- function Validators() {
- }
- /**
- * Validator that requires controls to have a non-empty value.
- */
- Validators.required = function (control) {
- return lang_1.isBlank(control.value) || control.value == "" ? { "required": true } : null;
- };
- /**
- * Validator that requires controls to have a value of a minimum length.
- */
- Validators.minLength = function (minLength) {
- return function (control) {
- if (lang_1.isPresent(Validators.required(control)))
- return null;
- var v = control.value;
- return v.length < minLength ?
- { "minlength": { "requiredLength": minLength, "actualLength": v.length } } :
- null;
- };
- };
- /**
- * Validator that requires controls to have a value of a maximum length.
- */
- Validators.maxLength = function (maxLength) {
- return function (control) {
- if (lang_1.isPresent(Validators.required(control)))
- return null;
- var v = control.value;
- return v.length > maxLength ?
- { "maxlength": { "requiredLength": maxLength, "actualLength": v.length } } :
- null;
- };
- };
- /**
- * No-op validator.
- */
- Validators.nullValidator = function (c) { return null; };
- /**
- * Compose multiple validators into a single function that returns the union
- * of the individual error maps.
- */
- Validators.compose = function (validators) {
- if (lang_1.isBlank(validators))
- return null;
- var presentValidators = validators.filter(lang_1.isPresent);
- if (presentValidators.length == 0)
- return null;
- return function (control) {
- return _mergeErrors(_executeValidators(control, presentValidators));
- };
- };
- Validators.composeAsync = function (validators) {
- if (lang_1.isBlank(validators))
- return null;
- var presentValidators = validators.filter(lang_1.isPresent);
- if (presentValidators.length == 0)
- return null;
- return function (control) {
- var promises = _executeValidators(control, presentValidators).map(_convertToPromise);
- return promise_1.PromiseWrapper.all(promises).then(_mergeErrors);
- };
- };
- return Validators;
- })();
- exports.Validators = Validators;
- function _convertToPromise(obj) {
- return promise_1.PromiseWrapper.isPromise(obj) ? obj : async_1.ObservableWrapper.toPromise(obj);
- }
- function _executeValidators(control, validators) {
- return validators.map(function (v) { return v(control); });
- }
- function _mergeErrors(arrayOfErrors) {
- var res = arrayOfErrors.reduce(function (res, errors) {
- return lang_1.isPresent(errors) ? collection_1.StringMapWrapper.merge(res, errors) : res;
- }, {});
- return collection_1.StringMapWrapper.isEmpty(res) ? null : res;
- }
- /***/ },
- /* 132 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var core_1 = __webpack_require__(2);
- var control_value_accessor_1 = __webpack_require__(129);
- var lang_1 = __webpack_require__(5);
- var DEFAULT_VALUE_ACCESSOR = lang_1.CONST_EXPR(new core_1.Provider(control_value_accessor_1.NG_VALUE_ACCESSOR, { useExisting: core_1.forwardRef(function () { return DefaultValueAccessor; }), multi: true }));
- /**
- * The default accessor for writing a value and listening to changes that is used by the
- * {@link NgModel}, {@link NgFormControl}, and {@link NgControlName} directives.
- *
- * ### Example
- * ```
- * <input type="text" ngControl="searchQuery">
- * ```
- */
- var DefaultValueAccessor = (function () {
- function DefaultValueAccessor(_renderer, _elementRef) {
- this._renderer = _renderer;
- this._elementRef = _elementRef;
- this.onChange = function (_) { };
- this.onTouched = function () { };
- }
- DefaultValueAccessor.prototype.writeValue = function (value) {
- var normalizedValue = lang_1.isBlank(value) ? '' : value;
- this._renderer.setElementProperty(this._elementRef, 'value', normalizedValue);
- };
- DefaultValueAccessor.prototype.registerOnChange = function (fn) { this.onChange = fn; };
- DefaultValueAccessor.prototype.registerOnTouched = function (fn) { this.onTouched = fn; };
- DefaultValueAccessor = __decorate([
- core_1.Directive({
- selector: 'input:not([type=checkbox])[ngControl],textarea[ngControl],input:not([type=checkbox])[ngFormControl],textarea[ngFormControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]',
- // TODO: vsavkin replace the above selector with the one below it once
- // https://github.com/angular/angular/issues/3011 is implemented
- // selector: '[ngControl],[ngModel],[ngFormControl]',
- host: { '(input)': 'onChange($event.target.value)', '(blur)': 'onTouched()' },
- bindings: [DEFAULT_VALUE_ACCESSOR]
- }),
- __metadata('design:paramtypes', [core_1.Renderer, core_1.ElementRef])
- ], DefaultValueAccessor);
- return DefaultValueAccessor;
- })();
- exports.DefaultValueAccessor = DefaultValueAccessor;
- /***/ },
- /* 133 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var core_1 = __webpack_require__(2);
- var control_value_accessor_1 = __webpack_require__(129);
- var lang_1 = __webpack_require__(5);
- var NUMBER_VALUE_ACCESSOR = lang_1.CONST_EXPR(new core_1.Provider(control_value_accessor_1.NG_VALUE_ACCESSOR, { useExisting: core_1.forwardRef(function () { return NumberValueAccessor; }), multi: true }));
- /**
- * The accessor for writing a number value and listening to changes that is used by the
- * {@link NgModel}, {@link NgFormControl}, and {@link NgControlName} directives.
- *
- * ### Example
- * ```
- * <input type="number" [(ngModel)]="age">
- * ```
- */
- var NumberValueAccessor = (function () {
- function NumberValueAccessor(_renderer, _elementRef) {
- this._renderer = _renderer;
- this._elementRef = _elementRef;
- this.onChange = function (_) { };
- this.onTouched = function () { };
- }
- NumberValueAccessor.prototype.writeValue = function (value) {
- this._renderer.setElementProperty(this._elementRef, 'value', value);
- };
- NumberValueAccessor.prototype.registerOnChange = function (fn) {
- this.onChange = function (value) { fn(lang_1.NumberWrapper.parseFloat(value)); };
- };
- NumberValueAccessor.prototype.registerOnTouched = function (fn) { this.onTouched = fn; };
- NumberValueAccessor = __decorate([
- core_1.Directive({
- selector: 'input[type=number][ngControl],input[type=number][ngFormControl],input[type=number][ngModel]',
- host: {
- '(change)': 'onChange($event.target.value)',
- '(input)': 'onChange($event.target.value)',
- '(blur)': 'onTouched()'
- },
- bindings: [NUMBER_VALUE_ACCESSOR]
- }),
- __metadata('design:paramtypes', [core_1.Renderer, core_1.ElementRef])
- ], NumberValueAccessor);
- return NumberValueAccessor;
- })();
- exports.NumberValueAccessor = NumberValueAccessor;
- /***/ },
- /* 134 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var core_1 = __webpack_require__(2);
- var control_value_accessor_1 = __webpack_require__(129);
- var lang_1 = __webpack_require__(5);
- var CHECKBOX_VALUE_ACCESSOR = lang_1.CONST_EXPR(new core_1.Provider(control_value_accessor_1.NG_VALUE_ACCESSOR, { useExisting: core_1.forwardRef(function () { return CheckboxControlValueAccessor; }), multi: true }));
- /**
- * The accessor for writing a value and listening to changes on a checkbox input element.
- *
- * ### Example
- * ```
- * <input type="checkbox" ngControl="rememberLogin">
- * ```
- */
- var CheckboxControlValueAccessor = (function () {
- function CheckboxControlValueAccessor(_renderer, _elementRef) {
- this._renderer = _renderer;
- this._elementRef = _elementRef;
- this.onChange = function (_) { };
- this.onTouched = function () { };
- }
- CheckboxControlValueAccessor.prototype.writeValue = function (value) {
- this._renderer.setElementProperty(this._elementRef, 'checked', value);
- };
- CheckboxControlValueAccessor.prototype.registerOnChange = function (fn) { this.onChange = fn; };
- CheckboxControlValueAccessor.prototype.registerOnTouched = function (fn) { this.onTouched = fn; };
- CheckboxControlValueAccessor = __decorate([
- core_1.Directive({
- selector: 'input[type=checkbox][ngControl],input[type=checkbox][ngFormControl],input[type=checkbox][ngModel]',
- host: { '(change)': 'onChange($event.target.checked)', '(blur)': 'onTouched()' },
- bindings: [CHECKBOX_VALUE_ACCESSOR]
- }),
- __metadata('design:paramtypes', [core_1.Renderer, core_1.ElementRef])
- ], CheckboxControlValueAccessor);
- return CheckboxControlValueAccessor;
- })();
- exports.CheckboxControlValueAccessor = CheckboxControlValueAccessor;
- /***/ },
- /* 135 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var __param = (this && this.__param) || function (paramIndex, decorator) {
- return function (target, key) { decorator(target, key, paramIndex); }
- };
- var core_1 = __webpack_require__(2);
- var async_1 = __webpack_require__(60);
- var control_value_accessor_1 = __webpack_require__(129);
- var lang_1 = __webpack_require__(5);
- var SELECT_VALUE_ACCESSOR = lang_1.CONST_EXPR(new core_1.Provider(control_value_accessor_1.NG_VALUE_ACCESSOR, { useExisting: core_1.forwardRef(function () { return SelectControlValueAccessor; }), multi: true }));
- /**
- * Marks `<option>` as dynamic, so Angular can be notified when options change.
- *
- * ### Example
- *
- * ```
- * <select ngControl="city">
- * <option *ngFor="#c of cities" [value]="c"></option>
- * </select>
- * ```
- */
- var NgSelectOption = (function () {
- function NgSelectOption() {
- }
- NgSelectOption = __decorate([
- core_1.Directive({ selector: 'option' }),
- __metadata('design:paramtypes', [])
- ], NgSelectOption);
- return NgSelectOption;
- })();
- exports.NgSelectOption = NgSelectOption;
- /**
- * The accessor for writing a value and listening to changes on a select element.
- */
- var SelectControlValueAccessor = (function () {
- function SelectControlValueAccessor(_renderer, _elementRef, query) {
- this._renderer = _renderer;
- this._elementRef = _elementRef;
- this.onChange = function (_) { };
- this.onTouched = function () { };
- this._updateValueWhenListOfOptionsChanges(query);
- }
- SelectControlValueAccessor.prototype.writeValue = function (value) {
- this.value = value;
- this._renderer.setElementProperty(this._elementRef, 'value', value);
- };
- SelectControlValueAccessor.prototype.registerOnChange = function (fn) { this.onChange = fn; };
- SelectControlValueAccessor.prototype.registerOnTouched = function (fn) { this.onTouched = fn; };
- SelectControlValueAccessor.prototype._updateValueWhenListOfOptionsChanges = function (query) {
- var _this = this;
- async_1.ObservableWrapper.subscribe(query.changes, function (_) { return _this.writeValue(_this.value); });
- };
- SelectControlValueAccessor = __decorate([
- core_1.Directive({
- selector: 'select[ngControl],select[ngFormControl],select[ngModel]',
- host: {
- '(change)': 'onChange($event.target.value)',
- '(input)': 'onChange($event.target.value)',
- '(blur)': 'onTouched()'
- },
- bindings: [SELECT_VALUE_ACCESSOR]
- }),
- __param(2, core_1.Query(NgSelectOption, { descendants: true })),
- __metadata('design:paramtypes', [core_1.Renderer, core_1.ElementRef, core_1.QueryList])
- ], SelectControlValueAccessor);
- return SelectControlValueAccessor;
- })();
- exports.SelectControlValueAccessor = SelectControlValueAccessor;
- /***/ },
- /* 136 */
- /***/ function(module, exports) {
- function normalizeValidator(validator) {
- if (validator.validate !== undefined) {
- return function (c) { return validator.validate(c); };
- }
- else {
- return validator;
- }
- }
- exports.normalizeValidator = normalizeValidator;
- /***/ },
- /* 137 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var __param = (this && this.__param) || function (paramIndex, decorator) {
- return function (target, key) { decorator(target, key, paramIndex); }
- };
- var lang_1 = __webpack_require__(5);
- var collection_1 = __webpack_require__(12);
- var async_1 = __webpack_require__(60);
- var core_1 = __webpack_require__(2);
- var ng_control_1 = __webpack_require__(128);
- var validators_1 = __webpack_require__(131);
- var control_value_accessor_1 = __webpack_require__(129);
- var shared_1 = __webpack_require__(130);
- var formControlBinding = lang_1.CONST_EXPR(new core_1.Provider(ng_control_1.NgControl, { useExisting: core_1.forwardRef(function () { return NgFormControl; }) }));
- /**
- * Binds an existing {@link Control} to a DOM element.
- *
- * ### Example ([live demo](http://plnkr.co/edit/jcQlZ2tTh22BZZ2ucNAT?p=preview))
- *
- * In this example, we bind the control to an input element. When the value of the input element
- * changes, the value of the control will reflect that change. Likewise, if the value of the
- * control changes, the input element reflects that change.
- *
- * ```typescript
- * @Component({
- * selector: 'my-app',
- * template: `
- * <div>
- * <h2>NgFormControl Example</h2>
- * <form>
- * <p>Element with existing control: <input type="text"
- * [ngFormControl]="loginControl"></p>
- * <p>Value of existing control: {{loginControl.value}}</p>
- * </form>
- * </div>
- * `,
- * directives: [CORE_DIRECTIVES, FORM_DIRECTIVES]
- * })
- * export class App {
- * loginControl: Control = new Control('');
- * }
- * ```
- *
- * ###ngModel
- *
- * We can also use `ngModel` to bind a domain model to the form.
- *
- * ### Example ([live demo](http://plnkr.co/edit/yHMLuHO7DNgT8XvtjTDH?p=preview))
- *
- * ```typescript
- * @Component({
- * selector: "login-comp",
- * directives: [FORM_DIRECTIVES],
- * template: "<input type='text' [ngFormControl]='loginControl' [(ngModel)]='login'>"
- * })
- * class LoginComp {
- * loginControl: Control = new Control('');
- * login:string;
- * }
- * ```
- */
- var NgFormControl = (function (_super) {
- __extends(NgFormControl, _super);
- function NgFormControl(_validators, _asyncValidators, valueAccessors) {
- _super.call(this);
- this._validators = _validators;
- this._asyncValidators = _asyncValidators;
- this.update = new async_1.EventEmitter();
- this.valueAccessor = shared_1.selectValueAccessor(this, valueAccessors);
- }
- NgFormControl.prototype.ngOnChanges = function (changes) {
- if (this._isControlChanged(changes)) {
- shared_1.setUpControl(this.form, this);
- this.form.updateValueAndValidity({ emitEvent: false });
- }
- if (shared_1.isPropertyUpdated(changes, this.viewModel)) {
- this.form.updateValue(this.model);
- this.viewModel = this.model;
- }
- };
- Object.defineProperty(NgFormControl.prototype, "path", {
- get: function () { return []; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(NgFormControl.prototype, "validator", {
- get: function () { return shared_1.composeValidators(this._validators); },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(NgFormControl.prototype, "asyncValidator", {
- get: function () { return shared_1.composeAsyncValidators(this._asyncValidators); },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(NgFormControl.prototype, "control", {
- get: function () { return this.form; },
- enumerable: true,
- configurable: true
- });
- NgFormControl.prototype.viewToModelUpdate = function (newValue) {
- this.viewModel = newValue;
- async_1.ObservableWrapper.callEmit(this.update, newValue);
- };
- NgFormControl.prototype._isControlChanged = function (changes) {
- return collection_1.StringMapWrapper.contains(changes, "form");
- };
- NgFormControl = __decorate([
- core_1.Directive({
- selector: '[ngFormControl]',
- bindings: [formControlBinding],
- inputs: ['form: ngFormControl', 'model: ngModel'],
- outputs: ['update: ngModelChange'],
- exportAs: 'ngForm'
- }),
- __param(0, core_1.Optional()),
- __param(0, core_1.Self()),
- __param(0, core_1.Inject(validators_1.NG_VALIDATORS)),
- __param(1, core_1.Optional()),
- __param(1, core_1.Self()),
- __param(1, core_1.Inject(validators_1.NG_ASYNC_VALIDATORS)),
- __param(2, core_1.Optional()),
- __param(2, core_1.Self()),
- __param(2, core_1.Inject(control_value_accessor_1.NG_VALUE_ACCESSOR)),
- __metadata('design:paramtypes', [Array, Array, Array])
- ], NgFormControl);
- return NgFormControl;
- })(ng_control_1.NgControl);
- exports.NgFormControl = NgFormControl;
- /***/ },
- /* 138 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var __param = (this && this.__param) || function (paramIndex, decorator) {
- return function (target, key) { decorator(target, key, paramIndex); }
- };
- var lang_1 = __webpack_require__(5);
- var async_1 = __webpack_require__(60);
- var core_1 = __webpack_require__(2);
- var control_value_accessor_1 = __webpack_require__(129);
- var ng_control_1 = __webpack_require__(128);
- var model_1 = __webpack_require__(124);
- var validators_1 = __webpack_require__(131);
- var shared_1 = __webpack_require__(130);
- var formControlBinding = lang_1.CONST_EXPR(new core_1.Provider(ng_control_1.NgControl, { useExisting: core_1.forwardRef(function () { return NgModel; }) }));
- /**
- * Binds a domain model to a form control.
- *
- * ### Usage
- *
- * `ngModel` binds an existing domain model to a form control. For a
- * two-way binding, use `[(ngModel)]` to ensure the model updates in
- * both directions.
- *
- * ### Example ([live demo](http://plnkr.co/edit/R3UX5qDaUqFO2VYR0UzH?p=preview))
- * ```typescript
- * @Component({
- * selector: "search-comp",
- * directives: [FORM_DIRECTIVES],
- * template: `<input type='text' [(ngModel)]="searchQuery">`
- * })
- * class SearchComp {
- * searchQuery: string;
- * }
- * ```
- */
- var NgModel = (function (_super) {
- __extends(NgModel, _super);
- function NgModel(_validators, _asyncValidators, valueAccessors) {
- _super.call(this);
- this._validators = _validators;
- this._asyncValidators = _asyncValidators;
- /** @internal */
- this._control = new model_1.Control();
- /** @internal */
- this._added = false;
- this.update = new async_1.EventEmitter();
- this.valueAccessor = shared_1.selectValueAccessor(this, valueAccessors);
- }
- NgModel.prototype.ngOnChanges = function (changes) {
- if (!this._added) {
- shared_1.setUpControl(this._control, this);
- this._control.updateValueAndValidity({ emitEvent: false });
- this._added = true;
- }
- if (shared_1.isPropertyUpdated(changes, this.viewModel)) {
- this._control.updateValue(this.model);
- this.viewModel = this.model;
- }
- };
- Object.defineProperty(NgModel.prototype, "control", {
- get: function () { return this._control; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(NgModel.prototype, "path", {
- get: function () { return []; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(NgModel.prototype, "validator", {
- get: function () { return shared_1.composeValidators(this._validators); },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(NgModel.prototype, "asyncValidator", {
- get: function () { return shared_1.composeAsyncValidators(this._asyncValidators); },
- enumerable: true,
- configurable: true
- });
- NgModel.prototype.viewToModelUpdate = function (newValue) {
- this.viewModel = newValue;
- async_1.ObservableWrapper.callEmit(this.update, newValue);
- };
- NgModel = __decorate([
- core_1.Directive({
- selector: '[ngModel]:not([ngControl]):not([ngFormControl])',
- bindings: [formControlBinding],
- inputs: ['model: ngModel'],
- outputs: ['update: ngModelChange'],
- exportAs: 'ngForm'
- }),
- __param(0, core_1.Optional()),
- __param(0, core_1.Self()),
- __param(0, core_1.Inject(validators_1.NG_VALIDATORS)),
- __param(1, core_1.Optional()),
- __param(1, core_1.Self()),
- __param(1, core_1.Inject(validators_1.NG_ASYNC_VALIDATORS)),
- __param(2, core_1.Optional()),
- __param(2, core_1.Self()),
- __param(2, core_1.Inject(control_value_accessor_1.NG_VALUE_ACCESSOR)),
- __metadata('design:paramtypes', [Array, Array, Array])
- ], NgModel);
- return NgModel;
- })(ng_control_1.NgControl);
- exports.NgModel = NgModel;
- /***/ },
- /* 139 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var __param = (this && this.__param) || function (paramIndex, decorator) {
- return function (target, key) { decorator(target, key, paramIndex); }
- };
- var core_1 = __webpack_require__(2);
- var lang_1 = __webpack_require__(5);
- var control_container_1 = __webpack_require__(126);
- var shared_1 = __webpack_require__(130);
- var validators_1 = __webpack_require__(131);
- var controlGroupProvider = lang_1.CONST_EXPR(new core_1.Provider(control_container_1.ControlContainer, { useExisting: core_1.forwardRef(function () { return NgControlGroup; }) }));
- /**
- * Creates and binds a control group to a DOM element.
- *
- * This directive can only be used as a child of {@link NgForm} or {@link NgFormModel}.
- *
- * ### Example ([live demo](http://plnkr.co/edit/7EJ11uGeaggViYM6T5nq?p=preview))
- *
- * ```typescript
- * @Component({
- * selector: 'my-app',
- * directives: [FORM_DIRECTIVES],
- * })
- * @View({
- * template: `
- * <div>
- * <h2>Angular2 Control & ControlGroup Example</h2>
- * <form #f="ngForm">
- * <div ngControlGroup="name" #cg-name="form">
- * <h3>Enter your name:</h3>
- * <p>First: <input ngControl="first" required></p>
- * <p>Middle: <input ngControl="middle"></p>
- * <p>Last: <input ngControl="last" required></p>
- * </div>
- * <h3>Name value:</h3>
- * <pre>{{valueOf(cgName)}}</pre>
- * <p>Name is {{cgName?.control?.valid ? "valid" : "invalid"}}</p>
- * <h3>What's your favorite food?</h3>
- * <p><input ngControl="food"></p>
- * <h3>Form value</h3>
- * <pre>{{valueOf(f)}}</pre>
- * </form>
- * </div>
- * `,
- * directives: [FORM_DIRECTIVES]
- * })
- * export class App {
- * valueOf(cg: NgControlGroup): string {
- * if (cg.control == null) {
- * return null;
- * }
- * return JSON.stringify(cg.control.value, null, 2);
- * }
- * }
- * ```
- *
- * This example declares a control group for a user's name. The value and validation state of
- * this group can be accessed separately from the overall form.
- */
- var NgControlGroup = (function (_super) {
- __extends(NgControlGroup, _super);
- function NgControlGroup(parent, _validators, _asyncValidators) {
- _super.call(this);
- this._validators = _validators;
- this._asyncValidators = _asyncValidators;
- this._parent = parent;
- }
- NgControlGroup.prototype.ngOnInit = function () { this.formDirective.addControlGroup(this); };
- NgControlGroup.prototype.ngOnDestroy = function () { this.formDirective.removeControlGroup(this); };
- Object.defineProperty(NgControlGroup.prototype, "control", {
- /**
- * Get the {@link ControlGroup} backing this binding.
- */
- get: function () { return this.formDirective.getControlGroup(this); },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(NgControlGroup.prototype, "path", {
- /**
- * Get the path to this control group.
- */
- get: function () { return shared_1.controlPath(this.name, this._parent); },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(NgControlGroup.prototype, "formDirective", {
- /**
- * Get the {@link Form} to which this group belongs.
- */
- get: function () { return this._parent.formDirective; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(NgControlGroup.prototype, "validator", {
- get: function () { return shared_1.composeValidators(this._validators); },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(NgControlGroup.prototype, "asyncValidator", {
- get: function () { return shared_1.composeAsyncValidators(this._asyncValidators); },
- enumerable: true,
- configurable: true
- });
- NgControlGroup = __decorate([
- core_1.Directive({
- selector: '[ngControlGroup]',
- providers: [controlGroupProvider],
- inputs: ['name: ngControlGroup'],
- exportAs: 'ngForm'
- }),
- __param(0, core_1.Host()),
- __param(0, core_1.SkipSelf()),
- __param(1, core_1.Optional()),
- __param(1, core_1.Self()),
- __param(1, core_1.Inject(validators_1.NG_VALIDATORS)),
- __param(2, core_1.Optional()),
- __param(2, core_1.Self()),
- __param(2, core_1.Inject(validators_1.NG_ASYNC_VALIDATORS)),
- __metadata('design:paramtypes', [control_container_1.ControlContainer, Array, Array])
- ], NgControlGroup);
- return NgControlGroup;
- })(control_container_1.ControlContainer);
- exports.NgControlGroup = NgControlGroup;
- /***/ },
- /* 140 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var __param = (this && this.__param) || function (paramIndex, decorator) {
- return function (target, key) { decorator(target, key, paramIndex); }
- };
- var lang_1 = __webpack_require__(5);
- var collection_1 = __webpack_require__(12);
- var async_1 = __webpack_require__(60);
- var core_1 = __webpack_require__(2);
- var control_container_1 = __webpack_require__(126);
- var shared_1 = __webpack_require__(130);
- var validators_1 = __webpack_require__(131);
- var formDirectiveProvider = lang_1.CONST_EXPR(new core_1.Provider(control_container_1.ControlContainer, { useExisting: core_1.forwardRef(function () { return NgFormModel; }) }));
- /**
- * Binds an existing control group to a DOM element.
- *
- * ### Example ([live demo](http://plnkr.co/edit/jqrVirudY8anJxTMUjTP?p=preview))
- *
- * In this example, we bind the control group to the form element, and we bind the login and
- * password controls to the login and password elements.
- *
- * ```typescript
- * @Component({
- * selector: 'my-app',
- * template: `
- * <div>
- * <h2>NgFormModel Example</h2>
- * <form [ngFormModel]="loginForm">
- * <p>Login: <input type="text" ngControl="login"></p>
- * <p>Password: <input type="password" ngControl="password"></p>
- * </form>
- * <p>Value:</p>
- * <pre>{{value}}</pre>
- * </div>
- * `,
- * directives: [FORM_DIRECTIVES]
- * })
- * export class App {
- * loginForm: ControlGroup;
- *
- * constructor() {
- * this.loginForm = new ControlGroup({
- * login: new Control(""),
- * password: new Control("")
- * });
- * }
- *
- * get value(): string {
- * return JSON.stringify(this.loginForm.value, null, 2);
- * }
- * }
- * ```
- *
- * We can also use ngModel to bind a domain model to the form.
- *
- * ```typescript
- * @Component({
- * selector: "login-comp",
- * directives: [FORM_DIRECTIVES],
- * template: `
- * <form [ngFormModel]='loginForm'>
- * Login <input type='text' ngControl='login' [(ngModel)]='credentials.login'>
- * Password <input type='password' ngControl='password'
- * [(ngModel)]='credentials.password'>
- * <button (click)="onLogin()">Login</button>
- * </form>`
- * })
- * class LoginComp {
- * credentials: {login: string, password: string};
- * loginForm: ControlGroup;
- *
- * constructor() {
- * this.loginForm = new ControlGroup({
- * login: new Control(""),
- * password: new Control("")
- * });
- * }
- *
- * onLogin(): void {
- * // this.credentials.login === 'some login'
- * // this.credentials.password === 'some password'
- * }
- * }
- * ```
- */
- var NgFormModel = (function (_super) {
- __extends(NgFormModel, _super);
- function NgFormModel(_validators, _asyncValidators) {
- _super.call(this);
- this._validators = _validators;
- this._asyncValidators = _asyncValidators;
- this.form = null;
- this.directives = [];
- this.ngSubmit = new async_1.EventEmitter();
- }
- NgFormModel.prototype.ngOnChanges = function (changes) {
- if (collection_1.StringMapWrapper.contains(changes, "form")) {
- var sync = shared_1.composeValidators(this._validators);
- this.form.validator = validators_1.Validators.compose([this.form.validator, sync]);
- var async = shared_1.composeAsyncValidators(this._asyncValidators);
- this.form.asyncValidator = validators_1.Validators.composeAsync([this.form.asyncValidator, async]);
- this.form.updateValueAndValidity({ onlySelf: true, emitEvent: false });
- }
- this._updateDomValue();
- };
- Object.defineProperty(NgFormModel.prototype, "formDirective", {
- get: function () { return this; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(NgFormModel.prototype, "control", {
- get: function () { return this.form; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(NgFormModel.prototype, "path", {
- get: function () { return []; },
- enumerable: true,
- configurable: true
- });
- NgFormModel.prototype.addControl = function (dir) {
- var ctrl = this.form.find(dir.path);
- shared_1.setUpControl(ctrl, dir);
- ctrl.updateValueAndValidity({ emitEvent: false });
- this.directives.push(dir);
- };
- NgFormModel.prototype.getControl = function (dir) { return this.form.find(dir.path); };
- NgFormModel.prototype.removeControl = function (dir) { collection_1.ListWrapper.remove(this.directives, dir); };
- NgFormModel.prototype.addControlGroup = function (dir) {
- var ctrl = this.form.find(dir.path);
- shared_1.setUpControlGroup(ctrl, dir);
- ctrl.updateValueAndValidity({ emitEvent: false });
- };
- NgFormModel.prototype.removeControlGroup = function (dir) { };
- NgFormModel.prototype.getControlGroup = function (dir) {
- return this.form.find(dir.path);
- };
- NgFormModel.prototype.updateModel = function (dir, value) {
- var ctrl = this.form.find(dir.path);
- ctrl.updateValue(value);
- };
- NgFormModel.prototype.onSubmit = function () {
- async_1.ObservableWrapper.callEmit(this.ngSubmit, null);
- return false;
- };
- /** @internal */
- NgFormModel.prototype._updateDomValue = function () {
- var _this = this;
- this.directives.forEach(function (dir) {
- var ctrl = _this.form.find(dir.path);
- dir.valueAccessor.writeValue(ctrl.value);
- });
- };
- NgFormModel = __decorate([
- core_1.Directive({
- selector: '[ngFormModel]',
- bindings: [formDirectiveProvider],
- inputs: ['form: ngFormModel'],
- host: { '(submit)': 'onSubmit()' },
- outputs: ['ngSubmit'],
- exportAs: 'ngForm'
- }),
- __param(0, core_1.Optional()),
- __param(0, core_1.Self()),
- __param(0, core_1.Inject(validators_1.NG_VALIDATORS)),
- __param(1, core_1.Optional()),
- __param(1, core_1.Self()),
- __param(1, core_1.Inject(validators_1.NG_ASYNC_VALIDATORS)),
- __metadata('design:paramtypes', [Array, Array])
- ], NgFormModel);
- return NgFormModel;
- })(control_container_1.ControlContainer);
- exports.NgFormModel = NgFormModel;
- /***/ },
- /* 141 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var __param = (this && this.__param) || function (paramIndex, decorator) {
- return function (target, key) { decorator(target, key, paramIndex); }
- };
- var async_1 = __webpack_require__(60);
- var collection_1 = __webpack_require__(12);
- var lang_1 = __webpack_require__(5);
- var core_1 = __webpack_require__(2);
- var control_container_1 = __webpack_require__(126);
- var model_1 = __webpack_require__(124);
- var shared_1 = __webpack_require__(130);
- var validators_1 = __webpack_require__(131);
- var formDirectiveProvider = lang_1.CONST_EXPR(new core_1.Provider(control_container_1.ControlContainer, { useExisting: core_1.forwardRef(function () { return NgForm; }) }));
- /**
- * If `NgForm` is bound in a component, `<form>` elements in that component will be
- * upgraded to use the Angular form system.
- *
- * ### Typical Use
- *
- * Include `FORM_DIRECTIVES` in the `directives` section of a {@link View} annotation
- * to use `NgForm` and its associated controls.
- *
- * ### Structure
- *
- * An Angular form is a collection of `Control`s in some hierarchy.
- * `Control`s can be at the top level or can be organized in `ControlGroup`s
- * or `ControlArray`s. This hierarchy is reflected in the form's `value`, a
- * JSON object that mirrors the form structure.
- *
- * ### Submission
- *
- * The `ngSubmit` event signals when the user triggers a form submission.
- *
- * ### Example ([live demo](http://plnkr.co/edit/ltdgYj4P0iY64AR71EpL?p=preview))
- *
- * ```typescript
- * @Component({
- * selector: 'my-app',
- * template: `
- * <div>
- * <p>Submit the form to see the data object Angular builds</p>
- * <h2>NgForm demo</h2>
- * <form #f="ngForm" (ngSubmit)="onSubmit(f.value)">
- * <h3>Control group: credentials</h3>
- * <div ngControlGroup="credentials">
- * <p>Login: <input type="text" ngControl="login"></p>
- * <p>Password: <input type="password" ngControl="password"></p>
- * </div>
- * <h3>Control group: person</h3>
- * <div ngControlGroup="person">
- * <p>First name: <input type="text" ngControl="firstName"></p>
- * <p>Last name: <input type="text" ngControl="lastName"></p>
- * </div>
- * <button type="submit">Submit Form</button>
- * <p>Form data submitted:</p>
- * </form>
- * <pre>{{data}}</pre>
- * </div>
- * `,
- * directives: [CORE_DIRECTIVES, FORM_DIRECTIVES]
- * })
- * export class App {
- * constructor() {}
- *
- * data: string;
- *
- * onSubmit(data) {
- * this.data = JSON.stringify(data, null, 2);
- * }
- * }
- * ```
- */
- var NgForm = (function (_super) {
- __extends(NgForm, _super);
- function NgForm(validators, asyncValidators) {
- _super.call(this);
- this.ngSubmit = new async_1.EventEmitter();
- this.form = new model_1.ControlGroup({}, null, shared_1.composeValidators(validators), shared_1.composeAsyncValidators(asyncValidators));
- }
- Object.defineProperty(NgForm.prototype, "formDirective", {
- get: function () { return this; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(NgForm.prototype, "control", {
- get: function () { return this.form; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(NgForm.prototype, "path", {
- get: function () { return []; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(NgForm.prototype, "controls", {
- get: function () { return this.form.controls; },
- enumerable: true,
- configurable: true
- });
- NgForm.prototype.addControl = function (dir) {
- var _this = this;
- async_1.PromiseWrapper.scheduleMicrotask(function () {
- var container = _this._findContainer(dir.path);
- var ctrl = new model_1.Control();
- shared_1.setUpControl(ctrl, dir);
- container.addControl(dir.name, ctrl);
- ctrl.updateValueAndValidity({ emitEvent: false });
- });
- };
- NgForm.prototype.getControl = function (dir) { return this.form.find(dir.path); };
- NgForm.prototype.removeControl = function (dir) {
- var _this = this;
- async_1.PromiseWrapper.scheduleMicrotask(function () {
- var container = _this._findContainer(dir.path);
- if (lang_1.isPresent(container)) {
- container.removeControl(dir.name);
- container.updateValueAndValidity({ emitEvent: false });
- }
- });
- };
- NgForm.prototype.addControlGroup = function (dir) {
- var _this = this;
- async_1.PromiseWrapper.scheduleMicrotask(function () {
- var container = _this._findContainer(dir.path);
- var group = new model_1.ControlGroup({});
- shared_1.setUpControlGroup(group, dir);
- container.addControl(dir.name, group);
- group.updateValueAndValidity({ emitEvent: false });
- });
- };
- NgForm.prototype.removeControlGroup = function (dir) {
- var _this = this;
- async_1.PromiseWrapper.scheduleMicrotask(function () {
- var container = _this._findContainer(dir.path);
- if (lang_1.isPresent(container)) {
- container.removeControl(dir.name);
- container.updateValueAndValidity({ emitEvent: false });
- }
- });
- };
- NgForm.prototype.getControlGroup = function (dir) {
- return this.form.find(dir.path);
- };
- NgForm.prototype.updateModel = function (dir, value) {
- var _this = this;
- async_1.PromiseWrapper.scheduleMicrotask(function () {
- var ctrl = _this.form.find(dir.path);
- ctrl.updateValue(value);
- });
- };
- NgForm.prototype.onSubmit = function () {
- async_1.ObservableWrapper.callEmit(this.ngSubmit, null);
- return false;
- };
- /** @internal */
- NgForm.prototype._findContainer = function (path) {
- path.pop();
- return collection_1.ListWrapper.isEmpty(path) ? this.form : this.form.find(path);
- };
- NgForm = __decorate([
- core_1.Directive({
- selector: 'form:not([ngNoForm]):not([ngFormModel]),ngForm,[ngForm]',
- bindings: [formDirectiveProvider],
- host: {
- '(submit)': 'onSubmit()',
- },
- outputs: ['ngSubmit'],
- exportAs: 'ngForm'
- }),
- __param(0, core_1.Optional()),
- __param(0, core_1.Self()),
- __param(0, core_1.Inject(validators_1.NG_VALIDATORS)),
- __param(1, core_1.Optional()),
- __param(1, core_1.Self()),
- __param(1, core_1.Inject(validators_1.NG_ASYNC_VALIDATORS)),
- __metadata('design:paramtypes', [Array, Array])
- ], NgForm);
- return NgForm;
- })(control_container_1.ControlContainer);
- exports.NgForm = NgForm;
- /***/ },
- /* 142 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var __param = (this && this.__param) || function (paramIndex, decorator) {
- return function (target, key) { decorator(target, key, paramIndex); }
- };
- var core_1 = __webpack_require__(2);
- var ng_control_1 = __webpack_require__(128);
- var lang_1 = __webpack_require__(5);
- /**
- * Directive automatically applied to Angular forms that sets CSS classes
- * based on control status (valid/invalid/dirty/etc).
- */
- var NgControlStatus = (function () {
- function NgControlStatus(cd) {
- this._cd = cd;
- }
- Object.defineProperty(NgControlStatus.prototype, "ngClassUntouched", {
- get: function () {
- return lang_1.isPresent(this._cd.control) ? this._cd.control.untouched : false;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(NgControlStatus.prototype, "ngClassTouched", {
- get: function () {
- return lang_1.isPresent(this._cd.control) ? this._cd.control.touched : false;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(NgControlStatus.prototype, "ngClassPristine", {
- get: function () {
- return lang_1.isPresent(this._cd.control) ? this._cd.control.pristine : false;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(NgControlStatus.prototype, "ngClassDirty", {
- get: function () {
- return lang_1.isPresent(this._cd.control) ? this._cd.control.dirty : false;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(NgControlStatus.prototype, "ngClassValid", {
- get: function () {
- return lang_1.isPresent(this._cd.control) ? this._cd.control.valid : false;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(NgControlStatus.prototype, "ngClassInvalid", {
- get: function () {
- return lang_1.isPresent(this._cd.control) ? !this._cd.control.valid : false;
- },
- enumerable: true,
- configurable: true
- });
- NgControlStatus = __decorate([
- core_1.Directive({
- selector: '[ngControl],[ngModel],[ngFormControl]',
- host: {
- '[class.ng-untouched]': 'ngClassUntouched',
- '[class.ng-touched]': 'ngClassTouched',
- '[class.ng-pristine]': 'ngClassPristine',
- '[class.ng-dirty]': 'ngClassDirty',
- '[class.ng-valid]': 'ngClassValid',
- '[class.ng-invalid]': 'ngClassInvalid'
- }
- }),
- __param(0, core_1.Self()),
- __metadata('design:paramtypes', [ng_control_1.NgControl])
- ], NgControlStatus);
- return NgControlStatus;
- })();
- exports.NgControlStatus = NgControlStatus;
- /***/ },
- /* 143 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var ng_control_name_1 = __webpack_require__(127);
- var ng_form_control_1 = __webpack_require__(137);
- var ng_model_1 = __webpack_require__(138);
- var ng_control_group_1 = __webpack_require__(139);
- var ng_form_model_1 = __webpack_require__(140);
- var ng_form_1 = __webpack_require__(141);
- var default_value_accessor_1 = __webpack_require__(132);
- var checkbox_value_accessor_1 = __webpack_require__(134);
- var number_value_accessor_1 = __webpack_require__(133);
- var ng_control_status_1 = __webpack_require__(142);
- var select_control_value_accessor_1 = __webpack_require__(135);
- var validators_1 = __webpack_require__(144);
- var ng_control_name_2 = __webpack_require__(127);
- exports.NgControlName = ng_control_name_2.NgControlName;
- var ng_form_control_2 = __webpack_require__(137);
- exports.NgFormControl = ng_form_control_2.NgFormControl;
- var ng_model_2 = __webpack_require__(138);
- exports.NgModel = ng_model_2.NgModel;
- var ng_control_group_2 = __webpack_require__(139);
- exports.NgControlGroup = ng_control_group_2.NgControlGroup;
- var ng_form_model_2 = __webpack_require__(140);
- exports.NgFormModel = ng_form_model_2.NgFormModel;
- var ng_form_2 = __webpack_require__(141);
- exports.NgForm = ng_form_2.NgForm;
- var default_value_accessor_2 = __webpack_require__(132);
- exports.DefaultValueAccessor = default_value_accessor_2.DefaultValueAccessor;
- var checkbox_value_accessor_2 = __webpack_require__(134);
- exports.CheckboxControlValueAccessor = checkbox_value_accessor_2.CheckboxControlValueAccessor;
- var number_value_accessor_2 = __webpack_require__(133);
- exports.NumberValueAccessor = number_value_accessor_2.NumberValueAccessor;
- var ng_control_status_2 = __webpack_require__(142);
- exports.NgControlStatus = ng_control_status_2.NgControlStatus;
- var select_control_value_accessor_2 = __webpack_require__(135);
- exports.SelectControlValueAccessor = select_control_value_accessor_2.SelectControlValueAccessor;
- exports.NgSelectOption = select_control_value_accessor_2.NgSelectOption;
- var validators_2 = __webpack_require__(144);
- exports.RequiredValidator = validators_2.RequiredValidator;
- exports.MinLengthValidator = validators_2.MinLengthValidator;
- exports.MaxLengthValidator = validators_2.MaxLengthValidator;
- var ng_control_1 = __webpack_require__(128);
- exports.NgControl = ng_control_1.NgControl;
- /**
- *
- * A list of all the form directives used as part of a `@View` annotation.
- *
- * This is a shorthand for importing them each individually.
- *
- * ### Example
- *
- * ```typescript
- * @Component({
- * selector: 'my-app',
- * directives: [FORM_DIRECTIVES]
- * })
- * class MyApp {}
- * ```
- */
- exports.FORM_DIRECTIVES = lang_1.CONST_EXPR([
- ng_control_name_1.NgControlName,
- ng_control_group_1.NgControlGroup,
- ng_form_control_1.NgFormControl,
- ng_model_1.NgModel,
- ng_form_model_1.NgFormModel,
- ng_form_1.NgForm,
- select_control_value_accessor_1.NgSelectOption,
- default_value_accessor_1.DefaultValueAccessor,
- number_value_accessor_1.NumberValueAccessor,
- checkbox_value_accessor_1.CheckboxControlValueAccessor,
- select_control_value_accessor_1.SelectControlValueAccessor,
- ng_control_status_1.NgControlStatus,
- validators_1.RequiredValidator,
- validators_1.MinLengthValidator,
- validators_1.MaxLengthValidator
- ]);
- /***/ },
- /* 144 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var __param = (this && this.__param) || function (paramIndex, decorator) {
- return function (target, key) { decorator(target, key, paramIndex); }
- };
- var core_1 = __webpack_require__(2);
- var lang_1 = __webpack_require__(5);
- var validators_1 = __webpack_require__(131);
- var lang_2 = __webpack_require__(5);
- var REQUIRED_VALIDATOR = lang_1.CONST_EXPR(new core_1.Provider(validators_1.NG_VALIDATORS, { useValue: validators_1.Validators.required, multi: true }));
- /**
- * A Directive that adds the `required` validator to any controls marked with the
- * `required` attribute, via the {@link NG_VALIDATORS} binding.
- *
- * ### Example
- *
- * ```
- * <input ngControl="fullName" required>
- * ```
- */
- var RequiredValidator = (function () {
- function RequiredValidator() {
- }
- RequiredValidator = __decorate([
- core_1.Directive({
- selector: '[required][ngControl],[required][ngFormControl],[required][ngModel]',
- providers: [REQUIRED_VALIDATOR]
- }),
- __metadata('design:paramtypes', [])
- ], RequiredValidator);
- return RequiredValidator;
- })();
- exports.RequiredValidator = RequiredValidator;
- /**
- * Provivder which adds {@link MinLengthValidator} to {@link NG_VALIDATORS}.
- *
- * ## Example:
- *
- * {@example common/forms/ts/validators/validators.ts region='min'}
- */
- var MIN_LENGTH_VALIDATOR = lang_1.CONST_EXPR(new core_1.Provider(validators_1.NG_VALIDATORS, { useExisting: core_1.forwardRef(function () { return MinLengthValidator; }), multi: true }));
- /**
- * A directive which installs the {@link MinLengthValidator} for any `ngControl`,
- * `ngFormControl`, or control with `ngModel` that also has a `minlength` attribute.
- */
- var MinLengthValidator = (function () {
- function MinLengthValidator(minLength) {
- this._validator = validators_1.Validators.minLength(lang_2.NumberWrapper.parseInt(minLength, 10));
- }
- MinLengthValidator.prototype.validate = function (c) { return this._validator(c); };
- MinLengthValidator = __decorate([
- core_1.Directive({
- selector: '[minlength][ngControl],[minlength][ngFormControl],[minlength][ngModel]',
- providers: [MIN_LENGTH_VALIDATOR]
- }),
- __param(0, core_1.Attribute("minlength")),
- __metadata('design:paramtypes', [String])
- ], MinLengthValidator);
- return MinLengthValidator;
- })();
- exports.MinLengthValidator = MinLengthValidator;
- /**
- * Provider which adds {@link MaxLengthValidator} to {@link NG_VALIDATORS}.
- *
- * ## Example:
- *
- * {@example common/forms/ts/validators/validators.ts region='max'}
- */
- var MAX_LENGTH_VALIDATOR = lang_1.CONST_EXPR(new core_1.Provider(validators_1.NG_VALIDATORS, { useExisting: core_1.forwardRef(function () { return MaxLengthValidator; }), multi: true }));
- /**
- * A directive which installs the {@link MaxLengthValidator} for any `ngControl, `ngFormControl`,
- * or control with `ngModel` that also has a `maxlength` attribute.
- */
- var MaxLengthValidator = (function () {
- function MaxLengthValidator(maxLength) {
- this._validator = validators_1.Validators.maxLength(lang_2.NumberWrapper.parseInt(maxLength, 10));
- }
- MaxLengthValidator.prototype.validate = function (c) { return this._validator(c); };
- MaxLengthValidator = __decorate([
- core_1.Directive({
- selector: '[maxlength][ngControl],[maxlength][ngFormControl],[maxlength][ngModel]',
- providers: [MAX_LENGTH_VALIDATOR]
- }),
- __param(0, core_1.Attribute("maxlength")),
- __metadata('design:paramtypes', [String])
- ], MaxLengthValidator);
- return MaxLengthValidator;
- })();
- exports.MaxLengthValidator = MaxLengthValidator;
- /***/ },
- /* 145 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var core_1 = __webpack_require__(2);
- var collection_1 = __webpack_require__(12);
- var lang_1 = __webpack_require__(5);
- var modelModule = __webpack_require__(124);
- /**
- * Creates a form object from a user-specified configuration.
- *
- * ### Example ([live demo](http://plnkr.co/edit/ENgZo8EuIECZNensZCVr?p=preview))
- *
- * ```typescript
- * @Component({
- * selector: 'my-app',
- * viewBindings: [FORM_BINDINGS]
- * template: `
- * <form [ngFormModel]="loginForm">
- * <p>Login <input ngControl="login"></p>
- * <div ngControlGroup="passwordRetry">
- * <p>Password <input type="password" ngControl="password"></p>
- * <p>Confirm password <input type="password" ngControl="passwordConfirmation"></p>
- * </div>
- * </form>
- * <h3>Form value:</h3>
- * <pre>{{value}}</pre>
- * `,
- * directives: [FORM_DIRECTIVES]
- * })
- * export class App {
- * loginForm: ControlGroup;
- *
- * constructor(builder: FormBuilder) {
- * this.loginForm = builder.group({
- * login: ["", Validators.required],
- * passwordRetry: builder.group({
- * password: ["", Validators.required],
- * passwordConfirmation: ["", Validators.required, asyncValidator]
- * })
- * });
- * }
- *
- * get value(): string {
- * return JSON.stringify(this.loginForm.value, null, 2);
- * }
- * }
- * ```
- */
- var FormBuilder = (function () {
- function FormBuilder() {
- }
- /**
- * Construct a new {@link ControlGroup} with the given map of configuration.
- * Valid keys for the `extra` parameter map are `optionals` and `validator`.
- *
- * See the {@link ControlGroup} constructor for more details.
- */
- FormBuilder.prototype.group = function (controlsConfig, extra) {
- if (extra === void 0) { extra = null; }
- var controls = this._reduceControls(controlsConfig);
- var optionals = lang_1.isPresent(extra) ? collection_1.StringMapWrapper.get(extra, "optionals") : null;
- var validator = lang_1.isPresent(extra) ? collection_1.StringMapWrapper.get(extra, "validator") : null;
- var asyncValidator = lang_1.isPresent(extra) ? collection_1.StringMapWrapper.get(extra, "asyncValidator") : null;
- return new modelModule.ControlGroup(controls, optionals, validator, asyncValidator);
- };
- /**
- * Construct a new {@link Control} with the given `value`,`validator`, and `asyncValidator`.
- */
- FormBuilder.prototype.control = function (value, validator, asyncValidator) {
- if (validator === void 0) { validator = null; }
- if (asyncValidator === void 0) { asyncValidator = null; }
- return new modelModule.Control(value, validator, asyncValidator);
- };
- /**
- * Construct an array of {@link Control}s from the given `controlsConfig` array of
- * configuration, with the given optional `validator` and `asyncValidator`.
- */
- FormBuilder.prototype.array = function (controlsConfig, validator, asyncValidator) {
- var _this = this;
- if (validator === void 0) { validator = null; }
- if (asyncValidator === void 0) { asyncValidator = null; }
- var controls = controlsConfig.map(function (c) { return _this._createControl(c); });
- return new modelModule.ControlArray(controls, validator, asyncValidator);
- };
- /** @internal */
- FormBuilder.prototype._reduceControls = function (controlsConfig) {
- var _this = this;
- var controls = {};
- collection_1.StringMapWrapper.forEach(controlsConfig, function (controlConfig, controlName) {
- controls[controlName] = _this._createControl(controlConfig);
- });
- return controls;
- };
- /** @internal */
- FormBuilder.prototype._createControl = function (controlConfig) {
- if (controlConfig instanceof modelModule.Control ||
- controlConfig instanceof modelModule.ControlGroup ||
- controlConfig instanceof modelModule.ControlArray) {
- return controlConfig;
- }
- else if (lang_1.isArray(controlConfig)) {
- var value = controlConfig[0];
- var validator = controlConfig.length > 1 ? controlConfig[1] : null;
- var asyncValidator = controlConfig.length > 2 ? controlConfig[2] : null;
- return this.control(value, validator, asyncValidator);
- }
- else {
- return this.control(controlConfig);
- }
- };
- FormBuilder = __decorate([
- core_1.Injectable(),
- __metadata('design:paramtypes', [])
- ], FormBuilder);
- return FormBuilder;
- })();
- exports.FormBuilder = FormBuilder;
- /**
- * Shorthand set of providers used for building Angular forms.
- *
- * ### Example
- *
- * ```typescript
- * bootstrap(MyApp, [FORM_PROVIDERS]);
- * ```
- */
- exports.FORM_PROVIDERS = lang_1.CONST_EXPR([FormBuilder]);
- /**
- * See {@link FORM_PROVIDERS} instead.
- *
- * @deprecated
- */
- exports.FORM_BINDINGS = exports.FORM_PROVIDERS;
- /***/ },
- /* 146 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var forms_1 = __webpack_require__(123);
- var directives_1 = __webpack_require__(115);
- /**
- * A collection of Angular core directives that are likely to be used in each and every Angular
- * application. This includes core directives (e.g., NgIf and NgFor), and forms directives (e.g.,
- * NgModel).
- *
- * This collection can be used to quickly enumerate all the built-in directives in the `directives`
- * property of the `@Component` or `@View` decorators.
- *
- * ### Example
- *
- * Instead of writing:
- *
- * ```typescript
- * import {NgClass, NgIf, NgFor, NgSwitch, NgSwitchWhen, NgSwitchDefault, NgModel, NgForm} from
- * 'angular2/common';
- * import {OtherDirective} from './myDirectives';
- *
- * @Component({
- * selector: 'my-component',
- * templateUrl: 'myComponent.html',
- * directives: [NgClass, NgIf, NgFor, NgSwitch, NgSwitchWhen, NgSwitchDefault, NgModel, NgForm,
- * OtherDirective]
- * })
- * export class MyComponent {
- * ...
- * }
- * ```
- * one could import all the common directives at once:
- *
- * ```typescript
- * import {COMMON_DIRECTIVES} from 'angular2/common';
- * import {OtherDirective} from './myDirectives';
- *
- * @Component({
- * selector: 'my-component',
- * templateUrl: 'myComponent.html',
- * directives: [COMMON_DIRECTIVES, OtherDirective]
- * })
- * export class MyComponent {
- * ...
- * }
- * ```
- */
- exports.COMMON_DIRECTIVES = lang_1.CONST_EXPR([directives_1.CORE_DIRECTIVES, forms_1.FORM_DIRECTIVES]);
- /***/ },
- /* 147 */
- /***/ function(module, exports, __webpack_require__) {
- function __export(m) {
- for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
- }
- /**
- * @module
- * @description
- * Starting point to import all compiler APIs.
- */
- __export(__webpack_require__(148));
- __export(__webpack_require__(149));
- __export(__webpack_require__(150));
- /***/ },
- /* 148 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var __param = (this && this.__param) || function (paramIndex, decorator) {
- return function (target, key) { decorator(target, key, paramIndex); }
- };
- var di_1 = __webpack_require__(6);
- var lang_1 = __webpack_require__(5);
- var application_tokens_1 = __webpack_require__(67);
- var di_2 = __webpack_require__(6);
- /**
- * Create a {@link UrlResolver} with no package prefix.
- */
- function createWithoutPackagePrefix() {
- return new UrlResolver();
- }
- exports.createWithoutPackagePrefix = createWithoutPackagePrefix;
- /**
- * A default provider for {@link PACKAGE_ROOT_URL} that maps to '/'.
- */
- exports.DEFAULT_PACKAGE_URL_PROVIDER = new di_2.Provider(application_tokens_1.PACKAGE_ROOT_URL, { useValue: "/" });
- /**
- * Used by the {@link Compiler} when resolving HTML and CSS template URLs.
- *
- * This class can be overridden by the application developer to create custom behavior.
- *
- * See {@link Compiler}
- *
- * ## Example
- *
- * {@example compiler/ts/url_resolver/url_resolver.ts region='url_resolver'}
- */
- var UrlResolver = (function () {
- function UrlResolver(packagePrefix) {
- if (packagePrefix === void 0) { packagePrefix = null; }
- if (lang_1.isPresent(packagePrefix)) {
- this._packagePrefix = lang_1.StringWrapper.stripRight(packagePrefix, "/") + "/";
- }
- }
- /**
- * Resolves the `url` given the `baseUrl`:
- * - when the `url` is null, the `baseUrl` is returned,
- * - if `url` is relative ('path/to/here', './path/to/here'), the resolved url is a combination of
- * `baseUrl` and `url`,
- * - if `url` is absolute (it has a scheme: 'http://', 'https://' or start with '/'), the `url` is
- * returned as is (ignoring the `baseUrl`)
- *
- * @param {string} baseUrl
- * @param {string} url
- * @returns {string} the resolved URL
- */
- UrlResolver.prototype.resolve = function (baseUrl, url) {
- var resolvedUrl = url;
- if (lang_1.isPresent(baseUrl) && baseUrl.length > 0) {
- resolvedUrl = _resolveUrl(baseUrl, resolvedUrl);
- }
- if (lang_1.isPresent(this._packagePrefix) && getUrlScheme(resolvedUrl) == "package") {
- resolvedUrl = resolvedUrl.replace("package:", this._packagePrefix);
- }
- return resolvedUrl;
- };
- UrlResolver = __decorate([
- di_1.Injectable(),
- __param(0, di_1.Inject(application_tokens_1.PACKAGE_ROOT_URL)),
- __metadata('design:paramtypes', [String])
- ], UrlResolver);
- return UrlResolver;
- })();
- exports.UrlResolver = UrlResolver;
- /**
- * Extract the scheme of a URL.
- */
- function getUrlScheme(url) {
- var match = _split(url);
- return (match && match[_ComponentIndex.Scheme]) || "";
- }
- exports.getUrlScheme = getUrlScheme;
- // The code below is adapted from Traceur:
- // https://github.com/google/traceur-compiler/blob/9511c1dafa972bf0de1202a8a863bad02f0f95a8/src/runtime/url.js
- /**
- * Builds a URI string from already-encoded parts.
- *
- * No encoding is performed. Any component may be omitted as either null or
- * undefined.
- *
- * @param {?string=} opt_scheme The scheme such as 'http'.
- * @param {?string=} opt_userInfo The user name before the '@'.
- * @param {?string=} opt_domain The domain such as 'www.google.com', already
- * URI-encoded.
- * @param {(string|null)=} opt_port The port number.
- * @param {?string=} opt_path The path, already URI-encoded. If it is not
- * empty, it must begin with a slash.
- * @param {?string=} opt_queryData The URI-encoded query data.
- * @param {?string=} opt_fragment The URI-encoded fragment identifier.
- * @return {string} The fully combined URI.
- */
- function _buildFromEncodedParts(opt_scheme, opt_userInfo, opt_domain, opt_port, opt_path, opt_queryData, opt_fragment) {
- var out = [];
- if (lang_1.isPresent(opt_scheme)) {
- out.push(opt_scheme + ':');
- }
- if (lang_1.isPresent(opt_domain)) {
- out.push('//');
- if (lang_1.isPresent(opt_userInfo)) {
- out.push(opt_userInfo + '@');
- }
- out.push(opt_domain);
- if (lang_1.isPresent(opt_port)) {
- out.push(':' + opt_port);
- }
- }
- if (lang_1.isPresent(opt_path)) {
- out.push(opt_path);
- }
- if (lang_1.isPresent(opt_queryData)) {
- out.push('?' + opt_queryData);
- }
- if (lang_1.isPresent(opt_fragment)) {
- out.push('#' + opt_fragment);
- }
- return out.join('');
- }
- /**
- * A regular expression for breaking a URI into its component parts.
- *
- * {@link http://www.gbiv.com/protocols/uri/rfc/rfc3986.html#RFC2234} says
- * As the "first-match-wins" algorithm is identical to the "greedy"
- * disambiguation method used by POSIX regular expressions, it is natural and
- * commonplace to use a regular expression for parsing the potential five
- * components of a URI reference.
- *
- * The following line is the regular expression for breaking-down a
- * well-formed URI reference into its components.
- *
- * <pre>
- * ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
- * 12 3 4 5 6 7 8 9
- * </pre>
- *
- * The numbers in the second line above are only to assist readability; they
- * indicate the reference points for each subexpression (i.e., each paired
- * parenthesis). We refer to the value matched for subexpression <n> as $<n>.
- * For example, matching the above expression to
- * <pre>
- * http://www.ics.uci.edu/pub/ietf/uri/#Related
- * </pre>
- * results in the following subexpression matches:
- * <pre>
- * $1 = http:
- * $2 = http
- * $3 = //www.ics.uci.edu
- * $4 = www.ics.uci.edu
- * $5 = /pub/ietf/uri/
- * $6 = <undefined>
- * $7 = <undefined>
- * $8 = #Related
- * $9 = Related
- * </pre>
- * where <undefined> indicates that the component is not present, as is the
- * case for the query component in the above example. Therefore, we can
- * determine the value of the five components as
- * <pre>
- * scheme = $2
- * authority = $4
- * path = $5
- * query = $7
- * fragment = $9
- * </pre>
- *
- * The regular expression has been modified slightly to expose the
- * userInfo, domain, and port separately from the authority.
- * The modified version yields
- * <pre>
- * $1 = http scheme
- * $2 = <undefined> userInfo -\
- * $3 = www.ics.uci.edu domain | authority
- * $4 = <undefined> port -/
- * $5 = /pub/ietf/uri/ path
- * $6 = <undefined> query without ?
- * $7 = Related fragment without #
- * </pre>
- * @type {!RegExp}
- * @internal
- */
- var _splitRe = lang_1.RegExpWrapper.create('^' +
- '(?:' +
- '([^:/?#.]+)' +
- // used by other URL parts such as :,
- // ?, /, #, and .
- ':)?' +
- '(?://' +
- '(?:([^/?#]*)@)?' +
- '([\\w\\d\\-\\u0100-\\uffff.%]*)' +
- // digits, dashes, dots, percent
- // escapes, and unicode characters.
- '(?::([0-9]+))?' +
- ')?' +
- '([^?#]+)?' +
- '(?:\\?([^#]*))?' +
- '(?:#(.*))?' +
- '$');
- /**
- * The index of each URI component in the return value of goog.uri.utils.split.
- * @enum {number}
- */
- var _ComponentIndex;
- (function (_ComponentIndex) {
- _ComponentIndex[_ComponentIndex["Scheme"] = 1] = "Scheme";
- _ComponentIndex[_ComponentIndex["UserInfo"] = 2] = "UserInfo";
- _ComponentIndex[_ComponentIndex["Domain"] = 3] = "Domain";
- _ComponentIndex[_ComponentIndex["Port"] = 4] = "Port";
- _ComponentIndex[_ComponentIndex["Path"] = 5] = "Path";
- _ComponentIndex[_ComponentIndex["QueryData"] = 6] = "QueryData";
- _ComponentIndex[_ComponentIndex["Fragment"] = 7] = "Fragment";
- })(_ComponentIndex || (_ComponentIndex = {}));
- /**
- * Splits a URI into its component parts.
- *
- * Each component can be accessed via the component indices; for example:
- * <pre>
- * goog.uri.utils.split(someStr)[goog.uri.utils.CompontentIndex.QUERY_DATA];
- * </pre>
- *
- * @param {string} uri The URI string to examine.
- * @return {!Array.<string|undefined>} Each component still URI-encoded.
- * Each component that is present will contain the encoded value, whereas
- * components that are not present will be undefined or empty, depending
- * on the browser's regular expression implementation. Never null, since
- * arbitrary strings may still look like path names.
- */
- function _split(uri) {
- return lang_1.RegExpWrapper.firstMatch(_splitRe, uri);
- }
- /**
- * Removes dot segments in given path component, as described in
- * RFC 3986, section 5.2.4.
- *
- * @param {string} path A non-empty path component.
- * @return {string} Path component with removed dot segments.
- */
- function _removeDotSegments(path) {
- if (path == '/')
- return '/';
- var leadingSlash = path[0] == '/' ? '/' : '';
- var trailingSlash = path[path.length - 1] === '/' ? '/' : '';
- var segments = path.split('/');
- var out = [];
- var up = 0;
- for (var pos = 0; pos < segments.length; pos++) {
- var segment = segments[pos];
- switch (segment) {
- case '':
- case '.':
- break;
- case '..':
- if (out.length > 0) {
- out.pop();
- }
- else {
- up++;
- }
- break;
- default:
- out.push(segment);
- }
- }
- if (leadingSlash == '') {
- while (up-- > 0) {
- out.unshift('..');
- }
- if (out.length === 0)
- out.push('.');
- }
- return leadingSlash + out.join('/') + trailingSlash;
- }
- /**
- * Takes an array of the parts from split and canonicalizes the path part
- * and then joins all the parts.
- * @param {Array.<string?>} parts
- * @return {string}
- */
- function _joinAndCanonicalizePath(parts) {
- var path = parts[_ComponentIndex.Path];
- path = lang_1.isBlank(path) ? '' : _removeDotSegments(path);
- parts[_ComponentIndex.Path] = path;
- return _buildFromEncodedParts(parts[_ComponentIndex.Scheme], parts[_ComponentIndex.UserInfo], parts[_ComponentIndex.Domain], parts[_ComponentIndex.Port], path, parts[_ComponentIndex.QueryData], parts[_ComponentIndex.Fragment]);
- }
- /**
- * Resolves a URL.
- * @param {string} base The URL acting as the base URL.
- * @param {string} to The URL to resolve.
- * @return {string}
- */
- function _resolveUrl(base, url) {
- var parts = _split(encodeURI(url));
- var baseParts = _split(base);
- if (lang_1.isPresent(parts[_ComponentIndex.Scheme])) {
- return _joinAndCanonicalizePath(parts);
- }
- else {
- parts[_ComponentIndex.Scheme] = baseParts[_ComponentIndex.Scheme];
- }
- for (var i = _ComponentIndex.Scheme; i <= _ComponentIndex.Port; i++) {
- if (lang_1.isBlank(parts[i])) {
- parts[i] = baseParts[i];
- }
- }
- if (parts[_ComponentIndex.Path][0] == '/') {
- return _joinAndCanonicalizePath(parts);
- }
- var path = baseParts[_ComponentIndex.Path];
- if (lang_1.isBlank(path))
- path = '/';
- var index = path.lastIndexOf('/');
- path = path.substring(0, index + 1) + parts[_ComponentIndex.Path];
- parts[_ComponentIndex.Path] = path;
- return _joinAndCanonicalizePath(parts);
- }
- /***/ },
- /* 149 */
- /***/ function(module, exports) {
- // TODO: vsavkin rename it into TemplateLoader
- /**
- * An interface for retrieving documents by URL that the compiler uses
- * to load templates.
- */
- var XHR = (function () {
- function XHR() {
- }
- XHR.prototype.get = function (url) { return null; };
- return XHR;
- })();
- exports.XHR = XHR;
- /***/ },
- /* 150 */
- /***/ function(module, exports, __webpack_require__) {
- function __export(m) {
- for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
- }
- var runtime_compiler_1 = __webpack_require__(151);
- var template_compiler_1 = __webpack_require__(152);
- exports.TemplateCompiler = template_compiler_1.TemplateCompiler;
- var directive_metadata_1 = __webpack_require__(153);
- exports.CompileDirectiveMetadata = directive_metadata_1.CompileDirectiveMetadata;
- exports.CompileTypeMetadata = directive_metadata_1.CompileTypeMetadata;
- exports.CompileTemplateMetadata = directive_metadata_1.CompileTemplateMetadata;
- var source_module_1 = __webpack_require__(156);
- exports.SourceModule = source_module_1.SourceModule;
- exports.SourceWithImports = source_module_1.SourceWithImports;
- var platform_directives_and_pipes_1 = __webpack_require__(95);
- exports.PLATFORM_DIRECTIVES = platform_directives_and_pipes_1.PLATFORM_DIRECTIVES;
- exports.PLATFORM_PIPES = platform_directives_and_pipes_1.PLATFORM_PIPES;
- __export(__webpack_require__(159));
- var template_parser_1 = __webpack_require__(167);
- exports.TEMPLATE_TRANSFORMS = template_parser_1.TEMPLATE_TRANSFORMS;
- var lang_1 = __webpack_require__(5);
- var di_1 = __webpack_require__(6);
- var template_parser_2 = __webpack_require__(167);
- var html_parser_1 = __webpack_require__(168);
- var template_normalizer_1 = __webpack_require__(175);
- var runtime_metadata_1 = __webpack_require__(176);
- var change_detector_compiler_1 = __webpack_require__(157);
- var style_compiler_1 = __webpack_require__(161);
- var command_compiler_1 = __webpack_require__(166);
- var template_compiler_2 = __webpack_require__(152);
- var change_detection_1 = __webpack_require__(25);
- var compiler_1 = __webpack_require__(70);
- var runtime_compiler_2 = __webpack_require__(151);
- var element_schema_registry_1 = __webpack_require__(173);
- var dom_element_schema_registry_1 = __webpack_require__(177);
- var url_resolver_1 = __webpack_require__(148);
- var change_detection_2 = __webpack_require__(25);
- function _createChangeDetectorGenConfig() {
- return new change_detection_1.ChangeDetectorGenConfig(lang_1.assertionsEnabled(), false, true);
- }
- /**
- * A set of providers that provide `RuntimeCompiler` and its dependencies to use for
- * template compilation.
- */
- exports.COMPILER_PROVIDERS = lang_1.CONST_EXPR([
- change_detection_2.Lexer,
- change_detection_2.Parser,
- html_parser_1.HtmlParser,
- template_parser_2.TemplateParser,
- template_normalizer_1.TemplateNormalizer,
- runtime_metadata_1.RuntimeMetadataResolver,
- url_resolver_1.DEFAULT_PACKAGE_URL_PROVIDER,
- style_compiler_1.StyleCompiler,
- command_compiler_1.CommandCompiler,
- change_detector_compiler_1.ChangeDetectionCompiler,
- new di_1.Provider(change_detection_1.ChangeDetectorGenConfig, { useFactory: _createChangeDetectorGenConfig, deps: [] }),
- template_compiler_2.TemplateCompiler,
- new di_1.Provider(runtime_compiler_2.RuntimeCompiler, { useClass: runtime_compiler_1.RuntimeCompiler_ }),
- new di_1.Provider(compiler_1.Compiler, { useExisting: runtime_compiler_2.RuntimeCompiler }),
- dom_element_schema_registry_1.DomElementSchemaRegistry,
- new di_1.Provider(element_schema_registry_1.ElementSchemaRegistry, { useExisting: dom_element_schema_registry_1.DomElementSchemaRegistry }),
- url_resolver_1.UrlResolver
- ]);
- /***/ },
- /* 151 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var compiler_1 = __webpack_require__(70);
- var proto_view_factory_1 = __webpack_require__(71);
- var template_compiler_1 = __webpack_require__(152);
- var di_1 = __webpack_require__(6);
- var RuntimeCompiler = (function (_super) {
- __extends(RuntimeCompiler, _super);
- function RuntimeCompiler() {
- _super.apply(this, arguments);
- }
- return RuntimeCompiler;
- })(compiler_1.Compiler);
- exports.RuntimeCompiler = RuntimeCompiler;
- var RuntimeCompiler_ = (function (_super) {
- __extends(RuntimeCompiler_, _super);
- function RuntimeCompiler_(_protoViewFactory, _templateCompiler) {
- _super.call(this, _protoViewFactory);
- this._templateCompiler = _templateCompiler;
- }
- RuntimeCompiler_.prototype.compileInHost = function (componentType) {
- var _this = this;
- return this._templateCompiler.compileHostComponentRuntime(componentType)
- .then(function (compiledHostTemplate) { return compiler_1.internalCreateProtoView(_this, compiledHostTemplate); });
- };
- RuntimeCompiler_.prototype.clearCache = function () {
- _super.prototype.clearCache.call(this);
- this._templateCompiler.clearCache();
- };
- RuntimeCompiler_ = __decorate([
- di_1.Injectable(),
- __metadata('design:paramtypes', [proto_view_factory_1.ProtoViewFactory, template_compiler_1.TemplateCompiler])
- ], RuntimeCompiler_);
- return RuntimeCompiler_;
- })(compiler_1.Compiler_);
- exports.RuntimeCompiler_ = RuntimeCompiler_;
- /***/ },
- /* 152 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var collection_1 = __webpack_require__(12);
- var async_1 = __webpack_require__(60);
- var template_commands_1 = __webpack_require__(96);
- var directive_metadata_1 = __webpack_require__(153);
- var di_1 = __webpack_require__(6);
- var source_module_1 = __webpack_require__(156);
- var change_detector_compiler_1 = __webpack_require__(157);
- var style_compiler_1 = __webpack_require__(161);
- var command_compiler_1 = __webpack_require__(166);
- var template_parser_1 = __webpack_require__(167);
- var template_normalizer_1 = __webpack_require__(175);
- var runtime_metadata_1 = __webpack_require__(176);
- var command_compiler_2 = __webpack_require__(166);
- var util_1 = __webpack_require__(155);
- /**
- * An internal module of the Angular compiler that begins with component types,
- * extracts templates, and eventually produces a compiled version of the component
- * ready for linking into an application.
- */
- var TemplateCompiler = (function () {
- function TemplateCompiler(_runtimeMetadataResolver, _templateNormalizer, _templateParser, _styleCompiler, _commandCompiler, _cdCompiler) {
- this._runtimeMetadataResolver = _runtimeMetadataResolver;
- this._templateNormalizer = _templateNormalizer;
- this._templateParser = _templateParser;
- this._styleCompiler = _styleCompiler;
- this._commandCompiler = _commandCompiler;
- this._cdCompiler = _cdCompiler;
- this._hostCacheKeys = new Map();
- this._compiledTemplateCache = new Map();
- this._compiledTemplateDone = new Map();
- this._nextTemplateId = 0;
- }
- TemplateCompiler.prototype.normalizeDirectiveMetadata = function (directive) {
- if (!directive.isComponent) {
- // For non components there is nothing to be normalized yet.
- return async_1.PromiseWrapper.resolve(directive);
- }
- return this._templateNormalizer.normalizeTemplate(directive.type, directive.template)
- .then(function (normalizedTemplate) { return new directive_metadata_1.CompileDirectiveMetadata({
- type: directive.type,
- isComponent: directive.isComponent,
- dynamicLoadable: directive.dynamicLoadable,
- selector: directive.selector,
- exportAs: directive.exportAs,
- changeDetection: directive.changeDetection,
- inputs: directive.inputs,
- outputs: directive.outputs,
- hostListeners: directive.hostListeners,
- hostProperties: directive.hostProperties,
- hostAttributes: directive.hostAttributes,
- lifecycleHooks: directive.lifecycleHooks,
- template: normalizedTemplate
- }); });
- };
- TemplateCompiler.prototype.compileHostComponentRuntime = function (type) {
- var hostCacheKey = this._hostCacheKeys.get(type);
- if (lang_1.isBlank(hostCacheKey)) {
- hostCacheKey = new Object();
- this._hostCacheKeys.set(type, hostCacheKey);
- var compMeta = this._runtimeMetadataResolver.getMetadata(type);
- assertComponent(compMeta);
- var hostMeta = directive_metadata_1.createHostComponentMeta(compMeta.type, compMeta.selector);
- this._compileComponentRuntime(hostCacheKey, hostMeta, [compMeta], new Set());
- }
- return this._compiledTemplateDone.get(hostCacheKey)
- .then(function (compiledTemplate) { return new template_commands_1.CompiledHostTemplate(compiledTemplate); });
- };
- TemplateCompiler.prototype.clearCache = function () {
- this._hostCacheKeys.clear();
- this._styleCompiler.clearCache();
- this._compiledTemplateCache.clear();
- this._compiledTemplateDone.clear();
- };
- TemplateCompiler.prototype._compileComponentRuntime = function (cacheKey, compMeta, viewDirectives, compilingComponentCacheKeys) {
- var _this = this;
- var uniqViewDirectives = removeDuplicates(viewDirectives);
- var compiledTemplate = this._compiledTemplateCache.get(cacheKey);
- var done = this._compiledTemplateDone.get(cacheKey);
- if (lang_1.isBlank(compiledTemplate)) {
- var styles = [];
- var changeDetectorFactory;
- var commands = [];
- var templateId = lang_1.stringify(compMeta.type.runtime) + "Template" + this._nextTemplateId++;
- compiledTemplate = new template_commands_1.CompiledComponentTemplate(templateId, function (dispatcher) { return changeDetectorFactory(dispatcher); }, commands, styles);
- this._compiledTemplateCache.set(cacheKey, compiledTemplate);
- compilingComponentCacheKeys.add(cacheKey);
- done = async_1.PromiseWrapper
- .all([this._styleCompiler.compileComponentRuntime(compMeta.template)].concat(uniqViewDirectives.map(function (dirMeta) { return _this.normalizeDirectiveMetadata(dirMeta); })))
- .then(function (stylesAndNormalizedViewDirMetas) {
- var childPromises = [];
- var normalizedViewDirMetas = stylesAndNormalizedViewDirMetas.slice(1);
- var parsedTemplate = _this._templateParser.parse(compMeta.template.template, normalizedViewDirMetas, compMeta.type.name);
- var changeDetectorFactories = _this._cdCompiler.compileComponentRuntime(compMeta.type, compMeta.changeDetection, parsedTemplate);
- changeDetectorFactory = changeDetectorFactories[0];
- var tmpStyles = stylesAndNormalizedViewDirMetas[0];
- tmpStyles.forEach(function (style) { return styles.push(style); });
- var tmpCommands = _this._compileCommandsRuntime(compMeta, parsedTemplate, changeDetectorFactories, compilingComponentCacheKeys, childPromises);
- tmpCommands.forEach(function (cmd) { return commands.push(cmd); });
- return async_1.PromiseWrapper.all(childPromises);
- })
- .then(function (_) {
- collection_1.SetWrapper.delete(compilingComponentCacheKeys, cacheKey);
- return compiledTemplate;
- });
- this._compiledTemplateDone.set(cacheKey, done);
- }
- return compiledTemplate;
- };
- TemplateCompiler.prototype._compileCommandsRuntime = function (compMeta, parsedTemplate, changeDetectorFactories, compilingComponentCacheKeys, childPromises) {
- var _this = this;
- var cmds = this._commandCompiler.compileComponentRuntime(compMeta, parsedTemplate, changeDetectorFactories, function (childComponentDir) {
- var childCacheKey = childComponentDir.type.runtime;
- var childViewDirectives = _this._runtimeMetadataResolver.getViewDirectivesMetadata(childComponentDir.type.runtime);
- var childIsRecursive = collection_1.SetWrapper.has(compilingComponentCacheKeys, childCacheKey);
- var childTemplate = _this._compileComponentRuntime(childCacheKey, childComponentDir, childViewDirectives, compilingComponentCacheKeys);
- if (!childIsRecursive) {
- // Only wait for a child if it is not a cycle
- childPromises.push(_this._compiledTemplateDone.get(childCacheKey));
- }
- return function () { return childTemplate; };
- });
- cmds.forEach(function (cmd) {
- if (cmd instanceof template_commands_1.BeginComponentCmd) {
- cmd.templateGetter();
- }
- });
- return cmds;
- };
- TemplateCompiler.prototype.compileTemplatesCodeGen = function (components) {
- var _this = this;
- if (components.length === 0) {
- throw new exceptions_1.BaseException('No components given');
- }
- var declarations = [];
- var templateArguments = [];
- var componentMetas = [];
- components.forEach(function (componentWithDirs) {
- var compMeta = componentWithDirs.component;
- assertComponent(compMeta);
- componentMetas.push(compMeta);
- _this._processTemplateCodeGen(compMeta, componentWithDirs.directives, declarations, templateArguments);
- if (compMeta.dynamicLoadable) {
- var hostMeta = directive_metadata_1.createHostComponentMeta(compMeta.type, compMeta.selector);
- componentMetas.push(hostMeta);
- _this._processTemplateCodeGen(hostMeta, [compMeta], declarations, templateArguments);
- }
- });
- collection_1.ListWrapper.forEachWithIndex(componentMetas, function (compMeta, index) {
- var templateId = compMeta.type.moduleUrl + "|" + compMeta.type.name;
- var constructionKeyword = lang_1.IS_DART ? 'const' : 'new';
- var compiledTemplateExpr = constructionKeyword + " " + command_compiler_2.TEMPLATE_COMMANDS_MODULE_REF + "CompiledComponentTemplate('" + templateId + "'," + templateArguments[index].join(',') + ")";
- var variableValueExpr;
- if (compMeta.type.isHost) {
- variableValueExpr =
- constructionKeyword + " " + command_compiler_2.TEMPLATE_COMMANDS_MODULE_REF + "CompiledHostTemplate(" + compiledTemplateExpr + ")";
- }
- else {
- variableValueExpr = compiledTemplateExpr;
- }
- var varName = templateVariableName(compMeta.type);
- declarations.push("" + util_1.codeGenExportVariable(varName) + variableValueExpr + ";");
- declarations.push(util_1.codeGenValueFn([], varName, templateGetterName(compMeta.type)) + ";");
- });
- var moduleUrl = components[0].component.type.moduleUrl;
- return new source_module_1.SourceModule("" + templateModuleUrl(moduleUrl), declarations.join('\n'));
- };
- TemplateCompiler.prototype.compileStylesheetCodeGen = function (stylesheetUrl, cssText) {
- return this._styleCompiler.compileStylesheetCodeGen(stylesheetUrl, cssText);
- };
- TemplateCompiler.prototype._processTemplateCodeGen = function (compMeta, directives, targetDeclarations, targetTemplateArguments) {
- var uniqueDirectives = removeDuplicates(directives);
- var styleExpr = this._styleCompiler.compileComponentCodeGen(compMeta.template);
- var parsedTemplate = this._templateParser.parse(compMeta.template.template, uniqueDirectives, compMeta.type.name);
- var changeDetectorsExprs = this._cdCompiler.compileComponentCodeGen(compMeta.type, compMeta.changeDetection, parsedTemplate);
- var commandsExpr = this._commandCompiler.compileComponentCodeGen(compMeta, parsedTemplate, changeDetectorsExprs.expressions, codeGenComponentTemplateFactory);
- addAll(styleExpr.declarations, targetDeclarations);
- addAll(changeDetectorsExprs.declarations, targetDeclarations);
- addAll(commandsExpr.declarations, targetDeclarations);
- targetTemplateArguments.push([changeDetectorsExprs.expressions[0], commandsExpr.expression, styleExpr.expression]);
- };
- TemplateCompiler = __decorate([
- di_1.Injectable(),
- __metadata('design:paramtypes', [runtime_metadata_1.RuntimeMetadataResolver, template_normalizer_1.TemplateNormalizer, template_parser_1.TemplateParser, style_compiler_1.StyleCompiler, command_compiler_1.CommandCompiler, change_detector_compiler_1.ChangeDetectionCompiler])
- ], TemplateCompiler);
- return TemplateCompiler;
- })();
- exports.TemplateCompiler = TemplateCompiler;
- var NormalizedComponentWithViewDirectives = (function () {
- function NormalizedComponentWithViewDirectives(component, directives) {
- this.component = component;
- this.directives = directives;
- }
- return NormalizedComponentWithViewDirectives;
- })();
- exports.NormalizedComponentWithViewDirectives = NormalizedComponentWithViewDirectives;
- function assertComponent(meta) {
- if (!meta.isComponent) {
- throw new exceptions_1.BaseException("Could not compile '" + meta.type.name + "' because it is not a component.");
- }
- }
- function templateVariableName(type) {
- return type.name + "Template";
- }
- function templateGetterName(type) {
- return templateVariableName(type) + "Getter";
- }
- function templateModuleUrl(moduleUrl) {
- var urlWithoutSuffix = moduleUrl.substring(0, moduleUrl.length - util_1.MODULE_SUFFIX.length);
- return urlWithoutSuffix + ".template" + util_1.MODULE_SUFFIX;
- }
- function addAll(source, target) {
- for (var i = 0; i < source.length; i++) {
- target.push(source[i]);
- }
- }
- function codeGenComponentTemplateFactory(nestedCompType) {
- return "" + source_module_1.moduleRef(templateModuleUrl(nestedCompType.type.moduleUrl)) + templateGetterName(nestedCompType.type);
- }
- function removeDuplicates(items) {
- var res = [];
- items.forEach(function (item) {
- var hasMatch = res.filter(function (r) { return r.type.name == item.type.name && r.type.moduleUrl == item.type.moduleUrl &&
- r.type.runtime == item.type.runtime; })
- .length > 0;
- if (!hasMatch) {
- res.push(item);
- }
- });
- return res;
- }
- /***/ },
- /* 153 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var collection_1 = __webpack_require__(12);
- var change_detection_1 = __webpack_require__(25);
- var view_1 = __webpack_require__(56);
- var selector_1 = __webpack_require__(154);
- var util_1 = __webpack_require__(155);
- var interfaces_1 = __webpack_require__(89);
- // group 1: "property" from "[property]"
- // group 2: "event" from "(event)"
- var HOST_REG_EXP = /^(?:(?:\[([^\]]+)\])|(?:\(([^\)]+)\)))$/g;
- /**
- * Metadata regarding compilation of a type.
- */
- var CompileTypeMetadata = (function () {
- function CompileTypeMetadata(_a) {
- var _b = _a === void 0 ? {} : _a, runtime = _b.runtime, name = _b.name, moduleUrl = _b.moduleUrl, isHost = _b.isHost;
- this.runtime = runtime;
- this.name = name;
- this.moduleUrl = moduleUrl;
- this.isHost = lang_1.normalizeBool(isHost);
- }
- CompileTypeMetadata.fromJson = function (data) {
- return new CompileTypeMetadata({ name: data['name'], moduleUrl: data['moduleUrl'], isHost: data['isHost'] });
- };
- CompileTypeMetadata.prototype.toJson = function () {
- return {
- // Note: Runtime type can't be serialized...
- 'name': this.name,
- 'moduleUrl': this.moduleUrl,
- 'isHost': this.isHost
- };
- };
- return CompileTypeMetadata;
- })();
- exports.CompileTypeMetadata = CompileTypeMetadata;
- /**
- * Metadata regarding compilation of a template.
- */
- var CompileTemplateMetadata = (function () {
- function CompileTemplateMetadata(_a) {
- var _b = _a === void 0 ? {} : _a, encapsulation = _b.encapsulation, template = _b.template, templateUrl = _b.templateUrl, styles = _b.styles, styleUrls = _b.styleUrls, ngContentSelectors = _b.ngContentSelectors;
- this.encapsulation = lang_1.isPresent(encapsulation) ? encapsulation : view_1.ViewEncapsulation.Emulated;
- this.template = template;
- this.templateUrl = templateUrl;
- this.styles = lang_1.isPresent(styles) ? styles : [];
- this.styleUrls = lang_1.isPresent(styleUrls) ? styleUrls : [];
- this.ngContentSelectors = lang_1.isPresent(ngContentSelectors) ? ngContentSelectors : [];
- }
- CompileTemplateMetadata.fromJson = function (data) {
- return new CompileTemplateMetadata({
- encapsulation: lang_1.isPresent(data['encapsulation']) ?
- view_1.VIEW_ENCAPSULATION_VALUES[data['encapsulation']] :
- data['encapsulation'],
- template: data['template'],
- templateUrl: data['templateUrl'],
- styles: data['styles'],
- styleUrls: data['styleUrls'],
- ngContentSelectors: data['ngContentSelectors']
- });
- };
- CompileTemplateMetadata.prototype.toJson = function () {
- return {
- 'encapsulation': lang_1.isPresent(this.encapsulation) ? lang_1.serializeEnum(this.encapsulation) : this.encapsulation,
- 'template': this.template,
- 'templateUrl': this.templateUrl,
- 'styles': this.styles,
- 'styleUrls': this.styleUrls,
- 'ngContentSelectors': this.ngContentSelectors
- };
- };
- return CompileTemplateMetadata;
- })();
- exports.CompileTemplateMetadata = CompileTemplateMetadata;
- /**
- * Metadata regarding compilation of a directive.
- */
- var CompileDirectiveMetadata = (function () {
- function CompileDirectiveMetadata(_a) {
- var _b = _a === void 0 ? {} : _a, type = _b.type, isComponent = _b.isComponent, dynamicLoadable = _b.dynamicLoadable, selector = _b.selector, exportAs = _b.exportAs, changeDetection = _b.changeDetection, inputs = _b.inputs, outputs = _b.outputs, hostListeners = _b.hostListeners, hostProperties = _b.hostProperties, hostAttributes = _b.hostAttributes, lifecycleHooks = _b.lifecycleHooks, template = _b.template;
- this.type = type;
- this.isComponent = isComponent;
- this.dynamicLoadable = dynamicLoadable;
- this.selector = selector;
- this.exportAs = exportAs;
- this.changeDetection = changeDetection;
- this.inputs = inputs;
- this.outputs = outputs;
- this.hostListeners = hostListeners;
- this.hostProperties = hostProperties;
- this.hostAttributes = hostAttributes;
- this.lifecycleHooks = lifecycleHooks;
- this.template = template;
- }
- CompileDirectiveMetadata.create = function (_a) {
- var _b = _a === void 0 ? {} : _a, type = _b.type, isComponent = _b.isComponent, dynamicLoadable = _b.dynamicLoadable, selector = _b.selector, exportAs = _b.exportAs, changeDetection = _b.changeDetection, inputs = _b.inputs, outputs = _b.outputs, host = _b.host, lifecycleHooks = _b.lifecycleHooks, template = _b.template;
- var hostListeners = {};
- var hostProperties = {};
- var hostAttributes = {};
- if (lang_1.isPresent(host)) {
- collection_1.StringMapWrapper.forEach(host, function (value, key) {
- var matches = lang_1.RegExpWrapper.firstMatch(HOST_REG_EXP, key);
- if (lang_1.isBlank(matches)) {
- hostAttributes[key] = value;
- }
- else if (lang_1.isPresent(matches[1])) {
- hostProperties[matches[1]] = value;
- }
- else if (lang_1.isPresent(matches[2])) {
- hostListeners[matches[2]] = value;
- }
- });
- }
- var inputsMap = {};
- if (lang_1.isPresent(inputs)) {
- inputs.forEach(function (bindConfig) {
- // canonical syntax: `dirProp: elProp`
- // if there is no `:`, use dirProp = elProp
- var parts = util_1.splitAtColon(bindConfig, [bindConfig, bindConfig]);
- inputsMap[parts[0]] = parts[1];
- });
- }
- var outputsMap = {};
- if (lang_1.isPresent(outputs)) {
- outputs.forEach(function (bindConfig) {
- // canonical syntax: `dirProp: elProp`
- // if there is no `:`, use dirProp = elProp
- var parts = util_1.splitAtColon(bindConfig, [bindConfig, bindConfig]);
- outputsMap[parts[0]] = parts[1];
- });
- }
- return new CompileDirectiveMetadata({
- type: type,
- isComponent: lang_1.normalizeBool(isComponent),
- dynamicLoadable: lang_1.normalizeBool(dynamicLoadable),
- selector: selector,
- exportAs: exportAs,
- changeDetection: changeDetection,
- inputs: inputsMap,
- outputs: outputsMap,
- hostListeners: hostListeners,
- hostProperties: hostProperties,
- hostAttributes: hostAttributes,
- lifecycleHooks: lang_1.isPresent(lifecycleHooks) ? lifecycleHooks : [],
- template: template
- });
- };
- CompileDirectiveMetadata.fromJson = function (data) {
- return new CompileDirectiveMetadata({
- isComponent: data['isComponent'],
- dynamicLoadable: data['dynamicLoadable'],
- selector: data['selector'],
- exportAs: data['exportAs'],
- type: lang_1.isPresent(data['type']) ? CompileTypeMetadata.fromJson(data['type']) : data['type'],
- changeDetection: lang_1.isPresent(data['changeDetection']) ?
- change_detection_1.CHANGE_DETECTION_STRATEGY_VALUES[data['changeDetection']] :
- data['changeDetection'],
- inputs: data['inputs'],
- outputs: data['outputs'],
- hostListeners: data['hostListeners'],
- hostProperties: data['hostProperties'],
- hostAttributes: data['hostAttributes'],
- lifecycleHooks: data['lifecycleHooks'].map(function (hookValue) { return interfaces_1.LIFECYCLE_HOOKS_VALUES[hookValue]; }),
- template: lang_1.isPresent(data['template']) ? CompileTemplateMetadata.fromJson(data['template']) :
- data['template']
- });
- };
- CompileDirectiveMetadata.prototype.toJson = function () {
- return {
- 'isComponent': this.isComponent,
- 'dynamicLoadable': this.dynamicLoadable,
- 'selector': this.selector,
- 'exportAs': this.exportAs,
- 'type': lang_1.isPresent(this.type) ? this.type.toJson() : this.type,
- 'changeDetection': lang_1.isPresent(this.changeDetection) ? lang_1.serializeEnum(this.changeDetection) :
- this.changeDetection,
- 'inputs': this.inputs,
- 'outputs': this.outputs,
- 'hostListeners': this.hostListeners,
- 'hostProperties': this.hostProperties,
- 'hostAttributes': this.hostAttributes,
- 'lifecycleHooks': this.lifecycleHooks.map(function (hook) { return lang_1.serializeEnum(hook); }),
- 'template': lang_1.isPresent(this.template) ? this.template.toJson() : this.template
- };
- };
- return CompileDirectiveMetadata;
- })();
- exports.CompileDirectiveMetadata = CompileDirectiveMetadata;
- /**
- * Construct {@link CompileDirectiveMetadata} from {@link ComponentTypeMetadata} and a selector.
- */
- function createHostComponentMeta(componentType, componentSelector) {
- var template = selector_1.CssSelector.parse(componentSelector)[0].getMatchingElementTemplate();
- return CompileDirectiveMetadata.create({
- type: new CompileTypeMetadata({
- runtime: Object,
- name: "Host" + componentType.name,
- moduleUrl: componentType.moduleUrl,
- isHost: true
- }),
- template: new CompileTemplateMetadata({ template: template, templateUrl: '', styles: [], styleUrls: [], ngContentSelectors: [] }),
- changeDetection: change_detection_1.ChangeDetectionStrategy.Default,
- inputs: [],
- outputs: [],
- host: {},
- lifecycleHooks: [],
- isComponent: true,
- dynamicLoadable: false,
- selector: '*'
- });
- }
- exports.createHostComponentMeta = createHostComponentMeta;
- /***/ },
- /* 154 */
- /***/ function(module, exports, __webpack_require__) {
- var collection_1 = __webpack_require__(12);
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var _EMPTY_ATTR_VALUE = '';
- // TODO: Can't use `const` here as
- // in Dart this is not transpiled into `final` yet...
- var _SELECTOR_REGEXP = lang_1.RegExpWrapper.create('(\\:not\\()|' +
- '([-\\w]+)|' +
- '(?:\\.([-\\w]+))|' +
- '(?:\\[([-\\w*]+)(?:=([^\\]]*))?\\])|' +
- '(\\))|' +
- '(\\s*,\\s*)'); // ","
- /**
- * A css selector contains an element name,
- * css classes and attribute/value pairs with the purpose
- * of selecting subsets out of them.
- */
- var CssSelector = (function () {
- function CssSelector() {
- this.element = null;
- this.classNames = [];
- this.attrs = [];
- this.notSelectors = [];
- }
- CssSelector.parse = function (selector) {
- var results = [];
- var _addResult = function (res, cssSel) {
- if (cssSel.notSelectors.length > 0 && lang_1.isBlank(cssSel.element) &&
- collection_1.ListWrapper.isEmpty(cssSel.classNames) && collection_1.ListWrapper.isEmpty(cssSel.attrs)) {
- cssSel.element = "*";
- }
- res.push(cssSel);
- };
- var cssSelector = new CssSelector();
- var matcher = lang_1.RegExpWrapper.matcher(_SELECTOR_REGEXP, selector);
- var match;
- var current = cssSelector;
- var inNot = false;
- while (lang_1.isPresent(match = lang_1.RegExpMatcherWrapper.next(matcher))) {
- if (lang_1.isPresent(match[1])) {
- if (inNot) {
- throw new exceptions_1.BaseException('Nesting :not is not allowed in a selector');
- }
- inNot = true;
- current = new CssSelector();
- cssSelector.notSelectors.push(current);
- }
- if (lang_1.isPresent(match[2])) {
- current.setElement(match[2]);
- }
- if (lang_1.isPresent(match[3])) {
- current.addClassName(match[3]);
- }
- if (lang_1.isPresent(match[4])) {
- current.addAttribute(match[4], match[5]);
- }
- if (lang_1.isPresent(match[6])) {
- inNot = false;
- current = cssSelector;
- }
- if (lang_1.isPresent(match[7])) {
- if (inNot) {
- throw new exceptions_1.BaseException('Multiple selectors in :not are not supported');
- }
- _addResult(results, cssSelector);
- cssSelector = current = new CssSelector();
- }
- }
- _addResult(results, cssSelector);
- return results;
- };
- CssSelector.prototype.isElementSelector = function () {
- return lang_1.isPresent(this.element) && collection_1.ListWrapper.isEmpty(this.classNames) &&
- collection_1.ListWrapper.isEmpty(this.attrs) && this.notSelectors.length === 0;
- };
- CssSelector.prototype.setElement = function (element) {
- if (element === void 0) { element = null; }
- this.element = element;
- };
- /** Gets a template string for an element that matches the selector. */
- CssSelector.prototype.getMatchingElementTemplate = function () {
- var tagName = lang_1.isPresent(this.element) ? this.element : 'div';
- var classAttr = this.classNames.length > 0 ? " class=\"" + this.classNames.join(' ') + "\"" : '';
- var attrs = '';
- for (var i = 0; i < this.attrs.length; i += 2) {
- var attrName = this.attrs[i];
- var attrValue = this.attrs[i + 1] !== '' ? "=\"" + this.attrs[i + 1] + "\"" : '';
- attrs += " " + attrName + attrValue;
- }
- return "<" + tagName + classAttr + attrs + "></" + tagName + ">";
- };
- CssSelector.prototype.addAttribute = function (name, value) {
- if (value === void 0) { value = _EMPTY_ATTR_VALUE; }
- this.attrs.push(name);
- if (lang_1.isPresent(value)) {
- value = value.toLowerCase();
- }
- else {
- value = _EMPTY_ATTR_VALUE;
- }
- this.attrs.push(value);
- };
- CssSelector.prototype.addClassName = function (name) { this.classNames.push(name.toLowerCase()); };
- CssSelector.prototype.toString = function () {
- var res = '';
- if (lang_1.isPresent(this.element)) {
- res += this.element;
- }
- if (lang_1.isPresent(this.classNames)) {
- for (var i = 0; i < this.classNames.length; i++) {
- res += '.' + this.classNames[i];
- }
- }
- if (lang_1.isPresent(this.attrs)) {
- for (var i = 0; i < this.attrs.length;) {
- var attrName = this.attrs[i++];
- var attrValue = this.attrs[i++];
- res += '[' + attrName;
- if (attrValue.length > 0) {
- res += '=' + attrValue;
- }
- res += ']';
- }
- }
- this.notSelectors.forEach(function (notSelector) { return res += ":not(" + notSelector + ")"; });
- return res;
- };
- return CssSelector;
- })();
- exports.CssSelector = CssSelector;
- /**
- * Reads a list of CssSelectors and allows to calculate which ones
- * are contained in a given CssSelector.
- */
- var SelectorMatcher = (function () {
- function SelectorMatcher() {
- this._elementMap = new collection_1.Map();
- this._elementPartialMap = new collection_1.Map();
- this._classMap = new collection_1.Map();
- this._classPartialMap = new collection_1.Map();
- this._attrValueMap = new collection_1.Map();
- this._attrValuePartialMap = new collection_1.Map();
- this._listContexts = [];
- }
- SelectorMatcher.createNotMatcher = function (notSelectors) {
- var notMatcher = new SelectorMatcher();
- notMatcher.addSelectables(notSelectors, null);
- return notMatcher;
- };
- SelectorMatcher.prototype.addSelectables = function (cssSelectors, callbackCtxt) {
- var listContext = null;
- if (cssSelectors.length > 1) {
- listContext = new SelectorListContext(cssSelectors);
- this._listContexts.push(listContext);
- }
- for (var i = 0; i < cssSelectors.length; i++) {
- this._addSelectable(cssSelectors[i], callbackCtxt, listContext);
- }
- };
- /**
- * Add an object that can be found later on by calling `match`.
- * @param cssSelector A css selector
- * @param callbackCtxt An opaque object that will be given to the callback of the `match` function
- */
- SelectorMatcher.prototype._addSelectable = function (cssSelector, callbackCtxt, listContext) {
- var matcher = this;
- var element = cssSelector.element;
- var classNames = cssSelector.classNames;
- var attrs = cssSelector.attrs;
- var selectable = new SelectorContext(cssSelector, callbackCtxt, listContext);
- if (lang_1.isPresent(element)) {
- var isTerminal = attrs.length === 0 && classNames.length === 0;
- if (isTerminal) {
- this._addTerminal(matcher._elementMap, element, selectable);
- }
- else {
- matcher = this._addPartial(matcher._elementPartialMap, element);
- }
- }
- if (lang_1.isPresent(classNames)) {
- for (var index = 0; index < classNames.length; index++) {
- var isTerminal = attrs.length === 0 && index === classNames.length - 1;
- var className = classNames[index];
- if (isTerminal) {
- this._addTerminal(matcher._classMap, className, selectable);
- }
- else {
- matcher = this._addPartial(matcher._classPartialMap, className);
- }
- }
- }
- if (lang_1.isPresent(attrs)) {
- for (var index = 0; index < attrs.length;) {
- var isTerminal = index === attrs.length - 2;
- var attrName = attrs[index++];
- var attrValue = attrs[index++];
- if (isTerminal) {
- var terminalMap = matcher._attrValueMap;
- var terminalValuesMap = terminalMap.get(attrName);
- if (lang_1.isBlank(terminalValuesMap)) {
- terminalValuesMap = new collection_1.Map();
- terminalMap.set(attrName, terminalValuesMap);
- }
- this._addTerminal(terminalValuesMap, attrValue, selectable);
- }
- else {
- var parttialMap = matcher._attrValuePartialMap;
- var partialValuesMap = parttialMap.get(attrName);
- if (lang_1.isBlank(partialValuesMap)) {
- partialValuesMap = new collection_1.Map();
- parttialMap.set(attrName, partialValuesMap);
- }
- matcher = this._addPartial(partialValuesMap, attrValue);
- }
- }
- }
- };
- SelectorMatcher.prototype._addTerminal = function (map, name, selectable) {
- var terminalList = map.get(name);
- if (lang_1.isBlank(terminalList)) {
- terminalList = [];
- map.set(name, terminalList);
- }
- terminalList.push(selectable);
- };
- SelectorMatcher.prototype._addPartial = function (map, name) {
- var matcher = map.get(name);
- if (lang_1.isBlank(matcher)) {
- matcher = new SelectorMatcher();
- map.set(name, matcher);
- }
- return matcher;
- };
- /**
- * Find the objects that have been added via `addSelectable`
- * whose css selector is contained in the given css selector.
- * @param cssSelector A css selector
- * @param matchedCallback This callback will be called with the object handed into `addSelectable`
- * @return boolean true if a match was found
- */
- SelectorMatcher.prototype.match = function (cssSelector, matchedCallback) {
- var result = false;
- var element = cssSelector.element;
- var classNames = cssSelector.classNames;
- var attrs = cssSelector.attrs;
- for (var i = 0; i < this._listContexts.length; i++) {
- this._listContexts[i].alreadyMatched = false;
- }
- result = this._matchTerminal(this._elementMap, element, cssSelector, matchedCallback) || result;
- result = this._matchPartial(this._elementPartialMap, element, cssSelector, matchedCallback) ||
- result;
- if (lang_1.isPresent(classNames)) {
- for (var index = 0; index < classNames.length; index++) {
- var className = classNames[index];
- result =
- this._matchTerminal(this._classMap, className, cssSelector, matchedCallback) || result;
- result =
- this._matchPartial(this._classPartialMap, className, cssSelector, matchedCallback) ||
- result;
- }
- }
- if (lang_1.isPresent(attrs)) {
- for (var index = 0; index < attrs.length;) {
- var attrName = attrs[index++];
- var attrValue = attrs[index++];
- var terminalValuesMap = this._attrValueMap.get(attrName);
- if (!lang_1.StringWrapper.equals(attrValue, _EMPTY_ATTR_VALUE)) {
- result = this._matchTerminal(terminalValuesMap, _EMPTY_ATTR_VALUE, cssSelector, matchedCallback) ||
- result;
- }
- result = this._matchTerminal(terminalValuesMap, attrValue, cssSelector, matchedCallback) ||
- result;
- var partialValuesMap = this._attrValuePartialMap.get(attrName);
- if (!lang_1.StringWrapper.equals(attrValue, _EMPTY_ATTR_VALUE)) {
- result = this._matchPartial(partialValuesMap, _EMPTY_ATTR_VALUE, cssSelector, matchedCallback) ||
- result;
- }
- result =
- this._matchPartial(partialValuesMap, attrValue, cssSelector, matchedCallback) || result;
- }
- }
- return result;
- };
- /** @internal */
- SelectorMatcher.prototype._matchTerminal = function (map, name, cssSelector, matchedCallback) {
- if (lang_1.isBlank(map) || lang_1.isBlank(name)) {
- return false;
- }
- var selectables = map.get(name);
- var starSelectables = map.get("*");
- if (lang_1.isPresent(starSelectables)) {
- selectables = selectables.concat(starSelectables);
- }
- if (lang_1.isBlank(selectables)) {
- return false;
- }
- var selectable;
- var result = false;
- for (var index = 0; index < selectables.length; index++) {
- selectable = selectables[index];
- result = selectable.finalize(cssSelector, matchedCallback) || result;
- }
- return result;
- };
- /** @internal */
- SelectorMatcher.prototype._matchPartial = function (map, name, cssSelector, matchedCallback /*: (c: CssSelector, a: any) => void*/) {
- if (lang_1.isBlank(map) || lang_1.isBlank(name)) {
- return false;
- }
- var nestedSelector = map.get(name);
- if (lang_1.isBlank(nestedSelector)) {
- return false;
- }
- // TODO(perf): get rid of recursion and measure again
- // TODO(perf): don't pass the whole selector into the recursion,
- // but only the not processed parts
- return nestedSelector.match(cssSelector, matchedCallback);
- };
- return SelectorMatcher;
- })();
- exports.SelectorMatcher = SelectorMatcher;
- var SelectorListContext = (function () {
- function SelectorListContext(selectors) {
- this.selectors = selectors;
- this.alreadyMatched = false;
- }
- return SelectorListContext;
- })();
- exports.SelectorListContext = SelectorListContext;
- // Store context to pass back selector and context when a selector is matched
- var SelectorContext = (function () {
- function SelectorContext(selector, cbContext, listContext) {
- this.selector = selector;
- this.cbContext = cbContext;
- this.listContext = listContext;
- this.notSelectors = selector.notSelectors;
- }
- SelectorContext.prototype.finalize = function (cssSelector, callback) {
- var result = true;
- if (this.notSelectors.length > 0 &&
- (lang_1.isBlank(this.listContext) || !this.listContext.alreadyMatched)) {
- var notMatcher = SelectorMatcher.createNotMatcher(this.notSelectors);
- result = !notMatcher.match(cssSelector, null);
- }
- if (result && lang_1.isPresent(callback) &&
- (lang_1.isBlank(this.listContext) || !this.listContext.alreadyMatched)) {
- if (lang_1.isPresent(this.listContext)) {
- this.listContext.alreadyMatched = true;
- }
- callback(this.selector, this.cbContext);
- }
- return result;
- };
- return SelectorContext;
- })();
- exports.SelectorContext = SelectorContext;
- /***/ },
- /* 155 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var CAMEL_CASE_REGEXP = /([A-Z])/g;
- var DASH_CASE_REGEXP = /-([a-z])/g;
- var SINGLE_QUOTE_ESCAPE_STRING_RE = /'|\\|\n|\r|\$/g;
- var DOUBLE_QUOTE_ESCAPE_STRING_RE = /"|\\|\n|\r|\$/g;
- exports.MODULE_SUFFIX = lang_1.IS_DART ? '.dart' : '.js';
- function camelCaseToDashCase(input) {
- return lang_1.StringWrapper.replaceAllMapped(input, CAMEL_CASE_REGEXP, function (m) { return '-' + m[1].toLowerCase(); });
- }
- exports.camelCaseToDashCase = camelCaseToDashCase;
- function dashCaseToCamelCase(input) {
- return lang_1.StringWrapper.replaceAllMapped(input, DASH_CASE_REGEXP, function (m) { return m[1].toUpperCase(); });
- }
- exports.dashCaseToCamelCase = dashCaseToCamelCase;
- function escapeSingleQuoteString(input) {
- if (lang_1.isBlank(input)) {
- return null;
- }
- return "'" + escapeString(input, SINGLE_QUOTE_ESCAPE_STRING_RE) + "'";
- }
- exports.escapeSingleQuoteString = escapeSingleQuoteString;
- function escapeDoubleQuoteString(input) {
- if (lang_1.isBlank(input)) {
- return null;
- }
- return "\"" + escapeString(input, DOUBLE_QUOTE_ESCAPE_STRING_RE) + "\"";
- }
- exports.escapeDoubleQuoteString = escapeDoubleQuoteString;
- function escapeString(input, re) {
- return lang_1.StringWrapper.replaceAllMapped(input, re, function (match) {
- if (match[0] == '$') {
- return lang_1.IS_DART ? '\\$' : '$';
- }
- else if (match[0] == '\n') {
- return '\\n';
- }
- else if (match[0] == '\r') {
- return '\\r';
- }
- else {
- return "\\" + match[0];
- }
- });
- }
- function codeGenExportVariable(name) {
- if (lang_1.IS_DART) {
- return "const " + name + " = ";
- }
- else {
- return "var " + name + " = exports['" + name + "'] = ";
- }
- }
- exports.codeGenExportVariable = codeGenExportVariable;
- function codeGenConstConstructorCall(name) {
- if (lang_1.IS_DART) {
- return "const " + name;
- }
- else {
- return "new " + name;
- }
- }
- exports.codeGenConstConstructorCall = codeGenConstConstructorCall;
- function codeGenValueFn(params, value, fnName) {
- if (fnName === void 0) { fnName = ''; }
- if (lang_1.IS_DART) {
- return fnName + "(" + params.join(',') + ") => " + value;
- }
- else {
- return "function " + fnName + "(" + params.join(',') + ") { return " + value + "; }";
- }
- }
- exports.codeGenValueFn = codeGenValueFn;
- function codeGenToString(expr) {
- if (lang_1.IS_DART) {
- return "'${" + expr + "}'";
- }
- else {
- // JS automatically convets to string...
- return expr;
- }
- }
- exports.codeGenToString = codeGenToString;
- function splitAtColon(input, defaultValues) {
- var parts = lang_1.StringWrapper.split(input.trim(), /\s*:\s*/g);
- if (parts.length > 1) {
- return parts;
- }
- else {
- return defaultValues;
- }
- }
- exports.splitAtColon = splitAtColon;
- /***/ },
- /* 156 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var MODULE_REGEXP = /#MODULE\[([^\]]*)\]/g;
- function moduleRef(moduleUrl) {
- return "#MODULE[" + moduleUrl + "]";
- }
- exports.moduleRef = moduleRef;
- /**
- * Represents generated source code with module references. Internal to the Angular compiler.
- */
- var SourceModule = (function () {
- function SourceModule(moduleUrl, sourceWithModuleRefs) {
- this.moduleUrl = moduleUrl;
- this.sourceWithModuleRefs = sourceWithModuleRefs;
- }
- SourceModule.prototype.getSourceWithImports = function () {
- var _this = this;
- var moduleAliases = {};
- var imports = [];
- var newSource = lang_1.StringWrapper.replaceAllMapped(this.sourceWithModuleRefs, MODULE_REGEXP, function (match) {
- var moduleUrl = match[1];
- var alias = moduleAliases[moduleUrl];
- if (lang_1.isBlank(alias)) {
- if (moduleUrl == _this.moduleUrl) {
- alias = '';
- }
- else {
- alias = "import" + imports.length;
- imports.push([moduleUrl, alias]);
- }
- moduleAliases[moduleUrl] = alias;
- }
- return alias.length > 0 ? alias + "." : '';
- });
- return new SourceWithImports(newSource, imports);
- };
- return SourceModule;
- })();
- exports.SourceModule = SourceModule;
- var SourceExpression = (function () {
- function SourceExpression(declarations, expression) {
- this.declarations = declarations;
- this.expression = expression;
- }
- return SourceExpression;
- })();
- exports.SourceExpression = SourceExpression;
- var SourceExpressions = (function () {
- function SourceExpressions(declarations, expressions) {
- this.declarations = declarations;
- this.expressions = expressions;
- }
- return SourceExpressions;
- })();
- exports.SourceExpressions = SourceExpressions;
- /**
- * Represents generated source code with imports. Internal to the Angular compiler.
- */
- var SourceWithImports = (function () {
- function SourceWithImports(source, imports) {
- this.source = source;
- this.imports = imports;
- }
- return SourceWithImports;
- })();
- exports.SourceWithImports = SourceWithImports;
- /***/ },
- /* 157 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var source_module_1 = __webpack_require__(156);
- var change_detection_jit_generator_1 = __webpack_require__(52);
- var change_definition_factory_1 = __webpack_require__(158);
- var lang_1 = __webpack_require__(5);
- var change_detection_1 = __webpack_require__(25);
- var change_detector_codegen_1 = __webpack_require__(160);
- var util_1 = __webpack_require__(155);
- var di_1 = __webpack_require__(6);
- var ABSTRACT_CHANGE_DETECTOR = "AbstractChangeDetector";
- var UTIL = "ChangeDetectionUtil";
- var CHANGE_DETECTOR_STATE = "ChangeDetectorState";
- var ABSTRACT_CHANGE_DETECTOR_MODULE = source_module_1.moduleRef("package:angular2/src/core/change_detection/abstract_change_detector" + util_1.MODULE_SUFFIX);
- var UTIL_MODULE = source_module_1.moduleRef("package:angular2/src/core/change_detection/change_detection_util" + util_1.MODULE_SUFFIX);
- var PREGEN_PROTO_CHANGE_DETECTOR_MODULE = source_module_1.moduleRef("package:angular2/src/core/change_detection/pregen_proto_change_detector" + util_1.MODULE_SUFFIX);
- var CONSTANTS_MODULE = source_module_1.moduleRef("package:angular2/src/core/change_detection/constants" + util_1.MODULE_SUFFIX);
- var ChangeDetectionCompiler = (function () {
- function ChangeDetectionCompiler(_genConfig) {
- this._genConfig = _genConfig;
- }
- ChangeDetectionCompiler.prototype.compileComponentRuntime = function (componentType, strategy, parsedTemplate) {
- var _this = this;
- var changeDetectorDefinitions = change_definition_factory_1.createChangeDetectorDefinitions(componentType, strategy, this._genConfig, parsedTemplate);
- return changeDetectorDefinitions.map(function (definition) {
- return _this._createChangeDetectorFactory(definition);
- });
- };
- ChangeDetectionCompiler.prototype._createChangeDetectorFactory = function (definition) {
- if (lang_1.IS_DART || !this._genConfig.useJit) {
- var proto = new change_detection_1.DynamicProtoChangeDetector(definition);
- return function (dispatcher) { return proto.instantiate(dispatcher); };
- }
- else {
- return new change_detection_jit_generator_1.ChangeDetectorJITGenerator(definition, UTIL, ABSTRACT_CHANGE_DETECTOR, CHANGE_DETECTOR_STATE)
- .generate();
- }
- };
- ChangeDetectionCompiler.prototype.compileComponentCodeGen = function (componentType, strategy, parsedTemplate) {
- var changeDetectorDefinitions = change_definition_factory_1.createChangeDetectorDefinitions(componentType, strategy, this._genConfig, parsedTemplate);
- var factories = [];
- var index = 0;
- var sourceParts = changeDetectorDefinitions.map(function (definition) {
- var codegen;
- var sourcePart;
- // TODO(tbosch): move the 2 code generators to the same place, one with .dart and one with .ts
- // suffix
- // and have the same API for calling them!
- if (lang_1.IS_DART) {
- codegen = new change_detector_codegen_1.Codegen(PREGEN_PROTO_CHANGE_DETECTOR_MODULE);
- var className = "_" + definition.id;
- var typeRef = (index === 0 && componentType.isHost) ?
- 'dynamic' :
- "" + source_module_1.moduleRef(componentType.moduleUrl) + componentType.name;
- codegen.generate(typeRef, className, definition);
- factories.push(className + ".newChangeDetector");
- sourcePart = codegen.toString();
- }
- else {
- codegen = new change_detection_jit_generator_1.ChangeDetectorJITGenerator(definition, "" + UTIL_MODULE + UTIL, "" + ABSTRACT_CHANGE_DETECTOR_MODULE + ABSTRACT_CHANGE_DETECTOR, "" + CONSTANTS_MODULE + CHANGE_DETECTOR_STATE);
- factories.push("function(dispatcher) { return new " + codegen.typeName + "(dispatcher); }");
- sourcePart = codegen.generateSource();
- }
- index++;
- return sourcePart;
- });
- return new source_module_1.SourceExpressions(sourceParts, factories);
- };
- ChangeDetectionCompiler = __decorate([
- di_1.Injectable(),
- __metadata('design:paramtypes', [change_detection_1.ChangeDetectorGenConfig])
- ], ChangeDetectionCompiler);
- return ChangeDetectionCompiler;
- })();
- exports.ChangeDetectionCompiler = ChangeDetectionCompiler;
- /***/ },
- /* 158 */
- /***/ function(module, exports, __webpack_require__) {
- var collection_1 = __webpack_require__(12);
- var lang_1 = __webpack_require__(5);
- var reflection_1 = __webpack_require__(16);
- var change_detection_1 = __webpack_require__(25);
- var template_ast_1 = __webpack_require__(159);
- var interfaces_1 = __webpack_require__(89);
- function createChangeDetectorDefinitions(componentType, componentStrategy, genConfig, parsedTemplate) {
- var pvVisitors = [];
- var visitor = new ProtoViewVisitor(null, pvVisitors, componentStrategy);
- template_ast_1.templateVisitAll(visitor, parsedTemplate);
- return createChangeDefinitions(pvVisitors, componentType, genConfig);
- }
- exports.createChangeDetectorDefinitions = createChangeDetectorDefinitions;
- var ProtoViewVisitor = (function () {
- function ProtoViewVisitor(parent, allVisitors, strategy) {
- this.parent = parent;
- this.allVisitors = allVisitors;
- this.strategy = strategy;
- this.boundTextCount = 0;
- this.boundElementCount = 0;
- this.variableNames = [];
- this.bindingRecords = [];
- this.eventRecords = [];
- this.directiveRecords = [];
- this.viewIndex = allVisitors.length;
- allVisitors.push(this);
- }
- ProtoViewVisitor.prototype.visitEmbeddedTemplate = function (ast, context) {
- this.boundElementCount++;
- template_ast_1.templateVisitAll(this, ast.outputs);
- for (var i = 0; i < ast.directives.length; i++) {
- ast.directives[i].visit(this, i);
- }
- var childVisitor = new ProtoViewVisitor(this, this.allVisitors, change_detection_1.ChangeDetectionStrategy.Default);
- // Attention: variables present on an embedded template count towards
- // the embedded template and not the template anchor!
- template_ast_1.templateVisitAll(childVisitor, ast.vars);
- template_ast_1.templateVisitAll(childVisitor, ast.children);
- return null;
- };
- ProtoViewVisitor.prototype.visitElement = function (ast, context) {
- if (ast.isBound()) {
- this.boundElementCount++;
- }
- template_ast_1.templateVisitAll(this, ast.inputs, null);
- template_ast_1.templateVisitAll(this, ast.outputs);
- template_ast_1.templateVisitAll(this, ast.exportAsVars);
- for (var i = 0; i < ast.directives.length; i++) {
- ast.directives[i].visit(this, i);
- }
- template_ast_1.templateVisitAll(this, ast.children);
- return null;
- };
- ProtoViewVisitor.prototype.visitNgContent = function (ast, context) { return null; };
- ProtoViewVisitor.prototype.visitVariable = function (ast, context) {
- this.variableNames.push(ast.name);
- return null;
- };
- ProtoViewVisitor.prototype.visitEvent = function (ast, directiveRecord) {
- var bindingRecord = lang_1.isPresent(directiveRecord) ?
- change_detection_1.BindingRecord.createForHostEvent(ast.handler, ast.fullName, directiveRecord) :
- change_detection_1.BindingRecord.createForEvent(ast.handler, ast.fullName, this.boundElementCount - 1);
- this.eventRecords.push(bindingRecord);
- return null;
- };
- ProtoViewVisitor.prototype.visitElementProperty = function (ast, directiveRecord) {
- var boundElementIndex = this.boundElementCount - 1;
- var dirIndex = lang_1.isPresent(directiveRecord) ? directiveRecord.directiveIndex : null;
- var bindingRecord;
- if (ast.type === template_ast_1.PropertyBindingType.Property) {
- bindingRecord =
- lang_1.isPresent(dirIndex) ?
- change_detection_1.BindingRecord.createForHostProperty(dirIndex, ast.value, ast.name) :
- change_detection_1.BindingRecord.createForElementProperty(ast.value, boundElementIndex, ast.name);
- }
- else if (ast.type === template_ast_1.PropertyBindingType.Attribute) {
- bindingRecord =
- lang_1.isPresent(dirIndex) ?
- change_detection_1.BindingRecord.createForHostAttribute(dirIndex, ast.value, ast.name) :
- change_detection_1.BindingRecord.createForElementAttribute(ast.value, boundElementIndex, ast.name);
- }
- else if (ast.type === template_ast_1.PropertyBindingType.Class) {
- bindingRecord =
- lang_1.isPresent(dirIndex) ?
- change_detection_1.BindingRecord.createForHostClass(dirIndex, ast.value, ast.name) :
- change_detection_1.BindingRecord.createForElementClass(ast.value, boundElementIndex, ast.name);
- }
- else if (ast.type === template_ast_1.PropertyBindingType.Style) {
- bindingRecord =
- lang_1.isPresent(dirIndex) ?
- change_detection_1.BindingRecord.createForHostStyle(dirIndex, ast.value, ast.name, ast.unit) :
- change_detection_1.BindingRecord.createForElementStyle(ast.value, boundElementIndex, ast.name, ast.unit);
- }
- this.bindingRecords.push(bindingRecord);
- return null;
- };
- ProtoViewVisitor.prototype.visitAttr = function (ast, context) { return null; };
- ProtoViewVisitor.prototype.visitBoundText = function (ast, context) {
- var boundTextIndex = this.boundTextCount++;
- this.bindingRecords.push(change_detection_1.BindingRecord.createForTextNode(ast.value, boundTextIndex));
- return null;
- };
- ProtoViewVisitor.prototype.visitText = function (ast, context) { return null; };
- ProtoViewVisitor.prototype.visitDirective = function (ast, directiveIndexAsNumber) {
- var directiveIndex = new change_detection_1.DirectiveIndex(this.boundElementCount - 1, directiveIndexAsNumber);
- var directiveMetadata = ast.directive;
- var directiveRecord = new change_detection_1.DirectiveRecord({
- directiveIndex: directiveIndex,
- callAfterContentInit: directiveMetadata.lifecycleHooks.indexOf(interfaces_1.LifecycleHooks.AfterContentInit) !== -1,
- callAfterContentChecked: directiveMetadata.lifecycleHooks.indexOf(interfaces_1.LifecycleHooks.AfterContentChecked) !== -1,
- callAfterViewInit: directiveMetadata.lifecycleHooks.indexOf(interfaces_1.LifecycleHooks.AfterViewInit) !== -1,
- callAfterViewChecked: directiveMetadata.lifecycleHooks.indexOf(interfaces_1.LifecycleHooks.AfterViewChecked) !== -1,
- callOnChanges: directiveMetadata.lifecycleHooks.indexOf(interfaces_1.LifecycleHooks.OnChanges) !== -1,
- callDoCheck: directiveMetadata.lifecycleHooks.indexOf(interfaces_1.LifecycleHooks.DoCheck) !== -1,
- callOnInit: directiveMetadata.lifecycleHooks.indexOf(interfaces_1.LifecycleHooks.OnInit) !== -1,
- changeDetection: directiveMetadata.changeDetection
- });
- this.directiveRecords.push(directiveRecord);
- template_ast_1.templateVisitAll(this, ast.inputs, directiveRecord);
- var bindingRecords = this.bindingRecords;
- if (directiveRecord.callOnChanges) {
- bindingRecords.push(change_detection_1.BindingRecord.createDirectiveOnChanges(directiveRecord));
- }
- if (directiveRecord.callOnInit) {
- bindingRecords.push(change_detection_1.BindingRecord.createDirectiveOnInit(directiveRecord));
- }
- if (directiveRecord.callDoCheck) {
- bindingRecords.push(change_detection_1.BindingRecord.createDirectiveDoCheck(directiveRecord));
- }
- template_ast_1.templateVisitAll(this, ast.hostProperties, directiveRecord);
- template_ast_1.templateVisitAll(this, ast.hostEvents, directiveRecord);
- template_ast_1.templateVisitAll(this, ast.exportAsVars);
- return null;
- };
- ProtoViewVisitor.prototype.visitDirectiveProperty = function (ast, directiveRecord) {
- // TODO: these setters should eventually be created by change detection, to make
- // it monomorphic!
- var setter = reflection_1.reflector.setter(ast.directiveName);
- this.bindingRecords.push(change_detection_1.BindingRecord.createForDirective(ast.value, ast.directiveName, setter, directiveRecord));
- return null;
- };
- return ProtoViewVisitor;
- })();
- function createChangeDefinitions(pvVisitors, componentType, genConfig) {
- var pvVariableNames = _collectNestedProtoViewsVariableNames(pvVisitors);
- return pvVisitors.map(function (pvVisitor) {
- var id = componentType.name + "_" + pvVisitor.viewIndex;
- return new change_detection_1.ChangeDetectorDefinition(id, pvVisitor.strategy, pvVariableNames[pvVisitor.viewIndex], pvVisitor.bindingRecords, pvVisitor.eventRecords, pvVisitor.directiveRecords, genConfig);
- });
- }
- function _collectNestedProtoViewsVariableNames(pvVisitors) {
- var nestedPvVariableNames = collection_1.ListWrapper.createFixedSize(pvVisitors.length);
- pvVisitors.forEach(function (pv) {
- var parentVariableNames = lang_1.isPresent(pv.parent) ? nestedPvVariableNames[pv.parent.viewIndex] : [];
- nestedPvVariableNames[pv.viewIndex] = parentVariableNames.concat(pv.variableNames);
- });
- return nestedPvVariableNames;
- }
- /***/ },
- /* 159 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- /**
- * A segment of text within the template.
- */
- var TextAst = (function () {
- function TextAst(value, ngContentIndex, sourceSpan) {
- this.value = value;
- this.ngContentIndex = ngContentIndex;
- this.sourceSpan = sourceSpan;
- }
- TextAst.prototype.visit = function (visitor, context) { return visitor.visitText(this, context); };
- return TextAst;
- })();
- exports.TextAst = TextAst;
- /**
- * A bound expression within the text of a template.
- */
- var BoundTextAst = (function () {
- function BoundTextAst(value, ngContentIndex, sourceSpan) {
- this.value = value;
- this.ngContentIndex = ngContentIndex;
- this.sourceSpan = sourceSpan;
- }
- BoundTextAst.prototype.visit = function (visitor, context) {
- return visitor.visitBoundText(this, context);
- };
- return BoundTextAst;
- })();
- exports.BoundTextAst = BoundTextAst;
- /**
- * A plain attribute on an element.
- */
- var AttrAst = (function () {
- function AttrAst(name, value, sourceSpan) {
- this.name = name;
- this.value = value;
- this.sourceSpan = sourceSpan;
- }
- AttrAst.prototype.visit = function (visitor, context) { return visitor.visitAttr(this, context); };
- return AttrAst;
- })();
- exports.AttrAst = AttrAst;
- /**
- * A binding for an element property (e.g. `[property]="expression"`).
- */
- var BoundElementPropertyAst = (function () {
- function BoundElementPropertyAst(name, type, value, unit, sourceSpan) {
- this.name = name;
- this.type = type;
- this.value = value;
- this.unit = unit;
- this.sourceSpan = sourceSpan;
- }
- BoundElementPropertyAst.prototype.visit = function (visitor, context) {
- return visitor.visitElementProperty(this, context);
- };
- return BoundElementPropertyAst;
- })();
- exports.BoundElementPropertyAst = BoundElementPropertyAst;
- /**
- * A binding for an element event (e.g. `(event)="handler()"`).
- */
- var BoundEventAst = (function () {
- function BoundEventAst(name, target, handler, sourceSpan) {
- this.name = name;
- this.target = target;
- this.handler = handler;
- this.sourceSpan = sourceSpan;
- }
- BoundEventAst.prototype.visit = function (visitor, context) {
- return visitor.visitEvent(this, context);
- };
- Object.defineProperty(BoundEventAst.prototype, "fullName", {
- get: function () {
- if (lang_1.isPresent(this.target)) {
- return this.target + ":" + this.name;
- }
- else {
- return this.name;
- }
- },
- enumerable: true,
- configurable: true
- });
- return BoundEventAst;
- })();
- exports.BoundEventAst = BoundEventAst;
- /**
- * A variable declaration on an element (e.g. `#var="expression"`).
- */
- var VariableAst = (function () {
- function VariableAst(name, value, sourceSpan) {
- this.name = name;
- this.value = value;
- this.sourceSpan = sourceSpan;
- }
- VariableAst.prototype.visit = function (visitor, context) {
- return visitor.visitVariable(this, context);
- };
- return VariableAst;
- })();
- exports.VariableAst = VariableAst;
- /**
- * An element declaration in a template.
- */
- var ElementAst = (function () {
- function ElementAst(name, attrs, inputs, outputs, exportAsVars, directives, children, ngContentIndex, sourceSpan) {
- this.name = name;
- this.attrs = attrs;
- this.inputs = inputs;
- this.outputs = outputs;
- this.exportAsVars = exportAsVars;
- this.directives = directives;
- this.children = children;
- this.ngContentIndex = ngContentIndex;
- this.sourceSpan = sourceSpan;
- }
- ElementAst.prototype.visit = function (visitor, context) {
- return visitor.visitElement(this, context);
- };
- /**
- * Whether the element has any active bindings (inputs, outputs, vars, or directives).
- */
- ElementAst.prototype.isBound = function () {
- return (this.inputs.length > 0 || this.outputs.length > 0 || this.exportAsVars.length > 0 ||
- this.directives.length > 0);
- };
- /**
- * Get the component associated with this element, if any.
- */
- ElementAst.prototype.getComponent = function () {
- return this.directives.length > 0 && this.directives[0].directive.isComponent ?
- this.directives[0].directive :
- null;
- };
- return ElementAst;
- })();
- exports.ElementAst = ElementAst;
- /**
- * A `<template>` element included in an Angular template.
- */
- var EmbeddedTemplateAst = (function () {
- function EmbeddedTemplateAst(attrs, outputs, vars, directives, children, ngContentIndex, sourceSpan) {
- this.attrs = attrs;
- this.outputs = outputs;
- this.vars = vars;
- this.directives = directives;
- this.children = children;
- this.ngContentIndex = ngContentIndex;
- this.sourceSpan = sourceSpan;
- }
- EmbeddedTemplateAst.prototype.visit = function (visitor, context) {
- return visitor.visitEmbeddedTemplate(this, context);
- };
- return EmbeddedTemplateAst;
- })();
- exports.EmbeddedTemplateAst = EmbeddedTemplateAst;
- /**
- * A directive property with a bound value (e.g. `*ngIf="condition").
- */
- var BoundDirectivePropertyAst = (function () {
- function BoundDirectivePropertyAst(directiveName, templateName, value, sourceSpan) {
- this.directiveName = directiveName;
- this.templateName = templateName;
- this.value = value;
- this.sourceSpan = sourceSpan;
- }
- BoundDirectivePropertyAst.prototype.visit = function (visitor, context) {
- return visitor.visitDirectiveProperty(this, context);
- };
- return BoundDirectivePropertyAst;
- })();
- exports.BoundDirectivePropertyAst = BoundDirectivePropertyAst;
- /**
- * A directive declared on an element.
- */
- var DirectiveAst = (function () {
- function DirectiveAst(directive, inputs, hostProperties, hostEvents, exportAsVars, sourceSpan) {
- this.directive = directive;
- this.inputs = inputs;
- this.hostProperties = hostProperties;
- this.hostEvents = hostEvents;
- this.exportAsVars = exportAsVars;
- this.sourceSpan = sourceSpan;
- }
- DirectiveAst.prototype.visit = function (visitor, context) {
- return visitor.visitDirective(this, context);
- };
- return DirectiveAst;
- })();
- exports.DirectiveAst = DirectiveAst;
- /**
- * Position where content is to be projected (instance of `<ng-content>` in a template).
- */
- var NgContentAst = (function () {
- function NgContentAst(index, ngContentIndex, sourceSpan) {
- this.index = index;
- this.ngContentIndex = ngContentIndex;
- this.sourceSpan = sourceSpan;
- }
- NgContentAst.prototype.visit = function (visitor, context) {
- return visitor.visitNgContent(this, context);
- };
- return NgContentAst;
- })();
- exports.NgContentAst = NgContentAst;
- /**
- * Enumeration of types of property bindings.
- */
- (function (PropertyBindingType) {
- /**
- * A normal binding to a property (e.g. `[property]="expression"`).
- */
- PropertyBindingType[PropertyBindingType["Property"] = 0] = "Property";
- /**
- * A binding to an element attribute (e.g. `[attr.name]="expression"`).
- */
- PropertyBindingType[PropertyBindingType["Attribute"] = 1] = "Attribute";
- /**
- * A binding to a CSS class (e.g. `[class.name]="condition"`).
- */
- PropertyBindingType[PropertyBindingType["Class"] = 2] = "Class";
- /**
- * A binding to a style rule (e.g. `[style.rule]="expression"`).
- */
- PropertyBindingType[PropertyBindingType["Style"] = 3] = "Style";
- })(exports.PropertyBindingType || (exports.PropertyBindingType = {}));
- var PropertyBindingType = exports.PropertyBindingType;
- /**
- * Visit every node in a list of {@link TemplateAst}s with the given {@link TemplateAstVisitor}.
- */
- function templateVisitAll(visitor, asts, context) {
- if (context === void 0) { context = null; }
- var result = [];
- asts.forEach(function (ast) {
- var astResult = ast.visit(visitor, context);
- if (lang_1.isPresent(astResult)) {
- result.push(astResult);
- }
- });
- return result;
- }
- exports.templateVisitAll = templateVisitAll;
- /***/ },
- /* 160 */
- /***/ function(module, exports) {
- // Note: This class is only here so that we can reference it from TypeScript code.
- // The actual implementation lives under modules_dart.
- // TODO(tbosch): Move the corresponding code into angular2/src/compiler once
- // the new compiler is done.
- var Codegen = (function () {
- function Codegen(moduleAlias) {
- }
- Codegen.prototype.generate = function (typeName, changeDetectorTypeName, def) {
- throw "Not implemented in JS";
- };
- Codegen.prototype.toString = function () { throw "Not implemented in JS"; };
- return Codegen;
- })();
- exports.Codegen = Codegen;
- /***/ },
- /* 161 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var source_module_1 = __webpack_require__(156);
- var view_1 = __webpack_require__(56);
- var xhr_1 = __webpack_require__(149);
- var lang_1 = __webpack_require__(5);
- var async_1 = __webpack_require__(60);
- var shadow_css_1 = __webpack_require__(162);
- var url_resolver_1 = __webpack_require__(148);
- var style_url_resolver_1 = __webpack_require__(163);
- var util_1 = __webpack_require__(155);
- var di_1 = __webpack_require__(6);
- var view_factory_1 = __webpack_require__(164);
- var StyleCompiler = (function () {
- function StyleCompiler(_xhr, _urlResolver) {
- this._xhr = _xhr;
- this._urlResolver = _urlResolver;
- this._styleCache = new Map();
- this._shadowCss = new shadow_css_1.ShadowCss();
- }
- StyleCompiler.prototype.compileComponentRuntime = function (template) {
- var styles = template.styles;
- var styleAbsUrls = template.styleUrls;
- return this._loadStyles(styles, styleAbsUrls, template.encapsulation === view_1.ViewEncapsulation.Emulated);
- };
- StyleCompiler.prototype.compileComponentCodeGen = function (template) {
- var shim = template.encapsulation === view_1.ViewEncapsulation.Emulated;
- return this._styleCodeGen(template.styles, template.styleUrls, shim);
- };
- StyleCompiler.prototype.compileStylesheetCodeGen = function (stylesheetUrl, cssText) {
- var styleWithImports = style_url_resolver_1.extractStyleUrls(this._urlResolver, stylesheetUrl, cssText);
- return [
- this._styleModule(stylesheetUrl, false, this._styleCodeGen([styleWithImports.style], styleWithImports.styleUrls, false)),
- this._styleModule(stylesheetUrl, true, this._styleCodeGen([styleWithImports.style], styleWithImports.styleUrls, true))
- ];
- };
- StyleCompiler.prototype.clearCache = function () { this._styleCache.clear(); };
- StyleCompiler.prototype._loadStyles = function (plainStyles, absUrls, encapsulate) {
- var _this = this;
- var promises = absUrls.map(function (absUrl) {
- var cacheKey = "" + absUrl + (encapsulate ? '.shim' : '');
- var result = _this._styleCache.get(cacheKey);
- if (lang_1.isBlank(result)) {
- result = _this._xhr.get(absUrl).then(function (style) {
- var styleWithImports = style_url_resolver_1.extractStyleUrls(_this._urlResolver, absUrl, style);
- return _this._loadStyles([styleWithImports.style], styleWithImports.styleUrls, encapsulate);
- });
- _this._styleCache.set(cacheKey, result);
- }
- return result;
- });
- return async_1.PromiseWrapper.all(promises).then(function (nestedStyles) {
- var result = plainStyles.map(function (plainStyle) { return _this._shimIfNeeded(plainStyle, encapsulate); });
- nestedStyles.forEach(function (styles) { return result.push(styles); });
- return result;
- });
- };
- StyleCompiler.prototype._styleCodeGen = function (plainStyles, absUrls, shim) {
- var _this = this;
- var arrayPrefix = lang_1.IS_DART ? "const" : '';
- var styleExpressions = plainStyles.map(function (plainStyle) { return util_1.escapeSingleQuoteString(_this._shimIfNeeded(plainStyle, shim)); });
- for (var i = 0; i < absUrls.length; i++) {
- var moduleUrl = this._createModuleUrl(absUrls[i], shim);
- styleExpressions.push(source_module_1.moduleRef(moduleUrl) + "STYLES");
- }
- var expressionSource = arrayPrefix + " [" + styleExpressions.join(',') + "]";
- return new source_module_1.SourceExpression([], expressionSource);
- };
- StyleCompiler.prototype._styleModule = function (stylesheetUrl, shim, expression) {
- var moduleSource = "\n " + expression.declarations.join('\n') + "\n " + util_1.codeGenExportVariable('STYLES') + expression.expression + ";\n ";
- return new source_module_1.SourceModule(this._createModuleUrl(stylesheetUrl, shim), moduleSource);
- };
- StyleCompiler.prototype._shimIfNeeded = function (style, shim) {
- return shim ? this._shadowCss.shimCssText(style, view_factory_1.CONTENT_ATTR, view_factory_1.HOST_ATTR) : style;
- };
- StyleCompiler.prototype._createModuleUrl = function (stylesheetUrl, shim) {
- return shim ? stylesheetUrl + ".shim" + util_1.MODULE_SUFFIX : "" + stylesheetUrl + util_1.MODULE_SUFFIX;
- };
- StyleCompiler = __decorate([
- di_1.Injectable(),
- __metadata('design:paramtypes', [xhr_1.XHR, url_resolver_1.UrlResolver])
- ], StyleCompiler);
- return StyleCompiler;
- })();
- exports.StyleCompiler = StyleCompiler;
- /***/ },
- /* 162 */
- /***/ function(module, exports, __webpack_require__) {
- var collection_1 = __webpack_require__(12);
- var lang_1 = __webpack_require__(5);
- /**
- * This file is a port of shadowCSS from webcomponents.js to TypeScript.
- *
- * Please make sure to keep to edits in sync with the source file.
- *
- * Source:
- * https://github.com/webcomponents/webcomponentsjs/blob/4efecd7e0e/src/ShadowCSS/ShadowCSS.js
- *
- * The original file level comment is reproduced below
- */
- /*
- This is a limited shim for ShadowDOM css styling.
- https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles
-
- The intention here is to support only the styling features which can be
- relatively simply implemented. The goal is to allow users to avoid the
- most obvious pitfalls and do so without compromising performance significantly.
- For ShadowDOM styling that's not covered here, a set of best practices
- can be provided that should allow users to accomplish more complex styling.
-
- The following is a list of specific ShadowDOM styling features and a brief
- discussion of the approach used to shim.
-
- Shimmed features:
-
- * :host, :host-context: ShadowDOM allows styling of the shadowRoot's host
- element using the :host rule. To shim this feature, the :host styles are
- reformatted and prefixed with a given scope name and promoted to a
- document level stylesheet.
- For example, given a scope name of .foo, a rule like this:
-
- :host {
- background: red;
- }
- }
-
- becomes:
-
- .foo {
- background: red;
- }
-
- * encapsultion: Styles defined within ShadowDOM, apply only to
- dom inside the ShadowDOM. Polymer uses one of two techniques to imlement
- this feature.
-
- By default, rules are prefixed with the host element tag name
- as a descendant selector. This ensures styling does not leak out of the 'top'
- of the element's ShadowDOM. For example,
-
- div {
- font-weight: bold;
- }
-
- becomes:
-
- x-foo div {
- font-weight: bold;
- }
-
- becomes:
-
-
- Alternatively, if WebComponents.ShadowCSS.strictStyling is set to true then
- selectors are scoped by adding an attribute selector suffix to each
- simple selector that contains the host element tag name. Each element
- in the element's ShadowDOM template is also given the scope attribute.
- Thus, these rules match only elements that have the scope attribute.
- For example, given a scope name of x-foo, a rule like this:
-
- div {
- font-weight: bold;
- }
-
- becomes:
-
- div[x-foo] {
- font-weight: bold;
- }
-
- Note that elements that are dynamically added to a scope must have the scope
- selector added to them manually.
-
- * upper/lower bound encapsulation: Styles which are defined outside a
- shadowRoot should not cross the ShadowDOM boundary and should not apply
- inside a shadowRoot.
-
- This styling behavior is not emulated. Some possible ways to do this that
- were rejected due to complexity and/or performance concerns include: (1) reset
- every possible property for every possible selector for a given scope name;
- (2) re-implement css in javascript.
-
- As an alternative, users should make sure to use selectors
- specific to the scope in which they are working.
-
- * ::distributed: This behavior is not emulated. It's often not necessary
- to style the contents of a specific insertion point and instead, descendants
- of the host element can be styled selectively. Users can also create an
- extra node around an insertion point and style that node's contents
- via descendent selectors. For example, with a shadowRoot like this:
-
- <style>
- ::content(div) {
- background: red;
- }
- </style>
- <content></content>
-
- could become:
-
- <style>
- / *@polyfill .content-container div * /
- ::content(div) {
- background: red;
- }
- </style>
- <div class="content-container">
- <content></content>
- </div>
-
- Note the use of @polyfill in the comment above a ShadowDOM specific style
- declaration. This is a directive to the styling shim to use the selector
- in comments in lieu of the next selector when running under polyfill.
- */
- var ShadowCss = (function () {
- function ShadowCss() {
- this.strictStyling = true;
- }
- /*
- * Shim some cssText with the given selector. Returns cssText that can
- * be included in the document via WebComponents.ShadowCSS.addCssToDocument(css).
- *
- * When strictStyling is true:
- * - selector is the attribute added to all elements inside the host,
- * - hostSelector is the attribute added to the host itself.
- */
- ShadowCss.prototype.shimCssText = function (cssText, selector, hostSelector) {
- if (hostSelector === void 0) { hostSelector = ''; }
- cssText = stripComments(cssText);
- cssText = this._insertDirectives(cssText);
- return this._scopeCssText(cssText, selector, hostSelector);
- };
- ShadowCss.prototype._insertDirectives = function (cssText) {
- cssText = this._insertPolyfillDirectivesInCssText(cssText);
- return this._insertPolyfillRulesInCssText(cssText);
- };
- /*
- * Process styles to convert native ShadowDOM rules that will trip
- * up the css parser; we rely on decorating the stylesheet with inert rules.
- *
- * For example, we convert this rule:
- *
- * polyfill-next-selector { content: ':host menu-item'; }
- * ::content menu-item {
- *
- * to this:
- *
- * scopeName menu-item {
- *
- **/
- ShadowCss.prototype._insertPolyfillDirectivesInCssText = function (cssText) {
- // Difference with webcomponents.js: does not handle comments
- return lang_1.StringWrapper.replaceAllMapped(cssText, _cssContentNextSelectorRe, function (m) { return m[1] + '{'; });
- };
- /*
- * Process styles to add rules which will only apply under the polyfill
- *
- * For example, we convert this rule:
- *
- * polyfill-rule {
- * content: ':host menu-item';
- * ...
- * }
- *
- * to this:
- *
- * scopeName menu-item {...}
- *
- **/
- ShadowCss.prototype._insertPolyfillRulesInCssText = function (cssText) {
- // Difference with webcomponents.js: does not handle comments
- return lang_1.StringWrapper.replaceAllMapped(cssText, _cssContentRuleRe, function (m) {
- var rule = m[0];
- rule = lang_1.StringWrapper.replace(rule, m[1], '');
- rule = lang_1.StringWrapper.replace(rule, m[2], '');
- return m[3] + rule;
- });
- };
- /* Ensure styles are scoped. Pseudo-scoping takes a rule like:
- *
- * .foo {... }
- *
- * and converts this to
- *
- * scopeName .foo { ... }
- */
- ShadowCss.prototype._scopeCssText = function (cssText, scopeSelector, hostSelector) {
- var unscoped = this._extractUnscopedRulesFromCssText(cssText);
- cssText = this._insertPolyfillHostInCssText(cssText);
- cssText = this._convertColonHost(cssText);
- cssText = this._convertColonHostContext(cssText);
- cssText = this._convertShadowDOMSelectors(cssText);
- if (lang_1.isPresent(scopeSelector)) {
- cssText = this._scopeSelectors(cssText, scopeSelector, hostSelector);
- }
- cssText = cssText + '\n' + unscoped;
- return cssText.trim();
- };
- /*
- * Process styles to add rules which will only apply under the polyfill
- * and do not process via CSSOM. (CSSOM is destructive to rules on rare
- * occasions, e.g. -webkit-calc on Safari.)
- * For example, we convert this rule:
- *
- * @polyfill-unscoped-rule {
- * content: 'menu-item';
- * ... }
- *
- * to this:
- *
- * menu-item {...}
- *
- **/
- ShadowCss.prototype._extractUnscopedRulesFromCssText = function (cssText) {
- // Difference with webcomponents.js: does not handle comments
- var r = '', m;
- var matcher = lang_1.RegExpWrapper.matcher(_cssContentUnscopedRuleRe, cssText);
- while (lang_1.isPresent(m = lang_1.RegExpMatcherWrapper.next(matcher))) {
- var rule = m[0];
- rule = lang_1.StringWrapper.replace(rule, m[2], '');
- rule = lang_1.StringWrapper.replace(rule, m[1], m[3]);
- r += rule + '\n\n';
- }
- return r;
- };
- /*
- * convert a rule like :host(.foo) > .bar { }
- *
- * to
- *
- * scopeName.foo > .bar
- */
- ShadowCss.prototype._convertColonHost = function (cssText) {
- return this._convertColonRule(cssText, _cssColonHostRe, this._colonHostPartReplacer);
- };
- /*
- * convert a rule like :host-context(.foo) > .bar { }
- *
- * to
- *
- * scopeName.foo > .bar, .foo scopeName > .bar { }
- *
- * and
- *
- * :host-context(.foo:host) .bar { ... }
- *
- * to
- *
- * scopeName.foo .bar { ... }
- */
- ShadowCss.prototype._convertColonHostContext = function (cssText) {
- return this._convertColonRule(cssText, _cssColonHostContextRe, this._colonHostContextPartReplacer);
- };
- ShadowCss.prototype._convertColonRule = function (cssText, regExp, partReplacer) {
- // p1 = :host, p2 = contents of (), p3 rest of rule
- return lang_1.StringWrapper.replaceAllMapped(cssText, regExp, function (m) {
- if (lang_1.isPresent(m[2])) {
- var parts = m[2].split(','), r = [];
- for (var i = 0; i < parts.length; i++) {
- var p = parts[i];
- if (lang_1.isBlank(p))
- break;
- p = p.trim();
- r.push(partReplacer(_polyfillHostNoCombinator, p, m[3]));
- }
- return r.join(',');
- }
- else {
- return _polyfillHostNoCombinator + m[3];
- }
- });
- };
- ShadowCss.prototype._colonHostContextPartReplacer = function (host, part, suffix) {
- if (lang_1.StringWrapper.contains(part, _polyfillHost)) {
- return this._colonHostPartReplacer(host, part, suffix);
- }
- else {
- return host + part + suffix + ', ' + part + ' ' + host + suffix;
- }
- };
- ShadowCss.prototype._colonHostPartReplacer = function (host, part, suffix) {
- return host + lang_1.StringWrapper.replace(part, _polyfillHost, '') + suffix;
- };
- /*
- * Convert combinators like ::shadow and pseudo-elements like ::content
- * by replacing with space.
- */
- ShadowCss.prototype._convertShadowDOMSelectors = function (cssText) {
- for (var i = 0; i < _shadowDOMSelectorsRe.length; i++) {
- cssText = lang_1.StringWrapper.replaceAll(cssText, _shadowDOMSelectorsRe[i], ' ');
- }
- return cssText;
- };
- // change a selector like 'div' to 'name div'
- ShadowCss.prototype._scopeSelectors = function (cssText, scopeSelector, hostSelector) {
- var _this = this;
- return processRules(cssText, function (rule) {
- var selector = rule.selector;
- var content = rule.content;
- if (rule.selector[0] != '@' || rule.selector.startsWith('@page')) {
- selector =
- _this._scopeSelector(rule.selector, scopeSelector, hostSelector, _this.strictStyling);
- }
- else if (rule.selector.startsWith('@media')) {
- content = _this._scopeSelectors(rule.content, scopeSelector, hostSelector);
- }
- return new CssRule(selector, content);
- });
- };
- ShadowCss.prototype._scopeSelector = function (selector, scopeSelector, hostSelector, strict) {
- var r = [], parts = selector.split(',');
- for (var i = 0; i < parts.length; i++) {
- var p = parts[i];
- p = p.trim();
- if (this._selectorNeedsScoping(p, scopeSelector)) {
- p = strict && !lang_1.StringWrapper.contains(p, _polyfillHostNoCombinator) ?
- this._applyStrictSelectorScope(p, scopeSelector) :
- this._applySelectorScope(p, scopeSelector, hostSelector);
- }
- r.push(p);
- }
- return r.join(', ');
- };
- ShadowCss.prototype._selectorNeedsScoping = function (selector, scopeSelector) {
- var re = this._makeScopeMatcher(scopeSelector);
- return !lang_1.isPresent(lang_1.RegExpWrapper.firstMatch(re, selector));
- };
- ShadowCss.prototype._makeScopeMatcher = function (scopeSelector) {
- var lre = /\[/g;
- var rre = /\]/g;
- scopeSelector = lang_1.StringWrapper.replaceAll(scopeSelector, lre, '\\[');
- scopeSelector = lang_1.StringWrapper.replaceAll(scopeSelector, rre, '\\]');
- return lang_1.RegExpWrapper.create('^(' + scopeSelector + ')' + _selectorReSuffix, 'm');
- };
- ShadowCss.prototype._applySelectorScope = function (selector, scopeSelector, hostSelector) {
- // Difference from webcomponentsjs: scopeSelector could not be an array
- return this._applySimpleSelectorScope(selector, scopeSelector, hostSelector);
- };
- // scope via name and [is=name]
- ShadowCss.prototype._applySimpleSelectorScope = function (selector, scopeSelector, hostSelector) {
- if (lang_1.isPresent(lang_1.RegExpWrapper.firstMatch(_polyfillHostRe, selector))) {
- var replaceBy = this.strictStyling ? "[" + hostSelector + "]" : scopeSelector;
- selector = lang_1.StringWrapper.replace(selector, _polyfillHostNoCombinator, replaceBy);
- return lang_1.StringWrapper.replaceAll(selector, _polyfillHostRe, replaceBy + ' ');
- }
- else {
- return scopeSelector + ' ' + selector;
- }
- };
- // return a selector with [name] suffix on each simple selector
- // e.g. .foo.bar > .zot becomes .foo[name].bar[name] > .zot[name] /** @internal */
- ShadowCss.prototype._applyStrictSelectorScope = function (selector, scopeSelector) {
- var isRe = /\[is=([^\]]*)\]/g;
- scopeSelector = lang_1.StringWrapper.replaceAllMapped(scopeSelector, isRe, function (m) { return m[1]; });
- var splits = [' ', '>', '+', '~'], scoped = selector, attrName = '[' + scopeSelector + ']';
- for (var i = 0; i < splits.length; i++) {
- var sep = splits[i];
- var parts = scoped.split(sep);
- scoped = parts.map(function (p) {
- // remove :host since it should be unnecessary
- var t = lang_1.StringWrapper.replaceAll(p.trim(), _polyfillHostRe, '');
- if (t.length > 0 && !collection_1.ListWrapper.contains(splits, t) &&
- !lang_1.StringWrapper.contains(t, attrName)) {
- var re = /([^:]*)(:*)(.*)/g;
- var m = lang_1.RegExpWrapper.firstMatch(re, t);
- if (lang_1.isPresent(m)) {
- p = m[1] + attrName + m[2] + m[3];
- }
- }
- return p;
- })
- .join(sep);
- }
- return scoped;
- };
- ShadowCss.prototype._insertPolyfillHostInCssText = function (selector) {
- selector = lang_1.StringWrapper.replaceAll(selector, _colonHostContextRe, _polyfillHostContext);
- selector = lang_1.StringWrapper.replaceAll(selector, _colonHostRe, _polyfillHost);
- return selector;
- };
- return ShadowCss;
- })();
- exports.ShadowCss = ShadowCss;
- var _cssContentNextSelectorRe = /polyfill-next-selector[^}]*content:[\s]*?['"](.*?)['"][;\s]*}([^{]*?){/gim;
- var _cssContentRuleRe = /(polyfill-rule)[^}]*(content:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim;
- var _cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim;
- var _polyfillHost = '-shadowcsshost';
- // note: :host-context pre-processed to -shadowcsshostcontext.
- var _polyfillHostContext = '-shadowcsscontext';
- var _parenSuffix = ')(?:\\((' +
- '(?:\\([^)(]*\\)|[^)(]*)+?' +
- ')\\))?([^,{]*)';
- var _cssColonHostRe = lang_1.RegExpWrapper.create('(' + _polyfillHost + _parenSuffix, 'im');
- var _cssColonHostContextRe = lang_1.RegExpWrapper.create('(' + _polyfillHostContext + _parenSuffix, 'im');
- var _polyfillHostNoCombinator = _polyfillHost + '-no-combinator';
- var _shadowDOMSelectorsRe = [
- />>>/g,
- /::shadow/g,
- /::content/g,
- // Deprecated selectors
- // TODO(vicb): see https://github.com/angular/clang-format/issues/16
- // clang-format off
- /\/deep\//g,
- /\/shadow-deep\//g,
- /\/shadow\//g,
- ];
- var _selectorReSuffix = '([>\\s~+\[.,{:][\\s\\S]*)?$';
- var _polyfillHostRe = lang_1.RegExpWrapper.create(_polyfillHost, 'im');
- var _colonHostRe = /:host/gim;
- var _colonHostContextRe = /:host-context/gim;
- var _commentRe = /\/\*[\s\S]*?\*\//g;
- function stripComments(input) {
- return lang_1.StringWrapper.replaceAllMapped(input, _commentRe, function (_) { return ''; });
- }
- var _ruleRe = /(\s*)([^;\{\}]+?)(\s*)((?:{%BLOCK%}?\s*;?)|(?:\s*;))/g;
- var _curlyRe = /([{}])/g;
- var OPEN_CURLY = '{';
- var CLOSE_CURLY = '}';
- var BLOCK_PLACEHOLDER = '%BLOCK%';
- var CssRule = (function () {
- function CssRule(selector, content) {
- this.selector = selector;
- this.content = content;
- }
- return CssRule;
- })();
- exports.CssRule = CssRule;
- function processRules(input, ruleCallback) {
- var inputWithEscapedBlocks = escapeBlocks(input);
- var nextBlockIndex = 0;
- return lang_1.StringWrapper.replaceAllMapped(inputWithEscapedBlocks.escapedString, _ruleRe, function (m) {
- var selector = m[2];
- var content = '';
- var suffix = m[4];
- var contentPrefix = '';
- if (lang_1.isPresent(m[4]) && m[4].startsWith('{' + BLOCK_PLACEHOLDER)) {
- content = inputWithEscapedBlocks.blocks[nextBlockIndex++];
- suffix = m[4].substring(BLOCK_PLACEHOLDER.length + 1);
- contentPrefix = '{';
- }
- var rule = ruleCallback(new CssRule(selector, content));
- return "" + m[1] + rule.selector + m[3] + contentPrefix + rule.content + suffix;
- });
- }
- exports.processRules = processRules;
- var StringWithEscapedBlocks = (function () {
- function StringWithEscapedBlocks(escapedString, blocks) {
- this.escapedString = escapedString;
- this.blocks = blocks;
- }
- return StringWithEscapedBlocks;
- })();
- function escapeBlocks(input) {
- var inputParts = lang_1.StringWrapper.split(input, _curlyRe);
- var resultParts = [];
- var escapedBlocks = [];
- var bracketCount = 0;
- var currentBlockParts = [];
- for (var partIndex = 0; partIndex < inputParts.length; partIndex++) {
- var part = inputParts[partIndex];
- if (part == CLOSE_CURLY) {
- bracketCount--;
- }
- if (bracketCount > 0) {
- currentBlockParts.push(part);
- }
- else {
- if (currentBlockParts.length > 0) {
- escapedBlocks.push(currentBlockParts.join(''));
- resultParts.push(BLOCK_PLACEHOLDER);
- currentBlockParts = [];
- }
- resultParts.push(part);
- }
- if (part == OPEN_CURLY) {
- bracketCount++;
- }
- }
- if (currentBlockParts.length > 0) {
- escapedBlocks.push(currentBlockParts.join(''));
- resultParts.push(BLOCK_PLACEHOLDER);
- }
- return new StringWithEscapedBlocks(resultParts.join(''), escapedBlocks);
- }
- /***/ },
- /* 163 */
- /***/ function(module, exports, __webpack_require__) {
- // Some of the code comes from WebComponents.JS
- // https://github.com/webcomponents/webcomponentsjs/blob/master/src/HTMLImports/path.js
- var lang_1 = __webpack_require__(5);
- var StyleWithImports = (function () {
- function StyleWithImports(style, styleUrls) {
- this.style = style;
- this.styleUrls = styleUrls;
- }
- return StyleWithImports;
- })();
- exports.StyleWithImports = StyleWithImports;
- function isStyleUrlResolvable(url) {
- if (lang_1.isBlank(url) || url.length === 0 || url[0] == '/')
- return false;
- var schemeMatch = lang_1.RegExpWrapper.firstMatch(_urlWithSchemaRe, url);
- return lang_1.isBlank(schemeMatch) || schemeMatch[1] == 'package' || schemeMatch[1] == 'asset';
- }
- exports.isStyleUrlResolvable = isStyleUrlResolvable;
- /**
- * Rewrites stylesheets by resolving and removing the @import urls that
- * are either relative or don't have a `package:` scheme
- */
- function extractStyleUrls(resolver, baseUrl, cssText) {
- var foundUrls = [];
- var modifiedCssText = lang_1.StringWrapper.replaceAllMapped(cssText, _cssImportRe, function (m) {
- var url = lang_1.isPresent(m[1]) ? m[1] : m[2];
- if (!isStyleUrlResolvable(url)) {
- // Do not attempt to resolve non-package absolute URLs with URI scheme
- return m[0];
- }
- foundUrls.push(resolver.resolve(baseUrl, url));
- return '';
- });
- return new StyleWithImports(modifiedCssText, foundUrls);
- }
- exports.extractStyleUrls = extractStyleUrls;
- var _cssImportRe = /@import\s+(?:url\()?\s*(?:(?:['"]([^'"]*))|([^;\)\s]*))[^;]*;?/g;
- // TODO: can't use /^[^:/?#.]+:/g due to clang-format bug:
- // https://github.com/angular/angular/issues/4596
- var _urlWithSchemaRe = /^([a-zA-Z\-\+\.]+):/g;
- /***/ },
- /* 164 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var view_1 = __webpack_require__(165);
- var metadata_1 = __webpack_require__(3);
- var collection_1 = __webpack_require__(12);
- function encapsulateStyles(componentTemplate) {
- var processedStyles = componentTemplate.styles;
- if (componentTemplate.encapsulation === metadata_1.ViewEncapsulation.Emulated) {
- processedStyles = collection_1.ListWrapper.createFixedSize(componentTemplate.styles.length);
- for (var i = 0; i < componentTemplate.styles.length; i++) {
- processedStyles[i] = lang_1.StringWrapper.replaceAll(componentTemplate.styles[i], COMPONENT_REGEX, componentTemplate.shortId);
- }
- }
- return processedStyles;
- }
- exports.encapsulateStyles = encapsulateStyles;
- function createRenderView(componentTemplate, cmds, inplaceElement, nodeFactory) {
- var view;
- var eventDispatcher = function (boundElementIndex, eventName, event) {
- return view.dispatchRenderEvent(boundElementIndex, eventName, event);
- };
- var context = new BuildContext(eventDispatcher, nodeFactory, inplaceElement);
- context.build(componentTemplate, cmds);
- var fragments = [];
- for (var i = 0; i < context.fragments.length; i++) {
- fragments.push(new view_1.DefaultRenderFragmentRef(context.fragments[i]));
- }
- view = new view_1.DefaultRenderView(fragments, context.boundTextNodes, context.boundElements, context.nativeShadowRoots, context.globalEventAdders, context.rootContentInsertionPoints);
- return view;
- }
- exports.createRenderView = createRenderView;
- var BuildContext = (function () {
- function BuildContext(_eventDispatcher, factory, _inplaceElement) {
- this._eventDispatcher = _eventDispatcher;
- this.factory = factory;
- this._inplaceElement = _inplaceElement;
- this._builders = [];
- this.globalEventAdders = [];
- this.boundElements = [];
- this.boundTextNodes = [];
- this.nativeShadowRoots = [];
- this.fragments = [];
- this.rootContentInsertionPoints = [];
- this.componentCount = 0;
- this.isHost = lang_1.isPresent((_inplaceElement));
- }
- BuildContext.prototype.build = function (template, cmds) {
- this.enqueueRootBuilder(template, cmds);
- this._build(this._builders[0]);
- };
- BuildContext.prototype._build = function (builder) {
- this._builders = [];
- builder.build(this);
- var enqueuedBuilders = this._builders;
- for (var i = 0; i < enqueuedBuilders.length; i++) {
- this._build(enqueuedBuilders[i]);
- }
- };
- BuildContext.prototype.enqueueComponentBuilder = function (component) {
- this.componentCount++;
- this._builders.push(new RenderViewBuilder(component, null, component.template, component.template.commands));
- };
- BuildContext.prototype.enqueueFragmentBuilder = function (parentComponent, parentTemplate, commands) {
- var rootNodes = [];
- this.fragments.push(rootNodes);
- this._builders.push(new RenderViewBuilder(parentComponent, rootNodes, parentTemplate, commands));
- };
- BuildContext.prototype.enqueueRootBuilder = function (template, cmds) {
- var rootNodes = [];
- this.fragments.push(rootNodes);
- this._builders.push(new RenderViewBuilder(null, rootNodes, template, cmds));
- };
- BuildContext.prototype.consumeInplaceElement = function () {
- var result = this._inplaceElement;
- this._inplaceElement = null;
- return result;
- };
- BuildContext.prototype.addEventListener = function (boundElementIndex, target, eventName) {
- if (lang_1.isPresent(target)) {
- var handler = createEventHandler(boundElementIndex, target + ":" + eventName, this._eventDispatcher);
- this.globalEventAdders.push(createGlobalEventAdder(target, eventName, handler, this.factory));
- }
- else {
- var handler = createEventHandler(boundElementIndex, eventName, this._eventDispatcher);
- this.factory.on(this.boundElements[boundElementIndex], eventName, handler);
- }
- };
- return BuildContext;
- })();
- function createEventHandler(boundElementIndex, eventName, eventDispatcher) {
- return function ($event) { return eventDispatcher(boundElementIndex, eventName, $event); };
- }
- function createGlobalEventAdder(target, eventName, eventHandler, nodeFactory) {
- return function () { return nodeFactory.globalOn(target, eventName, eventHandler); };
- }
- var RenderViewBuilder = (function () {
- function RenderViewBuilder(parentComponent, fragmentRootNodes, template, cmds) {
- this.parentComponent = parentComponent;
- this.fragmentRootNodes = fragmentRootNodes;
- this.template = template;
- this.cmds = cmds;
- var rootNodesParent = lang_1.isPresent(fragmentRootNodes) ? null : parentComponent.shadowRoot;
- this.parentStack = [rootNodesParent];
- }
- RenderViewBuilder.prototype.build = function (context) {
- var cmds = this.cmds;
- for (var i = 0; i < cmds.length; i++) {
- cmds[i].visit(this, context);
- }
- };
- Object.defineProperty(RenderViewBuilder.prototype, "parent", {
- get: function () { return this.parentStack[this.parentStack.length - 1]; },
- enumerable: true,
- configurable: true
- });
- RenderViewBuilder.prototype.visitText = function (cmd, context) {
- var text = context.factory.createText(cmd.value);
- this._addChild(text, cmd.ngContentIndex, context);
- if (cmd.isBound) {
- context.boundTextNodes.push(text);
- }
- return null;
- };
- RenderViewBuilder.prototype.visitNgContent = function (cmd, context) {
- if (lang_1.isPresent(this.parentComponent)) {
- if (this.parentComponent.isRoot) {
- var insertionPoint = context.factory.createRootContentInsertionPoint();
- if (this.parent instanceof Component) {
- context.factory.appendChild(this.parent.shadowRoot, insertionPoint);
- }
- else {
- context.factory.appendChild(this.parent, insertionPoint);
- }
- context.rootContentInsertionPoints.push(insertionPoint);
- }
- else {
- var projectedNodes = this.parentComponent.project(cmd.index);
- for (var i = 0; i < projectedNodes.length; i++) {
- var node = projectedNodes[i];
- this._addChild(node, cmd.ngContentIndex, context);
- }
- }
- }
- return null;
- };
- RenderViewBuilder.prototype.visitBeginElement = function (cmd, context) {
- this.parentStack.push(this._beginElement(cmd, context, null));
- return null;
- };
- RenderViewBuilder.prototype.visitEndElement = function (context) {
- this._endElement();
- return null;
- };
- RenderViewBuilder.prototype.visitBeginComponent = function (cmd, context) {
- var templateId = cmd.templateId;
- var tpl = context.factory.resolveComponentTemplate(templateId);
- var el = this._beginElement(cmd, context, tpl);
- var root = el;
- if (tpl.encapsulation === metadata_1.ViewEncapsulation.Native) {
- root = context.factory.createShadowRoot(el, templateId);
- context.nativeShadowRoots.push(root);
- }
- var isRoot = context.componentCount === 0 && context.isHost;
- var component = new Component(el, root, isRoot, tpl);
- context.enqueueComponentBuilder(component);
- this.parentStack.push(component);
- return null;
- };
- RenderViewBuilder.prototype.visitEndComponent = function (context) {
- this._endElement();
- return null;
- };
- RenderViewBuilder.prototype.visitEmbeddedTemplate = function (cmd, context) {
- var el = context.factory.createTemplateAnchor(cmd.attrNameAndValues);
- this._addChild(el, cmd.ngContentIndex, context);
- context.boundElements.push(el);
- if (cmd.isMerged) {
- context.enqueueFragmentBuilder(this.parentComponent, this.template, cmd.children);
- }
- return null;
- };
- RenderViewBuilder.prototype._beginElement = function (cmd, context, componentTemplate) {
- var el = context.consumeInplaceElement();
- var attrNameAndValues = cmd.attrNameAndValues;
- var templateEmulatedEncapsulation = this.template.encapsulation === metadata_1.ViewEncapsulation.Emulated;
- var componentEmulatedEncapsulation = lang_1.isPresent(componentTemplate) &&
- componentTemplate.encapsulation === metadata_1.ViewEncapsulation.Emulated;
- var newAttrLength = attrNameAndValues.length + (templateEmulatedEncapsulation ? 2 : 0) +
- (componentEmulatedEncapsulation ? 2 : 0);
- if (newAttrLength > attrNameAndValues.length) {
- // Note: Need to clone attrNameAndValues to make it writable!
- var newAttrNameAndValues = collection_1.ListWrapper.createFixedSize(newAttrLength);
- var attrIndex;
- for (attrIndex = 0; attrIndex < attrNameAndValues.length; attrIndex++) {
- newAttrNameAndValues[attrIndex] = attrNameAndValues[attrIndex];
- }
- if (templateEmulatedEncapsulation) {
- newAttrNameAndValues[attrIndex++] = _shimContentAttribute(this.template.shortId);
- newAttrNameAndValues[attrIndex++] = '';
- }
- if (componentEmulatedEncapsulation) {
- newAttrNameAndValues[attrIndex++] = _shimHostAttribute(componentTemplate.shortId);
- newAttrNameAndValues[attrIndex++] = '';
- }
- attrNameAndValues = newAttrNameAndValues;
- }
- if (lang_1.isPresent(el)) {
- context.factory.mergeElement(el, attrNameAndValues);
- this.fragmentRootNodes.push(el);
- }
- else {
- el = context.factory.createElement(cmd.name, attrNameAndValues);
- this._addChild(el, cmd.ngContentIndex, context);
- }
- if (cmd.isBound) {
- var boundElementIndex = context.boundElements.length;
- context.boundElements.push(el);
- for (var i = 0; i < cmd.eventTargetAndNames.length; i += 2) {
- var target = cmd.eventTargetAndNames[i];
- var eventName = cmd.eventTargetAndNames[i + 1];
- context.addEventListener(boundElementIndex, target, eventName);
- }
- }
- return el;
- };
- RenderViewBuilder.prototype._endElement = function () { this.parentStack.pop(); };
- RenderViewBuilder.prototype._addChild = function (node, ngContentIndex, context) {
- var parent = this.parent;
- if (lang_1.isPresent(parent)) {
- if (parent instanceof Component) {
- parent.addContentNode(ngContentIndex, node, context);
- }
- else {
- context.factory.appendChild(parent, node);
- }
- }
- else {
- this.fragmentRootNodes.push(node);
- }
- };
- return RenderViewBuilder;
- })();
- var Component = (function () {
- function Component(hostElement, shadowRoot, isRoot, template) {
- this.hostElement = hostElement;
- this.shadowRoot = shadowRoot;
- this.isRoot = isRoot;
- this.template = template;
- this.contentNodesByNgContentIndex = [];
- }
- Component.prototype.addContentNode = function (ngContentIndex, node, context) {
- if (lang_1.isBlank(ngContentIndex)) {
- if (this.template.encapsulation === metadata_1.ViewEncapsulation.Native) {
- context.factory.appendChild(this.hostElement, node);
- }
- }
- else {
- while (this.contentNodesByNgContentIndex.length <= ngContentIndex) {
- this.contentNodesByNgContentIndex.push([]);
- }
- this.contentNodesByNgContentIndex[ngContentIndex].push(node);
- }
- };
- Component.prototype.project = function (ngContentIndex) {
- return ngContentIndex < this.contentNodesByNgContentIndex.length ?
- this.contentNodesByNgContentIndex[ngContentIndex] :
- [];
- };
- return Component;
- })();
- var COMPONENT_REGEX = /%COMP%/g;
- exports.COMPONENT_VARIABLE = '%COMP%';
- exports.HOST_ATTR = "_nghost-" + exports.COMPONENT_VARIABLE;
- exports.CONTENT_ATTR = "_ngcontent-" + exports.COMPONENT_VARIABLE;
- function _shimContentAttribute(componentShortId) {
- return lang_1.StringWrapper.replaceAll(exports.CONTENT_ATTR, COMPONENT_REGEX, componentShortId);
- }
- function _shimHostAttribute(componentShortId) {
- return lang_1.StringWrapper.replaceAll(exports.HOST_ATTR, COMPONENT_REGEX, componentShortId);
- }
- /***/ },
- /* 165 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var exceptions_1 = __webpack_require__(14);
- var collection_1 = __webpack_require__(12);
- var lang_1 = __webpack_require__(5);
- var api_1 = __webpack_require__(72);
- var DefaultProtoViewRef = (function (_super) {
- __extends(DefaultProtoViewRef, _super);
- function DefaultProtoViewRef(template, cmds) {
- _super.call(this);
- this.template = template;
- this.cmds = cmds;
- }
- return DefaultProtoViewRef;
- })(api_1.RenderProtoViewRef);
- exports.DefaultProtoViewRef = DefaultProtoViewRef;
- var DefaultRenderFragmentRef = (function (_super) {
- __extends(DefaultRenderFragmentRef, _super);
- function DefaultRenderFragmentRef(nodes) {
- _super.call(this);
- this.nodes = nodes;
- }
- return DefaultRenderFragmentRef;
- })(api_1.RenderFragmentRef);
- exports.DefaultRenderFragmentRef = DefaultRenderFragmentRef;
- var DefaultRenderView = (function (_super) {
- __extends(DefaultRenderView, _super);
- function DefaultRenderView(fragments, boundTextNodes, boundElements, nativeShadowRoots, globalEventAdders, rootContentInsertionPoints) {
- _super.call(this);
- this.fragments = fragments;
- this.boundTextNodes = boundTextNodes;
- this.boundElements = boundElements;
- this.nativeShadowRoots = nativeShadowRoots;
- this.globalEventAdders = globalEventAdders;
- this.rootContentInsertionPoints = rootContentInsertionPoints;
- this.hydrated = false;
- this.eventDispatcher = null;
- this.globalEventRemovers = null;
- }
- DefaultRenderView.prototype.hydrate = function () {
- if (this.hydrated)
- throw new exceptions_1.BaseException('The view is already hydrated.');
- this.hydrated = true;
- this.globalEventRemovers = collection_1.ListWrapper.createFixedSize(this.globalEventAdders.length);
- for (var i = 0; i < this.globalEventAdders.length; i++) {
- this.globalEventRemovers[i] = this.globalEventAdders[i]();
- }
- };
- DefaultRenderView.prototype.dehydrate = function () {
- if (!this.hydrated)
- throw new exceptions_1.BaseException('The view is already dehydrated.');
- for (var i = 0; i < this.globalEventRemovers.length; i++) {
- this.globalEventRemovers[i]();
- }
- this.globalEventRemovers = null;
- this.hydrated = false;
- };
- DefaultRenderView.prototype.setEventDispatcher = function (dispatcher) { this.eventDispatcher = dispatcher; };
- DefaultRenderView.prototype.dispatchRenderEvent = function (boundElementIndex, eventName, event) {
- var allowDefaultBehavior = true;
- if (lang_1.isPresent(this.eventDispatcher)) {
- var locals = new collection_1.Map();
- locals.set('$event', event);
- allowDefaultBehavior =
- this.eventDispatcher.dispatchRenderEvent(boundElementIndex, eventName, locals);
- }
- return allowDefaultBehavior;
- };
- return DefaultRenderView;
- })(api_1.RenderViewRef);
- exports.DefaultRenderView = DefaultRenderView;
- /***/ },
- /* 166 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var lang_1 = __webpack_require__(5);
- var collection_1 = __webpack_require__(12);
- var template_commands_1 = __webpack_require__(96);
- var template_ast_1 = __webpack_require__(159);
- var source_module_1 = __webpack_require__(156);
- var util_1 = __webpack_require__(155);
- var di_1 = __webpack_require__(6);
- exports.TEMPLATE_COMMANDS_MODULE_REF = source_module_1.moduleRef("package:angular2/src/core/linker/template_commands" + util_1.MODULE_SUFFIX);
- var IMPLICIT_TEMPLATE_VAR = '\$implicit';
- var CLASS_ATTR = 'class';
- var STYLE_ATTR = 'style';
- var CommandCompiler = (function () {
- function CommandCompiler() {
- }
- CommandCompiler.prototype.compileComponentRuntime = function (component, template, changeDetectorFactories, componentTemplateFactory) {
- var visitor = new CommandBuilderVisitor(new RuntimeCommandFactory(component, componentTemplateFactory, changeDetectorFactories), 0);
- template_ast_1.templateVisitAll(visitor, template);
- return visitor.result;
- };
- CommandCompiler.prototype.compileComponentCodeGen = function (component, template, changeDetectorFactoryExpressions, componentTemplateFactory) {
- var visitor = new CommandBuilderVisitor(new CodegenCommandFactory(component, componentTemplateFactory, changeDetectorFactoryExpressions), 0);
- template_ast_1.templateVisitAll(visitor, template);
- return new source_module_1.SourceExpression([], codeGenArray(visitor.result));
- };
- CommandCompiler = __decorate([
- di_1.Injectable(),
- __metadata('design:paramtypes', [])
- ], CommandCompiler);
- return CommandCompiler;
- })();
- exports.CommandCompiler = CommandCompiler;
- var RuntimeCommandFactory = (function () {
- function RuntimeCommandFactory(component, componentTemplateFactory, changeDetectorFactories) {
- this.component = component;
- this.componentTemplateFactory = componentTemplateFactory;
- this.changeDetectorFactories = changeDetectorFactories;
- }
- RuntimeCommandFactory.prototype._mapDirectives = function (directives) {
- return directives.map(function (directive) { return directive.type.runtime; });
- };
- RuntimeCommandFactory.prototype.createText = function (value, isBound, ngContentIndex) {
- return new template_commands_1.TextCmd(value, isBound, ngContentIndex);
- };
- RuntimeCommandFactory.prototype.createNgContent = function (index, ngContentIndex) {
- return new template_commands_1.NgContentCmd(index, ngContentIndex);
- };
- RuntimeCommandFactory.prototype.createBeginElement = function (name, attrNameAndValues, eventTargetAndNames, variableNameAndValues, directives, isBound, ngContentIndex) {
- return new template_commands_1.BeginElementCmd(name, attrNameAndValues, eventTargetAndNames, variableNameAndValues, this._mapDirectives(directives), isBound, ngContentIndex);
- };
- RuntimeCommandFactory.prototype.createEndElement = function () { return new template_commands_1.EndElementCmd(); };
- RuntimeCommandFactory.prototype.createBeginComponent = function (name, attrNameAndValues, eventTargetAndNames, variableNameAndValues, directives, encapsulation, ngContentIndex) {
- var nestedTemplateAccessor = this.componentTemplateFactory(directives[0]);
- return new template_commands_1.BeginComponentCmd(name, attrNameAndValues, eventTargetAndNames, variableNameAndValues, this._mapDirectives(directives), encapsulation, ngContentIndex, nestedTemplateAccessor);
- };
- RuntimeCommandFactory.prototype.createEndComponent = function () { return new template_commands_1.EndComponentCmd(); };
- RuntimeCommandFactory.prototype.createEmbeddedTemplate = function (embeddedTemplateIndex, attrNameAndValues, variableNameAndValues, directives, isMerged, ngContentIndex, children) {
- return new template_commands_1.EmbeddedTemplateCmd(attrNameAndValues, variableNameAndValues, this._mapDirectives(directives), isMerged, ngContentIndex, this.changeDetectorFactories[embeddedTemplateIndex], children);
- };
- return RuntimeCommandFactory;
- })();
- var CodegenCommandFactory = (function () {
- function CodegenCommandFactory(component, componentTemplateFactory, changeDetectorFactoryExpressions) {
- this.component = component;
- this.componentTemplateFactory = componentTemplateFactory;
- this.changeDetectorFactoryExpressions = changeDetectorFactoryExpressions;
- }
- CodegenCommandFactory.prototype.createText = function (value, isBound, ngContentIndex) {
- return new Expression(util_1.codeGenConstConstructorCall(exports.TEMPLATE_COMMANDS_MODULE_REF + 'TextCmd') + "(" + util_1.escapeSingleQuoteString(value) + ", " + isBound + ", " + ngContentIndex + ")");
- };
- CodegenCommandFactory.prototype.createNgContent = function (index, ngContentIndex) {
- return new Expression(util_1.codeGenConstConstructorCall(exports.TEMPLATE_COMMANDS_MODULE_REF + 'NgContentCmd') + "(" + index + ", " + ngContentIndex + ")");
- };
- CodegenCommandFactory.prototype.createBeginElement = function (name, attrNameAndValues, eventTargetAndNames, variableNameAndValues, directives, isBound, ngContentIndex) {
- var attrsExpression = codeGenArray(attrNameAndValues);
- return new Expression((util_1.codeGenConstConstructorCall(exports.TEMPLATE_COMMANDS_MODULE_REF + 'BeginElementCmd') + "(" + util_1.escapeSingleQuoteString(name) + ", " + attrsExpression + ", ") +
- (codeGenArray(eventTargetAndNames) + ", " + codeGenArray(variableNameAndValues) + ", " + codeGenDirectivesArray(directives) + ", " + isBound + ", " + ngContentIndex + ")"));
- };
- CodegenCommandFactory.prototype.createEndElement = function () {
- return new Expression(util_1.codeGenConstConstructorCall(exports.TEMPLATE_COMMANDS_MODULE_REF + 'EndElementCmd') + "()");
- };
- CodegenCommandFactory.prototype.createBeginComponent = function (name, attrNameAndValues, eventTargetAndNames, variableNameAndValues, directives, encapsulation, ngContentIndex) {
- var attrsExpression = codeGenArray(attrNameAndValues);
- return new Expression((util_1.codeGenConstConstructorCall(exports.TEMPLATE_COMMANDS_MODULE_REF + 'BeginComponentCmd') + "(" + util_1.escapeSingleQuoteString(name) + ", " + attrsExpression + ", ") +
- (codeGenArray(eventTargetAndNames) + ", " + codeGenArray(variableNameAndValues) + ", " + codeGenDirectivesArray(directives) + ", " + codeGenViewEncapsulation(encapsulation) + ", " + ngContentIndex + ", " + this.componentTemplateFactory(directives[0]) + ")"));
- };
- CodegenCommandFactory.prototype.createEndComponent = function () {
- return new Expression(util_1.codeGenConstConstructorCall(exports.TEMPLATE_COMMANDS_MODULE_REF + 'EndComponentCmd') + "()");
- };
- CodegenCommandFactory.prototype.createEmbeddedTemplate = function (embeddedTemplateIndex, attrNameAndValues, variableNameAndValues, directives, isMerged, ngContentIndex, children) {
- return new Expression((util_1.codeGenConstConstructorCall(exports.TEMPLATE_COMMANDS_MODULE_REF + 'EmbeddedTemplateCmd') + "(" + codeGenArray(attrNameAndValues) + ", " + codeGenArray(variableNameAndValues) + ", ") +
- (codeGenDirectivesArray(directives) + ", " + isMerged + ", " + ngContentIndex + ", " + this.changeDetectorFactoryExpressions[embeddedTemplateIndex] + ", " + codeGenArray(children) + ")"));
- };
- return CodegenCommandFactory;
- })();
- function visitAndReturnContext(visitor, asts, context) {
- template_ast_1.templateVisitAll(visitor, asts, context);
- return context;
- }
- var CommandBuilderVisitor = (function () {
- function CommandBuilderVisitor(commandFactory, embeddedTemplateIndex) {
- this.commandFactory = commandFactory;
- this.embeddedTemplateIndex = embeddedTemplateIndex;
- this.result = [];
- this.transitiveNgContentCount = 0;
- }
- CommandBuilderVisitor.prototype._readAttrNameAndValues = function (directives, attrAsts) {
- var attrs = keyValueArrayToMap(visitAndReturnContext(this, attrAsts, []));
- directives.forEach(function (directiveMeta) {
- collection_1.StringMapWrapper.forEach(directiveMeta.hostAttributes, function (value, name) {
- var prevValue = attrs[name];
- attrs[name] = lang_1.isPresent(prevValue) ? mergeAttributeValue(name, prevValue, value) : value;
- });
- });
- return mapToKeyValueArray(attrs);
- };
- CommandBuilderVisitor.prototype.visitNgContent = function (ast, context) {
- this.transitiveNgContentCount++;
- this.result.push(this.commandFactory.createNgContent(ast.index, ast.ngContentIndex));
- return null;
- };
- CommandBuilderVisitor.prototype.visitEmbeddedTemplate = function (ast, context) {
- var _this = this;
- this.embeddedTemplateIndex++;
- var childVisitor = new CommandBuilderVisitor(this.commandFactory, this.embeddedTemplateIndex);
- template_ast_1.templateVisitAll(childVisitor, ast.children);
- var isMerged = childVisitor.transitiveNgContentCount > 0;
- var variableNameAndValues = [];
- ast.vars.forEach(function (varAst) {
- variableNameAndValues.push(varAst.name);
- variableNameAndValues.push(varAst.value.length > 0 ? varAst.value : IMPLICIT_TEMPLATE_VAR);
- });
- var directives = [];
- collection_1.ListWrapper.forEachWithIndex(ast.directives, function (directiveAst, index) {
- directiveAst.visit(_this, new DirectiveContext(index, [], [], directives));
- });
- this.result.push(this.commandFactory.createEmbeddedTemplate(this.embeddedTemplateIndex, this._readAttrNameAndValues(directives, ast.attrs), variableNameAndValues, directives, isMerged, ast.ngContentIndex, childVisitor.result));
- this.transitiveNgContentCount += childVisitor.transitiveNgContentCount;
- this.embeddedTemplateIndex = childVisitor.embeddedTemplateIndex;
- return null;
- };
- CommandBuilderVisitor.prototype.visitElement = function (ast, context) {
- var _this = this;
- var component = ast.getComponent();
- var eventTargetAndNames = visitAndReturnContext(this, ast.outputs, []);
- var variableNameAndValues = [];
- if (lang_1.isBlank(component)) {
- ast.exportAsVars.forEach(function (varAst) {
- variableNameAndValues.push(varAst.name);
- variableNameAndValues.push(null);
- });
- }
- var directives = [];
- collection_1.ListWrapper.forEachWithIndex(ast.directives, function (directiveAst, index) {
- directiveAst.visit(_this, new DirectiveContext(index, eventTargetAndNames, variableNameAndValues, directives));
- });
- eventTargetAndNames = removeKeyValueArrayDuplicates(eventTargetAndNames);
- var attrNameAndValues = this._readAttrNameAndValues(directives, ast.attrs);
- if (lang_1.isPresent(component)) {
- this.result.push(this.commandFactory.createBeginComponent(ast.name, attrNameAndValues, eventTargetAndNames, variableNameAndValues, directives, component.template.encapsulation, ast.ngContentIndex));
- template_ast_1.templateVisitAll(this, ast.children);
- this.result.push(this.commandFactory.createEndComponent());
- }
- else {
- this.result.push(this.commandFactory.createBeginElement(ast.name, attrNameAndValues, eventTargetAndNames, variableNameAndValues, directives, ast.isBound(), ast.ngContentIndex));
- template_ast_1.templateVisitAll(this, ast.children);
- this.result.push(this.commandFactory.createEndElement());
- }
- return null;
- };
- CommandBuilderVisitor.prototype.visitVariable = function (ast, ctx) { return null; };
- CommandBuilderVisitor.prototype.visitAttr = function (ast, attrNameAndValues) {
- attrNameAndValues.push(ast.name);
- attrNameAndValues.push(ast.value);
- return null;
- };
- CommandBuilderVisitor.prototype.visitBoundText = function (ast, context) {
- this.result.push(this.commandFactory.createText(null, true, ast.ngContentIndex));
- return null;
- };
- CommandBuilderVisitor.prototype.visitText = function (ast, context) {
- this.result.push(this.commandFactory.createText(ast.value, false, ast.ngContentIndex));
- return null;
- };
- CommandBuilderVisitor.prototype.visitDirective = function (ast, ctx) {
- ctx.targetDirectives.push(ast.directive);
- template_ast_1.templateVisitAll(this, ast.hostEvents, ctx.eventTargetAndNames);
- ast.exportAsVars.forEach(function (varAst) {
- ctx.targetVariableNameAndValues.push(varAst.name);
- ctx.targetVariableNameAndValues.push(ctx.index);
- });
- return null;
- };
- CommandBuilderVisitor.prototype.visitEvent = function (ast, eventTargetAndNames) {
- eventTargetAndNames.push(ast.target);
- eventTargetAndNames.push(ast.name);
- return null;
- };
- CommandBuilderVisitor.prototype.visitDirectiveProperty = function (ast, context) { return null; };
- CommandBuilderVisitor.prototype.visitElementProperty = function (ast, context) { return null; };
- return CommandBuilderVisitor;
- })();
- function removeKeyValueArrayDuplicates(keyValueArray) {
- var knownPairs = new Set();
- var resultKeyValueArray = [];
- for (var i = 0; i < keyValueArray.length; i += 2) {
- var key = keyValueArray[i];
- var value = keyValueArray[i + 1];
- var pairId = key + ":" + value;
- if (!collection_1.SetWrapper.has(knownPairs, pairId)) {
- resultKeyValueArray.push(key);
- resultKeyValueArray.push(value);
- knownPairs.add(pairId);
- }
- }
- return resultKeyValueArray;
- }
- function keyValueArrayToMap(keyValueArr) {
- var data = {};
- for (var i = 0; i < keyValueArr.length; i += 2) {
- data[keyValueArr[i]] = keyValueArr[i + 1];
- }
- return data;
- }
- function mapToKeyValueArray(data) {
- var entryArray = [];
- collection_1.StringMapWrapper.forEach(data, function (value, name) { entryArray.push([name, value]); });
- // We need to sort to get a defined output order
- // for tests and for caching generated artifacts...
- collection_1.ListWrapper.sort(entryArray, function (entry1, entry2) { return lang_1.StringWrapper.compare(entry1[0], entry2[0]); });
- var keyValueArray = [];
- entryArray.forEach(function (entry) {
- keyValueArray.push(entry[0]);
- keyValueArray.push(entry[1]);
- });
- return keyValueArray;
- }
- function mergeAttributeValue(attrName, attrValue1, attrValue2) {
- if (attrName == CLASS_ATTR || attrName == STYLE_ATTR) {
- return attrValue1 + " " + attrValue2;
- }
- else {
- return attrValue2;
- }
- }
- var DirectiveContext = (function () {
- function DirectiveContext(index, eventTargetAndNames, targetVariableNameAndValues, targetDirectives) {
- this.index = index;
- this.eventTargetAndNames = eventTargetAndNames;
- this.targetVariableNameAndValues = targetVariableNameAndValues;
- this.targetDirectives = targetDirectives;
- }
- return DirectiveContext;
- })();
- var Expression = (function () {
- function Expression(value) {
- this.value = value;
- }
- return Expression;
- })();
- function escapeValue(value) {
- if (value instanceof Expression) {
- return value.value;
- }
- else if (lang_1.isString(value)) {
- return util_1.escapeSingleQuoteString(value);
- }
- else if (lang_1.isBlank(value)) {
- return 'null';
- }
- else {
- return "" + value;
- }
- }
- function codeGenArray(data) {
- var base = "[" + data.map(escapeValue).join(',') + "]";
- return lang_1.IS_DART ? "const " + base : base;
- }
- function codeGenDirectivesArray(directives) {
- var expressions = directives.map(function (directiveType) { return ("" + source_module_1.moduleRef(directiveType.type.moduleUrl) + directiveType.type.name); });
- var base = "[" + expressions.join(',') + "]";
- return lang_1.IS_DART ? "const " + base : base;
- }
- function codeGenViewEncapsulation(value) {
- if (lang_1.IS_DART) {
- return "" + exports.TEMPLATE_COMMANDS_MODULE_REF + value;
- }
- else {
- return "" + value;
- }
- }
- /***/ },
- /* 167 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var __param = (this && this.__param) || function (paramIndex, decorator) {
- return function (target, key) { decorator(target, key, paramIndex); }
- };
- var collection_1 = __webpack_require__(12);
- var lang_1 = __webpack_require__(5);
- var core_1 = __webpack_require__(2);
- var lang_2 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var change_detection_1 = __webpack_require__(25);
- var html_parser_1 = __webpack_require__(168);
- var html_tags_1 = __webpack_require__(172);
- var parse_util_1 = __webpack_require__(171);
- var template_ast_1 = __webpack_require__(159);
- var selector_1 = __webpack_require__(154);
- var element_schema_registry_1 = __webpack_require__(173);
- var template_preparser_1 = __webpack_require__(174);
- var style_url_resolver_1 = __webpack_require__(163);
- var html_ast_1 = __webpack_require__(169);
- var util_1 = __webpack_require__(155);
- // Group 1 = "bind-"
- // Group 2 = "var-" or "#"
- // Group 3 = "on-"
- // Group 4 = "bindon-"
- // Group 5 = the identifier after "bind-", "var-/#", or "on-"
- // Group 6 = idenitifer inside [()]
- // Group 7 = idenitifer inside []
- // Group 8 = identifier inside ()
- var BIND_NAME_REGEXP = /^(?:(?:(?:(bind-)|(var-|#)|(on-)|(bindon-))(.+))|\[\(([^\)]+)\)\]|\[([^\]]+)\]|\(([^\)]+)\))$/g;
- var TEMPLATE_ELEMENT = 'template';
- var TEMPLATE_ATTR = 'template';
- var TEMPLATE_ATTR_PREFIX = '*';
- var CLASS_ATTR = 'class';
- var PROPERTY_PARTS_SEPARATOR = '.';
- var ATTRIBUTE_PREFIX = 'attr';
- var CLASS_PREFIX = 'class';
- var STYLE_PREFIX = 'style';
- var TEXT_CSS_SELECTOR = selector_1.CssSelector.parse('*')[0];
- /**
- * Provides an array of {@link TemplateAstVisitor}s which will be used to transform
- * parsed templates before compilation is invoked, allowing custom expression syntax
- * and other advanced transformations.
- *
- * This is currently an internal-only feature and not meant for general use.
- */
- exports.TEMPLATE_TRANSFORMS = lang_2.CONST_EXPR(new core_1.OpaqueToken('TemplateTransforms'));
- var TemplateParseError = (function (_super) {
- __extends(TemplateParseError, _super);
- function TemplateParseError(message, location) {
- _super.call(this, location, message);
- }
- return TemplateParseError;
- })(parse_util_1.ParseError);
- exports.TemplateParseError = TemplateParseError;
- var TemplateParser = (function () {
- function TemplateParser(_exprParser, _schemaRegistry, _htmlParser, transforms) {
- this._exprParser = _exprParser;
- this._schemaRegistry = _schemaRegistry;
- this._htmlParser = _htmlParser;
- this.transforms = transforms;
- }
- TemplateParser.prototype.parse = function (template, directives, templateUrl) {
- var parseVisitor = new TemplateParseVisitor(directives, this._exprParser, this._schemaRegistry);
- var htmlAstWithErrors = this._htmlParser.parse(template, templateUrl);
- var result = html_ast_1.htmlVisitAll(parseVisitor, htmlAstWithErrors.rootNodes, EMPTY_COMPONENT);
- var errors = htmlAstWithErrors.errors.concat(parseVisitor.errors);
- if (errors.length > 0) {
- var errorString = errors.join('\n');
- throw new exceptions_1.BaseException("Template parse errors:\n" + errorString);
- }
- if (lang_1.isPresent(this.transforms)) {
- this.transforms.forEach(function (transform) { result = template_ast_1.templateVisitAll(transform, result); });
- }
- return result;
- };
- TemplateParser = __decorate([
- core_1.Injectable(),
- __param(3, core_1.Optional()),
- __param(3, core_1.Inject(exports.TEMPLATE_TRANSFORMS)),
- __metadata('design:paramtypes', [change_detection_1.Parser, element_schema_registry_1.ElementSchemaRegistry, html_parser_1.HtmlParser, Array])
- ], TemplateParser);
- return TemplateParser;
- })();
- exports.TemplateParser = TemplateParser;
- var TemplateParseVisitor = (function () {
- function TemplateParseVisitor(directives, _exprParser, _schemaRegistry) {
- var _this = this;
- this._exprParser = _exprParser;
- this._schemaRegistry = _schemaRegistry;
- this.errors = [];
- this.directivesIndex = new Map();
- this.ngContentCount = 0;
- this.selectorMatcher = new selector_1.SelectorMatcher();
- collection_1.ListWrapper.forEachWithIndex(directives, function (directive, index) {
- var selector = selector_1.CssSelector.parse(directive.selector);
- _this.selectorMatcher.addSelectables(selector, directive);
- _this.directivesIndex.set(directive, index);
- });
- }
- TemplateParseVisitor.prototype._reportError = function (message, sourceSpan) {
- this.errors.push(new TemplateParseError(message, sourceSpan.start));
- };
- TemplateParseVisitor.prototype._parseInterpolation = function (value, sourceSpan) {
- var sourceInfo = sourceSpan.start.toString();
- try {
- return this._exprParser.parseInterpolation(value, sourceInfo);
- }
- catch (e) {
- this._reportError("" + e, sourceSpan);
- return this._exprParser.wrapLiteralPrimitive('ERROR', sourceInfo);
- }
- };
- TemplateParseVisitor.prototype._parseAction = function (value, sourceSpan) {
- var sourceInfo = sourceSpan.start.toString();
- try {
- return this._exprParser.parseAction(value, sourceInfo);
- }
- catch (e) {
- this._reportError("" + e, sourceSpan);
- return this._exprParser.wrapLiteralPrimitive('ERROR', sourceInfo);
- }
- };
- TemplateParseVisitor.prototype._parseBinding = function (value, sourceSpan) {
- var sourceInfo = sourceSpan.start.toString();
- try {
- return this._exprParser.parseBinding(value, sourceInfo);
- }
- catch (e) {
- this._reportError("" + e, sourceSpan);
- return this._exprParser.wrapLiteralPrimitive('ERROR', sourceInfo);
- }
- };
- TemplateParseVisitor.prototype._parseTemplateBindings = function (value, sourceSpan) {
- var sourceInfo = sourceSpan.start.toString();
- try {
- return this._exprParser.parseTemplateBindings(value, sourceInfo);
- }
- catch (e) {
- this._reportError("" + e, sourceSpan);
- return [];
- }
- };
- TemplateParseVisitor.prototype.visitText = function (ast, component) {
- var ngContentIndex = component.findNgContentIndex(TEXT_CSS_SELECTOR);
- var expr = this._parseInterpolation(ast.value, ast.sourceSpan);
- if (lang_1.isPresent(expr)) {
- return new template_ast_1.BoundTextAst(expr, ngContentIndex, ast.sourceSpan);
- }
- else {
- return new template_ast_1.TextAst(ast.value, ngContentIndex, ast.sourceSpan);
- }
- };
- TemplateParseVisitor.prototype.visitAttr = function (ast, contex) {
- return new template_ast_1.AttrAst(ast.name, ast.value, ast.sourceSpan);
- };
- TemplateParseVisitor.prototype.visitElement = function (element, component) {
- var _this = this;
- var nodeName = element.name;
- var preparsedElement = template_preparser_1.preparseElement(element);
- if (preparsedElement.type === template_preparser_1.PreparsedElementType.SCRIPT ||
- preparsedElement.type === template_preparser_1.PreparsedElementType.STYLE) {
- // Skipping <script> for security reasons
- // Skipping <style> as we already processed them
- // in the StyleCompiler
- return null;
- }
- if (preparsedElement.type === template_preparser_1.PreparsedElementType.STYLESHEET &&
- style_url_resolver_1.isStyleUrlResolvable(preparsedElement.hrefAttr)) {
- // Skipping stylesheets with either relative urls or package scheme as we already processed
- // them in the StyleCompiler
- return null;
- }
- var matchableAttrs = [];
- var elementOrDirectiveProps = [];
- var vars = [];
- var events = [];
- var templateElementOrDirectiveProps = [];
- var templateVars = [];
- var templateMatchableAttrs = [];
- var hasInlineTemplates = false;
- var attrs = [];
- element.attrs.forEach(function (attr) {
- matchableAttrs.push([attr.name, attr.value]);
- var hasBinding = _this._parseAttr(attr, matchableAttrs, elementOrDirectiveProps, events, vars);
- var hasTemplateBinding = _this._parseInlineTemplateBinding(attr, templateMatchableAttrs, templateElementOrDirectiveProps, templateVars);
- if (!hasBinding && !hasTemplateBinding) {
- // don't include the bindings as attributes as well in the AST
- attrs.push(_this.visitAttr(attr, null));
- }
- if (hasTemplateBinding) {
- hasInlineTemplates = true;
- }
- });
- var lcElName = html_tags_1.splitNsName(nodeName.toLowerCase())[1];
- var isTemplateElement = lcElName == TEMPLATE_ELEMENT;
- var elementCssSelector = createElementCssSelector(nodeName, matchableAttrs);
- var directives = this._createDirectiveAsts(element.name, this._parseDirectives(this.selectorMatcher, elementCssSelector), elementOrDirectiveProps, isTemplateElement ? [] : vars, element.sourceSpan);
- var elementProps = this._createElementPropertyAsts(element.name, elementOrDirectiveProps, directives);
- var children = html_ast_1.htmlVisitAll(preparsedElement.nonBindable ? NON_BINDABLE_VISITOR : this, element.children, Component.create(directives));
- var elementNgContentIndex = hasInlineTemplates ? null : component.findNgContentIndex(elementCssSelector);
- var parsedElement;
- if (preparsedElement.type === template_preparser_1.PreparsedElementType.NG_CONTENT) {
- if (lang_1.isPresent(element.children) && element.children.length > 0) {
- this._reportError("<ng-content> element cannot have content. <ng-content> must be immediately followed by </ng-content>", element.sourceSpan);
- }
- parsedElement =
- new template_ast_1.NgContentAst(this.ngContentCount++, elementNgContentIndex, element.sourceSpan);
- }
- else if (isTemplateElement) {
- this._assertAllEventsPublishedByDirectives(directives, events);
- this._assertNoComponentsNorElementBindingsOnTemplate(directives, elementProps, element.sourceSpan);
- parsedElement = new template_ast_1.EmbeddedTemplateAst(attrs, events, vars, directives, children, elementNgContentIndex, element.sourceSpan);
- }
- else {
- this._assertOnlyOneComponent(directives, element.sourceSpan);
- var elementExportAsVars = vars.filter(function (varAst) { return varAst.value.length === 0; });
- parsedElement =
- new template_ast_1.ElementAst(nodeName, attrs, elementProps, events, elementExportAsVars, directives, children, elementNgContentIndex, element.sourceSpan);
- }
- if (hasInlineTemplates) {
- var templateCssSelector = createElementCssSelector(TEMPLATE_ELEMENT, templateMatchableAttrs);
- var templateDirectives = this._createDirectiveAsts(element.name, this._parseDirectives(this.selectorMatcher, templateCssSelector), templateElementOrDirectiveProps, [], element.sourceSpan);
- var templateElementProps = this._createElementPropertyAsts(element.name, templateElementOrDirectiveProps, templateDirectives);
- this._assertNoComponentsNorElementBindingsOnTemplate(templateDirectives, templateElementProps, element.sourceSpan);
- parsedElement = new template_ast_1.EmbeddedTemplateAst([], [], templateVars, templateDirectives, [parsedElement], component.findNgContentIndex(templateCssSelector), element.sourceSpan);
- }
- return parsedElement;
- };
- TemplateParseVisitor.prototype._parseInlineTemplateBinding = function (attr, targetMatchableAttrs, targetProps, targetVars) {
- var templateBindingsSource = null;
- if (attr.name == TEMPLATE_ATTR) {
- templateBindingsSource = attr.value;
- }
- else if (attr.name.startsWith(TEMPLATE_ATTR_PREFIX)) {
- var key = attr.name.substring(TEMPLATE_ATTR_PREFIX.length); // remove the star
- templateBindingsSource = (attr.value.length == 0) ? key : key + ' ' + attr.value;
- }
- if (lang_1.isPresent(templateBindingsSource)) {
- var bindings = this._parseTemplateBindings(templateBindingsSource, attr.sourceSpan);
- for (var i = 0; i < bindings.length; i++) {
- var binding = bindings[i];
- if (binding.keyIsVar) {
- targetVars.push(new template_ast_1.VariableAst(binding.key, binding.name, attr.sourceSpan));
- targetMatchableAttrs.push([binding.key, binding.name]);
- }
- else if (lang_1.isPresent(binding.expression)) {
- this._parsePropertyAst(binding.key, binding.expression, attr.sourceSpan, targetMatchableAttrs, targetProps);
- }
- else {
- targetMatchableAttrs.push([binding.key, '']);
- this._parseLiteralAttr(binding.key, null, attr.sourceSpan, targetProps);
- }
- }
- return true;
- }
- return false;
- };
- TemplateParseVisitor.prototype._parseAttr = function (attr, targetMatchableAttrs, targetProps, targetEvents, targetVars) {
- var attrName = this._normalizeAttributeName(attr.name);
- var attrValue = attr.value;
- var bindParts = lang_1.RegExpWrapper.firstMatch(BIND_NAME_REGEXP, attrName);
- var hasBinding = false;
- if (lang_1.isPresent(bindParts)) {
- hasBinding = true;
- if (lang_1.isPresent(bindParts[1])) {
- this._parseProperty(bindParts[5], attrValue, attr.sourceSpan, targetMatchableAttrs, targetProps);
- }
- else if (lang_1.isPresent(bindParts[2])) {
- var identifier = bindParts[5];
- this._parseVariable(identifier, attrValue, attr.sourceSpan, targetVars);
- }
- else if (lang_1.isPresent(bindParts[3])) {
- this._parseEvent(bindParts[5], attrValue, attr.sourceSpan, targetMatchableAttrs, targetEvents);
- }
- else if (lang_1.isPresent(bindParts[4])) {
- this._parseProperty(bindParts[5], attrValue, attr.sourceSpan, targetMatchableAttrs, targetProps);
- this._parseAssignmentEvent(bindParts[5], attrValue, attr.sourceSpan, targetMatchableAttrs, targetEvents);
- }
- else if (lang_1.isPresent(bindParts[6])) {
- this._parseProperty(bindParts[6], attrValue, attr.sourceSpan, targetMatchableAttrs, targetProps);
- this._parseAssignmentEvent(bindParts[6], attrValue, attr.sourceSpan, targetMatchableAttrs, targetEvents);
- }
- else if (lang_1.isPresent(bindParts[7])) {
- this._parseProperty(bindParts[7], attrValue, attr.sourceSpan, targetMatchableAttrs, targetProps);
- }
- else if (lang_1.isPresent(bindParts[8])) {
- this._parseEvent(bindParts[8], attrValue, attr.sourceSpan, targetMatchableAttrs, targetEvents);
- }
- }
- else {
- hasBinding = this._parsePropertyInterpolation(attrName, attrValue, attr.sourceSpan, targetMatchableAttrs, targetProps);
- }
- if (!hasBinding) {
- this._parseLiteralAttr(attrName, attrValue, attr.sourceSpan, targetProps);
- }
- return hasBinding;
- };
- TemplateParseVisitor.prototype._normalizeAttributeName = function (attrName) {
- return attrName.toLowerCase().startsWith('data-') ? attrName.substring(5) : attrName;
- };
- TemplateParseVisitor.prototype._parseVariable = function (identifier, value, sourceSpan, targetVars) {
- if (identifier.indexOf('-') > -1) {
- this._reportError("\"-\" is not allowed in variable names", sourceSpan);
- }
- targetVars.push(new template_ast_1.VariableAst(identifier, value, sourceSpan));
- };
- TemplateParseVisitor.prototype._parseProperty = function (name, expression, sourceSpan, targetMatchableAttrs, targetProps) {
- this._parsePropertyAst(name, this._parseBinding(expression, sourceSpan), sourceSpan, targetMatchableAttrs, targetProps);
- };
- TemplateParseVisitor.prototype._parsePropertyInterpolation = function (name, value, sourceSpan, targetMatchableAttrs, targetProps) {
- var expr = this._parseInterpolation(value, sourceSpan);
- if (lang_1.isPresent(expr)) {
- this._parsePropertyAst(name, expr, sourceSpan, targetMatchableAttrs, targetProps);
- return true;
- }
- return false;
- };
- TemplateParseVisitor.prototype._parsePropertyAst = function (name, ast, sourceSpan, targetMatchableAttrs, targetProps) {
- targetMatchableAttrs.push([name, ast.source]);
- targetProps.push(new BoundElementOrDirectiveProperty(name, ast, false, sourceSpan));
- };
- TemplateParseVisitor.prototype._parseAssignmentEvent = function (name, expression, sourceSpan, targetMatchableAttrs, targetEvents) {
- this._parseEvent(name + "Change", expression + "=$event", sourceSpan, targetMatchableAttrs, targetEvents);
- };
- TemplateParseVisitor.prototype._parseEvent = function (name, expression, sourceSpan, targetMatchableAttrs, targetEvents) {
- // long format: 'target: eventName'
- var parts = util_1.splitAtColon(name, [null, name]);
- var target = parts[0];
- var eventName = parts[1];
- targetEvents.push(new template_ast_1.BoundEventAst(eventName, target, this._parseAction(expression, sourceSpan), sourceSpan));
- // Don't detect directives for event names for now,
- // so don't add the event name to the matchableAttrs
- };
- TemplateParseVisitor.prototype._parseLiteralAttr = function (name, value, sourceSpan, targetProps) {
- targetProps.push(new BoundElementOrDirectiveProperty(name, this._exprParser.wrapLiteralPrimitive(value, ''), true, sourceSpan));
- };
- TemplateParseVisitor.prototype._parseDirectives = function (selectorMatcher, elementCssSelector) {
- var _this = this;
- var directives = [];
- selectorMatcher.match(elementCssSelector, function (selector, directive) { directives.push(directive); });
- // Need to sort the directives so that we get consistent results throughout,
- // as selectorMatcher uses Maps inside.
- // Also need to make components the first directive in the array
- collection_1.ListWrapper.sort(directives, function (dir1, dir2) {
- var dir1Comp = dir1.isComponent;
- var dir2Comp = dir2.isComponent;
- if (dir1Comp && !dir2Comp) {
- return -1;
- }
- else if (!dir1Comp && dir2Comp) {
- return 1;
- }
- else {
- return _this.directivesIndex.get(dir1) - _this.directivesIndex.get(dir2);
- }
- });
- return directives;
- };
- TemplateParseVisitor.prototype._createDirectiveAsts = function (elementName, directives, props, possibleExportAsVars, sourceSpan) {
- var _this = this;
- var matchedVariables = new Set();
- var directiveAsts = directives.map(function (directive) {
- var hostProperties = [];
- var hostEvents = [];
- var directiveProperties = [];
- _this._createDirectiveHostPropertyAsts(elementName, directive.hostProperties, sourceSpan, hostProperties);
- _this._createDirectiveHostEventAsts(directive.hostListeners, sourceSpan, hostEvents);
- _this._createDirectivePropertyAsts(directive.inputs, props, directiveProperties);
- var exportAsVars = [];
- possibleExportAsVars.forEach(function (varAst) {
- if ((varAst.value.length === 0 && directive.isComponent) ||
- (directive.exportAs == varAst.value)) {
- exportAsVars.push(varAst);
- matchedVariables.add(varAst.name);
- }
- });
- return new template_ast_1.DirectiveAst(directive, directiveProperties, hostProperties, hostEvents, exportAsVars, sourceSpan);
- });
- possibleExportAsVars.forEach(function (varAst) {
- if (varAst.value.length > 0 && !collection_1.SetWrapper.has(matchedVariables, varAst.name)) {
- _this._reportError("There is no directive with \"exportAs\" set to \"" + varAst.value + "\"", varAst.sourceSpan);
- }
- });
- return directiveAsts;
- };
- TemplateParseVisitor.prototype._createDirectiveHostPropertyAsts = function (elementName, hostProps, sourceSpan, targetPropertyAsts) {
- var _this = this;
- if (lang_1.isPresent(hostProps)) {
- collection_1.StringMapWrapper.forEach(hostProps, function (expression, propName) {
- var exprAst = _this._parseBinding(expression, sourceSpan);
- targetPropertyAsts.push(_this._createElementPropertyAst(elementName, propName, exprAst, sourceSpan));
- });
- }
- };
- TemplateParseVisitor.prototype._createDirectiveHostEventAsts = function (hostListeners, sourceSpan, targetEventAsts) {
- var _this = this;
- if (lang_1.isPresent(hostListeners)) {
- collection_1.StringMapWrapper.forEach(hostListeners, function (expression, propName) {
- _this._parseEvent(propName, expression, sourceSpan, [], targetEventAsts);
- });
- }
- };
- TemplateParseVisitor.prototype._createDirectivePropertyAsts = function (directiveProperties, boundProps, targetBoundDirectiveProps) {
- if (lang_1.isPresent(directiveProperties)) {
- var boundPropsByName = new Map();
- boundProps.forEach(function (boundProp) {
- var prevValue = boundPropsByName.get(boundProp.name);
- if (lang_1.isBlank(prevValue) || prevValue.isLiteral) {
- // give [a]="b" a higher precedence than a="b" on the same element
- boundPropsByName.set(boundProp.name, boundProp);
- }
- });
- collection_1.StringMapWrapper.forEach(directiveProperties, function (elProp, dirProp) {
- var boundProp = boundPropsByName.get(elProp);
- // Bindings are optional, so this binding only needs to be set up if an expression is given.
- if (lang_1.isPresent(boundProp)) {
- targetBoundDirectiveProps.push(new template_ast_1.BoundDirectivePropertyAst(dirProp, boundProp.name, boundProp.expression, boundProp.sourceSpan));
- }
- });
- }
- };
- TemplateParseVisitor.prototype._createElementPropertyAsts = function (elementName, props, directives) {
- var _this = this;
- var boundElementProps = [];
- var boundDirectivePropsIndex = new Map();
- directives.forEach(function (directive) {
- directive.inputs.forEach(function (prop) {
- boundDirectivePropsIndex.set(prop.templateName, prop);
- });
- });
- props.forEach(function (prop) {
- if (!prop.isLiteral && lang_1.isBlank(boundDirectivePropsIndex.get(prop.name))) {
- boundElementProps.push(_this._createElementPropertyAst(elementName, prop.name, prop.expression, prop.sourceSpan));
- }
- });
- return boundElementProps;
- };
- TemplateParseVisitor.prototype._createElementPropertyAst = function (elementName, name, ast, sourceSpan) {
- var unit = null;
- var bindingType;
- var boundPropertyName;
- var parts = name.split(PROPERTY_PARTS_SEPARATOR);
- if (parts.length === 1) {
- boundPropertyName = this._schemaRegistry.getMappedPropName(parts[0]);
- bindingType = template_ast_1.PropertyBindingType.Property;
- if (!this._schemaRegistry.hasProperty(elementName, boundPropertyName)) {
- this._reportError("Can't bind to '" + boundPropertyName + "' since it isn't a known native property", sourceSpan);
- }
- }
- else {
- if (parts[0] == ATTRIBUTE_PREFIX) {
- boundPropertyName = parts[1];
- bindingType = template_ast_1.PropertyBindingType.Attribute;
- }
- else if (parts[0] == CLASS_PREFIX) {
- boundPropertyName = parts[1];
- bindingType = template_ast_1.PropertyBindingType.Class;
- }
- else if (parts[0] == STYLE_PREFIX) {
- unit = parts.length > 2 ? parts[2] : null;
- boundPropertyName = parts[1];
- bindingType = template_ast_1.PropertyBindingType.Style;
- }
- else {
- this._reportError("Invalid property name '" + name + "'", sourceSpan);
- bindingType = null;
- }
- }
- return new template_ast_1.BoundElementPropertyAst(boundPropertyName, bindingType, ast, unit, sourceSpan);
- };
- TemplateParseVisitor.prototype._findComponentDirectiveNames = function (directives) {
- var componentTypeNames = [];
- directives.forEach(function (directive) {
- var typeName = directive.directive.type.name;
- if (directive.directive.isComponent) {
- componentTypeNames.push(typeName);
- }
- });
- return componentTypeNames;
- };
- TemplateParseVisitor.prototype._assertOnlyOneComponent = function (directives, sourceSpan) {
- var componentTypeNames = this._findComponentDirectiveNames(directives);
- if (componentTypeNames.length > 1) {
- this._reportError("More than one component: " + componentTypeNames.join(','), sourceSpan);
- }
- };
- TemplateParseVisitor.prototype._assertNoComponentsNorElementBindingsOnTemplate = function (directives, elementProps, sourceSpan) {
- var _this = this;
- var componentTypeNames = this._findComponentDirectiveNames(directives);
- if (componentTypeNames.length > 0) {
- this._reportError("Components on an embedded template: " + componentTypeNames.join(','), sourceSpan);
- }
- elementProps.forEach(function (prop) {
- _this._reportError("Property binding " + prop.name + " not used by any directive on an embedded template", sourceSpan);
- });
- };
- TemplateParseVisitor.prototype._assertAllEventsPublishedByDirectives = function (directives, events) {
- var _this = this;
- var allDirectiveEvents = new Set();
- directives.forEach(function (directive) {
- collection_1.StringMapWrapper.forEach(directive.directive.outputs, function (eventName, _) { allDirectiveEvents.add(eventName); });
- });
- events.forEach(function (event) {
- if (lang_1.isPresent(event.target) || !collection_1.SetWrapper.has(allDirectiveEvents, event.name)) {
- _this._reportError("Event binding " + event.fullName + " not emitted by any directive on an embedded template", event.sourceSpan);
- }
- });
- };
- return TemplateParseVisitor;
- })();
- var NonBindableVisitor = (function () {
- function NonBindableVisitor() {
- }
- NonBindableVisitor.prototype.visitElement = function (ast, component) {
- var preparsedElement = template_preparser_1.preparseElement(ast);
- if (preparsedElement.type === template_preparser_1.PreparsedElementType.SCRIPT ||
- preparsedElement.type === template_preparser_1.PreparsedElementType.STYLE ||
- preparsedElement.type === template_preparser_1.PreparsedElementType.STYLESHEET) {
- // Skipping <script> for security reasons
- // Skipping <style> and stylesheets as we already processed them
- // in the StyleCompiler
- return null;
- }
- var attrNameAndValues = ast.attrs.map(function (attrAst) { return [attrAst.name, attrAst.value]; });
- var selector = createElementCssSelector(ast.name, attrNameAndValues);
- var ngContentIndex = component.findNgContentIndex(selector);
- var children = html_ast_1.htmlVisitAll(this, ast.children, EMPTY_COMPONENT);
- return new template_ast_1.ElementAst(ast.name, html_ast_1.htmlVisitAll(this, ast.attrs), [], [], [], [], children, ngContentIndex, ast.sourceSpan);
- };
- NonBindableVisitor.prototype.visitAttr = function (ast, context) {
- return new template_ast_1.AttrAst(ast.name, ast.value, ast.sourceSpan);
- };
- NonBindableVisitor.prototype.visitText = function (ast, component) {
- var ngContentIndex = component.findNgContentIndex(TEXT_CSS_SELECTOR);
- return new template_ast_1.TextAst(ast.value, ngContentIndex, ast.sourceSpan);
- };
- return NonBindableVisitor;
- })();
- var BoundElementOrDirectiveProperty = (function () {
- function BoundElementOrDirectiveProperty(name, expression, isLiteral, sourceSpan) {
- this.name = name;
- this.expression = expression;
- this.isLiteral = isLiteral;
- this.sourceSpan = sourceSpan;
- }
- return BoundElementOrDirectiveProperty;
- })();
- function splitClasses(classAttrValue) {
- return lang_1.StringWrapper.split(classAttrValue.trim(), /\s+/g);
- }
- exports.splitClasses = splitClasses;
- var Component = (function () {
- function Component(ngContentIndexMatcher, wildcardNgContentIndex) {
- this.ngContentIndexMatcher = ngContentIndexMatcher;
- this.wildcardNgContentIndex = wildcardNgContentIndex;
- }
- Component.create = function (directives) {
- if (directives.length === 0 || !directives[0].directive.isComponent) {
- return EMPTY_COMPONENT;
- }
- var matcher = new selector_1.SelectorMatcher();
- var ngContentSelectors = directives[0].directive.template.ngContentSelectors;
- var wildcardNgContentIndex = null;
- for (var i = 0; i < ngContentSelectors.length; i++) {
- var selector = ngContentSelectors[i];
- if (lang_1.StringWrapper.equals(selector, '*')) {
- wildcardNgContentIndex = i;
- }
- else {
- matcher.addSelectables(selector_1.CssSelector.parse(ngContentSelectors[i]), i);
- }
- }
- return new Component(matcher, wildcardNgContentIndex);
- };
- Component.prototype.findNgContentIndex = function (selector) {
- var ngContentIndices = [];
- this.ngContentIndexMatcher.match(selector, function (selector, ngContentIndex) { ngContentIndices.push(ngContentIndex); });
- collection_1.ListWrapper.sort(ngContentIndices);
- if (lang_1.isPresent(this.wildcardNgContentIndex)) {
- ngContentIndices.push(this.wildcardNgContentIndex);
- }
- return ngContentIndices.length > 0 ? ngContentIndices[0] : null;
- };
- return Component;
- })();
- function createElementCssSelector(elementName, matchableAttrs) {
- var cssSelector = new selector_1.CssSelector();
- var elNameNoNs = html_tags_1.splitNsName(elementName)[1];
- cssSelector.setElement(elNameNoNs);
- for (var i = 0; i < matchableAttrs.length; i++) {
- var attrName = matchableAttrs[i][0];
- var attrNameNoNs = html_tags_1.splitNsName(attrName)[1];
- var attrValue = matchableAttrs[i][1];
- cssSelector.addAttribute(attrNameNoNs, attrValue);
- if (attrName.toLowerCase() == CLASS_ATTR) {
- var classes = splitClasses(attrValue);
- classes.forEach(function (className) { return cssSelector.addClassName(className); });
- }
- }
- return cssSelector;
- }
- var EMPTY_COMPONENT = new Component(new selector_1.SelectorMatcher(), null);
- var NON_BINDABLE_VISITOR = new NonBindableVisitor();
- /***/ },
- /* 168 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var lang_1 = __webpack_require__(5);
- var collection_1 = __webpack_require__(12);
- var html_ast_1 = __webpack_require__(169);
- var di_1 = __webpack_require__(6);
- var html_lexer_1 = __webpack_require__(170);
- var parse_util_1 = __webpack_require__(171);
- var html_tags_1 = __webpack_require__(172);
- var HtmlTreeError = (function (_super) {
- __extends(HtmlTreeError, _super);
- function HtmlTreeError(elementName, location, msg) {
- _super.call(this, location, msg);
- this.elementName = elementName;
- }
- HtmlTreeError.create = function (elementName, location, msg) {
- return new HtmlTreeError(elementName, location, msg);
- };
- return HtmlTreeError;
- })(parse_util_1.ParseError);
- exports.HtmlTreeError = HtmlTreeError;
- var HtmlParseTreeResult = (function () {
- function HtmlParseTreeResult(rootNodes, errors) {
- this.rootNodes = rootNodes;
- this.errors = errors;
- }
- return HtmlParseTreeResult;
- })();
- exports.HtmlParseTreeResult = HtmlParseTreeResult;
- var HtmlParser = (function () {
- function HtmlParser() {
- }
- HtmlParser.prototype.parse = function (sourceContent, sourceUrl) {
- var tokensAndErrors = html_lexer_1.tokenizeHtml(sourceContent, sourceUrl);
- var treeAndErrors = new TreeBuilder(tokensAndErrors.tokens).build();
- return new HtmlParseTreeResult(treeAndErrors.rootNodes, tokensAndErrors.errors
- .concat(treeAndErrors.errors));
- };
- HtmlParser = __decorate([
- di_1.Injectable(),
- __metadata('design:paramtypes', [])
- ], HtmlParser);
- return HtmlParser;
- })();
- exports.HtmlParser = HtmlParser;
- var TreeBuilder = (function () {
- function TreeBuilder(tokens) {
- this.tokens = tokens;
- this.index = -1;
- this.rootNodes = [];
- this.errors = [];
- this.elementStack = [];
- this._advance();
- }
- TreeBuilder.prototype.build = function () {
- while (this.peek.type !== html_lexer_1.HtmlTokenType.EOF) {
- if (this.peek.type === html_lexer_1.HtmlTokenType.TAG_OPEN_START) {
- this._consumeStartTag(this._advance());
- }
- else if (this.peek.type === html_lexer_1.HtmlTokenType.TAG_CLOSE) {
- this._consumeEndTag(this._advance());
- }
- else if (this.peek.type === html_lexer_1.HtmlTokenType.CDATA_START) {
- this._closeVoidElement();
- this._consumeCdata(this._advance());
- }
- else if (this.peek.type === html_lexer_1.HtmlTokenType.COMMENT_START) {
- this._closeVoidElement();
- this._consumeComment(this._advance());
- }
- else if (this.peek.type === html_lexer_1.HtmlTokenType.TEXT ||
- this.peek.type === html_lexer_1.HtmlTokenType.RAW_TEXT ||
- this.peek.type === html_lexer_1.HtmlTokenType.ESCAPABLE_RAW_TEXT) {
- this._closeVoidElement();
- this._consumeText(this._advance());
- }
- else {
- // Skip all other tokens...
- this._advance();
- }
- }
- return new HtmlParseTreeResult(this.rootNodes, this.errors);
- };
- TreeBuilder.prototype._advance = function () {
- var prev = this.peek;
- if (this.index < this.tokens.length - 1) {
- // Note: there is always an EOF token at the end
- this.index++;
- }
- this.peek = this.tokens[this.index];
- return prev;
- };
- TreeBuilder.prototype._advanceIf = function (type) {
- if (this.peek.type === type) {
- return this._advance();
- }
- return null;
- };
- TreeBuilder.prototype._consumeCdata = function (startToken) {
- this._consumeText(this._advance());
- this._advanceIf(html_lexer_1.HtmlTokenType.CDATA_END);
- };
- TreeBuilder.prototype._consumeComment = function (startToken) {
- this._advanceIf(html_lexer_1.HtmlTokenType.RAW_TEXT);
- this._advanceIf(html_lexer_1.HtmlTokenType.COMMENT_END);
- };
- TreeBuilder.prototype._consumeText = function (token) {
- var text = token.parts[0];
- if (text.length > 0 && text[0] == '\n') {
- var parent_1 = this._getParentElement();
- if (lang_1.isPresent(parent_1) && parent_1.children.length == 0 &&
- html_tags_1.getHtmlTagDefinition(parent_1.name).ignoreFirstLf) {
- text = text.substring(1);
- }
- }
- if (text.length > 0) {
- this._addToParent(new html_ast_1.HtmlTextAst(text, token.sourceSpan));
- }
- };
- TreeBuilder.prototype._closeVoidElement = function () {
- if (this.elementStack.length > 0) {
- var el = collection_1.ListWrapper.last(this.elementStack);
- if (html_tags_1.getHtmlTagDefinition(el.name).isVoid) {
- this.elementStack.pop();
- }
- }
- };
- TreeBuilder.prototype._consumeStartTag = function (startTagToken) {
- var prefix = startTagToken.parts[0];
- var name = startTagToken.parts[1];
- var attrs = [];
- while (this.peek.type === html_lexer_1.HtmlTokenType.ATTR_NAME) {
- attrs.push(this._consumeAttr(this._advance()));
- }
- var fullName = getElementFullName(prefix, name, this._getParentElement());
- var selfClosing = false;
- // Note: There could have been a tokenizer error
- // so that we don't get a token for the end tag...
- if (this.peek.type === html_lexer_1.HtmlTokenType.TAG_OPEN_END_VOID) {
- this._advance();
- selfClosing = true;
- if (html_tags_1.getNsPrefix(fullName) == null && !html_tags_1.getHtmlTagDefinition(fullName).isVoid) {
- this.errors.push(HtmlTreeError.create(fullName, startTagToken.sourceSpan.start, "Only void and foreign elements can be self closed \"" + startTagToken.parts[1] + "\""));
- }
- }
- else if (this.peek.type === html_lexer_1.HtmlTokenType.TAG_OPEN_END) {
- this._advance();
- selfClosing = false;
- }
- var end = this.peek.sourceSpan.start;
- var el = new html_ast_1.HtmlElementAst(fullName, attrs, [], new parse_util_1.ParseSourceSpan(startTagToken.sourceSpan.start, end));
- this._pushElement(el);
- if (selfClosing) {
- this._popElement(fullName);
- }
- };
- TreeBuilder.prototype._pushElement = function (el) {
- if (this.elementStack.length > 0) {
- var parentEl = collection_1.ListWrapper.last(this.elementStack);
- if (html_tags_1.getHtmlTagDefinition(parentEl.name).isClosedByChild(el.name)) {
- this.elementStack.pop();
- }
- }
- var tagDef = html_tags_1.getHtmlTagDefinition(el.name);
- var parentEl = this._getParentElement();
- if (tagDef.requireExtraParent(lang_1.isPresent(parentEl) ? parentEl.name : null)) {
- var newParent = new html_ast_1.HtmlElementAst(tagDef.parentToAdd, [], [el], el.sourceSpan);
- this._addToParent(newParent);
- this.elementStack.push(newParent);
- this.elementStack.push(el);
- }
- else {
- this._addToParent(el);
- this.elementStack.push(el);
- }
- };
- TreeBuilder.prototype._consumeEndTag = function (endTagToken) {
- var fullName = getElementFullName(endTagToken.parts[0], endTagToken.parts[1], this._getParentElement());
- if (html_tags_1.getHtmlTagDefinition(fullName).isVoid) {
- this.errors.push(HtmlTreeError.create(fullName, endTagToken.sourceSpan.start, "Void elements do not have end tags \"" + endTagToken.parts[1] + "\""));
- }
- else if (!this._popElement(fullName)) {
- this.errors.push(HtmlTreeError.create(fullName, endTagToken.sourceSpan.start, "Unexpected closing tag \"" + endTagToken.parts[1] + "\""));
- }
- };
- TreeBuilder.prototype._popElement = function (fullName) {
- for (var stackIndex = this.elementStack.length - 1; stackIndex >= 0; stackIndex--) {
- var el = this.elementStack[stackIndex];
- if (el.name == fullName) {
- collection_1.ListWrapper.splice(this.elementStack, stackIndex, this.elementStack.length - stackIndex);
- return true;
- }
- if (!html_tags_1.getHtmlTagDefinition(el.name).closedByParent) {
- return false;
- }
- }
- return false;
- };
- TreeBuilder.prototype._consumeAttr = function (attrName) {
- var fullName = mergeNsAndName(attrName.parts[0], attrName.parts[1]);
- var end = attrName.sourceSpan.end;
- var value = '';
- if (this.peek.type === html_lexer_1.HtmlTokenType.ATTR_VALUE) {
- var valueToken = this._advance();
- value = valueToken.parts[0];
- end = valueToken.sourceSpan.end;
- }
- return new html_ast_1.HtmlAttrAst(fullName, value, new parse_util_1.ParseSourceSpan(attrName.sourceSpan.start, end));
- };
- TreeBuilder.prototype._getParentElement = function () {
- return this.elementStack.length > 0 ? collection_1.ListWrapper.last(this.elementStack) : null;
- };
- TreeBuilder.prototype._addToParent = function (node) {
- var parent = this._getParentElement();
- if (lang_1.isPresent(parent)) {
- parent.children.push(node);
- }
- else {
- this.rootNodes.push(node);
- }
- };
- return TreeBuilder;
- })();
- function mergeNsAndName(prefix, localName) {
- return lang_1.isPresent(prefix) ? "@" + prefix + ":" + localName : localName;
- }
- function getElementFullName(prefix, localName, parentElement) {
- if (lang_1.isBlank(prefix)) {
- prefix = html_tags_1.getHtmlTagDefinition(localName).implicitNamespacePrefix;
- if (lang_1.isBlank(prefix) && lang_1.isPresent(parentElement)) {
- prefix = html_tags_1.getNsPrefix(parentElement.name);
- }
- }
- return mergeNsAndName(prefix, localName);
- }
- /***/ },
- /* 169 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var HtmlTextAst = (function () {
- function HtmlTextAst(value, sourceSpan) {
- this.value = value;
- this.sourceSpan = sourceSpan;
- }
- HtmlTextAst.prototype.visit = function (visitor, context) { return visitor.visitText(this, context); };
- return HtmlTextAst;
- })();
- exports.HtmlTextAst = HtmlTextAst;
- var HtmlAttrAst = (function () {
- function HtmlAttrAst(name, value, sourceSpan) {
- this.name = name;
- this.value = value;
- this.sourceSpan = sourceSpan;
- }
- HtmlAttrAst.prototype.visit = function (visitor, context) { return visitor.visitAttr(this, context); };
- return HtmlAttrAst;
- })();
- exports.HtmlAttrAst = HtmlAttrAst;
- var HtmlElementAst = (function () {
- function HtmlElementAst(name, attrs, children, sourceSpan) {
- this.name = name;
- this.attrs = attrs;
- this.children = children;
- this.sourceSpan = sourceSpan;
- }
- HtmlElementAst.prototype.visit = function (visitor, context) { return visitor.visitElement(this, context); };
- return HtmlElementAst;
- })();
- exports.HtmlElementAst = HtmlElementAst;
- function htmlVisitAll(visitor, asts, context) {
- if (context === void 0) { context = null; }
- var result = [];
- asts.forEach(function (ast) {
- var astResult = ast.visit(visitor, context);
- if (lang_1.isPresent(astResult)) {
- result.push(astResult);
- }
- });
- return result;
- }
- exports.htmlVisitAll = htmlVisitAll;
- /***/ },
- /* 170 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var lang_1 = __webpack_require__(5);
- var collection_1 = __webpack_require__(12);
- var parse_util_1 = __webpack_require__(171);
- var html_tags_1 = __webpack_require__(172);
- (function (HtmlTokenType) {
- HtmlTokenType[HtmlTokenType["TAG_OPEN_START"] = 0] = "TAG_OPEN_START";
- HtmlTokenType[HtmlTokenType["TAG_OPEN_END"] = 1] = "TAG_OPEN_END";
- HtmlTokenType[HtmlTokenType["TAG_OPEN_END_VOID"] = 2] = "TAG_OPEN_END_VOID";
- HtmlTokenType[HtmlTokenType["TAG_CLOSE"] = 3] = "TAG_CLOSE";
- HtmlTokenType[HtmlTokenType["TEXT"] = 4] = "TEXT";
- HtmlTokenType[HtmlTokenType["ESCAPABLE_RAW_TEXT"] = 5] = "ESCAPABLE_RAW_TEXT";
- HtmlTokenType[HtmlTokenType["RAW_TEXT"] = 6] = "RAW_TEXT";
- HtmlTokenType[HtmlTokenType["COMMENT_START"] = 7] = "COMMENT_START";
- HtmlTokenType[HtmlTokenType["COMMENT_END"] = 8] = "COMMENT_END";
- HtmlTokenType[HtmlTokenType["CDATA_START"] = 9] = "CDATA_START";
- HtmlTokenType[HtmlTokenType["CDATA_END"] = 10] = "CDATA_END";
- HtmlTokenType[HtmlTokenType["ATTR_NAME"] = 11] = "ATTR_NAME";
- HtmlTokenType[HtmlTokenType["ATTR_VALUE"] = 12] = "ATTR_VALUE";
- HtmlTokenType[HtmlTokenType["DOC_TYPE"] = 13] = "DOC_TYPE";
- HtmlTokenType[HtmlTokenType["EOF"] = 14] = "EOF";
- })(exports.HtmlTokenType || (exports.HtmlTokenType = {}));
- var HtmlTokenType = exports.HtmlTokenType;
- var HtmlToken = (function () {
- function HtmlToken(type, parts, sourceSpan) {
- this.type = type;
- this.parts = parts;
- this.sourceSpan = sourceSpan;
- }
- return HtmlToken;
- })();
- exports.HtmlToken = HtmlToken;
- var HtmlTokenError = (function (_super) {
- __extends(HtmlTokenError, _super);
- function HtmlTokenError(errorMsg, tokenType, location) {
- _super.call(this, location, errorMsg);
- this.tokenType = tokenType;
- }
- return HtmlTokenError;
- })(parse_util_1.ParseError);
- exports.HtmlTokenError = HtmlTokenError;
- var HtmlTokenizeResult = (function () {
- function HtmlTokenizeResult(tokens, errors) {
- this.tokens = tokens;
- this.errors = errors;
- }
- return HtmlTokenizeResult;
- })();
- exports.HtmlTokenizeResult = HtmlTokenizeResult;
- function tokenizeHtml(sourceContent, sourceUrl) {
- return new _HtmlTokenizer(new parse_util_1.ParseSourceFile(sourceContent, sourceUrl)).tokenize();
- }
- exports.tokenizeHtml = tokenizeHtml;
- var $EOF = 0;
- var $TAB = 9;
- var $LF = 10;
- var $FF = 12;
- var $CR = 13;
- var $SPACE = 32;
- var $BANG = 33;
- var $DQ = 34;
- var $HASH = 35;
- var $$ = 36;
- var $AMPERSAND = 38;
- var $SQ = 39;
- var $MINUS = 45;
- var $SLASH = 47;
- var $0 = 48;
- var $SEMICOLON = 59;
- var $9 = 57;
- var $COLON = 58;
- var $LT = 60;
- var $EQ = 61;
- var $GT = 62;
- var $QUESTION = 63;
- var $A = 65;
- var $Z = 90;
- var $LBRACKET = 91;
- var $RBRACKET = 93;
- var $a = 97;
- var $f = 102;
- var $z = 122;
- var $x = 120;
- var $NBSP = 160;
- var CR_OR_CRLF_REGEXP = /\r\n?/g;
- function unexpectedCharacterErrorMsg(charCode) {
- var char = charCode === $EOF ? 'EOF' : lang_1.StringWrapper.fromCharCode(charCode);
- return "Unexpected character \"" + char + "\"";
- }
- function unknownEntityErrorMsg(entitySrc) {
- return "Unknown entity \"" + entitySrc + "\" - use the \"&#<decimal>;\" or \"&#x<hex>;\" syntax";
- }
- var ControlFlowError = (function () {
- function ControlFlowError(error) {
- this.error = error;
- }
- return ControlFlowError;
- })();
- // See http://www.w3.org/TR/html51/syntax.html#writing
- var _HtmlTokenizer = (function () {
- function _HtmlTokenizer(file) {
- this.file = file;
- // Note: this is always lowercase!
- this.peek = -1;
- this.index = -1;
- this.line = 0;
- this.column = -1;
- this.tokens = [];
- this.errors = [];
- this.input = file.content;
- this.inputLowercase = file.content.toLowerCase();
- this.length = file.content.length;
- this._advance();
- }
- _HtmlTokenizer.prototype._processCarriageReturns = function (content) {
- // http://www.w3.org/TR/html5/syntax.html#preprocessing-the-input-stream
- // In order to keep the original position in the source, we can not pre-process it.
- // Instead CRs are processed right before instantiating the tokens.
- return lang_1.StringWrapper.replaceAll(content, CR_OR_CRLF_REGEXP, '\n');
- };
- _HtmlTokenizer.prototype.tokenize = function () {
- while (this.peek !== $EOF) {
- var start = this._getLocation();
- try {
- if (this._attemptChar($LT)) {
- if (this._attemptChar($BANG)) {
- if (this._attemptChar($LBRACKET)) {
- this._consumeCdata(start);
- }
- else if (this._attemptChar($MINUS)) {
- this._consumeComment(start);
- }
- else {
- this._consumeDocType(start);
- }
- }
- else if (this._attemptChar($SLASH)) {
- this._consumeTagClose(start);
- }
- else {
- this._consumeTagOpen(start);
- }
- }
- else {
- this._consumeText();
- }
- }
- catch (e) {
- if (e instanceof ControlFlowError) {
- this.errors.push(e.error);
- }
- else {
- throw e;
- }
- }
- }
- this._beginToken(HtmlTokenType.EOF);
- this._endToken([]);
- return new HtmlTokenizeResult(mergeTextTokens(this.tokens), this.errors);
- };
- _HtmlTokenizer.prototype._getLocation = function () {
- return new parse_util_1.ParseLocation(this.file, this.index, this.line, this.column);
- };
- _HtmlTokenizer.prototype._beginToken = function (type, start) {
- if (start === void 0) { start = null; }
- if (lang_1.isBlank(start)) {
- start = this._getLocation();
- }
- this.currentTokenStart = start;
- this.currentTokenType = type;
- };
- _HtmlTokenizer.prototype._endToken = function (parts, end) {
- if (end === void 0) { end = null; }
- if (lang_1.isBlank(end)) {
- end = this._getLocation();
- }
- var token = new HtmlToken(this.currentTokenType, parts, new parse_util_1.ParseSourceSpan(this.currentTokenStart, end));
- this.tokens.push(token);
- this.currentTokenStart = null;
- this.currentTokenType = null;
- return token;
- };
- _HtmlTokenizer.prototype._createError = function (msg, position) {
- var error = new HtmlTokenError(msg, this.currentTokenType, position);
- this.currentTokenStart = null;
- this.currentTokenType = null;
- return new ControlFlowError(error);
- };
- _HtmlTokenizer.prototype._advance = function () {
- if (this.index >= this.length) {
- throw this._createError(unexpectedCharacterErrorMsg($EOF), this._getLocation());
- }
- if (this.peek === $LF) {
- this.line++;
- this.column = 0;
- }
- else if (this.peek !== $LF && this.peek !== $CR) {
- this.column++;
- }
- this.index++;
- this.peek = this.index >= this.length ? $EOF : lang_1.StringWrapper.charCodeAt(this.inputLowercase, this.index);
- };
- _HtmlTokenizer.prototype._attemptChar = function (charCode) {
- if (this.peek === charCode) {
- this._advance();
- return true;
- }
- return false;
- };
- _HtmlTokenizer.prototype._requireChar = function (charCode) {
- var location = this._getLocation();
- if (!this._attemptChar(charCode)) {
- throw this._createError(unexpectedCharacterErrorMsg(this.peek), location);
- }
- };
- _HtmlTokenizer.prototype._attemptChars = function (chars) {
- for (var i = 0; i < chars.length; i++) {
- if (!this._attemptChar(lang_1.StringWrapper.charCodeAt(chars, i))) {
- return false;
- }
- }
- return true;
- };
- _HtmlTokenizer.prototype._requireChars = function (chars) {
- var location = this._getLocation();
- if (!this._attemptChars(chars)) {
- throw this._createError(unexpectedCharacterErrorMsg(this.peek), location);
- }
- };
- _HtmlTokenizer.prototype._attemptUntilFn = function (predicate) {
- while (!predicate(this.peek)) {
- this._advance();
- }
- };
- _HtmlTokenizer.prototype._requireUntilFn = function (predicate, len) {
- var start = this._getLocation();
- this._attemptUntilFn(predicate);
- if (this.index - start.offset < len) {
- throw this._createError(unexpectedCharacterErrorMsg(this.peek), start);
- }
- };
- _HtmlTokenizer.prototype._attemptUntilChar = function (char) {
- while (this.peek !== char) {
- this._advance();
- }
- };
- _HtmlTokenizer.prototype._readChar = function (decodeEntities) {
- if (decodeEntities && this.peek === $AMPERSAND) {
- return this._decodeEntity();
- }
- else {
- var index = this.index;
- this._advance();
- return this.input[index];
- }
- };
- _HtmlTokenizer.prototype._decodeEntity = function () {
- var start = this._getLocation();
- this._advance();
- if (this._attemptChar($HASH)) {
- var isHex = this._attemptChar($x);
- var numberStart = this._getLocation().offset;
- this._attemptUntilFn(isDigitEntityEnd);
- if (this.peek != $SEMICOLON) {
- throw this._createError(unexpectedCharacterErrorMsg(this.peek), this._getLocation());
- }
- this._advance();
- var strNum = this.input.substring(numberStart, this.index - 1);
- try {
- var charCode = lang_1.NumberWrapper.parseInt(strNum, isHex ? 16 : 10);
- return lang_1.StringWrapper.fromCharCode(charCode);
- }
- catch (e) {
- var entity = this.input.substring(start.offset + 1, this.index - 1);
- throw this._createError(unknownEntityErrorMsg(entity), start);
- }
- }
- else {
- var startPosition = this._savePosition();
- this._attemptUntilFn(isNamedEntityEnd);
- if (this.peek != $SEMICOLON) {
- this._restorePosition(startPosition);
- return '&';
- }
- this._advance();
- var name_1 = this.input.substring(start.offset + 1, this.index - 1);
- var char = html_tags_1.NAMED_ENTITIES[name_1];
- if (lang_1.isBlank(char)) {
- throw this._createError(unknownEntityErrorMsg(name_1), start);
- }
- return char;
- }
- };
- _HtmlTokenizer.prototype._consumeRawText = function (decodeEntities, firstCharOfEnd, attemptEndRest) {
- var tagCloseStart;
- var textStart = this._getLocation();
- this._beginToken(decodeEntities ? HtmlTokenType.ESCAPABLE_RAW_TEXT : HtmlTokenType.RAW_TEXT, textStart);
- var parts = [];
- while (true) {
- tagCloseStart = this._getLocation();
- if (this._attemptChar(firstCharOfEnd) && attemptEndRest()) {
- break;
- }
- if (this.index > tagCloseStart.offset) {
- parts.push(this.input.substring(tagCloseStart.offset, this.index));
- }
- while (this.peek !== firstCharOfEnd) {
- parts.push(this._readChar(decodeEntities));
- }
- }
- return this._endToken([this._processCarriageReturns(parts.join(''))], tagCloseStart);
- };
- _HtmlTokenizer.prototype._consumeComment = function (start) {
- var _this = this;
- this._beginToken(HtmlTokenType.COMMENT_START, start);
- this._requireChar($MINUS);
- this._endToken([]);
- var textToken = this._consumeRawText(false, $MINUS, function () { return _this._attemptChars('->'); });
- this._beginToken(HtmlTokenType.COMMENT_END, textToken.sourceSpan.end);
- this._endToken([]);
- };
- _HtmlTokenizer.prototype._consumeCdata = function (start) {
- var _this = this;
- this._beginToken(HtmlTokenType.CDATA_START, start);
- this._requireChars('cdata[');
- this._endToken([]);
- var textToken = this._consumeRawText(false, $RBRACKET, function () { return _this._attemptChars(']>'); });
- this._beginToken(HtmlTokenType.CDATA_END, textToken.sourceSpan.end);
- this._endToken([]);
- };
- _HtmlTokenizer.prototype._consumeDocType = function (start) {
- this._beginToken(HtmlTokenType.DOC_TYPE, start);
- this._attemptUntilChar($GT);
- this._advance();
- this._endToken([this.input.substring(start.offset + 2, this.index - 1)]);
- };
- _HtmlTokenizer.prototype._consumePrefixAndName = function () {
- var nameOrPrefixStart = this.index;
- var prefix = null;
- while (this.peek !== $COLON && !isPrefixEnd(this.peek)) {
- this._advance();
- }
- var nameStart;
- if (this.peek === $COLON) {
- this._advance();
- prefix = this.input.substring(nameOrPrefixStart, this.index - 1);
- nameStart = this.index;
- }
- else {
- nameStart = nameOrPrefixStart;
- }
- this._requireUntilFn(isNameEnd, this.index === nameStart ? 1 : 0);
- var name = this.input.substring(nameStart, this.index);
- return [prefix, name];
- };
- _HtmlTokenizer.prototype._consumeTagOpen = function (start) {
- var savedPos = this._savePosition();
- var lowercaseTagName;
- try {
- if (!isAsciiLetter(this.peek)) {
- throw this._createError(unexpectedCharacterErrorMsg(this.peek), this._getLocation());
- }
- var nameStart = this.index;
- this._consumeTagOpenStart(start);
- lowercaseTagName = this.inputLowercase.substring(nameStart, this.index);
- this._attemptUntilFn(isNotWhitespace);
- while (this.peek !== $SLASH && this.peek !== $GT) {
- this._consumeAttributeName();
- this._attemptUntilFn(isNotWhitespace);
- if (this._attemptChar($EQ)) {
- this._attemptUntilFn(isNotWhitespace);
- this._consumeAttributeValue();
- }
- this._attemptUntilFn(isNotWhitespace);
- }
- this._consumeTagOpenEnd();
- }
- catch (e) {
- if (e instanceof ControlFlowError) {
- // When the start tag is invalid, assume we want a "<"
- this._restorePosition(savedPos);
- // Back to back text tokens are merged at the end
- this._beginToken(HtmlTokenType.TEXT, start);
- this._endToken(['<']);
- return;
- }
- throw e;
- }
- var contentTokenType = html_tags_1.getHtmlTagDefinition(lowercaseTagName).contentType;
- if (contentTokenType === html_tags_1.HtmlTagContentType.RAW_TEXT) {
- this._consumeRawTextWithTagClose(lowercaseTagName, false);
- }
- else if (contentTokenType === html_tags_1.HtmlTagContentType.ESCAPABLE_RAW_TEXT) {
- this._consumeRawTextWithTagClose(lowercaseTagName, true);
- }
- };
- _HtmlTokenizer.prototype._consumeRawTextWithTagClose = function (lowercaseTagName, decodeEntities) {
- var _this = this;
- var textToken = this._consumeRawText(decodeEntities, $LT, function () {
- if (!_this._attemptChar($SLASH))
- return false;
- _this._attemptUntilFn(isNotWhitespace);
- if (!_this._attemptChars(lowercaseTagName))
- return false;
- _this._attemptUntilFn(isNotWhitespace);
- if (!_this._attemptChar($GT))
- return false;
- return true;
- });
- this._beginToken(HtmlTokenType.TAG_CLOSE, textToken.sourceSpan.end);
- this._endToken([null, lowercaseTagName]);
- };
- _HtmlTokenizer.prototype._consumeTagOpenStart = function (start) {
- this._beginToken(HtmlTokenType.TAG_OPEN_START, start);
- var parts = this._consumePrefixAndName();
- this._endToken(parts);
- };
- _HtmlTokenizer.prototype._consumeAttributeName = function () {
- this._beginToken(HtmlTokenType.ATTR_NAME);
- var prefixAndName = this._consumePrefixAndName();
- this._endToken(prefixAndName);
- };
- _HtmlTokenizer.prototype._consumeAttributeValue = function () {
- this._beginToken(HtmlTokenType.ATTR_VALUE);
- var value;
- if (this.peek === $SQ || this.peek === $DQ) {
- var quoteChar = this.peek;
- this._advance();
- var parts = [];
- while (this.peek !== quoteChar) {
- parts.push(this._readChar(true));
- }
- value = parts.join('');
- this._advance();
- }
- else {
- var valueStart = this.index;
- this._requireUntilFn(isNameEnd, 1);
- value = this.input.substring(valueStart, this.index);
- }
- this._endToken([this._processCarriageReturns(value)]);
- };
- _HtmlTokenizer.prototype._consumeTagOpenEnd = function () {
- var tokenType = this._attemptChar($SLASH) ? HtmlTokenType.TAG_OPEN_END_VOID : HtmlTokenType.TAG_OPEN_END;
- this._beginToken(tokenType);
- this._requireChar($GT);
- this._endToken([]);
- };
- _HtmlTokenizer.prototype._consumeTagClose = function (start) {
- this._beginToken(HtmlTokenType.TAG_CLOSE, start);
- this._attemptUntilFn(isNotWhitespace);
- var prefixAndName;
- prefixAndName = this._consumePrefixAndName();
- this._attemptUntilFn(isNotWhitespace);
- this._requireChar($GT);
- this._endToken(prefixAndName);
- };
- _HtmlTokenizer.prototype._consumeText = function () {
- var start = this._getLocation();
- this._beginToken(HtmlTokenType.TEXT, start);
- var parts = [this._readChar(true)];
- while (!isTextEnd(this.peek)) {
- parts.push(this._readChar(true));
- }
- this._endToken([this._processCarriageReturns(parts.join(''))]);
- };
- _HtmlTokenizer.prototype._savePosition = function () {
- return [this.peek, this.index, this.column, this.line, this.tokens.length];
- };
- _HtmlTokenizer.prototype._restorePosition = function (position) {
- this.peek = position[0];
- this.index = position[1];
- this.column = position[2];
- this.line = position[3];
- var nbTokens = position[4];
- if (nbTokens < this.tokens.length) {
- // remove any extra tokens
- this.tokens = collection_1.ListWrapper.slice(this.tokens, 0, nbTokens);
- }
- };
- return _HtmlTokenizer;
- })();
- function isNotWhitespace(code) {
- return !isWhitespace(code) || code === $EOF;
- }
- function isWhitespace(code) {
- return (code >= $TAB && code <= $SPACE) || (code === $NBSP);
- }
- function isNameEnd(code) {
- return isWhitespace(code) || code === $GT || code === $SLASH || code === $SQ || code === $DQ ||
- code === $EQ;
- }
- function isPrefixEnd(code) {
- return (code < $a || $z < code) && (code < $A || $Z < code) && (code < $0 || code > $9);
- }
- function isDigitEntityEnd(code) {
- return code == $SEMICOLON || code == $EOF || !isAsciiHexDigit(code);
- }
- function isNamedEntityEnd(code) {
- return code == $SEMICOLON || code == $EOF || !isAsciiLetter(code);
- }
- function isTextEnd(code) {
- return code === $LT || code === $EOF;
- }
- function isAsciiLetter(code) {
- return code >= $a && code <= $z;
- }
- function isAsciiHexDigit(code) {
- return code >= $a && code <= $f || code >= $0 && code <= $9;
- }
- function mergeTextTokens(srcTokens) {
- var dstTokens = [];
- var lastDstToken;
- for (var i = 0; i < srcTokens.length; i++) {
- var token = srcTokens[i];
- if (lang_1.isPresent(lastDstToken) && lastDstToken.type == HtmlTokenType.TEXT &&
- token.type == HtmlTokenType.TEXT) {
- lastDstToken.parts[0] += token.parts[0];
- lastDstToken.sourceSpan.end = token.sourceSpan.end;
- }
- else {
- lastDstToken = token;
- dstTokens.push(lastDstToken);
- }
- }
- return dstTokens;
- }
- /***/ },
- /* 171 */
- /***/ function(module, exports) {
- var ParseLocation = (function () {
- function ParseLocation(file, offset, line, col) {
- this.file = file;
- this.offset = offset;
- this.line = line;
- this.col = col;
- }
- ParseLocation.prototype.toString = function () { return this.file.url + "@" + this.line + ":" + this.col; };
- return ParseLocation;
- })();
- exports.ParseLocation = ParseLocation;
- var ParseSourceFile = (function () {
- function ParseSourceFile(content, url) {
- this.content = content;
- this.url = url;
- }
- return ParseSourceFile;
- })();
- exports.ParseSourceFile = ParseSourceFile;
- var ParseError = (function () {
- function ParseError(location, msg) {
- this.location = location;
- this.msg = msg;
- }
- ParseError.prototype.toString = function () {
- var source = this.location.file.content;
- var ctxStart = this.location.offset;
- if (ctxStart > source.length - 1) {
- ctxStart = source.length - 1;
- }
- var ctxEnd = ctxStart;
- var ctxLen = 0;
- var ctxLines = 0;
- while (ctxLen < 100 && ctxStart > 0) {
- ctxStart--;
- ctxLen++;
- if (source[ctxStart] == "\n") {
- if (++ctxLines == 3) {
- break;
- }
- }
- }
- ctxLen = 0;
- ctxLines = 0;
- while (ctxLen < 100 && ctxEnd < source.length - 1) {
- ctxEnd++;
- ctxLen++;
- if (source[ctxEnd] == "\n") {
- if (++ctxLines == 3) {
- break;
- }
- }
- }
- var context = source.substring(ctxStart, this.location.offset) + '[ERROR ->]' +
- source.substring(this.location.offset, ctxEnd + 1);
- return this.msg + " (\"" + context + "\"): " + this.location;
- };
- return ParseError;
- })();
- exports.ParseError = ParseError;
- var ParseSourceSpan = (function () {
- function ParseSourceSpan(start, end) {
- this.start = start;
- this.end = end;
- }
- ParseSourceSpan.prototype.toString = function () {
- return this.start.file.content.substring(this.start.offset, this.end.offset);
- };
- return ParseSourceSpan;
- })();
- exports.ParseSourceSpan = ParseSourceSpan;
- /***/ },
- /* 172 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- // see http://www.w3.org/TR/html51/syntax.html#named-character-references
- // see https://html.spec.whatwg.org/multipage/entities.json
- // This list is not exhaustive to keep the compiler footprint low.
- // The `{` / `ƫ` syntax should be used when the named character reference does not exist.
- exports.NAMED_ENTITIES = lang_1.CONST_EXPR({
- 'Aacute': '\u00C1',
- 'aacute': '\u00E1',
- 'Acirc': '\u00C2',
- 'acirc': '\u00E2',
- 'acute': '\u00B4',
- 'AElig': '\u00C6',
- 'aelig': '\u00E6',
- 'Agrave': '\u00C0',
- 'agrave': '\u00E0',
- 'alefsym': '\u2135',
- 'Alpha': '\u0391',
- 'alpha': '\u03B1',
- 'amp': '&',
- 'and': '\u2227',
- 'ang': '\u2220',
- 'apos': '\u0027',
- 'Aring': '\u00C5',
- 'aring': '\u00E5',
- 'asymp': '\u2248',
- 'Atilde': '\u00C3',
- 'atilde': '\u00E3',
- 'Auml': '\u00C4',
- 'auml': '\u00E4',
- 'bdquo': '\u201E',
- 'Beta': '\u0392',
- 'beta': '\u03B2',
- 'brvbar': '\u00A6',
- 'bull': '\u2022',
- 'cap': '\u2229',
- 'Ccedil': '\u00C7',
- 'ccedil': '\u00E7',
- 'cedil': '\u00B8',
- 'cent': '\u00A2',
- 'Chi': '\u03A7',
- 'chi': '\u03C7',
- 'circ': '\u02C6',
- 'clubs': '\u2663',
- 'cong': '\u2245',
- 'copy': '\u00A9',
- 'crarr': '\u21B5',
- 'cup': '\u222A',
- 'curren': '\u00A4',
- 'dagger': '\u2020',
- 'Dagger': '\u2021',
- 'darr': '\u2193',
- 'dArr': '\u21D3',
- 'deg': '\u00B0',
- 'Delta': '\u0394',
- 'delta': '\u03B4',
- 'diams': '\u2666',
- 'divide': '\u00F7',
- 'Eacute': '\u00C9',
- 'eacute': '\u00E9',
- 'Ecirc': '\u00CA',
- 'ecirc': '\u00EA',
- 'Egrave': '\u00C8',
- 'egrave': '\u00E8',
- 'empty': '\u2205',
- 'emsp': '\u2003',
- 'ensp': '\u2002',
- 'Epsilon': '\u0395',
- 'epsilon': '\u03B5',
- 'equiv': '\u2261',
- 'Eta': '\u0397',
- 'eta': '\u03B7',
- 'ETH': '\u00D0',
- 'eth': '\u00F0',
- 'Euml': '\u00CB',
- 'euml': '\u00EB',
- 'euro': '\u20AC',
- 'exist': '\u2203',
- 'fnof': '\u0192',
- 'forall': '\u2200',
- 'frac12': '\u00BD',
- 'frac14': '\u00BC',
- 'frac34': '\u00BE',
- 'frasl': '\u2044',
- 'Gamma': '\u0393',
- 'gamma': '\u03B3',
- 'ge': '\u2265',
- 'gt': '>',
- 'harr': '\u2194',
- 'hArr': '\u21D4',
- 'hearts': '\u2665',
- 'hellip': '\u2026',
- 'Iacute': '\u00CD',
- 'iacute': '\u00ED',
- 'Icirc': '\u00CE',
- 'icirc': '\u00EE',
- 'iexcl': '\u00A1',
- 'Igrave': '\u00CC',
- 'igrave': '\u00EC',
- 'image': '\u2111',
- 'infin': '\u221E',
- 'int': '\u222B',
- 'Iota': '\u0399',
- 'iota': '\u03B9',
- 'iquest': '\u00BF',
- 'isin': '\u2208',
- 'Iuml': '\u00CF',
- 'iuml': '\u00EF',
- 'Kappa': '\u039A',
- 'kappa': '\u03BA',
- 'Lambda': '\u039B',
- 'lambda': '\u03BB',
- 'lang': '\u27E8',
- 'laquo': '\u00AB',
- 'larr': '\u2190',
- 'lArr': '\u21D0',
- 'lceil': '\u2308',
- 'ldquo': '\u201C',
- 'le': '\u2264',
- 'lfloor': '\u230A',
- 'lowast': '\u2217',
- 'loz': '\u25CA',
- 'lrm': '\u200E',
- 'lsaquo': '\u2039',
- 'lsquo': '\u2018',
- 'lt': '<',
- 'macr': '\u00AF',
- 'mdash': '\u2014',
- 'micro': '\u00B5',
- 'middot': '\u00B7',
- 'minus': '\u2212',
- 'Mu': '\u039C',
- 'mu': '\u03BC',
- 'nabla': '\u2207',
- 'nbsp': '\u00A0',
- 'ndash': '\u2013',
- 'ne': '\u2260',
- 'ni': '\u220B',
- 'not': '\u00AC',
- 'notin': '\u2209',
- 'nsub': '\u2284',
- 'Ntilde': '\u00D1',
- 'ntilde': '\u00F1',
- 'Nu': '\u039D',
- 'nu': '\u03BD',
- 'Oacute': '\u00D3',
- 'oacute': '\u00F3',
- 'Ocirc': '\u00D4',
- 'ocirc': '\u00F4',
- 'OElig': '\u0152',
- 'oelig': '\u0153',
- 'Ograve': '\u00D2',
- 'ograve': '\u00F2',
- 'oline': '\u203E',
- 'Omega': '\u03A9',
- 'omega': '\u03C9',
- 'Omicron': '\u039F',
- 'omicron': '\u03BF',
- 'oplus': '\u2295',
- 'or': '\u2228',
- 'ordf': '\u00AA',
- 'ordm': '\u00BA',
- 'Oslash': '\u00D8',
- 'oslash': '\u00F8',
- 'Otilde': '\u00D5',
- 'otilde': '\u00F5',
- 'otimes': '\u2297',
- 'Ouml': '\u00D6',
- 'ouml': '\u00F6',
- 'para': '\u00B6',
- 'permil': '\u2030',
- 'perp': '\u22A5',
- 'Phi': '\u03A6',
- 'phi': '\u03C6',
- 'Pi': '\u03A0',
- 'pi': '\u03C0',
- 'piv': '\u03D6',
- 'plusmn': '\u00B1',
- 'pound': '\u00A3',
- 'prime': '\u2032',
- 'Prime': '\u2033',
- 'prod': '\u220F',
- 'prop': '\u221D',
- 'Psi': '\u03A8',
- 'psi': '\u03C8',
- 'quot': '\u0022',
- 'radic': '\u221A',
- 'rang': '\u27E9',
- 'raquo': '\u00BB',
- 'rarr': '\u2192',
- 'rArr': '\u21D2',
- 'rceil': '\u2309',
- 'rdquo': '\u201D',
- 'real': '\u211C',
- 'reg': '\u00AE',
- 'rfloor': '\u230B',
- 'Rho': '\u03A1',
- 'rho': '\u03C1',
- 'rlm': '\u200F',
- 'rsaquo': '\u203A',
- 'rsquo': '\u2019',
- 'sbquo': '\u201A',
- 'Scaron': '\u0160',
- 'scaron': '\u0161',
- 'sdot': '\u22C5',
- 'sect': '\u00A7',
- 'shy': '\u00AD',
- 'Sigma': '\u03A3',
- 'sigma': '\u03C3',
- 'sigmaf': '\u03C2',
- 'sim': '\u223C',
- 'spades': '\u2660',
- 'sub': '\u2282',
- 'sube': '\u2286',
- 'sum': '\u2211',
- 'sup': '\u2283',
- 'sup1': '\u00B9',
- 'sup2': '\u00B2',
- 'sup3': '\u00B3',
- 'supe': '\u2287',
- 'szlig': '\u00DF',
- 'Tau': '\u03A4',
- 'tau': '\u03C4',
- 'there4': '\u2234',
- 'Theta': '\u0398',
- 'theta': '\u03B8',
- 'thetasym': '\u03D1',
- 'thinsp': '\u2009',
- 'THORN': '\u00DE',
- 'thorn': '\u00FE',
- 'tilde': '\u02DC',
- 'times': '\u00D7',
- 'trade': '\u2122',
- 'Uacute': '\u00DA',
- 'uacute': '\u00FA',
- 'uarr': '\u2191',
- 'uArr': '\u21D1',
- 'Ucirc': '\u00DB',
- 'ucirc': '\u00FB',
- 'Ugrave': '\u00D9',
- 'ugrave': '\u00F9',
- 'uml': '\u00A8',
- 'upsih': '\u03D2',
- 'Upsilon': '\u03A5',
- 'upsilon': '\u03C5',
- 'Uuml': '\u00DC',
- 'uuml': '\u00FC',
- 'weierp': '\u2118',
- 'Xi': '\u039E',
- 'xi': '\u03BE',
- 'Yacute': '\u00DD',
- 'yacute': '\u00FD',
- 'yen': '\u00A5',
- 'yuml': '\u00FF',
- 'Yuml': '\u0178',
- 'Zeta': '\u0396',
- 'zeta': '\u03B6',
- 'zwj': '\u200D',
- 'zwnj': '\u200C',
- });
- (function (HtmlTagContentType) {
- HtmlTagContentType[HtmlTagContentType["RAW_TEXT"] = 0] = "RAW_TEXT";
- HtmlTagContentType[HtmlTagContentType["ESCAPABLE_RAW_TEXT"] = 1] = "ESCAPABLE_RAW_TEXT";
- HtmlTagContentType[HtmlTagContentType["PARSABLE_DATA"] = 2] = "PARSABLE_DATA";
- })(exports.HtmlTagContentType || (exports.HtmlTagContentType = {}));
- var HtmlTagContentType = exports.HtmlTagContentType;
- var HtmlTagDefinition = (function () {
- function HtmlTagDefinition(_a) {
- var _this = this;
- var _b = _a === void 0 ? {} : _a, closedByChildren = _b.closedByChildren, requiredParents = _b.requiredParents, implicitNamespacePrefix = _b.implicitNamespacePrefix, contentType = _b.contentType, closedByParent = _b.closedByParent, isVoid = _b.isVoid, ignoreFirstLf = _b.ignoreFirstLf;
- this.closedByChildren = {};
- this.closedByParent = false;
- if (lang_1.isPresent(closedByChildren) && closedByChildren.length > 0) {
- closedByChildren.forEach(function (tagName) { return _this.closedByChildren[tagName] = true; });
- }
- this.isVoid = lang_1.normalizeBool(isVoid);
- this.closedByParent = lang_1.normalizeBool(closedByParent) || this.isVoid;
- if (lang_1.isPresent(requiredParents) && requiredParents.length > 0) {
- this.requiredParents = {};
- this.parentToAdd = requiredParents[0];
- requiredParents.forEach(function (tagName) { return _this.requiredParents[tagName] = true; });
- }
- this.implicitNamespacePrefix = implicitNamespacePrefix;
- this.contentType = lang_1.isPresent(contentType) ? contentType : HtmlTagContentType.PARSABLE_DATA;
- this.ignoreFirstLf = lang_1.normalizeBool(ignoreFirstLf);
- }
- HtmlTagDefinition.prototype.requireExtraParent = function (currentParent) {
- if (lang_1.isBlank(this.requiredParents)) {
- return false;
- }
- if (lang_1.isBlank(currentParent)) {
- return true;
- }
- var lcParent = currentParent.toLowerCase();
- return this.requiredParents[lcParent] != true && lcParent != 'template';
- };
- HtmlTagDefinition.prototype.isClosedByChild = function (name) {
- return this.isVoid || lang_1.normalizeBool(this.closedByChildren[name.toLowerCase()]);
- };
- return HtmlTagDefinition;
- })();
- exports.HtmlTagDefinition = HtmlTagDefinition;
- // see http://www.w3.org/TR/html51/syntax.html#optional-tags
- // This implementation does not fully conform to the HTML5 spec.
- var TAG_DEFINITIONS = {
- 'area': new HtmlTagDefinition({ isVoid: true }),
- 'embed': new HtmlTagDefinition({ isVoid: true }),
- 'link': new HtmlTagDefinition({ isVoid: true }),
- 'img': new HtmlTagDefinition({ isVoid: true }),
- 'input': new HtmlTagDefinition({ isVoid: true }),
- 'param': new HtmlTagDefinition({ isVoid: true }),
- 'hr': new HtmlTagDefinition({ isVoid: true }),
- 'br': new HtmlTagDefinition({ isVoid: true }),
- 'source': new HtmlTagDefinition({ isVoid: true }),
- 'track': new HtmlTagDefinition({ isVoid: true }),
- 'wbr': new HtmlTagDefinition({ isVoid: true }),
- 'p': new HtmlTagDefinition({
- closedByChildren: [
- 'address',
- 'article',
- 'aside',
- 'blockquote',
- 'div',
- 'dl',
- 'fieldset',
- 'footer',
- 'form',
- 'h1',
- 'h2',
- 'h3',
- 'h4',
- 'h5',
- 'h6',
- 'header',
- 'hgroup',
- 'hr',
- 'main',
- 'nav',
- 'ol',
- 'p',
- 'pre',
- 'section',
- 'table',
- 'ul'
- ],
- closedByParent: true
- }),
- 'thead': new HtmlTagDefinition({ closedByChildren: ['tbody', 'tfoot'] }),
- 'tbody': new HtmlTagDefinition({ closedByChildren: ['tbody', 'tfoot'], closedByParent: true }),
- 'tfoot': new HtmlTagDefinition({ closedByChildren: ['tbody'], closedByParent: true }),
- 'tr': new HtmlTagDefinition({
- closedByChildren: ['tr'],
- requiredParents: ['tbody', 'tfoot', 'thead'],
- closedByParent: true
- }),
- 'td': new HtmlTagDefinition({ closedByChildren: ['td', 'th'], closedByParent: true }),
- 'th': new HtmlTagDefinition({ closedByChildren: ['td', 'th'], closedByParent: true }),
- 'col': new HtmlTagDefinition({ requiredParents: ['colgroup'], isVoid: true }),
- 'svg': new HtmlTagDefinition({ implicitNamespacePrefix: 'svg' }),
- 'math': new HtmlTagDefinition({ implicitNamespacePrefix: 'math' }),
- 'li': new HtmlTagDefinition({ closedByChildren: ['li'], closedByParent: true }),
- 'dt': new HtmlTagDefinition({ closedByChildren: ['dt', 'dd'] }),
- 'dd': new HtmlTagDefinition({ closedByChildren: ['dt', 'dd'], closedByParent: true }),
- 'rb': new HtmlTagDefinition({ closedByChildren: ['rb', 'rt', 'rtc', 'rp'], closedByParent: true }),
- 'rt': new HtmlTagDefinition({ closedByChildren: ['rb', 'rt', 'rtc', 'rp'], closedByParent: true }),
- 'rtc': new HtmlTagDefinition({ closedByChildren: ['rb', 'rtc', 'rp'], closedByParent: true }),
- 'rp': new HtmlTagDefinition({ closedByChildren: ['rb', 'rt', 'rtc', 'rp'], closedByParent: true }),
- 'optgroup': new HtmlTagDefinition({ closedByChildren: ['optgroup'], closedByParent: true }),
- 'option': new HtmlTagDefinition({ closedByChildren: ['option', 'optgroup'], closedByParent: true }),
- 'pre': new HtmlTagDefinition({ ignoreFirstLf: true }),
- 'listing': new HtmlTagDefinition({ ignoreFirstLf: true }),
- 'style': new HtmlTagDefinition({ contentType: HtmlTagContentType.RAW_TEXT }),
- 'script': new HtmlTagDefinition({ contentType: HtmlTagContentType.RAW_TEXT }),
- 'title': new HtmlTagDefinition({ contentType: HtmlTagContentType.ESCAPABLE_RAW_TEXT }),
- 'textarea': new HtmlTagDefinition({ contentType: HtmlTagContentType.ESCAPABLE_RAW_TEXT, ignoreFirstLf: true }),
- };
- var DEFAULT_TAG_DEFINITION = new HtmlTagDefinition();
- function getHtmlTagDefinition(tagName) {
- var result = TAG_DEFINITIONS[tagName.toLowerCase()];
- return lang_1.isPresent(result) ? result : DEFAULT_TAG_DEFINITION;
- }
- exports.getHtmlTagDefinition = getHtmlTagDefinition;
- var NS_PREFIX_RE = /^@([^:]+):(.+)/g;
- function splitNsName(elementName) {
- if (elementName[0] != '@') {
- return [null, elementName];
- }
- var match = lang_1.RegExpWrapper.firstMatch(NS_PREFIX_RE, elementName);
- return [match[1], match[2]];
- }
- exports.splitNsName = splitNsName;
- function getNsPrefix(elementName) {
- return splitNsName(elementName)[0];
- }
- exports.getNsPrefix = getNsPrefix;
- /***/ },
- /* 173 */
- /***/ function(module, exports) {
- var ElementSchemaRegistry = (function () {
- function ElementSchemaRegistry() {
- }
- ElementSchemaRegistry.prototype.hasProperty = function (tagName, propName) { return true; };
- ElementSchemaRegistry.prototype.getMappedPropName = function (propName) { return propName; };
- return ElementSchemaRegistry;
- })();
- exports.ElementSchemaRegistry = ElementSchemaRegistry;
- /***/ },
- /* 174 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var html_tags_1 = __webpack_require__(172);
- var NG_CONTENT_SELECT_ATTR = 'select';
- var NG_CONTENT_ELEMENT = 'ng-content';
- var LINK_ELEMENT = 'link';
- var LINK_STYLE_REL_ATTR = 'rel';
- var LINK_STYLE_HREF_ATTR = 'href';
- var LINK_STYLE_REL_VALUE = 'stylesheet';
- var STYLE_ELEMENT = 'style';
- var SCRIPT_ELEMENT = 'script';
- var NG_NON_BINDABLE_ATTR = 'ngNonBindable';
- function preparseElement(ast) {
- var selectAttr = null;
- var hrefAttr = null;
- var relAttr = null;
- var nonBindable = false;
- ast.attrs.forEach(function (attr) {
- var lcAttrName = attr.name.toLowerCase();
- if (lcAttrName == NG_CONTENT_SELECT_ATTR) {
- selectAttr = attr.value;
- }
- else if (lcAttrName == LINK_STYLE_HREF_ATTR) {
- hrefAttr = attr.value;
- }
- else if (lcAttrName == LINK_STYLE_REL_ATTR) {
- relAttr = attr.value;
- }
- else if (attr.name == NG_NON_BINDABLE_ATTR) {
- nonBindable = true;
- }
- });
- selectAttr = normalizeNgContentSelect(selectAttr);
- var nodeName = ast.name.toLowerCase();
- var type = PreparsedElementType.OTHER;
- if (html_tags_1.splitNsName(nodeName)[1] == NG_CONTENT_ELEMENT) {
- type = PreparsedElementType.NG_CONTENT;
- }
- else if (nodeName == STYLE_ELEMENT) {
- type = PreparsedElementType.STYLE;
- }
- else if (nodeName == SCRIPT_ELEMENT) {
- type = PreparsedElementType.SCRIPT;
- }
- else if (nodeName == LINK_ELEMENT && relAttr == LINK_STYLE_REL_VALUE) {
- type = PreparsedElementType.STYLESHEET;
- }
- return new PreparsedElement(type, selectAttr, hrefAttr, nonBindable);
- }
- exports.preparseElement = preparseElement;
- (function (PreparsedElementType) {
- PreparsedElementType[PreparsedElementType["NG_CONTENT"] = 0] = "NG_CONTENT";
- PreparsedElementType[PreparsedElementType["STYLE"] = 1] = "STYLE";
- PreparsedElementType[PreparsedElementType["STYLESHEET"] = 2] = "STYLESHEET";
- PreparsedElementType[PreparsedElementType["SCRIPT"] = 3] = "SCRIPT";
- PreparsedElementType[PreparsedElementType["OTHER"] = 4] = "OTHER";
- })(exports.PreparsedElementType || (exports.PreparsedElementType = {}));
- var PreparsedElementType = exports.PreparsedElementType;
- var PreparsedElement = (function () {
- function PreparsedElement(type, selectAttr, hrefAttr, nonBindable) {
- this.type = type;
- this.selectAttr = selectAttr;
- this.hrefAttr = hrefAttr;
- this.nonBindable = nonBindable;
- }
- return PreparsedElement;
- })();
- exports.PreparsedElement = PreparsedElement;
- function normalizeNgContentSelect(selectAttr) {
- if (lang_1.isBlank(selectAttr) || selectAttr.length === 0) {
- return '*';
- }
- return selectAttr;
- }
- /***/ },
- /* 175 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var directive_metadata_1 = __webpack_require__(153);
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var async_1 = __webpack_require__(60);
- var xhr_1 = __webpack_require__(149);
- var url_resolver_1 = __webpack_require__(148);
- var style_url_resolver_1 = __webpack_require__(163);
- var di_1 = __webpack_require__(6);
- var view_1 = __webpack_require__(56);
- var html_ast_1 = __webpack_require__(169);
- var html_parser_1 = __webpack_require__(168);
- var template_preparser_1 = __webpack_require__(174);
- var TemplateNormalizer = (function () {
- function TemplateNormalizer(_xhr, _urlResolver, _htmlParser) {
- this._xhr = _xhr;
- this._urlResolver = _urlResolver;
- this._htmlParser = _htmlParser;
- }
- TemplateNormalizer.prototype.normalizeTemplate = function (directiveType, template) {
- var _this = this;
- if (lang_1.isPresent(template.template)) {
- return async_1.PromiseWrapper.resolve(this.normalizeLoadedTemplate(directiveType, template, template.template, directiveType.moduleUrl));
- }
- else if (lang_1.isPresent(template.templateUrl)) {
- var sourceAbsUrl = this._urlResolver.resolve(directiveType.moduleUrl, template.templateUrl);
- return this._xhr.get(sourceAbsUrl)
- .then(function (templateContent) { return _this.normalizeLoadedTemplate(directiveType, template, templateContent, sourceAbsUrl); });
- }
- else {
- throw new exceptions_1.BaseException("No template specified for component " + directiveType.name);
- }
- };
- TemplateNormalizer.prototype.normalizeLoadedTemplate = function (directiveType, templateMeta, template, templateAbsUrl) {
- var _this = this;
- var rootNodesAndErrors = this._htmlParser.parse(template, directiveType.name);
- if (rootNodesAndErrors.errors.length > 0) {
- var errorString = rootNodesAndErrors.errors.join('\n');
- throw new exceptions_1.BaseException("Template parse errors:\n" + errorString);
- }
- var visitor = new TemplatePreparseVisitor();
- html_ast_1.htmlVisitAll(visitor, rootNodesAndErrors.rootNodes);
- var allStyles = templateMeta.styles.concat(visitor.styles);
- var allStyleAbsUrls = visitor.styleUrls.filter(style_url_resolver_1.isStyleUrlResolvable)
- .map(function (url) { return _this._urlResolver.resolve(templateAbsUrl, url); })
- .concat(templateMeta.styleUrls.filter(style_url_resolver_1.isStyleUrlResolvable)
- .map(function (url) { return _this._urlResolver.resolve(directiveType.moduleUrl, url); }));
- var allResolvedStyles = allStyles.map(function (style) {
- var styleWithImports = style_url_resolver_1.extractStyleUrls(_this._urlResolver, templateAbsUrl, style);
- styleWithImports.styleUrls.forEach(function (styleUrl) { return allStyleAbsUrls.push(styleUrl); });
- return styleWithImports.style;
- });
- var encapsulation = templateMeta.encapsulation;
- if (encapsulation === view_1.ViewEncapsulation.Emulated && allResolvedStyles.length === 0 &&
- allStyleAbsUrls.length === 0) {
- encapsulation = view_1.ViewEncapsulation.None;
- }
- return new directive_metadata_1.CompileTemplateMetadata({
- encapsulation: encapsulation,
- template: template,
- templateUrl: templateAbsUrl,
- styles: allResolvedStyles,
- styleUrls: allStyleAbsUrls,
- ngContentSelectors: visitor.ngContentSelectors
- });
- };
- TemplateNormalizer = __decorate([
- di_1.Injectable(),
- __metadata('design:paramtypes', [xhr_1.XHR, url_resolver_1.UrlResolver, html_parser_1.HtmlParser])
- ], TemplateNormalizer);
- return TemplateNormalizer;
- })();
- exports.TemplateNormalizer = TemplateNormalizer;
- var TemplatePreparseVisitor = (function () {
- function TemplatePreparseVisitor() {
- this.ngContentSelectors = [];
- this.styles = [];
- this.styleUrls = [];
- this.ngNonBindableStackCount = 0;
- }
- TemplatePreparseVisitor.prototype.visitElement = function (ast, context) {
- var preparsedElement = template_preparser_1.preparseElement(ast);
- switch (preparsedElement.type) {
- case template_preparser_1.PreparsedElementType.NG_CONTENT:
- if (this.ngNonBindableStackCount === 0) {
- this.ngContentSelectors.push(preparsedElement.selectAttr);
- }
- break;
- case template_preparser_1.PreparsedElementType.STYLE:
- var textContent = '';
- ast.children.forEach(function (child) {
- if (child instanceof html_ast_1.HtmlTextAst) {
- textContent += child.value;
- }
- });
- this.styles.push(textContent);
- break;
- case template_preparser_1.PreparsedElementType.STYLESHEET:
- this.styleUrls.push(preparsedElement.hrefAttr);
- break;
- }
- if (preparsedElement.nonBindable) {
- this.ngNonBindableStackCount++;
- }
- html_ast_1.htmlVisitAll(this, ast.children);
- if (preparsedElement.nonBindable) {
- this.ngNonBindableStackCount--;
- }
- return null;
- };
- TemplatePreparseVisitor.prototype.visitAttr = function (ast, context) { return null; };
- TemplatePreparseVisitor.prototype.visitText = function (ast, context) { return null; };
- return TemplatePreparseVisitor;
- })();
- /***/ },
- /* 176 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var __param = (this && this.__param) || function (paramIndex, decorator) {
- return function (target, key) { decorator(target, key, paramIndex); }
- };
- var di_1 = __webpack_require__(6);
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var cpl = __webpack_require__(153);
- var md = __webpack_require__(23);
- var directive_resolver_1 = __webpack_require__(92);
- var view_resolver_1 = __webpack_require__(93);
- var directive_lifecycle_reflector_1 = __webpack_require__(88);
- var interfaces_1 = __webpack_require__(89);
- var reflection_1 = __webpack_require__(16);
- var di_2 = __webpack_require__(6);
- var platform_directives_and_pipes_1 = __webpack_require__(95);
- var util_1 = __webpack_require__(155);
- var url_resolver_1 = __webpack_require__(148);
- var RuntimeMetadataResolver = (function () {
- function RuntimeMetadataResolver(_directiveResolver, _viewResolver, _platformDirectives) {
- this._directiveResolver = _directiveResolver;
- this._viewResolver = _viewResolver;
- this._platformDirectives = _platformDirectives;
- this._cache = new Map();
- }
- RuntimeMetadataResolver.prototype.getMetadata = function (directiveType) {
- var meta = this._cache.get(directiveType);
- if (lang_1.isBlank(meta)) {
- var dirMeta = this._directiveResolver.resolve(directiveType);
- var moduleUrl = null;
- var templateMeta = null;
- var changeDetectionStrategy = null;
- if (dirMeta instanceof md.ComponentMetadata) {
- var cmpMeta = dirMeta;
- moduleUrl = calcModuleUrl(directiveType, cmpMeta);
- var viewMeta = this._viewResolver.resolve(directiveType);
- templateMeta = new cpl.CompileTemplateMetadata({
- encapsulation: viewMeta.encapsulation,
- template: viewMeta.template,
- templateUrl: viewMeta.templateUrl,
- styles: viewMeta.styles,
- styleUrls: viewMeta.styleUrls
- });
- changeDetectionStrategy = cmpMeta.changeDetection;
- }
- meta = cpl.CompileDirectiveMetadata.create({
- selector: dirMeta.selector,
- exportAs: dirMeta.exportAs,
- isComponent: lang_1.isPresent(templateMeta),
- dynamicLoadable: true,
- type: new cpl.CompileTypeMetadata({ name: lang_1.stringify(directiveType), moduleUrl: moduleUrl, runtime: directiveType }),
- template: templateMeta,
- changeDetection: changeDetectionStrategy,
- inputs: dirMeta.inputs,
- outputs: dirMeta.outputs,
- host: dirMeta.host,
- lifecycleHooks: interfaces_1.LIFECYCLE_HOOKS_VALUES.filter(function (hook) { return directive_lifecycle_reflector_1.hasLifecycleHook(hook, directiveType); })
- });
- this._cache.set(directiveType, meta);
- }
- return meta;
- };
- RuntimeMetadataResolver.prototype.getViewDirectivesMetadata = function (component) {
- var _this = this;
- var view = this._viewResolver.resolve(component);
- var directives = flattenDirectives(view, this._platformDirectives);
- for (var i = 0; i < directives.length; i++) {
- if (!isValidDirective(directives[i])) {
- throw new exceptions_1.BaseException("Unexpected directive value '" + lang_1.stringify(directives[i]) + "' on the View of component '" + lang_1.stringify(component) + "'");
- }
- }
- return directives.map(function (type) { return _this.getMetadata(type); });
- };
- RuntimeMetadataResolver = __decorate([
- di_2.Injectable(),
- __param(2, di_2.Optional()),
- __param(2, di_2.Inject(platform_directives_and_pipes_1.PLATFORM_DIRECTIVES)),
- __metadata('design:paramtypes', [directive_resolver_1.DirectiveResolver, view_resolver_1.ViewResolver, Array])
- ], RuntimeMetadataResolver);
- return RuntimeMetadataResolver;
- })();
- exports.RuntimeMetadataResolver = RuntimeMetadataResolver;
- function flattenDirectives(view, platformDirectives) {
- var directives = [];
- if (lang_1.isPresent(platformDirectives)) {
- flattenArray(platformDirectives, directives);
- }
- if (lang_1.isPresent(view.directives)) {
- flattenArray(view.directives, directives);
- }
- return directives;
- }
- function flattenArray(tree, out) {
- for (var i = 0; i < tree.length; i++) {
- var item = di_1.resolveForwardRef(tree[i]);
- if (lang_1.isArray(item)) {
- flattenArray(item, out);
- }
- else {
- out.push(item);
- }
- }
- }
- function isValidDirective(value) {
- return lang_1.isPresent(value) && (value instanceof lang_1.Type);
- }
- function calcModuleUrl(type, cmpMetadata) {
- var moduleId = cmpMetadata.moduleId;
- if (lang_1.isPresent(moduleId)) {
- var scheme = url_resolver_1.getUrlScheme(moduleId);
- return lang_1.isPresent(scheme) && scheme.length > 0 ? moduleId :
- "package:" + moduleId + util_1.MODULE_SUFFIX;
- }
- else {
- return reflection_1.reflector.importUri(type);
- }
- }
- /***/ },
- /* 177 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var di_1 = __webpack_require__(6);
- var lang_1 = __webpack_require__(5);
- var collection_1 = __webpack_require__(12);
- var dom_adapter_1 = __webpack_require__(178);
- var html_tags_1 = __webpack_require__(172);
- var element_schema_registry_1 = __webpack_require__(173);
- var NAMESPACE_URIS = lang_1.CONST_EXPR({ 'xlink': 'http://www.w3.org/1999/xlink', 'svg': 'http://www.w3.org/2000/svg' });
- var DomElementSchemaRegistry = (function (_super) {
- __extends(DomElementSchemaRegistry, _super);
- function DomElementSchemaRegistry() {
- _super.apply(this, arguments);
- this._protoElements = new Map();
- }
- DomElementSchemaRegistry.prototype._getProtoElement = function (tagName) {
- var element = this._protoElements.get(tagName);
- if (lang_1.isBlank(element)) {
- var nsAndName = html_tags_1.splitNsName(tagName);
- element = lang_1.isPresent(nsAndName[0]) ?
- dom_adapter_1.DOM.createElementNS(NAMESPACE_URIS[nsAndName[0]], nsAndName[1]) :
- dom_adapter_1.DOM.createElement(nsAndName[1]);
- this._protoElements.set(tagName, element);
- }
- return element;
- };
- DomElementSchemaRegistry.prototype.hasProperty = function (tagName, propName) {
- if (tagName.indexOf('-') !== -1) {
- // can't tell now as we don't know which properties a custom element will get
- // once it is instantiated
- return true;
- }
- else {
- var elm = this._getProtoElement(tagName);
- return dom_adapter_1.DOM.hasProperty(elm, propName);
- }
- };
- DomElementSchemaRegistry.prototype.getMappedPropName = function (propName) {
- var mappedPropName = collection_1.StringMapWrapper.get(dom_adapter_1.DOM.attrToPropMap, propName);
- return lang_1.isPresent(mappedPropName) ? mappedPropName : propName;
- };
- DomElementSchemaRegistry = __decorate([
- di_1.Injectable(),
- __metadata('design:paramtypes', [])
- ], DomElementSchemaRegistry);
- return DomElementSchemaRegistry;
- })(element_schema_registry_1.ElementSchemaRegistry);
- exports.DomElementSchemaRegistry = DomElementSchemaRegistry;
- /***/ },
- /* 178 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- exports.DOM = null;
- function setRootDomAdapter(adapter) {
- if (lang_1.isBlank(exports.DOM)) {
- exports.DOM = adapter;
- }
- }
- exports.setRootDomAdapter = setRootDomAdapter;
- /* tslint:disable:requireParameterType */
- /**
- * Provides DOM operations in an environment-agnostic way.
- */
- var DomAdapter = (function () {
- function DomAdapter() {
- }
- return DomAdapter;
- })();
- exports.DomAdapter = DomAdapter;
- /***/ },
- /* 179 */
- /***/ function(module, exports, __webpack_require__) {
- var angular_entrypoint_1 = __webpack_require__(180);
- exports.AngularEntrypoint = angular_entrypoint_1.AngularEntrypoint;
- var browser_common_1 = __webpack_require__(181);
- exports.BROWSER_PROVIDERS = browser_common_1.BROWSER_PROVIDERS;
- exports.ELEMENT_PROBE_BINDINGS = browser_common_1.ELEMENT_PROBE_BINDINGS;
- exports.ELEMENT_PROBE_PROVIDERS = browser_common_1.ELEMENT_PROBE_PROVIDERS;
- exports.inspectNativeElement = browser_common_1.inspectNativeElement;
- exports.BrowserDomAdapter = browser_common_1.BrowserDomAdapter;
- exports.By = browser_common_1.By;
- exports.Title = browser_common_1.Title;
- exports.DOCUMENT = browser_common_1.DOCUMENT;
- exports.enableDebugTools = browser_common_1.enableDebugTools;
- exports.disableDebugTools = browser_common_1.disableDebugTools;
- var lang_1 = __webpack_require__(5);
- var browser_common_2 = __webpack_require__(181);
- var compiler_1 = __webpack_require__(147);
- var core_1 = __webpack_require__(2);
- var reflection_capabilities_1 = __webpack_require__(18);
- var xhr_impl_1 = __webpack_require__(199);
- var compiler_2 = __webpack_require__(147);
- var di_1 = __webpack_require__(6);
- /**
- * An array of providers that should be passed into `application()` when bootstrapping a component.
- */
- exports.BROWSER_APP_PROVIDERS = lang_1.CONST_EXPR([
- browser_common_2.BROWSER_APP_COMMON_PROVIDERS,
- compiler_1.COMPILER_PROVIDERS,
- new di_1.Provider(compiler_2.XHR, { useClass: xhr_impl_1.XHRImpl }),
- ]);
- /**
- * Bootstrapping for Angular applications.
- *
- * You instantiate an Angular application by explicitly specifying a component to use
- * as the root component for your application via the `bootstrap()` method.
- *
- * ## Simple Example
- *
- * Assuming this `index.html`:
- *
- * ```html
- * <html>
- * <!-- load Angular script tags here. -->
- * <body>
- * <my-app>loading...</my-app>
- * </body>
- * </html>
- * ```
- *
- * An application is bootstrapped inside an existing browser DOM, typically `index.html`.
- * Unlike Angular 1, Angular 2 does not compile/process providers in `index.html`. This is
- * mainly for security reasons, as well as architectural changes in Angular 2. This means
- * that `index.html` can safely be processed using server-side technologies such as
- * providers. Bindings can thus use double-curly `{{ syntax }}` without collision from
- * Angular 2 component double-curly `{{ syntax }}`.
- *
- * We can use this script code:
- *
- * {@example core/ts/bootstrap/bootstrap.ts region='bootstrap'}
- *
- * When the app developer invokes `bootstrap()` with the root component `MyApp` as its
- * argument, Angular performs the following tasks:
- *
- * 1. It uses the component's `selector` property to locate the DOM element which needs
- * to be upgraded into the angular component.
- * 2. It creates a new child injector (from the platform injector). Optionally, you can
- * also override the injector configuration for an app by invoking `bootstrap` with the
- * `componentInjectableBindings` argument.
- * 3. It creates a new `Zone` and connects it to the angular application's change detection
- * domain instance.
- * 4. It creates an emulated or shadow DOM on the selected component's host element and loads the
- * template into it.
- * 5. It instantiates the specified component.
- * 6. Finally, Angular performs change detection to apply the initial data providers for the
- * application.
- *
- *
- * ## Bootstrapping Multiple Applications
- *
- * When working within a browser window, there are many singleton resources: cookies, title,
- * location, and others. Angular services that represent these resources must likewise be
- * shared across all Angular applications that occupy the same browser window. For this
- * reason, Angular creates exactly one global platform object which stores all shared
- * services, and each angular application injector has the platform injector as its parent.
- *
- * Each application has its own private injector as well. When there are multiple
- * applications on a page, Angular treats each application injector's services as private
- * to that application.
- *
- * ## API
- *
- * - `appComponentType`: The root component which should act as the application. This is
- * a reference to a `Type` which is annotated with `@Component(...)`.
- * - `customProviders`: An additional set of providers that can be added to the
- * app injector to override default injection behavior.
- *
- * Returns a `Promise` of {@link ComponentRef}.
- */
- function bootstrap(appComponentType, customProviders) {
- core_1.reflector.reflectionCapabilities = new reflection_capabilities_1.ReflectionCapabilities();
- var appProviders = lang_1.isPresent(customProviders) ? [exports.BROWSER_APP_PROVIDERS, customProviders] : exports.BROWSER_APP_PROVIDERS;
- return core_1.platform(browser_common_2.BROWSER_PROVIDERS).application(appProviders).bootstrap(appComponentType);
- }
- exports.bootstrap = bootstrap;
- /***/ },
- /* 180 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var lang_1 = __webpack_require__(5);
- /**
- * Marks a function or method as an Angular 2 entrypoint. Only necessary in Dart code.
- *
- * The optional `name` parameter will be reflected in logs when the entry point is processed.
- *
- * See [the wiki][] for detailed documentation.
- * [the wiki]: https://github.com/angular/angular/wiki/Angular-2-Dart-Transformer#entry_points
- *
- * ## Example
- *
- * ```
- * @AngularEntrypoint("name-for-debug")
- * void main() {
- * bootstrap(MyComponent);
- * }
- * ```
- */
- var AngularEntrypoint = (function () {
- function AngularEntrypoint(name) {
- this.name = name;
- }
- AngularEntrypoint = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [String])
- ], AngularEntrypoint);
- return AngularEntrypoint;
- })();
- exports.AngularEntrypoint = AngularEntrypoint;
- /***/ },
- /* 181 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var di_1 = __webpack_require__(6);
- var core_1 = __webpack_require__(2);
- var common_1 = __webpack_require__(104);
- var testability_1 = __webpack_require__(68);
- var dom_adapter_1 = __webpack_require__(178);
- var dom_events_1 = __webpack_require__(182);
- var key_events_1 = __webpack_require__(184);
- var hammer_gestures_1 = __webpack_require__(185);
- var dom_tokens_1 = __webpack_require__(187);
- var dom_renderer_1 = __webpack_require__(188);
- var shared_styles_host_1 = __webpack_require__(196);
- var shared_styles_host_2 = __webpack_require__(196);
- var browser_details_1 = __webpack_require__(195);
- var animation_builder_1 = __webpack_require__(189);
- var browser_adapter_1 = __webpack_require__(197);
- var testability_2 = __webpack_require__(200);
- var wtf_init_1 = __webpack_require__(201);
- var event_manager_1 = __webpack_require__(183);
- var dom_tokens_2 = __webpack_require__(187);
- exports.DOCUMENT = dom_tokens_2.DOCUMENT;
- var title_1 = __webpack_require__(202);
- exports.Title = title_1.Title;
- var common_dom_1 = __webpack_require__(203);
- exports.DebugElementViewListener = common_dom_1.DebugElementViewListener;
- exports.ELEMENT_PROBE_PROVIDERS = common_dom_1.ELEMENT_PROBE_PROVIDERS;
- exports.ELEMENT_PROBE_BINDINGS = common_dom_1.ELEMENT_PROBE_BINDINGS;
- exports.inspectNativeElement = common_dom_1.inspectNativeElement;
- exports.By = common_dom_1.By;
- var browser_adapter_2 = __webpack_require__(197);
- exports.BrowserDomAdapter = browser_adapter_2.BrowserDomAdapter;
- var tools_1 = __webpack_require__(206);
- exports.enableDebugTools = tools_1.enableDebugTools;
- exports.disableDebugTools = tools_1.disableDebugTools;
- /**
- * A set of providers to initialize the Angular platform in a web browser.
- *
- * Used automatically by `bootstrap`, or can be passed to {@link platform}.
- */
- exports.BROWSER_PROVIDERS = lang_1.CONST_EXPR([
- core_1.PLATFORM_COMMON_PROVIDERS,
- new di_1.Provider(core_1.PLATFORM_INITIALIZER, { useValue: initDomAdapter, multi: true }),
- ]);
- function _exceptionHandler() {
- // !IS_DART is required because we must rethrow exceptions in JS,
- // but must not rethrow exceptions in Dart
- return new core_1.ExceptionHandler(dom_adapter_1.DOM, !lang_1.IS_DART);
- }
- function _document() {
- return dom_adapter_1.DOM.defaultDoc();
- }
- /**
- * A set of providers to initialize an Angular application in a web browser.
- *
- * Used automatically by `bootstrap`, or can be passed to {@link PlatformRef.application}.
- */
- exports.BROWSER_APP_COMMON_PROVIDERS = lang_1.CONST_EXPR([
- core_1.APPLICATION_COMMON_PROVIDERS,
- common_1.FORM_PROVIDERS,
- new di_1.Provider(core_1.PLATFORM_PIPES, { useValue: common_1.COMMON_PIPES, multi: true }),
- new di_1.Provider(core_1.PLATFORM_DIRECTIVES, { useValue: common_1.COMMON_DIRECTIVES, multi: true }),
- new di_1.Provider(core_1.ExceptionHandler, { useFactory: _exceptionHandler, deps: [] }),
- new di_1.Provider(dom_tokens_1.DOCUMENT, { useFactory: _document, deps: [] }),
- new di_1.Provider(event_manager_1.EVENT_MANAGER_PLUGINS, { useClass: dom_events_1.DomEventsPlugin, multi: true }),
- new di_1.Provider(event_manager_1.EVENT_MANAGER_PLUGINS, { useClass: key_events_1.KeyEventsPlugin, multi: true }),
- new di_1.Provider(event_manager_1.EVENT_MANAGER_PLUGINS, { useClass: hammer_gestures_1.HammerGesturesPlugin, multi: true }),
- new di_1.Provider(dom_renderer_1.DomRenderer, { useClass: dom_renderer_1.DomRenderer_ }),
- new di_1.Provider(core_1.Renderer, { useExisting: dom_renderer_1.DomRenderer }),
- new di_1.Provider(shared_styles_host_2.SharedStylesHost, { useExisting: shared_styles_host_1.DomSharedStylesHost }),
- shared_styles_host_1.DomSharedStylesHost,
- testability_1.Testability,
- browser_details_1.BrowserDetails,
- animation_builder_1.AnimationBuilder,
- event_manager_1.EventManager
- ]);
- function initDomAdapter() {
- browser_adapter_1.BrowserDomAdapter.makeCurrent();
- wtf_init_1.wtfInit();
- testability_2.BrowserGetTestability.init();
- }
- exports.initDomAdapter = initDomAdapter;
- /***/ },
- /* 182 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var dom_adapter_1 = __webpack_require__(178);
- var core_1 = __webpack_require__(2);
- var event_manager_1 = __webpack_require__(183);
- var DomEventsPlugin = (function (_super) {
- __extends(DomEventsPlugin, _super);
- function DomEventsPlugin() {
- _super.apply(this, arguments);
- }
- // This plugin should come last in the list of plugins, because it accepts all
- // events.
- DomEventsPlugin.prototype.supports = function (eventName) { return true; };
- DomEventsPlugin.prototype.addEventListener = function (element, eventName, handler) {
- var zone = this.manager.getZone();
- var outsideHandler = function (event) { return zone.run(function () { return handler(event); }); };
- this.manager.getZone().runOutsideAngular(function () { dom_adapter_1.DOM.on(element, eventName, outsideHandler); });
- };
- DomEventsPlugin.prototype.addGlobalEventListener = function (target, eventName, handler) {
- var element = dom_adapter_1.DOM.getGlobalEventTarget(target);
- var zone = this.manager.getZone();
- var outsideHandler = function (event) { return zone.run(function () { return handler(event); }); };
- return this.manager.getZone().runOutsideAngular(function () { return dom_adapter_1.DOM.onAndCancel(element, eventName, outsideHandler); });
- };
- DomEventsPlugin = __decorate([
- core_1.Injectable(),
- __metadata('design:paramtypes', [])
- ], DomEventsPlugin);
- return DomEventsPlugin;
- })(event_manager_1.EventManagerPlugin);
- exports.DomEventsPlugin = DomEventsPlugin;
- /***/ },
- /* 183 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var __param = (this && this.__param) || function (paramIndex, decorator) {
- return function (target, key) { decorator(target, key, paramIndex); }
- };
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var di_1 = __webpack_require__(6);
- var ng_zone_1 = __webpack_require__(66);
- var collection_1 = __webpack_require__(12);
- exports.EVENT_MANAGER_PLUGINS = lang_1.CONST_EXPR(new di_1.OpaqueToken("EventManagerPlugins"));
- var EventManager = (function () {
- function EventManager(plugins, _zone) {
- var _this = this;
- this._zone = _zone;
- plugins.forEach(function (p) { return p.manager = _this; });
- this._plugins = collection_1.ListWrapper.reversed(plugins);
- }
- EventManager.prototype.addEventListener = function (element, eventName, handler) {
- var plugin = this._findPluginFor(eventName);
- plugin.addEventListener(element, eventName, handler);
- };
- EventManager.prototype.addGlobalEventListener = function (target, eventName, handler) {
- var plugin = this._findPluginFor(eventName);
- return plugin.addGlobalEventListener(target, eventName, handler);
- };
- EventManager.prototype.getZone = function () { return this._zone; };
- /** @internal */
- EventManager.prototype._findPluginFor = function (eventName) {
- var plugins = this._plugins;
- for (var i = 0; i < plugins.length; i++) {
- var plugin = plugins[i];
- if (plugin.supports(eventName)) {
- return plugin;
- }
- }
- throw new exceptions_1.BaseException("No event manager plugin found for event " + eventName);
- };
- EventManager = __decorate([
- di_1.Injectable(),
- __param(0, di_1.Inject(exports.EVENT_MANAGER_PLUGINS)),
- __metadata('design:paramtypes', [Array, ng_zone_1.NgZone])
- ], EventManager);
- return EventManager;
- })();
- exports.EventManager = EventManager;
- var EventManagerPlugin = (function () {
- function EventManagerPlugin() {
- }
- // That is equivalent to having supporting $event.target
- EventManagerPlugin.prototype.supports = function (eventName) { return false; };
- EventManagerPlugin.prototype.addEventListener = function (element, eventName, handler) {
- throw "not implemented";
- };
- EventManagerPlugin.prototype.addGlobalEventListener = function (element, eventName, handler) {
- throw "not implemented";
- };
- return EventManagerPlugin;
- })();
- exports.EventManagerPlugin = EventManagerPlugin;
- /***/ },
- /* 184 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var dom_adapter_1 = __webpack_require__(178);
- var lang_1 = __webpack_require__(5);
- var collection_1 = __webpack_require__(12);
- var event_manager_1 = __webpack_require__(183);
- var di_1 = __webpack_require__(6);
- var modifierKeys = ['alt', 'control', 'meta', 'shift'];
- var modifierKeyGetters = {
- 'alt': function (event) { return event.altKey; },
- 'control': function (event) { return event.ctrlKey; },
- 'meta': function (event) { return event.metaKey; },
- 'shift': function (event) { return event.shiftKey; }
- };
- var KeyEventsPlugin = (function (_super) {
- __extends(KeyEventsPlugin, _super);
- function KeyEventsPlugin() {
- _super.call(this);
- }
- KeyEventsPlugin.prototype.supports = function (eventName) {
- return lang_1.isPresent(KeyEventsPlugin.parseEventName(eventName));
- };
- KeyEventsPlugin.prototype.addEventListener = function (element, eventName, handler) {
- var parsedEvent = KeyEventsPlugin.parseEventName(eventName);
- var outsideHandler = KeyEventsPlugin.eventCallback(element, collection_1.StringMapWrapper.get(parsedEvent, 'fullKey'), handler, this.manager.getZone());
- this.manager.getZone().runOutsideAngular(function () {
- dom_adapter_1.DOM.on(element, collection_1.StringMapWrapper.get(parsedEvent, 'domEventName'), outsideHandler);
- });
- };
- KeyEventsPlugin.parseEventName = function (eventName) {
- var parts = eventName.toLowerCase().split('.');
- var domEventName = parts.shift();
- if ((parts.length === 0) ||
- !(lang_1.StringWrapper.equals(domEventName, 'keydown') ||
- lang_1.StringWrapper.equals(domEventName, 'keyup'))) {
- return null;
- }
- var key = KeyEventsPlugin._normalizeKey(parts.pop());
- var fullKey = '';
- modifierKeys.forEach(function (modifierName) {
- if (collection_1.ListWrapper.contains(parts, modifierName)) {
- collection_1.ListWrapper.remove(parts, modifierName);
- fullKey += modifierName + '.';
- }
- });
- fullKey += key;
- if (parts.length != 0 || key.length === 0) {
- // returning null instead of throwing to let another plugin process the event
- return null;
- }
- var result = collection_1.StringMapWrapper.create();
- collection_1.StringMapWrapper.set(result, 'domEventName', domEventName);
- collection_1.StringMapWrapper.set(result, 'fullKey', fullKey);
- return result;
- };
- KeyEventsPlugin.getEventFullKey = function (event) {
- var fullKey = '';
- var key = dom_adapter_1.DOM.getEventKey(event);
- key = key.toLowerCase();
- if (lang_1.StringWrapper.equals(key, ' ')) {
- key = 'space'; // for readability
- }
- else if (lang_1.StringWrapper.equals(key, '.')) {
- key = 'dot'; // because '.' is used as a separator in event names
- }
- modifierKeys.forEach(function (modifierName) {
- if (modifierName != key) {
- var modifierGetter = collection_1.StringMapWrapper.get(modifierKeyGetters, modifierName);
- if (modifierGetter(event)) {
- fullKey += modifierName + '.';
- }
- }
- });
- fullKey += key;
- return fullKey;
- };
- KeyEventsPlugin.eventCallback = function (element, fullKey, handler, zone) {
- return function (event) {
- if (lang_1.StringWrapper.equals(KeyEventsPlugin.getEventFullKey(event), fullKey)) {
- zone.run(function () { return handler(event); });
- }
- };
- };
- /** @internal */
- KeyEventsPlugin._normalizeKey = function (keyName) {
- // TODO: switch to a StringMap if the mapping grows too much
- switch (keyName) {
- case 'esc':
- return 'escape';
- default:
- return keyName;
- }
- };
- KeyEventsPlugin = __decorate([
- di_1.Injectable(),
- __metadata('design:paramtypes', [])
- ], KeyEventsPlugin);
- return KeyEventsPlugin;
- })(event_manager_1.EventManagerPlugin);
- exports.KeyEventsPlugin = KeyEventsPlugin;
- /***/ },
- /* 185 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var hammer_common_1 = __webpack_require__(186);
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var di_1 = __webpack_require__(6);
- var HammerGesturesPlugin = (function (_super) {
- __extends(HammerGesturesPlugin, _super);
- function HammerGesturesPlugin() {
- _super.apply(this, arguments);
- }
- HammerGesturesPlugin.prototype.supports = function (eventName) {
- if (!_super.prototype.supports.call(this, eventName))
- return false;
- if (!lang_1.isPresent(window['Hammer'])) {
- throw new exceptions_1.BaseException("Hammer.js is not loaded, can not bind " + eventName + " event");
- }
- return true;
- };
- HammerGesturesPlugin.prototype.addEventListener = function (element, eventName, handler) {
- var zone = this.manager.getZone();
- eventName = eventName.toLowerCase();
- zone.runOutsideAngular(function () {
- // Creating the manager bind events, must be done outside of angular
- var mc = new Hammer(element);
- mc.get('pinch').set({ enable: true });
- mc.get('rotate').set({ enable: true });
- mc.on(eventName, function (eventObj) { zone.run(function () { handler(eventObj); }); });
- });
- };
- HammerGesturesPlugin = __decorate([
- di_1.Injectable(),
- __metadata('design:paramtypes', [])
- ], HammerGesturesPlugin);
- return HammerGesturesPlugin;
- })(hammer_common_1.HammerGesturesPluginCommon);
- exports.HammerGesturesPlugin = HammerGesturesPlugin;
- /***/ },
- /* 186 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var event_manager_1 = __webpack_require__(183);
- var collection_1 = __webpack_require__(12);
- var _eventNames = {
- // pan
- 'pan': true,
- 'panstart': true,
- 'panmove': true,
- 'panend': true,
- 'pancancel': true,
- 'panleft': true,
- 'panright': true,
- 'panup': true,
- 'pandown': true,
- // pinch
- 'pinch': true,
- 'pinchstart': true,
- 'pinchmove': true,
- 'pinchend': true,
- 'pinchcancel': true,
- 'pinchin': true,
- 'pinchout': true,
- // press
- 'press': true,
- 'pressup': true,
- // rotate
- 'rotate': true,
- 'rotatestart': true,
- 'rotatemove': true,
- 'rotateend': true,
- 'rotatecancel': true,
- // swipe
- 'swipe': true,
- 'swipeleft': true,
- 'swiperight': true,
- 'swipeup': true,
- 'swipedown': true,
- // tap
- 'tap': true,
- };
- var HammerGesturesPluginCommon = (function (_super) {
- __extends(HammerGesturesPluginCommon, _super);
- function HammerGesturesPluginCommon() {
- _super.call(this);
- }
- HammerGesturesPluginCommon.prototype.supports = function (eventName) {
- eventName = eventName.toLowerCase();
- return collection_1.StringMapWrapper.contains(_eventNames, eventName);
- };
- return HammerGesturesPluginCommon;
- })(event_manager_1.EventManagerPlugin);
- exports.HammerGesturesPluginCommon = HammerGesturesPluginCommon;
- /***/ },
- /* 187 */
- /***/ function(module, exports, __webpack_require__) {
- var di_1 = __webpack_require__(6);
- var lang_1 = __webpack_require__(5);
- /**
- * A DI Token representing the main rendering context. In a browser this is the DOM Document.
- *
- * Note: Document might not be available in the Application Context when Application and Rendering
- * Contexts are not the same (e.g. when running the application into a Web Worker).
- */
- exports.DOCUMENT = lang_1.CONST_EXPR(new di_1.OpaqueToken('DocumentToken'));
- /***/ },
- /* 188 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var __param = (this && this.__param) || function (paramIndex, decorator) {
- return function (target, key) { decorator(target, key, paramIndex); }
- };
- var di_1 = __webpack_require__(6);
- var animation_builder_1 = __webpack_require__(189);
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var shared_styles_host_1 = __webpack_require__(196);
- var profile_1 = __webpack_require__(45);
- var core_1 = __webpack_require__(2);
- var event_manager_1 = __webpack_require__(183);
- var dom_tokens_1 = __webpack_require__(187);
- var view_factory_1 = __webpack_require__(164);
- var view_1 = __webpack_require__(165);
- var metadata_1 = __webpack_require__(3);
- var dom_adapter_1 = __webpack_require__(178);
- var util_1 = __webpack_require__(194);
- var NAMESPACE_URIS = lang_1.CONST_EXPR({ 'xlink': 'http://www.w3.org/1999/xlink', 'svg': 'http://www.w3.org/2000/svg' });
- var TEMPLATE_COMMENT_TEXT = 'template bindings={}';
- var TEMPLATE_BINDINGS_EXP = /^template bindings=(.*)$/g;
- var DomRenderer = (function (_super) {
- __extends(DomRenderer, _super);
- function DomRenderer() {
- _super.apply(this, arguments);
- }
- DomRenderer.prototype.getNativeElementSync = function (location) {
- return resolveInternalDomView(location.renderView).boundElements[location.boundElementIndex];
- };
- DomRenderer.prototype.getRootNodes = function (fragment) { return resolveInternalDomFragment(fragment); };
- DomRenderer.prototype.attachFragmentAfterFragment = function (previousFragmentRef, fragmentRef) {
- var previousFragmentNodes = resolveInternalDomFragment(previousFragmentRef);
- if (previousFragmentNodes.length > 0) {
- var sibling = previousFragmentNodes[previousFragmentNodes.length - 1];
- var nodes = resolveInternalDomFragment(fragmentRef);
- moveNodesAfterSibling(sibling, nodes);
- this.animateNodesEnter(nodes);
- }
- };
- /**
- * Iterates through all nodes being added to the DOM and animates them if necessary
- * @param nodes
- */
- DomRenderer.prototype.animateNodesEnter = function (nodes) {
- for (var i = 0; i < nodes.length; i++)
- this.animateNodeEnter(nodes[i]);
- };
- DomRenderer.prototype.attachFragmentAfterElement = function (elementRef, fragmentRef) {
- var parentView = resolveInternalDomView(elementRef.renderView);
- var element = parentView.boundElements[elementRef.boundElementIndex];
- var nodes = resolveInternalDomFragment(fragmentRef);
- moveNodesAfterSibling(element, nodes);
- this.animateNodesEnter(nodes);
- };
- DomRenderer.prototype.hydrateView = function (viewRef) { resolveInternalDomView(viewRef).hydrate(); };
- DomRenderer.prototype.dehydrateView = function (viewRef) { resolveInternalDomView(viewRef).dehydrate(); };
- DomRenderer.prototype.createTemplateAnchor = function (attrNameAndValues) {
- return dom_adapter_1.DOM.createComment(TEMPLATE_COMMENT_TEXT);
- };
- DomRenderer.prototype.createText = function (value) { return dom_adapter_1.DOM.createTextNode(lang_1.isPresent(value) ? value : ''); };
- DomRenderer.prototype.appendChild = function (parent, child) { dom_adapter_1.DOM.appendChild(parent, child); };
- DomRenderer.prototype.setElementProperty = function (location, propertyName, propertyValue) {
- var view = resolveInternalDomView(location.renderView);
- dom_adapter_1.DOM.setProperty(view.boundElements[location.boundElementIndex], propertyName, propertyValue);
- };
- DomRenderer.prototype.setElementAttribute = function (location, attributeName, attributeValue) {
- var view = resolveInternalDomView(location.renderView);
- var element = view.boundElements[location.boundElementIndex];
- if (lang_1.isPresent(attributeValue)) {
- dom_adapter_1.DOM.setAttribute(element, attributeName, lang_1.stringify(attributeValue));
- }
- else {
- dom_adapter_1.DOM.removeAttribute(element, attributeName);
- }
- };
- /**
- * Used only in debug mode to serialize property changes to comment nodes,
- * such as <template> placeholders.
- */
- DomRenderer.prototype.setBindingDebugInfo = function (location, propertyName, propertyValue) {
- var view = resolveInternalDomView(location.renderView);
- var element = view.boundElements[location.boundElementIndex];
- var dashCasedPropertyName = util_1.camelCaseToDashCase(propertyName);
- if (dom_adapter_1.DOM.isCommentNode(element)) {
- var existingBindings = lang_1.RegExpWrapper.firstMatch(TEMPLATE_BINDINGS_EXP, lang_1.StringWrapper.replaceAll(dom_adapter_1.DOM.getText(element), /\n/g, ''));
- var parsedBindings = lang_1.Json.parse(existingBindings[1]);
- parsedBindings[dashCasedPropertyName] = propertyValue;
- dom_adapter_1.DOM.setText(element, lang_1.StringWrapper.replace(TEMPLATE_COMMENT_TEXT, '{}', lang_1.Json.stringify(parsedBindings)));
- }
- else {
- this.setElementAttribute(location, propertyName, propertyValue);
- }
- };
- DomRenderer.prototype.setElementClass = function (location, className, isAdd) {
- var view = resolveInternalDomView(location.renderView);
- var element = view.boundElements[location.boundElementIndex];
- if (isAdd) {
- dom_adapter_1.DOM.addClass(element, className);
- }
- else {
- dom_adapter_1.DOM.removeClass(element, className);
- }
- };
- DomRenderer.prototype.setElementStyle = function (location, styleName, styleValue) {
- var view = resolveInternalDomView(location.renderView);
- var element = view.boundElements[location.boundElementIndex];
- if (lang_1.isPresent(styleValue)) {
- dom_adapter_1.DOM.setStyle(element, styleName, lang_1.stringify(styleValue));
- }
- else {
- dom_adapter_1.DOM.removeStyle(element, styleName);
- }
- };
- DomRenderer.prototype.invokeElementMethod = function (location, methodName, args) {
- var view = resolveInternalDomView(location.renderView);
- var element = view.boundElements[location.boundElementIndex];
- dom_adapter_1.DOM.invoke(element, methodName, args);
- };
- DomRenderer.prototype.setText = function (viewRef, textNodeIndex, text) {
- var view = resolveInternalDomView(viewRef);
- dom_adapter_1.DOM.setText(view.boundTextNodes[textNodeIndex], text);
- };
- DomRenderer.prototype.setEventDispatcher = function (viewRef, dispatcher) {
- resolveInternalDomView(viewRef).setEventDispatcher(dispatcher);
- };
- return DomRenderer;
- })(core_1.Renderer);
- exports.DomRenderer = DomRenderer;
- var DomRenderer_ = (function (_super) {
- __extends(DomRenderer_, _super);
- function DomRenderer_(_eventManager, _domSharedStylesHost, _animate, document) {
- _super.call(this);
- this._eventManager = _eventManager;
- this._domSharedStylesHost = _domSharedStylesHost;
- this._animate = _animate;
- this._componentTpls = new Map();
- /** @internal */
- this._createRootHostViewScope = profile_1.wtfCreateScope('DomRenderer#createRootHostView()');
- /** @internal */
- this._createViewScope = profile_1.wtfCreateScope('DomRenderer#createView()');
- /** @internal */
- this._detachFragmentScope = profile_1.wtfCreateScope('DomRenderer#detachFragment()');
- this._document = document;
- }
- DomRenderer_.prototype.registerComponentTemplate = function (template) {
- this._componentTpls.set(template.id, template);
- if (template.encapsulation !== metadata_1.ViewEncapsulation.Native) {
- var encapsulatedStyles = view_factory_1.encapsulateStyles(template);
- this._domSharedStylesHost.addStyles(encapsulatedStyles);
- }
- };
- DomRenderer_.prototype.createProtoView = function (componentTemplateId, cmds) {
- return new view_1.DefaultProtoViewRef(this._componentTpls.get(componentTemplateId), cmds);
- };
- DomRenderer_.prototype.resolveComponentTemplate = function (templateId) {
- return this._componentTpls.get(templateId);
- };
- DomRenderer_.prototype.createRootHostView = function (hostProtoViewRef, fragmentCount, hostElementSelector) {
- var s = this._createRootHostViewScope();
- var element = dom_adapter_1.DOM.querySelector(this._document, hostElementSelector);
- if (lang_1.isBlank(element)) {
- profile_1.wtfLeave(s);
- throw new exceptions_1.BaseException("The selector \"" + hostElementSelector + "\" did not match any elements");
- }
- return profile_1.wtfLeave(s, this._createView(hostProtoViewRef, element));
- };
- DomRenderer_.prototype.createView = function (protoViewRef, fragmentCount) {
- var s = this._createViewScope();
- return profile_1.wtfLeave(s, this._createView(protoViewRef, null));
- };
- DomRenderer_.prototype._createView = function (protoViewRef, inplaceElement) {
- var dpvr = protoViewRef;
- var view = view_factory_1.createRenderView(dpvr.template, dpvr.cmds, inplaceElement, this);
- var sdRoots = view.nativeShadowRoots;
- for (var i = 0; i < sdRoots.length; i++) {
- this._domSharedStylesHost.addHost(sdRoots[i]);
- }
- return new core_1.RenderViewWithFragments(view, view.fragments);
- };
- DomRenderer_.prototype.destroyView = function (viewRef) {
- var view = viewRef;
- var sdRoots = view.nativeShadowRoots;
- for (var i = 0; i < sdRoots.length; i++) {
- this._domSharedStylesHost.removeHost(sdRoots[i]);
- }
- };
- DomRenderer_.prototype.animateNodeEnter = function (node) {
- if (dom_adapter_1.DOM.isElementNode(node) && dom_adapter_1.DOM.hasClass(node, 'ng-animate')) {
- dom_adapter_1.DOM.addClass(node, 'ng-enter');
- this._animate.css()
- .addAnimationClass('ng-enter-active')
- .start(node)
- .onComplete(function () { dom_adapter_1.DOM.removeClass(node, 'ng-enter'); });
- }
- };
- DomRenderer_.prototype.animateNodeLeave = function (node) {
- if (dom_adapter_1.DOM.isElementNode(node) && dom_adapter_1.DOM.hasClass(node, 'ng-animate')) {
- dom_adapter_1.DOM.addClass(node, 'ng-leave');
- this._animate.css()
- .addAnimationClass('ng-leave-active')
- .start(node)
- .onComplete(function () {
- dom_adapter_1.DOM.removeClass(node, 'ng-leave');
- dom_adapter_1.DOM.remove(node);
- });
- }
- else {
- dom_adapter_1.DOM.remove(node);
- }
- };
- DomRenderer_.prototype.detachFragment = function (fragmentRef) {
- var s = this._detachFragmentScope();
- var fragmentNodes = resolveInternalDomFragment(fragmentRef);
- for (var i = 0; i < fragmentNodes.length; i++) {
- this.animateNodeLeave(fragmentNodes[i]);
- }
- profile_1.wtfLeave(s);
- };
- DomRenderer_.prototype.createElement = function (name, attrNameAndValues) {
- var nsAndName = splitNamespace(name);
- var el = lang_1.isPresent(nsAndName[0]) ?
- dom_adapter_1.DOM.createElementNS(NAMESPACE_URIS[nsAndName[0]], nsAndName[1]) :
- dom_adapter_1.DOM.createElement(nsAndName[1]);
- this._setAttributes(el, attrNameAndValues);
- return el;
- };
- DomRenderer_.prototype.mergeElement = function (existing, attrNameAndValues) {
- dom_adapter_1.DOM.clearNodes(existing);
- this._setAttributes(existing, attrNameAndValues);
- };
- DomRenderer_.prototype._setAttributes = function (node, attrNameAndValues) {
- for (var attrIdx = 0; attrIdx < attrNameAndValues.length; attrIdx += 2) {
- var attrNs;
- var attrName = attrNameAndValues[attrIdx];
- var nsAndName = splitNamespace(attrName);
- if (lang_1.isPresent(nsAndName[0])) {
- attrName = nsAndName[0] + ':' + nsAndName[1];
- attrNs = NAMESPACE_URIS[nsAndName[0]];
- }
- var attrValue = attrNameAndValues[attrIdx + 1];
- if (lang_1.isPresent(attrNs)) {
- dom_adapter_1.DOM.setAttributeNS(node, attrNs, attrName, attrValue);
- }
- else {
- dom_adapter_1.DOM.setAttribute(node, nsAndName[1], attrValue);
- }
- }
- };
- DomRenderer_.prototype.createRootContentInsertionPoint = function () {
- return dom_adapter_1.DOM.createComment('root-content-insertion-point');
- };
- DomRenderer_.prototype.createShadowRoot = function (host, templateId) {
- var sr = dom_adapter_1.DOM.createShadowRoot(host);
- var tpl = this._componentTpls.get(templateId);
- for (var i = 0; i < tpl.styles.length; i++) {
- dom_adapter_1.DOM.appendChild(sr, dom_adapter_1.DOM.createStyleElement(tpl.styles[i]));
- }
- return sr;
- };
- DomRenderer_.prototype.on = function (element, eventName, callback) {
- this._eventManager.addEventListener(element, eventName, decoratePreventDefault(callback));
- };
- DomRenderer_.prototype.globalOn = function (target, eventName, callback) {
- return this._eventManager.addGlobalEventListener(target, eventName, decoratePreventDefault(callback));
- };
- DomRenderer_ = __decorate([
- di_1.Injectable(),
- __param(3, di_1.Inject(dom_tokens_1.DOCUMENT)),
- __metadata('design:paramtypes', [event_manager_1.EventManager, shared_styles_host_1.DomSharedStylesHost, animation_builder_1.AnimationBuilder, Object])
- ], DomRenderer_);
- return DomRenderer_;
- })(DomRenderer);
- exports.DomRenderer_ = DomRenderer_;
- function resolveInternalDomView(viewRef) {
- return viewRef;
- }
- function resolveInternalDomFragment(fragmentRef) {
- return fragmentRef.nodes;
- }
- function moveNodesAfterSibling(sibling, nodes) {
- var parent = dom_adapter_1.DOM.parentElement(sibling);
- if (nodes.length > 0 && lang_1.isPresent(parent)) {
- var nextSibling = dom_adapter_1.DOM.nextSibling(sibling);
- if (lang_1.isPresent(nextSibling)) {
- for (var i = 0; i < nodes.length; i++) {
- dom_adapter_1.DOM.insertBefore(nextSibling, nodes[i]);
- }
- }
- else {
- for (var i = 0; i < nodes.length; i++) {
- dom_adapter_1.DOM.appendChild(parent, nodes[i]);
- }
- }
- }
- }
- function decoratePreventDefault(eventHandler) {
- return function (event) {
- var allowDefaultBehavior = eventHandler(event);
- if (!allowDefaultBehavior) {
- // TODO(tbosch): move preventDefault into event plugins...
- dom_adapter_1.DOM.preventDefault(event);
- }
- };
- }
- var NS_PREFIX_RE = /^@([^:]+):(.+)/g;
- function splitNamespace(name) {
- if (name[0] != '@') {
- return [null, name];
- }
- var match = lang_1.RegExpWrapper.firstMatch(NS_PREFIX_RE, name);
- return [match[1], match[2]];
- }
- /***/ },
- /* 189 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var di_1 = __webpack_require__(6);
- var css_animation_builder_1 = __webpack_require__(190);
- var browser_details_1 = __webpack_require__(195);
- var AnimationBuilder = (function () {
- /**
- * Used for DI
- * @param browserDetails
- */
- function AnimationBuilder(browserDetails) {
- this.browserDetails = browserDetails;
- }
- /**
- * Creates a new CSS Animation
- * @returns {CssAnimationBuilder}
- */
- AnimationBuilder.prototype.css = function () { return new css_animation_builder_1.CssAnimationBuilder(this.browserDetails); };
- AnimationBuilder = __decorate([
- di_1.Injectable(),
- __metadata('design:paramtypes', [browser_details_1.BrowserDetails])
- ], AnimationBuilder);
- return AnimationBuilder;
- })();
- exports.AnimationBuilder = AnimationBuilder;
- /***/ },
- /* 190 */
- /***/ function(module, exports, __webpack_require__) {
- var css_animation_options_1 = __webpack_require__(191);
- var animation_1 = __webpack_require__(192);
- var CssAnimationBuilder = (function () {
- /**
- * Accepts public properties for CssAnimationBuilder
- */
- function CssAnimationBuilder(browserDetails) {
- this.browserDetails = browserDetails;
- /** @type {CssAnimationOptions} */
- this.data = new css_animation_options_1.CssAnimationOptions();
- }
- /**
- * Adds a temporary class that will be removed at the end of the animation
- * @param className
- */
- CssAnimationBuilder.prototype.addAnimationClass = function (className) {
- this.data.animationClasses.push(className);
- return this;
- };
- /**
- * Adds a class that will remain on the element after the animation has finished
- * @param className
- */
- CssAnimationBuilder.prototype.addClass = function (className) {
- this.data.classesToAdd.push(className);
- return this;
- };
- /**
- * Removes a class from the element
- * @param className
- */
- CssAnimationBuilder.prototype.removeClass = function (className) {
- this.data.classesToRemove.push(className);
- return this;
- };
- /**
- * Sets the animation duration (and overrides any defined through CSS)
- * @param duration
- */
- CssAnimationBuilder.prototype.setDuration = function (duration) {
- this.data.duration = duration;
- return this;
- };
- /**
- * Sets the animation delay (and overrides any defined through CSS)
- * @param delay
- */
- CssAnimationBuilder.prototype.setDelay = function (delay) {
- this.data.delay = delay;
- return this;
- };
- /**
- * Sets styles for both the initial state and the destination state
- * @param from
- * @param to
- */
- CssAnimationBuilder.prototype.setStyles = function (from, to) {
- return this.setFromStyles(from).setToStyles(to);
- };
- /**
- * Sets the initial styles for the animation
- * @param from
- */
- CssAnimationBuilder.prototype.setFromStyles = function (from) {
- this.data.fromStyles = from;
- return this;
- };
- /**
- * Sets the destination styles for the animation
- * @param to
- */
- CssAnimationBuilder.prototype.setToStyles = function (to) {
- this.data.toStyles = to;
- return this;
- };
- /**
- * Starts the animation and returns a promise
- * @param element
- */
- CssAnimationBuilder.prototype.start = function (element) {
- return new animation_1.Animation(element, this.data, this.browserDetails);
- };
- return CssAnimationBuilder;
- })();
- exports.CssAnimationBuilder = CssAnimationBuilder;
- /***/ },
- /* 191 */
- /***/ function(module, exports) {
- var CssAnimationOptions = (function () {
- function CssAnimationOptions() {
- /** classes to be added to the element */
- this.classesToAdd = [];
- /** classes to be removed from the element */
- this.classesToRemove = [];
- /** classes to be added for the duration of the animation */
- this.animationClasses = [];
- }
- return CssAnimationOptions;
- })();
- exports.CssAnimationOptions = CssAnimationOptions;
- /***/ },
- /* 192 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var math_1 = __webpack_require__(193);
- var util_1 = __webpack_require__(194);
- var collection_1 = __webpack_require__(12);
- var dom_adapter_1 = __webpack_require__(178);
- var Animation = (function () {
- /**
- * Stores the start time and starts the animation
- * @param element
- * @param data
- * @param browserDetails
- */
- function Animation(element, data, browserDetails) {
- var _this = this;
- this.element = element;
- this.data = data;
- this.browserDetails = browserDetails;
- /** functions to be called upon completion */
- this.callbacks = [];
- /** functions for removing event listeners */
- this.eventClearFunctions = [];
- /** flag used to track whether or not the animation has finished */
- this.completed = false;
- this._stringPrefix = '';
- this.startTime = lang_1.DateWrapper.toMillis(lang_1.DateWrapper.now());
- this._stringPrefix = dom_adapter_1.DOM.getAnimationPrefix();
- this.setup();
- this.wait(function (timestamp) { return _this.start(); });
- }
- Object.defineProperty(Animation.prototype, "totalTime", {
- /** total amount of time that the animation should take including delay */
- get: function () {
- var delay = this.computedDelay != null ? this.computedDelay : 0;
- var duration = this.computedDuration != null ? this.computedDuration : 0;
- return delay + duration;
- },
- enumerable: true,
- configurable: true
- });
- Animation.prototype.wait = function (callback) {
- // Firefox requires 2 frames for some reason
- this.browserDetails.raf(callback, 2);
- };
- /**
- * Sets up the initial styles before the animation is started
- */
- Animation.prototype.setup = function () {
- if (this.data.fromStyles != null)
- this.applyStyles(this.data.fromStyles);
- if (this.data.duration != null)
- this.applyStyles({ 'transitionDuration': this.data.duration.toString() + 'ms' });
- if (this.data.delay != null)
- this.applyStyles({ 'transitionDelay': this.data.delay.toString() + 'ms' });
- };
- /**
- * After the initial setup has occurred, this method adds the animation styles
- */
- Animation.prototype.start = function () {
- this.addClasses(this.data.classesToAdd);
- this.addClasses(this.data.animationClasses);
- this.removeClasses(this.data.classesToRemove);
- if (this.data.toStyles != null)
- this.applyStyles(this.data.toStyles);
- var computedStyles = dom_adapter_1.DOM.getComputedStyle(this.element);
- this.computedDelay =
- math_1.Math.max(this.parseDurationString(computedStyles.getPropertyValue(this._stringPrefix + 'transition-delay')), this.parseDurationString(this.element.style.getPropertyValue(this._stringPrefix + 'transition-delay')));
- this.computedDuration = math_1.Math.max(this.parseDurationString(computedStyles.getPropertyValue(this._stringPrefix + 'transition-duration')), this.parseDurationString(this.element.style.getPropertyValue(this._stringPrefix + 'transition-duration')));
- this.addEvents();
- };
- /**
- * Applies the provided styles to the element
- * @param styles
- */
- Animation.prototype.applyStyles = function (styles) {
- var _this = this;
- collection_1.StringMapWrapper.forEach(styles, function (value, key) {
- var dashCaseKey = util_1.camelCaseToDashCase(key);
- if (lang_1.isPresent(dom_adapter_1.DOM.getStyle(_this.element, dashCaseKey))) {
- dom_adapter_1.DOM.setStyle(_this.element, dashCaseKey, value.toString());
- }
- else {
- dom_adapter_1.DOM.setStyle(_this.element, _this._stringPrefix + dashCaseKey, value.toString());
- }
- });
- };
- /**
- * Adds the provided classes to the element
- * @param classes
- */
- Animation.prototype.addClasses = function (classes) {
- for (var i = 0, len = classes.length; i < len; i++)
- dom_adapter_1.DOM.addClass(this.element, classes[i]);
- };
- /**
- * Removes the provided classes from the element
- * @param classes
- */
- Animation.prototype.removeClasses = function (classes) {
- for (var i = 0, len = classes.length; i < len; i++)
- dom_adapter_1.DOM.removeClass(this.element, classes[i]);
- };
- /**
- * Adds events to track when animations have finished
- */
- Animation.prototype.addEvents = function () {
- var _this = this;
- if (this.totalTime > 0) {
- this.eventClearFunctions.push(dom_adapter_1.DOM.onAndCancel(this.element, dom_adapter_1.DOM.getTransitionEnd(), function (event) { return _this.handleAnimationEvent(event); }));
- }
- else {
- this.handleAnimationCompleted();
- }
- };
- Animation.prototype.handleAnimationEvent = function (event) {
- var elapsedTime = math_1.Math.round(event.elapsedTime * 1000);
- if (!this.browserDetails.elapsedTimeIncludesDelay)
- elapsedTime += this.computedDelay;
- event.stopPropagation();
- if (elapsedTime >= this.totalTime)
- this.handleAnimationCompleted();
- };
- /**
- * Runs all animation callbacks and removes temporary classes
- */
- Animation.prototype.handleAnimationCompleted = function () {
- this.removeClasses(this.data.animationClasses);
- this.callbacks.forEach(function (callback) { return callback(); });
- this.callbacks = [];
- this.eventClearFunctions.forEach(function (fn) { return fn(); });
- this.eventClearFunctions = [];
- this.completed = true;
- };
- /**
- * Adds animation callbacks to be called upon completion
- * @param callback
- * @returns {Animation}
- */
- Animation.prototype.onComplete = function (callback) {
- if (this.completed) {
- callback();
- }
- else {
- this.callbacks.push(callback);
- }
- return this;
- };
- /**
- * Converts the duration string to the number of milliseconds
- * @param duration
- * @returns {number}
- */
- Animation.prototype.parseDurationString = function (duration) {
- var maxValue = 0;
- // duration must have at least 2 characters to be valid. (number + type)
- if (duration == null || duration.length < 2) {
- return maxValue;
- }
- else if (duration.substring(duration.length - 2) == 'ms') {
- var value = lang_1.NumberWrapper.parseInt(this.stripLetters(duration), 10);
- if (value > maxValue)
- maxValue = value;
- }
- else if (duration.substring(duration.length - 1) == 's') {
- var ms = lang_1.NumberWrapper.parseFloat(this.stripLetters(duration)) * 1000;
- var value = math_1.Math.floor(ms);
- if (value > maxValue)
- maxValue = value;
- }
- return maxValue;
- };
- /**
- * Strips the letters from the duration string
- * @param str
- * @returns {string}
- */
- Animation.prototype.stripLetters = function (str) {
- return lang_1.StringWrapper.replaceAll(str, lang_1.RegExpWrapper.create('[^0-9]+$', ''), '');
- };
- return Animation;
- })();
- exports.Animation = Animation;
- /***/ },
- /* 193 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- exports.Math = lang_1.global.Math;
- exports.NaN = typeof exports.NaN;
- /***/ },
- /* 194 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var CAMEL_CASE_REGEXP = /([A-Z])/g;
- var DASH_CASE_REGEXP = /-([a-z])/g;
- function camelCaseToDashCase(input) {
- return lang_1.StringWrapper.replaceAllMapped(input, CAMEL_CASE_REGEXP, function (m) { return '-' + m[1].toLowerCase(); });
- }
- exports.camelCaseToDashCase = camelCaseToDashCase;
- function dashCaseToCamelCase(input) {
- return lang_1.StringWrapper.replaceAllMapped(input, DASH_CASE_REGEXP, function (m) { return m[1].toUpperCase(); });
- }
- exports.dashCaseToCamelCase = dashCaseToCamelCase;
- /***/ },
- /* 195 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var di_1 = __webpack_require__(6);
- var math_1 = __webpack_require__(193);
- var dom_adapter_1 = __webpack_require__(178);
- var BrowserDetails = (function () {
- function BrowserDetails() {
- this.elapsedTimeIncludesDelay = false;
- this.doesElapsedTimeIncludesDelay();
- }
- /**
- * Determines if `event.elapsedTime` includes transition delay in the current browser. At this
- * time, Chrome and Opera seem to be the only browsers that include this.
- */
- BrowserDetails.prototype.doesElapsedTimeIncludesDelay = function () {
- var _this = this;
- var div = dom_adapter_1.DOM.createElement('div');
- dom_adapter_1.DOM.setAttribute(div, 'style', "position: absolute; top: -9999px; left: -9999px; width: 1px;\n height: 1px; transition: all 1ms linear 1ms;");
- // Firefox requires that we wait for 2 frames for some reason
- this.raf(function (timestamp) {
- dom_adapter_1.DOM.on(div, 'transitionend', function (event) {
- var elapsed = math_1.Math.round(event.elapsedTime * 1000);
- _this.elapsedTimeIncludesDelay = elapsed == 2;
- dom_adapter_1.DOM.remove(div);
- });
- dom_adapter_1.DOM.setStyle(div, 'width', '2px');
- }, 2);
- };
- BrowserDetails.prototype.raf = function (callback, frames) {
- if (frames === void 0) { frames = 1; }
- var queue = new RafQueue(callback, frames);
- return function () { return queue.cancel(); };
- };
- BrowserDetails = __decorate([
- di_1.Injectable(),
- __metadata('design:paramtypes', [])
- ], BrowserDetails);
- return BrowserDetails;
- })();
- exports.BrowserDetails = BrowserDetails;
- var RafQueue = (function () {
- function RafQueue(callback, frames) {
- this.callback = callback;
- this.frames = frames;
- this._raf();
- }
- RafQueue.prototype._raf = function () {
- var _this = this;
- this.currentFrameId = dom_adapter_1.DOM.requestAnimationFrame(function (timestamp) { return _this._nextFrame(timestamp); });
- };
- RafQueue.prototype._nextFrame = function (timestamp) {
- this.frames--;
- if (this.frames > 0) {
- this._raf();
- }
- else {
- this.callback(timestamp);
- }
- };
- RafQueue.prototype.cancel = function () {
- dom_adapter_1.DOM.cancelAnimationFrame(this.currentFrameId);
- this.currentFrameId = null;
- };
- return RafQueue;
- })();
- /***/ },
- /* 196 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var __param = (this && this.__param) || function (paramIndex, decorator) {
- return function (target, key) { decorator(target, key, paramIndex); }
- };
- var dom_adapter_1 = __webpack_require__(178);
- var di_1 = __webpack_require__(6);
- var collection_1 = __webpack_require__(12);
- var dom_tokens_1 = __webpack_require__(187);
- var SharedStylesHost = (function () {
- function SharedStylesHost() {
- /** @internal */
- this._styles = [];
- /** @internal */
- this._stylesSet = new Set();
- }
- SharedStylesHost.prototype.addStyles = function (styles) {
- var _this = this;
- var additions = [];
- styles.forEach(function (style) {
- if (!collection_1.SetWrapper.has(_this._stylesSet, style)) {
- _this._stylesSet.add(style);
- _this._styles.push(style);
- additions.push(style);
- }
- });
- this.onStylesAdded(additions);
- };
- SharedStylesHost.prototype.onStylesAdded = function (additions) { };
- SharedStylesHost.prototype.getAllStyles = function () { return this._styles; };
- SharedStylesHost = __decorate([
- di_1.Injectable(),
- __metadata('design:paramtypes', [])
- ], SharedStylesHost);
- return SharedStylesHost;
- })();
- exports.SharedStylesHost = SharedStylesHost;
- var DomSharedStylesHost = (function (_super) {
- __extends(DomSharedStylesHost, _super);
- function DomSharedStylesHost(doc) {
- _super.call(this);
- this._hostNodes = new Set();
- this._hostNodes.add(doc.head);
- }
- /** @internal */
- DomSharedStylesHost.prototype._addStylesToHost = function (styles, host) {
- for (var i = 0; i < styles.length; i++) {
- var style = styles[i];
- dom_adapter_1.DOM.appendChild(host, dom_adapter_1.DOM.createStyleElement(style));
- }
- };
- DomSharedStylesHost.prototype.addHost = function (hostNode) {
- this._addStylesToHost(this._styles, hostNode);
- this._hostNodes.add(hostNode);
- };
- DomSharedStylesHost.prototype.removeHost = function (hostNode) { collection_1.SetWrapper.delete(this._hostNodes, hostNode); };
- DomSharedStylesHost.prototype.onStylesAdded = function (additions) {
- var _this = this;
- this._hostNodes.forEach(function (hostNode) { _this._addStylesToHost(additions, hostNode); });
- };
- DomSharedStylesHost = __decorate([
- di_1.Injectable(),
- __param(0, di_1.Inject(dom_tokens_1.DOCUMENT)),
- __metadata('design:paramtypes', [Object])
- ], DomSharedStylesHost);
- return DomSharedStylesHost;
- })(SharedStylesHost);
- exports.DomSharedStylesHost = DomSharedStylesHost;
- /***/ },
- /* 197 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var collection_1 = __webpack_require__(12);
- var lang_1 = __webpack_require__(5);
- var dom_adapter_1 = __webpack_require__(178);
- var generic_browser_adapter_1 = __webpack_require__(198);
- var _attrToPropMap = {
- 'class': 'className',
- 'innerHtml': 'innerHTML',
- 'readonly': 'readOnly',
- 'tabindex': 'tabIndex'
- };
- var DOM_KEY_LOCATION_NUMPAD = 3;
- // Map to convert some key or keyIdentifier values to what will be returned by getEventKey
- var _keyMap = {
- // The following values are here for cross-browser compatibility and to match the W3C standard
- // cf http://www.w3.org/TR/DOM-Level-3-Events-key/
- '\b': 'Backspace',
- '\t': 'Tab',
- '\x7F': 'Delete',
- '\x1B': 'Escape',
- 'Del': 'Delete',
- 'Esc': 'Escape',
- 'Left': 'ArrowLeft',
- 'Right': 'ArrowRight',
- 'Up': 'ArrowUp',
- 'Down': 'ArrowDown',
- 'Menu': 'ContextMenu',
- 'Scroll': 'ScrollLock',
- 'Win': 'OS'
- };
- // There is a bug in Chrome for numeric keypad keys:
- // https://code.google.com/p/chromium/issues/detail?id=155654
- // 1, 2, 3 ... are reported as A, B, C ...
- var _chromeNumKeyPadMap = {
- 'A': '1',
- 'B': '2',
- 'C': '3',
- 'D': '4',
- 'E': '5',
- 'F': '6',
- 'G': '7',
- 'H': '8',
- 'I': '9',
- 'J': '*',
- 'K': '+',
- 'M': '-',
- 'N': '.',
- 'O': '/',
- '\x60': '0',
- '\x90': 'NumLock'
- };
- /**
- * A `DomAdapter` powered by full browser DOM APIs.
- */
- /* tslint:disable:requireParameterType */
- var BrowserDomAdapter = (function (_super) {
- __extends(BrowserDomAdapter, _super);
- function BrowserDomAdapter() {
- _super.apply(this, arguments);
- }
- BrowserDomAdapter.prototype.parse = function (templateHtml) { throw new Error("parse not implemented"); };
- BrowserDomAdapter.makeCurrent = function () { dom_adapter_1.setRootDomAdapter(new BrowserDomAdapter()); };
- BrowserDomAdapter.prototype.hasProperty = function (element, name) { return name in element; };
- BrowserDomAdapter.prototype.setProperty = function (el, name, value) { el[name] = value; };
- BrowserDomAdapter.prototype.getProperty = function (el, name) { return el[name]; };
- BrowserDomAdapter.prototype.invoke = function (el, methodName, args) {
- el[methodName].apply(el, args);
- };
- // TODO(tbosch): move this into a separate environment class once we have it
- BrowserDomAdapter.prototype.logError = function (error) {
- if (window.console.error) {
- window.console.error(error);
- }
- else {
- window.console.log(error);
- }
- };
- BrowserDomAdapter.prototype.log = function (error) { window.console.log(error); };
- BrowserDomAdapter.prototype.logGroup = function (error) {
- if (window.console.group) {
- window.console.group(error);
- this.logError(error);
- }
- else {
- window.console.log(error);
- }
- };
- BrowserDomAdapter.prototype.logGroupEnd = function () {
- if (window.console.groupEnd) {
- window.console.groupEnd();
- }
- };
- Object.defineProperty(BrowserDomAdapter.prototype, "attrToPropMap", {
- get: function () { return _attrToPropMap; },
- enumerable: true,
- configurable: true
- });
- BrowserDomAdapter.prototype.query = function (selector) { return document.querySelector(selector); };
- BrowserDomAdapter.prototype.querySelector = function (el, selector) { return el.querySelector(selector); };
- BrowserDomAdapter.prototype.querySelectorAll = function (el, selector) { return el.querySelectorAll(selector); };
- BrowserDomAdapter.prototype.on = function (el, evt, listener) { el.addEventListener(evt, listener, false); };
- BrowserDomAdapter.prototype.onAndCancel = function (el, evt, listener) {
- el.addEventListener(evt, listener, false);
- // Needed to follow Dart's subscription semantic, until fix of
- // https://code.google.com/p/dart/issues/detail?id=17406
- return function () { el.removeEventListener(evt, listener, false); };
- };
- BrowserDomAdapter.prototype.dispatchEvent = function (el, evt) { el.dispatchEvent(evt); };
- BrowserDomAdapter.prototype.createMouseEvent = function (eventType) {
- var evt = document.createEvent('MouseEvent');
- evt.initEvent(eventType, true, true);
- return evt;
- };
- BrowserDomAdapter.prototype.createEvent = function (eventType) {
- var evt = document.createEvent('Event');
- evt.initEvent(eventType, true, true);
- return evt;
- };
- BrowserDomAdapter.prototype.preventDefault = function (evt) {
- evt.preventDefault();
- evt.returnValue = false;
- };
- BrowserDomAdapter.prototype.isPrevented = function (evt) {
- return evt.defaultPrevented || lang_1.isPresent(evt.returnValue) && !evt.returnValue;
- };
- BrowserDomAdapter.prototype.getInnerHTML = function (el) { return el.innerHTML; };
- BrowserDomAdapter.prototype.getOuterHTML = function (el) { return el.outerHTML; };
- BrowserDomAdapter.prototype.nodeName = function (node) { return node.nodeName; };
- BrowserDomAdapter.prototype.nodeValue = function (node) { return node.nodeValue; };
- BrowserDomAdapter.prototype.type = function (node) { return node.type; };
- BrowserDomAdapter.prototype.content = function (node) {
- if (this.hasProperty(node, "content")) {
- return node.content;
- }
- else {
- return node;
- }
- };
- BrowserDomAdapter.prototype.firstChild = function (el) { return el.firstChild; };
- BrowserDomAdapter.prototype.nextSibling = function (el) { return el.nextSibling; };
- BrowserDomAdapter.prototype.parentElement = function (el) { return el.parentNode; };
- BrowserDomAdapter.prototype.childNodes = function (el) { return el.childNodes; };
- BrowserDomAdapter.prototype.childNodesAsList = function (el) {
- var childNodes = el.childNodes;
- var res = collection_1.ListWrapper.createFixedSize(childNodes.length);
- for (var i = 0; i < childNodes.length; i++) {
- res[i] = childNodes[i];
- }
- return res;
- };
- BrowserDomAdapter.prototype.clearNodes = function (el) {
- while (el.firstChild) {
- el.removeChild(el.firstChild);
- }
- };
- BrowserDomAdapter.prototype.appendChild = function (el, node) { el.appendChild(node); };
- BrowserDomAdapter.prototype.removeChild = function (el, node) { el.removeChild(node); };
- BrowserDomAdapter.prototype.replaceChild = function (el, newChild, oldChild) { el.replaceChild(newChild, oldChild); };
- BrowserDomAdapter.prototype.remove = function (node) {
- if (node.parentNode) {
- node.parentNode.removeChild(node);
- }
- return node;
- };
- BrowserDomAdapter.prototype.insertBefore = function (el, node) { el.parentNode.insertBefore(node, el); };
- BrowserDomAdapter.prototype.insertAllBefore = function (el, nodes) { nodes.forEach(function (n) { return el.parentNode.insertBefore(n, el); }); };
- BrowserDomAdapter.prototype.insertAfter = function (el, node) { el.parentNode.insertBefore(node, el.nextSibling); };
- BrowserDomAdapter.prototype.setInnerHTML = function (el, value) { el.innerHTML = value; };
- BrowserDomAdapter.prototype.getText = function (el) { return el.textContent; };
- // TODO(vicb): removed Element type because it does not support StyleElement
- BrowserDomAdapter.prototype.setText = function (el, value) { el.textContent = value; };
- BrowserDomAdapter.prototype.getValue = function (el) { return el.value; };
- BrowserDomAdapter.prototype.setValue = function (el, value) { el.value = value; };
- BrowserDomAdapter.prototype.getChecked = function (el) { return el.checked; };
- BrowserDomAdapter.prototype.setChecked = function (el, value) { el.checked = value; };
- BrowserDomAdapter.prototype.createComment = function (text) { return document.createComment(text); };
- BrowserDomAdapter.prototype.createTemplate = function (html) {
- var t = document.createElement('template');
- t.innerHTML = html;
- return t;
- };
- BrowserDomAdapter.prototype.createElement = function (tagName, doc) {
- if (doc === void 0) { doc = document; }
- return doc.createElement(tagName);
- };
- BrowserDomAdapter.prototype.createElementNS = function (ns, tagName, doc) {
- if (doc === void 0) { doc = document; }
- return doc.createElementNS(ns, tagName);
- };
- BrowserDomAdapter.prototype.createTextNode = function (text, doc) {
- if (doc === void 0) { doc = document; }
- return doc.createTextNode(text);
- };
- BrowserDomAdapter.prototype.createScriptTag = function (attrName, attrValue, doc) {
- if (doc === void 0) { doc = document; }
- var el = doc.createElement('SCRIPT');
- el.setAttribute(attrName, attrValue);
- return el;
- };
- BrowserDomAdapter.prototype.createStyleElement = function (css, doc) {
- if (doc === void 0) { doc = document; }
- var style = doc.createElement('style');
- this.appendChild(style, this.createTextNode(css));
- return style;
- };
- BrowserDomAdapter.prototype.createShadowRoot = function (el) { return el.createShadowRoot(); };
- BrowserDomAdapter.prototype.getShadowRoot = function (el) { return el.shadowRoot; };
- BrowserDomAdapter.prototype.getHost = function (el) { return el.host; };
- BrowserDomAdapter.prototype.clone = function (node) { return node.cloneNode(true); };
- BrowserDomAdapter.prototype.getElementsByClassName = function (element, name) {
- return element.getElementsByClassName(name);
- };
- BrowserDomAdapter.prototype.getElementsByTagName = function (element, name) {
- return element.getElementsByTagName(name);
- };
- BrowserDomAdapter.prototype.classList = function (element) { return Array.prototype.slice.call(element.classList, 0); };
- BrowserDomAdapter.prototype.addClass = function (element, className) { element.classList.add(className); };
- BrowserDomAdapter.prototype.removeClass = function (element, className) { element.classList.remove(className); };
- BrowserDomAdapter.prototype.hasClass = function (element, className) { return element.classList.contains(className); };
- BrowserDomAdapter.prototype.setStyle = function (element, styleName, styleValue) {
- element.style[styleName] = styleValue;
- };
- BrowserDomAdapter.prototype.removeStyle = function (element, stylename) { element.style[stylename] = null; };
- BrowserDomAdapter.prototype.getStyle = function (element, stylename) { return element.style[stylename]; };
- BrowserDomAdapter.prototype.hasStyle = function (element, styleName, styleValue) {
- if (styleValue === void 0) { styleValue = null; }
- var value = this.getStyle(element, styleName) || '';
- return styleValue ? value == styleValue : value.length > 0;
- };
- BrowserDomAdapter.prototype.tagName = function (element) { return element.tagName; };
- BrowserDomAdapter.prototype.attributeMap = function (element) {
- var res = new Map();
- var elAttrs = element.attributes;
- for (var i = 0; i < elAttrs.length; i++) {
- var attrib = elAttrs[i];
- res.set(attrib.name, attrib.value);
- }
- return res;
- };
- BrowserDomAdapter.prototype.hasAttribute = function (element, attribute) { return element.hasAttribute(attribute); };
- BrowserDomAdapter.prototype.getAttribute = function (element, attribute) { return element.getAttribute(attribute); };
- BrowserDomAdapter.prototype.setAttribute = function (element, name, value) { element.setAttribute(name, value); };
- BrowserDomAdapter.prototype.setAttributeNS = function (element, ns, name, value) {
- element.setAttributeNS(ns, name, value);
- };
- BrowserDomAdapter.prototype.removeAttribute = function (element, attribute) { element.removeAttribute(attribute); };
- BrowserDomAdapter.prototype.templateAwareRoot = function (el) { return this.isTemplateElement(el) ? this.content(el) : el; };
- BrowserDomAdapter.prototype.createHtmlDocument = function () {
- return document.implementation.createHTMLDocument('fakeTitle');
- };
- BrowserDomAdapter.prototype.defaultDoc = function () { return document; };
- BrowserDomAdapter.prototype.getBoundingClientRect = function (el) {
- try {
- return el.getBoundingClientRect();
- }
- catch (e) {
- return { top: 0, bottom: 0, left: 0, right: 0, width: 0, height: 0 };
- }
- };
- BrowserDomAdapter.prototype.getTitle = function () { return document.title; };
- BrowserDomAdapter.prototype.setTitle = function (newTitle) { document.title = newTitle || ''; };
- BrowserDomAdapter.prototype.elementMatches = function (n, selector) {
- var matches = false;
- if (n instanceof HTMLElement) {
- if (n.matches) {
- matches = n.matches(selector);
- }
- else if (n.msMatchesSelector) {
- matches = n.msMatchesSelector(selector);
- }
- else if (n.webkitMatchesSelector) {
- matches = n.webkitMatchesSelector(selector);
- }
- }
- return matches;
- };
- BrowserDomAdapter.prototype.isTemplateElement = function (el) {
- return el instanceof HTMLElement && el.nodeName == "TEMPLATE";
- };
- BrowserDomAdapter.prototype.isTextNode = function (node) { return node.nodeType === Node.TEXT_NODE; };
- BrowserDomAdapter.prototype.isCommentNode = function (node) { return node.nodeType === Node.COMMENT_NODE; };
- BrowserDomAdapter.prototype.isElementNode = function (node) { return node.nodeType === Node.ELEMENT_NODE; };
- BrowserDomAdapter.prototype.hasShadowRoot = function (node) { return node instanceof HTMLElement && lang_1.isPresent(node.shadowRoot); };
- BrowserDomAdapter.prototype.isShadowRoot = function (node) { return node instanceof DocumentFragment; };
- BrowserDomAdapter.prototype.importIntoDoc = function (node) {
- var toImport = node;
- if (this.isTemplateElement(node)) {
- toImport = this.content(node);
- }
- return document.importNode(toImport, true);
- };
- BrowserDomAdapter.prototype.adoptNode = function (node) { return document.adoptNode(node); };
- BrowserDomAdapter.prototype.getHref = function (el) { return el.href; };
- BrowserDomAdapter.prototype.getEventKey = function (event) {
- var key = event.key;
- if (lang_1.isBlank(key)) {
- key = event.keyIdentifier;
- // keyIdentifier is defined in the old draft of DOM Level 3 Events implemented by Chrome and
- // Safari
- // cf
- // http://www.w3.org/TR/2007/WD-DOM-Level-3-Events-20071221/events.html#Events-KeyboardEvents-Interfaces
- if (lang_1.isBlank(key)) {
- return 'Unidentified';
- }
- if (key.startsWith('U+')) {
- key = String.fromCharCode(parseInt(key.substring(2), 16));
- if (event.location === DOM_KEY_LOCATION_NUMPAD && _chromeNumKeyPadMap.hasOwnProperty(key)) {
- // There is a bug in Chrome for numeric keypad keys:
- // https://code.google.com/p/chromium/issues/detail?id=155654
- // 1, 2, 3 ... are reported as A, B, C ...
- key = _chromeNumKeyPadMap[key];
- }
- }
- }
- if (_keyMap.hasOwnProperty(key)) {
- key = _keyMap[key];
- }
- return key;
- };
- BrowserDomAdapter.prototype.getGlobalEventTarget = function (target) {
- if (target == "window") {
- return window;
- }
- else if (target == "document") {
- return document;
- }
- else if (target == "body") {
- return document.body;
- }
- };
- BrowserDomAdapter.prototype.getHistory = function () { return window.history; };
- BrowserDomAdapter.prototype.getLocation = function () { return window.location; };
- BrowserDomAdapter.prototype.getBaseHref = function () {
- var href = getBaseElementHref();
- if (lang_1.isBlank(href)) {
- return null;
- }
- return relativePath(href);
- };
- BrowserDomAdapter.prototype.resetBaseElement = function () { baseElement = null; };
- BrowserDomAdapter.prototype.getUserAgent = function () { return window.navigator.userAgent; };
- BrowserDomAdapter.prototype.setData = function (element, name, value) {
- this.setAttribute(element, 'data-' + name, value);
- };
- BrowserDomAdapter.prototype.getData = function (element, name) { return this.getAttribute(element, 'data-' + name); };
- BrowserDomAdapter.prototype.getComputedStyle = function (element) { return getComputedStyle(element); };
- // TODO(tbosch): move this into a separate environment class once we have it
- BrowserDomAdapter.prototype.setGlobalVar = function (path, value) { lang_1.setValueOnPath(lang_1.global, path, value); };
- BrowserDomAdapter.prototype.requestAnimationFrame = function (callback) { return window.requestAnimationFrame(callback); };
- BrowserDomAdapter.prototype.cancelAnimationFrame = function (id) { window.cancelAnimationFrame(id); };
- BrowserDomAdapter.prototype.performanceNow = function () {
- // performance.now() is not available in all browsers, see
- // http://caniuse.com/#search=performance.now
- if (lang_1.isPresent(window.performance) && lang_1.isPresent(window.performance.now)) {
- return window.performance.now();
- }
- else {
- return lang_1.DateWrapper.toMillis(lang_1.DateWrapper.now());
- }
- };
- return BrowserDomAdapter;
- })(generic_browser_adapter_1.GenericBrowserDomAdapter);
- exports.BrowserDomAdapter = BrowserDomAdapter;
- var baseElement = null;
- function getBaseElementHref() {
- if (lang_1.isBlank(baseElement)) {
- baseElement = document.querySelector('base');
- if (lang_1.isBlank(baseElement)) {
- return null;
- }
- }
- return baseElement.getAttribute('href');
- }
- // based on urlUtils.js in AngularJS 1
- var urlParsingNode = null;
- function relativePath(url) {
- if (lang_1.isBlank(urlParsingNode)) {
- urlParsingNode = document.createElement("a");
- }
- urlParsingNode.setAttribute('href', url);
- return (urlParsingNode.pathname.charAt(0) === '/') ? urlParsingNode.pathname :
- '/' + urlParsingNode.pathname;
- }
- /***/ },
- /* 198 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var collection_1 = __webpack_require__(12);
- var lang_1 = __webpack_require__(5);
- var dom_adapter_1 = __webpack_require__(178);
- var xhr_impl_1 = __webpack_require__(199);
- /**
- * Provides DOM operations in any browser environment.
- */
- var GenericBrowserDomAdapter = (function (_super) {
- __extends(GenericBrowserDomAdapter, _super);
- function GenericBrowserDomAdapter() {
- var _this = this;
- _super.call(this);
- this._animationPrefix = null;
- this._transitionEnd = null;
- try {
- var element = this.createElement('div', this.defaultDoc());
- if (lang_1.isPresent(this.getStyle(element, 'animationName'))) {
- this._animationPrefix = '';
- }
- else {
- var domPrefixes = ['Webkit', 'Moz', 'O', 'ms'];
- for (var i = 0; i < domPrefixes.length; i++) {
- if (lang_1.isPresent(this.getStyle(element, domPrefixes[i] + 'AnimationName'))) {
- this._animationPrefix = '-' + domPrefixes[i].toLowerCase() + '-';
- break;
- }
- }
- }
- var transEndEventNames = {
- WebkitTransition: 'webkitTransitionEnd',
- MozTransition: 'transitionend',
- OTransition: 'oTransitionEnd otransitionend',
- transition: 'transitionend'
- };
- collection_1.StringMapWrapper.forEach(transEndEventNames, function (value, key) {
- if (lang_1.isPresent(_this.getStyle(element, key))) {
- _this._transitionEnd = value;
- }
- });
- }
- catch (e) {
- this._animationPrefix = null;
- this._transitionEnd = null;
- }
- }
- GenericBrowserDomAdapter.prototype.getXHR = function () { return xhr_impl_1.XHRImpl; };
- GenericBrowserDomAdapter.prototype.getDistributedNodes = function (el) { return el.getDistributedNodes(); };
- GenericBrowserDomAdapter.prototype.resolveAndSetHref = function (el, baseUrl, href) {
- el.href = href == null ? baseUrl : baseUrl + '/../' + href;
- };
- GenericBrowserDomAdapter.prototype.supportsDOMEvents = function () { return true; };
- GenericBrowserDomAdapter.prototype.supportsNativeShadowDOM = function () {
- return lang_1.isFunction(this.defaultDoc().body.createShadowRoot);
- };
- GenericBrowserDomAdapter.prototype.getAnimationPrefix = function () {
- return lang_1.isPresent(this._animationPrefix) ? this._animationPrefix : "";
- };
- GenericBrowserDomAdapter.prototype.getTransitionEnd = function () { return lang_1.isPresent(this._transitionEnd) ? this._transitionEnd : ""; };
- GenericBrowserDomAdapter.prototype.supportsAnimation = function () {
- return lang_1.isPresent(this._animationPrefix) && lang_1.isPresent(this._transitionEnd);
- };
- return GenericBrowserDomAdapter;
- })(dom_adapter_1.DomAdapter);
- exports.GenericBrowserDomAdapter = GenericBrowserDomAdapter;
- /***/ },
- /* 199 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var promise_1 = __webpack_require__(61);
- var lang_1 = __webpack_require__(5);
- var xhr_1 = __webpack_require__(149);
- var XHRImpl = (function (_super) {
- __extends(XHRImpl, _super);
- function XHRImpl() {
- _super.apply(this, arguments);
- }
- XHRImpl.prototype.get = function (url) {
- var completer = promise_1.PromiseWrapper.completer();
- var xhr = new XMLHttpRequest();
- xhr.open('GET', url, true);
- xhr.responseType = 'text';
- xhr.onload = function () {
- // responseText is the old-school way of retrieving response (supported by IE8 & 9)
- // response/responseType properties were introduced in XHR Level2 spec (supported by IE10)
- var response = lang_1.isPresent(xhr.response) ? xhr.response : xhr.responseText;
- // normalize IE9 bug (http://bugs.jquery.com/ticket/1450)
- var status = xhr.status === 1223 ? 204 : xhr.status;
- // fix status code when it is 0 (0 status is undocumented).
- // Occurs when accessing file resources or on Android 4.1 stock browser
- // while retrieving files from application cache.
- if (status === 0) {
- status = response ? 200 : 0;
- }
- if (200 <= status && status <= 300) {
- completer.resolve(response);
- }
- else {
- completer.reject("Failed to load " + url, null);
- }
- };
- xhr.onerror = function () { completer.reject("Failed to load " + url, null); };
- xhr.send();
- return completer.promise;
- };
- return XHRImpl;
- })(xhr_1.XHR);
- exports.XHRImpl = XHRImpl;
- /***/ },
- /* 200 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var dom_adapter_1 = __webpack_require__(178);
- var core_1 = __webpack_require__(2);
- var PublicTestability = (function () {
- function PublicTestability(testability) {
- this._testability = testability;
- }
- PublicTestability.prototype.isStable = function () { return this._testability.isStable(); };
- PublicTestability.prototype.whenStable = function (callback) { this._testability.whenStable(callback); };
- PublicTestability.prototype.findBindings = function (using, provider, exactMatch) {
- return this.findProviders(using, provider, exactMatch);
- };
- PublicTestability.prototype.findProviders = function (using, provider, exactMatch) {
- return this._testability.findBindings(using, provider, exactMatch);
- };
- return PublicTestability;
- })();
- var BrowserGetTestability = (function () {
- function BrowserGetTestability() {
- }
- BrowserGetTestability.init = function () { core_1.setTestabilityGetter(new BrowserGetTestability()); };
- BrowserGetTestability.prototype.addToWindow = function (registry) {
- lang_1.global.getAngularTestability = function (elem, findInAncestors) {
- if (findInAncestors === void 0) { findInAncestors = true; }
- var testability = registry.findTestabilityInTree(elem, findInAncestors);
- if (testability == null) {
- throw new Error('Could not find testability for element.');
- }
- return new PublicTestability(testability);
- };
- lang_1.global.getAllAngularTestabilities = function () {
- var testabilities = registry.getAllTestabilities();
- return testabilities.map(function (testability) { return new PublicTestability(testability); });
- };
- };
- BrowserGetTestability.prototype.findTestabilityInTree = function (registry, elem, findInAncestors) {
- if (elem == null) {
- return null;
- }
- var t = registry.getTestability(elem);
- if (lang_1.isPresent(t)) {
- return t;
- }
- else if (!findInAncestors) {
- return null;
- }
- if (dom_adapter_1.DOM.isShadowRoot(elem)) {
- return this.findTestabilityInTree(registry, dom_adapter_1.DOM.getHost(elem), true);
- }
- return this.findTestabilityInTree(registry, dom_adapter_1.DOM.parentElement(elem), true);
- };
- return BrowserGetTestability;
- })();
- exports.BrowserGetTestability = BrowserGetTestability;
- /***/ },
- /* 201 */
- /***/ function(module, exports) {
- /**
- * This is here because DART requires it. It is noop in JS.
- */
- function wtfInit() { }
- exports.wtfInit = wtfInit;
- /***/ },
- /* 202 */
- /***/ function(module, exports, __webpack_require__) {
- var dom_adapter_1 = __webpack_require__(178);
- /**
- * A service that can be used to get and set the title of a current HTML document.
- *
- * Since an Angular 2 application can't be bootstrapped on the entire HTML document (`<html>` tag)
- * it is not possible to bind to the `text` property of the `HTMLTitleElement` elements
- * (representing the `<title>` tag). Instead, this service can be used to set and get the current
- * title value.
- */
- var Title = (function () {
- function Title() {
- }
- /**
- * Get the title of the current HTML document.
- * @returns {string}
- */
- Title.prototype.getTitle = function () { return dom_adapter_1.DOM.getTitle(); };
- /**
- * Set the title of the current HTML document.
- * @param newTitle
- */
- Title.prototype.setTitle = function (newTitle) { dom_adapter_1.DOM.setTitle(newTitle); };
- return Title;
- })();
- exports.Title = Title;
- /***/ },
- /* 203 */
- /***/ function(module, exports, __webpack_require__) {
- function __export(m) {
- for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
- }
- /**
- * This is a set of classes and objects that can be used both in the browser and on the server.
- */
- var dom_adapter_1 = __webpack_require__(178);
- exports.DOM = dom_adapter_1.DOM;
- exports.setRootDomAdapter = dom_adapter_1.setRootDomAdapter;
- exports.DomAdapter = dom_adapter_1.DomAdapter;
- var dom_renderer_1 = __webpack_require__(188);
- exports.DomRenderer = dom_renderer_1.DomRenderer;
- var dom_tokens_1 = __webpack_require__(187);
- exports.DOCUMENT = dom_tokens_1.DOCUMENT;
- var shared_styles_host_1 = __webpack_require__(196);
- exports.SharedStylesHost = shared_styles_host_1.SharedStylesHost;
- exports.DomSharedStylesHost = shared_styles_host_1.DomSharedStylesHost;
- var dom_events_1 = __webpack_require__(182);
- exports.DomEventsPlugin = dom_events_1.DomEventsPlugin;
- var event_manager_1 = __webpack_require__(183);
- exports.EVENT_MANAGER_PLUGINS = event_manager_1.EVENT_MANAGER_PLUGINS;
- exports.EventManager = event_manager_1.EventManager;
- exports.EventManagerPlugin = event_manager_1.EventManagerPlugin;
- __export(__webpack_require__(204));
- __export(__webpack_require__(205));
- /***/ },
- /* 204 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var dom_adapter_1 = __webpack_require__(178);
- /**
- * Predicates for use with {@link DebugElement}'s query functions.
- */
- var By = (function () {
- function By() {
- }
- /**
- * Match all elements.
- *
- * ## Example
- *
- * {@example platform/dom/debug/ts/by/by.ts region='by_all'}
- */
- By.all = function () { return function (debugElement) { return true; }; };
- /**
- * Match elements by the given CSS selector.
- *
- * ## Example
- *
- * {@example platform/dom/debug/ts/by/by.ts region='by_css'}
- */
- By.css = function (selector) {
- return function (debugElement) {
- return lang_1.isPresent(debugElement.nativeElement) ?
- dom_adapter_1.DOM.elementMatches(debugElement.nativeElement, selector) :
- false;
- };
- };
- /**
- * Match elements that have the given directive present.
- *
- * ## Example
- *
- * {@example platform/dom/debug/ts/by/by.ts region='by_directive'}
- */
- By.directive = function (type) {
- return function (debugElement) { return debugElement.hasDirective(type); };
- };
- return By;
- })();
- exports.By = By;
- /***/ },
- /* 205 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var lang_1 = __webpack_require__(5);
- var collection_1 = __webpack_require__(12);
- var di_1 = __webpack_require__(6);
- var view_listener_1 = __webpack_require__(86);
- var dom_adapter_1 = __webpack_require__(178);
- var api_1 = __webpack_require__(72);
- var debug_element_1 = __webpack_require__(101);
- var NG_ID_PROPERTY = 'ngid';
- var INSPECT_GLOBAL_NAME = 'ng.probe';
- var NG_ID_SEPARATOR = '#';
- // Need to keep the views in a global Map so that multiple angular apps are supported
- var _allIdsByView = new collection_1.Map();
- var _allViewsById = new collection_1.Map();
- var _nextId = 0;
- function _setElementId(element, indices) {
- if (lang_1.isPresent(element) && dom_adapter_1.DOM.isElementNode(element)) {
- dom_adapter_1.DOM.setData(element, NG_ID_PROPERTY, indices.join(NG_ID_SEPARATOR));
- }
- }
- function _getElementId(element) {
- var elId = dom_adapter_1.DOM.getData(element, NG_ID_PROPERTY);
- if (lang_1.isPresent(elId)) {
- return elId.split(NG_ID_SEPARATOR).map(function (partStr) { return lang_1.NumberWrapper.parseInt(partStr, 10); });
- }
- else {
- return null;
- }
- }
- /**
- * Returns a {@link DebugElement} for the given native DOM element, or
- * null if the given native element does not have an Angular view associated
- * with it.
- */
- function inspectNativeElement(element) {
- var elId = _getElementId(element);
- if (lang_1.isPresent(elId)) {
- var view = _allViewsById.get(elId[0]);
- if (lang_1.isPresent(view)) {
- return new debug_element_1.DebugElement_(view, elId[1]);
- }
- }
- return null;
- }
- exports.inspectNativeElement = inspectNativeElement;
- var DebugElementViewListener = (function () {
- function DebugElementViewListener(_renderer) {
- this._renderer = _renderer;
- dom_adapter_1.DOM.setGlobalVar(INSPECT_GLOBAL_NAME, inspectNativeElement);
- }
- DebugElementViewListener.prototype.onViewCreated = function (view) {
- var viewId = _nextId++;
- _allViewsById.set(viewId, view);
- _allIdsByView.set(view, viewId);
- for (var i = 0; i < view.elementRefs.length; i++) {
- var el = view.elementRefs[i];
- _setElementId(this._renderer.getNativeElementSync(el), [viewId, i]);
- }
- };
- DebugElementViewListener.prototype.onViewDestroyed = function (view) {
- var viewId = _allIdsByView.get(view);
- _allIdsByView.delete(view);
- _allViewsById.delete(viewId);
- };
- DebugElementViewListener = __decorate([
- di_1.Injectable(),
- __metadata('design:paramtypes', [api_1.Renderer])
- ], DebugElementViewListener);
- return DebugElementViewListener;
- })();
- exports.DebugElementViewListener = DebugElementViewListener;
- /**
- * Providers which support debugging Angular applications (e.g. via `ng.probe`).
- *
- * ## Example
- *
- * {@example platform/dom/debug/ts/debug_element_view_listener/providers.ts region='providers'}
- */
- exports.ELEMENT_PROBE_PROVIDERS = lang_1.CONST_EXPR([
- DebugElementViewListener,
- lang_1.CONST_EXPR(new di_1.Provider(view_listener_1.AppViewListener, { useExisting: DebugElementViewListener })),
- ]);
- /**
- * Use {@link ELEMENT_PROBE_PROVIDERS}.
- *
- * @deprecated
- */
- exports.ELEMENT_PROBE_BINDINGS = exports.ELEMENT_PROBE_PROVIDERS;
- /***/ },
- /* 206 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var common_tools_1 = __webpack_require__(207);
- var context = lang_1.global;
- /**
- * Enabled Angular 2 debug tools that are accessible via your browser's
- * developer console.
- *
- * Usage:
- *
- * 1. Open developer console (e.g. in Chrome Ctrl + Shift + j)
- * 1. Type `ng.` (usually the console will show auto-complete suggestion)
- * 1. Try the change detection profiler `ng.profiler.timeChangeDetection()`
- * then hit Enter.
- */
- function enableDebugTools(ref) {
- context.ng = new common_tools_1.AngularTools(ref);
- }
- exports.enableDebugTools = enableDebugTools;
- /**
- * Disables Angular 2 tools.
- */
- function disableDebugTools() {
- delete context.ng;
- }
- exports.disableDebugTools = disableDebugTools;
- /***/ },
- /* 207 */
- /***/ function(module, exports, __webpack_require__) {
- var application_ref_1 = __webpack_require__(65);
- var lang_1 = __webpack_require__(5);
- var browser_1 = __webpack_require__(208);
- var dom_adapter_1 = __webpack_require__(178);
- /**
- * Entry point for all Angular debug tools. This object corresponds to the `ng`
- * global variable accessible in the dev console.
- */
- var AngularTools = (function () {
- function AngularTools(ref) {
- this.profiler = new AngularProfiler(ref);
- }
- return AngularTools;
- })();
- exports.AngularTools = AngularTools;
- /**
- * Entry point for all Angular profiling-related debug tools. This object
- * corresponds to the `ng.profiler` in the dev console.
- */
- var AngularProfiler = (function () {
- function AngularProfiler(ref) {
- this.appRef = ref.injector.get(application_ref_1.ApplicationRef);
- }
- /**
- * Exercises change detection in a loop and then prints the average amount of
- * time in milliseconds how long a single round of change detection takes for
- * the current state of the UI. It runs a minimum of 5 rounds for a minimum
- * of 500 milliseconds.
- *
- * Optionally, a user may pass a `config` parameter containing a map of
- * options. Supported options are:
- *
- * `record` (boolean) - causes the profiler to record a CPU profile while
- * it exercises the change detector. Example:
- *
- * ```
- * ng.profiler.timeChangeDetection({record: true})
- * ```
- */
- AngularProfiler.prototype.timeChangeDetection = function (config) {
- var record = lang_1.isPresent(config) && config['record'];
- var profileName = 'Change Detection';
- // Profiler is not available in Android browsers, nor in IE 9 without dev tools opened
- var isProfilerAvailable = lang_1.isPresent(browser_1.window.console.profile);
- if (record && isProfilerAvailable) {
- browser_1.window.console.profile(profileName);
- }
- var start = dom_adapter_1.DOM.performanceNow();
- var numTicks = 0;
- while (numTicks < 5 || (dom_adapter_1.DOM.performanceNow() - start) < 500) {
- this.appRef.tick();
- numTicks++;
- }
- var end = dom_adapter_1.DOM.performanceNow();
- if (record && isProfilerAvailable) {
- // need to cast to <any> because type checker thinks there's no argument
- // while in fact there is:
- //
- // https://developer.mozilla.org/en-US/docs/Web/API/Console/profileEnd
- browser_1.window.console.profileEnd(profileName);
- }
- var msPerTick = (end - start) / numTicks;
- browser_1.window.console.log("ran " + numTicks + " change detection cycles");
- browser_1.window.console.log(lang_1.NumberWrapper.toFixed(msPerTick, 2) + " ms per check");
- };
- return AngularProfiler;
- })();
- exports.AngularProfiler = AngularProfiler;
- /***/ },
- /* 208 */
- /***/ function(module, exports) {
- /**
- * JS version of browser APIs. This library can only run in the browser.
- */
- var win = window;
- exports.window = win;
- exports.document = window.document;
- exports.location = window.location;
- exports.gc = window['gc'] ? function () { return window['gc'](); } : function () { return null; };
- exports.performance = window['performance'] ? window['performance'] : null;
- exports.Event = window['Event'];
- exports.MouseEvent = window['MouseEvent'];
- exports.KeyboardEvent = window['KeyboardEvent'];
- exports.EventTarget = window['EventTarget'];
- exports.History = window['History'];
- exports.Location = window['Location'];
- exports.EventListener = window['EventListener'];
- /***/ },
- /* 209 */
- /***/ function(module, exports, __webpack_require__) {
- /**
- * @module
- * @description
- * The http module provides services to perform http requests. To get started, see the {@link Http}
- * class.
- */
- var core_1 = __webpack_require__(2);
- var http_1 = __webpack_require__(210);
- var xhr_backend_1 = __webpack_require__(218);
- var jsonp_backend_1 = __webpack_require__(222);
- var browser_xhr_1 = __webpack_require__(221);
- var browser_jsonp_1 = __webpack_require__(223);
- var base_request_options_1 = __webpack_require__(216);
- var base_response_options_1 = __webpack_require__(220);
- var static_request_1 = __webpack_require__(212);
- exports.Request = static_request_1.Request;
- var static_response_1 = __webpack_require__(219);
- exports.Response = static_response_1.Response;
- var interfaces_1 = __webpack_require__(211);
- exports.Connection = interfaces_1.Connection;
- exports.ConnectionBackend = interfaces_1.ConnectionBackend;
- var browser_xhr_2 = __webpack_require__(221);
- exports.BrowserXhr = browser_xhr_2.BrowserXhr;
- var base_request_options_2 = __webpack_require__(216);
- exports.BaseRequestOptions = base_request_options_2.BaseRequestOptions;
- exports.RequestOptions = base_request_options_2.RequestOptions;
- var base_response_options_2 = __webpack_require__(220);
- exports.BaseResponseOptions = base_response_options_2.BaseResponseOptions;
- exports.ResponseOptions = base_response_options_2.ResponseOptions;
- var xhr_backend_2 = __webpack_require__(218);
- exports.XHRBackend = xhr_backend_2.XHRBackend;
- exports.XHRConnection = xhr_backend_2.XHRConnection;
- var jsonp_backend_2 = __webpack_require__(222);
- exports.JSONPBackend = jsonp_backend_2.JSONPBackend;
- exports.JSONPConnection = jsonp_backend_2.JSONPConnection;
- var http_2 = __webpack_require__(210);
- exports.Http = http_2.Http;
- exports.Jsonp = http_2.Jsonp;
- var headers_1 = __webpack_require__(213);
- exports.Headers = headers_1.Headers;
- var enums_1 = __webpack_require__(215);
- exports.ResponseType = enums_1.ResponseType;
- exports.ReadyState = enums_1.ReadyState;
- exports.RequestMethod = enums_1.RequestMethod;
- var url_search_params_1 = __webpack_require__(217);
- exports.URLSearchParams = url_search_params_1.URLSearchParams;
- /**
- * Provides a basic set of injectables to use the {@link Http} service in any application.
- *
- * The `HTTP_PROVIDERS` should be included either in a component's injector,
- * or in the root injector when bootstrapping an application.
- *
- * ### Example ([live demo](http://plnkr.co/edit/snj7Nv?p=preview))
- *
- * ```
- * import {Component} from 'angular2/core';
- * import {bootstrap} from 'angular2/platform/browser';
- * import {NgFor} from 'angular2/common';
- * import {HTTP_PROVIDERS, Http} from 'angular2/http';
- *
- * @Component({
- * selector: 'app',
- * providers: [HTTP_PROVIDERS],
- * template: `
- * <div>
- * <h1>People</h1>
- * <ul>
- * <li *ngFor="#person of people">
- * {{person.name}}
- * </li>
- * </ul>
- * </div>
- * `,
- * directives: [NgFor]
- * })
- * export class App {
- * people: Object[];
- * constructor(http:Http) {
- * http.get('people.json').subscribe(res => {
- * this.people = res.json();
- * });
- * }
- * active:boolean = false;
- * toggleActiveState() {
- * this.active = !this.active;
- * }
- * }
- *
- * bootstrap(App)
- * .catch(err => console.error(err));
- * ```
- *
- * The primary public API included in `HTTP_PROVIDERS` is the {@link Http} class.
- * However, other providers required by `Http` are included,
- * which may be beneficial to override in certain cases.
- *
- * The providers included in `HTTP_PROVIDERS` include:
- * * {@link Http}
- * * {@link XHRBackend}
- * * `BrowserXHR` - Private factory to create `XMLHttpRequest` instances
- * * {@link RequestOptions} - Bound to {@link BaseRequestOptions} class
- * * {@link ResponseOptions} - Bound to {@link BaseResponseOptions} class
- *
- * There may be cases where it makes sense to extend the base request options,
- * such as to add a search string to be appended to all URLs.
- * To accomplish this, a new provider for {@link RequestOptions} should
- * be added in the same injector as `HTTP_PROVIDERS`.
- *
- * ### Example ([live demo](http://plnkr.co/edit/aCMEXi?p=preview))
- *
- * ```
- * import {provide} from 'angular2/core';
- * import {bootstrap} from 'angular2/platform/browser';
- * import {HTTP_PROVIDERS, BaseRequestOptions, RequestOptions} from 'angular2/http';
- *
- * class MyOptions extends BaseRequestOptions {
- * search: string = 'coreTeam=true';
- * }
- *
- * bootstrap(App, [HTTP_PROVIDERS, provide(RequestOptions, {useClass: MyOptions})])
- * .catch(err => console.error(err));
- * ```
- *
- * Likewise, to use a mock backend for unit tests, the {@link XHRBackend}
- * provider should be bound to {@link MockBackend}.
- *
- * ### Example ([live demo](http://plnkr.co/edit/7LWALD?p=preview))
- *
- * ```
- * import {provide} from 'angular2/core';
- * import {bootstrap} from 'angular2/platform/browser';
- * import {HTTP_PROVIDERS, Http, Response, XHRBackend} from 'angular2/http';
- * import {MockBackend} from 'angular2/http/testing';
- *
- * var people = [{name: 'Jeff'}, {name: 'Tobias'}];
- *
- * var injector = Injector.resolveAndCreate([
- * HTTP_PROVIDERS,
- * MockBackend,
- * provide(XHRBackend, {useExisting: MockBackend})
- * ]);
- * var http = injector.get(Http);
- * var backend = injector.get(MockBackend);
- *
- * // Listen for any new requests
- * backend.connections.observer({
- * next: connection => {
- * var response = new Response({body: people});
- * setTimeout(() => {
- * // Send a response to the request
- * connection.mockRespond(response);
- * });
- * });
- *
- * http.get('people.json').observer({
- * next: res => {
- * // Response came from mock backend
- * console.log('first person', res.json()[0].name);
- * }
- * });
- * ```
- */
- exports.HTTP_PROVIDERS = [
- // TODO(pascal): use factory type annotations once supported in DI
- // issue: https://github.com/angular/angular/issues/3183
- core_1.provide(http_1.Http, {
- useFactory: function (xhrBackend, requestOptions) { return new http_1.Http(xhrBackend, requestOptions); },
- deps: [xhr_backend_1.XHRBackend, base_request_options_1.RequestOptions]
- }),
- browser_xhr_1.BrowserXhr,
- core_1.provide(base_request_options_1.RequestOptions, { useClass: base_request_options_1.BaseRequestOptions }),
- core_1.provide(base_response_options_1.ResponseOptions, { useClass: base_response_options_1.BaseResponseOptions }),
- xhr_backend_1.XHRBackend
- ];
- /**
- * See {@link HTTP_PROVIDERS} instead.
- *
- * @deprecated
- */
- exports.HTTP_BINDINGS = exports.HTTP_PROVIDERS;
- /**
- * Provides a basic set of providers to use the {@link Jsonp} service in any application.
- *
- * The `JSONP_PROVIDERS` should be included either in a component's injector,
- * or in the root injector when bootstrapping an application.
- *
- * ### Example ([live demo](http://plnkr.co/edit/vmeN4F?p=preview))
- *
- * ```
- * import {Component} from 'angular2/core';
- * import {NgFor} from 'angular2/common';
- * import {JSONP_PROVIDERS, Jsonp} from 'angular2/http';
- *
- * @Component({
- * selector: 'app',
- * providers: [JSONP_PROVIDERS],
- * template: `
- * <div>
- * <h1>People</h1>
- * <ul>
- * <li *ngFor="#person of people">
- * {{person.name}}
- * </li>
- * </ul>
- * </div>
- * `,
- * directives: [NgFor]
- * })
- * export class App {
- * people: Array<Object>;
- * constructor(jsonp:Jsonp) {
- * jsonp.request('people.json').subscribe(res => {
- * this.people = res.json();
- * })
- * }
- * }
- * ```
- *
- * The primary public API included in `JSONP_PROVIDERS` is the {@link Jsonp} class.
- * However, other providers required by `Jsonp` are included,
- * which may be beneficial to override in certain cases.
- *
- * The providers included in `JSONP_PROVIDERS` include:
- * * {@link Jsonp}
- * * {@link JSONPBackend}
- * * `BrowserJsonp` - Private factory
- * * {@link RequestOptions} - Bound to {@link BaseRequestOptions} class
- * * {@link ResponseOptions} - Bound to {@link BaseResponseOptions} class
- *
- * There may be cases where it makes sense to extend the base request options,
- * such as to add a search string to be appended to all URLs.
- * To accomplish this, a new provider for {@link RequestOptions} should
- * be added in the same injector as `JSONP_PROVIDERS`.
- *
- * ### Example ([live demo](http://plnkr.co/edit/TFug7x?p=preview))
- *
- * ```
- * import {provide} from 'angular2/core';
- * import {bootstrap} from 'angular2/platform/browser';
- * import {JSONP_PROVIDERS, BaseRequestOptions, RequestOptions} from 'angular2/http';
- *
- * class MyOptions extends BaseRequestOptions {
- * search: string = 'coreTeam=true';
- * }
- *
- * bootstrap(App, [JSONP_PROVIDERS, provide(RequestOptions, {useClass: MyOptions})])
- * .catch(err => console.error(err));
- * ```
- *
- * Likewise, to use a mock backend for unit tests, the {@link JSONPBackend}
- * provider should be bound to {@link MockBackend}.
- *
- * ### Example ([live demo](http://plnkr.co/edit/HDqZWL?p=preview))
- *
- * ```
- * import {provide, Injector} from 'angular2/core';
- * import {JSONP_PROVIDERS, Jsonp, Response, JSONPBackend} from 'angular2/http';
- * import {MockBackend} from 'angular2/http/testing';
- *
- * var people = [{name: 'Jeff'}, {name: 'Tobias'}];
- * var injector = Injector.resolveAndCreate([
- * JSONP_PROVIDERS,
- * MockBackend,
- * provide(JSONPBackend, {useExisting: MockBackend})
- * ]);
- * var jsonp = injector.get(Jsonp);
- * var backend = injector.get(MockBackend);
- *
- * // Listen for any new requests
- * backend.connections.observer({
- * next: connection => {
- * var response = new Response({body: people});
- * setTimeout(() => {
- * // Send a response to the request
- * connection.mockRespond(response);
- * });
- * });
-
- * jsonp.get('people.json').observer({
- * next: res => {
- * // Response came from mock backend
- * console.log('first person', res.json()[0].name);
- * }
- * });
- * ```
- */
- exports.JSONP_PROVIDERS = [
- // TODO(pascal): use factory type annotations once supported in DI
- // issue: https://github.com/angular/angular/issues/3183
- core_1.provide(http_1.Jsonp, {
- useFactory: function (jsonpBackend, requestOptions) { return new http_1.Jsonp(jsonpBackend, requestOptions); },
- deps: [jsonp_backend_1.JSONPBackend, base_request_options_1.RequestOptions]
- }),
- browser_jsonp_1.BrowserJsonp,
- core_1.provide(base_request_options_1.RequestOptions, { useClass: base_request_options_1.BaseRequestOptions }),
- core_1.provide(base_response_options_1.ResponseOptions, { useClass: base_response_options_1.BaseResponseOptions }),
- core_1.provide(jsonp_backend_1.JSONPBackend, { useClass: jsonp_backend_1.JSONPBackend_ })
- ];
- /**
- * See {@link JSONP_PROVIDERS} instead.
- *
- * @deprecated
- */
- exports.JSON_BINDINGS = exports.JSONP_PROVIDERS;
- /***/ },
- /* 210 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var core_1 = __webpack_require__(2);
- var interfaces_1 = __webpack_require__(211);
- var static_request_1 = __webpack_require__(212);
- var base_request_options_1 = __webpack_require__(216);
- var enums_1 = __webpack_require__(215);
- function httpRequest(backend, request) {
- return backend.createConnection(request).response;
- }
- function mergeOptions(defaultOpts, providedOpts, method, url) {
- var newOptions = defaultOpts;
- if (lang_1.isPresent(providedOpts)) {
- // Hack so Dart can used named parameters
- return newOptions.merge(new base_request_options_1.RequestOptions({
- method: providedOpts.method || method,
- url: providedOpts.url || url,
- search: providedOpts.search,
- headers: providedOpts.headers,
- body: providedOpts.body
- }));
- }
- if (lang_1.isPresent(method)) {
- return newOptions.merge(new base_request_options_1.RequestOptions({ method: method, url: url }));
- }
- else {
- return newOptions.merge(new base_request_options_1.RequestOptions({ url: url }));
- }
- }
- /**
- * Performs http requests using `XMLHttpRequest` as the default backend.
- *
- * `Http` is available as an injectable class, with methods to perform http requests. Calling
- * `request` returns an `Observable` which will emit a single {@link Response} when a
- * response is received.
- *
- * ### Example
- *
- * ```typescript
- * import {Http, HTTP_PROVIDERS} from 'angular2/http';
- * @Component({
- * selector: 'http-app',
- * viewProviders: [HTTP_PROVIDERS],
- * templateUrl: 'people.html'
- * })
- * class PeopleComponent {
- * constructor(http: Http) {
- * http.get('people.json')
- * // Call map on the response observable to get the parsed people object
- * .map(res => res.json())
- * // Subscribe to the observable to get the parsed people object and attach it to the
- * // component
- * .subscribe(people => this.people = people);
- * }
- * }
- * ```
- *
- *
- * ### Example
- *
- * ```
- * http.get('people.json').observer({next: (value) => this.people = value});
- * ```
- *
- * The default construct used to perform requests, `XMLHttpRequest`, is abstracted as a "Backend" (
- * {@link XHRBackend} in this case), which could be mocked with dependency injection by replacing
- * the {@link XHRBackend} provider, as in the following example:
- *
- * ### Example
- *
- * ```typescript
- * import {BaseRequestOptions, Http} from 'angular2/http';
- * import {MockBackend} from 'angular2/http/testing';
- * var injector = Injector.resolveAndCreate([
- * BaseRequestOptions,
- * MockBackend,
- * provide(Http, {useFactory:
- * function(backend, defaultOptions) {
- * return new Http(backend, defaultOptions);
- * },
- * deps: [MockBackend, BaseRequestOptions]})
- * ]);
- * var http = injector.get(Http);
- * http.get('request-from-mock-backend.json').subscribe((res:Response) => doSomething(res));
- * ```
- *
- **/
- var Http = (function () {
- function Http(_backend, _defaultOptions) {
- this._backend = _backend;
- this._defaultOptions = _defaultOptions;
- }
- /**
- * Performs any type of http request. First argument is required, and can either be a url or
- * a {@link Request} instance. If the first argument is a url, an optional {@link RequestOptions}
- * object can be provided as the 2nd argument. The options object will be merged with the values
- * of {@link BaseRequestOptions} before performing the request.
- */
- Http.prototype.request = function (url, options) {
- var responseObservable;
- if (lang_1.isString(url)) {
- responseObservable = httpRequest(this._backend, new static_request_1.Request(mergeOptions(this._defaultOptions, options, enums_1.RequestMethod.Get, url)));
- }
- else if (url instanceof static_request_1.Request) {
- responseObservable = httpRequest(this._backend, url);
- }
- else {
- throw exceptions_1.makeTypeError('First argument must be a url string or Request instance.');
- }
- return responseObservable;
- };
- /**
- * Performs a request with `get` http method.
- */
- Http.prototype.get = function (url, options) {
- return httpRequest(this._backend, new static_request_1.Request(mergeOptions(this._defaultOptions, options, enums_1.RequestMethod.Get, url)));
- };
- /**
- * Performs a request with `post` http method.
- */
- Http.prototype.post = function (url, body, options) {
- return httpRequest(this._backend, new static_request_1.Request(mergeOptions(this._defaultOptions.merge(new base_request_options_1.RequestOptions({ body: body })), options, enums_1.RequestMethod.Post, url)));
- };
- /**
- * Performs a request with `put` http method.
- */
- Http.prototype.put = function (url, body, options) {
- return httpRequest(this._backend, new static_request_1.Request(mergeOptions(this._defaultOptions.merge(new base_request_options_1.RequestOptions({ body: body })), options, enums_1.RequestMethod.Put, url)));
- };
- /**
- * Performs a request with `delete` http method.
- */
- Http.prototype.delete = function (url, options) {
- return httpRequest(this._backend, new static_request_1.Request(mergeOptions(this._defaultOptions, options, enums_1.RequestMethod.Delete, url)));
- };
- /**
- * Performs a request with `patch` http method.
- */
- Http.prototype.patch = function (url, body, options) {
- return httpRequest(this._backend, new static_request_1.Request(mergeOptions(this._defaultOptions.merge(new base_request_options_1.RequestOptions({ body: body })), options, enums_1.RequestMethod.Patch, url)));
- };
- /**
- * Performs a request with `head` http method.
- */
- Http.prototype.head = function (url, options) {
- return httpRequest(this._backend, new static_request_1.Request(mergeOptions(this._defaultOptions, options, enums_1.RequestMethod.Head, url)));
- };
- Http = __decorate([
- core_1.Injectable(),
- __metadata('design:paramtypes', [interfaces_1.ConnectionBackend, base_request_options_1.RequestOptions])
- ], Http);
- return Http;
- })();
- exports.Http = Http;
- var Jsonp = (function (_super) {
- __extends(Jsonp, _super);
- function Jsonp(backend, defaultOptions) {
- _super.call(this, backend, defaultOptions);
- }
- /**
- * Performs any type of http request. First argument is required, and can either be a url or
- * a {@link Request} instance. If the first argument is a url, an optional {@link RequestOptions}
- * object can be provided as the 2nd argument. The options object will be merged with the values
- * of {@link BaseRequestOptions} before performing the request.
- */
- Jsonp.prototype.request = function (url, options) {
- var responseObservable;
- if (lang_1.isString(url)) {
- url = new static_request_1.Request(mergeOptions(this._defaultOptions, options, enums_1.RequestMethod.Get, url));
- }
- if (url instanceof static_request_1.Request) {
- if (url.method !== enums_1.RequestMethod.Get) {
- exceptions_1.makeTypeError('JSONP requests must use GET request method.');
- }
- responseObservable = httpRequest(this._backend, url);
- }
- else {
- throw exceptions_1.makeTypeError('First argument must be a url string or Request instance.');
- }
- return responseObservable;
- };
- Jsonp = __decorate([
- core_1.Injectable(),
- __metadata('design:paramtypes', [interfaces_1.ConnectionBackend, base_request_options_1.RequestOptions])
- ], Jsonp);
- return Jsonp;
- })(Http);
- exports.Jsonp = Jsonp;
- /***/ },
- /* 211 */
- /***/ function(module, exports) {
- /**
- * Abstract class from which real backends are derived.
- *
- * The primary purpose of a `ConnectionBackend` is to create new connections to fulfill a given
- * {@link Request}.
- */
- var ConnectionBackend = (function () {
- function ConnectionBackend() {
- }
- return ConnectionBackend;
- })();
- exports.ConnectionBackend = ConnectionBackend;
- /**
- * Abstract class from which real connections are derived.
- */
- var Connection = (function () {
- function Connection() {
- }
- return Connection;
- })();
- exports.Connection = Connection;
- /***/ },
- /* 212 */
- /***/ function(module, exports, __webpack_require__) {
- var headers_1 = __webpack_require__(213);
- var http_utils_1 = __webpack_require__(214);
- var lang_1 = __webpack_require__(5);
- // TODO(jeffbcross): properly implement body accessors
- /**
- * Creates `Request` instances from provided values.
- *
- * The Request's interface is inspired by the Request constructor defined in the [Fetch
- * Spec](https://fetch.spec.whatwg.org/#request-class),
- * but is considered a static value whose body can be accessed many times. There are other
- * differences in the implementation, but this is the most significant.
- *
- * `Request` instances are typically created by higher-level classes, like {@link Http} and
- * {@link Jsonp}, but it may occasionally be useful to explicitly create `Request` instances.
- * One such example is when creating services that wrap higher-level services, like {@link Http},
- * where it may be useful to generate a `Request` with arbitrary headers and search params.
- *
- * ```typescript
- * import {Injectable, Injector} from 'angular2/core';
- * import {HTTP_PROVIDERS, Http, Request, RequestMethod} from 'angular2/http';
- *
- * @Injectable()
- * class AutoAuthenticator {
- * constructor(public http:Http) {}
- * request(url:string) {
- * return this.http.request(new Request({
- * method: RequestMethod.Get,
- * url: url,
- * search: 'password=123'
- * }));
- * }
- * }
- *
- * var injector = Injector.resolveAndCreate([HTTP_PROVIDERS, AutoAuthenticator]);
- * var authenticator = injector.get(AutoAuthenticator);
- * authenticator.request('people.json').subscribe(res => {
- * //URL should have included '?password=123'
- * console.log('people', res.json());
- * });
- * ```
- */
- var Request = (function () {
- function Request(requestOptions) {
- // TODO: assert that url is present
- var url = requestOptions.url;
- this.url = requestOptions.url;
- if (lang_1.isPresent(requestOptions.search)) {
- var search = requestOptions.search.toString();
- if (search.length > 0) {
- var prefix = '?';
- if (lang_1.StringWrapper.contains(this.url, '?')) {
- prefix = (this.url[this.url.length - 1] == '&') ? '' : '&';
- }
- // TODO: just delete search-query-looking string in url?
- this.url = url + prefix + search;
- }
- }
- this._body = requestOptions.body;
- this.method = http_utils_1.normalizeMethodName(requestOptions.method);
- // TODO(jeffbcross): implement behavior
- // Defaults to 'omit', consistent with browser
- // TODO(jeffbcross): implement behavior
- this.headers = new headers_1.Headers(requestOptions.headers);
- }
- /**
- * Returns the request's body as string, assuming that body exists. If body is undefined, return
- * empty
- * string.
- */
- Request.prototype.text = function () { return lang_1.isPresent(this._body) ? this._body.toString() : ''; };
- return Request;
- })();
- exports.Request = Request;
- /***/ },
- /* 213 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var collection_1 = __webpack_require__(12);
- /**
- * Polyfill for [Headers](https://developer.mozilla.org/en-US/docs/Web/API/Headers/Headers), as
- * specified in the [Fetch Spec](https://fetch.spec.whatwg.org/#headers-class).
- *
- * The only known difference between this `Headers` implementation and the spec is the
- * lack of an `entries` method.
- *
- * ### Example ([live demo](http://plnkr.co/edit/MTdwT6?p=preview))
- *
- * ```
- * import {Headers} from 'angular2/http';
- *
- * var firstHeaders = new Headers();
- * firstHeaders.append('Content-Type', 'image/jpeg');
- * console.log(firstHeaders.get('Content-Type')) //'image/jpeg'
- *
- * // Create headers from Plain Old JavaScript Object
- * var secondHeaders = new Headers({
- * 'X-My-Custom-Header': 'Angular'
- * });
- * console.log(secondHeaders.get('X-My-Custom-Header')); //'Angular'
- *
- * var thirdHeaders = new Headers(secondHeaders);
- * console.log(thirdHeaders.get('X-My-Custom-Header')); //'Angular'
- * ```
- */
- var Headers = (function () {
- function Headers(headers) {
- var _this = this;
- if (headers instanceof Headers) {
- this._headersMap = headers._headersMap;
- return;
- }
- this._headersMap = new collection_1.Map();
- if (lang_1.isBlank(headers)) {
- return;
- }
- // headers instanceof StringMap
- collection_1.StringMapWrapper.forEach(headers, function (v, k) { _this._headersMap.set(k, collection_1.isListLikeIterable(v) ? v : [v]); });
- }
- /**
- * Returns a new Headers instance from the given DOMString of Response Headers
- */
- Headers.fromResponseHeaderString = function (headersString) {
- return headersString.trim()
- .split('\n')
- .map(function (val) { return val.split(':'); })
- .map(function (_a) {
- var key = _a[0], parts = _a.slice(1);
- return ([key.trim(), parts.join(':').trim()]);
- })
- .reduce(function (headers, _a) {
- var key = _a[0], value = _a[1];
- return !headers.set(key, value) && headers;
- }, new Headers());
- };
- /**
- * Appends a header to existing list of header values for a given header name.
- */
- Headers.prototype.append = function (name, value) {
- var mapName = this._headersMap.get(name);
- var list = collection_1.isListLikeIterable(mapName) ? mapName : [];
- list.push(value);
- this._headersMap.set(name, list);
- };
- /**
- * Deletes all header values for the given name.
- */
- Headers.prototype.delete = function (name) { this._headersMap.delete(name); };
- Headers.prototype.forEach = function (fn) {
- this._headersMap.forEach(fn);
- };
- /**
- * Returns first header that matches given name.
- */
- Headers.prototype.get = function (header) { return collection_1.ListWrapper.first(this._headersMap.get(header)); };
- /**
- * Check for existence of header by given name.
- */
- Headers.prototype.has = function (header) { return this._headersMap.has(header); };
- /**
- * Provides names of set headers
- */
- Headers.prototype.keys = function () { return collection_1.MapWrapper.keys(this._headersMap); };
- /**
- * Sets or overrides header value for given name.
- */
- Headers.prototype.set = function (header, value) {
- var list = [];
- if (collection_1.isListLikeIterable(value)) {
- var pushValue = value.join(',');
- list.push(pushValue);
- }
- else {
- list.push(value);
- }
- this._headersMap.set(header, list);
- };
- /**
- * Returns values of all headers.
- */
- Headers.prototype.values = function () { return collection_1.MapWrapper.values(this._headersMap); };
- /**
- * Returns string of all headers.
- */
- Headers.prototype.toJSON = function () { return lang_1.Json.stringify(this.values()); };
- /**
- * Returns list of header values for a given name.
- */
- Headers.prototype.getAll = function (header) {
- var headers = this._headersMap.get(header);
- return collection_1.isListLikeIterable(headers) ? headers : [];
- };
- /**
- * This method is not implemented.
- */
- Headers.prototype.entries = function () { throw new exceptions_1.BaseException('"entries" method is not implemented on Headers class'); };
- return Headers;
- })();
- exports.Headers = Headers;
- /***/ },
- /* 214 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var enums_1 = __webpack_require__(215);
- var exceptions_1 = __webpack_require__(14);
- function normalizeMethodName(method) {
- if (lang_1.isString(method)) {
- var originalMethod = method;
- method = method.replace(/(\w)(\w*)/g, function (g0, g1, g2) { return g1.toUpperCase() + g2.toLowerCase(); });
- method = enums_1.RequestMethod[method];
- if (typeof method !== 'number')
- throw exceptions_1.makeTypeError("Invalid request method. The method \"" + originalMethod + "\" is not supported.");
- }
- return method;
- }
- exports.normalizeMethodName = normalizeMethodName;
- exports.isSuccess = function (status) { return (status >= 200 && status < 300); };
- function getResponseURL(xhr) {
- if ('responseURL' in xhr) {
- return xhr.responseURL;
- }
- if (/^X-Request-URL:/m.test(xhr.getAllResponseHeaders())) {
- return xhr.getResponseHeader('X-Request-URL');
- }
- return;
- }
- exports.getResponseURL = getResponseURL;
- var lang_2 = __webpack_require__(5);
- exports.isJsObject = lang_2.isJsObject;
- /***/ },
- /* 215 */
- /***/ function(module, exports) {
- /**
- * Supported http methods.
- */
- (function (RequestMethod) {
- RequestMethod[RequestMethod["Get"] = 0] = "Get";
- RequestMethod[RequestMethod["Post"] = 1] = "Post";
- RequestMethod[RequestMethod["Put"] = 2] = "Put";
- RequestMethod[RequestMethod["Delete"] = 3] = "Delete";
- RequestMethod[RequestMethod["Options"] = 4] = "Options";
- RequestMethod[RequestMethod["Head"] = 5] = "Head";
- RequestMethod[RequestMethod["Patch"] = 6] = "Patch";
- })(exports.RequestMethod || (exports.RequestMethod = {}));
- var RequestMethod = exports.RequestMethod;
- /**
- * All possible states in which a connection can be, based on
- * [States](http://www.w3.org/TR/XMLHttpRequest/#states) from the `XMLHttpRequest` spec, but with an
- * additional "CANCELLED" state.
- */
- (function (ReadyState) {
- ReadyState[ReadyState["Unsent"] = 0] = "Unsent";
- ReadyState[ReadyState["Open"] = 1] = "Open";
- ReadyState[ReadyState["HeadersReceived"] = 2] = "HeadersReceived";
- ReadyState[ReadyState["Loading"] = 3] = "Loading";
- ReadyState[ReadyState["Done"] = 4] = "Done";
- ReadyState[ReadyState["Cancelled"] = 5] = "Cancelled";
- })(exports.ReadyState || (exports.ReadyState = {}));
- var ReadyState = exports.ReadyState;
- /**
- * Acceptable response types to be associated with a {@link Response}, based on
- * [ResponseType](https://fetch.spec.whatwg.org/#responsetype) from the Fetch spec.
- */
- (function (ResponseType) {
- ResponseType[ResponseType["Basic"] = 0] = "Basic";
- ResponseType[ResponseType["Cors"] = 1] = "Cors";
- ResponseType[ResponseType["Default"] = 2] = "Default";
- ResponseType[ResponseType["Error"] = 3] = "Error";
- ResponseType[ResponseType["Opaque"] = 4] = "Opaque";
- })(exports.ResponseType || (exports.ResponseType = {}));
- var ResponseType = exports.ResponseType;
- /***/ },
- /* 216 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var lang_1 = __webpack_require__(5);
- var headers_1 = __webpack_require__(213);
- var enums_1 = __webpack_require__(215);
- var core_1 = __webpack_require__(2);
- var url_search_params_1 = __webpack_require__(217);
- var http_utils_1 = __webpack_require__(214);
- /**
- * Creates a request options object to be optionally provided when instantiating a
- * {@link Request}.
- *
- * This class is based on the `RequestInit` description in the [Fetch
- * Spec](https://fetch.spec.whatwg.org/#requestinit).
- *
- * All values are null by default. Typical defaults can be found in the {@link BaseRequestOptions}
- * class, which sub-classes `RequestOptions`.
- *
- * ### Example ([live demo](http://plnkr.co/edit/7Wvi3lfLq41aQPKlxB4O?p=preview))
- *
- * ```typescript
- * import {RequestOptions, Request, RequestMethod} from 'angular2/http';
- *
- * var options = new RequestOptions({
- * method: RequestMethod.Post,
- * url: 'https://google.com'
- * });
- * var req = new Request(options);
- * console.log('req.method:', RequestMethod[req.method]); // Post
- * console.log('options.url:', options.url); // https://google.com
- * ```
- */
- var RequestOptions = (function () {
- function RequestOptions(_a) {
- var _b = _a === void 0 ? {} : _a, method = _b.method, headers = _b.headers, body = _b.body, url = _b.url, search = _b.search;
- this.method = lang_1.isPresent(method) ? http_utils_1.normalizeMethodName(method) : null;
- this.headers = lang_1.isPresent(headers) ? headers : null;
- this.body = lang_1.isPresent(body) ? body : null;
- this.url = lang_1.isPresent(url) ? url : null;
- this.search = lang_1.isPresent(search) ? (lang_1.isString(search) ? new url_search_params_1.URLSearchParams((search)) :
- (search)) :
- null;
- }
- /**
- * Creates a copy of the `RequestOptions` instance, using the optional input as values to override
- * existing values. This method will not change the values of the instance on which it is being
- * called.
- *
- * Note that `headers` and `search` will override existing values completely if present in
- * the `options` object. If these values should be merged, it should be done prior to calling
- * `merge` on the `RequestOptions` instance.
- *
- * ### Example ([live demo](http://plnkr.co/edit/6w8XA8YTkDRcPYpdB9dk?p=preview))
- *
- * ```typescript
- * import {RequestOptions, Request, RequestMethod} from 'angular2/http';
- *
- * var options = new RequestOptions({
- * method: RequestMethod.Post
- * });
- * var req = new Request(options.merge({
- * url: 'https://google.com'
- * }));
- * console.log('req.method:', RequestMethod[req.method]); // Post
- * console.log('options.url:', options.url); // null
- * console.log('req.url:', req.url); // https://google.com
- * ```
- */
- RequestOptions.prototype.merge = function (options) {
- return new RequestOptions({
- method: lang_1.isPresent(options) && lang_1.isPresent(options.method) ? options.method : this.method,
- headers: lang_1.isPresent(options) && lang_1.isPresent(options.headers) ? options.headers : this.headers,
- body: lang_1.isPresent(options) && lang_1.isPresent(options.body) ? options.body : this.body,
- url: lang_1.isPresent(options) && lang_1.isPresent(options.url) ? options.url : this.url,
- search: lang_1.isPresent(options) && lang_1.isPresent(options.search) ?
- (lang_1.isString(options.search) ? new url_search_params_1.URLSearchParams((options.search)) :
- (options.search).clone()) :
- this.search
- });
- };
- return RequestOptions;
- })();
- exports.RequestOptions = RequestOptions;
- /**
- * Subclass of {@link RequestOptions}, with default values.
- *
- * Default values:
- * * method: {@link RequestMethod RequestMethod.Get}
- * * headers: empty {@link Headers} object
- *
- * This class could be extended and bound to the {@link RequestOptions} class
- * when configuring an {@link Injector}, in order to override the default options
- * used by {@link Http} to create and send {@link Request Requests}.
- *
- * ### Example ([live demo](http://plnkr.co/edit/LEKVSx?p=preview))
- *
- * ```typescript
- * import {provide} from 'angular2/core';
- * import {bootstrap} from 'angular2/platform/browser';
- * import {HTTP_PROVIDERS, Http, BaseRequestOptions, RequestOptions} from 'angular2/http';
- * import {App} from './myapp';
- *
- * class MyOptions extends BaseRequestOptions {
- * search: string = 'coreTeam=true';
- * }
- *
- * bootstrap(App, [HTTP_PROVIDERS, provide(RequestOptions, {useClass: MyOptions})]);
- * ```
- *
- * The options could also be extended when manually creating a {@link Request}
- * object.
- *
- * ### Example ([live demo](http://plnkr.co/edit/oyBoEvNtDhOSfi9YxaVb?p=preview))
- *
- * ```
- * import {BaseRequestOptions, Request, RequestMethod} from 'angular2/http';
- *
- * var options = new BaseRequestOptions();
- * var req = new Request(options.merge({
- * method: RequestMethod.Post,
- * url: 'https://google.com'
- * }));
- * console.log('req.method:', RequestMethod[req.method]); // Post
- * console.log('options.url:', options.url); // null
- * console.log('req.url:', req.url); // https://google.com
- * ```
- */
- var BaseRequestOptions = (function (_super) {
- __extends(BaseRequestOptions, _super);
- function BaseRequestOptions() {
- _super.call(this, { method: enums_1.RequestMethod.Get, headers: new headers_1.Headers() });
- }
- BaseRequestOptions = __decorate([
- core_1.Injectable(),
- __metadata('design:paramtypes', [])
- ], BaseRequestOptions);
- return BaseRequestOptions;
- })(RequestOptions);
- exports.BaseRequestOptions = BaseRequestOptions;
- /***/ },
- /* 217 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var collection_1 = __webpack_require__(12);
- function paramParser(rawParams) {
- if (rawParams === void 0) { rawParams = ''; }
- var map = new collection_1.Map();
- if (rawParams.length > 0) {
- var params = rawParams.split('&');
- params.forEach(function (param) {
- var split = param.split('=');
- var key = split[0];
- var val = split[1];
- var list = lang_1.isPresent(map.get(key)) ? map.get(key) : [];
- list.push(val);
- map.set(key, list);
- });
- }
- return map;
- }
- /**
- * Map-like representation of url search parameters, based on
- * [URLSearchParams](https://url.spec.whatwg.org/#urlsearchparams) in the url living standard,
- * with several extensions for merging URLSearchParams objects:
- * - setAll()
- * - appendAll()
- * - replaceAll()
- */
- var URLSearchParams = (function () {
- function URLSearchParams(rawParams) {
- if (rawParams === void 0) { rawParams = ''; }
- this.rawParams = rawParams;
- this.paramsMap = paramParser(rawParams);
- }
- URLSearchParams.prototype.clone = function () {
- var clone = new URLSearchParams();
- clone.appendAll(this);
- return clone;
- };
- URLSearchParams.prototype.has = function (param) { return this.paramsMap.has(param); };
- URLSearchParams.prototype.get = function (param) {
- var storedParam = this.paramsMap.get(param);
- if (collection_1.isListLikeIterable(storedParam)) {
- return collection_1.ListWrapper.first(storedParam);
- }
- else {
- return null;
- }
- };
- URLSearchParams.prototype.getAll = function (param) {
- var mapParam = this.paramsMap.get(param);
- return lang_1.isPresent(mapParam) ? mapParam : [];
- };
- URLSearchParams.prototype.set = function (param, val) {
- var mapParam = this.paramsMap.get(param);
- var list = lang_1.isPresent(mapParam) ? mapParam : [];
- collection_1.ListWrapper.clear(list);
- list.push(val);
- this.paramsMap.set(param, list);
- };
- // A merge operation
- // For each name-values pair in `searchParams`, perform `set(name, values[0])`
- //
- // E.g: "a=[1,2,3], c=[8]" + "a=[4,5,6], b=[7]" = "a=[4], c=[8], b=[7]"
- //
- // TODO(@caitp): document this better
- URLSearchParams.prototype.setAll = function (searchParams) {
- var _this = this;
- searchParams.paramsMap.forEach(function (value, param) {
- var mapParam = _this.paramsMap.get(param);
- var list = lang_1.isPresent(mapParam) ? mapParam : [];
- collection_1.ListWrapper.clear(list);
- list.push(value[0]);
- _this.paramsMap.set(param, list);
- });
- };
- URLSearchParams.prototype.append = function (param, val) {
- var mapParam = this.paramsMap.get(param);
- var list = lang_1.isPresent(mapParam) ? mapParam : [];
- list.push(val);
- this.paramsMap.set(param, list);
- };
- // A merge operation
- // For each name-values pair in `searchParams`, perform `append(name, value)`
- // for each value in `values`.
- //
- // E.g: "a=[1,2], c=[8]" + "a=[3,4], b=[7]" = "a=[1,2,3,4], c=[8], b=[7]"
- //
- // TODO(@caitp): document this better
- URLSearchParams.prototype.appendAll = function (searchParams) {
- var _this = this;
- searchParams.paramsMap.forEach(function (value, param) {
- var mapParam = _this.paramsMap.get(param);
- var list = lang_1.isPresent(mapParam) ? mapParam : [];
- for (var i = 0; i < value.length; ++i) {
- list.push(value[i]);
- }
- _this.paramsMap.set(param, list);
- });
- };
- // A merge operation
- // For each name-values pair in `searchParams`, perform `delete(name)`,
- // followed by `set(name, values)`
- //
- // E.g: "a=[1,2,3], c=[8]" + "a=[4,5,6], b=[7]" = "a=[4,5,6], c=[8], b=[7]"
- //
- // TODO(@caitp): document this better
- URLSearchParams.prototype.replaceAll = function (searchParams) {
- var _this = this;
- searchParams.paramsMap.forEach(function (value, param) {
- var mapParam = _this.paramsMap.get(param);
- var list = lang_1.isPresent(mapParam) ? mapParam : [];
- collection_1.ListWrapper.clear(list);
- for (var i = 0; i < value.length; ++i) {
- list.push(value[i]);
- }
- _this.paramsMap.set(param, list);
- });
- };
- URLSearchParams.prototype.toString = function () {
- var paramsList = [];
- this.paramsMap.forEach(function (values, k) { values.forEach(function (v) { return paramsList.push(k + '=' + v); }); });
- return paramsList.join('&');
- };
- URLSearchParams.prototype.delete = function (param) { this.paramsMap.delete(param); };
- return URLSearchParams;
- })();
- exports.URLSearchParams = URLSearchParams;
- /***/ },
- /* 218 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var enums_1 = __webpack_require__(215);
- var static_response_1 = __webpack_require__(219);
- var headers_1 = __webpack_require__(213);
- var base_response_options_1 = __webpack_require__(220);
- var core_1 = __webpack_require__(2);
- var browser_xhr_1 = __webpack_require__(221);
- var lang_1 = __webpack_require__(5);
- var Observable_1 = __webpack_require__(62);
- var http_utils_1 = __webpack_require__(214);
- /**
- * Creates connections using `XMLHttpRequest`. Given a fully-qualified
- * request, an `XHRConnection` will immediately create an `XMLHttpRequest` object and send the
- * request.
- *
- * This class would typically not be created or interacted with directly inside applications, though
- * the {@link MockConnection} may be interacted with in tests.
- */
- var XHRConnection = (function () {
- function XHRConnection(req, browserXHR, baseResponseOptions) {
- var _this = this;
- this.request = req;
- this.response = new Observable_1.Observable(function (responseObserver) {
- var _xhr = browserXHR.build();
- _xhr.open(enums_1.RequestMethod[req.method].toUpperCase(), req.url);
- // load event handler
- var onLoad = function () {
- // responseText is the old-school way of retrieving response (supported by IE8 & 9)
- // response/responseType properties were introduced in XHR Level2 spec (supported by
- // IE10)
- var body = lang_1.isPresent(_xhr.response) ? _xhr.response : _xhr.responseText;
- var headers = headers_1.Headers.fromResponseHeaderString(_xhr.getAllResponseHeaders());
- var url = http_utils_1.getResponseURL(_xhr);
- // normalize IE9 bug (http://bugs.jquery.com/ticket/1450)
- var status = _xhr.status === 1223 ? 204 : _xhr.status;
- // fix status code when it is 0 (0 status is undocumented).
- // Occurs when accessing file resources or on Android 4.1 stock browser
- // while retrieving files from application cache.
- if (status === 0) {
- status = body ? 200 : 0;
- }
- var responseOptions = new base_response_options_1.ResponseOptions({ body: body, status: status, headers: headers, url: url });
- if (lang_1.isPresent(baseResponseOptions)) {
- responseOptions = baseResponseOptions.merge(responseOptions);
- }
- var response = new static_response_1.Response(responseOptions);
- if (http_utils_1.isSuccess(status)) {
- responseObserver.next(response);
- // TODO(gdi2290): defer complete if array buffer until done
- responseObserver.complete();
- return;
- }
- responseObserver.error(response);
- };
- // error event handler
- var onError = function (err) {
- var responseOptions = new base_response_options_1.ResponseOptions({ body: err, type: enums_1.ResponseType.Error });
- if (lang_1.isPresent(baseResponseOptions)) {
- responseOptions = baseResponseOptions.merge(responseOptions);
- }
- responseObserver.error(new static_response_1.Response(responseOptions));
- };
- if (lang_1.isPresent(req.headers)) {
- req.headers.forEach(function (values, name) { return _xhr.setRequestHeader(name, values.join(',')); });
- }
- _xhr.addEventListener('load', onLoad);
- _xhr.addEventListener('error', onError);
- _xhr.send(_this.request.text());
- return function () {
- _xhr.removeEventListener('load', onLoad);
- _xhr.removeEventListener('error', onError);
- _xhr.abort();
- };
- });
- }
- return XHRConnection;
- })();
- exports.XHRConnection = XHRConnection;
- /**
- * Creates {@link XHRConnection} instances.
- *
- * This class would typically not be used by end users, but could be
- * overridden if a different backend implementation should be used,
- * such as in a node backend.
- *
- * ### Example
- *
- * ```
- * import {Http, MyNodeBackend, HTTP_PROVIDERS, BaseRequestOptions} from 'angular2/http';
- * @Component({
- * viewProviders: [
- * HTTP_PROVIDERS,
- * provide(Http, {useFactory: (backend, options) => {
- * return new Http(backend, options);
- * }, deps: [MyNodeBackend, BaseRequestOptions]})]
- * })
- * class MyComponent {
- * constructor(http:Http) {
- * http.request('people.json').subscribe(res => this.people = res.json());
- * }
- * }
- * ```
- *
- **/
- var XHRBackend = (function () {
- function XHRBackend(_browserXHR, _baseResponseOptions) {
- this._browserXHR = _browserXHR;
- this._baseResponseOptions = _baseResponseOptions;
- }
- XHRBackend.prototype.createConnection = function (request) {
- return new XHRConnection(request, this._browserXHR, this._baseResponseOptions);
- };
- XHRBackend = __decorate([
- core_1.Injectable(),
- __metadata('design:paramtypes', [browser_xhr_1.BrowserXhr, base_response_options_1.ResponseOptions])
- ], XHRBackend);
- return XHRBackend;
- })();
- exports.XHRBackend = XHRBackend;
- /***/ },
- /* 219 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var http_utils_1 = __webpack_require__(214);
- /**
- * Creates `Response` instances from provided values.
- *
- * Though this object isn't
- * usually instantiated by end-users, it is the primary object interacted with when it comes time to
- * add data to a view.
- *
- * ### Example
- *
- * ```
- * http.request('my-friends.txt').subscribe(response => this.friends = response.text());
- * ```
- *
- * The Response's interface is inspired by the Response constructor defined in the [Fetch
- * Spec](https://fetch.spec.whatwg.org/#response-class), but is considered a static value whose body
- * can be accessed many times. There are other differences in the implementation, but this is the
- * most significant.
- */
- var Response = (function () {
- function Response(responseOptions) {
- this._body = responseOptions.body;
- this.status = responseOptions.status;
- this.statusText = responseOptions.statusText;
- this.headers = responseOptions.headers;
- this.type = responseOptions.type;
- this.url = responseOptions.url;
- }
- /**
- * Not yet implemented
- */
- // TODO: Blob return type
- Response.prototype.blob = function () { throw new exceptions_1.BaseException('"blob()" method not implemented on Response superclass'); };
- /**
- * Attempts to return body as parsed `JSON` object, or raises an exception.
- */
- Response.prototype.json = function () {
- var jsonResponse;
- if (http_utils_1.isJsObject(this._body)) {
- jsonResponse = this._body;
- }
- else if (lang_1.isString(this._body)) {
- jsonResponse = lang_1.Json.parse(this._body);
- }
- return jsonResponse;
- };
- /**
- * Returns the body as a string, presuming `toString()` can be called on the response body.
- */
- Response.prototype.text = function () { return this._body.toString(); };
- /**
- * Not yet implemented
- */
- // TODO: ArrayBuffer return type
- Response.prototype.arrayBuffer = function () {
- throw new exceptions_1.BaseException('"arrayBuffer()" method not implemented on Response superclass');
- };
- return Response;
- })();
- exports.Response = Response;
- /***/ },
- /* 220 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var core_1 = __webpack_require__(2);
- var lang_1 = __webpack_require__(5);
- var headers_1 = __webpack_require__(213);
- var enums_1 = __webpack_require__(215);
- /**
- * Creates a response options object to be optionally provided when instantiating a
- * {@link Response}.
- *
- * This class is based on the `ResponseInit` description in the [Fetch
- * Spec](https://fetch.spec.whatwg.org/#responseinit).
- *
- * All values are null by default. Typical defaults can be found in the
- * {@link BaseResponseOptions} class, which sub-classes `ResponseOptions`.
- *
- * This class may be used in tests to build {@link Response Responses} for
- * mock responses (see {@link MockBackend}).
- *
- * ### Example ([live demo](http://plnkr.co/edit/P9Jkk8e8cz6NVzbcxEsD?p=preview))
- *
- * ```typescript
- * import {ResponseOptions, Response} from 'angular2/http';
- *
- * var options = new ResponseOptions({
- * body: '{"name":"Jeff"}'
- * });
- * var res = new Response(options);
- *
- * console.log('res.json():', res.json()); // Object {name: "Jeff"}
- * ```
- */
- var ResponseOptions = (function () {
- function ResponseOptions(_a) {
- var _b = _a === void 0 ? {} : _a, body = _b.body, status = _b.status, headers = _b.headers, statusText = _b.statusText, type = _b.type, url = _b.url;
- this.body = lang_1.isPresent(body) ? body : null;
- this.status = lang_1.isPresent(status) ? status : null;
- this.headers = lang_1.isPresent(headers) ? headers : null;
- this.statusText = lang_1.isPresent(statusText) ? statusText : null;
- this.type = lang_1.isPresent(type) ? type : null;
- this.url = lang_1.isPresent(url) ? url : null;
- }
- /**
- * Creates a copy of the `ResponseOptions` instance, using the optional input as values to
- * override
- * existing values. This method will not change the values of the instance on which it is being
- * called.
- *
- * This may be useful when sharing a base `ResponseOptions` object inside tests,
- * where certain properties may change from test to test.
- *
- * ### Example ([live demo](http://plnkr.co/edit/1lXquqFfgduTFBWjNoRE?p=preview))
- *
- * ```typescript
- * import {ResponseOptions, Response} from 'angular2/http';
- *
- * var options = new ResponseOptions({
- * body: {name: 'Jeff'}
- * });
- * var res = new Response(options.merge({
- * url: 'https://google.com'
- * }));
- * console.log('options.url:', options.url); // null
- * console.log('res.json():', res.json()); // Object {name: "Jeff"}
- * console.log('res.url:', res.url); // https://google.com
- * ```
- */
- ResponseOptions.prototype.merge = function (options) {
- return new ResponseOptions({
- body: lang_1.isPresent(options) && lang_1.isPresent(options.body) ? options.body : this.body,
- status: lang_1.isPresent(options) && lang_1.isPresent(options.status) ? options.status : this.status,
- headers: lang_1.isPresent(options) && lang_1.isPresent(options.headers) ? options.headers : this.headers,
- statusText: lang_1.isPresent(options) && lang_1.isPresent(options.statusText) ? options.statusText :
- this.statusText,
- type: lang_1.isPresent(options) && lang_1.isPresent(options.type) ? options.type : this.type,
- url: lang_1.isPresent(options) && lang_1.isPresent(options.url) ? options.url : this.url,
- });
- };
- return ResponseOptions;
- })();
- exports.ResponseOptions = ResponseOptions;
- /**
- * Subclass of {@link ResponseOptions}, with default values.
- *
- * Default values:
- * * status: 200
- * * headers: empty {@link Headers} object
- *
- * This class could be extended and bound to the {@link ResponseOptions} class
- * when configuring an {@link Injector}, in order to override the default options
- * used by {@link Http} to create {@link Response Responses}.
- *
- * ### Example ([live demo](http://plnkr.co/edit/qv8DLT?p=preview))
- *
- * ```typescript
- * import {provide} from 'angular2/core';
- * import {bootstrap} from 'angular2/platform/browser';
- * import {HTTP_PROVIDERS, Headers, Http, BaseResponseOptions, ResponseOptions} from
- * 'angular2/http';
- * import {App} from './myapp';
- *
- * class MyOptions extends BaseResponseOptions {
- * headers:Headers = new Headers({network: 'github'});
- * }
- *
- * bootstrap(App, [HTTP_PROVIDERS, provide(ResponseOptions, {useClass: MyOptions})]);
- * ```
- *
- * The options could also be extended when manually creating a {@link Response}
- * object.
- *
- * ### Example ([live demo](http://plnkr.co/edit/VngosOWiaExEtbstDoix?p=preview))
- *
- * ```
- * import {BaseResponseOptions, Response} from 'angular2/http';
- *
- * var options = new BaseResponseOptions();
- * var res = new Response(options.merge({
- * body: 'Angular2',
- * headers: new Headers({framework: 'angular'})
- * }));
- * console.log('res.headers.get("framework"):', res.headers.get('framework')); // angular
- * console.log('res.text():', res.text()); // Angular2;
- * ```
- */
- var BaseResponseOptions = (function (_super) {
- __extends(BaseResponseOptions, _super);
- function BaseResponseOptions() {
- _super.call(this, { status: 200, statusText: 'Ok', type: enums_1.ResponseType.Default, headers: new headers_1.Headers() });
- }
- BaseResponseOptions = __decorate([
- core_1.Injectable(),
- __metadata('design:paramtypes', [])
- ], BaseResponseOptions);
- return BaseResponseOptions;
- })(ResponseOptions);
- exports.BaseResponseOptions = BaseResponseOptions;
- /***/ },
- /* 221 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var core_1 = __webpack_require__(2);
- /**
- * A backend for http that uses the `XMLHttpRequest` browser API.
- *
- * Take care not to evaluate this in non-browser contexts.
- */
- var BrowserXhr = (function () {
- function BrowserXhr() {
- }
- BrowserXhr.prototype.build = function () { return (new XMLHttpRequest()); };
- BrowserXhr = __decorate([
- core_1.Injectable(),
- __metadata('design:paramtypes', [])
- ], BrowserXhr);
- return BrowserXhr;
- })();
- exports.BrowserXhr = BrowserXhr;
- /***/ },
- /* 222 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var interfaces_1 = __webpack_require__(211);
- var enums_1 = __webpack_require__(215);
- var static_response_1 = __webpack_require__(219);
- var base_response_options_1 = __webpack_require__(220);
- var core_1 = __webpack_require__(2);
- var browser_jsonp_1 = __webpack_require__(223);
- var exceptions_1 = __webpack_require__(14);
- var lang_1 = __webpack_require__(5);
- var Observable_1 = __webpack_require__(62);
- var JSONP_ERR_NO_CALLBACK = 'JSONP injected script did not invoke callback.';
- var JSONP_ERR_WRONG_METHOD = 'JSONP requests must use GET request method.';
- /**
- * Abstract base class for an in-flight JSONP request.
- */
- var JSONPConnection = (function () {
- function JSONPConnection() {
- }
- return JSONPConnection;
- })();
- exports.JSONPConnection = JSONPConnection;
- var JSONPConnection_ = (function (_super) {
- __extends(JSONPConnection_, _super);
- function JSONPConnection_(req, _dom, baseResponseOptions) {
- var _this = this;
- _super.call(this);
- this._dom = _dom;
- this.baseResponseOptions = baseResponseOptions;
- this._finished = false;
- if (req.method !== enums_1.RequestMethod.Get) {
- throw exceptions_1.makeTypeError(JSONP_ERR_WRONG_METHOD);
- }
- this.request = req;
- this.response = new Observable_1.Observable(function (responseObserver) {
- _this.readyState = enums_1.ReadyState.Loading;
- var id = _this._id = _dom.nextRequestID();
- _dom.exposeConnection(id, _this);
- // Workaround Dart
- // url = url.replace(/=JSONP_CALLBACK(&|$)/, `generated method`);
- var callback = _dom.requestCallback(_this._id);
- var url = req.url;
- if (url.indexOf('=JSONP_CALLBACK&') > -1) {
- url = lang_1.StringWrapper.replace(url, '=JSONP_CALLBACK&', "=" + callback + "&");
- }
- else if (url.lastIndexOf('=JSONP_CALLBACK') === url.length - '=JSONP_CALLBACK'.length) {
- url = url.substring(0, url.length - '=JSONP_CALLBACK'.length) + ("=" + callback);
- }
- var script = _this._script = _dom.build(url);
- var onLoad = function (event) {
- if (_this.readyState === enums_1.ReadyState.Cancelled)
- return;
- _this.readyState = enums_1.ReadyState.Done;
- _dom.cleanup(script);
- if (!_this._finished) {
- var responseOptions_1 = new base_response_options_1.ResponseOptions({ body: JSONP_ERR_NO_CALLBACK, type: enums_1.ResponseType.Error, url: url });
- if (lang_1.isPresent(baseResponseOptions)) {
- responseOptions_1 = baseResponseOptions.merge(responseOptions_1);
- }
- responseObserver.error(new static_response_1.Response(responseOptions_1));
- return;
- }
- var responseOptions = new base_response_options_1.ResponseOptions({ body: _this._responseData, url: url });
- if (lang_1.isPresent(_this.baseResponseOptions)) {
- responseOptions = _this.baseResponseOptions.merge(responseOptions);
- }
- responseObserver.next(new static_response_1.Response(responseOptions));
- responseObserver.complete();
- };
- var onError = function (error) {
- if (_this.readyState === enums_1.ReadyState.Cancelled)
- return;
- _this.readyState = enums_1.ReadyState.Done;
- _dom.cleanup(script);
- var responseOptions = new base_response_options_1.ResponseOptions({ body: error.message, type: enums_1.ResponseType.Error });
- if (lang_1.isPresent(baseResponseOptions)) {
- responseOptions = baseResponseOptions.merge(responseOptions);
- }
- responseObserver.error(new static_response_1.Response(responseOptions));
- };
- script.addEventListener('load', onLoad);
- script.addEventListener('error', onError);
- _dom.send(script);
- return function () {
- _this.readyState = enums_1.ReadyState.Cancelled;
- script.removeEventListener('load', onLoad);
- script.removeEventListener('error', onError);
- if (lang_1.isPresent(script)) {
- _this._dom.cleanup(script);
- }
- };
- });
- }
- JSONPConnection_.prototype.finished = function (data) {
- // Don't leak connections
- this._finished = true;
- this._dom.removeConnection(this._id);
- if (this.readyState === enums_1.ReadyState.Cancelled)
- return;
- this._responseData = data;
- };
- return JSONPConnection_;
- })(JSONPConnection);
- exports.JSONPConnection_ = JSONPConnection_;
- /**
- * A {@link ConnectionBackend} that uses the JSONP strategy of making requests.
- */
- var JSONPBackend = (function (_super) {
- __extends(JSONPBackend, _super);
- function JSONPBackend() {
- _super.apply(this, arguments);
- }
- return JSONPBackend;
- })(interfaces_1.ConnectionBackend);
- exports.JSONPBackend = JSONPBackend;
- var JSONPBackend_ = (function (_super) {
- __extends(JSONPBackend_, _super);
- function JSONPBackend_(_browserJSONP, _baseResponseOptions) {
- _super.call(this);
- this._browserJSONP = _browserJSONP;
- this._baseResponseOptions = _baseResponseOptions;
- }
- JSONPBackend_.prototype.createConnection = function (request) {
- return new JSONPConnection_(request, this._browserJSONP, this._baseResponseOptions);
- };
- JSONPBackend_ = __decorate([
- core_1.Injectable(),
- __metadata('design:paramtypes', [browser_jsonp_1.BrowserJsonp, base_response_options_1.ResponseOptions])
- ], JSONPBackend_);
- return JSONPBackend_;
- })(JSONPBackend);
- exports.JSONPBackend_ = JSONPBackend_;
- /***/ },
- /* 223 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var core_1 = __webpack_require__(2);
- var lang_1 = __webpack_require__(5);
- var _nextRequestId = 0;
- exports.JSONP_HOME = '__ng_jsonp__';
- var _jsonpConnections = null;
- function _getJsonpConnections() {
- if (_jsonpConnections === null) {
- _jsonpConnections = lang_1.global[exports.JSONP_HOME] = {};
- }
- return _jsonpConnections;
- }
- // Make sure not to evaluate this in a non-browser environment!
- var BrowserJsonp = (function () {
- function BrowserJsonp() {
- }
- // Construct a <script> element with the specified URL
- BrowserJsonp.prototype.build = function (url) {
- var node = document.createElement('script');
- node.src = url;
- return node;
- };
- BrowserJsonp.prototype.nextRequestID = function () { return "__req" + _nextRequestId++; };
- BrowserJsonp.prototype.requestCallback = function (id) { return exports.JSONP_HOME + "." + id + ".finished"; };
- BrowserJsonp.prototype.exposeConnection = function (id, connection) {
- var connections = _getJsonpConnections();
- connections[id] = connection;
- };
- BrowserJsonp.prototype.removeConnection = function (id) {
- var connections = _getJsonpConnections();
- connections[id] = null;
- };
- // Attach the <script> element to the DOM
- BrowserJsonp.prototype.send = function (node) { document.body.appendChild((node)); };
- // Remove <script> element from the DOM
- BrowserJsonp.prototype.cleanup = function (node) {
- if (node.parentNode) {
- node.parentNode.removeChild((node));
- }
- };
- BrowserJsonp = __decorate([
- core_1.Injectable(),
- __metadata('design:paramtypes', [])
- ], BrowserJsonp);
- return BrowserJsonp;
- })();
- exports.BrowserJsonp = BrowserJsonp;
- /***/ },
- /* 224 */
- /***/ function(module, exports, __webpack_require__) {
- /**
- * @module
- * @description
- * Maps application URLs into application states, to support deep-linking and navigation.
- */
- function __export(m) {
- for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
- }
- var router_1 = __webpack_require__(225);
- exports.Router = router_1.Router;
- var router_outlet_1 = __webpack_require__(241);
- exports.RouterOutlet = router_outlet_1.RouterOutlet;
- var router_link_1 = __webpack_require__(243);
- exports.RouterLink = router_link_1.RouterLink;
- var instruction_1 = __webpack_require__(229);
- exports.RouteParams = instruction_1.RouteParams;
- exports.RouteData = instruction_1.RouteData;
- var platform_location_1 = __webpack_require__(244);
- exports.PlatformLocation = platform_location_1.PlatformLocation;
- var route_registry_1 = __webpack_require__(226);
- exports.RouteRegistry = route_registry_1.RouteRegistry;
- exports.ROUTER_PRIMARY_COMPONENT = route_registry_1.ROUTER_PRIMARY_COMPONENT;
- var location_strategy_1 = __webpack_require__(238);
- exports.LocationStrategy = location_strategy_1.LocationStrategy;
- exports.APP_BASE_HREF = location_strategy_1.APP_BASE_HREF;
- var hash_location_strategy_1 = __webpack_require__(245);
- exports.HashLocationStrategy = hash_location_strategy_1.HashLocationStrategy;
- var path_location_strategy_1 = __webpack_require__(246);
- exports.PathLocationStrategy = path_location_strategy_1.PathLocationStrategy;
- var location_1 = __webpack_require__(237);
- exports.Location = location_1.Location;
- __export(__webpack_require__(236));
- __export(__webpack_require__(247));
- var lifecycle_annotations_1 = __webpack_require__(242);
- exports.CanActivate = lifecycle_annotations_1.CanActivate;
- var instruction_2 = __webpack_require__(229);
- exports.Instruction = instruction_2.Instruction;
- exports.ComponentInstruction = instruction_2.ComponentInstruction;
- var core_1 = __webpack_require__(2);
- exports.OpaqueToken = core_1.OpaqueToken;
- var platform_location_2 = __webpack_require__(244);
- var location_strategy_2 = __webpack_require__(238);
- var path_location_strategy_2 = __webpack_require__(246);
- var router_2 = __webpack_require__(225);
- var router_outlet_2 = __webpack_require__(241);
- var router_link_2 = __webpack_require__(243);
- var route_registry_2 = __webpack_require__(226);
- var location_2 = __webpack_require__(237);
- var core_2 = __webpack_require__(2);
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- /**
- * A list of directives. To use the router directives like {@link RouterOutlet} and
- * {@link RouterLink}, add this to your `directives` array in the {@link View} decorator of your
- * component.
- *
- * ### Example ([live demo](http://plnkr.co/edit/iRUP8B5OUbxCWQ3AcIDm))
- *
- * ```
- * import {Component} from 'angular2/core';
- * import {ROUTER_DIRECTIVES, ROUTER_PROVIDERS, RouteConfig} from 'angular2/router';
- *
- * @Component({directives: [ROUTER_DIRECTIVES]})
- * @RouteConfig([
- * {...},
- * ])
- * class AppCmp {
- * // ...
- * }
- *
- * bootstrap(AppCmp, [ROUTER_PROVIDERS]);
- * ```
- */
- exports.ROUTER_DIRECTIVES = lang_1.CONST_EXPR([router_outlet_2.RouterOutlet, router_link_2.RouterLink]);
- /**
- * A list of {@link Provider}s. To use the router, you must add this to your application.
- *
- * ### Example ([live demo](http://plnkr.co/edit/iRUP8B5OUbxCWQ3AcIDm))
- *
- * ```
- * import {Component} from 'angular2/core';
- * import {
- * ROUTER_DIRECTIVES,
- * ROUTER_PROVIDERS,
- * RouteConfig
- * } from 'angular2/router';
- *
- * @Component({directives: [ROUTER_DIRECTIVES]})
- * @RouteConfig([
- * {...},
- * ])
- * class AppCmp {
- * // ...
- * }
- *
- * bootstrap(AppCmp, [ROUTER_PROVIDERS]);
- * ```
- */
- exports.ROUTER_PROVIDERS = lang_1.CONST_EXPR([
- route_registry_2.RouteRegistry,
- lang_1.CONST_EXPR(new core_2.Provider(location_strategy_2.LocationStrategy, { useClass: path_location_strategy_2.PathLocationStrategy })),
- platform_location_2.PlatformLocation,
- location_2.Location,
- lang_1.CONST_EXPR(new core_2.Provider(router_2.Router, {
- useFactory: routerFactory,
- deps: lang_1.CONST_EXPR([route_registry_2.RouteRegistry, location_2.Location, route_registry_2.ROUTER_PRIMARY_COMPONENT, core_2.ApplicationRef])
- })),
- lang_1.CONST_EXPR(new core_2.Provider(route_registry_2.ROUTER_PRIMARY_COMPONENT, { useFactory: routerPrimaryComponentFactory, deps: lang_1.CONST_EXPR([core_2.ApplicationRef]) }))
- ]);
- /**
- * Use {@link ROUTER_PROVIDERS} instead.
- *
- * @deprecated
- */
- exports.ROUTER_BINDINGS = exports.ROUTER_PROVIDERS;
- function routerFactory(registry, location, primaryComponent, appRef) {
- var rootRouter = new router_2.RootRouter(registry, location, primaryComponent);
- appRef.registerDisposeListener(function () { return rootRouter.dispose(); });
- return rootRouter;
- }
- function routerPrimaryComponentFactory(app) {
- if (app.componentTypes.length == 0) {
- throw new exceptions_1.BaseException("Bootstrap at least one component before injecting Router.");
- }
- return app.componentTypes[0];
- }
- /***/ },
- /* 225 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var __param = (this && this.__param) || function (paramIndex, decorator) {
- return function (target, key) { decorator(target, key, paramIndex); }
- };
- var async_1 = __webpack_require__(60);
- var collection_1 = __webpack_require__(12);
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var core_1 = __webpack_require__(2);
- var route_registry_1 = __webpack_require__(226);
- var location_1 = __webpack_require__(237);
- var route_lifecycle_reflector_1 = __webpack_require__(239);
- var _resolveToTrue = async_1.PromiseWrapper.resolve(true);
- var _resolveToFalse = async_1.PromiseWrapper.resolve(false);
- /**
- * The `Router` is responsible for mapping URLs to components.
- *
- * You can see the state of the router by inspecting the read-only field `router.navigating`.
- * This may be useful for showing a spinner, for instance.
- *
- * ## Concepts
- *
- * Routers and component instances have a 1:1 correspondence.
- *
- * The router holds reference to a number of {@link RouterOutlet}.
- * An outlet is a placeholder that the router dynamically fills in depending on the current URL.
- *
- * When the router navigates from a URL, it must first recognize it and serialize it into an
- * `Instruction`.
- * The router uses the `RouteRegistry` to get an `Instruction`.
- */
- var Router = (function () {
- function Router(registry, parent, hostComponent) {
- this.registry = registry;
- this.parent = parent;
- this.hostComponent = hostComponent;
- this.navigating = false;
- this._currentInstruction = null;
- this._currentNavigation = _resolveToTrue;
- this._outlet = null;
- this._auxRouters = new collection_1.Map();
- this._subject = new async_1.EventEmitter();
- }
- /**
- * Constructs a child router. You probably don't need to use this unless you're writing a reusable
- * component.
- */
- Router.prototype.childRouter = function (hostComponent) {
- return this._childRouter = new ChildRouter(this, hostComponent);
- };
- /**
- * Constructs a child router. You probably don't need to use this unless you're writing a reusable
- * component.
- */
- Router.prototype.auxRouter = function (hostComponent) { return new ChildRouter(this, hostComponent); };
- /**
- * Register an outlet to be notified of primary route changes.
- *
- * You probably don't need to use this unless you're writing a reusable component.
- */
- Router.prototype.registerPrimaryOutlet = function (outlet) {
- if (lang_1.isPresent(outlet.name)) {
- throw new exceptions_1.BaseException("registerPrimaryOutlet expects to be called with an unnamed outlet.");
- }
- this._outlet = outlet;
- if (lang_1.isPresent(this._currentInstruction)) {
- return this.commit(this._currentInstruction, false);
- }
- return _resolveToTrue;
- };
- /**
- * Register an outlet to notified of auxiliary route changes.
- *
- * You probably don't need to use this unless you're writing a reusable component.
- */
- Router.prototype.registerAuxOutlet = function (outlet) {
- var outletName = outlet.name;
- if (lang_1.isBlank(outletName)) {
- throw new exceptions_1.BaseException("registerAuxOutlet expects to be called with an outlet with a name.");
- }
- // TODO...
- // what is the host of an aux route???
- var router = this.auxRouter(this.hostComponent);
- this._auxRouters.set(outletName, router);
- router._outlet = outlet;
- var auxInstruction;
- if (lang_1.isPresent(this._currentInstruction) &&
- lang_1.isPresent(auxInstruction = this._currentInstruction.auxInstruction[outletName])) {
- return router.commit(auxInstruction);
- }
- return _resolveToTrue;
- };
- /**
- * Given an instruction, returns `true` if the instruction is currently active,
- * otherwise `false`.
- */
- Router.prototype.isRouteActive = function (instruction) {
- var router = this;
- while (lang_1.isPresent(router.parent) && lang_1.isPresent(instruction.child)) {
- router = router.parent;
- instruction = instruction.child;
- }
- return lang_1.isPresent(this._currentInstruction) &&
- this._currentInstruction.component == instruction.component;
- };
- /**
- * Dynamically update the routing configuration and trigger a navigation.
- *
- * ### Usage
- *
- * ```
- * router.config([
- * { 'path': '/', 'component': IndexComp },
- * { 'path': '/user/:id', 'component': UserComp },
- * ]);
- * ```
- */
- Router.prototype.config = function (definitions) {
- var _this = this;
- definitions.forEach(function (routeDefinition) { _this.registry.config(_this.hostComponent, routeDefinition); });
- return this.renavigate();
- };
- /**
- * Navigate based on the provided Route Link DSL. It's preferred to navigate with this method
- * over `navigateByUrl`.
- *
- * ### Usage
- *
- * This method takes an array representing the Route Link DSL:
- * ```
- * ['./MyCmp', {param: 3}]
- * ```
- * See the {@link RouterLink} directive for more.
- */
- Router.prototype.navigate = function (linkParams) {
- var instruction = this.generate(linkParams);
- return this.navigateByInstruction(instruction, false);
- };
- /**
- * Navigate to a URL. Returns a promise that resolves when navigation is complete.
- * It's preferred to navigate with `navigate` instead of this method, since URLs are more brittle.
- *
- * If the given URL begins with a `/`, router will navigate absolutely.
- * If the given URL does not begin with `/`, the router will navigate relative to this component.
- */
- Router.prototype.navigateByUrl = function (url, _skipLocationChange) {
- var _this = this;
- if (_skipLocationChange === void 0) { _skipLocationChange = false; }
- return this._currentNavigation = this._currentNavigation.then(function (_) {
- _this.lastNavigationAttempt = url;
- _this._startNavigating();
- return _this._afterPromiseFinishNavigating(_this.recognize(url).then(function (instruction) {
- if (lang_1.isBlank(instruction)) {
- return false;
- }
- return _this._navigate(instruction, _skipLocationChange);
- }));
- });
- };
- /**
- * Navigate via the provided instruction. Returns a promise that resolves when navigation is
- * complete.
- */
- Router.prototype.navigateByInstruction = function (instruction, _skipLocationChange) {
- var _this = this;
- if (_skipLocationChange === void 0) { _skipLocationChange = false; }
- if (lang_1.isBlank(instruction)) {
- return _resolveToFalse;
- }
- return this._currentNavigation = this._currentNavigation.then(function (_) {
- _this._startNavigating();
- return _this._afterPromiseFinishNavigating(_this._navigate(instruction, _skipLocationChange));
- });
- };
- /** @internal */
- Router.prototype._navigate = function (instruction, _skipLocationChange) {
- var _this = this;
- return this._settleInstruction(instruction)
- .then(function (_) { return _this._routerCanReuse(instruction); })
- .then(function (_) { return _this._canActivate(instruction); })
- .then(function (result) {
- if (!result) {
- return false;
- }
- return _this._routerCanDeactivate(instruction)
- .then(function (result) {
- if (result) {
- return _this.commit(instruction, _skipLocationChange)
- .then(function (_) {
- _this._emitNavigationFinish(instruction.toRootUrl());
- return true;
- });
- }
- });
- });
- };
- /** @internal */
- Router.prototype._settleInstruction = function (instruction) {
- var _this = this;
- return instruction.resolveComponent().then(function (_) {
- instruction.component.reuse = false;
- var unsettledInstructions = [];
- if (lang_1.isPresent(instruction.child)) {
- unsettledInstructions.push(_this._settleInstruction(instruction.child));
- }
- collection_1.StringMapWrapper.forEach(instruction.auxInstruction, function (instruction, _) {
- unsettledInstructions.push(_this._settleInstruction(instruction));
- });
- return async_1.PromiseWrapper.all(unsettledInstructions);
- });
- };
- Router.prototype._emitNavigationFinish = function (url) { async_1.ObservableWrapper.callEmit(this._subject, url); };
- Router.prototype._afterPromiseFinishNavigating = function (promise) {
- var _this = this;
- return async_1.PromiseWrapper.catchError(promise.then(function (_) { return _this._finishNavigating(); }), function (err) {
- _this._finishNavigating();
- throw err;
- });
- };
- /*
- * Recursively set reuse flags
- */
- /** @internal */
- Router.prototype._routerCanReuse = function (instruction) {
- var _this = this;
- if (lang_1.isBlank(this._outlet)) {
- return _resolveToFalse;
- }
- return this._outlet.routerCanReuse(instruction.component)
- .then(function (result) {
- instruction.component.reuse = result;
- if (result && lang_1.isPresent(_this._childRouter) && lang_1.isPresent(instruction.child)) {
- return _this._childRouter._routerCanReuse(instruction.child);
- }
- });
- };
- Router.prototype._canActivate = function (nextInstruction) {
- return canActivateOne(nextInstruction, this._currentInstruction);
- };
- Router.prototype._routerCanDeactivate = function (instruction) {
- var _this = this;
- if (lang_1.isBlank(this._outlet)) {
- return _resolveToTrue;
- }
- var next;
- var childInstruction = null;
- var reuse = false;
- var componentInstruction = null;
- if (lang_1.isPresent(instruction)) {
- childInstruction = instruction.child;
- componentInstruction = instruction.component;
- reuse = instruction.component.reuse;
- }
- if (reuse) {
- next = _resolveToTrue;
- }
- else {
- next = this._outlet.routerCanDeactivate(componentInstruction);
- }
- // TODO: aux route lifecycle hooks
- return next.then(function (result) {
- if (result == false) {
- return false;
- }
- if (lang_1.isPresent(_this._childRouter)) {
- return _this._childRouter._routerCanDeactivate(childInstruction);
- }
- return true;
- });
- };
- /**
- * Updates this router and all descendant routers according to the given instruction
- */
- Router.prototype.commit = function (instruction, _skipLocationChange) {
- var _this = this;
- if (_skipLocationChange === void 0) { _skipLocationChange = false; }
- this._currentInstruction = instruction;
- var next = _resolveToTrue;
- if (lang_1.isPresent(this._outlet)) {
- var componentInstruction = instruction.component;
- if (componentInstruction.reuse) {
- next = this._outlet.reuse(componentInstruction);
- }
- else {
- next =
- this.deactivate(instruction).then(function (_) { return _this._outlet.activate(componentInstruction); });
- }
- if (lang_1.isPresent(instruction.child)) {
- next = next.then(function (_) {
- if (lang_1.isPresent(_this._childRouter)) {
- return _this._childRouter.commit(instruction.child);
- }
- });
- }
- }
- var promises = [];
- this._auxRouters.forEach(function (router, name) {
- if (lang_1.isPresent(instruction.auxInstruction[name])) {
- promises.push(router.commit(instruction.auxInstruction[name]));
- }
- });
- return next.then(function (_) { return async_1.PromiseWrapper.all(promises); });
- };
- /** @internal */
- Router.prototype._startNavigating = function () { this.navigating = true; };
- /** @internal */
- Router.prototype._finishNavigating = function () { this.navigating = false; };
- /**
- * Subscribe to URL updates from the router
- */
- Router.prototype.subscribe = function (onNext) {
- return async_1.ObservableWrapper.subscribe(this._subject, onNext);
- };
- /**
- * Removes the contents of this router's outlet and all descendant outlets
- */
- Router.prototype.deactivate = function (instruction) {
- var _this = this;
- var childInstruction = null;
- var componentInstruction = null;
- if (lang_1.isPresent(instruction)) {
- childInstruction = instruction.child;
- componentInstruction = instruction.component;
- }
- var next = _resolveToTrue;
- if (lang_1.isPresent(this._childRouter)) {
- next = this._childRouter.deactivate(childInstruction);
- }
- if (lang_1.isPresent(this._outlet)) {
- next = next.then(function (_) { return _this._outlet.deactivate(componentInstruction); });
- }
- // TODO: handle aux routes
- return next;
- };
- /**
- * Given a URL, returns an instruction representing the component graph
- */
- Router.prototype.recognize = function (url) {
- var ancestorComponents = this._getAncestorInstructions();
- return this.registry.recognize(url, ancestorComponents);
- };
- Router.prototype._getAncestorInstructions = function () {
- var ancestorComponents = [];
- var ancestorRouter = this;
- while (lang_1.isPresent(ancestorRouter.parent) &&
- lang_1.isPresent(ancestorRouter.parent._currentInstruction)) {
- ancestorRouter = ancestorRouter.parent;
- ancestorComponents.unshift(ancestorRouter._currentInstruction);
- }
- return ancestorComponents;
- };
- /**
- * Navigates to either the last URL successfully navigated to, or the last URL requested if the
- * router has yet to successfully navigate.
- */
- Router.prototype.renavigate = function () {
- if (lang_1.isBlank(this.lastNavigationAttempt)) {
- return this._currentNavigation;
- }
- return this.navigateByUrl(this.lastNavigationAttempt);
- };
- /**
- * Generate an `Instruction` based on the provided Route Link DSL.
- */
- Router.prototype.generate = function (linkParams) {
- var ancestorInstructions = this._getAncestorInstructions();
- return this.registry.generate(linkParams, ancestorInstructions);
- };
- return Router;
- })();
- exports.Router = Router;
- var RootRouter = (function (_super) {
- __extends(RootRouter, _super);
- function RootRouter(registry, location, primaryComponent) {
- var _this = this;
- _super.call(this, registry, null, primaryComponent);
- this._location = location;
- this._locationSub = this._location.subscribe(function (change) {
- // we call recognize ourselves
- _this.recognize(change['url'])
- .then(function (instruction) {
- _this.navigateByInstruction(instruction, lang_1.isPresent(change['pop']))
- .then(function (_) {
- // this is a popstate event; no need to change the URL
- if (lang_1.isPresent(change['pop']) && change['type'] != 'hashchange') {
- return;
- }
- var emitPath = instruction.toUrlPath();
- var emitQuery = instruction.toUrlQuery();
- if (emitPath.length > 0) {
- emitPath = '/' + emitPath;
- }
- // Because we've opted to use All hashchange events occur outside Angular.
- // However, apps that are migrating might have hash links that operate outside
- // angular to which routing must respond.
- // To support these cases where we respond to hashchanges and redirect as a
- // result, we need to replace the top item on the stack.
- if (change['type'] == 'hashchange') {
- if (instruction.toRootUrl() != _this._location.path()) {
- _this._location.replaceState(emitPath, emitQuery);
- }
- }
- else {
- _this._location.go(emitPath, emitQuery);
- }
- });
- });
- });
- this.registry.configFromComponent(primaryComponent);
- this.navigateByUrl(location.path());
- }
- RootRouter.prototype.commit = function (instruction, _skipLocationChange) {
- var _this = this;
- if (_skipLocationChange === void 0) { _skipLocationChange = false; }
- var emitPath = instruction.toUrlPath();
- var emitQuery = instruction.toUrlQuery();
- if (emitPath.length > 0) {
- emitPath = '/' + emitPath;
- }
- var promise = _super.prototype.commit.call(this, instruction);
- if (!_skipLocationChange) {
- promise = promise.then(function (_) { _this._location.go(emitPath, emitQuery); });
- }
- return promise;
- };
- RootRouter.prototype.dispose = function () {
- if (lang_1.isPresent(this._locationSub)) {
- async_1.ObservableWrapper.dispose(this._locationSub);
- this._locationSub = null;
- }
- };
- RootRouter = __decorate([
- core_1.Injectable(),
- __param(2, core_1.Inject(route_registry_1.ROUTER_PRIMARY_COMPONENT)),
- __metadata('design:paramtypes', [route_registry_1.RouteRegistry, location_1.Location, lang_1.Type])
- ], RootRouter);
- return RootRouter;
- })(Router);
- exports.RootRouter = RootRouter;
- var ChildRouter = (function (_super) {
- __extends(ChildRouter, _super);
- function ChildRouter(parent, hostComponent) {
- _super.call(this, parent.registry, parent, hostComponent);
- this.parent = parent;
- }
- ChildRouter.prototype.navigateByUrl = function (url, _skipLocationChange) {
- if (_skipLocationChange === void 0) { _skipLocationChange = false; }
- // Delegate navigation to the root router
- return this.parent.navigateByUrl(url, _skipLocationChange);
- };
- ChildRouter.prototype.navigateByInstruction = function (instruction, _skipLocationChange) {
- if (_skipLocationChange === void 0) { _skipLocationChange = false; }
- // Delegate navigation to the root router
- return this.parent.navigateByInstruction(instruction, _skipLocationChange);
- };
- return ChildRouter;
- })(Router);
- function canActivateOne(nextInstruction, prevInstruction) {
- var next = _resolveToTrue;
- if (lang_1.isPresent(nextInstruction.child)) {
- next = canActivateOne(nextInstruction.child, lang_1.isPresent(prevInstruction) ? prevInstruction.child : null);
- }
- return next.then(function (result) {
- if (result == false) {
- return false;
- }
- if (nextInstruction.component.reuse) {
- return true;
- }
- var hook = route_lifecycle_reflector_1.getCanActivateHook(nextInstruction.component.componentType);
- if (lang_1.isPresent(hook)) {
- return hook(nextInstruction.component, lang_1.isPresent(prevInstruction) ? prevInstruction.component : null);
- }
- return true;
- });
- }
- /***/ },
- /* 226 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var __param = (this && this.__param) || function (paramIndex, decorator) {
- return function (target, key) { decorator(target, key, paramIndex); }
- };
- var collection_1 = __webpack_require__(12);
- var async_1 = __webpack_require__(60);
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var reflection_1 = __webpack_require__(16);
- var core_1 = __webpack_require__(2);
- var route_config_impl_1 = __webpack_require__(227);
- var route_recognizer_1 = __webpack_require__(228);
- var component_recognizer_1 = __webpack_require__(232);
- var instruction_1 = __webpack_require__(229);
- var route_config_nomalizer_1 = __webpack_require__(235);
- var url_parser_1 = __webpack_require__(231);
- var _resolveToNull = async_1.PromiseWrapper.resolve(null);
- /**
- * Token used to bind the component with the top-level {@link RouteConfig}s for the
- * application.
- *
- * ### Example ([live demo](http://plnkr.co/edit/iRUP8B5OUbxCWQ3AcIDm))
- *
- * ```
- * import {Component} from 'angular2/core';
- * import {
- * ROUTER_DIRECTIVES,
- * ROUTER_PROVIDERS,
- * RouteConfig
- * } from 'angular2/router';
- *
- * @Component({directives: [ROUTER_DIRECTIVES]})
- * @RouteConfig([
- * {...},
- * ])
- * class AppCmp {
- * // ...
- * }
- *
- * bootstrap(AppCmp, [ROUTER_PROVIDERS]);
- * ```
- */
- exports.ROUTER_PRIMARY_COMPONENT = lang_1.CONST_EXPR(new core_1.OpaqueToken('RouterPrimaryComponent'));
- /**
- * The RouteRegistry holds route configurations for each component in an Angular app.
- * It is responsible for creating Instructions from URLs, and generating URLs based on route and
- * parameters.
- */
- var RouteRegistry = (function () {
- function RouteRegistry(_rootComponent) {
- this._rootComponent = _rootComponent;
- this._rules = new collection_1.Map();
- }
- /**
- * Given a component and a configuration object, add the route to this registry
- */
- RouteRegistry.prototype.config = function (parentComponent, config) {
- config = route_config_nomalizer_1.normalizeRouteConfig(config, this);
- // this is here because Dart type guard reasons
- if (config instanceof route_config_impl_1.Route) {
- route_config_nomalizer_1.assertComponentExists(config.component, config.path);
- }
- else if (config instanceof route_config_impl_1.AuxRoute) {
- route_config_nomalizer_1.assertComponentExists(config.component, config.path);
- }
- var recognizer = this._rules.get(parentComponent);
- if (lang_1.isBlank(recognizer)) {
- recognizer = new component_recognizer_1.ComponentRecognizer();
- this._rules.set(parentComponent, recognizer);
- }
- var terminal = recognizer.config(config);
- if (config instanceof route_config_impl_1.Route) {
- if (terminal) {
- assertTerminalComponent(config.component, config.path);
- }
- else {
- this.configFromComponent(config.component);
- }
- }
- };
- /**
- * Reads the annotations of a component and configures the registry based on them
- */
- RouteRegistry.prototype.configFromComponent = function (component) {
- var _this = this;
- if (!lang_1.isType(component)) {
- return;
- }
- // Don't read the annotations from a type more than once –
- // this prevents an infinite loop if a component routes recursively.
- if (this._rules.has(component)) {
- return;
- }
- var annotations = reflection_1.reflector.annotations(component);
- if (lang_1.isPresent(annotations)) {
- for (var i = 0; i < annotations.length; i++) {
- var annotation = annotations[i];
- if (annotation instanceof route_config_impl_1.RouteConfig) {
- var routeCfgs = annotation.configs;
- routeCfgs.forEach(function (config) { return _this.config(component, config); });
- }
- }
- }
- };
- /**
- * Given a URL and a parent component, return the most specific instruction for navigating
- * the application into the state specified by the url
- */
- RouteRegistry.prototype.recognize = function (url, ancestorInstructions) {
- var parsedUrl = url_parser_1.parser.parse(url);
- return this._recognize(parsedUrl, ancestorInstructions);
- };
- /**
- * Recognizes all parent-child routes, but creates unresolved auxiliary routes
- */
- RouteRegistry.prototype._recognize = function (parsedUrl, ancestorInstructions, _aux) {
- var _this = this;
- if (_aux === void 0) { _aux = false; }
- var parentComponent = ancestorInstructions.length > 0 ?
- ancestorInstructions[ancestorInstructions.length - 1].component.componentType :
- this._rootComponent;
- var componentRecognizer = this._rules.get(parentComponent);
- if (lang_1.isBlank(componentRecognizer)) {
- return _resolveToNull;
- }
- // Matches some beginning part of the given URL
- var possibleMatches = _aux ? componentRecognizer.recognizeAuxiliary(parsedUrl) :
- componentRecognizer.recognize(parsedUrl);
- var matchPromises = possibleMatches.map(function (candidate) { return candidate.then(function (candidate) {
- if (candidate instanceof route_recognizer_1.PathMatch) {
- var auxParentInstructions = ancestorInstructions.length > 0 ?
- [ancestorInstructions[ancestorInstructions.length - 1]] :
- [];
- var auxInstructions = _this._auxRoutesToUnresolved(candidate.remainingAux, auxParentInstructions);
- var instruction = new instruction_1.ResolvedInstruction(candidate.instruction, null, auxInstructions);
- if (candidate.instruction.terminal) {
- return instruction;
- }
- var newAncestorComponents = ancestorInstructions.concat([instruction]);
- return _this._recognize(candidate.remaining, newAncestorComponents)
- .then(function (childInstruction) {
- if (lang_1.isBlank(childInstruction)) {
- return null;
- }
- // redirect instructions are already absolute
- if (childInstruction instanceof instruction_1.RedirectInstruction) {
- return childInstruction;
- }
- instruction.child = childInstruction;
- return instruction;
- });
- }
- if (candidate instanceof route_recognizer_1.RedirectMatch) {
- var instruction = _this.generate(candidate.redirectTo, ancestorInstructions);
- return new instruction_1.RedirectInstruction(instruction.component, instruction.child, instruction.auxInstruction);
- }
- }); });
- if ((lang_1.isBlank(parsedUrl) || parsedUrl.path == '') && possibleMatches.length == 0) {
- return async_1.PromiseWrapper.resolve(this.generateDefault(parentComponent));
- }
- return async_1.PromiseWrapper.all(matchPromises).then(mostSpecific);
- };
- RouteRegistry.prototype._auxRoutesToUnresolved = function (auxRoutes, parentInstructions) {
- var _this = this;
- var unresolvedAuxInstructions = {};
- auxRoutes.forEach(function (auxUrl) {
- unresolvedAuxInstructions[auxUrl.path] = new instruction_1.UnresolvedInstruction(function () { return _this._recognize(auxUrl, parentInstructions, true); });
- });
- return unresolvedAuxInstructions;
- };
- /**
- * Given a normalized list with component names and params like: `['user', {id: 3 }]`
- * generates a url with a leading slash relative to the provided `parentComponent`.
- *
- * If the optional param `_aux` is `true`, then we generate starting at an auxiliary
- * route boundary.
- */
- RouteRegistry.prototype.generate = function (linkParams, ancestorInstructions, _aux) {
- if (_aux === void 0) { _aux = false; }
- var normalizedLinkParams = splitAndFlattenLinkParams(linkParams);
- var first = collection_1.ListWrapper.first(normalizedLinkParams);
- var rest = collection_1.ListWrapper.slice(normalizedLinkParams, 1);
- // The first segment should be either '.' (generate from parent) or '' (generate from root).
- // When we normalize above, we strip all the slashes, './' becomes '.' and '/' becomes ''.
- if (first == '') {
- ancestorInstructions = [];
- }
- else if (first == '..') {
- // we already captured the first instance of "..", so we need to pop off an ancestor
- ancestorInstructions.pop();
- while (collection_1.ListWrapper.first(rest) == '..') {
- rest = collection_1.ListWrapper.slice(rest, 1);
- ancestorInstructions.pop();
- if (ancestorInstructions.length <= 0) {
- throw new exceptions_1.BaseException("Link \"" + collection_1.ListWrapper.toJSON(linkParams) + "\" has too many \"../\" segments.");
- }
- }
- }
- else if (first != '.') {
- var parentComponent = this._rootComponent;
- var grandparentComponent = null;
- if (ancestorInstructions.length > 1) {
- parentComponent =
- ancestorInstructions[ancestorInstructions.length - 1].component.componentType;
- grandparentComponent =
- ancestorInstructions[ancestorInstructions.length - 2].component.componentType;
- }
- else if (ancestorInstructions.length == 1) {
- parentComponent = ancestorInstructions[0].component.componentType;
- grandparentComponent = this._rootComponent;
- }
- // For a link with no leading `./`, `/`, or `../`, we look for a sibling and child.
- // If both exist, we throw. Otherwise, we prefer whichever exists.
- var childRouteExists = this.hasRoute(first, parentComponent);
- var parentRouteExists = lang_1.isPresent(grandparentComponent) && this.hasRoute(first, grandparentComponent);
- if (parentRouteExists && childRouteExists) {
- var msg = "Link \"" + collection_1.ListWrapper.toJSON(linkParams) + "\" is ambiguous, use \"./\" or \"../\" to disambiguate.";
- throw new exceptions_1.BaseException(msg);
- }
- if (parentRouteExists) {
- ancestorInstructions.pop();
- }
- rest = linkParams;
- }
- if (rest[rest.length - 1] == '') {
- rest.pop();
- }
- if (rest.length < 1) {
- var msg = "Link \"" + collection_1.ListWrapper.toJSON(linkParams) + "\" must include a route name.";
- throw new exceptions_1.BaseException(msg);
- }
- var generatedInstruction = this._generate(rest, ancestorInstructions, _aux);
- for (var i = ancestorInstructions.length - 1; i >= 0; i--) {
- var ancestorInstruction = ancestorInstructions[i];
- generatedInstruction = ancestorInstruction.replaceChild(generatedInstruction);
- }
- return generatedInstruction;
- };
- /*
- * Internal helper that does not make any assertions about the beginning of the link DSL
- */
- RouteRegistry.prototype._generate = function (linkParams, ancestorInstructions, _aux) {
- var _this = this;
- if (_aux === void 0) { _aux = false; }
- var parentComponent = ancestorInstructions.length > 0 ?
- ancestorInstructions[ancestorInstructions.length - 1].component.componentType :
- this._rootComponent;
- if (linkParams.length == 0) {
- return this.generateDefault(parentComponent);
- }
- var linkIndex = 0;
- var routeName = linkParams[linkIndex];
- if (!lang_1.isString(routeName)) {
- throw new exceptions_1.BaseException("Unexpected segment \"" + routeName + "\" in link DSL. Expected a string.");
- }
- else if (routeName == '' || routeName == '.' || routeName == '..') {
- throw new exceptions_1.BaseException("\"" + routeName + "/\" is only allowed at the beginning of a link DSL.");
- }
- var params = {};
- if (linkIndex + 1 < linkParams.length) {
- var nextSegment_1 = linkParams[linkIndex + 1];
- if (lang_1.isStringMap(nextSegment_1) && !lang_1.isArray(nextSegment_1)) {
- params = nextSegment_1;
- linkIndex += 1;
- }
- }
- var auxInstructions = {};
- var nextSegment;
- while (linkIndex + 1 < linkParams.length && lang_1.isArray(nextSegment = linkParams[linkIndex + 1])) {
- var auxParentInstruction = ancestorInstructions.length > 0 ?
- [ancestorInstructions[ancestorInstructions.length - 1]] :
- [];
- var auxInstruction = this._generate(nextSegment, auxParentInstruction, true);
- // TODO: this will not work for aux routes with parameters or multiple segments
- auxInstructions[auxInstruction.component.urlPath] = auxInstruction;
- linkIndex += 1;
- }
- var componentRecognizer = this._rules.get(parentComponent);
- if (lang_1.isBlank(componentRecognizer)) {
- throw new exceptions_1.BaseException("Component \"" + lang_1.getTypeNameForDebugging(parentComponent) + "\" has no route config.");
- }
- var routeRecognizer = (_aux ? componentRecognizer.auxNames : componentRecognizer.names).get(routeName);
- if (!lang_1.isPresent(routeRecognizer)) {
- throw new exceptions_1.BaseException("Component \"" + lang_1.getTypeNameForDebugging(parentComponent) + "\" has no route named \"" + routeName + "\".");
- }
- if (!lang_1.isPresent(routeRecognizer.handler.componentType)) {
- var compInstruction = routeRecognizer.generateComponentPathValues(params);
- return new instruction_1.UnresolvedInstruction(function () {
- return routeRecognizer.handler.resolveComponentType().then(function (_) { return _this._generate(linkParams, ancestorInstructions, _aux); });
- }, compInstruction['urlPath'], compInstruction['urlParams']);
- }
- var componentInstruction = _aux ? componentRecognizer.generateAuxiliary(routeName, params) :
- componentRecognizer.generate(routeName, params);
- var remaining = linkParams.slice(linkIndex + 1);
- var instruction = new instruction_1.ResolvedInstruction(componentInstruction, null, auxInstructions);
- // the component is sync
- if (lang_1.isPresent(componentInstruction.componentType)) {
- var childInstruction = null;
- if (linkIndex + 1 < linkParams.length) {
- var childAncestorComponents = ancestorInstructions.concat([instruction]);
- childInstruction = this._generate(remaining, childAncestorComponents);
- }
- else if (!componentInstruction.terminal) {
- // ... look for defaults
- childInstruction = this.generateDefault(componentInstruction.componentType);
- if (lang_1.isBlank(childInstruction)) {
- throw new exceptions_1.BaseException("Link \"" + collection_1.ListWrapper.toJSON(linkParams) + "\" does not resolve to a terminal instruction.");
- }
- }
- instruction.child = childInstruction;
- }
- return instruction;
- };
- RouteRegistry.prototype.hasRoute = function (name, parentComponent) {
- var componentRecognizer = this._rules.get(parentComponent);
- if (lang_1.isBlank(componentRecognizer)) {
- return false;
- }
- return componentRecognizer.hasRoute(name);
- };
- RouteRegistry.prototype.generateDefault = function (componentCursor) {
- var _this = this;
- if (lang_1.isBlank(componentCursor)) {
- return null;
- }
- var componentRecognizer = this._rules.get(componentCursor);
- if (lang_1.isBlank(componentRecognizer) || lang_1.isBlank(componentRecognizer.defaultRoute)) {
- return null;
- }
- var defaultChild = null;
- if (lang_1.isPresent(componentRecognizer.defaultRoute.handler.componentType)) {
- var componentInstruction = componentRecognizer.defaultRoute.generate({});
- if (!componentRecognizer.defaultRoute.terminal) {
- defaultChild = this.generateDefault(componentRecognizer.defaultRoute.handler.componentType);
- }
- return new instruction_1.DefaultInstruction(componentInstruction, defaultChild);
- }
- return new instruction_1.UnresolvedInstruction(function () {
- return componentRecognizer.defaultRoute.handler.resolveComponentType().then(function (_) { return _this.generateDefault(componentCursor); });
- });
- };
- RouteRegistry = __decorate([
- core_1.Injectable(),
- __param(0, core_1.Inject(exports.ROUTER_PRIMARY_COMPONENT)),
- __metadata('design:paramtypes', [lang_1.Type])
- ], RouteRegistry);
- return RouteRegistry;
- })();
- exports.RouteRegistry = RouteRegistry;
- /*
- * Given: ['/a/b', {c: 2}]
- * Returns: ['', 'a', 'b', {c: 2}]
- */
- function splitAndFlattenLinkParams(linkParams) {
- return linkParams.reduce(function (accumulation, item) {
- if (lang_1.isString(item)) {
- var strItem = item;
- return accumulation.concat(strItem.split('/'));
- }
- accumulation.push(item);
- return accumulation;
- }, []);
- }
- /*
- * Given a list of instructions, returns the most specific instruction
- */
- function mostSpecific(instructions) {
- return collection_1.ListWrapper.maximum(instructions, function (instruction) { return instruction.specificity; });
- }
- function assertTerminalComponent(component, path) {
- if (!lang_1.isType(component)) {
- return;
- }
- var annotations = reflection_1.reflector.annotations(component);
- if (lang_1.isPresent(annotations)) {
- for (var i = 0; i < annotations.length; i++) {
- var annotation = annotations[i];
- if (annotation instanceof route_config_impl_1.RouteConfig) {
- throw new exceptions_1.BaseException("Child routes are not allowed for \"" + path + "\". Use \"...\" on the parent's route path.");
- }
- }
- }
- }
- /***/ },
- /* 227 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var lang_1 = __webpack_require__(5);
- /**
- * The `RouteConfig` decorator defines routes for a given component.
- *
- * It takes an array of {@link RouteDefinition}s.
- */
- var RouteConfig = (function () {
- function RouteConfig(configs) {
- this.configs = configs;
- }
- RouteConfig = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [Array])
- ], RouteConfig);
- return RouteConfig;
- })();
- exports.RouteConfig = RouteConfig;
- /**
- * `Route` is a type of {@link RouteDefinition} used to route a path to a component.
- *
- * It has the following properties:
- * - `path` is a string that uses the route matcher DSL.
- * - `component` a component type.
- * - `name` is an optional `CamelCase` string representing the name of the route.
- * - `data` is an optional property of any type representing arbitrary route metadata for the given
- * route. It is injectable via {@link RouteData}.
- * - `useAsDefault` is a boolean value. If `true`, the child route will be navigated to if no child
- * route is specified during the navigation.
- *
- * ### Example
- * ```
- * import {RouteConfig} from 'angular2/router';
- *
- * @RouteConfig([
- * {path: '/home', component: HomeCmp, name: 'HomeCmp' }
- * ])
- * class MyApp {}
- * ```
- */
- var Route = (function () {
- function Route(_a) {
- var path = _a.path, component = _a.component, name = _a.name, data = _a.data, useAsDefault = _a.useAsDefault;
- // added next three properties to work around https://github.com/Microsoft/TypeScript/issues/4107
- this.aux = null;
- this.loader = null;
- this.redirectTo = null;
- this.path = path;
- this.component = component;
- this.name = name;
- this.data = data;
- this.useAsDefault = useAsDefault;
- }
- Route = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [Object])
- ], Route);
- return Route;
- })();
- exports.Route = Route;
- /**
- * `AuxRoute` is a type of {@link RouteDefinition} used to define an auxiliary route.
- *
- * It takes an object with the following properties:
- * - `path` is a string that uses the route matcher DSL.
- * - `component` a component type.
- * - `name` is an optional `CamelCase` string representing the name of the route.
- * - `data` is an optional property of any type representing arbitrary route metadata for the given
- * route. It is injectable via {@link RouteData}.
- *
- * ### Example
- * ```
- * import {RouteConfig, AuxRoute} from 'angular2/router';
- *
- * @RouteConfig([
- * new AuxRoute({path: '/home', component: HomeCmp})
- * ])
- * class MyApp {}
- * ```
- */
- var AuxRoute = (function () {
- function AuxRoute(_a) {
- var path = _a.path, component = _a.component, name = _a.name;
- this.data = null;
- // added next three properties to work around https://github.com/Microsoft/TypeScript/issues/4107
- this.aux = null;
- this.loader = null;
- this.redirectTo = null;
- this.useAsDefault = false;
- this.path = path;
- this.component = component;
- this.name = name;
- }
- AuxRoute = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [Object])
- ], AuxRoute);
- return AuxRoute;
- })();
- exports.AuxRoute = AuxRoute;
- /**
- * `AsyncRoute` is a type of {@link RouteDefinition} used to route a path to an asynchronously
- * loaded component.
- *
- * It has the following properties:
- * - `path` is a string that uses the route matcher DSL.
- * - `loader` is a function that returns a promise that resolves to a component.
- * - `name` is an optional `CamelCase` string representing the name of the route.
- * - `data` is an optional property of any type representing arbitrary route metadata for the given
- * route. It is injectable via {@link RouteData}.
- * - `useAsDefault` is a boolean value. If `true`, the child route will be navigated to if no child
- * route is specified during the navigation.
- *
- * ### Example
- * ```
- * import {RouteConfig} from 'angular2/router';
- *
- * @RouteConfig([
- * {path: '/home', loader: () => Promise.resolve(MyLoadedCmp), name: 'MyLoadedCmp'}
- * ])
- * class MyApp {}
- * ```
- */
- var AsyncRoute = (function () {
- function AsyncRoute(_a) {
- var path = _a.path, loader = _a.loader, name = _a.name, data = _a.data, useAsDefault = _a.useAsDefault;
- this.aux = null;
- this.path = path;
- this.loader = loader;
- this.name = name;
- this.data = data;
- this.useAsDefault = useAsDefault;
- }
- AsyncRoute = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [Object])
- ], AsyncRoute);
- return AsyncRoute;
- })();
- exports.AsyncRoute = AsyncRoute;
- /**
- * `Redirect` is a type of {@link RouteDefinition} used to route a path to a canonical route.
- *
- * It has the following properties:
- * - `path` is a string that uses the route matcher DSL.
- * - `redirectTo` is an array representing the link DSL.
- *
- * Note that redirects **do not** affect how links are generated. For that, see the `useAsDefault`
- * option.
- *
- * ### Example
- * ```
- * import {RouteConfig} from 'angular2/router';
- *
- * @RouteConfig([
- * {path: '/', redirectTo: ['/Home'] },
- * {path: '/home', component: HomeCmp, name: 'Home'}
- * ])
- * class MyApp {}
- * ```
- */
- var Redirect = (function () {
- function Redirect(_a) {
- var path = _a.path, redirectTo = _a.redirectTo;
- this.name = null;
- // added next three properties to work around https://github.com/Microsoft/TypeScript/issues/4107
- this.loader = null;
- this.data = null;
- this.aux = null;
- this.useAsDefault = false;
- this.path = path;
- this.redirectTo = redirectTo;
- }
- Redirect = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [Object])
- ], Redirect);
- return Redirect;
- })();
- exports.Redirect = Redirect;
- /***/ },
- /* 228 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var promise_1 = __webpack_require__(61);
- var collection_1 = __webpack_require__(12);
- var instruction_1 = __webpack_require__(229);
- var path_recognizer_1 = __webpack_require__(230);
- var RouteMatch = (function () {
- function RouteMatch() {
- }
- return RouteMatch;
- })();
- exports.RouteMatch = RouteMatch;
- var PathMatch = (function (_super) {
- __extends(PathMatch, _super);
- function PathMatch(instruction, remaining, remainingAux) {
- _super.call(this);
- this.instruction = instruction;
- this.remaining = remaining;
- this.remainingAux = remainingAux;
- }
- return PathMatch;
- })(RouteMatch);
- exports.PathMatch = PathMatch;
- var RedirectMatch = (function (_super) {
- __extends(RedirectMatch, _super);
- function RedirectMatch(redirectTo, specificity) {
- _super.call(this);
- this.redirectTo = redirectTo;
- this.specificity = specificity;
- }
- return RedirectMatch;
- })(RouteMatch);
- exports.RedirectMatch = RedirectMatch;
- var RedirectRecognizer = (function () {
- function RedirectRecognizer(path, redirectTo) {
- this.path = path;
- this.redirectTo = redirectTo;
- this._pathRecognizer = new path_recognizer_1.PathRecognizer(path);
- this.hash = this._pathRecognizer.hash;
- }
- /**
- * Returns `null` or a `ParsedUrl` representing the new path to match
- */
- RedirectRecognizer.prototype.recognize = function (beginningSegment) {
- var match = null;
- if (lang_1.isPresent(this._pathRecognizer.recognize(beginningSegment))) {
- match = new RedirectMatch(this.redirectTo, this._pathRecognizer.specificity);
- }
- return promise_1.PromiseWrapper.resolve(match);
- };
- RedirectRecognizer.prototype.generate = function (params) {
- throw new exceptions_1.BaseException("Tried to generate a redirect.");
- };
- return RedirectRecognizer;
- })();
- exports.RedirectRecognizer = RedirectRecognizer;
- // represents something like '/foo/:bar'
- var RouteRecognizer = (function () {
- // TODO: cache component instruction instances by params and by ParsedUrl instance
- function RouteRecognizer(path, handler) {
- this.path = path;
- this.handler = handler;
- this.terminal = true;
- this._cache = new collection_1.Map();
- this._pathRecognizer = new path_recognizer_1.PathRecognizer(path);
- this.specificity = this._pathRecognizer.specificity;
- this.hash = this._pathRecognizer.hash;
- this.terminal = this._pathRecognizer.terminal;
- }
- RouteRecognizer.prototype.recognize = function (beginningSegment) {
- var _this = this;
- var res = this._pathRecognizer.recognize(beginningSegment);
- if (lang_1.isBlank(res)) {
- return null;
- }
- return this.handler.resolveComponentType().then(function (_) {
- var componentInstruction = _this._getInstruction(res['urlPath'], res['urlParams'], res['allParams']);
- return new PathMatch(componentInstruction, res['nextSegment'], res['auxiliary']);
- });
- };
- RouteRecognizer.prototype.generate = function (params) {
- var generated = this._pathRecognizer.generate(params);
- var urlPath = generated['urlPath'];
- var urlParams = generated['urlParams'];
- return this._getInstruction(urlPath, urlParams, params);
- };
- RouteRecognizer.prototype.generateComponentPathValues = function (params) {
- return this._pathRecognizer.generate(params);
- };
- RouteRecognizer.prototype._getInstruction = function (urlPath, urlParams, params) {
- if (lang_1.isBlank(this.handler.componentType)) {
- throw new exceptions_1.BaseException("Tried to get instruction before the type was loaded.");
- }
- var hashKey = urlPath + '?' + urlParams.join('?');
- if (this._cache.has(hashKey)) {
- return this._cache.get(hashKey);
- }
- var instruction = new instruction_1.ComponentInstruction(urlPath, urlParams, this.handler.data, this.handler.componentType, this.terminal, this.specificity, params);
- this._cache.set(hashKey, instruction);
- return instruction;
- };
- return RouteRecognizer;
- })();
- exports.RouteRecognizer = RouteRecognizer;
- /***/ },
- /* 229 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var collection_1 = __webpack_require__(12);
- var lang_1 = __webpack_require__(5);
- var async_1 = __webpack_require__(60);
- /**
- * `RouteParams` is an immutable map of parameters for the given route
- * based on the url matcher and optional parameters for that route.
- *
- * You can inject `RouteParams` into the constructor of a component to use it.
- *
- * ### Example
- *
- * ```
- * import {Component} from 'angular2/core';
- * import {bootstrap} from 'angular2/platform/browser';
- * import {Router, ROUTER_DIRECTIVES, ROUTER_PROVIDERS, RouteConfig} from 'angular2/router';
- *
- * @Component({directives: [ROUTER_DIRECTIVES]})
- * @RouteConfig([
- * {path: '/user/:id', component: UserCmp, as: 'UserCmp'},
- * ])
- * class AppCmp {}
- *
- * @Component({ template: 'user: {{id}}' })
- * class UserCmp {
- * id: string;
- * constructor(params: RouteParams) {
- * this.id = params.get('id');
- * }
- * }
- *
- * bootstrap(AppCmp, ROUTER_PROVIDERS);
- * ```
- */
- var RouteParams = (function () {
- function RouteParams(params) {
- this.params = params;
- }
- RouteParams.prototype.get = function (param) { return lang_1.normalizeBlank(collection_1.StringMapWrapper.get(this.params, param)); };
- return RouteParams;
- })();
- exports.RouteParams = RouteParams;
- /**
- * `RouteData` is an immutable map of additional data you can configure in your {@link Route}.
- *
- * You can inject `RouteData` into the constructor of a component to use it.
- *
- * ### Example
- *
- * ```
- * import {Component, View} from 'angular2/core';
- * import {bootstrap} from 'angular2/platform/browser';
- * import {Router, ROUTER_DIRECTIVES, routerBindings, RouteConfig} from 'angular2/router';
- *
- * @Component({...})
- * @View({directives: [ROUTER_DIRECTIVES]})
- * @RouteConfig([
- * {path: '/user/:id', component: UserCmp, as: 'UserCmp', data: {isAdmin: true}},
- * ])
- * class AppCmp {}
- *
- * @Component({...})
- * @View({ template: 'user: {{isAdmin}}' })
- * class UserCmp {
- * string: isAdmin;
- * constructor(data: RouteData) {
- * this.isAdmin = data.get('isAdmin');
- * }
- * }
- *
- * bootstrap(AppCmp, routerBindings(AppCmp));
- * ```
- */
- var RouteData = (function () {
- function RouteData(data) {
- if (data === void 0) { data = lang_1.CONST_EXPR({}); }
- this.data = data;
- }
- RouteData.prototype.get = function (key) { return lang_1.normalizeBlank(collection_1.StringMapWrapper.get(this.data, key)); };
- return RouteData;
- })();
- exports.RouteData = RouteData;
- exports.BLANK_ROUTE_DATA = new RouteData();
- /**
- * `Instruction` is a tree of {@link ComponentInstruction}s with all the information needed
- * to transition each component in the app to a given route, including all auxiliary routes.
- *
- * `Instruction`s can be created using {@link Router#generate}, and can be used to
- * perform route changes with {@link Router#navigateByInstruction}.
- *
- * ### Example
- *
- * ```
- * import {Component} from 'angular2/core';
- * import {bootstrap} from 'angular2/platform/browser';
- * import {Router, ROUTER_DIRECTIVES, ROUTER_PROVIDERS, RouteConfig} from 'angular2/router';
- *
- * @Component({directives: [ROUTER_DIRECTIVES]})
- * @RouteConfig([
- * {...},
- * ])
- * class AppCmp {
- * constructor(router: Router) {
- * var instruction = router.generate(['/MyRoute']);
- * router.navigateByInstruction(instruction);
- * }
- * }
- *
- * bootstrap(AppCmp, ROUTER_PROVIDERS);
- * ```
- */
- var Instruction = (function () {
- function Instruction() {
- this.auxInstruction = {};
- }
- Object.defineProperty(Instruction.prototype, "urlPath", {
- get: function () { return this.component.urlPath; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(Instruction.prototype, "urlParams", {
- get: function () { return this.component.urlParams; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(Instruction.prototype, "specificity", {
- get: function () {
- var total = 0;
- if (lang_1.isPresent(this.component)) {
- total += this.component.specificity;
- }
- if (lang_1.isPresent(this.child)) {
- total += this.child.specificity;
- }
- return total;
- },
- enumerable: true,
- configurable: true
- });
- /**
- * converts the instruction into a URL string
- */
- Instruction.prototype.toRootUrl = function () { return this.toUrlPath() + this.toUrlQuery(); };
- /** @internal */
- Instruction.prototype._toNonRootUrl = function () {
- return this._stringifyPathMatrixAuxPrefixed() +
- (lang_1.isPresent(this.child) ? this.child._toNonRootUrl() : '');
- };
- Instruction.prototype.toUrlQuery = function () { return this.urlParams.length > 0 ? ('?' + this.urlParams.join('&')) : ''; };
- /**
- * Returns a new instruction that shares the state of the existing instruction, but with
- * the given child {@link Instruction} replacing the existing child.
- */
- Instruction.prototype.replaceChild = function (child) {
- return new ResolvedInstruction(this.component, child, this.auxInstruction);
- };
- /**
- * If the final URL for the instruction is ``
- */
- Instruction.prototype.toUrlPath = function () {
- return this.urlPath + this._stringifyAux() +
- (lang_1.isPresent(this.child) ? this.child._toNonRootUrl() : '');
- };
- // default instructions override these
- Instruction.prototype.toLinkUrl = function () {
- return this.urlPath + this._stringifyAux() +
- (lang_1.isPresent(this.child) ? this.child._toLinkUrl() : '');
- };
- // this is the non-root version (called recursively)
- /** @internal */
- Instruction.prototype._toLinkUrl = function () {
- return this._stringifyPathMatrixAuxPrefixed() +
- (lang_1.isPresent(this.child) ? this.child._toLinkUrl() : '');
- };
- /** @internal */
- Instruction.prototype._stringifyPathMatrixAuxPrefixed = function () {
- var primary = this._stringifyPathMatrixAux();
- if (primary.length > 0) {
- primary = '/' + primary;
- }
- return primary;
- };
- /** @internal */
- Instruction.prototype._stringifyMatrixParams = function () {
- return this.urlParams.length > 0 ? (';' + this.component.urlParams.join(';')) : '';
- };
- /** @internal */
- Instruction.prototype._stringifyPathMatrixAux = function () {
- if (lang_1.isBlank(this.component)) {
- return '';
- }
- return this.urlPath + this._stringifyMatrixParams() + this._stringifyAux();
- };
- /** @internal */
- Instruction.prototype._stringifyAux = function () {
- var routes = [];
- collection_1.StringMapWrapper.forEach(this.auxInstruction, function (auxInstruction, _) {
- routes.push(auxInstruction._stringifyPathMatrixAux());
- });
- if (routes.length > 0) {
- return '(' + routes.join('//') + ')';
- }
- return '';
- };
- return Instruction;
- })();
- exports.Instruction = Instruction;
- /**
- * a resolved instruction has an outlet instruction for itself, but maybe not for...
- */
- var ResolvedInstruction = (function (_super) {
- __extends(ResolvedInstruction, _super);
- function ResolvedInstruction(component, child, auxInstruction) {
- _super.call(this);
- this.component = component;
- this.child = child;
- this.auxInstruction = auxInstruction;
- }
- ResolvedInstruction.prototype.resolveComponent = function () {
- return async_1.PromiseWrapper.resolve(this.component);
- };
- return ResolvedInstruction;
- })(Instruction);
- exports.ResolvedInstruction = ResolvedInstruction;
- /**
- * Represents a resolved default route
- */
- var DefaultInstruction = (function (_super) {
- __extends(DefaultInstruction, _super);
- function DefaultInstruction(component, child) {
- _super.call(this);
- this.component = component;
- this.child = child;
- }
- DefaultInstruction.prototype.resolveComponent = function () {
- return async_1.PromiseWrapper.resolve(this.component);
- };
- DefaultInstruction.prototype.toLinkUrl = function () { return ''; };
- /** @internal */
- DefaultInstruction.prototype._toLinkUrl = function () { return ''; };
- return DefaultInstruction;
- })(Instruction);
- exports.DefaultInstruction = DefaultInstruction;
- /**
- * Represents a component that may need to do some redirection or lazy loading at a later time.
- */
- var UnresolvedInstruction = (function (_super) {
- __extends(UnresolvedInstruction, _super);
- function UnresolvedInstruction(_resolver, _urlPath, _urlParams) {
- if (_urlPath === void 0) { _urlPath = ''; }
- if (_urlParams === void 0) { _urlParams = lang_1.CONST_EXPR([]); }
- _super.call(this);
- this._resolver = _resolver;
- this._urlPath = _urlPath;
- this._urlParams = _urlParams;
- }
- Object.defineProperty(UnresolvedInstruction.prototype, "urlPath", {
- get: function () {
- if (lang_1.isPresent(this.component)) {
- return this.component.urlPath;
- }
- if (lang_1.isPresent(this._urlPath)) {
- return this._urlPath;
- }
- return '';
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(UnresolvedInstruction.prototype, "urlParams", {
- get: function () {
- if (lang_1.isPresent(this.component)) {
- return this.component.urlParams;
- }
- if (lang_1.isPresent(this._urlParams)) {
- return this._urlParams;
- }
- return [];
- },
- enumerable: true,
- configurable: true
- });
- UnresolvedInstruction.prototype.resolveComponent = function () {
- var _this = this;
- if (lang_1.isPresent(this.component)) {
- return async_1.PromiseWrapper.resolve(this.component);
- }
- return this._resolver().then(function (resolution) {
- _this.child = resolution.child;
- return _this.component = resolution.component;
- });
- };
- return UnresolvedInstruction;
- })(Instruction);
- exports.UnresolvedInstruction = UnresolvedInstruction;
- var RedirectInstruction = (function (_super) {
- __extends(RedirectInstruction, _super);
- function RedirectInstruction(component, child, auxInstruction) {
- _super.call(this, component, child, auxInstruction);
- }
- return RedirectInstruction;
- })(ResolvedInstruction);
- exports.RedirectInstruction = RedirectInstruction;
- /**
- * A `ComponentInstruction` represents the route state for a single component. An `Instruction` is
- * composed of a tree of these `ComponentInstruction`s.
- *
- * `ComponentInstructions` is a public API. Instances of `ComponentInstruction` are passed
- * to route lifecycle hooks, like {@link CanActivate}.
- *
- * `ComponentInstruction`s are [https://en.wikipedia.org/wiki/Hash_consing](hash consed). You should
- * never construct one yourself with "new." Instead, rely on {@link Router/RouteRecognizer} to
- * construct `ComponentInstruction`s.
- *
- * You should not modify this object. It should be treated as immutable.
- */
- var ComponentInstruction = (function () {
- function ComponentInstruction(urlPath, urlParams, data, componentType, terminal, specificity, params) {
- if (params === void 0) { params = null; }
- this.urlPath = urlPath;
- this.urlParams = urlParams;
- this.componentType = componentType;
- this.terminal = terminal;
- this.specificity = specificity;
- this.params = params;
- this.reuse = false;
- this.routeData = lang_1.isPresent(data) ? data : exports.BLANK_ROUTE_DATA;
- }
- return ComponentInstruction;
- })();
- exports.ComponentInstruction = ComponentInstruction;
- /***/ },
- /* 230 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var collection_1 = __webpack_require__(12);
- var url_parser_1 = __webpack_require__(231);
- var TouchMap = (function () {
- function TouchMap(map) {
- var _this = this;
- this.map = {};
- this.keys = {};
- if (lang_1.isPresent(map)) {
- collection_1.StringMapWrapper.forEach(map, function (value, key) {
- _this.map[key] = lang_1.isPresent(value) ? value.toString() : null;
- _this.keys[key] = true;
- });
- }
- }
- TouchMap.prototype.get = function (key) {
- collection_1.StringMapWrapper.delete(this.keys, key);
- return this.map[key];
- };
- TouchMap.prototype.getUnused = function () {
- var _this = this;
- var unused = {};
- var keys = collection_1.StringMapWrapper.keys(this.keys);
- keys.forEach(function (key) { return unused[key] = collection_1.StringMapWrapper.get(_this.map, key); });
- return unused;
- };
- return TouchMap;
- })();
- function normalizeString(obj) {
- if (lang_1.isBlank(obj)) {
- return null;
- }
- else {
- return obj.toString();
- }
- }
- var ContinuationSegment = (function () {
- function ContinuationSegment() {
- this.name = '';
- }
- ContinuationSegment.prototype.generate = function (params) { return ''; };
- ContinuationSegment.prototype.match = function (path) { return true; };
- return ContinuationSegment;
- })();
- var StaticSegment = (function () {
- function StaticSegment(path) {
- this.path = path;
- this.name = '';
- }
- StaticSegment.prototype.match = function (path) { return path == this.path; };
- StaticSegment.prototype.generate = function (params) { return this.path; };
- return StaticSegment;
- })();
- var DynamicSegment = (function () {
- function DynamicSegment(name) {
- this.name = name;
- }
- DynamicSegment.prototype.match = function (path) { return path.length > 0; };
- DynamicSegment.prototype.generate = function (params) {
- if (!collection_1.StringMapWrapper.contains(params.map, this.name)) {
- throw new exceptions_1.BaseException("Route generator for '" + this.name + "' was not included in parameters passed.");
- }
- return normalizeString(params.get(this.name));
- };
- return DynamicSegment;
- })();
- var StarSegment = (function () {
- function StarSegment(name) {
- this.name = name;
- }
- StarSegment.prototype.match = function (path) { return true; };
- StarSegment.prototype.generate = function (params) { return normalizeString(params.get(this.name)); };
- return StarSegment;
- })();
- var paramMatcher = /^:([^\/]+)$/g;
- var wildcardMatcher = /^\*([^\/]+)$/g;
- function parsePathString(route) {
- // normalize route as not starting with a "/". Recognition will
- // also normalize.
- if (route.startsWith("/")) {
- route = route.substring(1);
- }
- var segments = splitBySlash(route);
- var results = [];
- var specificity = 0;
- // The "specificity" of a path is used to determine which route is used when multiple routes match
- // a URL.
- // Static segments (like "/foo") are the most specific, followed by dynamic segments (like
- // "/:id"). Star segments
- // add no specificity. Segments at the start of the path are more specific than proceeding ones.
- // The code below uses place values to combine the different types of segments into a single
- // integer that we can
- // sort later. Each static segment is worth hundreds of points of specificity (10000, 9900, ...,
- // 200), and each
- // dynamic segment is worth single points of specificity (100, 99, ... 2).
- if (segments.length > 98) {
- throw new exceptions_1.BaseException("'" + route + "' has more than the maximum supported number of segments.");
- }
- var limit = segments.length - 1;
- for (var i = 0; i <= limit; i++) {
- var segment = segments[i], match;
- if (lang_1.isPresent(match = lang_1.RegExpWrapper.firstMatch(paramMatcher, segment))) {
- results.push(new DynamicSegment(match[1]));
- specificity += (100 - i);
- }
- else if (lang_1.isPresent(match = lang_1.RegExpWrapper.firstMatch(wildcardMatcher, segment))) {
- results.push(new StarSegment(match[1]));
- }
- else if (segment == '...') {
- if (i < limit) {
- throw new exceptions_1.BaseException("Unexpected \"...\" before the end of the path for \"" + route + "\".");
- }
- results.push(new ContinuationSegment());
- }
- else {
- results.push(new StaticSegment(segment));
- specificity += 100 * (100 - i);
- }
- }
- var result = collection_1.StringMapWrapper.create();
- collection_1.StringMapWrapper.set(result, 'segments', results);
- collection_1.StringMapWrapper.set(result, 'specificity', specificity);
- return result;
- }
- // this function is used to determine whether a route config path like `/foo/:id` collides with
- // `/foo/:name`
- function pathDslHash(segments) {
- return segments.map(function (segment) {
- if (segment instanceof StarSegment) {
- return '*';
- }
- else if (segment instanceof ContinuationSegment) {
- return '...';
- }
- else if (segment instanceof DynamicSegment) {
- return ':';
- }
- else if (segment instanceof StaticSegment) {
- return segment.path;
- }
- })
- .join('/');
- }
- function splitBySlash(url) {
- return url.split('/');
- }
- var RESERVED_CHARS = lang_1.RegExpWrapper.create('//|\\(|\\)|;|\\?|=');
- function assertPath(path) {
- if (lang_1.StringWrapper.contains(path, '#')) {
- throw new exceptions_1.BaseException("Path \"" + path + "\" should not include \"#\". Use \"HashLocationStrategy\" instead.");
- }
- var illegalCharacter = lang_1.RegExpWrapper.firstMatch(RESERVED_CHARS, path);
- if (lang_1.isPresent(illegalCharacter)) {
- throw new exceptions_1.BaseException("Path \"" + path + "\" contains \"" + illegalCharacter[0] + "\" which is not allowed in a route config.");
- }
- }
- /**
- * Parses a URL string using a given matcher DSL, and generates URLs from param maps
- */
- var PathRecognizer = (function () {
- function PathRecognizer(path) {
- this.path = path;
- this.terminal = true;
- assertPath(path);
- var parsed = parsePathString(path);
- this._segments = parsed['segments'];
- this.specificity = parsed['specificity'];
- this.hash = pathDslHash(this._segments);
- var lastSegment = this._segments[this._segments.length - 1];
- this.terminal = !(lastSegment instanceof ContinuationSegment);
- }
- PathRecognizer.prototype.recognize = function (beginningSegment) {
- var nextSegment = beginningSegment;
- var currentSegment;
- var positionalParams = {};
- var captured = [];
- for (var i = 0; i < this._segments.length; i += 1) {
- var segment = this._segments[i];
- currentSegment = nextSegment;
- if (segment instanceof ContinuationSegment) {
- break;
- }
- if (lang_1.isPresent(currentSegment)) {
- captured.push(currentSegment.path);
- // the star segment consumes all of the remaining URL, including matrix params
- if (segment instanceof StarSegment) {
- positionalParams[segment.name] = currentSegment.toString();
- nextSegment = null;
- break;
- }
- if (segment instanceof DynamicSegment) {
- positionalParams[segment.name] = currentSegment.path;
- }
- else if (!segment.match(currentSegment.path)) {
- return null;
- }
- nextSegment = currentSegment.child;
- }
- else if (!segment.match('')) {
- return null;
- }
- }
- if (this.terminal && lang_1.isPresent(nextSegment)) {
- return null;
- }
- var urlPath = captured.join('/');
- var auxiliary;
- var urlParams;
- var allParams;
- if (lang_1.isPresent(currentSegment)) {
- // If this is the root component, read query params. Otherwise, read matrix params.
- var paramsSegment = beginningSegment instanceof url_parser_1.RootUrl ? beginningSegment : currentSegment;
- allParams = lang_1.isPresent(paramsSegment.params) ?
- collection_1.StringMapWrapper.merge(paramsSegment.params, positionalParams) :
- positionalParams;
- urlParams = url_parser_1.serializeParams(paramsSegment.params);
- auxiliary = currentSegment.auxiliary;
- }
- else {
- allParams = positionalParams;
- auxiliary = [];
- urlParams = [];
- }
- return { urlPath: urlPath, urlParams: urlParams, allParams: allParams, auxiliary: auxiliary, nextSegment: nextSegment };
- };
- PathRecognizer.prototype.generate = function (params) {
- var paramTokens = new TouchMap(params);
- var path = [];
- for (var i = 0; i < this._segments.length; i++) {
- var segment = this._segments[i];
- if (!(segment instanceof ContinuationSegment)) {
- path.push(segment.generate(paramTokens));
- }
- }
- var urlPath = path.join('/');
- var nonPositionalParams = paramTokens.getUnused();
- var urlParams = url_parser_1.serializeParams(nonPositionalParams);
- return { urlPath: urlPath, urlParams: urlParams };
- };
- return PathRecognizer;
- })();
- exports.PathRecognizer = PathRecognizer;
- /***/ },
- /* 231 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var collection_1 = __webpack_require__(12);
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- /**
- * This class represents a parsed URL
- */
- var Url = (function () {
- function Url(path, child, auxiliary, params) {
- if (child === void 0) { child = null; }
- if (auxiliary === void 0) { auxiliary = lang_1.CONST_EXPR([]); }
- if (params === void 0) { params = null; }
- this.path = path;
- this.child = child;
- this.auxiliary = auxiliary;
- this.params = params;
- }
- Url.prototype.toString = function () {
- return this.path + this._matrixParamsToString() + this._auxToString() + this._childString();
- };
- Url.prototype.segmentToString = function () { return this.path + this._matrixParamsToString(); };
- /** @internal */
- Url.prototype._auxToString = function () {
- return this.auxiliary.length > 0 ?
- ('(' + this.auxiliary.map(function (sibling) { return sibling.toString(); }).join('//') + ')') :
- '';
- };
- Url.prototype._matrixParamsToString = function () {
- if (lang_1.isBlank(this.params)) {
- return '';
- }
- return ';' + serializeParams(this.params).join(';');
- };
- /** @internal */
- Url.prototype._childString = function () { return lang_1.isPresent(this.child) ? ('/' + this.child.toString()) : ''; };
- return Url;
- })();
- exports.Url = Url;
- var RootUrl = (function (_super) {
- __extends(RootUrl, _super);
- function RootUrl(path, child, auxiliary, params) {
- if (child === void 0) { child = null; }
- if (auxiliary === void 0) { auxiliary = lang_1.CONST_EXPR([]); }
- if (params === void 0) { params = null; }
- _super.call(this, path, child, auxiliary, params);
- }
- RootUrl.prototype.toString = function () {
- return this.path + this._auxToString() + this._childString() + this._queryParamsToString();
- };
- RootUrl.prototype.segmentToString = function () { return this.path + this._queryParamsToString(); };
- RootUrl.prototype._queryParamsToString = function () {
- if (lang_1.isBlank(this.params)) {
- return '';
- }
- return '?' + serializeParams(this.params).join('&');
- };
- return RootUrl;
- })(Url);
- exports.RootUrl = RootUrl;
- function pathSegmentsToUrl(pathSegments) {
- var url = new Url(pathSegments[pathSegments.length - 1]);
- for (var i = pathSegments.length - 2; i >= 0; i -= 1) {
- url = new Url(pathSegments[i], url);
- }
- return url;
- }
- exports.pathSegmentsToUrl = pathSegmentsToUrl;
- var SEGMENT_RE = lang_1.RegExpWrapper.create('^[^\\/\\(\\)\\?;=&#]+');
- function matchUrlSegment(str) {
- var match = lang_1.RegExpWrapper.firstMatch(SEGMENT_RE, str);
- return lang_1.isPresent(match) ? match[0] : '';
- }
- var UrlParser = (function () {
- function UrlParser() {
- }
- UrlParser.prototype.peekStartsWith = function (str) { return this._remaining.startsWith(str); };
- UrlParser.prototype.capture = function (str) {
- if (!this._remaining.startsWith(str)) {
- throw new exceptions_1.BaseException("Expected \"" + str + "\".");
- }
- this._remaining = this._remaining.substring(str.length);
- };
- UrlParser.prototype.parse = function (url) {
- this._remaining = url;
- if (url == '' || url == '/') {
- return new Url('');
- }
- return this.parseRoot();
- };
- // segment + (aux segments) + (query params)
- UrlParser.prototype.parseRoot = function () {
- if (this.peekStartsWith('/')) {
- this.capture('/');
- }
- var path = matchUrlSegment(this._remaining);
- this.capture(path);
- var aux = [];
- if (this.peekStartsWith('(')) {
- aux = this.parseAuxiliaryRoutes();
- }
- if (this.peekStartsWith(';')) {
- // TODO: should these params just be dropped?
- this.parseMatrixParams();
- }
- var child = null;
- if (this.peekStartsWith('/') && !this.peekStartsWith('//')) {
- this.capture('/');
- child = this.parseSegment();
- }
- var queryParams = null;
- if (this.peekStartsWith('?')) {
- queryParams = this.parseQueryParams();
- }
- return new RootUrl(path, child, aux, queryParams);
- };
- // segment + (matrix params) + (aux segments)
- UrlParser.prototype.parseSegment = function () {
- if (this._remaining.length == 0) {
- return null;
- }
- if (this.peekStartsWith('/')) {
- this.capture('/');
- }
- var path = matchUrlSegment(this._remaining);
- this.capture(path);
- var matrixParams = null;
- if (this.peekStartsWith(';')) {
- matrixParams = this.parseMatrixParams();
- }
- var aux = [];
- if (this.peekStartsWith('(')) {
- aux = this.parseAuxiliaryRoutes();
- }
- var child = null;
- if (this.peekStartsWith('/') && !this.peekStartsWith('//')) {
- this.capture('/');
- child = this.parseSegment();
- }
- return new Url(path, child, aux, matrixParams);
- };
- UrlParser.prototype.parseQueryParams = function () {
- var params = {};
- this.capture('?');
- this.parseParam(params);
- while (this._remaining.length > 0 && this.peekStartsWith('&')) {
- this.capture('&');
- this.parseParam(params);
- }
- return params;
- };
- UrlParser.prototype.parseMatrixParams = function () {
- var params = {};
- while (this._remaining.length > 0 && this.peekStartsWith(';')) {
- this.capture(';');
- this.parseParam(params);
- }
- return params;
- };
- UrlParser.prototype.parseParam = function (params) {
- var key = matchUrlSegment(this._remaining);
- if (lang_1.isBlank(key)) {
- return;
- }
- this.capture(key);
- var value = true;
- if (this.peekStartsWith('=')) {
- this.capture('=');
- var valueMatch = matchUrlSegment(this._remaining);
- if (lang_1.isPresent(valueMatch)) {
- value = valueMatch;
- this.capture(value);
- }
- }
- params[key] = value;
- };
- UrlParser.prototype.parseAuxiliaryRoutes = function () {
- var routes = [];
- this.capture('(');
- while (!this.peekStartsWith(')') && this._remaining.length > 0) {
- routes.push(this.parseSegment());
- if (this.peekStartsWith('//')) {
- this.capture('//');
- }
- }
- this.capture(')');
- return routes;
- };
- return UrlParser;
- })();
- exports.UrlParser = UrlParser;
- exports.parser = new UrlParser();
- function serializeParams(paramMap) {
- var params = [];
- if (lang_1.isPresent(paramMap)) {
- collection_1.StringMapWrapper.forEach(paramMap, function (value, key) {
- if (value == true) {
- params.push(key);
- }
- else {
- params.push(key + '=' + value);
- }
- });
- }
- return params;
- }
- exports.serializeParams = serializeParams;
- /***/ },
- /* 232 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var collection_1 = __webpack_require__(12);
- var async_1 = __webpack_require__(60);
- var route_recognizer_1 = __webpack_require__(228);
- var route_config_impl_1 = __webpack_require__(227);
- var async_route_handler_1 = __webpack_require__(233);
- var sync_route_handler_1 = __webpack_require__(234);
- /**
- * `ComponentRecognizer` is responsible for recognizing routes for a single component.
- * It is consumed by `RouteRegistry`, which knows how to recognize an entire hierarchy of
- * components.
- */
- var ComponentRecognizer = (function () {
- function ComponentRecognizer() {
- this.names = new collection_1.Map();
- // map from name to recognizer
- this.auxNames = new collection_1.Map();
- // map from starting path to recognizer
- this.auxRoutes = new collection_1.Map();
- // TODO: optimize this into a trie
- this.matchers = [];
- this.defaultRoute = null;
- }
- /**
- * returns whether or not the config is terminal
- */
- ComponentRecognizer.prototype.config = function (config) {
- var handler;
- if (lang_1.isPresent(config.name) && config.name[0].toUpperCase() != config.name[0]) {
- var suggestedName = config.name[0].toUpperCase() + config.name.substring(1);
- throw new exceptions_1.BaseException("Route \"" + config.path + "\" with name \"" + config.name + "\" does not begin with an uppercase letter. Route names should be CamelCase like \"" + suggestedName + "\".");
- }
- if (config instanceof route_config_impl_1.AuxRoute) {
- handler = new sync_route_handler_1.SyncRouteHandler(config.component, config.data);
- var path = config.path.startsWith('/') ? config.path.substring(1) : config.path;
- var recognizer = new route_recognizer_1.RouteRecognizer(config.path, handler);
- this.auxRoutes.set(path, recognizer);
- if (lang_1.isPresent(config.name)) {
- this.auxNames.set(config.name, recognizer);
- }
- return recognizer.terminal;
- }
- var useAsDefault = false;
- if (config instanceof route_config_impl_1.Redirect) {
- var redirector = new route_recognizer_1.RedirectRecognizer(config.path, config.redirectTo);
- this._assertNoHashCollision(redirector.hash, config.path);
- this.matchers.push(redirector);
- return true;
- }
- if (config instanceof route_config_impl_1.Route) {
- handler = new sync_route_handler_1.SyncRouteHandler(config.component, config.data);
- useAsDefault = lang_1.isPresent(config.useAsDefault) && config.useAsDefault;
- }
- else if (config instanceof route_config_impl_1.AsyncRoute) {
- handler = new async_route_handler_1.AsyncRouteHandler(config.loader, config.data);
- useAsDefault = lang_1.isPresent(config.useAsDefault) && config.useAsDefault;
- }
- var recognizer = new route_recognizer_1.RouteRecognizer(config.path, handler);
- this._assertNoHashCollision(recognizer.hash, config.path);
- if (useAsDefault) {
- if (lang_1.isPresent(this.defaultRoute)) {
- throw new exceptions_1.BaseException("Only one route can be default");
- }
- this.defaultRoute = recognizer;
- }
- this.matchers.push(recognizer);
- if (lang_1.isPresent(config.name)) {
- this.names.set(config.name, recognizer);
- }
- return recognizer.terminal;
- };
- ComponentRecognizer.prototype._assertNoHashCollision = function (hash, path) {
- this.matchers.forEach(function (matcher) {
- if (hash == matcher.hash) {
- throw new exceptions_1.BaseException("Configuration '" + path + "' conflicts with existing route '" + matcher.path + "'");
- }
- });
- };
- /**
- * Given a URL, returns a list of `RouteMatch`es, which are partial recognitions for some route.
- */
- ComponentRecognizer.prototype.recognize = function (urlParse) {
- var solutions = [];
- this.matchers.forEach(function (routeRecognizer) {
- var pathMatch = routeRecognizer.recognize(urlParse);
- if (lang_1.isPresent(pathMatch)) {
- solutions.push(pathMatch);
- }
- });
- return solutions;
- };
- ComponentRecognizer.prototype.recognizeAuxiliary = function (urlParse) {
- var routeRecognizer = this.auxRoutes.get(urlParse.path);
- if (lang_1.isPresent(routeRecognizer)) {
- return [routeRecognizer.recognize(urlParse)];
- }
- return [async_1.PromiseWrapper.resolve(null)];
- };
- ComponentRecognizer.prototype.hasRoute = function (name) { return this.names.has(name); };
- ComponentRecognizer.prototype.componentLoaded = function (name) {
- return this.hasRoute(name) && lang_1.isPresent(this.names.get(name).handler.componentType);
- };
- ComponentRecognizer.prototype.loadComponent = function (name) {
- return this.names.get(name).handler.resolveComponentType();
- };
- ComponentRecognizer.prototype.generate = function (name, params) {
- var pathRecognizer = this.names.get(name);
- if (lang_1.isBlank(pathRecognizer)) {
- return null;
- }
- return pathRecognizer.generate(params);
- };
- ComponentRecognizer.prototype.generateAuxiliary = function (name, params) {
- var pathRecognizer = this.auxNames.get(name);
- if (lang_1.isBlank(pathRecognizer)) {
- return null;
- }
- return pathRecognizer.generate(params);
- };
- return ComponentRecognizer;
- })();
- exports.ComponentRecognizer = ComponentRecognizer;
- /***/ },
- /* 233 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var instruction_1 = __webpack_require__(229);
- var AsyncRouteHandler = (function () {
- function AsyncRouteHandler(_loader, data) {
- if (data === void 0) { data = null; }
- this._loader = _loader;
- /** @internal */
- this._resolvedComponent = null;
- this.data = lang_1.isPresent(data) ? new instruction_1.RouteData(data) : instruction_1.BLANK_ROUTE_DATA;
- }
- AsyncRouteHandler.prototype.resolveComponentType = function () {
- var _this = this;
- if (lang_1.isPresent(this._resolvedComponent)) {
- return this._resolvedComponent;
- }
- return this._resolvedComponent = this._loader().then(function (componentType) {
- _this.componentType = componentType;
- return componentType;
- });
- };
- return AsyncRouteHandler;
- })();
- exports.AsyncRouteHandler = AsyncRouteHandler;
- /***/ },
- /* 234 */
- /***/ function(module, exports, __webpack_require__) {
- var async_1 = __webpack_require__(60);
- var lang_1 = __webpack_require__(5);
- var instruction_1 = __webpack_require__(229);
- var SyncRouteHandler = (function () {
- function SyncRouteHandler(componentType, data) {
- this.componentType = componentType;
- /** @internal */
- this._resolvedComponent = null;
- this._resolvedComponent = async_1.PromiseWrapper.resolve(componentType);
- this.data = lang_1.isPresent(data) ? new instruction_1.RouteData(data) : instruction_1.BLANK_ROUTE_DATA;
- }
- SyncRouteHandler.prototype.resolveComponentType = function () { return this._resolvedComponent; };
- return SyncRouteHandler;
- })();
- exports.SyncRouteHandler = SyncRouteHandler;
- /***/ },
- /* 235 */
- /***/ function(module, exports, __webpack_require__) {
- var route_config_decorator_1 = __webpack_require__(236);
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- /**
- * Given a JS Object that represents a route config, returns a corresponding Route, AsyncRoute,
- * AuxRoute or Redirect object.
- *
- * Also wraps an AsyncRoute's loader function to add the loaded component's route config to the
- * `RouteRegistry`.
- */
- function normalizeRouteConfig(config, registry) {
- if (config instanceof route_config_decorator_1.AsyncRoute) {
- var wrappedLoader = wrapLoaderToReconfigureRegistry(config.loader, registry);
- return new route_config_decorator_1.AsyncRoute({
- path: config.path,
- loader: wrappedLoader,
- name: config.name,
- data: config.data,
- useAsDefault: config.useAsDefault
- });
- }
- if (config instanceof route_config_decorator_1.Route || config instanceof route_config_decorator_1.Redirect || config instanceof route_config_decorator_1.AuxRoute) {
- return config;
- }
- if ((+!!config.component) + (+!!config.redirectTo) + (+!!config.loader) != 1) {
- throw new exceptions_1.BaseException("Route config should contain exactly one \"component\", \"loader\", or \"redirectTo\" property.");
- }
- if (config.as && config.name) {
- throw new exceptions_1.BaseException("Route config should contain exactly one \"as\" or \"name\" property.");
- }
- if (config.as) {
- config.name = config.as;
- }
- if (config.loader) {
- var wrappedLoader = wrapLoaderToReconfigureRegistry(config.loader, registry);
- return new route_config_decorator_1.AsyncRoute({
- path: config.path,
- loader: wrappedLoader,
- name: config.name,
- useAsDefault: config.useAsDefault
- });
- }
- if (config.aux) {
- return new route_config_decorator_1.AuxRoute({ path: config.aux, component: config.component, name: config.name });
- }
- if (config.component) {
- if (typeof config.component == 'object') {
- var componentDefinitionObject = config.component;
- if (componentDefinitionObject.type == 'constructor') {
- return new route_config_decorator_1.Route({
- path: config.path,
- component: componentDefinitionObject.constructor,
- name: config.name,
- data: config.data,
- useAsDefault: config.useAsDefault
- });
- }
- else if (componentDefinitionObject.type == 'loader') {
- return new route_config_decorator_1.AsyncRoute({
- path: config.path,
- loader: componentDefinitionObject.loader,
- name: config.name,
- useAsDefault: config.useAsDefault
- });
- }
- else {
- throw new exceptions_1.BaseException("Invalid component type \"" + componentDefinitionObject.type + "\". Valid types are \"constructor\" and \"loader\".");
- }
- }
- return new route_config_decorator_1.Route(config);
- }
- if (config.redirectTo) {
- return new route_config_decorator_1.Redirect({ path: config.path, redirectTo: config.redirectTo });
- }
- return config;
- }
- exports.normalizeRouteConfig = normalizeRouteConfig;
- function wrapLoaderToReconfigureRegistry(loader, registry) {
- return function () {
- return loader().then(function (componentType) {
- registry.configFromComponent(componentType);
- return componentType;
- });
- };
- }
- function assertComponentExists(component, path) {
- if (!lang_1.isType(component)) {
- throw new exceptions_1.BaseException("Component for route \"" + path + "\" is not defined, or is not a class.");
- }
- }
- exports.assertComponentExists = assertComponentExists;
- /***/ },
- /* 236 */
- /***/ function(module, exports, __webpack_require__) {
- var route_config_impl_1 = __webpack_require__(227);
- var decorators_1 = __webpack_require__(9);
- var route_config_impl_2 = __webpack_require__(227);
- exports.Route = route_config_impl_2.Route;
- exports.Redirect = route_config_impl_2.Redirect;
- exports.AuxRoute = route_config_impl_2.AuxRoute;
- exports.AsyncRoute = route_config_impl_2.AsyncRoute;
- // Copied from RouteConfig in route_config_impl.
- /**
- * The `RouteConfig` decorator defines routes for a given component.
- *
- * It takes an array of {@link RouteDefinition}s.
- */
- exports.RouteConfig = decorators_1.makeDecorator(route_config_impl_1.RouteConfig);
- /***/ },
- /* 237 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var location_strategy_1 = __webpack_require__(238);
- var async_1 = __webpack_require__(60);
- var core_1 = __webpack_require__(2);
- /**
- * `Location` is a service that applications can use to interact with a browser's URL.
- * Depending on which {@link LocationStrategy} is used, `Location` will either persist
- * to the URL's path or the URL's hash segment.
- *
- * Note: it's better to use {@link Router#navigate} service to trigger route changes. Use
- * `Location` only if you need to interact with or create normalized URLs outside of
- * routing.
- *
- * `Location` is responsible for normalizing the URL against the application's base href.
- * A normalized URL is absolute from the URL host, includes the application's base href, and has no
- * trailing slash:
- * - `/my/app/user/123` is normalized
- * - `my/app/user/123` **is not** normalized
- * - `/my/app/user/123/` **is not** normalized
- *
- * ### Example
- *
- * ```
- * import {Component} from 'angular2/core';
- * import {
- * ROUTER_DIRECTIVES,
- * ROUTER_PROVIDERS,
- * RouteConfig,
- * Location
- * } from 'angular2/router';
- *
- * @Component({directives: [ROUTER_DIRECTIVES]})
- * @RouteConfig([
- * {...},
- * ])
- * class AppCmp {
- * constructor(location: Location) {
- * location.go('/foo');
- * }
- * }
- *
- * bootstrap(AppCmp, [ROUTER_PROVIDERS]);
- * ```
- */
- var Location = (function () {
- function Location(platformStrategy) {
- var _this = this;
- this.platformStrategy = platformStrategy;
- /** @internal */
- this._subject = new async_1.EventEmitter();
- var browserBaseHref = this.platformStrategy.getBaseHref();
- this._baseHref = stripTrailingSlash(stripIndexHtml(browserBaseHref));
- this.platformStrategy.onPopState(function (ev) {
- async_1.ObservableWrapper.callEmit(_this._subject, { 'url': _this.path(), 'pop': true, 'type': ev.type });
- });
- }
- /**
- * Returns the normalized URL path.
- */
- Location.prototype.path = function () { return this.normalize(this.platformStrategy.path()); };
- /**
- * Given a string representing a URL, returns the normalized URL path without leading or
- * trailing slashes
- */
- Location.prototype.normalize = function (url) {
- return stripTrailingSlash(_stripBaseHref(this._baseHref, stripIndexHtml(url)));
- };
- /**
- * Given a string representing a URL, returns the platform-specific external URL path.
- * If the given URL doesn't begin with a leading slash (`'/'`), this method adds one
- * before normalizing. This method will also add a hash if `HashLocationStrategy` is
- * used, or the `APP_BASE_HREF` if the `PathLocationStrategy` is in use.
- */
- Location.prototype.prepareExternalUrl = function (url) {
- if (url.length > 0 && !url.startsWith('/')) {
- url = '/' + url;
- }
- return this.platformStrategy.prepareExternalUrl(url);
- };
- // TODO: rename this method to pushState
- /**
- * Changes the browsers URL to the normalized version of the given URL, and pushes a
- * new item onto the platform's history.
- */
- Location.prototype.go = function (path, query) {
- if (query === void 0) { query = ''; }
- this.platformStrategy.pushState(null, '', path, query);
- };
- /**
- * Changes the browsers URL to the normalized version of the given URL, and replaces
- * the top item on the platform's history stack.
- */
- Location.prototype.replaceState = function (path, query) {
- if (query === void 0) { query = ''; }
- this.platformStrategy.replaceState(null, '', path, query);
- };
- /**
- * Navigates forward in the platform's history.
- */
- Location.prototype.forward = function () { this.platformStrategy.forward(); };
- /**
- * Navigates back in the platform's history.
- */
- Location.prototype.back = function () { this.platformStrategy.back(); };
- /**
- * Subscribe to the platform's `popState` events.
- */
- Location.prototype.subscribe = function (onNext, onThrow, onReturn) {
- if (onThrow === void 0) { onThrow = null; }
- if (onReturn === void 0) { onReturn = null; }
- return async_1.ObservableWrapper.subscribe(this._subject, onNext, onThrow, onReturn);
- };
- Location = __decorate([
- core_1.Injectable(),
- __metadata('design:paramtypes', [location_strategy_1.LocationStrategy])
- ], Location);
- return Location;
- })();
- exports.Location = Location;
- function _stripBaseHref(baseHref, url) {
- if (baseHref.length > 0 && url.startsWith(baseHref)) {
- return url.substring(baseHref.length);
- }
- return url;
- }
- function stripIndexHtml(url) {
- if (/\/index.html$/g.test(url)) {
- // '/index.html'.length == 11
- return url.substring(0, url.length - 11);
- }
- return url;
- }
- function stripTrailingSlash(url) {
- if (/\/$/g.test(url)) {
- url = url.substring(0, url.length - 1);
- }
- return url;
- }
- /***/ },
- /* 238 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var core_1 = __webpack_require__(2);
- /**
- * `LocationStrategy` is responsible for representing and reading route state
- * from the browser's URL. Angular provides two strategies:
- * {@link HashLocationStrategy} (default) and {@link PathLocationStrategy}.
- *
- * This is used under the hood of the {@link Location} service.
- *
- * Applications should use the {@link Router} or {@link Location} services to
- * interact with application route state.
- *
- * For instance, {@link HashLocationStrategy} produces URLs like
- * `http://example.com#/foo`, and {@link PathLocationStrategy} produces
- * `http://example.com/foo` as an equivalent URL.
- *
- * See these two classes for more.
- */
- var LocationStrategy = (function () {
- function LocationStrategy() {
- }
- return LocationStrategy;
- })();
- exports.LocationStrategy = LocationStrategy;
- /**
- * The `APP_BASE_HREF` token represents the base href to be used with the
- * {@link PathLocationStrategy}.
- *
- * If you're using {@link PathLocationStrategy}, you must provide a provider to a string
- * representing the URL prefix that should be preserved when generating and recognizing
- * URLs.
- *
- * ### Example
- *
- * ```
- * import {Component} from 'angular2/core';
- * import {ROUTER_DIRECTIVES, ROUTER_PROVIDERS, RouteConfig} from 'angular2/router';
- *
- * @Component({directives: [ROUTER_DIRECTIVES]})
- * @RouteConfig([
- * {...},
- * ])
- * class AppCmp {
- * // ...
- * }
- *
- * bootstrap(AppCmp, [
- * ROUTER_PROVIDERS,
- * PathLocationStrategy,
- * provide(APP_BASE_HREF, {useValue: '/my/app'})
- * ]);
- * ```
- */
- exports.APP_BASE_HREF = lang_1.CONST_EXPR(new core_1.OpaqueToken('appBaseHref'));
- function normalizeQueryParams(params) {
- return (params.length > 0 && params.substring(0, 1) != '?') ? ('?' + params) : params;
- }
- exports.normalizeQueryParams = normalizeQueryParams;
- function joinWithSlash(start, end) {
- if (start.length == 0) {
- return end;
- }
- if (end.length == 0) {
- return start;
- }
- var slashes = 0;
- if (start.endsWith('/')) {
- slashes++;
- }
- if (end.startsWith('/')) {
- slashes++;
- }
- if (slashes == 2) {
- return start + end.substring(1);
- }
- if (slashes == 1) {
- return start + end;
- }
- return start + '/' + end;
- }
- exports.joinWithSlash = joinWithSlash;
- /***/ },
- /* 239 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var lifecycle_annotations_impl_1 = __webpack_require__(240);
- var reflection_1 = __webpack_require__(16);
- function hasLifecycleHook(e, type) {
- if (!(type instanceof lang_1.Type))
- return false;
- return e.name in type.prototype;
- }
- exports.hasLifecycleHook = hasLifecycleHook;
- function getCanActivateHook(type) {
- var annotations = reflection_1.reflector.annotations(type);
- for (var i = 0; i < annotations.length; i += 1) {
- var annotation = annotations[i];
- if (annotation instanceof lifecycle_annotations_impl_1.CanActivate) {
- return annotation.fn;
- }
- }
- return null;
- }
- exports.getCanActivateHook = getCanActivateHook;
- /***/ },
- /* 240 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var lang_1 = __webpack_require__(5);
- var RouteLifecycleHook = (function () {
- function RouteLifecycleHook(name) {
- this.name = name;
- }
- RouteLifecycleHook = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [String])
- ], RouteLifecycleHook);
- return RouteLifecycleHook;
- })();
- exports.RouteLifecycleHook = RouteLifecycleHook;
- var CanActivate = (function () {
- function CanActivate(fn) {
- this.fn = fn;
- }
- CanActivate = __decorate([
- lang_1.CONST(),
- __metadata('design:paramtypes', [Function])
- ], CanActivate);
- return CanActivate;
- })();
- exports.CanActivate = CanActivate;
- exports.routerCanReuse = lang_1.CONST_EXPR(new RouteLifecycleHook("routerCanReuse"));
- exports.routerCanDeactivate = lang_1.CONST_EXPR(new RouteLifecycleHook("routerCanDeactivate"));
- exports.routerOnActivate = lang_1.CONST_EXPR(new RouteLifecycleHook("routerOnActivate"));
- exports.routerOnReuse = lang_1.CONST_EXPR(new RouteLifecycleHook("routerOnReuse"));
- exports.routerOnDeactivate = lang_1.CONST_EXPR(new RouteLifecycleHook("routerOnDeactivate"));
- /***/ },
- /* 241 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var __param = (this && this.__param) || function (paramIndex, decorator) {
- return function (target, key) { decorator(target, key, paramIndex); }
- };
- var async_1 = __webpack_require__(60);
- var collection_1 = __webpack_require__(12);
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var core_1 = __webpack_require__(2);
- var routerMod = __webpack_require__(225);
- var instruction_1 = __webpack_require__(229);
- var hookMod = __webpack_require__(242);
- var route_lifecycle_reflector_1 = __webpack_require__(239);
- var _resolveToTrue = async_1.PromiseWrapper.resolve(true);
- /**
- * A router outlet is a placeholder that Angular dynamically fills based on the application's route.
- *
- * ## Use
- *
- * ```
- * <router-outlet></router-outlet>
- * ```
- */
- var RouterOutlet = (function () {
- function RouterOutlet(_elementRef, _loader, _parentRouter, nameAttr) {
- this._elementRef = _elementRef;
- this._loader = _loader;
- this._parentRouter = _parentRouter;
- this.name = null;
- this._componentRef = null;
- this._currentInstruction = null;
- if (lang_1.isPresent(nameAttr)) {
- this.name = nameAttr;
- this._parentRouter.registerAuxOutlet(this);
- }
- else {
- this._parentRouter.registerPrimaryOutlet(this);
- }
- }
- /**
- * Called by the Router to instantiate a new component during the commit phase of a navigation.
- * This method in turn is responsible for calling the `routerOnActivate` hook of its child.
- */
- RouterOutlet.prototype.activate = function (nextInstruction) {
- var _this = this;
- var previousInstruction = this._currentInstruction;
- this._currentInstruction = nextInstruction;
- var componentType = nextInstruction.componentType;
- var childRouter = this._parentRouter.childRouter(componentType);
- var providers = core_1.Injector.resolve([
- core_1.provide(instruction_1.RouteData, { useValue: nextInstruction.routeData }),
- core_1.provide(instruction_1.RouteParams, { useValue: new instruction_1.RouteParams(nextInstruction.params) }),
- core_1.provide(routerMod.Router, { useValue: childRouter })
- ]);
- return this._loader.loadNextToLocation(componentType, this._elementRef, providers)
- .then(function (componentRef) {
- _this._componentRef = componentRef;
- if (route_lifecycle_reflector_1.hasLifecycleHook(hookMod.routerOnActivate, componentType)) {
- return _this._componentRef.instance
- .routerOnActivate(nextInstruction, previousInstruction);
- }
- });
- };
- /**
- * Called by the {@link Router} during the commit phase of a navigation when an outlet
- * reuses a component between different routes.
- * This method in turn is responsible for calling the `routerOnReuse` hook of its child.
- */
- RouterOutlet.prototype.reuse = function (nextInstruction) {
- var previousInstruction = this._currentInstruction;
- this._currentInstruction = nextInstruction;
- if (lang_1.isBlank(this._componentRef)) {
- throw new exceptions_1.BaseException("Cannot reuse an outlet that does not contain a component.");
- }
- return async_1.PromiseWrapper.resolve(route_lifecycle_reflector_1.hasLifecycleHook(hookMod.routerOnReuse, this._currentInstruction.componentType) ?
- this._componentRef.instance
- .routerOnReuse(nextInstruction, previousInstruction) :
- true);
- };
- /**
- * Called by the {@link Router} when an outlet disposes of a component's contents.
- * This method in turn is responsible for calling the `routerOnDeactivate` hook of its child.
- */
- RouterOutlet.prototype.deactivate = function (nextInstruction) {
- var _this = this;
- var next = _resolveToTrue;
- if (lang_1.isPresent(this._componentRef) && lang_1.isPresent(this._currentInstruction) &&
- route_lifecycle_reflector_1.hasLifecycleHook(hookMod.routerOnDeactivate, this._currentInstruction.componentType)) {
- next = async_1.PromiseWrapper.resolve(this._componentRef.instance
- .routerOnDeactivate(nextInstruction, this._currentInstruction));
- }
- return next.then(function (_) {
- if (lang_1.isPresent(_this._componentRef)) {
- _this._componentRef.dispose();
- _this._componentRef = null;
- }
- });
- };
- /**
- * Called by the {@link Router} during recognition phase of a navigation.
- *
- * If this resolves to `false`, the given navigation is cancelled.
- *
- * This method delegates to the child component's `routerCanDeactivate` hook if it exists,
- * and otherwise resolves to true.
- */
- RouterOutlet.prototype.routerCanDeactivate = function (nextInstruction) {
- if (lang_1.isBlank(this._currentInstruction)) {
- return _resolveToTrue;
- }
- if (route_lifecycle_reflector_1.hasLifecycleHook(hookMod.routerCanDeactivate, this._currentInstruction.componentType)) {
- return async_1.PromiseWrapper.resolve(this._componentRef.instance
- .routerCanDeactivate(nextInstruction, this._currentInstruction));
- }
- return _resolveToTrue;
- };
- /**
- * Called by the {@link Router} during recognition phase of a navigation.
- *
- * If the new child component has a different Type than the existing child component,
- * this will resolve to `false`. You can't reuse an old component when the new component
- * is of a different Type.
- *
- * Otherwise, this method delegates to the child component's `routerCanReuse` hook if it exists,
- * or resolves to true if the hook is not present.
- */
- RouterOutlet.prototype.routerCanReuse = function (nextInstruction) {
- var result;
- if (lang_1.isBlank(this._currentInstruction) ||
- this._currentInstruction.componentType != nextInstruction.componentType) {
- result = false;
- }
- else if (route_lifecycle_reflector_1.hasLifecycleHook(hookMod.routerCanReuse, this._currentInstruction.componentType)) {
- result = this._componentRef.instance
- .routerCanReuse(nextInstruction, this._currentInstruction);
- }
- else {
- result = nextInstruction == this._currentInstruction ||
- (lang_1.isPresent(nextInstruction.params) && lang_1.isPresent(this._currentInstruction.params) &&
- collection_1.StringMapWrapper.equals(nextInstruction.params, this._currentInstruction.params));
- }
- return async_1.PromiseWrapper.resolve(result);
- };
- RouterOutlet = __decorate([
- core_1.Directive({ selector: 'router-outlet' }),
- __param(3, core_1.Attribute('name')),
- __metadata('design:paramtypes', [core_1.ElementRef, core_1.DynamicComponentLoader, routerMod.Router, String])
- ], RouterOutlet);
- return RouterOutlet;
- })();
- exports.RouterOutlet = RouterOutlet;
- /***/ },
- /* 242 */
- /***/ function(module, exports, __webpack_require__) {
- /**
- * This indirection is needed to free up Component, etc symbols in the public API
- * to be used by the decorator versions of these annotations.
- */
- var decorators_1 = __webpack_require__(9);
- var lifecycle_annotations_impl_1 = __webpack_require__(240);
- var lifecycle_annotations_impl_2 = __webpack_require__(240);
- exports.routerCanReuse = lifecycle_annotations_impl_2.routerCanReuse;
- exports.routerCanDeactivate = lifecycle_annotations_impl_2.routerCanDeactivate;
- exports.routerOnActivate = lifecycle_annotations_impl_2.routerOnActivate;
- exports.routerOnReuse = lifecycle_annotations_impl_2.routerOnReuse;
- exports.routerOnDeactivate = lifecycle_annotations_impl_2.routerOnDeactivate;
- /**
- * Defines route lifecycle hook `CanActivate`, which is called by the router to determine
- * if a component can be instantiated as part of a navigation.
- *
- * <aside class="is-right">
- * Note that unlike other lifecycle hooks, this one uses an annotation rather than an interface.
- * This is because the `CanActivate` function is called before the component is instantiated.
- * </aside>
- *
- * The `CanActivate` hook is called with two {@link ComponentInstruction}s as parameters, the first
- * representing the current route being navigated to, and the second parameter representing the
- * previous route or `null`.
- *
- * ```typescript
- * @CanActivate((next, prev) => boolean | Promise<boolean>)
- * ```
- *
- * If `CanActivate` returns or resolves to `false`, the navigation is cancelled.
- * If `CanActivate` throws or rejects, the navigation is also cancelled.
- * If `CanActivate` returns or resolves to `true`, navigation continues, the component is
- * instantiated, and the {@link OnActivate} hook of that component is called if implemented.
- *
- * ### Example
- *
- * {@example router/ts/can_activate/can_activate_example.ts region='canActivate' }
- */
- exports.CanActivate = decorators_1.makeDecorator(lifecycle_annotations_impl_1.CanActivate);
- /***/ },
- /* 243 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var core_1 = __webpack_require__(2);
- var lang_1 = __webpack_require__(5);
- var router_1 = __webpack_require__(225);
- var location_1 = __webpack_require__(237);
- /**
- * The RouterLink directive lets you link to specific parts of your app.
- *
- * Consider the following route configuration:
-
- * ```
- * @RouteConfig([
- * { path: '/user', component: UserCmp, as: 'User' }
- * ]);
- * class MyComp {}
- * ```
- *
- * When linking to this `User` route, you can write:
- *
- * ```
- * <a [routerLink]="['./User']">link to user component</a>
- * ```
- *
- * RouterLink expects the value to be an array of route names, followed by the params
- * for that level of routing. For instance `['/Team', {teamId: 1}, 'User', {userId: 2}]`
- * means that we want to generate a link for the `Team` route with params `{teamId: 1}`,
- * and with a child route `User` with params `{userId: 2}`.
- *
- * The first route name should be prepended with `/`, `./`, or `../`.
- * If the route begins with `/`, the router will look up the route from the root of the app.
- * If the route begins with `./`, the router will instead look in the current component's
- * children for the route. And if the route begins with `../`, the router will look at the
- * current component's parent.
- */
- var RouterLink = (function () {
- function RouterLink(_router, _location) {
- this._router = _router;
- this._location = _location;
- }
- Object.defineProperty(RouterLink.prototype, "isRouteActive", {
- get: function () { return this._router.isRouteActive(this._navigationInstruction); },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(RouterLink.prototype, "routeParams", {
- set: function (changes) {
- this._routeParams = changes;
- this._navigationInstruction = this._router.generate(this._routeParams);
- var navigationHref = this._navigationInstruction.toLinkUrl();
- this.visibleHref = this._location.prepareExternalUrl(navigationHref);
- },
- enumerable: true,
- configurable: true
- });
- RouterLink.prototype.onClick = function () {
- // If no target, or if target is _self, prevent default browser behavior
- if (!lang_1.isString(this.target) || this.target == '_self') {
- this._router.navigateByInstruction(this._navigationInstruction);
- return false;
- }
- return true;
- };
- RouterLink = __decorate([
- core_1.Directive({
- selector: '[routerLink]',
- inputs: ['routeParams: routerLink', 'target: target'],
- host: {
- '(click)': 'onClick()',
- '[attr.href]': 'visibleHref',
- '[class.router-link-active]': 'isRouteActive'
- }
- }),
- __metadata('design:paramtypes', [router_1.Router, location_1.Location])
- ], RouterLink);
- return RouterLink;
- })();
- exports.RouterLink = RouterLink;
- /***/ },
- /* 244 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var dom_adapter_1 = __webpack_require__(178);
- var core_1 = __webpack_require__(2);
- /**
- * `PlatformLocation` encapsulates all of the direct calls to platform APIs.
- * This class should not be used directly by an application developer. Instead, use
- * {@link Location}.
- */
- var PlatformLocation = (function () {
- function PlatformLocation() {
- this._init();
- }
- // This is moved to its own method so that `MockPlatformLocationStrategy` can overwrite it
- /** @internal */
- PlatformLocation.prototype._init = function () {
- this._location = dom_adapter_1.DOM.getLocation();
- this._history = dom_adapter_1.DOM.getHistory();
- };
- PlatformLocation.prototype.getBaseHrefFromDOM = function () { return dom_adapter_1.DOM.getBaseHref(); };
- PlatformLocation.prototype.onPopState = function (fn) {
- dom_adapter_1.DOM.getGlobalEventTarget('window').addEventListener('popstate', fn, false);
- };
- PlatformLocation.prototype.onHashChange = function (fn) {
- dom_adapter_1.DOM.getGlobalEventTarget('window').addEventListener('hashchange', fn, false);
- };
- Object.defineProperty(PlatformLocation.prototype, "pathname", {
- get: function () { return this._location.pathname; },
- set: function (newPath) { this._location.pathname = newPath; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(PlatformLocation.prototype, "search", {
- get: function () { return this._location.search; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(PlatformLocation.prototype, "hash", {
- get: function () { return this._location.hash; },
- enumerable: true,
- configurable: true
- });
- PlatformLocation.prototype.pushState = function (state, title, url) {
- this._history.pushState(state, title, url);
- };
- PlatformLocation.prototype.replaceState = function (state, title, url) {
- this._history.replaceState(state, title, url);
- };
- PlatformLocation.prototype.forward = function () { this._history.forward(); };
- PlatformLocation.prototype.back = function () { this._history.back(); };
- PlatformLocation = __decorate([
- core_1.Injectable(),
- __metadata('design:paramtypes', [])
- ], PlatformLocation);
- return PlatformLocation;
- })();
- exports.PlatformLocation = PlatformLocation;
- /***/ },
- /* 245 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var __param = (this && this.__param) || function (paramIndex, decorator) {
- return function (target, key) { decorator(target, key, paramIndex); }
- };
- var core_1 = __webpack_require__(2);
- var location_strategy_1 = __webpack_require__(238);
- var lang_1 = __webpack_require__(5);
- var platform_location_1 = __webpack_require__(244);
- /**
- * `HashLocationStrategy` is a {@link LocationStrategy} used to configure the
- * {@link Location} service to represent its state in the
- * [hash fragment](https://en.wikipedia.org/wiki/Uniform_Resource_Locator#Syntax)
- * of the browser's URL.
- *
- * For instance, if you call `location.go('/foo')`, the browser's URL will become
- * `example.com#/foo`.
- *
- * ### Example
- *
- * ```
- * import {Component, provide} from 'angular2/core';
- * import {
- * ROUTER_DIRECTIVES,
- * ROUTER_PROVIDERS,
- * RouteConfig,
- * Location,
- * LocationStrategy,
- * HashLocationStrategy
- * } from 'angular2/router';
- *
- * @Component({directives: [ROUTER_DIRECTIVES]})
- * @RouteConfig([
- * {...},
- * ])
- * class AppCmp {
- * constructor(location: Location) {
- * location.go('/foo');
- * }
- * }
- *
- * bootstrap(AppCmp, [
- * ROUTER_PROVIDERS,
- * provide(LocationStrategy, {useClass: HashLocationStrategy})
- * ]);
- * ```
- */
- var HashLocationStrategy = (function (_super) {
- __extends(HashLocationStrategy, _super);
- function HashLocationStrategy(_platformLocation, _baseHref) {
- _super.call(this);
- this._platformLocation = _platformLocation;
- this._baseHref = '';
- if (lang_1.isPresent(_baseHref)) {
- this._baseHref = _baseHref;
- }
- }
- HashLocationStrategy.prototype.onPopState = function (fn) {
- this._platformLocation.onPopState(fn);
- this._platformLocation.onHashChange(fn);
- };
- HashLocationStrategy.prototype.getBaseHref = function () { return this._baseHref; };
- HashLocationStrategy.prototype.path = function () {
- // the hash value is always prefixed with a `#`
- // and if it is empty then it will stay empty
- var path = this._platformLocation.hash;
- // Dart will complain if a call to substring is
- // executed with a position value that extends the
- // length of string.
- return (path.length > 0 ? path.substring(1) : path) +
- location_strategy_1.normalizeQueryParams(this._platformLocation.search);
- };
- HashLocationStrategy.prototype.prepareExternalUrl = function (internal) {
- var url = location_strategy_1.joinWithSlash(this._baseHref, internal);
- return url.length > 0 ? ('#' + url) : url;
- };
- HashLocationStrategy.prototype.pushState = function (state, title, path, queryParams) {
- var url = this.prepareExternalUrl(path + location_strategy_1.normalizeQueryParams(queryParams));
- if (url.length == 0) {
- url = this._platformLocation.pathname;
- }
- this._platformLocation.pushState(state, title, url);
- };
- HashLocationStrategy.prototype.replaceState = function (state, title, path, queryParams) {
- var url = this.prepareExternalUrl(path + location_strategy_1.normalizeQueryParams(queryParams));
- if (url.length == 0) {
- url = this._platformLocation.pathname;
- }
- this._platformLocation.replaceState(state, title, url);
- };
- HashLocationStrategy.prototype.forward = function () { this._platformLocation.forward(); };
- HashLocationStrategy.prototype.back = function () { this._platformLocation.back(); };
- HashLocationStrategy = __decorate([
- core_1.Injectable(),
- __param(1, core_1.Optional()),
- __param(1, core_1.Inject(location_strategy_1.APP_BASE_HREF)),
- __metadata('design:paramtypes', [platform_location_1.PlatformLocation, String])
- ], HashLocationStrategy);
- return HashLocationStrategy;
- })(location_strategy_1.LocationStrategy);
- exports.HashLocationStrategy = HashLocationStrategy;
- /***/ },
- /* 246 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var __param = (this && this.__param) || function (paramIndex, decorator) {
- return function (target, key) { decorator(target, key, paramIndex); }
- };
- var core_1 = __webpack_require__(2);
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var location_strategy_1 = __webpack_require__(238);
- var platform_location_1 = __webpack_require__(244);
- /**
- * `PathLocationStrategy` is a {@link LocationStrategy} used to configure the
- * {@link Location} service to represent its state in the
- * [path](https://en.wikipedia.org/wiki/Uniform_Resource_Locator#Syntax) of the
- * browser's URL.
- *
- * `PathLocationStrategy` is the default binding for {@link LocationStrategy}
- * provided in {@link ROUTER_PROVIDERS}.
- *
- * If you're using `PathLocationStrategy`, you must provide a provider for
- * {@link APP_BASE_HREF} to a string representing the URL prefix that should
- * be preserved when generating and recognizing URLs.
- *
- * For instance, if you provide an `APP_BASE_HREF` of `'/my/app'` and call
- * `location.go('/foo')`, the browser's URL will become
- * `example.com/my/app/foo`.
- *
- * ### Example
- *
- * ```
- * import {Component, provide} from 'angular2/core';
- * import {
- * APP_BASE_HREF
- * ROUTER_DIRECTIVES,
- * ROUTER_PROVIDERS,
- * RouteConfig,
- * Location
- * } from 'angular2/router';
- *
- * @Component({directives: [ROUTER_DIRECTIVES]})
- * @RouteConfig([
- * {...},
- * ])
- * class AppCmp {
- * constructor(location: Location) {
- * location.go('/foo');
- * }
- * }
- *
- * bootstrap(AppCmp, [
- * ROUTER_PROVIDERS, // includes binding to PathLocationStrategy
- * provide(APP_BASE_HREF, {useValue: '/my/app'})
- * ]);
- * ```
- */
- var PathLocationStrategy = (function (_super) {
- __extends(PathLocationStrategy, _super);
- function PathLocationStrategy(_platformLocation, href) {
- _super.call(this);
- this._platformLocation = _platformLocation;
- if (lang_1.isBlank(href)) {
- href = this._platformLocation.getBaseHrefFromDOM();
- }
- if (lang_1.isBlank(href)) {
- throw new exceptions_1.BaseException("No base href set. Please provide a value for the APP_BASE_HREF token or add a base element to the document.");
- }
- this._baseHref = href;
- }
- PathLocationStrategy.prototype.onPopState = function (fn) {
- this._platformLocation.onPopState(fn);
- this._platformLocation.onHashChange(fn);
- };
- PathLocationStrategy.prototype.getBaseHref = function () { return this._baseHref; };
- PathLocationStrategy.prototype.prepareExternalUrl = function (internal) { return location_strategy_1.joinWithSlash(this._baseHref, internal); };
- PathLocationStrategy.prototype.path = function () {
- return this._platformLocation.pathname + location_strategy_1.normalizeQueryParams(this._platformLocation.search);
- };
- PathLocationStrategy.prototype.pushState = function (state, title, url, queryParams) {
- var externalUrl = this.prepareExternalUrl(url + location_strategy_1.normalizeQueryParams(queryParams));
- this._platformLocation.pushState(state, title, externalUrl);
- };
- PathLocationStrategy.prototype.replaceState = function (state, title, url, queryParams) {
- var externalUrl = this.prepareExternalUrl(url + location_strategy_1.normalizeQueryParams(queryParams));
- this._platformLocation.replaceState(state, title, externalUrl);
- };
- PathLocationStrategy.prototype.forward = function () { this._platformLocation.forward(); };
- PathLocationStrategy.prototype.back = function () { this._platformLocation.back(); };
- PathLocationStrategy = __decorate([
- core_1.Injectable(),
- __param(1, core_1.Optional()),
- __param(1, core_1.Inject(location_strategy_1.APP_BASE_HREF)),
- __metadata('design:paramtypes', [platform_location_1.PlatformLocation, String])
- ], PathLocationStrategy);
- return PathLocationStrategy;
- })(location_strategy_1.LocationStrategy);
- exports.PathLocationStrategy = PathLocationStrategy;
- /***/ },
- /* 247 */
- /***/ function(module, exports) {
- /***/ },
- /* 248 */
- /***/ function(module, exports, __webpack_require__) {
- var compiler_1 = __webpack_require__(147);
- var core_1 = __webpack_require__(2);
- var router_link_transform_1 = __webpack_require__(249);
- var lang_1 = __webpack_require__(5);
- var router_link_transform_2 = __webpack_require__(249);
- exports.RouterLinkTransform = router_link_transform_2.RouterLinkTransform;
- /**
- * Enables the router link DSL.
- *
- * Warning. This feature is experimental and can change.
- *
- * To enable the transformer pass the router link DSL provider to `bootstrap`.
- *
- * ## Example:
- * ```
- * import {bootstrap} from 'angular2/platform/browser';
- * import {ROUTER_LINK_DSL_PROVIDER} from 'angular2/router/router_link_dsl';
- *
- * bootstrap(CustomApp, [ROUTER_LINK_DSL_PROVIDER]);
- * ```
- *
- * The DSL allows you to express router links as follows:
- * ```
- * <a [routerLink]="route:User"> <!-- Same as <a [routerLink]="['User']"> -->
- * <a [routerLink]="route:/User"> <!-- Same as <a [routerLink]="['User']"> -->
- * <a [routerLink]="route:./User"> <!-- Same as <a [routerLink]="['./User']"> -->
- * <a [routerLink]="./User(id: value, name: 'Bob')"> <!-- Same as <a [routerLink]="['./User', {id:
- * value, name: 'Bob'}]"> -->
- * <a [routerLink]="/User/Modal"> <!-- Same as <a [routerLink]="['/User', 'Modal']"> -->
- * <a [routerLink]="User[Modal]"> <!-- Same as <a [routerLink]="['User', ['Modal']]"> -->
- * ```
- */
- exports.ROUTER_LINK_DSL_PROVIDER = lang_1.CONST_EXPR(new core_1.Provider(compiler_1.TEMPLATE_TRANSFORMS, { useClass: router_link_transform_1.RouterLinkTransform, multi: true }));
- /***/ },
- /* 249 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var compiler_1 = __webpack_require__(147);
- var ast_1 = __webpack_require__(30);
- var exceptions_1 = __webpack_require__(14);
- var core_1 = __webpack_require__(2);
- var parser_1 = __webpack_require__(32);
- /**
- * e.g., './User', 'Modal' in ./User[Modal(param: value)]
- */
- var FixedPart = (function () {
- function FixedPart(value) {
- this.value = value;
- }
- return FixedPart;
- })();
- /**
- * The square bracket
- */
- var AuxiliaryStart = (function () {
- function AuxiliaryStart() {
- }
- return AuxiliaryStart;
- })();
- /**
- * The square bracket
- */
- var AuxiliaryEnd = (function () {
- function AuxiliaryEnd() {
- }
- return AuxiliaryEnd;
- })();
- /**
- * e.g., param:value in ./User[Modal(param: value)]
- */
- var Params = (function () {
- function Params(ast) {
- this.ast = ast;
- }
- return Params;
- })();
- var RouterLinkLexer = (function () {
- function RouterLinkLexer(parser, exp) {
- this.parser = parser;
- this.exp = exp;
- this.index = 0;
- }
- RouterLinkLexer.prototype.tokenize = function () {
- var tokens = [];
- while (this.index < this.exp.length) {
- tokens.push(this._parseToken());
- }
- return tokens;
- };
- RouterLinkLexer.prototype._parseToken = function () {
- var c = this.exp[this.index];
- if (c == '[') {
- this.index++;
- return new AuxiliaryStart();
- }
- else if (c == ']') {
- this.index++;
- return new AuxiliaryEnd();
- }
- else if (c == '(') {
- return this._parseParams();
- }
- else if (c == '/' && this.index !== 0) {
- this.index++;
- return this._parseFixedPart();
- }
- else {
- return this._parseFixedPart();
- }
- };
- RouterLinkLexer.prototype._parseParams = function () {
- var start = this.index;
- for (; this.index < this.exp.length; ++this.index) {
- var c = this.exp[this.index];
- if (c == ')') {
- var paramsContent = this.exp.substring(start + 1, this.index);
- this.index++;
- return new Params(this.parser.parseBinding("{" + paramsContent + "}", null).ast);
- }
- }
- throw new exceptions_1.BaseException("Cannot find ')'");
- };
- RouterLinkLexer.prototype._parseFixedPart = function () {
- var start = this.index;
- var sawNonSlash = false;
- for (; this.index < this.exp.length; ++this.index) {
- var c = this.exp[this.index];
- if (c == '(' || c == '[' || c == ']' || (c == '/' && sawNonSlash)) {
- break;
- }
- if (c != '.' && c != '/') {
- sawNonSlash = true;
- }
- }
- var fixed = this.exp.substring(start, this.index);
- if (start === this.index || !sawNonSlash || fixed.startsWith('//')) {
- throw new exceptions_1.BaseException("Invalid router link");
- }
- return new FixedPart(fixed);
- };
- return RouterLinkLexer;
- })();
- var RouterLinkAstGenerator = (function () {
- function RouterLinkAstGenerator(tokens) {
- this.tokens = tokens;
- this.index = 0;
- }
- RouterLinkAstGenerator.prototype.generate = function () { return this._genAuxiliary(); };
- RouterLinkAstGenerator.prototype._genAuxiliary = function () {
- var arr = [];
- for (; this.index < this.tokens.length; this.index++) {
- var r = this.tokens[this.index];
- if (r instanceof FixedPart) {
- arr.push(new ast_1.LiteralPrimitive(r.value));
- }
- else if (r instanceof Params) {
- arr.push(r.ast);
- }
- else if (r instanceof AuxiliaryEnd) {
- break;
- }
- else if (r instanceof AuxiliaryStart) {
- this.index++;
- arr.push(this._genAuxiliary());
- }
- }
- return new ast_1.LiteralArray(arr);
- };
- return RouterLinkAstGenerator;
- })();
- var RouterLinkAstTransformer = (function (_super) {
- __extends(RouterLinkAstTransformer, _super);
- function RouterLinkAstTransformer(parser) {
- _super.call(this);
- this.parser = parser;
- }
- RouterLinkAstTransformer.prototype.visitQuote = function (ast) {
- if (ast.prefix == "route") {
- return parseRouterLinkExpression(this.parser, ast.uninterpretedExpression);
- }
- else {
- return _super.prototype.visitQuote.call(this, ast);
- }
- };
- return RouterLinkAstTransformer;
- })(ast_1.AstTransformer);
- function parseRouterLinkExpression(parser, exp) {
- var tokens = new RouterLinkLexer(parser, exp.trim()).tokenize();
- return new RouterLinkAstGenerator(tokens).generate();
- }
- exports.parseRouterLinkExpression = parseRouterLinkExpression;
- /**
- * A compiler plugin that implements the router link DSL.
- */
- var RouterLinkTransform = (function () {
- function RouterLinkTransform(parser) {
- this.astTransformer = new RouterLinkAstTransformer(parser);
- }
- RouterLinkTransform.prototype.visitNgContent = function (ast, context) { return ast; };
- RouterLinkTransform.prototype.visitEmbeddedTemplate = function (ast, context) { return ast; };
- RouterLinkTransform.prototype.visitElement = function (ast, context) {
- var _this = this;
- var updatedChildren = ast.children.map(function (c) { return c.visit(_this, context); });
- var updatedInputs = ast.inputs.map(function (c) { return c.visit(_this, context); });
- var updatedDirectives = ast.directives.map(function (c) { return c.visit(_this, context); });
- return new compiler_1.ElementAst(ast.name, ast.attrs, updatedInputs, ast.outputs, ast.exportAsVars, updatedDirectives, updatedChildren, ast.ngContentIndex, ast.sourceSpan);
- };
- RouterLinkTransform.prototype.visitVariable = function (ast, context) { return ast; };
- RouterLinkTransform.prototype.visitEvent = function (ast, context) { return ast; };
- RouterLinkTransform.prototype.visitElementProperty = function (ast, context) { return ast; };
- RouterLinkTransform.prototype.visitAttr = function (ast, context) { return ast; };
- RouterLinkTransform.prototype.visitBoundText = function (ast, context) { return ast; };
- RouterLinkTransform.prototype.visitText = function (ast, context) { return ast; };
- RouterLinkTransform.prototype.visitDirective = function (ast, context) {
- var _this = this;
- var updatedInputs = ast.inputs.map(function (c) { return c.visit(_this, context); });
- return new compiler_1.DirectiveAst(ast.directive, updatedInputs, ast.hostProperties, ast.hostEvents, ast.exportAsVars, ast.sourceSpan);
- };
- RouterLinkTransform.prototype.visitDirectiveProperty = function (ast, context) {
- var transformedValue = ast.value.visit(this.astTransformer);
- return new compiler_1.BoundDirectivePropertyAst(ast.directiveName, ast.templateName, transformedValue, ast.sourceSpan);
- };
- RouterLinkTransform = __decorate([
- core_1.Injectable(),
- __metadata('design:paramtypes', [parser_1.Parser])
- ], RouterLinkTransform);
- return RouterLinkTransform;
- })();
- exports.RouterLinkTransform = RouterLinkTransform;
- /***/ },
- /* 250 */
- /***/ function(module, exports, __webpack_require__) {
- var profile_1 = __webpack_require__(45);
- exports.wtfCreateScope = profile_1.wtfCreateScope;
- exports.wtfLeave = profile_1.wtfLeave;
- exports.wtfStartTimeRange = profile_1.wtfStartTimeRange;
- exports.wtfEndTimeRange = profile_1.wtfEndTimeRange;
- /***/ },
- /* 251 */
- /***/ function(module, exports, __webpack_require__) {
- /**
- * @module
- * @description
- * Adapter allowing AngularJS v1 and Angular v2 to run side by side in the same application.
- */
- var upgrade_adapter_1 = __webpack_require__(252);
- exports.UpgradeAdapter = upgrade_adapter_1.UpgradeAdapter;
- exports.UpgradeAdapterRef = upgrade_adapter_1.UpgradeAdapterRef;
- /***/ },
- /* 252 */
- /***/ function(module, exports, __webpack_require__) {
- var core_1 = __webpack_require__(2);
- var async_1 = __webpack_require__(60);
- var browser_1 = __webpack_require__(179);
- var metadata_1 = __webpack_require__(253);
- var util_1 = __webpack_require__(254);
- var constants_1 = __webpack_require__(255);
- var downgrade_ng2_adapter_1 = __webpack_require__(256);
- var upgrade_ng1_adapter_1 = __webpack_require__(257);
- var angular = __webpack_require__(258);
- var upgradeCount = 0;
- /**
- * Use `UpgradeAdapter` to allow AngularJS v1 and Angular v2 to coexist in a single application.
- *
- * The `UpgradeAdapter` allows:
- * 1. creation of Angular v2 component from AngularJS v1 component directive
- * (See [UpgradeAdapter#upgradeNg1Component()])
- * 2. creation of AngularJS v1 directive from Angular v2 component.
- * (See [UpgradeAdapter#downgradeNg2Component()])
- * 3. Bootstrapping of a hybrid Angular application which contains both of the frameworks
- * coexisting in a single application.
- *
- * ## Mental Model
- *
- * When reasoning about how a hybrid application works it is useful to have a mental model which
- * describes what is happening and explains what is happening at the lowest level.
- *
- * 1. There are two independent frameworks running in a single application, each framework treats
- * the other as a black box.
- * 2. Each DOM element on the page is owned exactly by one framework. Whichever framework
- * instantiated the element is the owner. Each framework only updates/interacts with its own
- * DOM elements and ignores others.
- * 3. AngularJS v1 directives always execute inside AngularJS v1 framework codebase regardless of
- * where they are instantiated.
- * 4. Angular v2 components always execute inside Angular v2 framework codebase regardless of
- * where they are instantiated.
- * 5. An AngularJS v1 component can be upgraded to an Angular v2 component. This creates an
- * Angular v2 directive, which bootstraps the AngularJS v1 component directive in that location.
- * 6. An Angular v2 component can be downgraded to an AngularJS v1 component directive. This creates
- * an AngularJS v1 directive, which bootstraps the Angular v2 component in that location.
- * 7. Whenever an adapter component is instantiated the host element is owned by the framework
- * doing the instantiation. The other framework then instantiates and owns the view for that
- * component. This implies that component bindings will always follow the semantics of the
- * instantiation framework. The syntax is always that of Angular v2 syntax.
- * 8. AngularJS v1 is always bootstrapped first and owns the bottom most view.
- * 9. The new application is running in Angular v2 zone, and therefore it no longer needs calls to
- * `$apply()`.
- *
- * ### Example
- *
- * ```
- * var adapter = new UpgradeAdapter();
- * var module = angular.module('myExample', []);
- * module.directive('ng2', adapter.downgradeNg2Component(Ng2));
- *
- * module.directive('ng1', function() {
- * return {
- * scope: { title: '=' },
- * template: 'ng1[Hello {{title}}!](<span ng-transclude></span>)'
- * };
- * });
- *
- *
- * @Component({
- * selector: 'ng2',
- * inputs: ['name'],
- * template: 'ng2[<ng1 [title]="name">transclude</ng1>](<ng-content></ng-content>)',
- * directives: [adapter.upgradeNg1Component('ng1')]
- * })
- * class Ng2 {
- * }
- *
- * document.body.innerHTML = '<ng2 name="World">project</ng2>';
- *
- * adapter.bootstrap(document.body, ['myExample']).ready(function() {
- * expect(document.body.textContent).toEqual(
- * "ng2[ng1[Hello World!](transclude)](project)");
- * });
- * ```
- */
- var UpgradeAdapter = (function () {
- function UpgradeAdapter() {
- /* @internal */
- this.idPrefix = "NG2_UPGRADE_" + upgradeCount++ + "_";
- /* @internal */
- this.upgradedComponents = [];
- /* @internal */
- this.downgradedComponents = {};
- /* @internal */
- this.providers = [];
- }
- /**
- * Allows Angular v2 Component to be used from AngularJS v1.
- *
- * Use `downgradeNg2Component` to create an AngularJS v1 Directive Definition Factory from
- * Angular v2 Component. The adapter will bootstrap Angular v2 component from within the
- * AngularJS v1 template.
- *
- * ## Mental Model
- *
- * 1. The component is instantiated by being listed in AngularJS v1 template. This means that the
- * host element is controlled by AngularJS v1, but the component's view will be controlled by
- * Angular v2.
- * 2. Even thought the component is instantiated in AngularJS v1, it will be using Angular v2
- * syntax. This has to be done, this way because we must follow Angular v2 components do not
- * declare how the attributes should be interpreted.
- *
- * ## Supported Features
- *
- * - Bindings:
- * - Attribute: `<comp name="World">`
- * - Interpolation: `<comp greeting="Hello {{name}}!">`
- * - Expression: `<comp [name]="username">`
- * - Event: `<comp (close)="doSomething()">`
- * - Content projection: yes
- *
- * ### Example
- *
- * ```
- * var adapter = new UpgradeAdapter();
- * var module = angular.module('myExample', []);
- * module.directive('greet', adapter.downgradeNg2Component(Greeter));
- *
- * @Component({
- * selector: 'greet',
- * template: '{{salutation}} {{name}}! - <ng-content></ng-content>'
- * })
- * class Greeter {
- * @Input() salutation: string;
- * @Input() name: string;
- * }
- *
- * document.body.innerHTML =
- * 'ng1 template: <greet salutation="Hello" [name]="world">text</greet>';
- *
- * adapter.bootstrap(document.body, ['myExample']).ready(function() {
- * expect(document.body.textContent).toEqual("ng1 template: Hello world! - text");
- * });
- * ```
- */
- UpgradeAdapter.prototype.downgradeNg2Component = function (type) {
- this.upgradedComponents.push(type);
- var info = metadata_1.getComponentInfo(type);
- return ng1ComponentDirective(info, "" + this.idPrefix + info.selector + "_c");
- };
- /**
- * Allows AngularJS v1 Component to be used from Angular v2.
- *
- * Use `upgradeNg1Component` to create an Angular v2 component from AngularJS v1 Component
- * directive. The adapter will bootstrap AngularJS v1 component from within the Angular v2
- * template.
- *
- * ## Mental Model
- *
- * 1. The component is instantiated by being listed in Angular v2 template. This means that the
- * host element is controlled by Angular v2, but the component's view will be controlled by
- * AngularJS v1.
- *
- * ## Supported Features
- *
- * - Bindings:
- * - Attribute: `<comp name="World">`
- * - Interpolation: `<comp greeting="Hello {{name}}!">`
- * - Expression: `<comp [name]="username">`
- * - Event: `<comp (close)="doSomething()">`
- * - Transclusion: yes
- * - Only some of the features of
- * [Directive Definition Object](https://docs.angularjs.org/api/ng/service/$compile) are
- * supported:
- * - `compile`: not supported because the host element is owned by Angular v2, which does
- * not allow modifying DOM structure during compilation.
- * - `controller`: supported. (NOTE: injection of `$attrs` and `$transclude` is not supported.)
- * - `controllerAs': supported.
- * - `bindToController': supported.
- * - `link': supported. (NOTE: only pre-link function is supported.)
- * - `name': supported.
- * - `priority': ignored.
- * - `replace': not supported.
- * - `require`: supported.
- * - `restrict`: must be set to 'E'.
- * - `scope`: supported.
- * - `template`: supported.
- * - `templateUrl`: supported.
- * - `terminal`: ignored.
- * - `transclude`: supported.
- *
- *
- * ### Example
- *
- * ```
- * var adapter = new UpgradeAdapter();
- * var module = angular.module('myExample', []);
- *
- * module.directive('greet', function() {
- * return {
- * scope: {salutation: '=', name: '=' },
- * template: '{{salutation}} {{name}}! - <span ng-transclude></span>'
- * };
- * });
- *
- * module.directive('ng2', adapter.downgradeNg2Component(Ng2));
- *
- * @Component({
- * selector: 'ng2',
- * template: 'ng2 template: <greet salutation="Hello" [name]="world">text</greet>'
- * directives: [adapter.upgradeNg1Component('greet')]
- * })
- * class Ng2 {
- * }
- *
- * document.body.innerHTML = '<ng2></ng2>';
- *
- * adapter.bootstrap(document.body, ['myExample']).ready(function() {
- * expect(document.body.textContent).toEqual("ng2 template: Hello world! - text");
- * });
- * ```
- */
- UpgradeAdapter.prototype.upgradeNg1Component = function (name) {
- if (this.downgradedComponents.hasOwnProperty(name)) {
- return this.downgradedComponents[name].type;
- }
- else {
- return (this.downgradedComponents[name] = new upgrade_ng1_adapter_1.UpgradeNg1ComponentAdapterBuilder(name)).type;
- }
- };
- /**
- * Bootstrap a hybrid AngularJS v1 / Angular v2 application.
- *
- * This `bootstrap` method is a direct replacement (takes same arguments) for AngularJS v1
- * [`bootstrap`](https://docs.angularjs.org/api/ng/function/angular.bootstrap) method. Unlike
- * AngularJS v1, this bootstrap is asynchronous.
- *
- * ### Example
- *
- * ```
- * var adapter = new UpgradeAdapter();
- * var module = angular.module('myExample', []);
- * module.directive('ng2', adapter.downgradeNg2Component(Ng2));
- *
- * module.directive('ng1', function() {
- * return {
- * scope: { title: '=' },
- * template: 'ng1[Hello {{title}}!](<span ng-transclude></span>)'
- * };
- * });
- *
- *
- * @Component({
- * selector: 'ng2',
- * inputs: ['name'],
- * template: 'ng2[<ng1 [title]="name">transclude</ng1>](<ng-content></ng-content>)',
- * directives: [adapter.upgradeNg1Component('ng1')]
- * })
- * class Ng2 {
- * }
- *
- * document.body.innerHTML = '<ng2 name="World">project</ng2>';
- *
- * adapter.bootstrap(document.body, ['myExample']).ready(function() {
- * expect(document.body.textContent).toEqual(
- * "ng2[ng1[Hello World!](transclude)](project)");
- * });
- * ```
- */
- UpgradeAdapter.prototype.bootstrap = function (element, modules, config) {
- var _this = this;
- var upgrade = new UpgradeAdapterRef();
- var ng1Injector = null;
- var platformRef = core_1.platform(browser_1.BROWSER_PROVIDERS);
- var applicationRef = platformRef.application([
- browser_1.BROWSER_APP_PROVIDERS,
- core_1.provide(constants_1.NG1_INJECTOR, { useFactory: function () { return ng1Injector; } }),
- core_1.provide(constants_1.NG1_COMPILE, { useFactory: function () { return ng1Injector.get(constants_1.NG1_COMPILE); } }),
- this.providers
- ]);
- var injector = applicationRef.injector;
- var ngZone = injector.get(core_1.NgZone);
- var compiler = injector.get(core_1.Compiler);
- var delayApplyExps = [];
- var original$applyFn;
- var rootScopePrototype;
- var rootScope;
- var protoViewRefMap = {};
- var ng1Module = angular.module(this.idPrefix, modules);
- var ng1compilePromise = null;
- ng1Module.value(constants_1.NG2_INJECTOR, injector)
- .value(constants_1.NG2_ZONE, ngZone)
- .value(constants_1.NG2_COMPILER, compiler)
- .value(constants_1.NG2_PROTO_VIEW_REF_MAP, protoViewRefMap)
- .value(constants_1.NG2_APP_VIEW_MANAGER, injector.get(core_1.AppViewManager))
- .config([
- '$provide',
- function (provide) {
- provide.decorator(constants_1.NG1_ROOT_SCOPE, [
- '$delegate',
- function (rootScopeDelegate) {
- rootScopePrototype = rootScopeDelegate.constructor.prototype;
- if (rootScopePrototype.hasOwnProperty('$apply')) {
- original$applyFn = rootScopePrototype.$apply;
- rootScopePrototype.$apply = function (exp) { return delayApplyExps.push(exp); };
- }
- else {
- throw new Error("Failed to find '$apply' on '$rootScope'!");
- }
- return rootScope = rootScopeDelegate;
- }
- ]);
- }
- ])
- .run([
- '$injector',
- '$rootScope',
- function (injector, rootScope) {
- ng1Injector = injector;
- async_1.ObservableWrapper.subscribe(ngZone.onTurnDone, function (_) { ngZone.run(function () { return rootScope.$apply(); }); });
- ng1compilePromise =
- upgrade_ng1_adapter_1.UpgradeNg1ComponentAdapterBuilder.resolve(_this.downgradedComponents, injector);
- }
- ]);
- angular.element(element).data(util_1.controllerKey(constants_1.NG2_INJECTOR), injector);
- ngZone.run(function () { angular.bootstrap(element, [_this.idPrefix], config); });
- Promise.all([this.compileNg2Components(compiler, protoViewRefMap), ng1compilePromise])
- .then(function () {
- ngZone.run(function () {
- if (rootScopePrototype) {
- rootScopePrototype.$apply = original$applyFn; // restore original $apply
- while (delayApplyExps.length) {
- rootScope.$apply(delayApplyExps.shift());
- }
- upgrade._bootstrapDone(applicationRef, ng1Injector);
- rootScopePrototype = null;
- }
- });
- }, util_1.onError);
- return upgrade;
- };
- /**
- * Adds a provider to the top level environment of a hybrid AngularJS v1 / Angular v2 application.
- *
- * In hybrid AngularJS v1 / Angular v2 application, there is no one root Angular v2 component,
- * for this reason we provide an application global way of registering providers which is
- * consistent with single global injection in AngularJS v1.
- *
- * ### Example
- *
- * ```
- * class Greeter {
- * greet(name) {
- * alert('Hello ' + name + '!');
- * }
- * }
- *
- * @Component({
- * selector: 'app',
- * template: ''
- * })
- * class App {
- * constructor(greeter: Greeter) {
- * this.greeter('World');
- * }
- * }
- *
- * var adapter = new UpgradeAdapter();
- * adapter.addProvider(Greeter);
- *
- * var module = angular.module('myExample', []);
- * module.directive('app', adapter.downgradeNg2Component(App));
- *
- * document.body.innerHTML = '<app></app>'
- * adapter.bootstrap(document.body, ['myExample']);
- *```
- */
- UpgradeAdapter.prototype.addProvider = function (provider) { this.providers.push(provider); };
- /**
- * Allows AngularJS v1 service to be accessible from Angular v2.
- *
- *
- * ### Example
- *
- * ```
- * class Login { ... }
- * class Server { ... }
- *
- * @Injectable()
- * class Example {
- * constructor(@Inject('server') server, login: Login) {
- * ...
- * }
- * }
- *
- * var module = angular.module('myExample', []);
- * module.service('server', Server);
- * module.service('login', Login);
- *
- * var adapter = new UpgradeAdapter();
- * adapter.upgradeNg1Provider('server');
- * adapter.upgradeNg1Provider('login', {asToken: Login});
- * adapter.addProvider(Example);
- *
- * adapter.bootstrap(document.body, ['myExample']).ready((ref) => {
- * var example: Example = ref.ng2Injector.get(Example);
- * });
- *
- * ```
- */
- UpgradeAdapter.prototype.upgradeNg1Provider = function (name, options) {
- var token = options && options.asToken || name;
- this.providers.push(core_1.provide(token, {
- useFactory: function (ng1Injector) { return ng1Injector.get(name); },
- deps: [constants_1.NG1_INJECTOR]
- }));
- };
- /**
- * Allows Angular v2 service to be accessible from AngularJS v1.
- *
- *
- * ### Example
- *
- * ```
- * class Example {
- * }
- *
- * var adapter = new UpgradeAdapter();
- * adapter.addProvider(Example);
- *
- * var module = angular.module('myExample', []);
- * module.factory('example', adapter.downgradeNg2Provider(Example));
- *
- * adapter.bootstrap(document.body, ['myExample']).ready((ref) => {
- * var example: Example = ref.ng1Injector.get('example');
- * });
- *
- * ```
- */
- UpgradeAdapter.prototype.downgradeNg2Provider = function (token) {
- var factory = function (injector) { return injector.get(token); };
- factory.$inject = [constants_1.NG2_INJECTOR];
- return factory;
- };
- /* @internal */
- UpgradeAdapter.prototype.compileNg2Components = function (compiler, protoViewRefMap) {
- var _this = this;
- var promises = [];
- var types = this.upgradedComponents;
- for (var i = 0; i < types.length; i++) {
- promises.push(compiler.compileInHost(types[i]));
- }
- return Promise.all(promises).then(function (protoViews) {
- var types = _this.upgradedComponents;
- for (var i = 0; i < protoViews.length; i++) {
- protoViewRefMap[metadata_1.getComponentInfo(types[i]).selector] = protoViews[i];
- }
- return protoViewRefMap;
- }, util_1.onError);
- };
- return UpgradeAdapter;
- })();
- exports.UpgradeAdapter = UpgradeAdapter;
- function ng1ComponentDirective(info, idPrefix) {
- directiveFactory.$inject = [constants_1.NG2_PROTO_VIEW_REF_MAP, constants_1.NG2_APP_VIEW_MANAGER, constants_1.NG1_PARSE];
- function directiveFactory(protoViewRefMap, viewManager, parse) {
- var protoView = protoViewRefMap[info.selector];
- if (!protoView)
- throw new Error('Expecting ProtoViewRef for: ' + info.selector);
- var idCount = 0;
- return {
- restrict: 'E',
- require: constants_1.REQUIRE_INJECTOR,
- link: {
- post: function (scope, element, attrs, parentInjector, transclude) {
- var domElement = element[0];
- var facade = new downgrade_ng2_adapter_1.DowngradeNg2ComponentAdapter(idPrefix + (idCount++), info, element, attrs, scope, parentInjector, parse, viewManager, protoView);
- facade.setupInputs();
- facade.bootstrapNg2();
- facade.projectContent();
- facade.setupOutputs();
- facade.registerCleanup();
- }
- }
- };
- }
- return directiveFactory;
- }
- /**
- * Use `UgradeAdapterRef` to control a hybrid AngularJS v1 / Angular v2 application.
- */
- var UpgradeAdapterRef = (function () {
- function UpgradeAdapterRef() {
- /* @internal */
- this._readyFn = null;
- this.ng1RootScope = null;
- this.ng1Injector = null;
- this.ng2ApplicationRef = null;
- this.ng2Injector = null;
- }
- /* @internal */
- UpgradeAdapterRef.prototype._bootstrapDone = function (applicationRef, ng1Injector) {
- this.ng2ApplicationRef = applicationRef;
- this.ng2Injector = applicationRef.injector;
- this.ng1Injector = ng1Injector;
- this.ng1RootScope = ng1Injector.get(constants_1.NG1_ROOT_SCOPE);
- this._readyFn && this._readyFn(this);
- };
- /**
- * Register a callback function which is notified upon successful hybrid AngularJS v1 / Angular v2
- * application has been bootstrapped.
- *
- * The `ready` callback function is invoked inside the Angular v2 zone, therefore it does not
- * require a call to `$apply()`.
- */
- UpgradeAdapterRef.prototype.ready = function (fn) { this._readyFn = fn; };
- /**
- * Dispose of running hybrid AngularJS v1 / Angular v2 application.
- */
- UpgradeAdapterRef.prototype.dispose = function () {
- this.ng1Injector.get(constants_1.NG1_ROOT_SCOPE).$destroy();
- this.ng2ApplicationRef.dispose();
- };
- return UpgradeAdapterRef;
- })();
- exports.UpgradeAdapterRef = UpgradeAdapterRef;
- /***/ },
- /* 253 */
- /***/ function(module, exports, __webpack_require__) {
- var core_1 = __webpack_require__(2);
- var COMPONENT_SELECTOR = /^[\w|-]*$/;
- var SKEWER_CASE = /-(\w)/g;
- var directiveResolver = new core_1.DirectiveResolver();
- function getComponentInfo(type) {
- var resolvedMetadata = directiveResolver.resolve(type);
- var selector = resolvedMetadata.selector;
- if (!selector.match(COMPONENT_SELECTOR)) {
- throw new Error('Only selectors matching element names are supported, got: ' + selector);
- }
- var selector = selector.replace(SKEWER_CASE, function (all, letter) { return letter.toUpperCase(); });
- return {
- type: type,
- selector: selector,
- inputs: parseFields(resolvedMetadata.inputs),
- outputs: parseFields(resolvedMetadata.outputs)
- };
- }
- exports.getComponentInfo = getComponentInfo;
- function parseFields(names) {
- var attrProps = [];
- if (names) {
- for (var i = 0; i < names.length; i++) {
- var parts = names[i].split(':');
- var prop = parts[0].trim();
- var attr = (parts[1] || parts[0]).trim();
- var capitalAttr = attr.charAt(0).toUpperCase() + attr.substr(1);
- attrProps.push({
- prop: prop,
- attr: attr,
- bracketAttr: "[" + attr + "]",
- parenAttr: "(" + attr + ")",
- bracketParenAttr: "[(" + attr + ")]",
- onAttr: "on" + capitalAttr,
- bindAttr: "bind" + capitalAttr,
- bindonAttr: "bindon" + capitalAttr
- });
- }
- }
- return attrProps;
- }
- exports.parseFields = parseFields;
- /***/ },
- /* 254 */
- /***/ function(module, exports) {
- function stringify(obj) {
- if (typeof obj == 'function')
- return obj.name || obj.toString();
- return '' + obj;
- }
- exports.stringify = stringify;
- function onError(e) {
- // TODO: (misko): We seem to not have a stack trace here!
- console.log(e, e.stack);
- throw e;
- }
- exports.onError = onError;
- function controllerKey(name) {
- return '$' + name + 'Controller';
- }
- exports.controllerKey = controllerKey;
- /***/ },
- /* 255 */
- /***/ function(module, exports) {
- exports.NG2_APP_VIEW_MANAGER = 'ng2.AppViewManager';
- exports.NG2_COMPILER = 'ng2.Compiler';
- exports.NG2_INJECTOR = 'ng2.Injector';
- exports.NG2_PROTO_VIEW_REF_MAP = 'ng2.ProtoViewRefMap';
- exports.NG2_ZONE = 'ng2.NgZone';
- exports.NG1_CONTROLLER = '$controller';
- exports.NG1_SCOPE = '$scope';
- exports.NG1_ROOT_SCOPE = '$rootScope';
- exports.NG1_COMPILE = '$compile';
- exports.NG1_HTTP_BACKEND = '$httpBackend';
- exports.NG1_INJECTOR = '$injector';
- exports.NG1_PARSE = '$parse';
- exports.NG1_TEMPLATE_CACHE = '$templateCache';
- exports.REQUIRE_INJECTOR = '^' + exports.NG2_INJECTOR;
- /***/ },
- /* 256 */
- /***/ function(module, exports, __webpack_require__) {
- var core_1 = __webpack_require__(2);
- var constants_1 = __webpack_require__(255);
- var INITIAL_VALUE = {
- __UNINITIALIZED__: true
- };
- var DowngradeNg2ComponentAdapter = (function () {
- function DowngradeNg2ComponentAdapter(id, info, element, attrs, scope, parentInjector, parse, viewManager, protoView) {
- this.id = id;
- this.info = info;
- this.element = element;
- this.attrs = attrs;
- this.scope = scope;
- this.parentInjector = parentInjector;
- this.parse = parse;
- this.viewManager = viewManager;
- this.protoView = protoView;
- this.component = null;
- this.inputChangeCount = 0;
- this.inputChanges = null;
- this.hostViewRef = null;
- this.changeDetector = null;
- this.contentInserctionPoint = null;
- this.element[0].id = id;
- this.componentScope = scope.$new();
- this.childNodes = element.contents();
- }
- DowngradeNg2ComponentAdapter.prototype.bootstrapNg2 = function () {
- var childInjector = this.parentInjector.resolveAndCreateChild([core_1.provide(constants_1.NG1_SCOPE, { useValue: this.componentScope })]);
- this.hostViewRef =
- this.viewManager.createRootHostView(this.protoView, '#' + this.id, childInjector);
- var renderer = this.hostViewRef.render;
- var hostElement = this.viewManager.getHostElement(this.hostViewRef);
- this.changeDetector = this.hostViewRef.changeDetectorRef;
- this.component = this.viewManager.getComponent(hostElement);
- this.contentInserctionPoint = renderer.rootContentInsertionPoints[0];
- };
- DowngradeNg2ComponentAdapter.prototype.setupInputs = function () {
- var _this = this;
- var attrs = this.attrs;
- var inputs = this.info.inputs;
- for (var i = 0; i < inputs.length; i++) {
- var input = inputs[i];
- var expr = null;
- if (attrs.hasOwnProperty(input.attr)) {
- var observeFn = (function (prop) {
- var prevValue = INITIAL_VALUE;
- return function (value) {
- if (_this.inputChanges !== null) {
- _this.inputChangeCount++;
- _this.inputChanges[prop] =
- new Ng1Change(value, prevValue === INITIAL_VALUE ? value : prevValue);
- prevValue = value;
- }
- _this.component[prop] = value;
- };
- })(input.prop);
- attrs.$observe(input.attr, observeFn);
- }
- else if (attrs.hasOwnProperty(input.bindAttr)) {
- expr = attrs[input.bindAttr];
- }
- else if (attrs.hasOwnProperty(input.bracketAttr)) {
- expr = attrs[input.bracketAttr];
- }
- else if (attrs.hasOwnProperty(input.bindonAttr)) {
- expr = attrs[input.bindonAttr];
- }
- else if (attrs.hasOwnProperty(input.bracketParenAttr)) {
- expr = attrs[input.bracketParenAttr];
- }
- if (expr != null) {
- var watchFn = (function (prop) { return function (value, prevValue) {
- if (_this.inputChanges != null) {
- _this.inputChangeCount++;
- _this.inputChanges[prop] = new Ng1Change(prevValue, value);
- }
- _this.component[prop] = value;
- }; })(input.prop);
- this.componentScope.$watch(expr, watchFn);
- }
- }
- var prototype = this.info.type.prototype;
- if (prototype && prototype.ngOnChanges) {
- // Detect: OnChanges interface
- this.inputChanges = {};
- this.componentScope.$watch(function () { return _this.inputChangeCount; }, function () {
- var inputChanges = _this.inputChanges;
- _this.inputChanges = {};
- _this.component.ngOnChanges(inputChanges);
- });
- }
- this.componentScope.$watch(function () { return _this.changeDetector && _this.changeDetector.detectChanges(); });
- };
- DowngradeNg2ComponentAdapter.prototype.projectContent = function () {
- var childNodes = this.childNodes;
- if (this.contentInserctionPoint) {
- var parent = this.contentInserctionPoint.parentNode;
- for (var i = 0, ii = childNodes.length; i < ii; i++) {
- parent.insertBefore(childNodes[i], this.contentInserctionPoint);
- }
- }
- };
- DowngradeNg2ComponentAdapter.prototype.setupOutputs = function () {
- var _this = this;
- var attrs = this.attrs;
- var outputs = this.info.outputs;
- for (var j = 0; j < outputs.length; j++) {
- var output = outputs[j];
- var expr = null;
- var assignExpr = false;
- var bindonAttr = output.bindonAttr ? output.bindonAttr.substring(0, output.bindonAttr.length - 6) : null;
- var bracketParenAttr = output.bracketParenAttr ?
- "[(" + output.bracketParenAttr.substring(2, output.bracketParenAttr.length - 8) + ")]" :
- null;
- if (attrs.hasOwnProperty(output.onAttr)) {
- expr = attrs[output.onAttr];
- }
- else if (attrs.hasOwnProperty(output.parenAttr)) {
- expr = attrs[output.parenAttr];
- }
- else if (attrs.hasOwnProperty(bindonAttr)) {
- expr = attrs[bindonAttr];
- assignExpr = true;
- }
- else if (attrs.hasOwnProperty(bracketParenAttr)) {
- expr = attrs[bracketParenAttr];
- assignExpr = true;
- }
- if (expr != null && assignExpr != null) {
- var getter = this.parse(expr);
- var setter = getter.assign;
- if (assignExpr && !setter) {
- throw new Error("Expression '" + expr + "' is not assignable!");
- }
- var emitter = this.component[output.prop];
- if (emitter) {
- emitter.subscribe({
- next: assignExpr ? (function (setter) { return function (value) { return setter(_this.scope, value); }; })(setter) :
- (function (getter) { return function (value) { return getter(_this.scope, { $event: value }); }; })(getter)
- });
- }
- else {
- throw new Error("Missing emitter '" + output.prop + "' on component '" + this.info.selector + "'!");
- }
- }
- }
- };
- DowngradeNg2ComponentAdapter.prototype.registerCleanup = function () {
- var _this = this;
- this.element.bind('$remove', function () { return _this.viewManager.destroyRootHostView(_this.hostViewRef); });
- };
- return DowngradeNg2ComponentAdapter;
- })();
- exports.DowngradeNg2ComponentAdapter = DowngradeNg2ComponentAdapter;
- var Ng1Change = (function () {
- function Ng1Change(previousValue, currentValue) {
- this.previousValue = previousValue;
- this.currentValue = currentValue;
- }
- Ng1Change.prototype.isFirstChange = function () { return this.previousValue === this.currentValue; };
- return Ng1Change;
- })();
- /***/ },
- /* 257 */
- /***/ function(module, exports, __webpack_require__) {
- var core_1 = __webpack_require__(2);
- var constants_1 = __webpack_require__(255);
- var util_1 = __webpack_require__(254);
- var angular = __webpack_require__(258);
- var CAMEL_CASE = /([A-Z])/g;
- var INITIAL_VALUE = {
- __UNINITIALIZED__: true
- };
- var NOT_SUPPORTED = 'NOT_SUPPORTED';
- var UpgradeNg1ComponentAdapterBuilder = (function () {
- function UpgradeNg1ComponentAdapterBuilder(name) {
- this.name = name;
- this.inputs = [];
- this.inputsRename = [];
- this.outputs = [];
- this.outputsRename = [];
- this.propertyOutputs = [];
- this.checkProperties = [];
- this.propertyMap = {};
- this.linkFn = null;
- this.directive = null;
- this.$controller = null;
- var selector = name.replace(CAMEL_CASE, function (all, next) { return '-' + next.toLowerCase(); });
- var self = this;
- this.type =
- core_1.Directive({ selector: selector, inputs: this.inputsRename, outputs: this.outputsRename })
- .Class({
- constructor: [
- new core_1.Inject(constants_1.NG1_SCOPE),
- core_1.ElementRef,
- function (scope, elementRef) {
- return new UpgradeNg1ComponentAdapter(self.linkFn, scope, self.directive, elementRef, self.$controller, self.inputs, self.outputs, self.propertyOutputs, self.checkProperties, self.propertyMap);
- }
- ],
- ngOnChanges: function () { },
- ngDoCheck: function () { }
- });
- }
- UpgradeNg1ComponentAdapterBuilder.prototype.extractDirective = function (injector) {
- var directives = injector.get(this.name + 'Directive');
- if (directives.length > 1) {
- throw new Error('Only support single directive definition for: ' + this.name);
- }
- var directive = directives[0];
- if (directive.replace)
- this.notSupported('replace');
- if (directive.terminal)
- this.notSupported('terminal');
- var link = directive.link;
- if (typeof link == 'object') {
- if (link.post)
- this.notSupported('link.post');
- }
- return directive;
- };
- UpgradeNg1ComponentAdapterBuilder.prototype.notSupported = function (feature) {
- throw new Error("Upgraded directive '" + this.name + "' does not support '" + feature + "'.");
- };
- UpgradeNg1ComponentAdapterBuilder.prototype.extractBindings = function () {
- var scope = this.directive.scope;
- if (typeof scope == 'object') {
- for (var name in scope) {
- if (scope.hasOwnProperty(name)) {
- var localName = scope[name];
- var type = localName.charAt(0);
- localName = localName.substr(1) || name;
- var outputName = 'output_' + name;
- var outputNameRename = outputName + ': ' + name;
- var outputNameRenameChange = outputName + ': ' + name + 'Change';
- var inputName = 'input_' + name;
- var inputNameRename = inputName + ': ' + name;
- switch (type) {
- case '=':
- this.propertyOutputs.push(outputName);
- this.checkProperties.push(localName);
- this.outputs.push(outputName);
- this.outputsRename.push(outputNameRenameChange);
- this.propertyMap[outputName] = localName;
- // don't break; let it fall through to '@'
- case '@':
- this.inputs.push(inputName);
- this.inputsRename.push(inputNameRename);
- this.propertyMap[inputName] = localName;
- break;
- case '&':
- this.outputs.push(outputName);
- this.outputsRename.push(outputNameRename);
- this.propertyMap[outputName] = localName;
- break;
- default:
- var json = JSON.stringify(scope);
- throw new Error("Unexpected mapping '" + type + "' in '" + json + "' in '" + this.name + "' directive.");
- }
- }
- }
- }
- };
- UpgradeNg1ComponentAdapterBuilder.prototype.compileTemplate = function (compile, templateCache, httpBackend) {
- var _this = this;
- if (this.directive.template !== undefined) {
- this.linkFn = compileHtml(this.directive.template);
- }
- else if (this.directive.templateUrl) {
- var url = this.directive.templateUrl;
- var html = templateCache.get(url);
- if (html !== undefined) {
- this.linkFn = compileHtml(html);
- }
- else {
- return new Promise(function (resolve, err) {
- httpBackend('GET', url, null, function (status, response) {
- if (status == 200) {
- resolve(_this.linkFn = compileHtml(templateCache.put(url, response)));
- }
- else {
- err("GET " + url + " returned " + status + ": " + response);
- }
- });
- });
- }
- }
- else {
- throw new Error("Directive '" + this.name + "' is not a component, it is missing template.");
- }
- return null;
- function compileHtml(html) {
- var div = document.createElement('div');
- div.innerHTML = html;
- return compile(div.childNodes);
- }
- };
- UpgradeNg1ComponentAdapterBuilder.resolve = function (exportedComponents, injector) {
- var promises = [];
- var compile = injector.get(constants_1.NG1_COMPILE);
- var templateCache = injector.get(constants_1.NG1_TEMPLATE_CACHE);
- var httpBackend = injector.get(constants_1.NG1_HTTP_BACKEND);
- var $controller = injector.get(constants_1.NG1_CONTROLLER);
- for (var name in exportedComponents) {
- if (exportedComponents.hasOwnProperty(name)) {
- var exportedComponent = exportedComponents[name];
- exportedComponent.directive = exportedComponent.extractDirective(injector);
- exportedComponent.$controller = $controller;
- exportedComponent.extractBindings();
- var promise = exportedComponent.compileTemplate(compile, templateCache, httpBackend);
- if (promise)
- promises.push(promise);
- }
- }
- return Promise.all(promises);
- };
- return UpgradeNg1ComponentAdapterBuilder;
- })();
- exports.UpgradeNg1ComponentAdapterBuilder = UpgradeNg1ComponentAdapterBuilder;
- var UpgradeNg1ComponentAdapter = (function () {
- function UpgradeNg1ComponentAdapter(linkFn, scope, directive, elementRef, $controller, inputs, outputs, propOuts, checkProperties, propertyMap) {
- this.directive = directive;
- this.inputs = inputs;
- this.outputs = outputs;
- this.propOuts = propOuts;
- this.checkProperties = checkProperties;
- this.propertyMap = propertyMap;
- this.destinationObj = null;
- this.checkLastValues = [];
- var element = elementRef.nativeElement;
- var childNodes = [];
- var childNode;
- while (childNode = element.firstChild) {
- element.removeChild(childNode);
- childNodes.push(childNode);
- }
- var componentScope = scope.$new(!!directive.scope);
- var $element = angular.element(element);
- var controllerType = directive.controller;
- var controller = null;
- if (controllerType) {
- var locals = { $scope: componentScope, $element: $element };
- controller = $controller(controllerType, locals, null, directive.controllerAs);
- $element.data(util_1.controllerKey(directive.name), controller);
- }
- var link = directive.link;
- if (typeof link == 'object')
- link = link.pre;
- if (link) {
- var attrs = NOT_SUPPORTED;
- var transcludeFn = NOT_SUPPORTED;
- var linkController = this.resolveRequired($element, directive.require);
- directive.link(componentScope, $element, attrs, linkController, transcludeFn);
- }
- this.destinationObj = directive.bindToController && controller ? controller : componentScope;
- linkFn(componentScope, function (clonedElement, scope) {
- for (var i = 0, ii = clonedElement.length; i < ii; i++) {
- element.appendChild(clonedElement[i]);
- }
- }, { parentBoundTranscludeFn: function (scope, cloneAttach) { cloneAttach(childNodes); } });
- for (var i = 0; i < inputs.length; i++) {
- this[inputs[i]] = null;
- }
- for (var j = 0; j < outputs.length; j++) {
- var emitter = this[outputs[j]] = new core_1.EventEmitter();
- this.setComponentProperty(outputs[j], (function (emitter) { return function (value) { return emitter.emit(value); }; })(emitter));
- }
- for (var k = 0; k < propOuts.length; k++) {
- this[propOuts[k]] = new core_1.EventEmitter();
- this.checkLastValues.push(INITIAL_VALUE);
- }
- }
- UpgradeNg1ComponentAdapter.prototype.ngOnChanges = function (changes) {
- for (var name in changes) {
- if (changes.hasOwnProperty(name)) {
- var change = changes[name];
- this.setComponentProperty(name, change.currentValue);
- }
- }
- };
- UpgradeNg1ComponentAdapter.prototype.ngDoCheck = function () {
- var count = 0;
- var destinationObj = this.destinationObj;
- var lastValues = this.checkLastValues;
- var checkProperties = this.checkProperties;
- for (var i = 0; i < checkProperties.length; i++) {
- var value = destinationObj[checkProperties[i]];
- var last = lastValues[i];
- if (value !== last) {
- if (typeof value == 'number' && isNaN(value) && typeof last == 'number' && isNaN(last)) {
- }
- else {
- var eventEmitter = this[this.propOuts[i]];
- eventEmitter.emit(lastValues[i] = value);
- }
- }
- }
- return count;
- };
- UpgradeNg1ComponentAdapter.prototype.setComponentProperty = function (name, value) {
- this.destinationObj[this.propertyMap[name]] = value;
- };
- UpgradeNg1ComponentAdapter.prototype.resolveRequired = function ($element, require) {
- if (!require) {
- return undefined;
- }
- else if (typeof require == 'string') {
- var name = require;
- var isOptional = false;
- var startParent = false;
- var searchParents = false;
- var ch;
- if (name.charAt(0) == '?') {
- isOptional = true;
- name = name.substr(1);
- }
- if (name.charAt(0) == '^') {
- searchParents = true;
- name = name.substr(1);
- }
- if (name.charAt(0) == '^') {
- startParent = true;
- name = name.substr(1);
- }
- var key = util_1.controllerKey(name);
- if (startParent)
- $element = $element.parent();
- var dep = searchParents ? $element.inheritedData(key) : $element.data(key);
- if (!dep && !isOptional) {
- throw new Error("Can not locate '" + require + "' in '" + this.directive.name + "'.");
- }
- return dep;
- }
- else if (require instanceof Array) {
- var deps = [];
- for (var i = 0; i < require.length; i++) {
- deps.push(this.resolveRequired($element, require[i]));
- }
- return deps;
- }
- throw new Error("Directive '" + this.directive.name + "' require syntax unrecognized: " + this.directive.require);
- };
- return UpgradeNg1ComponentAdapter;
- })();
- /***/ },
- /* 258 */
- /***/ function(module, exports) {
- function noNg() {
- throw new Error('AngularJS v1.x is not loaded!');
- }
- var angular = { bootstrap: noNg, module: noNg, element: noNg, version: noNg };
- try {
- if (window.hasOwnProperty('angular')) {
- angular = window.angular;
- }
- }
- catch (e) {
- }
- exports.bootstrap = angular.bootstrap;
- exports.module = angular.module;
- exports.element = angular.element;
- exports.version = angular.version;
- /***/ },
- /* 259 */
- /***/ function(module, exports, __webpack_require__) {
- function __export(m) {
- for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
- }
- /**
- * @module
- * @description
- * This module is used for writing tests for applications written in Angular.
- *
- * This module is not included in the `angular2` module; you must import the test module explicitly.
- *
- */
- __export(__webpack_require__(260));
- var test_component_builder_1 = __webpack_require__(267);
- exports.ComponentFixture = test_component_builder_1.ComponentFixture;
- exports.TestComponentBuilder = test_component_builder_1.TestComponentBuilder;
- __export(__webpack_require__(261));
- __export(__webpack_require__(274));
- var view_resolver_mock_1 = __webpack_require__(264);
- exports.MockViewResolver = view_resolver_mock_1.MockViewResolver;
- var xhr_mock_1 = __webpack_require__(275);
- exports.MockXHR = xhr_mock_1.MockXHR;
- var ng_zone_mock_1 = __webpack_require__(266);
- exports.MockNgZone = ng_zone_mock_1.MockNgZone;
- var mock_application_ref_1 = __webpack_require__(276);
- exports.MockApplicationRef = mock_application_ref_1.MockApplicationRef;
- var directive_resolver_mock_1 = __webpack_require__(263);
- exports.MockDirectiveResolver = directive_resolver_mock_1.MockDirectiveResolver;
- /***/ },
- /* 260 */
- /***/ function(module, exports, __webpack_require__) {
- /**
- * Public Test Library for unit testing Angular2 Applications. Uses the
- * Jasmine framework.
- */
- var lang_1 = __webpack_require__(5);
- var collection_1 = __webpack_require__(12);
- var test_injector_1 = __webpack_require__(261);
- var test_injector_2 = __webpack_require__(261);
- exports.inject = test_injector_2.inject;
- exports.injectAsync = test_injector_2.injectAsync;
- var matchers_1 = __webpack_require__(273);
- exports.expect = matchers_1.expect;
- var _global = (typeof window === 'undefined' ? lang_1.global : window);
- /**
- * Run a function (with an optional asynchronous callback) after each test case.
- *
- * See http://jasmine.github.io/ for more details.
- *
- * ## Example:
- *
- * {@example testing/ts/testing.ts region='afterEach'}
- */
- exports.afterEach = _global.afterEach;
- /**
- * Group test cases together under a common description prefix.
- *
- * See http://jasmine.github.io/ for more details.
- *
- * ## Example:
- *
- * {@example testing/ts/testing.ts region='describeIt'}
- */
- exports.describe = _global.describe;
- /**
- * See {@link fdescribe}.
- */
- exports.ddescribe = _global.fdescribe;
- /**
- * Like {@link describe}, but instructs the test runner to only run
- * the test cases in this group. This is useful for debugging.
- *
- * See http://jasmine.github.io/ for more details.
- *
- * ## Example:
- *
- * {@example testing/ts/testing.ts region='fdescribe'}
- */
- exports.fdescribe = _global.fdescribe;
- /**
- * Like {@link describe}, but instructs the test runner to exclude
- * this group of test cases from execution. This is useful for
- * debugging, or for excluding broken tests until they can be fixed.
- *
- * See http://jasmine.github.io/ for more details.
- *
- * ## Example:
- *
- * {@example testing/ts/testing.ts region='xdescribe'}
- */
- exports.xdescribe = _global.xdescribe;
- var jsmBeforeEach = _global.beforeEach;
- var jsmIt = _global.it;
- var jsmIIt = _global.fit;
- var jsmXIt = _global.xit;
- var testProviders;
- var injector;
- // Reset the test providers before each test.
- jsmBeforeEach(function () {
- testProviders = [];
- injector = null;
- });
- /**
- * Allows overriding default providers of the test injector,
- * which are defined in test_injector.js.
- *
- * The given function must return a list of DI providers.
- *
- * ## Example:
- *
- * {@example testing/ts/testing.ts region='beforeEachProviders'}
- */
- function beforeEachProviders(fn) {
- jsmBeforeEach(function () {
- var providers = fn();
- if (!providers)
- return;
- testProviders = testProviders.concat(providers);
- if (injector !== null) {
- throw new Error('beforeEachProviders was called after the injector had ' +
- 'been used in a beforeEach or it block. This invalidates the ' +
- 'test injector');
- }
- });
- }
- exports.beforeEachProviders = beforeEachProviders;
- function _isPromiseLike(input) {
- return input && !!(input.then);
- }
- function runInTestZone(fnToExecute, finishCallback, failCallback) {
- var pendingMicrotasks = 0;
- var pendingTimeouts = [];
- var ngTestZone = lang_1.global.zone
- .fork({
- onError: function (e) { failCallback(e); },
- '$run': function (parentRun) {
- return function () {
- try {
- return parentRun.apply(this, arguments);
- }
- finally {
- if (pendingMicrotasks == 0 && pendingTimeouts.length == 0) {
- finishCallback();
- }
- }
- };
- },
- '$scheduleMicrotask': function (parentScheduleMicrotask) {
- return function (fn) {
- pendingMicrotasks++;
- var microtask = function () {
- try {
- fn();
- }
- finally {
- pendingMicrotasks--;
- }
- };
- parentScheduleMicrotask.call(this, microtask);
- };
- },
- '$setTimeout': function (parentSetTimeout) {
- return function (fn, delay) {
- var args = [];
- for (var _i = 2; _i < arguments.length; _i++) {
- args[_i - 2] = arguments[_i];
- }
- var id;
- var cb = function () {
- fn();
- collection_1.ListWrapper.remove(pendingTimeouts, id);
- };
- id = parentSetTimeout(cb, delay, args);
- pendingTimeouts.push(id);
- return id;
- };
- },
- '$clearTimeout': function (parentClearTimeout) {
- return function (id) {
- parentClearTimeout(id);
- collection_1.ListWrapper.remove(pendingTimeouts, id);
- };
- },
- });
- return ngTestZone.run(fnToExecute);
- }
- function _it(jsmFn, name, testFn, testTimeOut) {
- var timeOut = testTimeOut;
- if (testFn instanceof test_injector_1.FunctionWithParamTokens) {
- jsmFn(name, function (done) {
- if (!injector) {
- injector = test_injector_1.createTestInjectorWithRuntimeCompiler(testProviders);
- }
- var finishCallback = function () {
- // Wait one more event loop to make sure we catch unreturned promises and
- // promise rejections.
- setTimeout(done, 0);
- };
- var returnedTestValue = runInTestZone(function () { return testFn.execute(injector); }, finishCallback, done.fail);
- if (testFn.isAsync) {
- if (_isPromiseLike(returnedTestValue)) {
- returnedTestValue.then(null, function (err) { done.fail(err); });
- }
- else {
- done.fail('Error: injectAsync was expected to return a promise, but the ' +
- ' returned value was: ' + returnedTestValue);
- }
- }
- else {
- if (!(returnedTestValue === undefined)) {
- done.fail('Error: inject returned a value. Did you mean to use injectAsync? Returned ' +
- 'value was: ' + returnedTestValue);
- }
- }
- }, timeOut);
- }
- else {
- // The test case doesn't use inject(). ie `it('test', (done) => { ... }));`
- jsmFn(name, testFn, timeOut);
- }
- }
- /**
- * Wrapper around Jasmine beforeEach function.
- *
- * beforeEach may be used with the `inject` function to fetch dependencies.
- * The test will automatically wait for any asynchronous calls inside the
- * injected test function to complete.
- *
- * See http://jasmine.github.io/ for more details.
- *
- * ## Example:
- *
- * {@example testing/ts/testing.ts region='beforeEach'}
- */
- function beforeEach(fn) {
- if (fn instanceof test_injector_1.FunctionWithParamTokens) {
- // The test case uses inject(). ie `beforeEach(inject([ClassA], (a) => { ...
- // }));`
- jsmBeforeEach(function (done) {
- var finishCallback = function () {
- // Wait one more event loop to make sure we catch unreturned promises and
- // promise rejections.
- setTimeout(done, 0);
- };
- if (!injector) {
- injector = test_injector_1.createTestInjectorWithRuntimeCompiler(testProviders);
- }
- var returnedTestValue = runInTestZone(function () { return fn.execute(injector); }, finishCallback, done.fail);
- if (fn.isAsync) {
- if (_isPromiseLike(returnedTestValue)) {
- returnedTestValue.then(null, function (err) { done.fail(err); });
- }
- else {
- done.fail('Error: injectAsync was expected to return a promise, but the ' +
- ' returned value was: ' + returnedTestValue);
- }
- }
- else {
- if (!(returnedTestValue === undefined)) {
- done.fail('Error: inject returned a value. Did you mean to use injectAsync? Returned ' +
- 'value was: ' + returnedTestValue);
- }
- }
- });
- }
- else {
- // The test case doesn't use inject(). ie `beforeEach((done) => { ... }));`
- if (fn.length === 0) {
- jsmBeforeEach(function () { fn(); });
- }
- else {
- jsmBeforeEach(function (done) { fn(done); });
- }
- }
- }
- exports.beforeEach = beforeEach;
- /**
- * Define a single test case with the given test name and execution function.
- *
- * The test function can be either a synchronous function, an asynchronous function
- * that takes a completion callback, or an injected function created via {@link inject}
- * or {@link injectAsync}. The test will automatically wait for any asynchronous calls
- * inside the injected test function to complete.
- *
- * Wrapper around Jasmine it function. See http://jasmine.github.io/ for more details.
- *
- * ## Example:
- *
- * {@example testing/ts/testing.ts region='describeIt'}
- */
- function it(name, fn, timeOut) {
- if (timeOut === void 0) { timeOut = null; }
- return _it(jsmIt, name, fn, timeOut);
- }
- exports.it = it;
- /**
- * Like {@link it}, but instructs the test runner to exclude this test
- * entirely. Useful for debugging or for excluding broken tests until
- * they can be fixed.
- *
- * Wrapper around Jasmine xit function. See http://jasmine.github.io/ for more details.
- *
- * ## Example:
- *
- * {@example testing/ts/testing.ts region='xit'}
- */
- function xit(name, fn, timeOut) {
- if (timeOut === void 0) { timeOut = null; }
- return _it(jsmXIt, name, fn, timeOut);
- }
- exports.xit = xit;
- /**
- * See {@link fit}.
- */
- function iit(name, fn, timeOut) {
- if (timeOut === void 0) { timeOut = null; }
- return _it(jsmIIt, name, fn, timeOut);
- }
- exports.iit = iit;
- /**
- * Like {@link it}, but instructs the test runner to only run this test.
- * Useful for debugging.
- *
- * Wrapper around Jasmine fit function. See http://jasmine.github.io/ for more details.
- *
- * ## Example:
- *
- * {@example testing/ts/testing.ts region='fit'}
- */
- function fit(name, fn, timeOut) {
- if (timeOut === void 0) { timeOut = null; }
- return _it(jsmIIt, name, fn, timeOut);
- }
- exports.fit = fit;
- /***/ },
- /* 261 */
- /***/ function(module, exports, __webpack_require__) {
- var core_1 = __webpack_require__(2);
- var animation_builder_1 = __webpack_require__(189);
- var animation_builder_mock_1 = __webpack_require__(262);
- var proto_view_factory_1 = __webpack_require__(71);
- var reflection_1 = __webpack_require__(16);
- var change_detection_1 = __webpack_require__(25);
- var exceptions_1 = __webpack_require__(14);
- var pipe_resolver_1 = __webpack_require__(94);
- var xhr_1 = __webpack_require__(149);
- var dom_adapter_1 = __webpack_require__(178);
- var directive_resolver_mock_1 = __webpack_require__(263);
- var view_resolver_mock_1 = __webpack_require__(264);
- var mock_location_strategy_1 = __webpack_require__(265);
- var location_strategy_1 = __webpack_require__(238);
- var ng_zone_mock_1 = __webpack_require__(266);
- var test_component_builder_1 = __webpack_require__(267);
- var common_dom_1 = __webpack_require__(203);
- var collection_1 = __webpack_require__(12);
- var lang_1 = __webpack_require__(5);
- var view_pool_1 = __webpack_require__(85);
- var view_manager_utils_1 = __webpack_require__(82);
- var dom_tokens_1 = __webpack_require__(187);
- var dom_renderer_1 = __webpack_require__(188);
- var shared_styles_host_1 = __webpack_require__(196);
- var shared_styles_host_2 = __webpack_require__(196);
- var dom_events_1 = __webpack_require__(182);
- var serializer_1 = __webpack_require__(269);
- var utils_1 = __webpack_require__(268);
- var compiler_1 = __webpack_require__(150);
- var dom_renderer_2 = __webpack_require__(188);
- var dynamic_component_loader_1 = __webpack_require__(69);
- var view_manager_1 = __webpack_require__(81);
- /**
- * Returns the root injector providers.
- *
- * This must be kept in sync with the _rootBindings in application.js
- *
- * @returns {any[]}
- */
- function _getRootProviders() {
- return [core_1.provide(reflection_1.Reflector, { useValue: reflection_1.reflector })];
- }
- /**
- * Returns the application injector providers.
- *
- * This must be kept in sync with _injectorBindings() in application.js
- *
- * @returns {any[]}
- */
- function _getAppBindings() {
- var appDoc;
- // The document is only available in browser environment
- try {
- appDoc = dom_adapter_1.DOM.defaultDoc();
- }
- catch (e) {
- appDoc = null;
- }
- return [
- core_1.APPLICATION_COMMON_PROVIDERS,
- core_1.provide(change_detection_1.ChangeDetectorGenConfig, { useValue: new change_detection_1.ChangeDetectorGenConfig(true, false, true) }),
- core_1.provide(dom_tokens_1.DOCUMENT, { useValue: appDoc }),
- core_1.provide(dom_renderer_1.DomRenderer, { useClass: dom_renderer_2.DomRenderer_ }),
- core_1.provide(core_1.Renderer, { useExisting: dom_renderer_1.DomRenderer }),
- core_1.provide(core_1.APP_ID, { useValue: 'a' }),
- shared_styles_host_1.DomSharedStylesHost,
- core_1.provide(shared_styles_host_2.SharedStylesHost, { useExisting: shared_styles_host_1.DomSharedStylesHost }),
- view_pool_1.AppViewPool,
- core_1.provide(core_1.AppViewManager, { useClass: view_manager_1.AppViewManager_ }),
- view_manager_utils_1.AppViewManagerUtils,
- serializer_1.Serializer,
- common_dom_1.ELEMENT_PROBE_PROVIDERS,
- core_1.provide(view_pool_1.APP_VIEW_POOL_CAPACITY, { useValue: 500 }),
- proto_view_factory_1.ProtoViewFactory,
- core_1.provide(core_1.DirectiveResolver, { useClass: directive_resolver_mock_1.MockDirectiveResolver }),
- core_1.provide(core_1.ViewResolver, { useClass: view_resolver_mock_1.MockViewResolver }),
- core_1.provide(change_detection_1.IterableDiffers, { useValue: change_detection_1.defaultIterableDiffers }),
- core_1.provide(change_detection_1.KeyValueDiffers, { useValue: change_detection_1.defaultKeyValueDiffers }),
- utils_1.Log,
- core_1.provide(core_1.DynamicComponentLoader, { useClass: dynamic_component_loader_1.DynamicComponentLoader_ }),
- pipe_resolver_1.PipeResolver,
- core_1.provide(exceptions_1.ExceptionHandler, { useValue: new exceptions_1.ExceptionHandler(dom_adapter_1.DOM) }),
- core_1.provide(location_strategy_1.LocationStrategy, { useClass: mock_location_strategy_1.MockLocationStrategy }),
- core_1.provide(xhr_1.XHR, { useClass: dom_adapter_1.DOM.getXHR() }),
- test_component_builder_1.TestComponentBuilder,
- core_1.provide(core_1.NgZone, { useClass: ng_zone_mock_1.MockNgZone }),
- core_1.provide(animation_builder_1.AnimationBuilder, { useClass: animation_builder_mock_1.MockAnimationBuilder }),
- common_dom_1.EventManager,
- new core_1.Provider(common_dom_1.EVENT_MANAGER_PLUGINS, { useClass: dom_events_1.DomEventsPlugin, multi: true })
- ];
- }
- function _runtimeCompilerBindings() {
- return [
- core_1.provide(xhr_1.XHR, { useClass: dom_adapter_1.DOM.getXHR() }),
- compiler_1.COMPILER_PROVIDERS,
- ];
- }
- function createTestInjector(providers) {
- var rootInjector = core_1.Injector.resolveAndCreate(_getRootProviders());
- return rootInjector.resolveAndCreateChild(collection_1.ListWrapper.concat(_getAppBindings(), providers));
- }
- exports.createTestInjector = createTestInjector;
- function createTestInjectorWithRuntimeCompiler(providers) {
- return createTestInjector(collection_1.ListWrapper.concat(_runtimeCompilerBindings(), providers));
- }
- exports.createTestInjectorWithRuntimeCompiler = createTestInjectorWithRuntimeCompiler;
- /**
- * Allows injecting dependencies in `beforeEach()` and `it()`.
- *
- * Example:
- *
- * ```
- * beforeEach(inject([Dependency, AClass], (dep, object) => {
- * // some code that uses `dep` and `object`
- * // ...
- * }));
- *
- * it('...', inject([AClass], (object) => {
- * object.doSomething();
- * expect(...);
- * })
- * ```
- *
- * Notes:
- * - inject is currently a function because of some Traceur limitation the syntax should eventually
- * becomes `it('...', @Inject (object: AClass, async: AsyncTestCompleter) => { ... });`
- *
- * @param {Array} tokens
- * @param {Function} fn
- * @return {FunctionWithParamTokens}
- */
- function inject(tokens, fn) {
- return new FunctionWithParamTokens(tokens, fn, false);
- }
- exports.inject = inject;
- /**
- * Allows injecting dependencies in `beforeEach()` and `it()`. The test must return
- * a promise which will resolve when all asynchronous activity is complete.
- *
- * Example:
- *
- * ```
- * it('...', injectAsync([AClass], (object) => {
- * return object.doSomething().then(() => {
- * expect(...);
- * });
- * })
- * ```
- *
- * @param {Array} tokens
- * @param {Function} fn
- * @return {FunctionWithParamTokens}
- */
- function injectAsync(tokens, fn) {
- return new FunctionWithParamTokens(tokens, fn, true);
- }
- exports.injectAsync = injectAsync;
- var FunctionWithParamTokens = (function () {
- function FunctionWithParamTokens(_tokens, _fn, isAsync) {
- this._tokens = _tokens;
- this._fn = _fn;
- this.isAsync = isAsync;
- }
- /**
- * Returns the value of the executed function.
- */
- FunctionWithParamTokens.prototype.execute = function (injector) {
- var params = this._tokens.map(function (t) { return injector.get(t); });
- return lang_1.FunctionWrapper.apply(this._fn, params);
- };
- FunctionWithParamTokens.prototype.hasToken = function (token) { return this._tokens.indexOf(token) > -1; };
- return FunctionWithParamTokens;
- })();
- exports.FunctionWithParamTokens = FunctionWithParamTokens;
- /***/ },
- /* 262 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var di_1 = __webpack_require__(6);
- var animation_builder_1 = __webpack_require__(189);
- var css_animation_builder_1 = __webpack_require__(190);
- var animation_1 = __webpack_require__(192);
- var browser_details_1 = __webpack_require__(195);
- var MockAnimationBuilder = (function (_super) {
- __extends(MockAnimationBuilder, _super);
- function MockAnimationBuilder() {
- _super.call(this, null);
- }
- MockAnimationBuilder.prototype.css = function () { return new MockCssAnimationBuilder(); };
- MockAnimationBuilder = __decorate([
- di_1.Injectable(),
- __metadata('design:paramtypes', [])
- ], MockAnimationBuilder);
- return MockAnimationBuilder;
- })(animation_builder_1.AnimationBuilder);
- exports.MockAnimationBuilder = MockAnimationBuilder;
- var MockCssAnimationBuilder = (function (_super) {
- __extends(MockCssAnimationBuilder, _super);
- function MockCssAnimationBuilder() {
- _super.call(this, null);
- }
- MockCssAnimationBuilder.prototype.start = function (element) { return new MockAnimation(element, this.data); };
- return MockCssAnimationBuilder;
- })(css_animation_builder_1.CssAnimationBuilder);
- var MockBrowserAbstraction = (function (_super) {
- __extends(MockBrowserAbstraction, _super);
- function MockBrowserAbstraction() {
- _super.apply(this, arguments);
- }
- MockBrowserAbstraction.prototype.doesElapsedTimeIncludesDelay = function () { this.elapsedTimeIncludesDelay = false; };
- return MockBrowserAbstraction;
- })(browser_details_1.BrowserDetails);
- var MockAnimation = (function (_super) {
- __extends(MockAnimation, _super);
- function MockAnimation(element, data) {
- _super.call(this, element, data, new MockBrowserAbstraction());
- }
- MockAnimation.prototype.wait = function (callback) { this._callback = callback; };
- MockAnimation.prototype.flush = function () {
- this._callback(0);
- this._callback = null;
- };
- return MockAnimation;
- })(animation_1.Animation);
- /***/ },
- /* 263 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var di_1 = __webpack_require__(6);
- var collection_1 = __webpack_require__(12);
- var lang_1 = __webpack_require__(5);
- var metadata_1 = __webpack_require__(3);
- var directive_resolver_1 = __webpack_require__(92);
- /**
- * An implementation of {@link DirectiveResolver} that allows overriding
- * various properties of directives.
- */
- var MockDirectiveResolver = (function (_super) {
- __extends(MockDirectiveResolver, _super);
- function MockDirectiveResolver() {
- _super.apply(this, arguments);
- this._providerOverrides = new collection_1.Map();
- this.viewProviderOverrides = new collection_1.Map();
- }
- MockDirectiveResolver.prototype.resolve = function (type) {
- var dm = _super.prototype.resolve.call(this, type);
- var providerOverrides = this._providerOverrides.get(type);
- var viewProviderOverrides = this.viewProviderOverrides.get(type);
- var providers = dm.providers;
- if (lang_1.isPresent(providerOverrides)) {
- providers = dm.providers.concat(providerOverrides);
- }
- if (dm instanceof metadata_1.ComponentMetadata) {
- var viewProviders = dm.viewProviders;
- if (lang_1.isPresent(viewProviderOverrides)) {
- viewProviders = dm.viewProviders.concat(viewProviderOverrides);
- }
- return new metadata_1.ComponentMetadata({
- selector: dm.selector,
- inputs: dm.inputs,
- outputs: dm.outputs,
- host: dm.host,
- exportAs: dm.exportAs,
- moduleId: dm.moduleId,
- queries: dm.queries,
- changeDetection: dm.changeDetection,
- providers: providers,
- viewProviders: viewProviders
- });
- }
- return new metadata_1.DirectiveMetadata({
- selector: dm.selector,
- inputs: dm.inputs,
- outputs: dm.outputs,
- host: dm.host,
- providers: providers,
- exportAs: dm.exportAs,
- queries: dm.queries
- });
- };
- /**
- * @deprecated
- */
- MockDirectiveResolver.prototype.setBindingsOverride = function (type, bindings) {
- this._providerOverrides.set(type, bindings);
- };
- /**
- * @deprecated
- */
- MockDirectiveResolver.prototype.setViewBindingsOverride = function (type, viewBindings) {
- this.viewProviderOverrides.set(type, viewBindings);
- };
- MockDirectiveResolver.prototype.setProvidersOverride = function (type, bindings) {
- this._providerOverrides.set(type, bindings);
- };
- MockDirectiveResolver.prototype.setViewProvidersOverride = function (type, viewBindings) {
- this.viewProviderOverrides.set(type, viewBindings);
- };
- MockDirectiveResolver = __decorate([
- di_1.Injectable(),
- __metadata('design:paramtypes', [])
- ], MockDirectiveResolver);
- return MockDirectiveResolver;
- })(directive_resolver_1.DirectiveResolver);
- exports.MockDirectiveResolver = MockDirectiveResolver;
- /***/ },
- /* 264 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var di_1 = __webpack_require__(6);
- var collection_1 = __webpack_require__(12);
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var metadata_1 = __webpack_require__(3);
- var view_resolver_1 = __webpack_require__(93);
- var MockViewResolver = (function (_super) {
- __extends(MockViewResolver, _super);
- function MockViewResolver() {
- _super.call(this);
- /** @internal */
- this._views = new collection_1.Map();
- /** @internal */
- this._inlineTemplates = new collection_1.Map();
- /** @internal */
- this._viewCache = new collection_1.Map();
- /** @internal */
- this._directiveOverrides = new collection_1.Map();
- }
- /**
- * Overrides the {@link ViewMetadata} for a component.
- *
- * @param {Type} component
- * @param {ViewDefinition} view
- */
- MockViewResolver.prototype.setView = function (component, view) {
- this._checkOverrideable(component);
- this._views.set(component, view);
- };
- /**
- * Overrides the inline template for a component - other configuration remains unchanged.
- *
- * @param {Type} component
- * @param {string} template
- */
- MockViewResolver.prototype.setInlineTemplate = function (component, template) {
- this._checkOverrideable(component);
- this._inlineTemplates.set(component, template);
- };
- /**
- * Overrides a directive from the component {@link ViewMetadata}.
- *
- * @param {Type} component
- * @param {Type} from
- * @param {Type} to
- */
- MockViewResolver.prototype.overrideViewDirective = function (component, from, to) {
- this._checkOverrideable(component);
- var overrides = this._directiveOverrides.get(component);
- if (lang_1.isBlank(overrides)) {
- overrides = new collection_1.Map();
- this._directiveOverrides.set(component, overrides);
- }
- overrides.set(from, to);
- };
- /**
- * Returns the {@link ViewMetadata} for a component:
- * - Set the {@link ViewMetadata} to the overridden view when it exists or fallback to the default
- * `ViewResolver`,
- * see `setView`.
- * - Override the directives, see `overrideViewDirective`.
- * - Override the @View definition, see `setInlineTemplate`.
- *
- * @param component
- * @returns {ViewDefinition}
- */
- MockViewResolver.prototype.resolve = function (component) {
- var view = this._viewCache.get(component);
- if (lang_1.isPresent(view))
- return view;
- view = this._views.get(component);
- if (lang_1.isBlank(view)) {
- view = _super.prototype.resolve.call(this, component);
- }
- var directives = view.directives;
- var overrides = this._directiveOverrides.get(component);
- if (lang_1.isPresent(overrides) && lang_1.isPresent(directives)) {
- directives = collection_1.ListWrapper.clone(view.directives);
- overrides.forEach(function (to, from) {
- var srcIndex = directives.indexOf(from);
- if (srcIndex == -1) {
- throw new exceptions_1.BaseException("Overriden directive " + lang_1.stringify(from) + " not found in the template of " + lang_1.stringify(component));
- }
- directives[srcIndex] = to;
- });
- view = new metadata_1.ViewMetadata({ template: view.template, templateUrl: view.templateUrl, directives: directives });
- }
- var inlineTemplate = this._inlineTemplates.get(component);
- if (lang_1.isPresent(inlineTemplate)) {
- view = new metadata_1.ViewMetadata({ template: inlineTemplate, templateUrl: null, directives: view.directives });
- }
- this._viewCache.set(component, view);
- return view;
- };
- /**
- * @internal
- *
- * Once a component has been compiled, the AppProtoView is stored in the compiler cache.
- *
- * Then it should not be possible to override the component configuration after the component
- * has been compiled.
- *
- * @param {Type} component
- */
- MockViewResolver.prototype._checkOverrideable = function (component) {
- var cached = this._viewCache.get(component);
- if (lang_1.isPresent(cached)) {
- throw new exceptions_1.BaseException("The component " + lang_1.stringify(component) + " has already been compiled, its configuration can not be changed");
- }
- };
- MockViewResolver = __decorate([
- di_1.Injectable(),
- __metadata('design:paramtypes', [])
- ], MockViewResolver);
- return MockViewResolver;
- })(view_resolver_1.ViewResolver);
- exports.MockViewResolver = MockViewResolver;
- /***/ },
- /* 265 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var di_1 = __webpack_require__(6);
- var async_1 = __webpack_require__(60);
- var location_strategy_1 = __webpack_require__(238);
- /**
- * A mock implementation of {@link LocationStrategy} that allows tests to fire simulated
- * location events.
- */
- var MockLocationStrategy = (function (_super) {
- __extends(MockLocationStrategy, _super);
- function MockLocationStrategy() {
- _super.call(this);
- this.internalBaseHref = '/';
- this.internalPath = '/';
- this.internalTitle = '';
- this.urlChanges = [];
- /** @internal */
- this._subject = new async_1.EventEmitter();
- }
- MockLocationStrategy.prototype.simulatePopState = function (url) {
- this.internalPath = url;
- async_1.ObservableWrapper.callEmit(this._subject, new _MockPopStateEvent(this.path()));
- };
- MockLocationStrategy.prototype.path = function () { return this.internalPath; };
- MockLocationStrategy.prototype.prepareExternalUrl = function (internal) {
- if (internal.startsWith('/') && this.internalBaseHref.endsWith('/')) {
- return this.internalBaseHref + internal.substring(1);
- }
- return this.internalBaseHref + internal;
- };
- MockLocationStrategy.prototype.pushState = function (ctx, title, path, query) {
- this.internalTitle = title;
- var url = path + (query.length > 0 ? ('?' + query) : '');
- this.internalPath = url;
- var externalUrl = this.prepareExternalUrl(url);
- this.urlChanges.push(externalUrl);
- };
- MockLocationStrategy.prototype.replaceState = function (ctx, title, path, query) {
- this.internalTitle = title;
- var url = path + (query.length > 0 ? ('?' + query) : '');
- this.internalPath = url;
- var externalUrl = this.prepareExternalUrl(url);
- this.urlChanges.push('replace: ' + externalUrl);
- };
- MockLocationStrategy.prototype.onPopState = function (fn) { async_1.ObservableWrapper.subscribe(this._subject, fn); };
- MockLocationStrategy.prototype.getBaseHref = function () { return this.internalBaseHref; };
- MockLocationStrategy.prototype.back = function () {
- if (this.urlChanges.length > 0) {
- this.urlChanges.pop();
- var nextUrl = this.urlChanges.length > 0 ? this.urlChanges[this.urlChanges.length - 1] : '';
- this.simulatePopState(nextUrl);
- }
- };
- MockLocationStrategy.prototype.forward = function () { throw 'not implemented'; };
- MockLocationStrategy = __decorate([
- di_1.Injectable(),
- __metadata('design:paramtypes', [])
- ], MockLocationStrategy);
- return MockLocationStrategy;
- })(location_strategy_1.LocationStrategy);
- exports.MockLocationStrategy = MockLocationStrategy;
- var _MockPopStateEvent = (function () {
- function _MockPopStateEvent(newUrl) {
- this.newUrl = newUrl;
- this.pop = true;
- this.type = 'popstate';
- }
- return _MockPopStateEvent;
- })();
- /***/ },
- /* 266 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var di_1 = __webpack_require__(6);
- var ng_zone_1 = __webpack_require__(66);
- var async_1 = __webpack_require__(60);
- /**
- * A mock implementation of {@link NgZone}.
- */
- var MockNgZone = (function (_super) {
- __extends(MockNgZone, _super);
- function MockNgZone() {
- _super.call(this, { enableLongStackTrace: false });
- this._mockOnEventDone = new async_1.EventEmitter(false);
- }
- Object.defineProperty(MockNgZone.prototype, "onEventDone", {
- get: function () { return this._mockOnEventDone; },
- enumerable: true,
- configurable: true
- });
- MockNgZone.prototype.run = function (fn) { return fn(); };
- MockNgZone.prototype.runOutsideAngular = function (fn) { return fn(); };
- MockNgZone.prototype.simulateZoneExit = function () { async_1.ObservableWrapper.callNext(this.onEventDone, null); };
- MockNgZone = __decorate([
- di_1.Injectable(),
- __metadata('design:paramtypes', [])
- ], MockNgZone);
- return MockNgZone;
- })(ng_zone_1.NgZone);
- exports.MockNgZone = MockNgZone;
- /***/ },
- /* 267 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var core_1 = __webpack_require__(2);
- var lang_1 = __webpack_require__(5);
- var collection_1 = __webpack_require__(12);
- var view_ref_1 = __webpack_require__(77);
- var utils_1 = __webpack_require__(268);
- var dom_tokens_1 = __webpack_require__(187);
- var dom_adapter_1 = __webpack_require__(178);
- var debug_element_1 = __webpack_require__(101);
- /**
- * Fixture for debugging and testing a component.
- */
- var ComponentFixture = (function () {
- function ComponentFixture() {
- }
- return ComponentFixture;
- })();
- exports.ComponentFixture = ComponentFixture;
- var ComponentFixture_ = (function (_super) {
- __extends(ComponentFixture_, _super);
- function ComponentFixture_(componentRef) {
- _super.call(this);
- this.debugElement = new debug_element_1.DebugElement_(view_ref_1.internalView(componentRef.hostView), 0);
- this.componentInstance = this.debugElement.componentInstance;
- this.nativeElement = this.debugElement.nativeElement;
- this._componentParentView = view_ref_1.internalView(componentRef.hostView);
- this._componentRef = componentRef;
- }
- ComponentFixture_.prototype.detectChanges = function () {
- this._componentParentView.changeDetector.detectChanges();
- this._componentParentView.changeDetector.checkNoChanges();
- };
- ComponentFixture_.prototype.destroy = function () { this._componentRef.dispose(); };
- return ComponentFixture_;
- })(ComponentFixture);
- exports.ComponentFixture_ = ComponentFixture_;
- var _nextRootElementId = 0;
- /**
- * Builds a ComponentFixture for use in component level tests.
- */
- var TestComponentBuilder = (function () {
- function TestComponentBuilder(_injector) {
- this._injector = _injector;
- /** @internal */
- this._bindingsOverrides = new Map();
- /** @internal */
- this._directiveOverrides = new Map();
- /** @internal */
- this._templateOverrides = new Map();
- /** @internal */
- this._viewBindingsOverrides = new Map();
- /** @internal */
- this._viewOverrides = new Map();
- }
- /** @internal */
- TestComponentBuilder.prototype._clone = function () {
- var clone = new TestComponentBuilder(this._injector);
- clone._viewOverrides = collection_1.MapWrapper.clone(this._viewOverrides);
- clone._directiveOverrides = collection_1.MapWrapper.clone(this._directiveOverrides);
- clone._templateOverrides = collection_1.MapWrapper.clone(this._templateOverrides);
- return clone;
- };
- /**
- * Overrides only the html of a {@link ComponentMetadata}.
- * All the other properties of the component's {@link ViewMetadata} are preserved.
- *
- * @param {Type} component
- * @param {string} html
- *
- * @return {TestComponentBuilder}
- */
- TestComponentBuilder.prototype.overrideTemplate = function (componentType, template) {
- var clone = this._clone();
- clone._templateOverrides.set(componentType, template);
- return clone;
- };
- /**
- * Overrides a component's {@link ViewMetadata}.
- *
- * @param {Type} component
- * @param {view} View
- *
- * @return {TestComponentBuilder}
- */
- TestComponentBuilder.prototype.overrideView = function (componentType, view) {
- var clone = this._clone();
- clone._viewOverrides.set(componentType, view);
- return clone;
- };
- /**
- * Overrides the directives from the component {@link ViewMetadata}.
- *
- * @param {Type} component
- * @param {Type} from
- * @param {Type} to
- *
- * @return {TestComponentBuilder}
- */
- TestComponentBuilder.prototype.overrideDirective = function (componentType, from, to) {
- var clone = this._clone();
- var overridesForComponent = clone._directiveOverrides.get(componentType);
- if (!lang_1.isPresent(overridesForComponent)) {
- clone._directiveOverrides.set(componentType, new Map());
- overridesForComponent = clone._directiveOverrides.get(componentType);
- }
- overridesForComponent.set(from, to);
- return clone;
- };
- /**
- * Overrides one or more injectables configured via `providers` metadata property of a directive
- * or
- * component.
- * Very useful when certain providers need to be mocked out.
- *
- * The providers specified via this method are appended to the existing `providers` causing the
- * duplicated providers to
- * be overridden.
- *
- * @param {Type} component
- * @param {any[]} providers
- *
- * @return {TestComponentBuilder}
- */
- TestComponentBuilder.prototype.overrideProviders = function (type, providers) {
- var clone = this._clone();
- clone._bindingsOverrides.set(type, providers);
- return clone;
- };
- /**
- * @deprecated
- */
- TestComponentBuilder.prototype.overrideBindings = function (type, providers) {
- return this.overrideProviders(type, providers);
- };
- /**
- * Overrides one or more injectables configured via `providers` metadata property of a directive
- * or
- * component.
- * Very useful when certain providers need to be mocked out.
- *
- * The providers specified via this method are appended to the existing `providers` causing the
- * duplicated providers to
- * be overridden.
- *
- * @param {Type} component
- * @param {any[]} providers
- *
- * @return {TestComponentBuilder}
- */
- TestComponentBuilder.prototype.overrideViewProviders = function (type, providers) {
- var clone = this._clone();
- clone._viewBindingsOverrides.set(type, providers);
- return clone;
- };
- /**
- * @deprecated
- */
- TestComponentBuilder.prototype.overrideViewBindings = function (type, providers) {
- return this.overrideViewProviders(type, providers);
- };
- /**
- * Builds and returns a ComponentFixture.
- *
- * @return {Promise<ComponentFixture>}
- */
- TestComponentBuilder.prototype.createAsync = function (rootComponentType) {
- var mockDirectiveResolver = this._injector.get(core_1.DirectiveResolver);
- var mockViewResolver = this._injector.get(core_1.ViewResolver);
- this._viewOverrides.forEach(function (view, type) { return mockViewResolver.setView(type, view); });
- this._templateOverrides.forEach(function (template, type) {
- return mockViewResolver.setInlineTemplate(type, template);
- });
- this._directiveOverrides.forEach(function (overrides, component) {
- overrides.forEach(function (to, from) { mockViewResolver.overrideViewDirective(component, from, to); });
- });
- this._bindingsOverrides.forEach(function (bindings, type) {
- return mockDirectiveResolver.setBindingsOverride(type, bindings);
- });
- this._viewBindingsOverrides.forEach(function (bindings, type) { return mockDirectiveResolver.setViewBindingsOverride(type, bindings); });
- var rootElId = "root" + _nextRootElementId++;
- var rootEl = utils_1.el("<div id=\"" + rootElId + "\"></div>");
- var doc = this._injector.get(dom_tokens_1.DOCUMENT);
- // TODO(juliemr): can/should this be optional?
- var oldRoots = dom_adapter_1.DOM.querySelectorAll(doc, '[id^=root]');
- for (var i = 0; i < oldRoots.length; i++) {
- dom_adapter_1.DOM.remove(oldRoots[i]);
- }
- dom_adapter_1.DOM.appendChild(doc.body, rootEl);
- return this._injector.get(core_1.DynamicComponentLoader)
- .loadAsRoot(rootComponentType, "#" + rootElId, this._injector)
- .then(function (componentRef) { return new ComponentFixture_(componentRef); });
- };
- TestComponentBuilder = __decorate([
- core_1.Injectable(),
- __metadata('design:paramtypes', [core_1.Injector])
- ], TestComponentBuilder);
- return TestComponentBuilder;
- })();
- exports.TestComponentBuilder = TestComponentBuilder;
- /***/ },
- /* 268 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var core_1 = __webpack_require__(2);
- var collection_1 = __webpack_require__(12);
- var dom_adapter_1 = __webpack_require__(178);
- var lang_1 = __webpack_require__(5);
- var Log = (function () {
- function Log() {
- this._result = [];
- }
- Log.prototype.add = function (value) { this._result.push(value); };
- Log.prototype.fn = function (value) {
- var _this = this;
- return function (a1, a2, a3, a4, a5) {
- if (a1 === void 0) { a1 = null; }
- if (a2 === void 0) { a2 = null; }
- if (a3 === void 0) { a3 = null; }
- if (a4 === void 0) { a4 = null; }
- if (a5 === void 0) { a5 = null; }
- _this._result.push(value);
- };
- };
- Log.prototype.clear = function () { this._result = []; };
- Log.prototype.result = function () { return this._result.join("; "); };
- Log = __decorate([
- core_1.Injectable(),
- __metadata('design:paramtypes', [])
- ], Log);
- return Log;
- })();
- exports.Log = Log;
- var BrowserDetection = (function () {
- function BrowserDetection(ua) {
- if (lang_1.isPresent(ua)) {
- this._ua = ua;
- }
- else {
- this._ua = lang_1.isPresent(dom_adapter_1.DOM) ? dom_adapter_1.DOM.getUserAgent() : '';
- }
- }
- Object.defineProperty(BrowserDetection.prototype, "isFirefox", {
- get: function () { return this._ua.indexOf('Firefox') > -1; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(BrowserDetection.prototype, "isAndroid", {
- get: function () {
- return this._ua.indexOf('Mozilla/5.0') > -1 && this._ua.indexOf('Android') > -1 &&
- this._ua.indexOf('AppleWebKit') > -1 && this._ua.indexOf('Chrome') == -1;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(BrowserDetection.prototype, "isEdge", {
- get: function () { return this._ua.indexOf('Edge') > -1; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(BrowserDetection.prototype, "isIE", {
- get: function () { return this._ua.indexOf('Trident') > -1; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(BrowserDetection.prototype, "isWebkit", {
- get: function () {
- return this._ua.indexOf('AppleWebKit') > -1 && this._ua.indexOf('Edge') == -1;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(BrowserDetection.prototype, "isIOS7", {
- get: function () {
- return this._ua.indexOf('iPhone OS 7') > -1 || this._ua.indexOf('iPad OS 7') > -1;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(BrowserDetection.prototype, "isSlow", {
- get: function () { return this.isAndroid || this.isIE || this.isIOS7; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(BrowserDetection.prototype, "supportsIntlApi", {
- // The Intl API is only properly supported in recent Chrome and Opera.
- // Note: Edge is disguised as Chrome 42, so checking the "Edge" part is needed,
- // see https://msdn.microsoft.com/en-us/library/hh869301(v=vs.85).aspx
- get: function () {
- return this._ua.indexOf('Chrome/4') > -1 && this._ua.indexOf('Edge') == -1;
- },
- enumerable: true,
- configurable: true
- });
- return BrowserDetection;
- })();
- exports.BrowserDetection = BrowserDetection;
- exports.browserDetection = new BrowserDetection(null);
- function dispatchEvent(element, eventType) {
- dom_adapter_1.DOM.dispatchEvent(element, dom_adapter_1.DOM.createEvent(eventType));
- }
- exports.dispatchEvent = dispatchEvent;
- function el(html) {
- return dom_adapter_1.DOM.firstChild(dom_adapter_1.DOM.content(dom_adapter_1.DOM.createTemplate(html)));
- }
- exports.el = el;
- var _RE_SPECIAL_CHARS = ['-', '[', ']', '/', '{', '}', '\\', '(', ')', '*', '+', '?', '.', '^', '$', '|'];
- var _ESCAPE_RE = lang_1.RegExpWrapper.create("[\\" + _RE_SPECIAL_CHARS.join('\\') + "]");
- function containsRegexp(input) {
- return lang_1.RegExpWrapper.create(lang_1.StringWrapper.replaceAllMapped(input, _ESCAPE_RE, function (match) { return ("\\" + match[0]); }));
- }
- exports.containsRegexp = containsRegexp;
- function normalizeCSS(css) {
- css = lang_1.StringWrapper.replaceAll(css, /\s+/g, ' ');
- css = lang_1.StringWrapper.replaceAll(css, /:\s/g, ':');
- css = lang_1.StringWrapper.replaceAll(css, /'/g, '"');
- css = lang_1.StringWrapper.replaceAll(css, / }/g, '}');
- css = lang_1.StringWrapper.replaceAllMapped(css, /url\((\"|\s)(.+)(\"|\s)\)(\s*)/g, function (match) { return ("url(\"" + match[2] + "\")"); });
- css = lang_1.StringWrapper.replaceAllMapped(css, /\[(.+)=([^"\]]+)\]/g, function (match) { return ("[" + match[1] + "=\"" + match[2] + "\"]"); });
- return css;
- }
- exports.normalizeCSS = normalizeCSS;
- var _singleTagWhitelist = ['br', 'hr', 'input'];
- function stringifyElement(el) {
- var result = '';
- if (dom_adapter_1.DOM.isElementNode(el)) {
- var tagName = dom_adapter_1.DOM.tagName(el).toLowerCase();
- // Opening tag
- result += "<" + tagName;
- // Attributes in an ordered way
- var attributeMap = dom_adapter_1.DOM.attributeMap(el);
- var keys = [];
- attributeMap.forEach(function (v, k) { return keys.push(k); });
- collection_1.ListWrapper.sort(keys);
- for (var i = 0; i < keys.length; i++) {
- var key = keys[i];
- var attValue = attributeMap.get(key);
- if (!lang_1.isString(attValue)) {
- result += " " + key;
- }
- else {
- result += " " + key + "=\"" + attValue + "\"";
- }
- }
- result += '>';
- // Children
- var childrenRoot = dom_adapter_1.DOM.templateAwareRoot(el);
- var children = lang_1.isPresent(childrenRoot) ? dom_adapter_1.DOM.childNodes(childrenRoot) : [];
- for (var j = 0; j < children.length; j++) {
- result += stringifyElement(children[j]);
- }
- // Closing tag
- if (!collection_1.ListWrapper.contains(_singleTagWhitelist, tagName)) {
- result += "</" + tagName + ">";
- }
- }
- else if (dom_adapter_1.DOM.isCommentNode(el)) {
- result += "<!--" + dom_adapter_1.DOM.nodeValue(el) + "-->";
- }
- else {
- result += dom_adapter_1.DOM.getText(el);
- }
- return result;
- }
- exports.stringifyElement = stringifyElement;
- /***/ },
- /* 269 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var collection_1 = __webpack_require__(12);
- var api_1 = __webpack_require__(72);
- var api_2 = __webpack_require__(270);
- var di_1 = __webpack_require__(6);
- var render_proto_view_ref_store_1 = __webpack_require__(271);
- var render_view_with_fragments_store_1 = __webpack_require__(272);
- var view_1 = __webpack_require__(56);
- // PRIMITIVE is any type that does not need to be serialized (string, number, boolean)
- // We set it to String so that it is considered a Type.
- exports.PRIMITIVE = String;
- var Serializer = (function () {
- function Serializer(_protoViewStore, _renderViewStore) {
- this._protoViewStore = _protoViewStore;
- this._renderViewStore = _renderViewStore;
- }
- Serializer.prototype.serialize = function (obj, type) {
- var _this = this;
- if (!lang_1.isPresent(obj)) {
- return null;
- }
- if (lang_1.isArray(obj)) {
- return obj.map(function (v) { return _this.serialize(v, type); });
- }
- if (type == exports.PRIMITIVE) {
- return obj;
- }
- if (type == api_1.RenderProtoViewRef) {
- return this._protoViewStore.serialize(obj);
- }
- else if (type == api_1.RenderViewRef) {
- return this._renderViewStore.serializeRenderViewRef(obj);
- }
- else if (type == api_1.RenderFragmentRef) {
- return this._renderViewStore.serializeRenderFragmentRef(obj);
- }
- else if (type == api_2.WebWorkerElementRef) {
- return this._serializeWorkerElementRef(obj);
- }
- else if (type == api_2.WebWorkerTemplateCmd) {
- return serializeTemplateCmd(obj);
- }
- else if (type === api_1.RenderComponentTemplate) {
- return this._serializeRenderTemplate(obj);
- }
- else if (type === view_1.ViewEncapsulation) {
- return lang_1.serializeEnum(obj);
- }
- else {
- throw new exceptions_1.BaseException("No serializer for " + type.toString());
- }
- };
- Serializer.prototype.deserialize = function (map, type, data) {
- var _this = this;
- if (!lang_1.isPresent(map)) {
- return null;
- }
- if (lang_1.isArray(map)) {
- var obj = [];
- map.forEach(function (val) { return obj.push(_this.deserialize(val, type, data)); });
- return obj;
- }
- if (type == exports.PRIMITIVE) {
- return map;
- }
- if (type == api_1.RenderProtoViewRef) {
- return this._protoViewStore.deserialize(map);
- }
- else if (type == api_1.RenderViewRef) {
- return this._renderViewStore.deserializeRenderViewRef(map);
- }
- else if (type == api_1.RenderFragmentRef) {
- return this._renderViewStore.deserializeRenderFragmentRef(map);
- }
- else if (type == api_2.WebWorkerElementRef) {
- return this._deserializeWorkerElementRef(map);
- }
- else if (type == api_2.WebWorkerTemplateCmd) {
- return deserializeTemplateCmd(map);
- }
- else if (type === api_1.RenderComponentTemplate) {
- return this._deserializeRenderTemplate(map);
- }
- else if (type === view_1.ViewEncapsulation) {
- return view_1.VIEW_ENCAPSULATION_VALUES[map];
- }
- else {
- throw new exceptions_1.BaseException("No deserializer for " + type.toString());
- }
- };
- Serializer.prototype.mapToObject = function (map, type) {
- var _this = this;
- var object = {};
- var serialize = lang_1.isPresent(type);
- map.forEach(function (value, key) {
- if (serialize) {
- object[key] = _this.serialize(value, type);
- }
- else {
- object[key] = value;
- }
- });
- return object;
- };
- /*
- * Transforms a Javascript object (StringMap) into a Map<string, V>
- * If the values need to be deserialized pass in their type
- * and they will be deserialized before being placed in the map
- */
- Serializer.prototype.objectToMap = function (obj, type, data) {
- var _this = this;
- if (lang_1.isPresent(type)) {
- var map = new collection_1.Map();
- collection_1.StringMapWrapper.forEach(obj, function (val, key) { map.set(key, _this.deserialize(val, type, data)); });
- return map;
- }
- else {
- return collection_1.MapWrapper.createFromStringMap(obj);
- }
- };
- Serializer.prototype.allocateRenderViews = function (fragmentCount) { this._renderViewStore.allocate(fragmentCount); };
- Serializer.prototype._serializeWorkerElementRef = function (elementRef) {
- return {
- 'renderView': this.serialize(elementRef.renderView, api_1.RenderViewRef),
- 'boundElementIndex': elementRef.boundElementIndex
- };
- };
- Serializer.prototype._deserializeWorkerElementRef = function (map) {
- return new api_2.WebWorkerElementRef(this.deserialize(map['renderView'], api_1.RenderViewRef), map['boundElementIndex']);
- };
- Serializer.prototype._serializeRenderTemplate = function (obj) {
- return {
- 'id': obj.id,
- 'shortId': obj.shortId,
- 'encapsulation': this.serialize(obj.encapsulation, view_1.ViewEncapsulation),
- 'commands': this.serialize(obj.commands, api_2.WebWorkerTemplateCmd),
- 'styles': this.serialize(obj.styles, exports.PRIMITIVE)
- };
- };
- Serializer.prototype._deserializeRenderTemplate = function (map) {
- return new api_1.RenderComponentTemplate(map['id'], map['shortId'], this.deserialize(map['encapsulation'], view_1.ViewEncapsulation), this.deserialize(map['commands'], api_2.WebWorkerTemplateCmd), this.deserialize(map['styles'], exports.PRIMITIVE));
- };
- Serializer = __decorate([
- di_1.Injectable(),
- __metadata('design:paramtypes', [render_proto_view_ref_store_1.RenderProtoViewRefStore, render_view_with_fragments_store_1.RenderViewWithFragmentsStore])
- ], Serializer);
- return Serializer;
- })();
- exports.Serializer = Serializer;
- function serializeTemplateCmd(cmd) {
- return cmd.visit(RENDER_TEMPLATE_CMD_SERIALIZER, null);
- }
- function deserializeTemplateCmd(data) {
- return RENDER_TEMPLATE_CMD_DESERIALIZERS[data['deserializerIndex']](data);
- }
- var RenderTemplateCmdSerializer = (function () {
- function RenderTemplateCmdSerializer() {
- }
- RenderTemplateCmdSerializer.prototype.visitText = function (cmd, context) {
- return {
- 'deserializerIndex': 0,
- 'isBound': cmd.isBound,
- 'ngContentIndex': cmd.ngContentIndex,
- 'value': cmd.value
- };
- };
- RenderTemplateCmdSerializer.prototype.visitNgContent = function (cmd, context) {
- return { 'deserializerIndex': 1, 'index': cmd.index, 'ngContentIndex': cmd.ngContentIndex };
- };
- RenderTemplateCmdSerializer.prototype.visitBeginElement = function (cmd, context) {
- return {
- 'deserializerIndex': 2,
- 'isBound': cmd.isBound,
- 'ngContentIndex': cmd.ngContentIndex,
- 'name': cmd.name,
- 'attrNameAndValues': cmd.attrNameAndValues,
- 'eventTargetAndNames': cmd.eventTargetAndNames
- };
- };
- RenderTemplateCmdSerializer.prototype.visitEndElement = function (context) { return { 'deserializerIndex': 3 }; };
- RenderTemplateCmdSerializer.prototype.visitBeginComponent = function (cmd, context) {
- return {
- 'deserializerIndex': 4,
- 'isBound': cmd.isBound,
- 'ngContentIndex': cmd.ngContentIndex,
- 'name': cmd.name,
- 'attrNameAndValues': cmd.attrNameAndValues,
- 'eventTargetAndNames': cmd.eventTargetAndNames,
- 'templateId': cmd.templateId
- };
- };
- RenderTemplateCmdSerializer.prototype.visitEndComponent = function (context) { return { 'deserializerIndex': 5 }; };
- RenderTemplateCmdSerializer.prototype.visitEmbeddedTemplate = function (cmd, context) {
- var _this = this;
- var children = cmd.children.map(function (child) { return child.visit(_this, null); });
- return {
- 'deserializerIndex': 6,
- 'isBound': cmd.isBound,
- 'ngContentIndex': cmd.ngContentIndex,
- 'name': cmd.name,
- 'attrNameAndValues': cmd.attrNameAndValues,
- 'eventTargetAndNames': cmd.eventTargetAndNames,
- 'isMerged': cmd.isMerged,
- 'children': children
- };
- };
- return RenderTemplateCmdSerializer;
- })();
- var RENDER_TEMPLATE_CMD_SERIALIZER = new RenderTemplateCmdSerializer();
- var RENDER_TEMPLATE_CMD_DESERIALIZERS = [
- function (data) {
- return new api_2.WebWorkerTextCmd(data['isBound'], data['ngContentIndex'], data['value']);
- },
- function (data) { return new api_2.WebWorkerNgContentCmd(data['index'], data['ngContentIndex']); },
- function (data) {
- return new api_2.WebWorkerBeginElementCmd(data['isBound'], data['ngContentIndex'], data['name'], data['attrNameAndValues'], data['eventTargetAndNames']);
- },
- function (data) { return new api_2.WebWorkerEndElementCmd(); },
- function (data) { return new api_2.WebWorkerBeginComponentCmd(data['isBound'], data['ngContentIndex'], data['name'], data['attrNameAndValues'], data['eventTargetAndNames'], data['templateId']); },
- function (data) { return new api_2.WebWorkerEndComponentCmd(); },
- function (data) { return new api_2.WebWorkerEmbeddedTemplateCmd(data['isBound'], data['ngContentIndex'], data['name'], data['attrNameAndValues'], data['eventTargetAndNames'], data['isMerged'], data['children'].map(function (childData) { return deserializeTemplateCmd(childData); })); },
- ];
- /***/ },
- /* 270 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var di_1 = __webpack_require__(6);
- exports.ON_WEB_WORKER = lang_1.CONST_EXPR(new di_1.OpaqueToken('WebWorker.onWebWorker'));
- var WebWorkerElementRef = (function () {
- function WebWorkerElementRef(renderView, boundElementIndex) {
- this.renderView = renderView;
- this.boundElementIndex = boundElementIndex;
- }
- return WebWorkerElementRef;
- })();
- exports.WebWorkerElementRef = WebWorkerElementRef;
- var WebWorkerTemplateCmd = (function () {
- function WebWorkerTemplateCmd() {
- }
- WebWorkerTemplateCmd.prototype.visit = function (visitor, context) { return null; };
- return WebWorkerTemplateCmd;
- })();
- exports.WebWorkerTemplateCmd = WebWorkerTemplateCmd;
- var WebWorkerTextCmd = (function () {
- function WebWorkerTextCmd(isBound, ngContentIndex, value) {
- this.isBound = isBound;
- this.ngContentIndex = ngContentIndex;
- this.value = value;
- }
- WebWorkerTextCmd.prototype.visit = function (visitor, context) {
- return visitor.visitText(this, context);
- };
- return WebWorkerTextCmd;
- })();
- exports.WebWorkerTextCmd = WebWorkerTextCmd;
- var WebWorkerNgContentCmd = (function () {
- function WebWorkerNgContentCmd(index, ngContentIndex) {
- this.index = index;
- this.ngContentIndex = ngContentIndex;
- }
- WebWorkerNgContentCmd.prototype.visit = function (visitor, context) {
- return visitor.visitNgContent(this, context);
- };
- return WebWorkerNgContentCmd;
- })();
- exports.WebWorkerNgContentCmd = WebWorkerNgContentCmd;
- var WebWorkerBeginElementCmd = (function () {
- function WebWorkerBeginElementCmd(isBound, ngContentIndex, name, attrNameAndValues, eventTargetAndNames) {
- this.isBound = isBound;
- this.ngContentIndex = ngContentIndex;
- this.name = name;
- this.attrNameAndValues = attrNameAndValues;
- this.eventTargetAndNames = eventTargetAndNames;
- }
- WebWorkerBeginElementCmd.prototype.visit = function (visitor, context) {
- return visitor.visitBeginElement(this, context);
- };
- return WebWorkerBeginElementCmd;
- })();
- exports.WebWorkerBeginElementCmd = WebWorkerBeginElementCmd;
- var WebWorkerEndElementCmd = (function () {
- function WebWorkerEndElementCmd() {
- }
- WebWorkerEndElementCmd.prototype.visit = function (visitor, context) {
- return visitor.visitEndElement(context);
- };
- return WebWorkerEndElementCmd;
- })();
- exports.WebWorkerEndElementCmd = WebWorkerEndElementCmd;
- var WebWorkerBeginComponentCmd = (function () {
- function WebWorkerBeginComponentCmd(isBound, ngContentIndex, name, attrNameAndValues, eventTargetAndNames, templateId) {
- this.isBound = isBound;
- this.ngContentIndex = ngContentIndex;
- this.name = name;
- this.attrNameAndValues = attrNameAndValues;
- this.eventTargetAndNames = eventTargetAndNames;
- this.templateId = templateId;
- }
- WebWorkerBeginComponentCmd.prototype.visit = function (visitor, context) {
- return visitor.visitBeginComponent(this, context);
- };
- return WebWorkerBeginComponentCmd;
- })();
- exports.WebWorkerBeginComponentCmd = WebWorkerBeginComponentCmd;
- var WebWorkerEndComponentCmd = (function () {
- function WebWorkerEndComponentCmd() {
- }
- WebWorkerEndComponentCmd.prototype.visit = function (visitor, context) {
- return visitor.visitEndComponent(context);
- };
- return WebWorkerEndComponentCmd;
- })();
- exports.WebWorkerEndComponentCmd = WebWorkerEndComponentCmd;
- var WebWorkerEmbeddedTemplateCmd = (function () {
- function WebWorkerEmbeddedTemplateCmd(isBound, ngContentIndex, name, attrNameAndValues, eventTargetAndNames, isMerged, children) {
- this.isBound = isBound;
- this.ngContentIndex = ngContentIndex;
- this.name = name;
- this.attrNameAndValues = attrNameAndValues;
- this.eventTargetAndNames = eventTargetAndNames;
- this.isMerged = isMerged;
- this.children = children;
- }
- WebWorkerEmbeddedTemplateCmd.prototype.visit = function (visitor, context) {
- return visitor.visitEmbeddedTemplate(this, context);
- };
- return WebWorkerEmbeddedTemplateCmd;
- })();
- exports.WebWorkerEmbeddedTemplateCmd = WebWorkerEmbeddedTemplateCmd;
- /***/ },
- /* 271 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var __param = (this && this.__param) || function (paramIndex, decorator) {
- return function (target, key) { decorator(target, key, paramIndex); }
- };
- var di_1 = __webpack_require__(6);
- var api_1 = __webpack_require__(72);
- var api_2 = __webpack_require__(270);
- var RenderProtoViewRefStore = (function () {
- function RenderProtoViewRefStore(onWebworker) {
- this._lookupByIndex = new Map();
- this._lookupByProtoView = new Map();
- this._nextIndex = 0;
- this._onWebworker = onWebworker;
- }
- RenderProtoViewRefStore.prototype.allocate = function () {
- var index = this._nextIndex++;
- var result = new WebWorkerRenderProtoViewRef(index);
- this.store(result, index);
- return result;
- };
- RenderProtoViewRefStore.prototype.store = function (ref, index) {
- this._lookupByProtoView.set(ref, index);
- this._lookupByIndex.set(index, ref);
- };
- RenderProtoViewRefStore.prototype.deserialize = function (index) {
- if (index == null) {
- return null;
- }
- return this._lookupByIndex.get(index);
- };
- RenderProtoViewRefStore.prototype.serialize = function (ref) {
- if (ref == null) {
- return null;
- }
- if (this._onWebworker) {
- return ref.refNumber;
- }
- else {
- return this._lookupByProtoView.get(ref);
- }
- };
- RenderProtoViewRefStore = __decorate([
- di_1.Injectable(),
- __param(0, di_1.Inject(api_2.ON_WEB_WORKER)),
- __metadata('design:paramtypes', [Object])
- ], RenderProtoViewRefStore);
- return RenderProtoViewRefStore;
- })();
- exports.RenderProtoViewRefStore = RenderProtoViewRefStore;
- var WebWorkerRenderProtoViewRef = (function (_super) {
- __extends(WebWorkerRenderProtoViewRef, _super);
- function WebWorkerRenderProtoViewRef(refNumber) {
- _super.call(this);
- this.refNumber = refNumber;
- }
- return WebWorkerRenderProtoViewRef;
- })(api_1.RenderProtoViewRef);
- exports.WebWorkerRenderProtoViewRef = WebWorkerRenderProtoViewRef;
- /***/ },
- /* 272 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var __param = (this && this.__param) || function (paramIndex, decorator) {
- return function (target, key) { decorator(target, key, paramIndex); }
- };
- var di_1 = __webpack_require__(6);
- var api_1 = __webpack_require__(72);
- var api_2 = __webpack_require__(270);
- var collection_1 = __webpack_require__(12);
- var RenderViewWithFragmentsStore = (function () {
- function RenderViewWithFragmentsStore(onWebWorker) {
- this._nextIndex = 0;
- this._onWebWorker = onWebWorker;
- this._lookupByIndex = new Map();
- this._lookupByView = new Map();
- this._viewFragments = new Map();
- }
- RenderViewWithFragmentsStore.prototype.allocate = function (fragmentCount) {
- var initialIndex = this._nextIndex;
- var viewRef = new WebWorkerRenderViewRef(this._nextIndex++);
- var fragmentRefs = collection_1.ListWrapper.createGrowableSize(fragmentCount);
- for (var i = 0; i < fragmentCount; i++) {
- fragmentRefs[i] = new WebWorkerRenderFragmentRef(this._nextIndex++);
- }
- var renderViewWithFragments = new api_1.RenderViewWithFragments(viewRef, fragmentRefs);
- this.store(renderViewWithFragments, initialIndex);
- return renderViewWithFragments;
- };
- RenderViewWithFragmentsStore.prototype.store = function (view, startIndex) {
- var _this = this;
- this._lookupByIndex.set(startIndex, view.viewRef);
- this._lookupByView.set(view.viewRef, startIndex);
- startIndex++;
- view.fragmentRefs.forEach(function (ref) {
- _this._lookupByIndex.set(startIndex, ref);
- _this._lookupByView.set(ref, startIndex);
- startIndex++;
- });
- this._viewFragments.set(view.viewRef, view.fragmentRefs);
- };
- RenderViewWithFragmentsStore.prototype.remove = function (view) {
- var _this = this;
- this._removeRef(view);
- var fragments = this._viewFragments.get(view);
- fragments.forEach(function (fragment) { _this._removeRef(fragment); });
- this._viewFragments.delete(view);
- };
- RenderViewWithFragmentsStore.prototype._removeRef = function (ref) {
- var index = this._lookupByView.get(ref);
- this._lookupByView.delete(ref);
- this._lookupByIndex.delete(index);
- };
- RenderViewWithFragmentsStore.prototype.serializeRenderViewRef = function (viewRef) {
- return this._serializeRenderFragmentOrViewRef(viewRef);
- };
- RenderViewWithFragmentsStore.prototype.serializeRenderFragmentRef = function (fragmentRef) {
- return this._serializeRenderFragmentOrViewRef(fragmentRef);
- };
- RenderViewWithFragmentsStore.prototype.deserializeRenderViewRef = function (ref) {
- if (ref == null) {
- return null;
- }
- return this._retrieve(ref);
- };
- RenderViewWithFragmentsStore.prototype.deserializeRenderFragmentRef = function (ref) {
- if (ref == null) {
- return null;
- }
- return this._retrieve(ref);
- };
- RenderViewWithFragmentsStore.prototype._retrieve = function (ref) {
- if (ref == null) {
- return null;
- }
- if (!this._lookupByIndex.has(ref)) {
- return null;
- }
- return this._lookupByIndex.get(ref);
- };
- RenderViewWithFragmentsStore.prototype._serializeRenderFragmentOrViewRef = function (ref) {
- if (ref == null) {
- return null;
- }
- if (this._onWebWorker) {
- return ref.serialize();
- }
- else {
- return this._lookupByView.get(ref);
- }
- };
- RenderViewWithFragmentsStore.prototype.serializeViewWithFragments = function (view) {
- var _this = this;
- if (view == null) {
- return null;
- }
- if (this._onWebWorker) {
- return {
- 'viewRef': view.viewRef.serialize(),
- 'fragmentRefs': view.fragmentRefs.map(function (val) { return val.serialize(); })
- };
- }
- else {
- return {
- 'viewRef': this._lookupByView.get(view.viewRef),
- 'fragmentRefs': view.fragmentRefs.map(function (val) { return _this._lookupByView.get(val); })
- };
- }
- };
- RenderViewWithFragmentsStore.prototype.deserializeViewWithFragments = function (obj) {
- var _this = this;
- if (obj == null) {
- return null;
- }
- var viewRef = this.deserializeRenderViewRef(obj['viewRef']);
- var fragments = obj['fragmentRefs'].map(function (val) { return _this.deserializeRenderFragmentRef(val); });
- return new api_1.RenderViewWithFragments(viewRef, fragments);
- };
- RenderViewWithFragmentsStore = __decorate([
- di_1.Injectable(),
- __param(0, di_1.Inject(api_2.ON_WEB_WORKER)),
- __metadata('design:paramtypes', [Object])
- ], RenderViewWithFragmentsStore);
- return RenderViewWithFragmentsStore;
- })();
- exports.RenderViewWithFragmentsStore = RenderViewWithFragmentsStore;
- var WebWorkerRenderViewRef = (function (_super) {
- __extends(WebWorkerRenderViewRef, _super);
- function WebWorkerRenderViewRef(refNumber) {
- _super.call(this);
- this.refNumber = refNumber;
- }
- WebWorkerRenderViewRef.prototype.serialize = function () { return this.refNumber; };
- WebWorkerRenderViewRef.deserialize = function (ref) {
- return new WebWorkerRenderViewRef(ref);
- };
- return WebWorkerRenderViewRef;
- })(api_1.RenderViewRef);
- exports.WebWorkerRenderViewRef = WebWorkerRenderViewRef;
- var WebWorkerRenderFragmentRef = (function (_super) {
- __extends(WebWorkerRenderFragmentRef, _super);
- function WebWorkerRenderFragmentRef(refNumber) {
- _super.call(this);
- this.refNumber = refNumber;
- }
- WebWorkerRenderFragmentRef.prototype.serialize = function () { return this.refNumber; };
- WebWorkerRenderFragmentRef.deserialize = function (ref) {
- return new WebWorkerRenderFragmentRef(ref);
- };
- return WebWorkerRenderFragmentRef;
- })(api_1.RenderFragmentRef);
- exports.WebWorkerRenderFragmentRef = WebWorkerRenderFragmentRef;
- /***/ },
- /* 273 */
- /***/ function(module, exports, __webpack_require__) {
- var dom_adapter_1 = __webpack_require__(178);
- var lang_1 = __webpack_require__(5);
- var collection_1 = __webpack_require__(12);
- var _global = (typeof window === 'undefined' ? lang_1.global : window);
- /**
- * Jasmine matching function with Angular matchers mixed in.
- *
- * ## Example
- *
- * {@example testing/ts/matchers.ts region='toHaveText'}
- */
- exports.expect = _global.expect;
- // Some Map polyfills don't polyfill Map.toString correctly, which
- // gives us bad error messages in tests.
- // The only way to do this in Jasmine is to monkey patch a method
- // to the object :-(
- Map.prototype['jasmineToString'] = function () {
- var m = this;
- if (!m) {
- return '' + m;
- }
- var res = [];
- m.forEach(function (v, k) { res.push(k + ":" + v); });
- return "{ " + res.join(',') + " }";
- };
- _global.beforeEach(function () {
- jasmine.addMatchers({
- // Custom handler for Map as Jasmine does not support it yet
- toEqual: function (util, customEqualityTesters) {
- return {
- compare: function (actual, expected) {
- return { pass: util.equals(actual, expected, [compareMap]) };
- }
- };
- function compareMap(actual, expected) {
- if (actual instanceof Map) {
- var pass = actual.size === expected.size;
- if (pass) {
- actual.forEach(function (v, k) { pass = pass && util.equals(v, expected.get(k)); });
- }
- return pass;
- }
- else {
- return undefined;
- }
- }
- },
- toBePromise: function () {
- return {
- compare: function (actual, expectedClass) {
- var pass = typeof actual === 'object' && typeof actual.then === 'function';
- return { pass: pass, get message() { return 'Expected ' + actual + ' to be a promise'; } };
- }
- };
- },
- toBeAnInstanceOf: function () {
- return {
- compare: function (actual, expectedClass) {
- var pass = typeof actual === 'object' && actual instanceof expectedClass;
- return {
- pass: pass,
- get message() {
- return 'Expected ' + actual + ' to be an instance of ' + expectedClass;
- }
- };
- }
- };
- },
- toHaveText: function () {
- return {
- compare: function (actual, expectedText) {
- var actualText = elementText(actual);
- return {
- pass: actualText == expectedText,
- get message() { return 'Expected ' + actualText + ' to be equal to ' + expectedText; }
- };
- }
- };
- },
- toHaveCssClass: function () {
- return { compare: buildError(false), negativeCompare: buildError(true) };
- function buildError(isNot) {
- return function (actual, className) {
- return {
- pass: dom_adapter_1.DOM.hasClass(actual, className) == !isNot,
- get message() {
- return "Expected " + actual.outerHTML + " " + (isNot ? 'not ' : '') + "to contain the CSS class \"" + className + "\"";
- }
- };
- };
- }
- },
- toHaveCssStyle: function () {
- return {
- compare: function (actual, styles) {
- var allPassed;
- if (lang_1.isString(styles)) {
- allPassed = dom_adapter_1.DOM.hasStyle(actual, styles);
- }
- else {
- allPassed = !collection_1.StringMapWrapper.isEmpty(styles);
- collection_1.StringMapWrapper.forEach(styles, function (style, prop) {
- allPassed = allPassed && dom_adapter_1.DOM.hasStyle(actual, prop, style);
- });
- }
- return {
- pass: allPassed,
- get message() {
- var expectedValueStr = lang_1.isString(styles) ? styles : JSON.stringify(styles);
- return "Expected " + actual.outerHTML + " " + (!allPassed ? ' ' : 'not ') + "to contain the\n CSS " + (lang_1.isString(styles) ? 'property' : 'styles') + " \"" + expectedValueStr + "\"";
- }
- };
- }
- };
- },
- toContainError: function () {
- return {
- compare: function (actual, expectedText) {
- var errorMessage = actual.toString();
- return {
- pass: errorMessage.indexOf(expectedText) > -1,
- get message() { return 'Expected ' + errorMessage + ' to contain ' + expectedText; }
- };
- }
- };
- },
- toThrowErrorWith: function () {
- return {
- compare: function (actual, expectedText) {
- try {
- actual();
- return {
- pass: false,
- get message() { return "Was expected to throw, but did not throw"; }
- };
- }
- catch (e) {
- var errorMessage = e.toString();
- return {
- pass: errorMessage.indexOf(expectedText) > -1,
- get message() { return 'Expected ' + errorMessage + ' to contain ' + expectedText; }
- };
- }
- }
- };
- },
- toImplement: function () {
- return {
- compare: function (actualObject, expectedInterface) {
- var objProps = Object.keys(actualObject.constructor.prototype);
- var intProps = Object.keys(expectedInterface.prototype);
- var missedMethods = [];
- intProps.forEach(function (k) {
- if (!actualObject.constructor.prototype[k])
- missedMethods.push(k);
- });
- return {
- pass: missedMethods.length == 0,
- get message() {
- return 'Expected ' + actualObject + ' to have the following methods: ' +
- missedMethods.join(", ");
- }
- };
- }
- };
- }
- });
- });
- function elementText(n) {
- var hasNodes = function (n) {
- var children = dom_adapter_1.DOM.childNodes(n);
- return children && children.length > 0;
- };
- if (n instanceof Array) {
- return n.map(elementText).join("");
- }
- if (dom_adapter_1.DOM.isCommentNode(n)) {
- return '';
- }
- if (dom_adapter_1.DOM.isElementNode(n) && dom_adapter_1.DOM.tagName(n) == 'CONTENT') {
- return elementText(Array.prototype.slice.apply(dom_adapter_1.DOM.getDistributedNodes(n)));
- }
- if (dom_adapter_1.DOM.hasShadowRoot(n)) {
- return elementText(dom_adapter_1.DOM.childNodesAsList(dom_adapter_1.DOM.getShadowRoot(n)));
- }
- if (hasNodes(n)) {
- return elementText(dom_adapter_1.DOM.childNodesAsList(n));
- }
- return dom_adapter_1.DOM.getText(n);
- }
- /***/ },
- /* 274 */
- /***/ function(module, exports, __webpack_require__) {
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var collection_1 = __webpack_require__(12);
- var _scheduler;
- var _microtasks = [];
- var _pendingPeriodicTimers = [];
- var _pendingTimers = [];
- /**
- * Wraps a function to be executed in the fakeAsync zone:
- * - microtasks are manually executed by calling `flushMicrotasks()`,
- * - timers are synchronous, `tick()` simulates the asynchronous passage of time.
- *
- * If there are any pending timers at the end of the function, an exception will be thrown.
- *
- * ## Example
- *
- * {@example testing/ts/fake_async.ts region='basic'}
- *
- * @param fn
- * @returns {Function} The function wrapped to be executed in the fakeAsync zone
- */
- function fakeAsync(fn) {
- if (lang_1.global.zone._inFakeAsyncZone) {
- throw new Error('fakeAsync() calls can not be nested');
- }
- var fakeAsyncZone = lang_1.global.zone.fork({
- setTimeout: _setTimeout,
- clearTimeout: _clearTimeout,
- setInterval: _setInterval,
- clearInterval: _clearInterval,
- scheduleMicrotask: _scheduleMicrotask,
- _inFakeAsyncZone: true
- });
- return function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i - 0] = arguments[_i];
- }
- // TODO(tbosch): This class should already be part of the jasmine typings but it is not...
- _scheduler = new jasmine.DelayedFunctionScheduler();
- clearPendingTimers();
- var res = fakeAsyncZone.run(function () {
- var res = fn.apply(void 0, args);
- flushMicrotasks();
- return res;
- });
- if (_pendingPeriodicTimers.length > 0) {
- throw new exceptions_1.BaseException(_pendingPeriodicTimers.length + " periodic timer(s) still in the queue.");
- }
- if (_pendingTimers.length > 0) {
- throw new exceptions_1.BaseException(_pendingTimers.length + " timer(s) still in the queue.");
- }
- _scheduler = null;
- collection_1.ListWrapper.clear(_microtasks);
- return res;
- };
- }
- exports.fakeAsync = fakeAsync;
- /**
- * Clear the queue of pending timers and microtasks.
- *
- * Useful for cleaning up after an asynchronous test passes.
- *
- * ## Example
- *
- * {@example testing/ts/fake_async.ts region='pending'}
- */
- function clearPendingTimers() {
- // TODO we should fix tick to dequeue the failed timer instead of relying on clearPendingTimers
- collection_1.ListWrapper.clear(_microtasks);
- collection_1.ListWrapper.clear(_pendingPeriodicTimers);
- collection_1.ListWrapper.clear(_pendingTimers);
- }
- exports.clearPendingTimers = clearPendingTimers;
- /**
- * Simulates the asynchronous passage of time for the timers in the fakeAsync zone.
- *
- * The microtasks queue is drained at the very start of this function and after any timer callback
- * has been executed.
- *
- * ## Example
- *
- * {@example testing/ts/fake_async.ts region='basic'}
- *
- * @param {number} millis Number of millisecond, defaults to 0
- */
- function tick(millis) {
- if (millis === void 0) { millis = 0; }
- _assertInFakeAsyncZone();
- flushMicrotasks();
- _scheduler.tick(millis);
- }
- exports.tick = tick;
- /**
- * Flush any pending microtasks.
- */
- function flushMicrotasks() {
- _assertInFakeAsyncZone();
- while (_microtasks.length > 0) {
- var microtask = collection_1.ListWrapper.removeAt(_microtasks, 0);
- microtask();
- }
- }
- exports.flushMicrotasks = flushMicrotasks;
- function _setTimeout(fn, delay) {
- var args = [];
- for (var _i = 2; _i < arguments.length; _i++) {
- args[_i - 2] = arguments[_i];
- }
- var cb = _fnAndFlush(fn);
- var id = _scheduler.scheduleFunction(cb, delay, args);
- _pendingTimers.push(id);
- _scheduler.scheduleFunction(_dequeueTimer(id), delay);
- return id;
- }
- function _clearTimeout(id) {
- _dequeueTimer(id);
- return _scheduler.removeFunctionWithId(id);
- }
- function _setInterval(fn, interval) {
- var args = [];
- for (var _i = 2; _i < arguments.length; _i++) {
- args[_i - 2] = arguments[_i];
- }
- var cb = _fnAndFlush(fn);
- var id = _scheduler.scheduleFunction(cb, interval, args, true);
- _pendingPeriodicTimers.push(id);
- return id;
- }
- function _clearInterval(id) {
- collection_1.ListWrapper.remove(_pendingPeriodicTimers, id);
- return _scheduler.removeFunctionWithId(id);
- }
- function _fnAndFlush(fn) {
- return function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i - 0] = arguments[_i];
- }
- fn.apply(lang_1.global, args);
- flushMicrotasks();
- };
- }
- function _scheduleMicrotask(microtask) {
- _microtasks.push(microtask);
- }
- function _dequeueTimer(id) {
- return function () { collection_1.ListWrapper.remove(_pendingTimers, id); };
- }
- function _assertInFakeAsyncZone() {
- if (!lang_1.global.zone || !lang_1.global.zone._inFakeAsyncZone) {
- throw new Error('The code should be running in the fakeAsync zone to call this function');
- }
- }
- /***/ },
- /* 275 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var xhr_1 = __webpack_require__(149);
- var collection_1 = __webpack_require__(12);
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var async_1 = __webpack_require__(60);
- /**
- * A mock implemenation of {@link XHR} that allows outgoing requests to be mocked
- * and responded to within a single test, without going to the network.
- */
- var MockXHR = (function (_super) {
- __extends(MockXHR, _super);
- function MockXHR() {
- _super.apply(this, arguments);
- this._expectations = [];
- this._definitions = new collection_1.Map();
- this._requests = [];
- }
- MockXHR.prototype.get = function (url) {
- var request = new _PendingRequest(url);
- this._requests.push(request);
- return request.getPromise();
- };
- /**
- * Add an expectation for the given URL. Incoming requests will be checked against
- * the next expectation (in FIFO order). The `verifyNoOutstandingExpectations` method
- * can be used to check if any expectations have not yet been met.
- *
- * The response given will be returned if the expectation matches.
- */
- MockXHR.prototype.expect = function (url, response) {
- var expectation = new _Expectation(url, response);
- this._expectations.push(expectation);
- };
- /**
- * Add a definition for the given URL to return the given response. Unlike expectations,
- * definitions have no order and will satisfy any matching request at any time. Also
- * unlike expectations, unused definitions do not cause `verifyNoOutstandingExpectations`
- * to return an error.
- */
- MockXHR.prototype.when = function (url, response) { this._definitions.set(url, response); };
- /**
- * Process pending requests and verify there are no outstanding expectations. Also fails
- * if no requests are pending.
- */
- MockXHR.prototype.flush = function () {
- if (this._requests.length === 0) {
- throw new exceptions_1.BaseException('No pending requests to flush');
- }
- do {
- this._processRequest(this._requests.shift());
- } while (this._requests.length > 0);
- this.verifyNoOutstandingExpectations();
- };
- /**
- * Throw an exception if any expectations have not been satisfied.
- */
- MockXHR.prototype.verifyNoOutstandingExpectations = function () {
- if (this._expectations.length === 0)
- return;
- var urls = [];
- for (var i = 0; i < this._expectations.length; i++) {
- var expectation = this._expectations[i];
- urls.push(expectation.url);
- }
- throw new exceptions_1.BaseException("Unsatisfied requests: " + urls.join(', '));
- };
- MockXHR.prototype._processRequest = function (request) {
- var url = request.url;
- if (this._expectations.length > 0) {
- var expectation = this._expectations[0];
- if (expectation.url == url) {
- collection_1.ListWrapper.remove(this._expectations, expectation);
- request.complete(expectation.response);
- return;
- }
- }
- if (this._definitions.has(url)) {
- var response = this._definitions.get(url);
- request.complete(lang_1.normalizeBlank(response));
- return;
- }
- throw new exceptions_1.BaseException("Unexpected request " + url);
- };
- return MockXHR;
- })(xhr_1.XHR);
- exports.MockXHR = MockXHR;
- var _PendingRequest = (function () {
- function _PendingRequest(url) {
- this.url = url;
- this.completer = async_1.PromiseWrapper.completer();
- }
- _PendingRequest.prototype.complete = function (response) {
- if (lang_1.isBlank(response)) {
- this.completer.reject("Failed to load " + this.url, null);
- }
- else {
- this.completer.resolve(response);
- }
- };
- _PendingRequest.prototype.getPromise = function () { return this.completer.promise; };
- return _PendingRequest;
- })();
- var _Expectation = (function () {
- function _Expectation(url, response) {
- this.url = url;
- this.response = response;
- }
- return _Expectation;
- })();
- /***/ },
- /* 276 */
- /***/ function(module, exports, __webpack_require__) {
- var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var application_ref_1 = __webpack_require__(65);
- var di_1 = __webpack_require__(6);
- /**
- * A no-op implementation of {@link ApplicationRef}, useful for testing.
- */
- var MockApplicationRef = (function (_super) {
- __extends(MockApplicationRef, _super);
- function MockApplicationRef() {
- _super.apply(this, arguments);
- }
- MockApplicationRef.prototype.registerBootstrapListener = function (listener) { };
- MockApplicationRef.prototype.registerDisposeListener = function (dispose) { };
- MockApplicationRef.prototype.bootstrap = function (componentType, bindings) {
- return null;
- };
- Object.defineProperty(MockApplicationRef.prototype, "injector", {
- get: function () { return null; },
- enumerable: true,
- configurable: true
- });
- ;
- Object.defineProperty(MockApplicationRef.prototype, "zone", {
- get: function () { return null; },
- enumerable: true,
- configurable: true
- });
- ;
- MockApplicationRef.prototype.dispose = function () { };
- MockApplicationRef.prototype.tick = function () { };
- Object.defineProperty(MockApplicationRef.prototype, "componentTypes", {
- get: function () { return null; },
- enumerable: true,
- configurable: true
- });
- ;
- MockApplicationRef = __decorate([
- di_1.Injectable(),
- __metadata('design:paramtypes', [])
- ], MockApplicationRef);
- return MockApplicationRef;
- })(application_ref_1.ApplicationRef);
- exports.MockApplicationRef = MockApplicationRef;
- /***/ },
- /* 277 */
- /***/ function(module, exports, __webpack_require__) {
- function __export(m) {
- for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
- }
- __export(__webpack_require__(278));
- /***/ },
- /* 278 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var core_1 = __webpack_require__(2);
- var static_request_1 = __webpack_require__(212);
- var enums_1 = __webpack_require__(215);
- var lang_1 = __webpack_require__(5);
- var exceptions_1 = __webpack_require__(14);
- var Subject_1 = __webpack_require__(62);
- var ReplaySubject_1 = __webpack_require__(279);
- var take_1 = __webpack_require__(280);
- /**
- *
- * Mock Connection to represent a {@link Connection} for tests.
- *
- **/
- var MockConnection = (function () {
- function MockConnection(req) {
- this.response = take_1.take.call(new ReplaySubject_1.ReplaySubject(1), 1);
- this.readyState = enums_1.ReadyState.Open;
- this.request = req;
- }
- /**
- * Sends a mock response to the connection. This response is the value that is emitted to the
- * {@link EventEmitter} returned by {@link Http}.
- *
- * ### Example
- *
- * ```
- * var connection;
- * backend.connections.subscribe(c => connection = c);
- * http.request('data.json').subscribe(res => console.log(res.text()));
- * connection.mockRespond(new Response('fake response')); //logs 'fake response'
- * ```
- *
- */
- MockConnection.prototype.mockRespond = function (res) {
- if (this.readyState === enums_1.ReadyState.Done || this.readyState === enums_1.ReadyState.Cancelled) {
- throw new exceptions_1.BaseException('Connection has already been resolved');
- }
- this.readyState = enums_1.ReadyState.Done;
- this.response.next(res);
- this.response.complete();
- };
- /**
- * Not yet implemented!
- *
- * Sends the provided {@link Response} to the `downloadObserver` of the `Request`
- * associated with this connection.
- */
- MockConnection.prototype.mockDownload = function (res) {
- // this.request.downloadObserver.onNext(res);
- // if (res.bytesLoaded === res.totalBytes) {
- // this.request.downloadObserver.onCompleted();
- // }
- };
- // TODO(jeffbcross): consider using Response type
- /**
- * Emits the provided error object as an error to the {@link Response} {@link EventEmitter}
- * returned
- * from {@link Http}.
- */
- MockConnection.prototype.mockError = function (err) {
- // Matches XHR semantics
- this.readyState = enums_1.ReadyState.Done;
- this.response.error(err);
- };
- return MockConnection;
- })();
- exports.MockConnection = MockConnection;
- /**
- * A mock backend for testing the {@link Http} service.
- *
- * This class can be injected in tests, and should be used to override providers
- * to other backends, such as {@link XHRBackend}.
- *
- * ### Example
- *
- * ```
- * import {DefaultOptions, Http} from 'angular2/http';
- * import {MockBackend} from 'angular2/http/testing';
- * it('should get some data', inject([AsyncTestCompleter], (async) => {
- * var connection;
- * var injector = Injector.resolveAndCreate([
- * MockBackend,
- * provide(Http, {useFactory: (backend, defaultOptions) => {
- * return new Http(backend, defaultOptions)
- * }, deps: [MockBackend, DefaultOptions]})]);
- * var http = injector.get(Http);
- * var backend = injector.get(MockBackend);
- * //Assign any newly-created connection to local variable
- * backend.connections.subscribe(c => connection = c);
- * http.request('data.json').subscribe((res) => {
- * expect(res.text()).toBe('awesome');
- * async.done();
- * });
- * connection.mockRespond(new Response('awesome'));
- * }));
- * ```
- *
- * This method only exists in the mock implementation, not in real Backends.
- **/
- var MockBackend = (function () {
- function MockBackend() {
- var _this = this;
- this.connectionsArray = [];
- this.connections = new Subject_1.Subject();
- this.connections.subscribe(function (connection) { return _this.connectionsArray.push(connection); });
- this.pendingConnections = new Subject_1.Subject();
- }
- /**
- * Checks all connections, and raises an exception if any connection has not received a response.
- *
- * This method only exists in the mock implementation, not in real Backends.
- */
- MockBackend.prototype.verifyNoPendingRequests = function () {
- var pending = 0;
- this.pendingConnections.subscribe(function (c) { return pending++; });
- if (pending > 0)
- throw new exceptions_1.BaseException(pending + " pending connections to be resolved");
- };
- /**
- * Can be used in conjunction with `verifyNoPendingRequests` to resolve any not-yet-resolve
- * connections, if it's expected that there are connections that have not yet received a response.
- *
- * This method only exists in the mock implementation, not in real Backends.
- */
- MockBackend.prototype.resolveAllConnections = function () { this.connections.subscribe(function (c) { return c.readyState = 4; }); };
- /**
- * Creates a new {@link MockConnection}. This is equivalent to calling `new
- * MockConnection()`, except that it also will emit the new `Connection` to the `connections`
- * emitter of this `MockBackend` instance. This method will usually only be used by tests
- * against the framework itself, not by end-users.
- */
- MockBackend.prototype.createConnection = function (req) {
- if (!lang_1.isPresent(req) || !(req instanceof static_request_1.Request)) {
- throw new exceptions_1.BaseException("createConnection requires an instance of Request, got " + req);
- }
- var connection = new MockConnection(req);
- this.connections.next(connection);
- return connection;
- };
- MockBackend = __decorate([
- core_1.Injectable(),
- __metadata('design:paramtypes', [])
- ], MockBackend);
- return MockBackend;
- })();
- exports.MockBackend = MockBackend;
- /***/ },
- /* 279 */
- /***/ function(module, exports) {
- module.exports = __WEBPACK_EXTERNAL_MODULE_279__;
- /***/ },
- /* 280 */
- /***/ function(module, exports) {
- module.exports = __WEBPACK_EXTERNAL_MODULE_280__;
- /***/ },
- /* 281 */
- /***/ function(module, exports, __webpack_require__) {
- function __export(m) {
- for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
- }
- __export(__webpack_require__(265));
- __export(__webpack_require__(282));
- /***/ },
- /* 282 */
- /***/ function(module, exports, __webpack_require__) {
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
- };
- var di_1 = __webpack_require__(6);
- var async_1 = __webpack_require__(60);
- /**
- * A spy for {@link Location} that allows tests to fire simulated location events.
- */
- var SpyLocation = (function () {
- function SpyLocation() {
- this.urlChanges = [];
- /** @internal */
- this._path = '';
- /** @internal */
- this._query = '';
- /** @internal */
- this._subject = new async_1.EventEmitter();
- /** @internal */
- this._baseHref = '';
- // TODO: remove these once Location is an interface, and can be implemented cleanly
- this.platformStrategy = null;
- }
- SpyLocation.prototype.setInitialPath = function (url) { this._path = url; };
- SpyLocation.prototype.setBaseHref = function (url) { this._baseHref = url; };
- SpyLocation.prototype.path = function () { return this._path; };
- SpyLocation.prototype.simulateUrlPop = function (pathname) {
- async_1.ObservableWrapper.callEmit(this._subject, { 'url': pathname, 'pop': true });
- };
- SpyLocation.prototype.simulateHashChange = function (pathname) {
- // Because we don't prevent the native event, the browser will independently update the path
- this.setInitialPath(pathname);
- this.urlChanges.push('hash: ' + pathname);
- async_1.ObservableWrapper.callEmit(this._subject, { 'url': pathname, 'pop': true, 'type': 'hashchange' });
- };
- SpyLocation.prototype.prepareExternalUrl = function (url) {
- if (url.length > 0 && !url.startsWith('/')) {
- url = '/' + url;
- }
- return this._baseHref + url;
- };
- SpyLocation.prototype.go = function (path, query) {
- if (query === void 0) { query = ''; }
- path = this.prepareExternalUrl(path);
- if (this._path == path && this._query == query) {
- return;
- }
- this._path = path;
- this._query = query;
- var url = path + (query.length > 0 ? ('?' + query) : '');
- this.urlChanges.push(url);
- };
- SpyLocation.prototype.replaceState = function (path, query) {
- if (query === void 0) { query = ''; }
- path = this.prepareExternalUrl(path);
- this._path = path;
- this._query = query;
- var url = path + (query.length > 0 ? ('?' + query) : '');
- this.urlChanges.push('replace: ' + url);
- };
- SpyLocation.prototype.forward = function () {
- // TODO
- };
- SpyLocation.prototype.back = function () {
- // TODO
- };
- SpyLocation.prototype.subscribe = function (onNext, onThrow, onReturn) {
- if (onThrow === void 0) { onThrow = null; }
- if (onReturn === void 0) { onReturn = null; }
- return async_1.ObservableWrapper.subscribe(this._subject, onNext, onThrow, onReturn);
- };
- SpyLocation.prototype.normalize = function (url) { return null; };
- SpyLocation = __decorate([
- di_1.Injectable(),
- __metadata('design:paramtypes', [])
- ], SpyLocation);
- return SpyLocation;
- })();
- exports.SpyLocation = SpyLocation;
- /***/ }
- /******/ ])
- });
- ;
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCAwMDVhNWVlMjUwMmM1MDQxODFiNCIsIndlYnBhY2s6Ly8vLi90b29scy9idWlsZC93ZWJwYWNrL2FuZ3VsYXIyLWFsbC10ZXN0aW5nLnVtZC5qcyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvY29yZS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvbWV0YWRhdGEudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL21ldGFkYXRhL2RpLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2RpLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9kaS9tZXRhZGF0YS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvZGkvZGVjb3JhdG9ycy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvdXRpbC9kZWNvcmF0b3JzLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9kaS9mb3J3YXJkX3JlZi50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvZGkvaW5qZWN0b3IudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbi50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvZGkvcHJvdmlkZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9ucy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25faGFuZGxlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvcmVmbGVjdGlvbi9yZWZsZWN0aW9uLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9yZWZsZWN0aW9uL3JlZmxlY3Rvci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvcmVmbGVjdGlvbi9yZWZsZWN0aW9uX2NhcGFiaWxpdGllcy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvZGkva2V5LnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9kaS90eXBlX2xpdGVyYWwudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2RpL2V4Y2VwdGlvbnMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2RpL29wYXF1ZV90b2tlbi50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvbWV0YWRhdGEvZGlyZWN0aXZlcy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9jaGFuZ2VfZGV0ZWN0aW9uLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2RpZmZlcnMvaXRlcmFibGVfZGlmZmVycy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9kaWZmZXJzL2RlZmF1bHRfaXRlcmFibGVfZGlmZmVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2RpZmZlcnMva2V5dmFsdWVfZGlmZmVycy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9kaWZmZXJzL2RlZmF1bHRfa2V5dmFsdWVfZGlmZmVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL3BhcnNlci9hc3QudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vcGFyc2VyL2xleGVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL3BhcnNlci9wYXJzZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vcGFyc2VyL2xvY2Fscy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9leGNlcHRpb25zLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2ludGVyZmFjZXMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vY29uc3RhbnRzLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL3Byb3RvX2NoYW5nZV9kZXRlY3Rvci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9jaGFuZ2VfZGV0ZWN0aW9uX3V0aWwudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vcGlwZV9saWZlY3ljbGVfcmVmbGVjdG9yLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2JpbmRpbmdfcmVjb3JkLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2RpcmVjdGl2ZV9yZWNvcmQudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vZHluYW1pY19jaGFuZ2VfZGV0ZWN0b3IudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vYWJzdHJhY3RfY2hhbmdlX2RldGVjdG9yLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2NoYW5nZV9kZXRlY3Rvcl9yZWYudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL3Byb2ZpbGUvcHJvZmlsZS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvcHJvZmlsZS93dGZfaW1wbC50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9vYnNlcnZhYmxlX2ZhY2FkZS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9wcm90b19yZWNvcmQudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vZXZlbnRfYmluZGluZy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9jb2FsZXNjZS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9qaXRfcHJvdG9fY2hhbmdlX2RldGVjdG9yLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2NoYW5nZV9kZXRlY3Rpb25faml0X2dlbmVyYXRvci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9jb2RlZ2VuX25hbWVfdXRpbC50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9jb2RlZ2VuX2xvZ2ljX3V0aWwudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vY29kZWdlbl9mYWNhZGUudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL21ldGFkYXRhL3ZpZXcudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL3V0aWwudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL3Byb2RfbW9kZS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2ZhY2FkZS9mYWNhZGUudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9mYWNhZGUvYXN5bmMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9mYWNhZGUvcHJvbWlzZS50cyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJSeFwiIiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qc1wiOlwicnhqcy9vYnNlcnZhYmxlL2Zyb21Qcm9taXNlXCIsXCJjb21tb25qczJcIjpcInJ4anMvb2JzZXJ2YWJsZS9mcm9tUHJvbWlzZVwiLFwiYW1kXCI6XCJyeGpzL29ic2VydmFibGUvZnJvbVByb21pc2VcIixcInJvb3RcIjpbXCJSeFwiLFwiT2JzZXJ2YWJsZVwiXX0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzXCI6XCJyeGpzL29wZXJhdG9yL3RvUHJvbWlzZVwiLFwiY29tbW9uanMyXCI6XCJyeGpzL29wZXJhdG9yL3RvUHJvbWlzZVwiLFwiYW1kXCI6XCJyeGpzL29wZXJhdG9yL3RvUHJvbWlzZVwiLFwicm9vdFwiOltcIlJ4XCIsXCJPYnNlcnZhYmxlXCIsXCJwcm90b3R5cGVcIl19Iiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9hcHBsaWNhdGlvbl9yZWYudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL3pvbmUvbmdfem9uZS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvYXBwbGljYXRpb25fdG9rZW5zLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS90ZXN0YWJpbGl0eS90ZXN0YWJpbGl0eS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL2R5bmFtaWNfY29tcG9uZW50X2xvYWRlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL2NvbXBpbGVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvcHJvdG9fdmlld19mYWN0b3J5LnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9yZW5kZXIvYXBpLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9waXBlcy9waXBlX3Byb3ZpZGVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9waXBlcy9waXBlcy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9waXBlcy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL3ZpZXcudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci92aWV3X3JlZi50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvcmVuZGVyL3V0aWwudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9lbGVtZW50X2JpbmRlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL2VsZW1lbnRfaW5qZWN0b3IudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci92aWV3X21hbmFnZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci92aWV3X21hbmFnZXJfdXRpbHMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9lbGVtZW50X3JlZi50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL3RlbXBsYXRlX3JlZi50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL3ZpZXdfcG9vbC50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL3ZpZXdfbGlzdGVuZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci92aWV3X2NvbnRhaW5lcl9yZWYudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9kaXJlY3RpdmVfbGlmZWN5Y2xlX3JlZmxlY3Rvci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL2ludGVyZmFjZXMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9xdWVyeV9saXN0LnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvZXZlbnRfY29uZmlnLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvZGlyZWN0aXZlX3Jlc29sdmVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvdmlld19yZXNvbHZlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL3BpcGVfcmVzb2x2ZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL3BsYXRmb3JtX2RpcmVjdGl2ZXNfYW5kX3BpcGVzLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvdGVtcGxhdGVfY29tbWFuZHMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2NvbnNvbGUudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL3pvbmUudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL3JlbmRlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9kZWJ1Zy9kZWJ1Z19lbGVtZW50LnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9wbGF0Zm9ybV9jb21tb25fcHJvdmlkZXJzLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9hcHBsaWNhdGlvbl9jb21tb25fcHJvdmlkZXJzLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9jb21tb24udHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21tb24vcGlwZXMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21tb24vcGlwZXMvYXN5bmNfcGlwZS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9waXBlcy9pbnZhbGlkX3BpcGVfYXJndW1lbnRfZXhjZXB0aW9uLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL3BpcGVzL3VwcGVyY2FzZV9waXBlLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL3BpcGVzL2xvd2VyY2FzZV9waXBlLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL3BpcGVzL2pzb25fcGlwZS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9waXBlcy9zbGljZV9waXBlLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL3BpcGVzL2RhdGVfcGlwZS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2ZhY2FkZS9pbnRsLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL3BpcGVzL251bWJlcl9waXBlLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL2RpcmVjdGl2ZXMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21tb24vZGlyZWN0aXZlcy9uZ19jbGFzcy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9kaXJlY3RpdmVzL25nX2Zvci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9kaXJlY3RpdmVzL25nX2lmLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL2RpcmVjdGl2ZXMvbmdfc3R5bGUudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21tb24vZGlyZWN0aXZlcy9uZ19zd2l0Y2gudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21tb24vZGlyZWN0aXZlcy9vYnNlcnZhYmxlX2xpc3RfZGlmZi50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9kaXJlY3RpdmVzL2NvcmVfZGlyZWN0aXZlcy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9mb3Jtcy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9mb3Jtcy9tb2RlbC50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9mb3Jtcy9kaXJlY3RpdmVzL2Fic3RyYWN0X2NvbnRyb2xfZGlyZWN0aXZlLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL2Zvcm1zL2RpcmVjdGl2ZXMvY29udHJvbF9jb250YWluZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21tb24vZm9ybXMvZGlyZWN0aXZlcy9uZ19jb250cm9sX25hbWUudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21tb24vZm9ybXMvZGlyZWN0aXZlcy9uZ19jb250cm9sLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL2Zvcm1zL2RpcmVjdGl2ZXMvY29udHJvbF92YWx1ZV9hY2Nlc3Nvci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9mb3Jtcy9kaXJlY3RpdmVzL3NoYXJlZC50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9mb3Jtcy92YWxpZGF0b3JzLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL2Zvcm1zL2RpcmVjdGl2ZXMvZGVmYXVsdF92YWx1ZV9hY2Nlc3Nvci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9mb3Jtcy9kaXJlY3RpdmVzL251bWJlcl92YWx1ZV9hY2Nlc3Nvci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9mb3Jtcy9kaXJlY3RpdmVzL2NoZWNrYm94X3ZhbHVlX2FjY2Vzc29yLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL2Zvcm1zL2RpcmVjdGl2ZXMvc2VsZWN0X2NvbnRyb2xfdmFsdWVfYWNjZXNzb3IudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21tb24vZm9ybXMvZGlyZWN0aXZlcy9ub3JtYWxpemVfdmFsaWRhdG9yLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL2Zvcm1zL2RpcmVjdGl2ZXMvbmdfZm9ybV9jb250cm9sLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL2Zvcm1zL2RpcmVjdGl2ZXMvbmdfbW9kZWwudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21tb24vZm9ybXMvZGlyZWN0aXZlcy9uZ19jb250cm9sX2dyb3VwLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL2Zvcm1zL2RpcmVjdGl2ZXMvbmdfZm9ybV9tb2RlbC50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9mb3Jtcy9kaXJlY3RpdmVzL25nX2Zvcm0udHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21tb24vZm9ybXMvZGlyZWN0aXZlcy9uZ19jb250cm9sX3N0YXR1cy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9mb3Jtcy9kaXJlY3RpdmVzLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL2Zvcm1zL2RpcmVjdGl2ZXMvdmFsaWRhdG9ycy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9mb3Jtcy9mb3JtX2J1aWxkZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21tb24vY29tbW9uX2RpcmVjdGl2ZXMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL2NvbXBpbGVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tcGlsZXIvdXJsX3Jlc29sdmVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tcGlsZXIveGhyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tcGlsZXIvY29tcGlsZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21waWxlci9ydW50aW1lX2NvbXBpbGVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tcGlsZXIvdGVtcGxhdGVfY29tcGlsZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21waWxlci9kaXJlY3RpdmVfbWV0YWRhdGEudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21waWxlci9zZWxlY3Rvci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3V0aWwudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21waWxlci9zb3VyY2VfbW9kdWxlLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tcGlsZXIvY2hhbmdlX2RldGVjdG9yX2NvbXBpbGVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tcGlsZXIvY2hhbmdlX2RlZmluaXRpb25fZmFjdG9yeS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3RlbXBsYXRlX2FzdC50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3RyYW5zZm9ybS90ZW1wbGF0ZV9jb21waWxlci9jaGFuZ2VfZGV0ZWN0b3JfY29kZWdlbi50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3N0eWxlX2NvbXBpbGVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tcGlsZXIvc2hhZG93X2Nzcy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3N0eWxlX3VybF9yZXNvbHZlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvcmVuZGVyL3ZpZXdfZmFjdG9yeS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvcmVuZGVyL3ZpZXcudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21waWxlci9jb21tYW5kX2NvbXBpbGVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tcGlsZXIvdGVtcGxhdGVfcGFyc2VyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tcGlsZXIvaHRtbF9wYXJzZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21waWxlci9odG1sX2FzdC50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbXBpbGVyL2h0bWxfbGV4ZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21waWxlci9wYXJzZV91dGlsLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tcGlsZXIvaHRtbF90YWdzLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tcGlsZXIvc2NoZW1hL2VsZW1lbnRfc2NoZW1hX3JlZ2lzdHJ5LnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tcGlsZXIvdGVtcGxhdGVfcHJlcGFyc2VyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tcGlsZXIvdGVtcGxhdGVfbm9ybWFsaXplci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3J1bnRpbWVfbWV0YWRhdGEudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21waWxlci9zY2hlbWEvZG9tX2VsZW1lbnRfc2NoZW1hX3JlZ2lzdHJ5LnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2RvbV9hZGFwdGVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9wbGF0Zm9ybS9icm93c2VyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9hbmd1bGFyX2VudHJ5cG9pbnQudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9icm93c2VyX2NvbW1vbi50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9ldmVudHMvZG9tX2V2ZW50cy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9ldmVudHMvZXZlbnRfbWFuYWdlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9ldmVudHMva2V5X2V2ZW50cy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9ldmVudHMvaGFtbWVyX2dlc3R1cmVzLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2V2ZW50cy9oYW1tZXJfY29tbW9uLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2RvbV90b2tlbnMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZG9tX3JlbmRlcmVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvYW5pbWF0ZS9hbmltYXRpb25fYnVpbGRlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2FuaW1hdGUvY3NzX2FuaW1hdGlvbl9idWlsZGVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvYW5pbWF0ZS9jc3NfYW5pbWF0aW9uX29wdGlvbnMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9hbmltYXRlL2FuaW1hdGlvbi50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2ZhY2FkZS9tYXRoLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL3V0aWwudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9hbmltYXRlL2Jyb3dzZXJfZGV0YWlscy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9zaGFyZWRfc3R5bGVzX2hvc3QudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9icm93c2VyL2Jyb3dzZXJfYWRhcHRlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2Jyb3dzZXIvZ2VuZXJpY19icm93c2VyX2FkYXB0ZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9icm93c2VyL3hocl9pbXBsLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcGxhdGZvcm0vYnJvd3Nlci90ZXN0YWJpbGl0eS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvcHJvZmlsZS93dGZfaW5pdC50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2Jyb3dzZXIvdGl0bGUudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3BsYXRmb3JtL2NvbW1vbl9kb20udHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZGVidWcvYnkudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZGVidWcvZGVidWdfZWxlbWVudF92aWV3X2xpc3RlbmVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcGxhdGZvcm0vYnJvd3Nlci90b29scy90b29scy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2Jyb3dzZXIvdG9vbHMvY29tbW9uX3Rvb2xzLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvZmFjYWRlL2Jyb3dzZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL2h0dHAudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9odHRwL2h0dHAudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9odHRwL2ludGVyZmFjZXMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9odHRwL3N0YXRpY19yZXF1ZXN0LnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvaHR0cC9oZWFkZXJzLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvaHR0cC9odHRwX3V0aWxzLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvaHR0cC9lbnVtcy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2h0dHAvYmFzZV9yZXF1ZXN0X29wdGlvbnMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9odHRwL3VybF9zZWFyY2hfcGFyYW1zLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvaHR0cC9iYWNrZW5kcy94aHJfYmFja2VuZC50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2h0dHAvc3RhdGljX3Jlc3BvbnNlLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvaHR0cC9iYXNlX3Jlc3BvbnNlX29wdGlvbnMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9odHRwL2JhY2tlbmRzL2Jyb3dzZXJfeGhyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvaHR0cC9iYWNrZW5kcy9qc29ucF9iYWNrZW5kLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvaHR0cC9iYWNrZW5kcy9icm93c2VyX2pzb25wLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9yb3V0ZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9yb3V0ZXIvcm91dGVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcm91dGVyL3JvdXRlX3JlZ2lzdHJ5LnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcm91dGVyL3JvdXRlX2NvbmZpZ19pbXBsLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcm91dGVyL3JvdXRlX3JlY29nbml6ZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9yb3V0ZXIvaW5zdHJ1Y3Rpb24udHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9yb3V0ZXIvcGF0aF9yZWNvZ25pemVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcm91dGVyL3VybF9wYXJzZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9yb3V0ZXIvY29tcG9uZW50X3JlY29nbml6ZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9yb3V0ZXIvYXN5bmNfcm91dGVfaGFuZGxlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3JvdXRlci9zeW5jX3JvdXRlX2hhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9yb3V0ZXIvcm91dGVfY29uZmlnX25vbWFsaXplci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3JvdXRlci9yb3V0ZV9jb25maWdfZGVjb3JhdG9yLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcm91dGVyL2xvY2F0aW9uLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcm91dGVyL2xvY2F0aW9uX3N0cmF0ZWd5LnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcm91dGVyL3JvdXRlX2xpZmVjeWNsZV9yZWZsZWN0b3IudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9yb3V0ZXIvbGlmZWN5Y2xlX2Fubm90YXRpb25zX2ltcGwudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9yb3V0ZXIvcm91dGVyX291dGxldC50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3JvdXRlci9saWZlY3ljbGVfYW5ub3RhdGlvbnMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9yb3V0ZXIvcm91dGVyX2xpbmsudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9yb3V0ZXIvcGxhdGZvcm1fbG9jYXRpb24udHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9yb3V0ZXIvaGFzaF9sb2NhdGlvbl9zdHJhdGVneS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3JvdXRlci9wYXRoX2xvY2F0aW9uX3N0cmF0ZWd5LnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9yb3V0ZXIvcm91dGVyX2xpbmtfZHNsLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcm91dGVyL3JvdXRlcl9saW5rX3RyYW5zZm9ybS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvaW5zdHJ1bWVudGF0aW9uLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi91cGdyYWRlLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvdXBncmFkZS91cGdyYWRlX2FkYXB0ZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy91cGdyYWRlL21ldGFkYXRhLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvdXBncmFkZS91dGlsLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvdXBncmFkZS9jb25zdGFudHMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy91cGdyYWRlL2Rvd25ncmFkZV9uZzJfYWRhcHRlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3VwZ3JhZGUvdXBncmFkZV9uZzFfYWRhcHRlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3VwZ3JhZGUvYW5ndWxhcl9qcy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvdGVzdGluZy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3Rlc3RpbmcvdGVzdGluZy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3Rlc3RpbmcvdGVzdF9pbmplY3Rvci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL21vY2svYW5pbWF0aW9uX2J1aWxkZXJfbW9jay50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL21vY2svZGlyZWN0aXZlX3Jlc29sdmVyX21vY2sudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9tb2NrL3ZpZXdfcmVzb2x2ZXJfbW9jay50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL21vY2svbW9ja19sb2NhdGlvbl9zdHJhdGVneS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL21vY2svbmdfem9uZV9tb2NrLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvdGVzdGluZy90ZXN0X2NvbXBvbmVudF9idWlsZGVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvdGVzdGluZy91dGlscy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3dlYl93b3JrZXJzL3NoYXJlZC9zZXJpYWxpemVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvd2ViX3dvcmtlcnMvc2hhcmVkL2FwaS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3dlYl93b3JrZXJzL3NoYXJlZC9yZW5kZXJfcHJvdG9fdmlld19yZWZfc3RvcmUudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy93ZWJfd29ya2Vycy9zaGFyZWQvcmVuZGVyX3ZpZXdfd2l0aF9mcmFnbWVudHNfc3RvcmUudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy90ZXN0aW5nL21hdGNoZXJzLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvdGVzdGluZy9mYWtlX2FzeW5jLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tcGlsZXIveGhyX21vY2sudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9tb2NrL21vY2tfYXBwbGljYXRpb25fcmVmLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9odHRwL3Rlc3RpbmcudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9odHRwL2JhY2tlbmRzL21vY2tfYmFja2VuZC50cyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanNcIjpcInJ4anMvc3ViamVjdC9SZXBsYXlTdWJqZWN0XCIsXCJjb21tb25qczJcIjpcInJ4anMvc3ViamVjdC9SZXBsYXlTdWJqZWN0XCIsXCJhbWRcIjpcInJ4anMvc3ViamVjdC9SZXBsYXlTdWJqZWN0XCIsXCJyb290XCI6W1wiUnhcIl19Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qc1wiOlwicnhqcy9vcGVyYXRvci90YWtlXCIsXCJjb21tb25qczJcIjpcInJ4anMvb3BlcmF0b3IvdGFrZVwiLFwiYW1kXCI6XCJyeGpzL29wZXJhdG9yL3Rha2VcIixcInJvb3RcIjpbXCJSeFwiLFwiT2JzZXJ2YWJsZVwiLFwicHJvdG90eXBlXCJdfSIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvcm91dGVyL3Rlc3RpbmcudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9tb2NrL2xvY2F0aW9uX21vY2sudHMiXSwibmFtZXMiOlsiQXR0cmlidXRlTWV0YWRhdGEiLCJBdHRyaWJ1dGVNZXRhZGF0YS5jb25zdHJ1Y3RvciIsIkF0dHJpYnV0ZU1ldGFkYXRhLnRva2VuIiwiQXR0cmlidXRlTWV0YWRhdGEudG9TdHJpbmciLCJRdWVyeU1ldGFkYXRhIiwiUXVlcnlNZXRhZGF0YS5jb25zdHJ1Y3RvciIsIlF1ZXJ5TWV0YWRhdGEuaXNWaWV3UXVlcnkiLCJRdWVyeU1ldGFkYXRhLnNlbGVjdG9yIiwiUXVlcnlNZXRhZGF0YS5pc1ZhckJpbmRpbmdRdWVyeSIsIlF1ZXJ5TWV0YWRhdGEudmFyQmluZGluZ3MiLCJRdWVyeU1ldGFkYXRhLnRvU3RyaW5nIiwiQ29udGVudENoaWxkcmVuTWV0YWRhdGEiLCJDb250ZW50Q2hpbGRyZW5NZXRhZGF0YS5jb25zdHJ1Y3RvciIsIkNvbnRlbnRDaGlsZE1ldGFkYXRhIiwiQ29udGVudENoaWxkTWV0YWRhdGEuY29uc3RydWN0b3IiLCJWaWV3UXVlcnlNZXRhZGF0YSIsIlZpZXdRdWVyeU1ldGFkYXRhLmNvbnN0cnVjdG9yIiwiVmlld1F1ZXJ5TWV0YWRhdGEuaXNWaWV3UXVlcnkiLCJWaWV3UXVlcnlNZXRhZGF0YS50b1N0cmluZyIsIlZpZXdDaGlsZHJlbk1ldGFkYXRhIiwiVmlld0NoaWxkcmVuTWV0YWRhdGEuY29uc3RydWN0b3IiLCJWaWV3Q2hpbGRNZXRhZGF0YSIsIlZpZXdDaGlsZE1ldGFkYXRhLmNvbnN0cnVjdG9yIiwiZ2V0VHlwZU5hbWVGb3JEZWJ1Z2dpbmciLCJsb2NrTW9kZSIsImVuYWJsZVByb2RNb2RlIiwiYXNzZXJ0aW9uc0VuYWJsZWQiLCJhc3NlcnQiLCJDT05TVF9FWFBSIiwiQ09OU1QiLCJpc1ByZXNlbnQiLCJpc0JsYW5rIiwiaXNTdHJpbmciLCJpc0Z1bmN0aW9uIiwiaXNUeXBlIiwiaXNTdHJpbmdNYXAiLCJpc1Byb21pc2UiLCJpc0FycmF5IiwiaXNOdW1iZXIiLCJpc0RhdGUiLCJub29wIiwic3RyaW5naWZ5Iiwic2VyaWFsaXplRW51bSIsImRlc2VyaWFsaXplRW51bSIsIlN0cmluZ1dyYXBwZXIiLCJTdHJpbmdXcmFwcGVyLmNvbnN0cnVjdG9yIiwiU3RyaW5nV3JhcHBlci5mcm9tQ2hhckNvZGUiLCJTdHJpbmdXcmFwcGVyLmNoYXJDb2RlQXQiLCJTdHJpbmdXcmFwcGVyLnNwbGl0IiwiU3RyaW5nV3JhcHBlci5lcXVhbHMiLCJTdHJpbmdXcmFwcGVyLnN0cmlwTGVmdCIsIlN0cmluZ1dyYXBwZXIuc3RyaXBSaWdodCIsIlN0cmluZ1dyYXBwZXIucmVwbGFjZSIsIlN0cmluZ1dyYXBwZXIucmVwbGFjZUFsbCIsIlN0cmluZ1dyYXBwZXIuc2xpY2UiLCJTdHJpbmdXcmFwcGVyLnJlcGxhY2VBbGxNYXBwZWQiLCJTdHJpbmdXcmFwcGVyLmNvbnRhaW5zIiwiU3RyaW5nV3JhcHBlci5jb21wYXJlIiwiU3RyaW5nSm9pbmVyIiwiU3RyaW5nSm9pbmVyLmNvbnN0cnVjdG9yIiwiU3RyaW5nSm9pbmVyLmFkZCIsIlN0cmluZ0pvaW5lci50b1N0cmluZyIsIk51bWJlclBhcnNlRXJyb3IiLCJOdW1iZXJQYXJzZUVycm9yLmNvbnN0cnVjdG9yIiwiTnVtYmVyUGFyc2VFcnJvci50b1N0cmluZyIsIk51bWJlcldyYXBwZXIiLCJOdW1iZXJXcmFwcGVyLmNvbnN0cnVjdG9yIiwiTnVtYmVyV3JhcHBlci50b0ZpeGVkIiwiTnVtYmVyV3JhcHBlci5lcXVhbCIsIk51bWJlcldyYXBwZXIucGFyc2VJbnRBdXRvUmFkaXgiLCJOdW1iZXJXcmFwcGVyLnBhcnNlSW50IiwiTnVtYmVyV3JhcHBlci5wYXJzZUZsb2F0IiwiTnVtYmVyV3JhcHBlci5OYU4iLCJOdW1iZXJXcmFwcGVyLmlzTmFOIiwiTnVtYmVyV3JhcHBlci5pc0ludGVnZXIiLCJSZWdFeHBXcmFwcGVyIiwiUmVnRXhwV3JhcHBlci5jb25zdHJ1Y3RvciIsIlJlZ0V4cFdyYXBwZXIuY3JlYXRlIiwiUmVnRXhwV3JhcHBlci5maXJzdE1hdGNoIiwiUmVnRXhwV3JhcHBlci50ZXN0IiwiUmVnRXhwV3JhcHBlci5tYXRjaGVyIiwiUmVnRXhwTWF0Y2hlcldyYXBwZXIiLCJSZWdFeHBNYXRjaGVyV3JhcHBlci5jb25zdHJ1Y3RvciIsIlJlZ0V4cE1hdGNoZXJXcmFwcGVyLm5leHQiLCJGdW5jdGlvbldyYXBwZXIiLCJGdW5jdGlvbldyYXBwZXIuY29uc3RydWN0b3IiLCJGdW5jdGlvbldyYXBwZXIuYXBwbHkiLCJsb29zZUlkZW50aWNhbCIsImdldE1hcEtleSIsIm5vcm1hbGl6ZUJsYW5rIiwibm9ybWFsaXplQm9vbCIsImlzSnNPYmplY3QiLCJwcmludCIsIkpzb24iLCJKc29uLmNvbnN0cnVjdG9yIiwiSnNvbi5wYXJzZSIsIkpzb24uc3RyaW5naWZ5IiwiRGF0ZVdyYXBwZXIiLCJEYXRlV3JhcHBlci5jb25zdHJ1Y3RvciIsIkRhdGVXcmFwcGVyLmNyZWF0ZSIsIkRhdGVXcmFwcGVyLmZyb21JU09TdHJpbmciLCJEYXRlV3JhcHBlci5mcm9tTWlsbGlzIiwiRGF0ZVdyYXBwZXIudG9NaWxsaXMiLCJEYXRlV3JhcHBlci5ub3ciLCJEYXRlV3JhcHBlci50b0pzb24iLCJzZXRWYWx1ZU9uUGF0aCIsImdldFN5bWJvbEl0ZXJhdG9yIiwiSW5qZWN0TWV0YWRhdGEiLCJJbmplY3RNZXRhZGF0YS5jb25zdHJ1Y3RvciIsIkluamVjdE1ldGFkYXRhLnRvU3RyaW5nIiwiT3B0aW9uYWxNZXRhZGF0YSIsIk9wdGlvbmFsTWV0YWRhdGEuY29uc3RydWN0b3IiLCJPcHRpb25hbE1ldGFkYXRhLnRvU3RyaW5nIiwiRGVwZW5kZW5jeU1ldGFkYXRhIiwiRGVwZW5kZW5jeU1ldGFkYXRhLmNvbnN0cnVjdG9yIiwiRGVwZW5kZW5jeU1ldGFkYXRhLnRva2VuIiwiSW5qZWN0YWJsZU1ldGFkYXRhIiwiSW5qZWN0YWJsZU1ldGFkYXRhLmNvbnN0cnVjdG9yIiwiU2VsZk1ldGFkYXRhIiwiU2VsZk1ldGFkYXRhLmNvbnN0cnVjdG9yIiwiU2VsZk1ldGFkYXRhLnRvU3RyaW5nIiwiU2tpcFNlbGZNZXRhZGF0YSIsIlNraXBTZWxmTWV0YWRhdGEuY29uc3RydWN0b3IiLCJTa2lwU2VsZk1ldGFkYXRhLnRvU3RyaW5nIiwiSG9zdE1ldGFkYXRhIiwiSG9zdE1ldGFkYXRhLmNvbnN0cnVjdG9yIiwiSG9zdE1ldGFkYXRhLnRvU3RyaW5nIiwiZXh0cmFjdEFubm90YXRpb24iLCJhcHBseVBhcmFtcyIsIkNsYXNzIiwibWFrZURlY29yYXRvciIsIm1ha2VEZWNvcmF0b3IuRGVjb3JhdG9yRmFjdG9yeSIsIm1ha2VEZWNvcmF0b3IuRGVjb3JhdG9yRmFjdG9yeS5UeXBlRGVjb3JhdG9yIiwibWFrZVBhcmFtRGVjb3JhdG9yIiwibWFrZVBhcmFtRGVjb3JhdG9yLlBhcmFtRGVjb3JhdG9yRmFjdG9yeSIsIm1ha2VQYXJhbURlY29yYXRvci5QYXJhbURlY29yYXRvckZhY3RvcnkuUGFyYW1EZWNvcmF0b3IiLCJtYWtlUHJvcERlY29yYXRvciIsIm1ha2VQcm9wRGVjb3JhdG9yLlByb3BEZWNvcmF0b3JGYWN0b3J5IiwibWFrZVByb3BEZWNvcmF0b3IuUHJvcERlY29yYXRvckZhY3RvcnkuUHJvcERlY29yYXRvciIsImZvcndhcmRSZWYiLCJyZXNvbHZlRm9yd2FyZFJlZiIsIlZpc2liaWxpdHkiLCJjYW5TZWUiLCJQcm90b0luamVjdG9ySW5saW5lU3RyYXRlZ3kiLCJQcm90b0luamVjdG9ySW5saW5lU3RyYXRlZ3kuY29uc3RydWN0b3IiLCJQcm90b0luamVjdG9ySW5saW5lU3RyYXRlZ3kuZ2V0UHJvdmlkZXJBdEluZGV4IiwiUHJvdG9JbmplY3RvcklubGluZVN0cmF0ZWd5LmNyZWF0ZUluamVjdG9yU3RyYXRlZ3kiLCJQcm90b0luamVjdG9yRHluYW1pY1N0cmF0ZWd5IiwiUHJvdG9JbmplY3RvckR5bmFtaWNTdHJhdGVneS5jb25zdHJ1Y3RvciIsIlByb3RvSW5qZWN0b3JEeW5hbWljU3RyYXRlZ3kuZ2V0UHJvdmlkZXJBdEluZGV4IiwiUHJvdG9JbmplY3RvckR5bmFtaWNTdHJhdGVneS5jcmVhdGVJbmplY3RvclN0cmF0ZWd5IiwiUHJvdG9JbmplY3RvciIsIlByb3RvSW5qZWN0b3IuY29uc3RydWN0b3IiLCJQcm90b0luamVjdG9yLmdldFByb3ZpZGVyQXRJbmRleCIsIkluamVjdG9ySW5saW5lU3RyYXRlZ3kiLCJJbmplY3RvcklubGluZVN0cmF0ZWd5LmNvbnN0cnVjdG9yIiwiSW5qZWN0b3JJbmxpbmVTdHJhdGVneS5yZXNldENvbnN0cnVjdGlvbkNvdW50ZXIiLCJJbmplY3RvcklubGluZVN0cmF0ZWd5Lmluc3RhbnRpYXRlUHJvdmlkZXIiLCJJbmplY3RvcklubGluZVN0cmF0ZWd5LmF0dGFjaCIsIkluamVjdG9ySW5saW5lU3RyYXRlZ3kuZ2V0T2JqQnlLZXlJZCIsIkluamVjdG9ySW5saW5lU3RyYXRlZ3kuZ2V0T2JqQXRJbmRleCIsIkluamVjdG9ySW5saW5lU3RyYXRlZ3kuZ2V0TWF4TnVtYmVyT2ZPYmplY3RzIiwiSW5qZWN0b3JEeW5hbWljU3RyYXRlZ3kiLCJJbmplY3RvckR5bmFtaWNTdHJhdGVneS5jb25zdHJ1Y3RvciIsIkluamVjdG9yRHluYW1pY1N0cmF0ZWd5LnJlc2V0Q29uc3RydWN0aW9uQ291bnRlciIsIkluamVjdG9yRHluYW1pY1N0cmF0ZWd5Lmluc3RhbnRpYXRlUHJvdmlkZXIiLCJJbmplY3RvckR5bmFtaWNTdHJhdGVneS5hdHRhY2giLCJJbmplY3RvckR5bmFtaWNTdHJhdGVneS5nZXRPYmpCeUtleUlkIiwiSW5qZWN0b3JEeW5hbWljU3RyYXRlZ3kuZ2V0T2JqQXRJbmRleCIsIkluamVjdG9yRHluYW1pY1N0cmF0ZWd5LmdldE1heE51bWJlck9mT2JqZWN0cyIsIlByb3ZpZGVyV2l0aFZpc2liaWxpdHkiLCJQcm92aWRlcldpdGhWaXNpYmlsaXR5LmNvbnN0cnVjdG9yIiwiUHJvdmlkZXJXaXRoVmlzaWJpbGl0eS5nZXRLZXlJZCIsIkluamVjdG9yIiwiSW5qZWN0b3IuY29uc3RydWN0b3IiLCJJbmplY3Rvci5yZXNvbHZlIiwiSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZSIsIkluamVjdG9yLmZyb21SZXNvbHZlZFByb3ZpZGVycyIsIkluamVjdG9yLmZyb21SZXNvbHZlZEJpbmRpbmdzIiwiSW5qZWN0b3IuZGVidWdDb250ZXh0IiwiSW5qZWN0b3IuZ2V0IiwiSW5qZWN0b3IuZ2V0T3B0aW9uYWwiLCJJbmplY3Rvci5nZXRBdCIsIkluamVjdG9yLnBhcmVudCIsIkluamVjdG9yLmludGVybmFsU3RyYXRlZ3kiLCJJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlQ2hpbGQiLCJJbmplY3Rvci5jcmVhdGVDaGlsZEZyb21SZXNvbHZlZCIsIkluamVjdG9yLnJlc29sdmVBbmRJbnN0YW50aWF0ZSIsIkluamVjdG9yLmluc3RhbnRpYXRlUmVzb2x2ZWQiLCJJbmplY3Rvci5fbmV3IiwiSW5qZWN0b3IuX2luc3RhbnRpYXRlUHJvdmlkZXIiLCJJbmplY3Rvci5faW5zdGFudGlhdGUiLCJJbmplY3Rvci5fZ2V0QnlEZXBlbmRlbmN5IiwiSW5qZWN0b3IuX2dldEJ5S2V5IiwiSW5qZWN0b3IuX3Rocm93T3JOdWxsIiwiSW5qZWN0b3IuX2dldEJ5S2V5U2VsZiIsIkluamVjdG9yLl9nZXRCeUtleUhvc3QiLCJJbmplY3Rvci5fZ2V0UHJpdmF0ZURlcGVuZGVuY3kiLCJJbmplY3Rvci5fZ2V0QnlLZXlEZWZhdWx0IiwiSW5qZWN0b3IuZGlzcGxheU5hbWUiLCJJbmplY3Rvci50b1N0cmluZyIsIl9tYXBQcm92aWRlcnMiLCJjcmVhdGVNYXBGcm9tUGFpcnMiLCJjcmVhdGVNYXBBbmRQb3B1bGF0ZUZyb21QYWlycyIsImNyZWF0ZU1hcEZyb21NYXAiLCJjcmVhdGVNYXBBbmRQb3B1bGF0ZUZyb21NYXAiLCJfY2xlYXJWYWx1ZXMiLCJfY2xlYXJWYWx1ZXNXaXRoRm9yZUVhY2giLCJjcmVhdGVBcnJheUZyb21NYXAiLCJjcmVhdGVBcnJheUZyb21NYXBXaXRoRm9yZWFjaCIsIk1hcFdyYXBwZXIiLCJNYXBXcmFwcGVyLmNvbnN0cnVjdG9yIiwiTWFwV3JhcHBlci5jbG9uZSIsIk1hcFdyYXBwZXIuY3JlYXRlRnJvbVN0cmluZ01hcCIsIk1hcFdyYXBwZXIudG9TdHJpbmdNYXAiLCJNYXBXcmFwcGVyLmNyZWF0ZUZyb21QYWlycyIsIk1hcFdyYXBwZXIuY2xlYXJWYWx1ZXMiLCJNYXBXcmFwcGVyLml0ZXJhYmxlIiwiTWFwV3JhcHBlci5rZXlzIiwiTWFwV3JhcHBlci52YWx1ZXMiLCJTdHJpbmdNYXBXcmFwcGVyIiwiU3RyaW5nTWFwV3JhcHBlci5jb25zdHJ1Y3RvciIsIlN0cmluZ01hcFdyYXBwZXIuY3JlYXRlIiwiU3RyaW5nTWFwV3JhcHBlci5jb250YWlucyIsIlN0cmluZ01hcFdyYXBwZXIuZ2V0IiwiU3RyaW5nTWFwV3JhcHBlci5zZXQiLCJTdHJpbmdNYXBXcmFwcGVyLmtleXMiLCJTdHJpbmdNYXBXcmFwcGVyLmlzRW1wdHkiLCJTdHJpbmdNYXBXcmFwcGVyLmRlbGV0ZSIsIlN0cmluZ01hcFdyYXBwZXIuZm9yRWFjaCIsIlN0cmluZ01hcFdyYXBwZXIubWVyZ2UiLCJTdHJpbmdNYXBXcmFwcGVyLmVxdWFscyIsIkxpc3RXcmFwcGVyIiwiTGlzdFdyYXBwZXIuY29uc3RydWN0b3IiLCJMaXN0V3JhcHBlci5jcmVhdGVGaXhlZFNpemUiLCJMaXN0V3JhcHBlci5jcmVhdGVHcm93YWJsZVNpemUiLCJMaXN0V3JhcHBlci5jbG9uZSIsIkxpc3RXcmFwcGVyLmZvckVhY2hXaXRoSW5kZXgiLCJMaXN0V3JhcHBlci5maXJzdCIsIkxpc3RXcmFwcGVyLmxhc3QiLCJMaXN0V3JhcHBlci5pbmRleE9mIiwiTGlzdFdyYXBwZXIuY29udGFpbnMiLCJMaXN0V3JhcHBlci5yZXZlcnNlZCIsIkxpc3RXcmFwcGVyLmNvbmNhdCIsIkxpc3RXcmFwcGVyLmluc2VydCIsIkxpc3RXcmFwcGVyLnJlbW92ZUF0IiwiTGlzdFdyYXBwZXIucmVtb3ZlQWxsIiwiTGlzdFdyYXBwZXIucmVtb3ZlIiwiTGlzdFdyYXBwZXIuY2xlYXIiLCJMaXN0V3JhcHBlci5pc0VtcHR5IiwiTGlzdFdyYXBwZXIuZmlsbCIsIkxpc3RXcmFwcGVyLmVxdWFscyIsIkxpc3RXcmFwcGVyLnNsaWNlIiwiTGlzdFdyYXBwZXIuc3BsaWNlIiwiTGlzdFdyYXBwZXIuc29ydCIsIkxpc3RXcmFwcGVyLnRvU3RyaW5nIiwiTGlzdFdyYXBwZXIudG9KU09OIiwiTGlzdFdyYXBwZXIubWF4aW11bSIsImlzTGlzdExpa2VJdGVyYWJsZSIsIml0ZXJhdGVMaXN0TGlrZSIsImNyZWF0ZVNldEZyb21MaXN0IiwiY3JlYXRlU2V0QW5kUG9wdWxhdGVGcm9tTGlzdCIsIlNldFdyYXBwZXIiLCJTZXRXcmFwcGVyLmNvbnN0cnVjdG9yIiwiU2V0V3JhcHBlci5jcmVhdGVGcm9tTGlzdCIsIlNldFdyYXBwZXIuaGFzIiwiU2V0V3JhcHBlci5kZWxldGUiLCJEZXBlbmRlbmN5IiwiRGVwZW5kZW5jeS5jb25zdHJ1Y3RvciIsIkRlcGVuZGVuY3kuZnJvbUtleSIsIlByb3ZpZGVyIiwiUHJvdmlkZXIuY29uc3RydWN0b3IiLCJQcm92aWRlci5tdWx0aSIsIkJpbmRpbmciLCJCaW5kaW5nLmNvbnN0cnVjdG9yIiwiQmluZGluZy50b0NsYXNzIiwiQmluZGluZy50b0FsaWFzIiwiQmluZGluZy50b0ZhY3RvcnkiLCJCaW5kaW5nLnRvVmFsdWUiLCJSZXNvbHZlZFByb3ZpZGVyXyIsIlJlc29sdmVkUHJvdmlkZXJfLmNvbnN0cnVjdG9yIiwiUmVzb2x2ZWRQcm92aWRlcl8ucmVzb2x2ZWRGYWN0b3J5IiwiUmVzb2x2ZWRGYWN0b3J5IiwiUmVzb2x2ZWRGYWN0b3J5LmNvbnN0cnVjdG9yIiwiYmluZCIsInByb3ZpZGUiLCJQcm92aWRlckJ1aWxkZXIiLCJQcm92aWRlckJ1aWxkZXIuY29uc3RydWN0b3IiLCJQcm92aWRlckJ1aWxkZXIudG9DbGFzcyIsIlByb3ZpZGVyQnVpbGRlci50b1ZhbHVlIiwiUHJvdmlkZXJCdWlsZGVyLnRvQWxpYXMiLCJQcm92aWRlckJ1aWxkZXIudG9GYWN0b3J5IiwicmVzb2x2ZUZhY3RvcnkiLCJyZXNvbHZlUHJvdmlkZXIiLCJyZXNvbHZlUHJvdmlkZXJzIiwiX05vcm1hbGl6ZWRQcm92aWRlciIsIl9Ob3JtYWxpemVkUHJvdmlkZXIuY29uc3RydWN0b3IiLCJfY3JlYXRlTGlzdE9mUHJvdmlkZXJzIiwiX25vcm1hbGl6ZVByb3ZpZGVycyIsIl9ub3JtYWxpemVQcm92aWRlciIsIl9jb25zdHJ1Y3REZXBlbmRlbmNpZXMiLCJfZGVwZW5kZW5jaWVzRm9yIiwiX2V4dHJhY3RUb2tlbiIsIl9jcmVhdGVEZXBlbmRlbmN5IiwiQmFzZUV4Y2VwdGlvbiIsIkJhc2VFeGNlcHRpb24uY29uc3RydWN0b3IiLCJCYXNlRXhjZXB0aW9uLnRvU3RyaW5nIiwiV3JhcHBlZEV4Y2VwdGlvbiIsIldyYXBwZWRFeGNlcHRpb24uY29uc3RydWN0b3IiLCJXcmFwcGVkRXhjZXB0aW9uLndyYXBwZXJNZXNzYWdlIiwiV3JhcHBlZEV4Y2VwdGlvbi53cmFwcGVyU3RhY2siLCJXcmFwcGVkRXhjZXB0aW9uLm9yaWdpbmFsRXhjZXB0aW9uIiwiV3JhcHBlZEV4Y2VwdGlvbi5vcmlnaW5hbFN0YWNrIiwiV3JhcHBlZEV4Y2VwdGlvbi5jb250ZXh0IiwiV3JhcHBlZEV4Y2VwdGlvbi5tZXNzYWdlIiwiV3JhcHBlZEV4Y2VwdGlvbi50b1N0cmluZyIsIm1ha2VUeXBlRXJyb3IiLCJ1bmltcGxlbWVudGVkIiwiX0FycmF5TG9nZ2VyIiwiX0FycmF5TG9nZ2VyLmNvbnN0cnVjdG9yIiwiX0FycmF5TG9nZ2VyLmxvZyIsIl9BcnJheUxvZ2dlci5sb2dFcnJvciIsIl9BcnJheUxvZ2dlci5sb2dHcm91cCIsIl9BcnJheUxvZ2dlci5sb2dHcm91cEVuZCIsIkV4Y2VwdGlvbkhhbmRsZXIiLCJFeGNlcHRpb25IYW5kbGVyLmNvbnN0cnVjdG9yIiwiRXhjZXB0aW9uSGFuZGxlci5leGNlcHRpb25Ub1N0cmluZyIsIkV4Y2VwdGlvbkhhbmRsZXIuY2FsbCIsIkV4Y2VwdGlvbkhhbmRsZXIuX2V4dHJhY3RNZXNzYWdlIiwiRXhjZXB0aW9uSGFuZGxlci5fbG9uZ1N0YWNrVHJhY2UiLCJFeGNlcHRpb25IYW5kbGVyLl9maW5kQ29udGV4dCIsIkV4Y2VwdGlvbkhhbmRsZXIuX2ZpbmRPcmlnaW5hbEV4Y2VwdGlvbiIsIkV4Y2VwdGlvbkhhbmRsZXIuX2ZpbmRPcmlnaW5hbFN0YWNrIiwiUmVmbGVjdGlvbkluZm8iLCJSZWZsZWN0aW9uSW5mby5jb25zdHJ1Y3RvciIsIlJlZmxlY3RvciIsIlJlZmxlY3Rvci5jb25zdHJ1Y3RvciIsIlJlZmxlY3Rvci5pc1JlZmxlY3Rpb25FbmFibGVkIiwiUmVmbGVjdG9yLnRyYWNrVXNhZ2UiLCJSZWZsZWN0b3IubGlzdFVudXNlZEtleXMiLCJSZWZsZWN0b3IucmVnaXN0ZXJGdW5jdGlvbiIsIlJlZmxlY3Rvci5yZWdpc3RlclR5cGUiLCJSZWZsZWN0b3IucmVnaXN0ZXJHZXR0ZXJzIiwiUmVmbGVjdG9yLnJlZ2lzdGVyU2V0dGVycyIsIlJlZmxlY3Rvci5yZWdpc3Rlck1ldGhvZHMiLCJSZWZsZWN0b3IuZmFjdG9yeSIsIlJlZmxlY3Rvci5wYXJhbWV0ZXJzIiwiUmVmbGVjdG9yLmFubm90YXRpb25zIiwiUmVmbGVjdG9yLnByb3BNZXRhZGF0YSIsIlJlZmxlY3Rvci5pbnRlcmZhY2VzIiwiUmVmbGVjdG9yLmdldHRlciIsIlJlZmxlY3Rvci5zZXR0ZXIiLCJSZWZsZWN0b3IubWV0aG9kIiwiUmVmbGVjdG9yLl9nZXRSZWZsZWN0aW9uSW5mbyIsIlJlZmxlY3Rvci5fY29udGFpbnNSZWZsZWN0aW9uSW5mbyIsIlJlZmxlY3Rvci5pbXBvcnRVcmkiLCJfbWVyZ2VNYXBzIiwiUmVmbGVjdGlvbkNhcGFiaWxpdGllcyIsIlJlZmxlY3Rpb25DYXBhYmlsaXRpZXMuY29uc3RydWN0b3IiLCJSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLmlzUmVmbGVjdGlvbkVuYWJsZWQiLCJSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLmZhY3RvcnkiLCJSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLl96aXBUeXBlc0FuZEFubm90YWlvbnMiLCJSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLnBhcmFtZXRlcnMiLCJSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLmFubm90YXRpb25zIiwiUmVmbGVjdGlvbkNhcGFiaWxpdGllcy5wcm9wTWV0YWRhdGEiLCJSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLmludGVyZmFjZXMiLCJSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLmdldHRlciIsIlJlZmxlY3Rpb25DYXBhYmlsaXRpZXMuc2V0dGVyIiwiUmVmbGVjdGlvbkNhcGFiaWxpdGllcy5tZXRob2QiLCJSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLmltcG9ydFVyaSIsIktleSIsIktleS5jb25zdHJ1Y3RvciIsIktleS5kaXNwbGF5TmFtZSIsIktleS5nZXQiLCJLZXkubnVtYmVyT2ZLZXlzIiwiS2V5UmVnaXN0cnkiLCJLZXlSZWdpc3RyeS5jb25zdHJ1Y3RvciIsIktleVJlZ2lzdHJ5LmdldCIsIktleVJlZ2lzdHJ5Lm51bWJlck9mS2V5cyIsIlR5cGVMaXRlcmFsIiwiVHlwZUxpdGVyYWwuY29uc3RydWN0b3IiLCJUeXBlTGl0ZXJhbC50eXBlIiwiZmluZEZpcnN0Q2xvc2VkQ3ljbGUiLCJjb25zdHJ1Y3RSZXNvbHZpbmdQYXRoIiwiQWJzdHJhY3RQcm92aWRlckVycm9yIiwiQWJzdHJhY3RQcm92aWRlckVycm9yLmNvbnN0cnVjdG9yIiwiQWJzdHJhY3RQcm92aWRlckVycm9yLmFkZEtleSIsIkFic3RyYWN0UHJvdmlkZXJFcnJvci5jb250ZXh0IiwiTm9Qcm92aWRlckVycm9yIiwiTm9Qcm92aWRlckVycm9yLmNvbnN0cnVjdG9yIiwiQ3ljbGljRGVwZW5kZW5jeUVycm9yIiwiQ3ljbGljRGVwZW5kZW5jeUVycm9yLmNvbnN0cnVjdG9yIiwiSW5zdGFudGlhdGlvbkVycm9yIiwiSW5zdGFudGlhdGlvbkVycm9yLmNvbnN0cnVjdG9yIiwiSW5zdGFudGlhdGlvbkVycm9yLmFkZEtleSIsIkluc3RhbnRpYXRpb25FcnJvci53cmFwcGVyTWVzc2FnZSIsIkluc3RhbnRpYXRpb25FcnJvci5jYXVzZUtleSIsIkluc3RhbnRpYXRpb25FcnJvci5jb250ZXh0IiwiSW52YWxpZFByb3ZpZGVyRXJyb3IiLCJJbnZhbGlkUHJvdmlkZXJFcnJvci5jb25zdHJ1Y3RvciIsIk5vQW5ub3RhdGlvbkVycm9yIiwiTm9Bbm5vdGF0aW9uRXJyb3IuY29uc3RydWN0b3IiLCJOb0Fubm90YXRpb25FcnJvci5fZ2VuTWVzc2FnZSIsIk91dE9mQm91bmRzRXJyb3IiLCJPdXRPZkJvdW5kc0Vycm9yLmNvbnN0cnVjdG9yIiwiTWl4aW5nTXVsdGlQcm92aWRlcnNXaXRoUmVndWxhclByb3ZpZGVyc0Vycm9yIiwiTWl4aW5nTXVsdGlQcm92aWRlcnNXaXRoUmVndWxhclByb3ZpZGVyc0Vycm9yLmNvbnN0cnVjdG9yIiwiT3BhcXVlVG9rZW4iLCJPcGFxdWVUb2tlbi5jb25zdHJ1Y3RvciIsIk9wYXF1ZVRva2VuLnRvU3RyaW5nIiwiRGlyZWN0aXZlTWV0YWRhdGEiLCJEaXJlY3RpdmVNZXRhZGF0YS5jb25zdHJ1Y3RvciIsIkRpcmVjdGl2ZU1ldGFkYXRhLmlucHV0cyIsIkRpcmVjdGl2ZU1ldGFkYXRhLnByb3BlcnRpZXMiLCJEaXJlY3RpdmVNZXRhZGF0YS5vdXRwdXRzIiwiRGlyZWN0aXZlTWV0YWRhdGEuZXZlbnRzIiwiRGlyZWN0aXZlTWV0YWRhdGEucHJvdmlkZXJzIiwiRGlyZWN0aXZlTWV0YWRhdGEuYmluZGluZ3MiLCJDb21wb25lbnRNZXRhZGF0YSIsIkNvbXBvbmVudE1ldGFkYXRhLmNvbnN0cnVjdG9yIiwiQ29tcG9uZW50TWV0YWRhdGEudmlld1Byb3ZpZGVycyIsIkNvbXBvbmVudE1ldGFkYXRhLnZpZXdCaW5kaW5ncyIsIlBpcGVNZXRhZGF0YSIsIlBpcGVNZXRhZGF0YS5jb25zdHJ1Y3RvciIsIlBpcGVNZXRhZGF0YS5wdXJlIiwiSW5wdXRNZXRhZGF0YSIsIklucHV0TWV0YWRhdGEuY29uc3RydWN0b3IiLCJPdXRwdXRNZXRhZGF0YSIsIk91dHB1dE1ldGFkYXRhLmNvbnN0cnVjdG9yIiwiSG9zdEJpbmRpbmdNZXRhZGF0YSIsIkhvc3RCaW5kaW5nTWV0YWRhdGEuY29uc3RydWN0b3IiLCJIb3N0TGlzdGVuZXJNZXRhZGF0YSIsIkhvc3RMaXN0ZW5lck1ldGFkYXRhLmNvbnN0cnVjdG9yIiwiSXRlcmFibGVEaWZmZXJzIiwiSXRlcmFibGVEaWZmZXJzLmNvbnN0cnVjdG9yIiwiSXRlcmFibGVEaWZmZXJzLmNyZWF0ZSIsIkl0ZXJhYmxlRGlmZmVycy5leHRlbmQiLCJJdGVyYWJsZURpZmZlcnMuZmluZCIsIkRlZmF1bHRJdGVyYWJsZURpZmZlckZhY3RvcnkiLCJEZWZhdWx0SXRlcmFibGVEaWZmZXJGYWN0b3J5LmNvbnN0cnVjdG9yIiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyRmFjdG9yeS5zdXBwb3J0cyIsIkRlZmF1bHRJdGVyYWJsZURpZmZlckZhY3RvcnkuY3JlYXRlIiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyIiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLmNvbnN0cnVjdG9yIiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLmNvbGxlY3Rpb24iLCJEZWZhdWx0SXRlcmFibGVEaWZmZXIubGVuZ3RoIiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLmZvckVhY2hJdGVtIiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLmZvckVhY2hQcmV2aW91c0l0ZW0iLCJEZWZhdWx0SXRlcmFibGVEaWZmZXIuZm9yRWFjaEFkZGVkSXRlbSIsIkRlZmF1bHRJdGVyYWJsZURpZmZlci5mb3JFYWNoTW92ZWRJdGVtIiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLmZvckVhY2hSZW1vdmVkSXRlbSIsIkRlZmF1bHRJdGVyYWJsZURpZmZlci5kaWZmIiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLm9uRGVzdHJveSIsIkRlZmF1bHRJdGVyYWJsZURpZmZlci5jaGVjayIsIkRlZmF1bHRJdGVyYWJsZURpZmZlci5pc0RpcnR5IiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLl9yZXNldCIsIkRlZmF1bHRJdGVyYWJsZURpZmZlci5fbWlzbWF0Y2giLCJEZWZhdWx0SXRlcmFibGVEaWZmZXIuX3ZlcmlmeVJlaW5zZXJ0aW9uIiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLl90cnVuY2F0ZSIsIkRlZmF1bHRJdGVyYWJsZURpZmZlci5fcmVpbnNlcnRBZnRlciIsIkRlZmF1bHRJdGVyYWJsZURpZmZlci5fbW92ZUFmdGVyIiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLl9hZGRBZnRlciIsIkRlZmF1bHRJdGVyYWJsZURpZmZlci5faW5zZXJ0QWZ0ZXIiLCJEZWZhdWx0SXRlcmFibGVEaWZmZXIuX3JlbW92ZSIsIkRlZmF1bHRJdGVyYWJsZURpZmZlci5fdW5saW5rIiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLl9hZGRUb01vdmVzIiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLl9hZGRUb1JlbW92YWxzIiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLnRvU3RyaW5nIiwiQ29sbGVjdGlvbkNoYW5nZVJlY29yZCIsIkNvbGxlY3Rpb25DaGFuZ2VSZWNvcmQuY29uc3RydWN0b3IiLCJDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkLnRvU3RyaW5nIiwiX0R1cGxpY2F0ZUl0ZW1SZWNvcmRMaXN0IiwiX0R1cGxpY2F0ZUl0ZW1SZWNvcmRMaXN0LmNvbnN0cnVjdG9yIiwiX0R1cGxpY2F0ZUl0ZW1SZWNvcmRMaXN0LmFkZCIsIl9EdXBsaWNhdGVJdGVtUmVjb3JkTGlzdC5nZXQiLCJfRHVwbGljYXRlSXRlbVJlY29yZExpc3QucmVtb3ZlIiwiX0R1cGxpY2F0ZU1hcCIsIl9EdXBsaWNhdGVNYXAuY29uc3RydWN0b3IiLCJfRHVwbGljYXRlTWFwLnB1dCIsIl9EdXBsaWNhdGVNYXAuZ2V0IiwiX0R1cGxpY2F0ZU1hcC5yZW1vdmUiLCJfRHVwbGljYXRlTWFwLmlzRW1wdHkiLCJfRHVwbGljYXRlTWFwLmNsZWFyIiwiX0R1cGxpY2F0ZU1hcC50b1N0cmluZyIsIktleVZhbHVlRGlmZmVycyIsIktleVZhbHVlRGlmZmVycy5jb25zdHJ1Y3RvciIsIktleVZhbHVlRGlmZmVycy5jcmVhdGUiLCJLZXlWYWx1ZURpZmZlcnMuZXh0ZW5kIiwiS2V5VmFsdWVEaWZmZXJzLmZpbmQiLCJEZWZhdWx0S2V5VmFsdWVEaWZmZXJGYWN0b3J5IiwiRGVmYXVsdEtleVZhbHVlRGlmZmVyRmFjdG9yeS5jb25zdHJ1Y3RvciIsIkRlZmF1bHRLZXlWYWx1ZURpZmZlckZhY3Rvcnkuc3VwcG9ydHMiLCJEZWZhdWx0S2V5VmFsdWVEaWZmZXJGYWN0b3J5LmNyZWF0ZSIsIkRlZmF1bHRLZXlWYWx1ZURpZmZlciIsIkRlZmF1bHRLZXlWYWx1ZURpZmZlci5jb25zdHJ1Y3RvciIsIkRlZmF1bHRLZXlWYWx1ZURpZmZlci5pc0RpcnR5IiwiRGVmYXVsdEtleVZhbHVlRGlmZmVyLmZvckVhY2hJdGVtIiwiRGVmYXVsdEtleVZhbHVlRGlmZmVyLmZvckVhY2hQcmV2aW91c0l0ZW0iLCJEZWZhdWx0S2V5VmFsdWVEaWZmZXIuZm9yRWFjaENoYW5nZWRJdGVtIiwiRGVmYXVsdEtleVZhbHVlRGlmZmVyLmZvckVhY2hBZGRlZEl0ZW0iLCJEZWZhdWx0S2V5VmFsdWVEaWZmZXIuZm9yRWFjaFJlbW92ZWRJdGVtIiwiRGVmYXVsdEtleVZhbHVlRGlmZmVyLmRpZmYiLCJEZWZhdWx0S2V5VmFsdWVEaWZmZXIub25EZXN0cm95IiwiRGVmYXVsdEtleVZhbHVlRGlmZmVyLmNoZWNrIiwiRGVmYXVsdEtleVZhbHVlRGlmZmVyLl9yZXNldCIsIkRlZmF1bHRLZXlWYWx1ZURpZmZlci5fdHJ1bmNhdGUiLCJEZWZhdWx0S2V5VmFsdWVEaWZmZXIuX2lzSW5SZW1vdmFscyIsIkRlZmF1bHRLZXlWYWx1ZURpZmZlci5fYWRkVG9SZW1vdmFscyIsIkRlZmF1bHRLZXlWYWx1ZURpZmZlci5fcmVtb3ZlRnJvbVNlcSIsIkRlZmF1bHRLZXlWYWx1ZURpZmZlci5fcmVtb3ZlRnJvbVJlbW92YWxzIiwiRGVmYXVsdEtleVZhbHVlRGlmZmVyLl9hZGRUb0FkZGl0aW9ucyIsIkRlZmF1bHRLZXlWYWx1ZURpZmZlci5fYWRkVG9DaGFuZ2VzIiwiRGVmYXVsdEtleVZhbHVlRGlmZmVyLnRvU3RyaW5nIiwiRGVmYXVsdEtleVZhbHVlRGlmZmVyLl9mb3JFYWNoIiwiS1ZDaGFuZ2VSZWNvcmQiLCJLVkNoYW5nZVJlY29yZC5jb25zdHJ1Y3RvciIsIktWQ2hhbmdlUmVjb3JkLnRvU3RyaW5nIiwiQVNUIiwiQVNULmNvbnN0cnVjdG9yIiwiQVNULnZpc2l0IiwiQVNULnRvU3RyaW5nIiwiUXVvdGUiLCJRdW90ZS5jb25zdHJ1Y3RvciIsIlF1b3RlLnZpc2l0IiwiUXVvdGUudG9TdHJpbmciLCJFbXB0eUV4cHIiLCJFbXB0eUV4cHIuY29uc3RydWN0b3IiLCJFbXB0eUV4cHIudmlzaXQiLCJJbXBsaWNpdFJlY2VpdmVyIiwiSW1wbGljaXRSZWNlaXZlci5jb25zdHJ1Y3RvciIsIkltcGxpY2l0UmVjZWl2ZXIudmlzaXQiLCJDaGFpbiIsIkNoYWluLmNvbnN0cnVjdG9yIiwiQ2hhaW4udmlzaXQiLCJDb25kaXRpb25hbCIsIkNvbmRpdGlvbmFsLmNvbnN0cnVjdG9yIiwiQ29uZGl0aW9uYWwudmlzaXQiLCJQcm9wZXJ0eVJlYWQiLCJQcm9wZXJ0eVJlYWQuY29uc3RydWN0b3IiLCJQcm9wZXJ0eVJlYWQudmlzaXQiLCJQcm9wZXJ0eVdyaXRlIiwiUHJvcGVydHlXcml0ZS5jb25zdHJ1Y3RvciIsIlByb3BlcnR5V3JpdGUudmlzaXQiLCJTYWZlUHJvcGVydHlSZWFkIiwiU2FmZVByb3BlcnR5UmVhZC5jb25zdHJ1Y3RvciIsIlNhZmVQcm9wZXJ0eVJlYWQudmlzaXQiLCJLZXllZFJlYWQiLCJLZXllZFJlYWQuY29uc3RydWN0b3IiLCJLZXllZFJlYWQudmlzaXQiLCJLZXllZFdyaXRlIiwiS2V5ZWRXcml0ZS5jb25zdHJ1Y3RvciIsIktleWVkV3JpdGUudmlzaXQiLCJCaW5kaW5nUGlwZSIsIkJpbmRpbmdQaXBlLmNvbnN0cnVjdG9yIiwiQmluZGluZ1BpcGUudmlzaXQiLCJMaXRlcmFsUHJpbWl0aXZlIiwiTGl0ZXJhbFByaW1pdGl2ZS5jb25zdHJ1Y3RvciIsIkxpdGVyYWxQcmltaXRpdmUudmlzaXQiLCJMaXRlcmFsQXJyYXkiLCJMaXRlcmFsQXJyYXkuY29uc3RydWN0b3IiLCJMaXRlcmFsQXJyYXkudmlzaXQiLCJMaXRlcmFsTWFwIiwiTGl0ZXJhbE1hcC5jb25zdHJ1Y3RvciIsIkxpdGVyYWxNYXAudmlzaXQiLCJJbnRlcnBvbGF0aW9uIiwiSW50ZXJwb2xhdGlvbi5jb25zdHJ1Y3RvciIsIkludGVycG9sYXRpb24udmlzaXQiLCJCaW5hcnkiLCJCaW5hcnkuY29uc3RydWN0b3IiLCJCaW5hcnkudmlzaXQiLCJQcmVmaXhOb3QiLCJQcmVmaXhOb3QuY29uc3RydWN0b3IiLCJQcmVmaXhOb3QudmlzaXQiLCJNZXRob2RDYWxsIiwiTWV0aG9kQ2FsbC5jb25zdHJ1Y3RvciIsIk1ldGhvZENhbGwudmlzaXQiLCJTYWZlTWV0aG9kQ2FsbCIsIlNhZmVNZXRob2RDYWxsLmNvbnN0cnVjdG9yIiwiU2FmZU1ldGhvZENhbGwudmlzaXQiLCJGdW5jdGlvbkNhbGwiLCJGdW5jdGlvbkNhbGwuY29uc3RydWN0b3IiLCJGdW5jdGlvbkNhbGwudmlzaXQiLCJBU1RXaXRoU291cmNlIiwiQVNUV2l0aFNvdXJjZS5jb25zdHJ1Y3RvciIsIkFTVFdpdGhTb3VyY2UudmlzaXQiLCJBU1RXaXRoU291cmNlLnRvU3RyaW5nIiwiVGVtcGxhdGVCaW5kaW5nIiwiVGVtcGxhdGVCaW5kaW5nLmNvbnN0cnVjdG9yIiwiUmVjdXJzaXZlQXN0VmlzaXRvciIsIlJlY3Vyc2l2ZUFzdFZpc2l0b3IuY29uc3RydWN0b3IiLCJSZWN1cnNpdmVBc3RWaXNpdG9yLnZpc2l0QmluYXJ5IiwiUmVjdXJzaXZlQXN0VmlzaXRvci52aXNpdENoYWluIiwiUmVjdXJzaXZlQXN0VmlzaXRvci52aXNpdENvbmRpdGlvbmFsIiwiUmVjdXJzaXZlQXN0VmlzaXRvci52aXNpdFBpcGUiLCJSZWN1cnNpdmVBc3RWaXNpdG9yLnZpc2l0RnVuY3Rpb25DYWxsIiwiUmVjdXJzaXZlQXN0VmlzaXRvci52aXNpdEltcGxpY2l0UmVjZWl2ZXIiLCJSZWN1cnNpdmVBc3RWaXNpdG9yLnZpc2l0SW50ZXJwb2xhdGlvbiIsIlJlY3Vyc2l2ZUFzdFZpc2l0b3IudmlzaXRLZXllZFJlYWQiLCJSZWN1cnNpdmVBc3RWaXNpdG9yLnZpc2l0S2V5ZWRXcml0ZSIsIlJlY3Vyc2l2ZUFzdFZpc2l0b3IudmlzaXRMaXRlcmFsQXJyYXkiLCJSZWN1cnNpdmVBc3RWaXNpdG9yLnZpc2l0TGl0ZXJhbE1hcCIsIlJlY3Vyc2l2ZUFzdFZpc2l0b3IudmlzaXRMaXRlcmFsUHJpbWl0aXZlIiwiUmVjdXJzaXZlQXN0VmlzaXRvci52aXNpdE1ldGhvZENhbGwiLCJSZWN1cnNpdmVBc3RWaXNpdG9yLnZpc2l0UHJlZml4Tm90IiwiUmVjdXJzaXZlQXN0VmlzaXRvci52aXNpdFByb3BlcnR5UmVhZCIsIlJlY3Vyc2l2ZUFzdFZpc2l0b3IudmlzaXRQcm9wZXJ0eVdyaXRlIiwiUmVjdXJzaXZlQXN0VmlzaXRvci52aXNpdFNhZmVQcm9wZXJ0eVJlYWQiLCJSZWN1cnNpdmVBc3RWaXNpdG9yLnZpc2l0U2FmZU1ldGhvZENhbGwiLCJSZWN1cnNpdmVBc3RWaXNpdG9yLnZpc2l0QWxsIiwiUmVjdXJzaXZlQXN0VmlzaXRvci52aXNpdFF1b3RlIiwiQXN0VHJhbnNmb3JtZXIiLCJBc3RUcmFuc2Zvcm1lci5jb25zdHJ1Y3RvciIsIkFzdFRyYW5zZm9ybWVyLnZpc2l0SW1wbGljaXRSZWNlaXZlciIsIkFzdFRyYW5zZm9ybWVyLnZpc2l0SW50ZXJwb2xhdGlvbiIsIkFzdFRyYW5zZm9ybWVyLnZpc2l0TGl0ZXJhbFByaW1pdGl2ZSIsIkFzdFRyYW5zZm9ybWVyLnZpc2l0UHJvcGVydHlSZWFkIiwiQXN0VHJhbnNmb3JtZXIudmlzaXRQcm9wZXJ0eVdyaXRlIiwiQXN0VHJhbnNmb3JtZXIudmlzaXRTYWZlUHJvcGVydHlSZWFkIiwiQXN0VHJhbnNmb3JtZXIudmlzaXRNZXRob2RDYWxsIiwiQXN0VHJhbnNmb3JtZXIudmlzaXRTYWZlTWV0aG9kQ2FsbCIsIkFzdFRyYW5zZm9ybWVyLnZpc2l0RnVuY3Rpb25DYWxsIiwiQXN0VHJhbnNmb3JtZXIudmlzaXRMaXRlcmFsQXJyYXkiLCJBc3RUcmFuc2Zvcm1lci52aXNpdExpdGVyYWxNYXAiLCJBc3RUcmFuc2Zvcm1lci52aXNpdEJpbmFyeSIsIkFzdFRyYW5zZm9ybWVyLnZpc2l0UHJlZml4Tm90IiwiQXN0VHJhbnNmb3JtZXIudmlzaXRDb25kaXRpb25hbCIsIkFzdFRyYW5zZm9ybWVyLnZpc2l0UGlwZSIsIkFzdFRyYW5zZm9ybWVyLnZpc2l0S2V5ZWRSZWFkIiwiQXN0VHJhbnNmb3JtZXIudmlzaXRLZXllZFdyaXRlIiwiQXN0VHJhbnNmb3JtZXIudmlzaXRBbGwiLCJBc3RUcmFuc2Zvcm1lci52aXNpdENoYWluIiwiQXN0VHJhbnNmb3JtZXIudmlzaXRRdW90ZSIsIlRva2VuVHlwZSIsIkxleGVyIiwiTGV4ZXIuY29uc3RydWN0b3IiLCJMZXhlci50b2tlbml6ZSIsIlRva2VuIiwiVG9rZW4uY29uc3RydWN0b3IiLCJUb2tlbi5pc0NoYXJhY3RlciIsIlRva2VuLmlzTnVtYmVyIiwiVG9rZW4uaXNTdHJpbmciLCJUb2tlbi5pc09wZXJhdG9yIiwiVG9rZW4uaXNJZGVudGlmaWVyIiwiVG9rZW4uaXNLZXl3b3JkIiwiVG9rZW4uaXNLZXl3b3JkVmFyIiwiVG9rZW4uaXNLZXl3b3JkTnVsbCIsIlRva2VuLmlzS2V5d29yZFVuZGVmaW5lZCIsIlRva2VuLmlzS2V5d29yZFRydWUiLCJUb2tlbi5pc0tleXdvcmRGYWxzZSIsIlRva2VuLnRvTnVtYmVyIiwiVG9rZW4udG9TdHJpbmciLCJuZXdDaGFyYWN0ZXJUb2tlbiIsIm5ld0lkZW50aWZpZXJUb2tlbiIsIm5ld0tleXdvcmRUb2tlbiIsIm5ld09wZXJhdG9yVG9rZW4iLCJuZXdTdHJpbmdUb2tlbiIsIm5ld051bWJlclRva2VuIiwiU2Nhbm5lckVycm9yIiwiU2Nhbm5lckVycm9yLmNvbnN0cnVjdG9yIiwiU2Nhbm5lckVycm9yLnRvU3RyaW5nIiwiX1NjYW5uZXIiLCJfU2Nhbm5lci5jb25zdHJ1Y3RvciIsIl9TY2FubmVyLmFkdmFuY2UiLCJfU2Nhbm5lci5zY2FuVG9rZW4iLCJfU2Nhbm5lci5zY2FuQ2hhcmFjdGVyIiwiX1NjYW5uZXIuc2Nhbk9wZXJhdG9yIiwiX1NjYW5uZXIuc2NhbkNvbXBsZXhPcGVyYXRvciIsIl9TY2FubmVyLnNjYW5JZGVudGlmaWVyIiwiX1NjYW5uZXIuc2Nhbk51bWJlciIsIl9TY2FubmVyLnNjYW5TdHJpbmciLCJfU2Nhbm5lci5lcnJvciIsImlzV2hpdGVzcGFjZSIsImlzSWRlbnRpZmllclN0YXJ0IiwiaXNJZGVudGlmaWVyIiwiaXNJZGVudGlmaWVyUGFydCIsImlzRGlnaXQiLCJpc0V4cG9uZW50U3RhcnQiLCJpc0V4cG9uZW50U2lnbiIsInVuZXNjYXBlIiwiUGFyc2VFeGNlcHRpb24iLCJQYXJzZUV4Y2VwdGlvbi5jb25zdHJ1Y3RvciIsIlBhcnNlciIsIlBhcnNlci5jb25zdHJ1Y3RvciIsIlBhcnNlci5wYXJzZUFjdGlvbiIsIlBhcnNlci5wYXJzZUJpbmRpbmciLCJQYXJzZXIucGFyc2VTaW1wbGVCaW5kaW5nIiwiUGFyc2VyLl9wYXJzZUJpbmRpbmdBc3QiLCJQYXJzZXIuX3BhcnNlUXVvdGUiLCJQYXJzZXIucGFyc2VUZW1wbGF0ZUJpbmRpbmdzIiwiUGFyc2VyLnBhcnNlSW50ZXJwb2xhdGlvbiIsIlBhcnNlci53cmFwTGl0ZXJhbFByaW1pdGl2ZSIsIlBhcnNlci5fY2hlY2tOb0ludGVycG9sYXRpb24iLCJQYXJzZXIuX2ZpbmRJbnRlcnBvbGF0aW9uRXJyb3JDb2x1bW4iLCJfUGFyc2VBU1QiLCJfUGFyc2VBU1QuY29uc3RydWN0b3IiLCJfUGFyc2VBU1QucGVlayIsIl9QYXJzZUFTVC5uZXh0IiwiX1BhcnNlQVNULmlucHV0SW5kZXgiLCJfUGFyc2VBU1QuYWR2YW5jZSIsIl9QYXJzZUFTVC5vcHRpb25hbENoYXJhY3RlciIsIl9QYXJzZUFTVC5vcHRpb25hbEtleXdvcmRWYXIiLCJfUGFyc2VBU1QucGVla0tleXdvcmRWYXIiLCJfUGFyc2VBU1QuZXhwZWN0Q2hhcmFjdGVyIiwiX1BhcnNlQVNULm9wdGlvbmFsT3BlcmF0b3IiLCJfUGFyc2VBU1QuZXhwZWN0T3BlcmF0b3IiLCJfUGFyc2VBU1QuZXhwZWN0SWRlbnRpZmllck9yS2V5d29yZCIsIl9QYXJzZUFTVC5leHBlY3RJZGVudGlmaWVyT3JLZXl3b3JkT3JTdHJpbmciLCJfUGFyc2VBU1QucGFyc2VDaGFpbiIsIl9QYXJzZUFTVC5wYXJzZVBpcGUiLCJfUGFyc2VBU1QucGFyc2VFeHByZXNzaW9uIiwiX1BhcnNlQVNULnBhcnNlQ29uZGl0aW9uYWwiLCJfUGFyc2VBU1QucGFyc2VMb2dpY2FsT3IiLCJfUGFyc2VBU1QucGFyc2VMb2dpY2FsQW5kIiwiX1BhcnNlQVNULnBhcnNlRXF1YWxpdHkiLCJfUGFyc2VBU1QucGFyc2VSZWxhdGlvbmFsIiwiX1BhcnNlQVNULnBhcnNlQWRkaXRpdmUiLCJfUGFyc2VBU1QucGFyc2VNdWx0aXBsaWNhdGl2ZSIsIl9QYXJzZUFTVC5wYXJzZVByZWZpeCIsIl9QYXJzZUFTVC5wYXJzZUNhbGxDaGFpbiIsIl9QYXJzZUFTVC5wYXJzZVByaW1hcnkiLCJfUGFyc2VBU1QucGFyc2VFeHByZXNzaW9uTGlzdCIsIl9QYXJzZUFTVC5wYXJzZUxpdGVyYWxNYXAiLCJfUGFyc2VBU1QucGFyc2VBY2Nlc3NNZW1iZXJPck1ldGhvZENhbGwiLCJfUGFyc2VBU1QucGFyc2VDYWxsQXJndW1lbnRzIiwiX1BhcnNlQVNULnBhcnNlQmxvY2tDb250ZW50IiwiX1BhcnNlQVNULmV4cGVjdFRlbXBsYXRlQmluZGluZ0tleSIsIl9QYXJzZUFTVC5wYXJzZVRlbXBsYXRlQmluZGluZ3MiLCJfUGFyc2VBU1QuZXJyb3IiLCJTaW1wbGVFeHByZXNzaW9uQ2hlY2tlciIsIlNpbXBsZUV4cHJlc3Npb25DaGVja2VyLmNvbnN0cnVjdG9yIiwiU2ltcGxlRXhwcmVzc2lvbkNoZWNrZXIuY2hlY2siLCJTaW1wbGVFeHByZXNzaW9uQ2hlY2tlci52aXNpdEltcGxpY2l0UmVjZWl2ZXIiLCJTaW1wbGVFeHByZXNzaW9uQ2hlY2tlci52aXNpdEludGVycG9sYXRpb24iLCJTaW1wbGVFeHByZXNzaW9uQ2hlY2tlci52aXNpdExpdGVyYWxQcmltaXRpdmUiLCJTaW1wbGVFeHByZXNzaW9uQ2hlY2tlci52aXNpdFByb3BlcnR5UmVhZCIsIlNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnZpc2l0UHJvcGVydHlXcml0ZSIsIlNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnZpc2l0U2FmZVByb3BlcnR5UmVhZCIsIlNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnZpc2l0TWV0aG9kQ2FsbCIsIlNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnZpc2l0U2FmZU1ldGhvZENhbGwiLCJTaW1wbGVFeHByZXNzaW9uQ2hlY2tlci52aXNpdEZ1bmN0aW9uQ2FsbCIsIlNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnZpc2l0TGl0ZXJhbEFycmF5IiwiU2ltcGxlRXhwcmVzc2lvbkNoZWNrZXIudmlzaXRMaXRlcmFsTWFwIiwiU2ltcGxlRXhwcmVzc2lvbkNoZWNrZXIudmlzaXRCaW5hcnkiLCJTaW1wbGVFeHByZXNzaW9uQ2hlY2tlci52aXNpdFByZWZpeE5vdCIsIlNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnZpc2l0Q29uZGl0aW9uYWwiLCJTaW1wbGVFeHByZXNzaW9uQ2hlY2tlci52aXNpdFBpcGUiLCJTaW1wbGVFeHByZXNzaW9uQ2hlY2tlci52aXNpdEtleWVkUmVhZCIsIlNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnZpc2l0S2V5ZWRXcml0ZSIsIlNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnZpc2l0QWxsIiwiU2ltcGxlRXhwcmVzc2lvbkNoZWNrZXIudmlzaXRDaGFpbiIsIlNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnZpc2l0UXVvdGUiLCJMb2NhbHMiLCJMb2NhbHMuY29uc3RydWN0b3IiLCJMb2NhbHMuY29udGFpbnMiLCJMb2NhbHMuZ2V0IiwiTG9jYWxzLnNldCIsIkxvY2Fscy5jbGVhclZhbHVlcyIsIkV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkRXhjZXB0aW9uIiwiRXhwcmVzc2lvbkNoYW5nZWRBZnRlckl0SGFzQmVlbkNoZWNrZWRFeGNlcHRpb24uY29uc3RydWN0b3IiLCJDaGFuZ2VEZXRlY3Rpb25FcnJvciIsIkNoYW5nZURldGVjdGlvbkVycm9yLmNvbnN0cnVjdG9yIiwiRGVoeWRyYXRlZEV4Y2VwdGlvbiIsIkRlaHlkcmF0ZWRFeGNlcHRpb24uY29uc3RydWN0b3IiLCJEZWJ1Z0NvbnRleHQiLCJEZWJ1Z0NvbnRleHQuY29uc3RydWN0b3IiLCJDaGFuZ2VEZXRlY3RvckdlbkNvbmZpZyIsIkNoYW5nZURldGVjdG9yR2VuQ29uZmlnLmNvbnN0cnVjdG9yIiwiQ2hhbmdlRGV0ZWN0b3JEZWZpbml0aW9uIiwiQ2hhbmdlRGV0ZWN0b3JEZWZpbml0aW9uLmNvbnN0cnVjdG9yIiwiQ2hhbmdlRGV0ZWN0b3JTdGF0ZSIsIkNoYW5nZURldGVjdGlvblN0cmF0ZWd5IiwiaXNEZWZhdWx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kiLCJEeW5hbWljUHJvdG9DaGFuZ2VEZXRlY3RvciIsIkR5bmFtaWNQcm90b0NoYW5nZURldGVjdG9yLmNvbnN0cnVjdG9yIiwiRHluYW1pY1Byb3RvQ2hhbmdlRGV0ZWN0b3IuaW5zdGFudGlhdGUiLCJjcmVhdGVQcm9wZXJ0eVJlY29yZHMiLCJjcmVhdGVFdmVudFJlY29yZHMiLCJQcm90b1JlY29yZEJ1aWxkZXIiLCJQcm90b1JlY29yZEJ1aWxkZXIuY29uc3RydWN0b3IiLCJQcm90b1JlY29yZEJ1aWxkZXIuYWRkIiwiUHJvdG9SZWNvcmRCdWlsZGVyLl9zZXRBcmd1bWVudFRvUHVyZUZ1bmN0aW9uIiwiUHJvdG9SZWNvcmRCdWlsZGVyLl9hcHBlbmRSZWNvcmRzIiwiX0NvbnZlcnRBc3RJbnRvUHJvdG9SZWNvcmRzIiwiX0NvbnZlcnRBc3RJbnRvUHJvdG9SZWNvcmRzLmNvbnN0cnVjdG9yIiwiX0NvbnZlcnRBc3RJbnRvUHJvdG9SZWNvcmRzLmFwcGVuZCIsIl9Db252ZXJ0QXN0SW50b1Byb3RvUmVjb3Jkcy5jcmVhdGUiLCJfQ29udmVydEFzdEludG9Qcm90b1JlY29yZHMudmlzaXRJbXBsaWNpdFJlY2VpdmVyIiwiX0NvbnZlcnRBc3RJbnRvUHJvdG9SZWNvcmRzLnZpc2l0SW50ZXJwb2xhdGlvbiIsIl9Db252ZXJ0QXN0SW50b1Byb3RvUmVjb3Jkcy52aXNpdExpdGVyYWxQcmltaXRpdmUiLCJfQ29udmVydEFzdEludG9Qcm90b1JlY29yZHMudmlzaXRQcm9wZXJ0eVJlYWQiLCJfQ29udmVydEFzdEludG9Qcm90b1JlY29yZHMudmlzaXRQcm9wZXJ0eVdyaXRlIiwiX0NvbnZlcnRBc3RJbnRvUHJvdG9SZWNvcmRzLnZpc2l0S2V5ZWRXcml0ZSIsIl9Db252ZXJ0QXN0SW50b1Byb3RvUmVjb3Jkcy52aXNpdFNhZmVQcm9wZXJ0eVJlYWQiLCJfQ29udmVydEFzdEludG9Qcm90b1JlY29yZHMudmlzaXRNZXRob2RDYWxsIiwiX0NvbnZlcnRBc3RJbnRvUHJvdG9SZWNvcmRzLnZpc2l0U2FmZU1ldGhvZENhbGwiLCJfQ29udmVydEFzdEludG9Qcm90b1JlY29yZHMudmlzaXRGdW5jdGlvbkNhbGwiLCJfQ29udmVydEFzdEludG9Qcm90b1JlY29yZHMudmlzaXRMaXRlcmFsQXJyYXkiLCJfQ29udmVydEFzdEludG9Qcm90b1JlY29yZHMudmlzaXRMaXRlcmFsTWFwIiwiX0NvbnZlcnRBc3RJbnRvUHJvdG9SZWNvcmRzLnZpc2l0QmluYXJ5IiwiX0NvbnZlcnRBc3RJbnRvUHJvdG9SZWNvcmRzLnZpc2l0UHJlZml4Tm90IiwiX0NvbnZlcnRBc3RJbnRvUHJvdG9SZWNvcmRzLnZpc2l0Q29uZGl0aW9uYWwiLCJfQ29udmVydEFzdEludG9Qcm90b1JlY29yZHMudmlzaXRQaXBlIiwiX0NvbnZlcnRBc3RJbnRvUHJvdG9SZWNvcmRzLnZpc2l0S2V5ZWRSZWFkIiwiX0NvbnZlcnRBc3RJbnRvUHJvdG9SZWNvcmRzLnZpc2l0Q2hhaW4iLCJfQ29udmVydEFzdEludG9Qcm90b1JlY29yZHMudmlzaXRRdW90ZSIsIl9Db252ZXJ0QXN0SW50b1Byb3RvUmVjb3Jkcy5fdmlzaXRBbGwiLCJfQ29udmVydEFzdEludG9Qcm90b1JlY29yZHMuX2FkZFJlY29yZCIsIl9hcnJheUZuIiwiX21hcFByaW1pdGl2ZU5hbWUiLCJfb3BlcmF0aW9uVG9QcmltaXRpdmVOYW1lIiwiX29wZXJhdGlvblRvRnVuY3Rpb24iLCJzIiwiX2ludGVycG9sYXRpb25GbiIsIldyYXBwZWRWYWx1ZSIsIldyYXBwZWRWYWx1ZS5jb25zdHJ1Y3RvciIsIldyYXBwZWRWYWx1ZS53cmFwIiwiU2ltcGxlQ2hhbmdlIiwiU2ltcGxlQ2hhbmdlLmNvbnN0cnVjdG9yIiwiU2ltcGxlQ2hhbmdlLmlzRmlyc3RDaGFuZ2UiLCJfc2ltcGxlQ2hhbmdlIiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbCIsIkNoYW5nZURldGVjdGlvblV0aWwuY29uc3RydWN0b3IiLCJDaGFuZ2VEZXRlY3Rpb25VdGlsLmFycmF5Rm4wIiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbC5hcnJheUZuMSIsIkNoYW5nZURldGVjdGlvblV0aWwuYXJyYXlGbjIiLCJDaGFuZ2VEZXRlY3Rpb25VdGlsLmFycmF5Rm4zIiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbC5hcnJheUZuNCIsIkNoYW5nZURldGVjdGlvblV0aWwuYXJyYXlGbjUiLCJDaGFuZ2VEZXRlY3Rpb25VdGlsLmFycmF5Rm42IiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbC5hcnJheUZuNyIsIkNoYW5nZURldGVjdGlvblV0aWwuYXJyYXlGbjgiLCJDaGFuZ2VEZXRlY3Rpb25VdGlsLmFycmF5Rm45IiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbC5vcGVyYXRpb25fbmVnYXRlIiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbC5vcGVyYXRpb25fYWRkIiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbC5vcGVyYXRpb25fc3VidHJhY3QiLCJDaGFuZ2VEZXRlY3Rpb25VdGlsLm9wZXJhdGlvbl9tdWx0aXBseSIsIkNoYW5nZURldGVjdGlvblV0aWwub3BlcmF0aW9uX2RpdmlkZSIsIkNoYW5nZURldGVjdGlvblV0aWwub3BlcmF0aW9uX3JlbWFpbmRlciIsIkNoYW5nZURldGVjdGlvblV0aWwub3BlcmF0aW9uX2VxdWFscyIsIkNoYW5nZURldGVjdGlvblV0aWwub3BlcmF0aW9uX25vdF9lcXVhbHMiLCJDaGFuZ2VEZXRlY3Rpb25VdGlsLm9wZXJhdGlvbl9pZGVudGljYWwiLCJDaGFuZ2VEZXRlY3Rpb25VdGlsLm9wZXJhdGlvbl9ub3RfaWRlbnRpY2FsIiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbC5vcGVyYXRpb25fbGVzc190aGVuIiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbC5vcGVyYXRpb25fZ3JlYXRlcl90aGVuIiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbC5vcGVyYXRpb25fbGVzc19vcl9lcXVhbHNfdGhlbiIsIkNoYW5nZURldGVjdGlvblV0aWwub3BlcmF0aW9uX2dyZWF0ZXJfb3JfZXF1YWxzX3RoZW4iLCJDaGFuZ2VEZXRlY3Rpb25VdGlsLmNvbmQiLCJDaGFuZ2VEZXRlY3Rpb25VdGlsLm1hcEZuIiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbC5tYXBGbi5idWlsZE1hcCIsIkNoYW5nZURldGVjdGlvblV0aWwua2V5ZWRBY2Nlc3MiLCJDaGFuZ2VEZXRlY3Rpb25VdGlsLnVud3JhcFZhbHVlIiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbC5jaGFuZ2VEZXRlY3Rpb25Nb2RlIiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbC5zaW1wbGVDaGFuZ2UiLCJDaGFuZ2VEZXRlY3Rpb25VdGlsLmlzVmFsdWVCbGFuayIsIkNoYW5nZURldGVjdGlvblV0aWwucyIsIkNoYW5nZURldGVjdGlvblV0aWwucHJvdG9CeUluZGV4IiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbC5jYWxsUGlwZU9uRGVzdHJveSIsIkNoYW5nZURldGVjdGlvblV0aWwuYmluZGluZ1RhcmdldCIsIkNoYW5nZURldGVjdGlvblV0aWwuZGlyZWN0aXZlSW5kZXgiLCJDaGFuZ2VEZXRlY3Rpb25VdGlsLmxvb3NlTm90SWRlbnRpY2FsIiwiaW1wbGVtZW50c09uRGVzdHJveSIsIkJpbmRpbmdUYXJnZXQiLCJCaW5kaW5nVGFyZ2V0LmNvbnN0cnVjdG9yIiwiQmluZGluZ1RhcmdldC5pc0RpcmVjdGl2ZSIsIkJpbmRpbmdUYXJnZXQuaXNFbGVtZW50UHJvcGVydHkiLCJCaW5kaW5nVGFyZ2V0LmlzRWxlbWVudEF0dHJpYnV0ZSIsIkJpbmRpbmdUYXJnZXQuaXNFbGVtZW50Q2xhc3MiLCJCaW5kaW5nVGFyZ2V0LmlzRWxlbWVudFN0eWxlIiwiQmluZGluZ1RhcmdldC5pc1RleHROb2RlIiwiQmluZGluZ1JlY29yZCIsIkJpbmRpbmdSZWNvcmQuY29uc3RydWN0b3IiLCJCaW5kaW5nUmVjb3JkLmlzRGlyZWN0aXZlTGlmZWN5Y2xlIiwiQmluZGluZ1JlY29yZC5jYWxsT25DaGFuZ2VzIiwiQmluZGluZ1JlY29yZC5pc0RlZmF1bHRDaGFuZ2VEZXRlY3Rpb24iLCJCaW5kaW5nUmVjb3JkLmNyZWF0ZURpcmVjdGl2ZURvQ2hlY2siLCJCaW5kaW5nUmVjb3JkLmNyZWF0ZURpcmVjdGl2ZU9uSW5pdCIsIkJpbmRpbmdSZWNvcmQuY3JlYXRlRGlyZWN0aXZlT25DaGFuZ2VzIiwiQmluZGluZ1JlY29yZC5jcmVhdGVGb3JEaXJlY3RpdmUiLCJCaW5kaW5nUmVjb3JkLmNyZWF0ZUZvckVsZW1lbnRQcm9wZXJ0eSIsIkJpbmRpbmdSZWNvcmQuY3JlYXRlRm9yRWxlbWVudEF0dHJpYnV0ZSIsIkJpbmRpbmdSZWNvcmQuY3JlYXRlRm9yRWxlbWVudENsYXNzIiwiQmluZGluZ1JlY29yZC5jcmVhdGVGb3JFbGVtZW50U3R5bGUiLCJCaW5kaW5nUmVjb3JkLmNyZWF0ZUZvckhvc3RQcm9wZXJ0eSIsIkJpbmRpbmdSZWNvcmQuY3JlYXRlRm9ySG9zdEF0dHJpYnV0ZSIsIkJpbmRpbmdSZWNvcmQuY3JlYXRlRm9ySG9zdENsYXNzIiwiQmluZGluZ1JlY29yZC5jcmVhdGVGb3JIb3N0U3R5bGUiLCJCaW5kaW5nUmVjb3JkLmNyZWF0ZUZvclRleHROb2RlIiwiQmluZGluZ1JlY29yZC5jcmVhdGVGb3JFdmVudCIsIkJpbmRpbmdSZWNvcmQuY3JlYXRlRm9ySG9zdEV2ZW50IiwiRGlyZWN0aXZlSW5kZXgiLCJEaXJlY3RpdmVJbmRleC5jb25zdHJ1Y3RvciIsIkRpcmVjdGl2ZUluZGV4Lm5hbWUiLCJEaXJlY3RpdmVSZWNvcmQiLCJEaXJlY3RpdmVSZWNvcmQuY29uc3RydWN0b3IiLCJEaXJlY3RpdmVSZWNvcmQuaXNEZWZhdWx0Q2hhbmdlRGV0ZWN0aW9uIiwiRHluYW1pY0NoYW5nZURldGVjdG9yIiwiRHluYW1pY0NoYW5nZURldGVjdG9yLmNvbnN0cnVjdG9yIiwiRHluYW1pY0NoYW5nZURldGVjdG9yLmhhbmRsZUV2ZW50SW50ZXJuYWwiLCJEeW5hbWljQ2hhbmdlRGV0ZWN0b3IuX3Byb2Nlc3NFdmVudEJpbmRpbmciLCJEeW5hbWljQ2hhbmdlRGV0ZWN0b3IuX2NvbXB1dGVTa2lwTGVuZ3RoIiwiRHluYW1pY0NoYW5nZURldGVjdG9yLl9tYXJrUGF0aEFzQ2hlY2tPbmNlIiwiRHluYW1pY0NoYW5nZURldGVjdG9yLl9tYXRjaGluZ0V2ZW50QmluZGluZ3MiLCJEeW5hbWljQ2hhbmdlRGV0ZWN0b3IuaHlkcmF0ZURpcmVjdGl2ZXMiLCJEeW5hbWljQ2hhbmdlRGV0ZWN0b3IuZGVoeWRyYXRlRGlyZWN0aXZlcyIsIkR5bmFtaWNDaGFuZ2VEZXRlY3Rvci5fZGVzdHJveVBpcGVzIiwiRHluYW1pY0NoYW5nZURldGVjdG9yLmNoZWNrTm9DaGFuZ2VzIiwiRHluYW1pY0NoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXNJblJlY29yZHNJbnRlcm5hbCIsIkR5bmFtaWNDaGFuZ2VEZXRlY3Rvci5fZmlyc3RJbkJpbmRpbmciLCJEeW5hbWljQ2hhbmdlRGV0ZWN0b3IuYWZ0ZXJDb250ZW50TGlmZWN5Y2xlQ2FsbGJhY2tzSW50ZXJuYWwiLCJEeW5hbWljQ2hhbmdlRGV0ZWN0b3IuYWZ0ZXJWaWV3TGlmZWN5Y2xlQ2FsbGJhY2tzSW50ZXJuYWwiLCJEeW5hbWljQ2hhbmdlRGV0ZWN0b3IuX3VwZGF0ZURpcmVjdGl2ZU9yRWxlbWVudCIsIkR5bmFtaWNDaGFuZ2VEZXRlY3Rvci5fYWRkQ2hhbmdlIiwiRHluYW1pY0NoYW5nZURldGVjdG9yLl9nZXREaXJlY3RpdmVGb3IiLCJEeW5hbWljQ2hhbmdlRGV0ZWN0b3IuX2dldERldGVjdG9yRm9yIiwiRHluYW1pY0NoYW5nZURldGVjdG9yLl9jaGVjayIsIkR5bmFtaWNDaGFuZ2VEZXRlY3Rvci5fcmVmZXJlbmNlQ2hlY2siLCJEeW5hbWljQ2hhbmdlRGV0ZWN0b3IuX2NhbGN1bGF0ZUN1cnJWYWx1ZSIsIkR5bmFtaWNDaGFuZ2VEZXRlY3Rvci5fcGlwZUNoZWNrIiwiRHluYW1pY0NoYW5nZURldGVjdG9yLl9waXBlRm9yIiwiRHluYW1pY0NoYW5nZURldGVjdG9yLl9yZWFkQ29udGV4dCIsIkR5bmFtaWNDaGFuZ2VEZXRlY3Rvci5fcmVhZFNlbGYiLCJEeW5hbWljQ2hhbmdlRGV0ZWN0b3IuX3dyaXRlU2VsZiIsIkR5bmFtaWNDaGFuZ2VEZXRlY3Rvci5fcmVhZFBpcGUiLCJEeW5hbWljQ2hhbmdlRGV0ZWN0b3IuX3dyaXRlUGlwZSIsIkR5bmFtaWNDaGFuZ2VEZXRlY3Rvci5fc2V0Q2hhbmdlZCIsIkR5bmFtaWNDaGFuZ2VEZXRlY3Rvci5fcHVyZUZ1bmNBbmRBcmdzRGlkTm90Q2hhbmdlIiwiRHluYW1pY0NoYW5nZURldGVjdG9yLl9hcmdzQ2hhbmdlZCIsIkR5bmFtaWNDaGFuZ2VEZXRlY3Rvci5fYXJnc09yQ29udGV4dENoYW5nZWQiLCJEeW5hbWljQ2hhbmdlRGV0ZWN0b3IuX3JlYWRBcmdzIiwiX0NvbnRleHQiLCJfQ29udGV4dC5jb25zdHJ1Y3RvciIsIkFic3RyYWN0Q2hhbmdlRGV0ZWN0b3IiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLmNvbnN0cnVjdG9yIiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5hZGRDb250ZW50Q2hpbGQiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLnJlbW92ZUNvbnRlbnRDaGlsZCIsIkFic3RyYWN0Q2hhbmdlRGV0ZWN0b3IuYWRkVmlld0NoaWxkIiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5yZW1vdmVWaWV3Q2hpbGQiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLnJlbW92ZSIsIkFic3RyYWN0Q2hhbmdlRGV0ZWN0b3IuaGFuZGxlRXZlbnQiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLmhhbmRsZUV2ZW50SW50ZXJuYWwiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLmNoZWNrTm9DaGFuZ2VzIiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5ydW5EZXRlY3RDaGFuZ2VzIiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzSW5SZWNvcmRzIiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzSW5SZWNvcmRzSW50ZXJuYWwiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLmh5ZHJhdGUiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLmh5ZHJhdGVEaXJlY3RpdmVzIiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5kZWh5ZHJhdGUiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLmRlaHlkcmF0ZURpcmVjdGl2ZXMiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLmh5ZHJhdGVkIiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5hZnRlckNvbnRlbnRMaWZlY3ljbGVDYWxsYmFja3MiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLmFmdGVyQ29udGVudExpZmVjeWNsZUNhbGxiYWNrc0ludGVybmFsIiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5hZnRlclZpZXdMaWZlY3ljbGVDYWxsYmFja3MiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLmFmdGVyVmlld0xpZmVjeWNsZUNhbGxiYWNrc0ludGVybmFsIiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5fZGV0ZWN0Q2hhbmdlc0NvbnRlbnRDaGlsZHJlbiIsIkFic3RyYWN0Q2hhbmdlRGV0ZWN0b3IuX2RldGVjdENoYW5nZXNJblZpZXdDaGlsZHJlbiIsIkFic3RyYWN0Q2hhbmdlRGV0ZWN0b3IubWFya0FzQ2hlY2tPbmNlIiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5tYXJrUGF0aFRvUm9vdEFzQ2hlY2tPbmNlIiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5fdW5zdWJzcmliZUZyb21PYnNlcnZhYmxlcyIsIkFic3RyYWN0Q2hhbmdlRGV0ZWN0b3Iub2JzZXJ2ZVZhbHVlIiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5vYnNlcnZlRGlyZWN0aXZlIiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5vYnNlcnZlQ29tcG9uZW50IiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5fY3JlYXRlQXJyYXlUb1N0b3JlT2JzZXJ2YWJsZXMiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLmdldERpcmVjdGl2ZUZvciIsIkFic3RyYWN0Q2hhbmdlRGV0ZWN0b3IuZ2V0RGV0ZWN0b3JGb3IiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLm5vdGlmeURpc3BhdGNoZXIiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLmxvZ0JpbmRpbmdVcGRhdGUiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLmFkZENoYW5nZSIsIkFic3RyYWN0Q2hhbmdlRGV0ZWN0b3IuX3Rocm93RXJyb3IiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLnRocm93T25DaGFuZ2VFcnJvciIsIkFic3RyYWN0Q2hhbmdlRGV0ZWN0b3IudGhyb3dEZWh5ZHJhdGVkRXJyb3IiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLl9jdXJyZW50QmluZGluZyIsIkNoYW5nZURldGVjdG9yUmVmIiwiQ2hhbmdlRGV0ZWN0b3JSZWYuY29uc3RydWN0b3IiLCJDaGFuZ2VEZXRlY3RvclJlZl8iLCJDaGFuZ2VEZXRlY3RvclJlZl8uY29uc3RydWN0b3IiLCJDaGFuZ2VEZXRlY3RvclJlZl8ubWFya0ZvckNoZWNrIiwiQ2hhbmdlRGV0ZWN0b3JSZWZfLmRldGFjaCIsIkNoYW5nZURldGVjdG9yUmVmXy5kZXRlY3RDaGFuZ2VzIiwiQ2hhbmdlRGV0ZWN0b3JSZWZfLmNoZWNrTm9DaGFuZ2VzIiwiQ2hhbmdlRGV0ZWN0b3JSZWZfLnJlYXR0YWNoIiwibm9vcFNjb3BlIiwiZGV0ZWN0V1RGIiwiY3JlYXRlU2NvcGUiLCJsZWF2ZSIsInN0YXJ0VGltZVJhbmdlIiwiZW5kVGltZVJhbmdlIiwiaXNPYnNlcnZhYmxlIiwiUmVjb3JkVHlwZSIsIlByb3RvUmVjb3JkIiwiUHJvdG9SZWNvcmQuY29uc3RydWN0b3IiLCJQcm90b1JlY29yZC5pc1B1cmVGdW5jdGlvbiIsIlByb3RvUmVjb3JkLmlzVXNlZEJ5T3RoZXJSZWNvcmQiLCJQcm90b1JlY29yZC5zaG91bGRCZUNoZWNrZWQiLCJQcm90b1JlY29yZC5pc1BpcGVSZWNvcmQiLCJQcm90b1JlY29yZC5pc0NvbmRpdGlvbmFsU2tpcFJlY29yZCIsIlByb3RvUmVjb3JkLmlzVW5jb25kaXRpb25hbFNraXBSZWNvcmQiLCJQcm90b1JlY29yZC5pc1NraXBSZWNvcmQiLCJQcm90b1JlY29yZC5pc0xpZmVDeWNsZVJlY29yZCIsIkV2ZW50QmluZGluZyIsIkV2ZW50QmluZGluZy5jb25zdHJ1Y3RvciIsImNvYWxlc2NlIiwiX29wdGltaXplU2tpcHMiLCJfbWF5QmVBZGRSZWNvcmQiLCJfZmluZEZpcnN0TWF0Y2giLCJfY2xvbmVBbmRVcGRhdGVJbmRleGVzIiwiX3NyY1RvRHN0U2VsZkluZGV4IiwiX2NyZWF0ZVNlbGZSZWNvcmQiLCJfaGF2ZVNhbWVEaXJJbmRleCIsIkppdFByb3RvQ2hhbmdlRGV0ZWN0b3IiLCJKaXRQcm90b0NoYW5nZURldGVjdG9yLmNvbnN0cnVjdG9yIiwiSml0UHJvdG9DaGFuZ2VEZXRlY3Rvci5pc1N1cHBvcnRlZCIsIkppdFByb3RvQ2hhbmdlRGV0ZWN0b3IuaW5zdGFudGlhdGUiLCJKaXRQcm90b0NoYW5nZURldGVjdG9yLl9jcmVhdGVGYWN0b3J5IiwiQ2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3IiLCJDaGFuZ2VEZXRlY3RvckpJVEdlbmVyYXRvci5jb25zdHJ1Y3RvciIsIkNoYW5nZURldGVjdG9ySklUR2VuZXJhdG9yLmdlbmVyYXRlIiwiQ2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3IuZ2VuZXJhdGVTb3VyY2UiLCJDaGFuZ2VEZXRlY3RvckpJVEdlbmVyYXRvci5fZ2VuUHJvcGVydHlCaW5kaW5nVGFyZ2V0cyIsIkNoYW5nZURldGVjdG9ySklUR2VuZXJhdG9yLl9nZW5EaXJlY3RpdmVJbmRpY2VzIiwiQ2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3IuX21heWJlR2VuSGFuZGxlRXZlbnRJbnRlcm5hbCIsIkNoYW5nZURldGVjdG9ySklUR2VuZXJhdG9yLl9nZW5FdmVudEJpbmRpbmciLCJDaGFuZ2VEZXRlY3RvckpJVEdlbmVyYXRvci5fZ2VuRXZlbnRCaW5kaW5nRXZhbCIsIkNoYW5nZURldGVjdG9ySklUR2VuZXJhdG9yLl9nZW5NYXJrUGF0aFRvUm9vdEFzQ2hlY2tPbmNlIiwiQ2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3IuX2dlblVwZGF0ZVByZXZlbnREZWZhdWx0IiwiQ2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3IuX21heWJlR2VuRGVoeWRyYXRlRGlyZWN0aXZlcyIsIkNoYW5nZURldGVjdG9ySklUR2VuZXJhdG9yLl9tYXliZUdlbkh5ZHJhdGVEaXJlY3RpdmVzIiwiQ2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3IuX21heWJlR2VuQWZ0ZXJDb250ZW50TGlmZWN5Y2xlQ2FsbGJhY2tzIiwiQ2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3IuX21heWJlR2VuQWZ0ZXJWaWV3TGlmZWN5Y2xlQ2FsbGJhY2tzIiwiQ2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3IuX2dlbkFsbFJlY29yZHMiLCJDaGFuZ2VEZXRlY3RvckpJVEdlbmVyYXRvci5fZ2VuQ29uZGl0aW9uYWxTa2lwIiwiQ2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3IuX2dlblVuY29uZGl0aW9uYWxTa2lwIiwiQ2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3IuX2dlbkVuZE9mU2tpcEJsb2NrIiwiQ2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3IuX2dlbkRpcmVjdGl2ZUxpZmVjeWNsZSIsIkNoYW5nZURldGVjdG9ySklUR2VuZXJhdG9yLl9nZW5QaXBlQ2hlY2siLCJDaGFuZ2VEZXRlY3RvckpJVEdlbmVyYXRvci5fZ2VuUmVmZXJlbmNlQ2hlY2siLCJDaGFuZ2VEZXRlY3RvckpJVEdlbmVyYXRvci5fZ2VuQ2hhbmdlTWFya2VyIiwiQ2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3IuX2dlblVwZGF0ZURpcmVjdGl2ZU9yRWxlbWVudCIsIkNoYW5nZURldGVjdG9ySklUR2VuZXJhdG9yLl9nZW5UaHJvd09uQ2hhbmdlQ2hlY2siLCJDaGFuZ2VEZXRlY3RvckpJVEdlbmVyYXRvci5fZ2VuQWRkVG9DaGFuZ2VzIiwiQ2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3IuX21heWJlRmlyc3RJbkJpbmRpbmciLCJDaGFuZ2VEZXRlY3RvckpJVEdlbmVyYXRvci5fbWF5YmVHZW5MYXN0SW5EaXJlY3RpdmUiLCJDaGFuZ2VEZXRlY3RvckpJVEdlbmVyYXRvci5fZ2VuT25DaGVjayIsIkNoYW5nZURldGVjdG9ySklUR2VuZXJhdG9yLl9nZW5PbkluaXQiLCJDaGFuZ2VEZXRlY3RvckpJVEdlbmVyYXRvci5fZ2VuT25DaGFuZ2UiLCJDaGFuZ2VEZXRlY3RvckpJVEdlbmVyYXRvci5fZ2VuTm90aWZ5T25QdXNoRGV0ZWN0b3JzIiwic2FuaXRpemVOYW1lIiwiQ29kZWdlbk5hbWVVdGlsIiwiQ29kZWdlbk5hbWVVdGlsLmNvbnN0cnVjdG9yIiwiQ29kZWdlbk5hbWVVdGlsLl9hZGRGaWVsZFByZWZpeCIsIkNvZGVnZW5OYW1lVXRpbC5nZXREaXNwYXRjaGVyTmFtZSIsIkNvZGVnZW5OYW1lVXRpbC5nZXRQaXBlc0FjY2Vzc29yTmFtZSIsIkNvZGVnZW5OYW1lVXRpbC5nZXRQcm90b3NOYW1lIiwiQ29kZWdlbk5hbWVVdGlsLmdldERpcmVjdGl2ZXNBY2Nlc3Nvck5hbWUiLCJDb2RlZ2VuTmFtZVV0aWwuZ2V0TG9jYWxzQWNjZXNzb3JOYW1lIiwiQ29kZWdlbk5hbWVVdGlsLmdldFN0YXRlTmFtZSIsIkNvZGVnZW5OYW1lVXRpbC5nZXRNb2RlTmFtZSIsIkNvZGVnZW5OYW1lVXRpbC5nZXRQcm9wZXJ0eUJpbmRpbmdJbmRleCIsIkNvZGVnZW5OYW1lVXRpbC5nZXRMb2NhbE5hbWUiLCJDb2RlZ2VuTmFtZVV0aWwuZ2V0RXZlbnRMb2NhbE5hbWUiLCJDb2RlZ2VuTmFtZVV0aWwuZ2V0Q2hhbmdlTmFtZSIsIkNvZGVnZW5OYW1lVXRpbC5nZW5Jbml0TG9jYWxzIiwiQ29kZWdlbk5hbWVVdGlsLmdlbkluaXRFdmVudExvY2FscyIsIkNvZGVnZW5OYW1lVXRpbC5nZXRQcmV2ZW50RGVmYXVsdEFjY2Vzb3IiLCJDb2RlZ2VuTmFtZVV0aWwuZ2V0RmllbGRDb3VudCIsIkNvZGVnZW5OYW1lVXRpbC5nZXRGaWVsZE5hbWUiLCJDb2RlZ2VuTmFtZVV0aWwuZ2V0QWxsRmllbGROYW1lcyIsIkNvZGVnZW5OYW1lVXRpbC5nZW5EZWh5ZHJhdGVGaWVsZHMiLCJDb2RlZ2VuTmFtZVV0aWwuZ2VuUGlwZU9uRGVzdHJveSIsIkNvZGVnZW5OYW1lVXRpbC5nZXRQaXBlTmFtZSIsIkNvZGVnZW5OYW1lVXRpbC5nZXREaXJlY3RpdmVOYW1lIiwiQ29kZWdlbk5hbWVVdGlsLmdldERldGVjdG9yTmFtZSIsIkNvZGVnZW5Mb2dpY1V0aWwiLCJDb2RlZ2VuTG9naWNVdGlsLmNvbnN0cnVjdG9yIiwiQ29kZWdlbkxvZ2ljVXRpbC5nZW5Qcm9wZXJ0eUJpbmRpbmdFdmFsVmFsdWUiLCJDb2RlZ2VuTG9naWNVdGlsLmdlbkV2ZW50QmluZGluZ0V2YWxWYWx1ZSIsIkNvZGVnZW5Mb2dpY1V0aWwuX2dlbkV2YWxWYWx1ZSIsIkNvZGVnZW5Mb2dpY1V0aWwuX29ic2VydmUiLCJDb2RlZ2VuTG9naWNVdGlsLmdlblByb3BlcnR5QmluZGluZ1RhcmdldHMiLCJDb2RlZ2VuTG9naWNVdGlsLmdlbkRpcmVjdGl2ZUluZGljZXMiLCJDb2RlZ2VuTG9naWNVdGlsLl9nZW5JbnRlcnBvbGF0aW9uIiwiQ29kZWdlbkxvZ2ljVXRpbC5nZW5IeWRyYXRlRGlyZWN0aXZlcyIsIkNvZGVnZW5Mb2dpY1V0aWwuX2dlblJlYWREaXJlY3RpdmUiLCJDb2RlZ2VuTG9naWNVdGlsLmdlbkh5ZHJhdGVEZXRlY3RvcnMiLCJDb2RlZ2VuTG9naWNVdGlsLmdlbkNvbnRlbnRMaWZlY3ljbGVDYWxsYmFja3MiLCJDb2RlZ2VuTG9naWNVdGlsLmdlblZpZXdMaWZlY3ljbGVDYWxsYmFja3MiLCJjb2RpZnkiLCJyYXdTdHJpbmciLCJjb21iaW5lR2VuZXJhdGVkU3RyaW5ncyIsIlZpZXdFbmNhcHN1bGF0aW9uIiwiVmlld01ldGFkYXRhIiwiVmlld01ldGFkYXRhLmNvbnN0cnVjdG9yIiwiVGltZXJXcmFwcGVyIiwiVGltZXJXcmFwcGVyLmNvbnN0cnVjdG9yIiwiVGltZXJXcmFwcGVyLnNldFRpbWVvdXQiLCJUaW1lcldyYXBwZXIuY2xlYXJUaW1lb3V0IiwiVGltZXJXcmFwcGVyLnNldEludGVydmFsIiwiVGltZXJXcmFwcGVyLmNsZWFySW50ZXJ2YWwiLCJPYnNlcnZhYmxlV3JhcHBlciIsIk9ic2VydmFibGVXcmFwcGVyLmNvbnN0cnVjdG9yIiwiT2JzZXJ2YWJsZVdyYXBwZXIuc3Vic2NyaWJlIiwiT2JzZXJ2YWJsZVdyYXBwZXIuaXNPYnNlcnZhYmxlIiwiT2JzZXJ2YWJsZVdyYXBwZXIuaGFzU3Vic2NyaWJlcnMiLCJPYnNlcnZhYmxlV3JhcHBlci5kaXNwb3NlIiwiT2JzZXJ2YWJsZVdyYXBwZXIuY2FsbE5leHQiLCJPYnNlcnZhYmxlV3JhcHBlci5jYWxsRW1pdCIsIk9ic2VydmFibGVXcmFwcGVyLmNhbGxFcnJvciIsIk9ic2VydmFibGVXcmFwcGVyLmNhbGxDb21wbGV0ZSIsIk9ic2VydmFibGVXcmFwcGVyLmZyb21Qcm9taXNlIiwiT2JzZXJ2YWJsZVdyYXBwZXIudG9Qcm9taXNlIiwiRXZlbnRFbWl0dGVyIiwiRXZlbnRFbWl0dGVyLmNvbnN0cnVjdG9yIiwiRXZlbnRFbWl0dGVyLmVtaXQiLCJFdmVudEVtaXR0ZXIubmV4dCIsIkV2ZW50RW1pdHRlci5zdWJzY3JpYmUiLCJQcm9taXNlV3JhcHBlciIsIlByb21pc2VXcmFwcGVyLmNvbnN0cnVjdG9yIiwiUHJvbWlzZVdyYXBwZXIucmVzb2x2ZSIsIlByb21pc2VXcmFwcGVyLnJlamVjdCIsIlByb21pc2VXcmFwcGVyLmNhdGNoRXJyb3IiLCJQcm9taXNlV3JhcHBlci5hbGwiLCJQcm9taXNlV3JhcHBlci50aGVuIiwiUHJvbWlzZVdyYXBwZXIud3JhcCIsIlByb21pc2VXcmFwcGVyLnNjaGVkdWxlTWljcm90YXNrIiwiUHJvbWlzZVdyYXBwZXIuaXNQcm9taXNlIiwiUHJvbWlzZVdyYXBwZXIuY29tcGxldGVyIiwiX2NvbXBvbmVudFByb3ZpZGVycyIsImNyZWF0ZU5nWm9uZSIsInBsYXRmb3JtIiwiZGlzcG9zZVBsYXRmb3JtIiwiX2NyZWF0ZVBsYXRmb3JtIiwiX3J1blBsYXRmb3JtSW5pdGlhbGl6ZXJzIiwiUGxhdGZvcm1SZWYiLCJQbGF0Zm9ybVJlZi5jb25zdHJ1Y3RvciIsIlBsYXRmb3JtUmVmLmluamVjdG9yIiwiUGxhdGZvcm1SZWZfIiwiUGxhdGZvcm1SZWZfLmNvbnN0cnVjdG9yIiwiUGxhdGZvcm1SZWZfLnJlZ2lzdGVyRGlzcG9zZUxpc3RlbmVyIiwiUGxhdGZvcm1SZWZfLmluamVjdG9yIiwiUGxhdGZvcm1SZWZfLmFwcGxpY2F0aW9uIiwiUGxhdGZvcm1SZWZfLmFzeW5jQXBwbGljYXRpb24iLCJQbGF0Zm9ybVJlZl8uX2luaXRBcHAiLCJQbGF0Zm9ybVJlZl8uZGlzcG9zZSIsIlBsYXRmb3JtUmVmXy5fYXBwbGljYXRpb25EaXNwb3NlZCIsIl9ydW5BcHBJbml0aWFsaXplcnMiLCJBcHBsaWNhdGlvblJlZiIsIkFwcGxpY2F0aW9uUmVmLmNvbnN0cnVjdG9yIiwiQXBwbGljYXRpb25SZWYuaW5qZWN0b3IiLCJBcHBsaWNhdGlvblJlZi56b25lIiwiQXBwbGljYXRpb25SZWYuY29tcG9uZW50VHlwZXMiLCJBcHBsaWNhdGlvblJlZl8iLCJBcHBsaWNhdGlvblJlZl8uY29uc3RydWN0b3IiLCJBcHBsaWNhdGlvblJlZl8ucmVnaXN0ZXJCb290c3RyYXBMaXN0ZW5lciIsIkFwcGxpY2F0aW9uUmVmXy5yZWdpc3RlckRpc3Bvc2VMaXN0ZW5lciIsIkFwcGxpY2F0aW9uUmVmXy5yZWdpc3RlckNoYW5nZURldGVjdG9yIiwiQXBwbGljYXRpb25SZWZfLnVucmVnaXN0ZXJDaGFuZ2VEZXRlY3RvciIsIkFwcGxpY2F0aW9uUmVmXy5ib290c3RyYXAiLCJBcHBsaWNhdGlvblJlZl8uX2xvYWRDb21wb25lbnQiLCJBcHBsaWNhdGlvblJlZl8uX3VubG9hZENvbXBvbmVudCIsIkFwcGxpY2F0aW9uUmVmXy5pbmplY3RvciIsIkFwcGxpY2F0aW9uUmVmXy56b25lIiwiQXBwbGljYXRpb25SZWZfLnRpY2siLCJBcHBsaWNhdGlvblJlZl8uZGlzcG9zZSIsIkFwcGxpY2F0aW9uUmVmXy5jb21wb25lbnRUeXBlcyIsIk5nWm9uZUVycm9yIiwiTmdab25lRXJyb3IuY29uc3RydWN0b3IiLCJOZ1pvbmUiLCJOZ1pvbmUuY29uc3RydWN0b3IiLCJOZ1pvbmUub3ZlcnJpZGVPblR1cm5TdGFydCIsIk5nWm9uZS5vblR1cm5TdGFydCIsIk5nWm9uZS5fbm90aWZ5T25UdXJuU3RhcnQiLCJOZ1pvbmUub3ZlcnJpZGVPblR1cm5Eb25lIiwiTmdab25lLm9uVHVybkRvbmUiLCJOZ1pvbmUuX25vdGlmeU9uVHVybkRvbmUiLCJOZ1pvbmUub3ZlcnJpZGVPbkV2ZW50RG9uZSIsIk5nWm9uZS5vbkV2ZW50RG9uZSIsIk5nWm9uZS5fbm90aWZ5T25FdmVudERvbmUiLCJOZ1pvbmUuaGFzUGVuZGluZ01pY3JvdGFza3MiLCJOZ1pvbmUuaGFzUGVuZGluZ1RpbWVycyIsIk5nWm9uZS5oYXNQZW5kaW5nQXN5bmNUYXNrcyIsIk5nWm9uZS5vdmVycmlkZU9uRXJyb3JIYW5kbGVyIiwiTmdab25lLm9uRXJyb3IiLCJOZ1pvbmUucnVuIiwiTmdab25lLnJ1bk91dHNpZGVBbmd1bGFyIiwiTmdab25lLl9jcmVhdGVJbm5lclpvbmUiLCJOZ1pvbmUuX25vdGlmeU9uRXJyb3IiLCJfYXBwSWRSYW5kb21Qcm92aWRlckZhY3RvcnkiLCJfcmFuZG9tQ2hhciIsIlRlc3RhYmlsaXR5IiwiVGVzdGFiaWxpdHkuY29uc3RydWN0b3IiLCJUZXN0YWJpbGl0eS5fd2F0Y2hBbmd1bGFyRXZlbnRzIiwiVGVzdGFiaWxpdHkuaW5jcmVhc2VQZW5kaW5nUmVxdWVzdENvdW50IiwiVGVzdGFiaWxpdHkuZGVjcmVhc2VQZW5kaW5nUmVxdWVzdENvdW50IiwiVGVzdGFiaWxpdHkuaXNTdGFibGUiLCJUZXN0YWJpbGl0eS5fcnVuQ2FsbGJhY2tzSWZSZWFkeSIsIlRlc3RhYmlsaXR5LndoZW5TdGFibGUiLCJUZXN0YWJpbGl0eS5nZXRQZW5kaW5nUmVxdWVzdENvdW50IiwiVGVzdGFiaWxpdHkuaXNBbmd1bGFyRXZlbnRQZW5kaW5nIiwiVGVzdGFiaWxpdHkuZmluZEJpbmRpbmdzIiwiVGVzdGFiaWxpdHkuZmluZFByb3ZpZGVycyIsIlRlc3RhYmlsaXR5UmVnaXN0cnkiLCJUZXN0YWJpbGl0eVJlZ2lzdHJ5LmNvbnN0cnVjdG9yIiwiVGVzdGFiaWxpdHlSZWdpc3RyeS5yZWdpc3RlckFwcGxpY2F0aW9uIiwiVGVzdGFiaWxpdHlSZWdpc3RyeS5nZXRUZXN0YWJpbGl0eSIsIlRlc3RhYmlsaXR5UmVnaXN0cnkuZ2V0QWxsVGVzdGFiaWxpdGllcyIsIlRlc3RhYmlsaXR5UmVnaXN0cnkuZmluZFRlc3RhYmlsaXR5SW5UcmVlIiwiX05vb3BHZXRUZXN0YWJpbGl0eSIsIl9Ob29wR2V0VGVzdGFiaWxpdHkuY29uc3RydWN0b3IiLCJfTm9vcEdldFRlc3RhYmlsaXR5LmFkZFRvV2luZG93IiwiX05vb3BHZXRUZXN0YWJpbGl0eS5maW5kVGVzdGFiaWxpdHlJblRyZWUiLCJzZXRUZXN0YWJpbGl0eUdldHRlciIsIkNvbXBvbmVudFJlZiIsIkNvbXBvbmVudFJlZi5jb25zdHJ1Y3RvciIsIkNvbXBvbmVudFJlZi5ob3N0VmlldyIsIkNvbXBvbmVudFJlZi5ob3N0Q29tcG9uZW50IiwiQ29tcG9uZW50UmVmXyIsIkNvbXBvbmVudFJlZl8uY29uc3RydWN0b3IiLCJDb21wb25lbnRSZWZfLmhvc3RDb21wb25lbnRUeXBlIiwiQ29tcG9uZW50UmVmXy5kaXNwb3NlIiwiRHluYW1pY0NvbXBvbmVudExvYWRlciIsIkR5bmFtaWNDb21wb25lbnRMb2FkZXIuY29uc3RydWN0b3IiLCJEeW5hbWljQ29tcG9uZW50TG9hZGVyXyIsIkR5bmFtaWNDb21wb25lbnRMb2FkZXJfLmNvbnN0cnVjdG9yIiwiRHluYW1pY0NvbXBvbmVudExvYWRlcl8ubG9hZEFzUm9vdCIsIkR5bmFtaWNDb21wb25lbnRMb2FkZXJfLmxvYWRJbnRvTG9jYXRpb24iLCJEeW5hbWljQ29tcG9uZW50TG9hZGVyXy5sb2FkTmV4dFRvTG9jYXRpb24iLCJDb21waWxlciIsIkNvbXBpbGVyLmNvbnN0cnVjdG9yIiwiX2lzQ29tcGlsZWRIb3N0VGVtcGxhdGUiLCJDb21waWxlcl8iLCJDb21waWxlcl8uY29uc3RydWN0b3IiLCJDb21waWxlcl8uY29tcGlsZUluSG9zdCIsIkNvbXBpbGVyXy5fY3JlYXRlUHJvdG9WaWV3IiwiQ29tcGlsZXJfLmNsZWFyQ2FjaGUiLCJpbnRlcm5hbENyZWF0ZVByb3RvVmlldyIsIlByb3RvVmlld0ZhY3RvcnkiLCJQcm90b1ZpZXdGYWN0b3J5LmNvbnN0cnVjdG9yIiwiUHJvdG9WaWV3RmFjdG9yeS5jbGVhckNhY2hlIiwiUHJvdG9WaWV3RmFjdG9yeS5jcmVhdGVIb3N0IiwiUHJvdG9WaWV3RmFjdG9yeS5fY3JlYXRlQ29tcG9uZW50IiwiUHJvdG9WaWV3RmFjdG9yeS5fY3JlYXRlRW1iZWRkZWRUZW1wbGF0ZSIsIlByb3RvVmlld0ZhY3RvcnkuaW5pdGlhbGl6ZVByb3RvVmlld0lmTmVlZGVkIiwiUHJvdG9WaWV3RmFjdG9yeS5faW5pdGlhbGl6ZVByb3RvVmlldyIsIlByb3RvVmlld0ZhY3RvcnkuX2JpbmRQaXBlIiwiUHJvdG9WaWV3RmFjdG9yeS5fZmxhdHRlblBpcGVzIiwiY3JlYXRlQ29tcG9uZW50IiwiY3JlYXRlRW1iZWRkZWRUZW1wbGF0ZSIsIl9Qcm90b1ZpZXdJbml0aWFsaXplciIsIl9Qcm90b1ZpZXdJbml0aWFsaXplci5jb25zdHJ1Y3RvciIsIl9Qcm90b1ZpZXdJbml0aWFsaXplci52aXNpdFRleHQiLCJfUHJvdG9WaWV3SW5pdGlhbGl6ZXIudmlzaXROZ0NvbnRlbnQiLCJfUHJvdG9WaWV3SW5pdGlhbGl6ZXIudmlzaXRCZWdpbkVsZW1lbnQiLCJfUHJvdG9WaWV3SW5pdGlhbGl6ZXIudmlzaXRFbmRFbGVtZW50IiwiX1Byb3RvVmlld0luaXRpYWxpemVyLnZpc2l0QmVnaW5Db21wb25lbnQiLCJfUHJvdG9WaWV3SW5pdGlhbGl6ZXIudmlzaXRFbmRDb21wb25lbnQiLCJfUHJvdG9WaWV3SW5pdGlhbGl6ZXIudmlzaXRFbWJlZGRlZFRlbXBsYXRlIiwiX1Byb3RvVmlld0luaXRpYWxpemVyLl92aXNpdEJlZ2luQm91bmRFbGVtZW50IiwiX1Byb3RvVmlld0luaXRpYWxpemVyLl92aXNpdEJlZ2luRWxlbWVudCIsIl9Qcm90b1ZpZXdJbml0aWFsaXplci5fdmlzaXRFbmRFbGVtZW50IiwiX2NyZWF0ZUVsZW1lbnRCaW5kZXIiLCJwcm92aWRlRGlyZWN0aXZlIiwiY3JlYXRlRGlyZWN0aXZlVmFyaWFibGVCaW5kaW5ncyIsImFycmF5VG9NYXAiLCJfZmxhdHRlbkFycmF5IiwiX2ZsYXR0ZW5TdHlsZUFyciIsIlJlbmRlclByb3RvVmlld1JlZiIsIlJlbmRlclByb3RvVmlld1JlZi5jb25zdHJ1Y3RvciIsIlJlbmRlckZyYWdtZW50UmVmIiwiUmVuZGVyRnJhZ21lbnRSZWYuY29uc3RydWN0b3IiLCJSZW5kZXJWaWV3UmVmIiwiUmVuZGVyVmlld1JlZi5jb25zdHJ1Y3RvciIsIlJlbmRlclRlbXBsYXRlQ21kIiwiUmVuZGVyVGVtcGxhdGVDbWQuY29uc3RydWN0b3IiLCJSZW5kZXJCZWdpbkNtZCIsIlJlbmRlckJlZ2luQ21kLmNvbnN0cnVjdG9yIiwiUmVuZGVyQmVnaW5DbWQubmdDb250ZW50SW5kZXgiLCJSZW5kZXJCZWdpbkNtZC5pc0JvdW5kIiwiUmVuZGVyVGV4dENtZCIsIlJlbmRlclRleHRDbWQuY29uc3RydWN0b3IiLCJSZW5kZXJUZXh0Q21kLnZhbHVlIiwiUmVuZGVyTmdDb250ZW50Q21kIiwiUmVuZGVyTmdDb250ZW50Q21kLmNvbnN0cnVjdG9yIiwiUmVuZGVyTmdDb250ZW50Q21kLmluZGV4IiwiUmVuZGVyTmdDb250ZW50Q21kLm5nQ29udGVudEluZGV4IiwiUmVuZGVyQmVnaW5FbGVtZW50Q21kIiwiUmVuZGVyQmVnaW5FbGVtZW50Q21kLmNvbnN0cnVjdG9yIiwiUmVuZGVyQmVnaW5FbGVtZW50Q21kLm5hbWUiLCJSZW5kZXJCZWdpbkVsZW1lbnRDbWQuYXR0ck5hbWVBbmRWYWx1ZXMiLCJSZW5kZXJCZWdpbkVsZW1lbnRDbWQuZXZlbnRUYXJnZXRBbmROYW1lcyIsIlJlbmRlckJlZ2luQ29tcG9uZW50Q21kIiwiUmVuZGVyQmVnaW5Db21wb25lbnRDbWQuY29uc3RydWN0b3IiLCJSZW5kZXJCZWdpbkNvbXBvbmVudENtZC50ZW1wbGF0ZUlkIiwiUmVuZGVyRW1iZWRkZWRUZW1wbGF0ZUNtZCIsIlJlbmRlckVtYmVkZGVkVGVtcGxhdGVDbWQuY29uc3RydWN0b3IiLCJSZW5kZXJFbWJlZGRlZFRlbXBsYXRlQ21kLmlzTWVyZ2VkIiwiUmVuZGVyRW1iZWRkZWRUZW1wbGF0ZUNtZC5jaGlsZHJlbiIsIlJlbmRlclZpZXdXaXRoRnJhZ21lbnRzIiwiUmVuZGVyVmlld1dpdGhGcmFnbWVudHMuY29uc3RydWN0b3IiLCJSZW5kZXJDb21wb25lbnRUZW1wbGF0ZSIsIlJlbmRlckNvbXBvbmVudFRlbXBsYXRlLmNvbnN0cnVjdG9yIiwiUmVuZGVyZXIiLCJSZW5kZXJlci5jb25zdHJ1Y3RvciIsIlBpcGVQcm92aWRlciIsIlBpcGVQcm92aWRlci5jb25zdHJ1Y3RvciIsIlBpcGVQcm92aWRlci5jcmVhdGVGcm9tVHlwZSIsIlByb3RvUGlwZXMiLCJQcm90b1BpcGVzLmNvbnN0cnVjdG9yIiwiUHJvdG9QaXBlcy5mcm9tUHJvdmlkZXJzIiwiUHJvdG9QaXBlcy5nZXQiLCJQaXBlcyIsIlBpcGVzLmNvbnN0cnVjdG9yIiwiUGlwZXMuZ2V0IiwiU2VsZWN0ZWRQaXBlIiwiU2VsZWN0ZWRQaXBlLmNvbnN0cnVjdG9yIiwiVmlld1R5cGUiLCJBcHBWaWV3Q29udGFpbmVyIiwiQXBwVmlld0NvbnRhaW5lci5jb25zdHJ1Y3RvciIsIkFwcFZpZXciLCJBcHBWaWV3LmNvbnN0cnVjdG9yIiwiQXBwVmlldy5pbml0IiwiQXBwVmlldy5zZXRMb2NhbCIsIkFwcFZpZXcuaHlkcmF0ZWQiLCJBcHBWaWV3LnRyaWdnZXJFdmVudEhhbmRsZXJzIiwiQXBwVmlldy5ub3RpZnlPbkJpbmRpbmciLCJBcHBWaWV3LmxvZ0JpbmRpbmdVcGRhdGUiLCJBcHBWaWV3Lm5vdGlmeUFmdGVyQ29udGVudENoZWNrZWQiLCJBcHBWaWV3Lm5vdGlmeUFmdGVyVmlld0NoZWNrZWQiLCJBcHBWaWV3LmdldERpcmVjdGl2ZUZvciIsIkFwcFZpZXcuZ2V0TmVzdGVkVmlldyIsIkFwcFZpZXcuZ2V0Q29udGFpbmVyRWxlbWVudCIsIkFwcFZpZXcuZ2V0RGVidWdDb250ZXh0IiwiQXBwVmlldy5nZXREZXRlY3RvckZvciIsIkFwcFZpZXcuaW52b2tlRWxlbWVudE1ldGhvZCIsIkFwcFZpZXcuZGlzcGF0Y2hSZW5kZXJFdmVudCIsIkFwcFZpZXcuZGlzcGF0Y2hFdmVudCIsIkFwcFZpZXcub3duQmluZGVyc0NvdW50IiwiX2xvY2Fsc1RvU3RyaW5nTWFwIiwiRXZlbnRFdmFsdWF0aW9uRXJyb3IiLCJFdmVudEV2YWx1YXRpb25FcnJvci5jb25zdHJ1Y3RvciIsIkFwcFByb3RvVmlld01lcmdlSW5mbyIsIkFwcFByb3RvVmlld01lcmdlSW5mby5jb25zdHJ1Y3RvciIsIkFwcFByb3RvVmlldyIsIkFwcFByb3RvVmlldy5jb25zdHJ1Y3RvciIsIkFwcFByb3RvVmlldy5pbml0IiwiQXBwUHJvdG9WaWV3LmlzSW5pdGlhbGl6ZWQiLCJpbnRlcm5hbFZpZXciLCJpbnRlcm5hbFByb3RvVmlldyIsIlZpZXdSZWYiLCJWaWV3UmVmLmNvbnN0cnVjdG9yIiwiVmlld1JlZi5jaGFuZ2VEZXRlY3RvclJlZiIsIlZpZXdSZWZfIiwiVmlld1JlZl8uY29uc3RydWN0b3IiLCJWaWV3UmVmXy5yZW5kZXIiLCJWaWV3UmVmXy5yZW5kZXJGcmFnbWVudCIsIlZpZXdSZWZfLmNoYW5nZURldGVjdG9yUmVmIiwiVmlld1JlZl8uc2V0TG9jYWwiLCJQcm90b1ZpZXdSZWYiLCJQcm90b1ZpZXdSZWYuY29uc3RydWN0b3IiLCJQcm90b1ZpZXdSZWZfIiwiUHJvdG9WaWV3UmVmXy5jb25zdHJ1Y3RvciIsImNhbWVsQ2FzZVRvRGFzaENhc2UiLCJkYXNoQ2FzZVRvQ2FtZWxDYXNlIiwiRWxlbWVudEJpbmRlciIsIkVsZW1lbnRCaW5kZXIuY29uc3RydWN0b3IiLCJTdGF0aWNLZXlzIiwiU3RhdGljS2V5cy5jb25zdHJ1Y3RvciIsIlN0YXRpY0tleXMuaW5zdGFuY2UiLCJUcmVlTm9kZSIsIlRyZWVOb2RlLmNvbnN0cnVjdG9yIiwiVHJlZU5vZGUuYWRkQ2hpbGQiLCJUcmVlTm9kZS5yZW1vdmUiLCJUcmVlTm9kZS5wYXJlbnQiLCJEaXJlY3RpdmVEZXBlbmRlbmN5IiwiRGlyZWN0aXZlRGVwZW5kZW5jeS5jb25zdHJ1Y3RvciIsIkRpcmVjdGl2ZURlcGVuZGVuY3kuX3ZlcmlmeSIsIkRpcmVjdGl2ZURlcGVuZGVuY3kuY3JlYXRlRnJvbSIsIkRpcmVjdGl2ZURlcGVuZGVuY3kuX2F0dHJpYnV0ZU5hbWUiLCJEaXJlY3RpdmVEZXBlbmRlbmN5Ll9xdWVyeSIsIkRpcmVjdGl2ZVByb3ZpZGVyIiwiRGlyZWN0aXZlUHJvdmlkZXIuY29uc3RydWN0b3IiLCJEaXJlY3RpdmVQcm92aWRlci5kaXNwbGF5TmFtZSIsIkRpcmVjdGl2ZVByb3ZpZGVyLnF1ZXJpZXMiLCJEaXJlY3RpdmVQcm92aWRlci5ldmVudEVtaXR0ZXJzIiwiRGlyZWN0aXZlUHJvdmlkZXIuY3JlYXRlRnJvbVByb3ZpZGVyIiwiRGlyZWN0aXZlUHJvdmlkZXIuY3JlYXRlRnJvbVR5cGUiLCJQcmVCdWlsdE9iamVjdHMiLCJQcmVCdWlsdE9iamVjdHMuY29uc3RydWN0b3IiLCJRdWVyeU1ldGFkYXRhV2l0aFNldHRlciIsIlF1ZXJ5TWV0YWRhdGFXaXRoU2V0dGVyLmNvbnN0cnVjdG9yIiwiRXZlbnRFbWl0dGVyQWNjZXNzb3IiLCJFdmVudEVtaXR0ZXJBY2Nlc3Nvci5jb25zdHJ1Y3RvciIsIkV2ZW50RW1pdHRlckFjY2Vzc29yLnN1YnNjcmliZSIsIl9jcmVhdGVFdmVudEVtaXR0ZXJBY2Nlc3NvcnMiLCJfY3JlYXRlUHJvdG9RdWVyeVJlZnMiLCJQcm90b0VsZW1lbnRJbmplY3RvciIsIlByb3RvRWxlbWVudEluamVjdG9yLmNvbnN0cnVjdG9yIiwiUHJvdG9FbGVtZW50SW5qZWN0b3IuY3JlYXRlIiwiUHJvdG9FbGVtZW50SW5qZWN0b3IuX2NyZWF0ZURpcmVjdGl2ZVByb3ZpZGVyV2l0aFZpc2liaWxpdHkiLCJQcm90b0VsZW1lbnRJbmplY3Rvci5fY3JlYXRlUHJvdmlkZXJzV2l0aFZpc2liaWxpdHkiLCJQcm90b0VsZW1lbnRJbmplY3Rvci5fY3JlYXRlUHJvdmlkZXJXaXRoVmlzaWJpbGl0eSIsIlByb3RvRWxlbWVudEluamVjdG9yLl9jcmVhdGVWaWV3UHJvdmlkZXJzV2l0aFZpc2liaWxpdHkiLCJQcm90b0VsZW1lbnRJbmplY3Rvci5pbnN0YW50aWF0ZSIsIlByb3RvRWxlbWVudEluamVjdG9yLmRpcmVjdFBhcmVudCIsIlByb3RvRWxlbWVudEluamVjdG9yLmhhc0JpbmRpbmdzIiwiUHJvdG9FbGVtZW50SW5qZWN0b3IuZ2V0UHJvdmlkZXJBdEluZGV4IiwiRWxlbWVudEluamVjdG9yIiwiRWxlbWVudEluamVjdG9yLmNvbnN0cnVjdG9yIiwiRWxlbWVudEluamVjdG9yLmRlaHlkcmF0ZSIsIkVsZW1lbnRJbmplY3Rvci5oeWRyYXRlIiwiRWxlbWVudEluamVjdG9yLl9kZWJ1Z0NvbnRleHQiLCJFbGVtZW50SW5qZWN0b3IuX3JlYXR0YWNoSW5qZWN0b3JzIiwiRWxlbWVudEluamVjdG9yLl9yZWF0dGFjaEluamVjdG9yIiwiRWxlbWVudEluamVjdG9yLmhhc1ZhcmlhYmxlQmluZGluZyIsIkVsZW1lbnRJbmplY3Rvci5nZXRWYXJpYWJsZUJpbmRpbmciLCJFbGVtZW50SW5qZWN0b3IuZ2V0IiwiRWxlbWVudEluamVjdG9yLmhhc0RpcmVjdGl2ZSIsIkVsZW1lbnRJbmplY3Rvci5nZXRFdmVudEVtaXR0ZXJBY2Nlc3NvcnMiLCJFbGVtZW50SW5qZWN0b3IuZ2V0RGlyZWN0aXZlVmFyaWFibGVCaW5kaW5ncyIsIkVsZW1lbnRJbmplY3Rvci5nZXRDb21wb25lbnQiLCJFbGVtZW50SW5qZWN0b3IuZ2V0SW5qZWN0b3IiLCJFbGVtZW50SW5qZWN0b3IuZ2V0RWxlbWVudFJlZiIsIkVsZW1lbnRJbmplY3Rvci5nZXRWaWV3Q29udGFpbmVyUmVmIiwiRWxlbWVudEluamVjdG9yLmdldE5lc3RlZFZpZXciLCJFbGVtZW50SW5qZWN0b3IuZ2V0VmlldyIsIkVsZW1lbnRJbmplY3Rvci5kaXJlY3RQYXJlbnQiLCJFbGVtZW50SW5qZWN0b3IuaXNDb21wb25lbnRLZXkiLCJFbGVtZW50SW5qZWN0b3IuZ2V0RGVwZW5kZW5jeSIsIkVsZW1lbnRJbmplY3Rvci5fYnVpbGRBdHRyaWJ1dGUiLCJFbGVtZW50SW5qZWN0b3IuYWRkRGlyZWN0aXZlc01hdGNoaW5nUXVlcnkiLCJFbGVtZW50SW5qZWN0b3IuX2J1aWxkUXVlcnlTdHJhdGVneSIsIkVsZW1lbnRJbmplY3Rvci5saW5rIiwiRWxlbWVudEluamVjdG9yLnVubGluayIsIkVsZW1lbnRJbmplY3Rvci5nZXREaXJlY3RpdmVBdEluZGV4IiwiRWxlbWVudEluamVjdG9yLmhhc0luc3RhbmNlcyIsIkVsZW1lbnRJbmplY3Rvci5nZXRIb3N0IiwiRWxlbWVudEluamVjdG9yLmdldEJvdW5kRWxlbWVudEluZGV4IiwiRWxlbWVudEluamVjdG9yLmdldFJvb3RWaWV3SW5qZWN0b3JzIiwiRWxlbWVudEluamVjdG9yLm5nQWZ0ZXJWaWV3Q2hlY2tlZCIsIkVsZW1lbnRJbmplY3Rvci5uZ0FmdGVyQ29udGVudENoZWNrZWQiLCJFbGVtZW50SW5qZWN0b3IudHJhdmVyc2VBbmRTZXRRdWVyaWVzQXNEaXJ0eSIsIkVsZW1lbnRJbmplY3Rvci5fc2V0UXVlcmllc0FzRGlydHkiLCJfRW1wdHlRdWVyeVN0cmF0ZWd5IiwiX0VtcHR5UXVlcnlTdHJhdGVneS5jb25zdHJ1Y3RvciIsIl9FbXB0eVF1ZXJ5U3RyYXRlZ3kuc2V0Q29udGVudFF1ZXJpZXNBc0RpcnR5IiwiX0VtcHR5UXVlcnlTdHJhdGVneS5zZXRWaWV3UXVlcmllc0FzRGlydHkiLCJfRW1wdHlRdWVyeVN0cmF0ZWd5Lmh5ZHJhdGUiLCJfRW1wdHlRdWVyeVN0cmF0ZWd5LmRlaHlkcmF0ZSIsIl9FbXB0eVF1ZXJ5U3RyYXRlZ3kudXBkYXRlQ29udGVudFF1ZXJpZXMiLCJfRW1wdHlRdWVyeVN0cmF0ZWd5LnVwZGF0ZVZpZXdRdWVyaWVzIiwiX0VtcHR5UXVlcnlTdHJhdGVneS5maW5kUXVlcnkiLCJJbmxpbmVRdWVyeVN0cmF0ZWd5IiwiSW5saW5lUXVlcnlTdHJhdGVneS5jb25zdHJ1Y3RvciIsIklubGluZVF1ZXJ5U3RyYXRlZ3kuc2V0Q29udGVudFF1ZXJpZXNBc0RpcnR5IiwiSW5saW5lUXVlcnlTdHJhdGVneS5zZXRWaWV3UXVlcmllc0FzRGlydHkiLCJJbmxpbmVRdWVyeVN0cmF0ZWd5Lmh5ZHJhdGUiLCJJbmxpbmVRdWVyeVN0cmF0ZWd5LmRlaHlkcmF0ZSIsIklubGluZVF1ZXJ5U3RyYXRlZ3kudXBkYXRlQ29udGVudFF1ZXJpZXMiLCJJbmxpbmVRdWVyeVN0cmF0ZWd5LnVwZGF0ZVZpZXdRdWVyaWVzIiwiSW5saW5lUXVlcnlTdHJhdGVneS5maW5kUXVlcnkiLCJEeW5hbWljUXVlcnlTdHJhdGVneSIsIkR5bmFtaWNRdWVyeVN0cmF0ZWd5LmNvbnN0cnVjdG9yIiwiRHluYW1pY1F1ZXJ5U3RyYXRlZ3kuc2V0Q29udGVudFF1ZXJpZXNBc0RpcnR5IiwiRHluYW1pY1F1ZXJ5U3RyYXRlZ3kuc2V0Vmlld1F1ZXJpZXNBc0RpcnR5IiwiRHluYW1pY1F1ZXJ5U3RyYXRlZ3kuaHlkcmF0ZSIsIkR5bmFtaWNRdWVyeVN0cmF0ZWd5LmRlaHlkcmF0ZSIsIkR5bmFtaWNRdWVyeVN0cmF0ZWd5LnVwZGF0ZUNvbnRlbnRRdWVyaWVzIiwiRHluYW1pY1F1ZXJ5U3RyYXRlZ3kudXBkYXRlVmlld1F1ZXJpZXMiLCJEeW5hbWljUXVlcnlTdHJhdGVneS5maW5kUXVlcnkiLCJFbGVtZW50SW5qZWN0b3JJbmxpbmVTdHJhdGVneSIsIkVsZW1lbnRJbmplY3RvcklubGluZVN0cmF0ZWd5LmNvbnN0cnVjdG9yIiwiRWxlbWVudEluamVjdG9ySW5saW5lU3RyYXRlZ3kuaHlkcmF0ZSIsIkVsZW1lbnRJbmplY3RvcklubGluZVN0cmF0ZWd5LmRlaHlkcmF0ZSIsIkVsZW1lbnRJbmplY3RvcklubGluZVN0cmF0ZWd5LmNhbGxPbkRlc3Ryb3kiLCJFbGVtZW50SW5qZWN0b3JJbmxpbmVTdHJhdGVneS5nZXRDb21wb25lbnQiLCJFbGVtZW50SW5qZWN0b3JJbmxpbmVTdHJhdGVneS5pc0NvbXBvbmVudEtleSIsIkVsZW1lbnRJbmplY3RvcklubGluZVN0cmF0ZWd5LmFkZERpcmVjdGl2ZXNNYXRjaGluZ1F1ZXJ5IiwiRWxlbWVudEluamVjdG9yRHluYW1pY1N0cmF0ZWd5IiwiRWxlbWVudEluamVjdG9yRHluYW1pY1N0cmF0ZWd5LmNvbnN0cnVjdG9yIiwiRWxlbWVudEluamVjdG9yRHluYW1pY1N0cmF0ZWd5Lmh5ZHJhdGUiLCJFbGVtZW50SW5qZWN0b3JEeW5hbWljU3RyYXRlZ3kuZGVoeWRyYXRlIiwiRWxlbWVudEluamVjdG9yRHluYW1pY1N0cmF0ZWd5LmNhbGxPbkRlc3Ryb3kiLCJFbGVtZW50SW5qZWN0b3JEeW5hbWljU3RyYXRlZ3kuZ2V0Q29tcG9uZW50IiwiRWxlbWVudEluamVjdG9yRHluYW1pY1N0cmF0ZWd5LmlzQ29tcG9uZW50S2V5IiwiRWxlbWVudEluamVjdG9yRHluYW1pY1N0cmF0ZWd5LmFkZERpcmVjdGl2ZXNNYXRjaGluZ1F1ZXJ5IiwiUHJvdG9RdWVyeVJlZiIsIlByb3RvUXVlcnlSZWYuY29uc3RydWN0b3IiLCJQcm90b1F1ZXJ5UmVmLnVzZXNQcm9wZXJ0eVN5bnRheCIsIlF1ZXJ5UmVmIiwiUXVlcnlSZWYuY29uc3RydWN0b3IiLCJRdWVyeVJlZi5pc1ZpZXdRdWVyeSIsIlF1ZXJ5UmVmLnVwZGF0ZSIsIlF1ZXJ5UmVmLl91cGRhdGUiLCJRdWVyeVJlZi5fdmlzaXQiLCJRdWVyeVJlZi5fdmlzaXRJbmplY3RvciIsIlF1ZXJ5UmVmLl92aXNpdFZpZXdDb250YWluZXIiLCJRdWVyeVJlZi5fdmlzaXRWaWV3IiwiUXVlcnlSZWYuX2FnZ3JlZ2F0ZVZhcmlhYmxlQmluZGluZyIsIlF1ZXJ5UmVmLl9hZ2dyZWdhdGVEaXJlY3RpdmUiLCJRdWVyeVJlZi5kZWh5ZHJhdGUiLCJRdWVyeVJlZi5oeWRyYXRlIiwiQXBwVmlld01hbmFnZXIiLCJBcHBWaWV3TWFuYWdlci5jb25zdHJ1Y3RvciIsIkFwcFZpZXdNYW5hZ2VyLmdldEhvc3RFbGVtZW50IiwiQXBwVmlld01hbmFnZXJfIiwiQXBwVmlld01hbmFnZXJfLmNvbnN0cnVjdG9yIiwiQXBwVmlld01hbmFnZXJfLmdldFZpZXdDb250YWluZXIiLCJBcHBWaWV3TWFuYWdlcl8uZ2V0TmFtZWRFbGVtZW50SW5Db21wb25lbnRWaWV3IiwiQXBwVmlld01hbmFnZXJfLmdldENvbXBvbmVudCIsIkFwcFZpZXdNYW5hZ2VyXy5jcmVhdGVSb290SG9zdFZpZXciLCJBcHBWaWV3TWFuYWdlcl8uZGVzdHJveVJvb3RIb3N0VmlldyIsIkFwcFZpZXdNYW5hZ2VyXy5jcmVhdGVFbWJlZGRlZFZpZXdJbkNvbnRhaW5lciIsIkFwcFZpZXdNYW5hZ2VyXy5jcmVhdGVIb3N0Vmlld0luQ29udGFpbmVyIiwiQXBwVmlld01hbmFnZXJfLl9jcmVhdGVWaWV3SW5Db250YWluZXIiLCJBcHBWaWV3TWFuYWdlcl8uX2F0dGFjaFJlbmRlclZpZXciLCJBcHBWaWV3TWFuYWdlcl8uZGVzdHJveVZpZXdJbkNvbnRhaW5lciIsIkFwcFZpZXdNYW5hZ2VyXy5hdHRhY2hWaWV3SW5Db250YWluZXIiLCJBcHBWaWV3TWFuYWdlcl8uZGV0YWNoVmlld0luQ29udGFpbmVyIiwiQXBwVmlld01hbmFnZXJfLl9jcmVhdGVNYWluVmlldyIsIkFwcFZpZXdNYW5hZ2VyXy5fY3JlYXRlUG9vbGVkVmlldyIsIkFwcFZpZXdNYW5hZ2VyXy5fZGVzdHJveVBvb2xlZFZpZXciLCJBcHBWaWV3TWFuYWdlcl8uX2Rlc3Ryb3lWaWV3SW5Db250YWluZXIiLCJBcHBWaWV3TWFuYWdlcl8uX3ZpZXdEZWh5ZHJhdGVSZWN1cnNlIiwiQXBwVmlld01hbmFnZXJVdGlscyIsIkFwcFZpZXdNYW5hZ2VyVXRpbHMuY29uc3RydWN0b3IiLCJBcHBWaWV3TWFuYWdlclV0aWxzLmdldENvbXBvbmVudEluc3RhbmNlIiwiQXBwVmlld01hbmFnZXJVdGlscy5jcmVhdGVWaWV3IiwiQXBwVmlld01hbmFnZXJVdGlscy5oeWRyYXRlUm9vdEhvc3RWaWV3IiwiQXBwVmlld01hbmFnZXJVdGlscy5hdHRhY2hWaWV3SW5Db250YWluZXIiLCJBcHBWaWV3TWFuYWdlclV0aWxzLmRldGFjaFZpZXdJbkNvbnRhaW5lciIsIkFwcFZpZXdNYW5hZ2VyVXRpbHMuaHlkcmF0ZVZpZXdJbkNvbnRhaW5lciIsIkFwcFZpZXdNYW5hZ2VyVXRpbHMuX2h5ZHJhdGVWaWV3IiwiQXBwVmlld01hbmFnZXJVdGlscy5fcG9wdWxhdGVWaWV3TG9jYWxzIiwiQXBwVmlld01hbmFnZXJVdGlscy5fc2V0VXBFdmVudEVtaXR0ZXJzIiwiQXBwVmlld01hbmFnZXJVdGlscy5kZWh5ZHJhdGVWaWV3IiwiRWxlbWVudFJlZiIsIkVsZW1lbnRSZWYuY29uc3RydWN0b3IiLCJFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQiLCJFbGVtZW50UmVmLnJlbmRlclZpZXciLCJFbGVtZW50UmVmXyIsIkVsZW1lbnRSZWZfLmNvbnN0cnVjdG9yIiwiRWxlbWVudFJlZl8ucmVuZGVyVmlldyIsIkVsZW1lbnRSZWZfLm5hdGl2ZUVsZW1lbnQiLCJUZW1wbGF0ZVJlZiIsIlRlbXBsYXRlUmVmLmNvbnN0cnVjdG9yIiwiVGVtcGxhdGVSZWZfIiwiVGVtcGxhdGVSZWZfLmNvbnN0cnVjdG9yIiwiVGVtcGxhdGVSZWZfLl9nZXRQcm90b1ZpZXciLCJUZW1wbGF0ZVJlZl8ucHJvdG9WaWV3UmVmIiwiVGVtcGxhdGVSZWZfLmhhc0xvY2FsIiwiQXBwVmlld1Bvb2wiLCJBcHBWaWV3UG9vbC5jb25zdHJ1Y3RvciIsIkFwcFZpZXdQb29sLmdldFZpZXciLCJBcHBWaWV3UG9vbC5yZXR1cm5WaWV3IiwiQXBwVmlld0xpc3RlbmVyIiwiQXBwVmlld0xpc3RlbmVyLmNvbnN0cnVjdG9yIiwiQXBwVmlld0xpc3RlbmVyLm9uVmlld0NyZWF0ZWQiLCJBcHBWaWV3TGlzdGVuZXIub25WaWV3RGVzdHJveWVkIiwiVmlld0NvbnRhaW5lclJlZiIsIlZpZXdDb250YWluZXJSZWYuY29uc3RydWN0b3IiLCJWaWV3Q29udGFpbmVyUmVmLmNsZWFyIiwiVmlld0NvbnRhaW5lclJlZi5sZW5ndGgiLCJWaWV3Q29udGFpbmVyUmVmXyIsIlZpZXdDb250YWluZXJSZWZfLmNvbnN0cnVjdG9yIiwiVmlld0NvbnRhaW5lclJlZl8uX2dldFZpZXdzIiwiVmlld0NvbnRhaW5lclJlZl8uZ2V0IiwiVmlld0NvbnRhaW5lclJlZl8ubGVuZ3RoIiwiVmlld0NvbnRhaW5lclJlZl8uY3JlYXRlRW1iZWRkZWRWaWV3IiwiVmlld0NvbnRhaW5lclJlZl8uY3JlYXRlSG9zdFZpZXciLCJWaWV3Q29udGFpbmVyUmVmXy5pbnNlcnQiLCJWaWV3Q29udGFpbmVyUmVmXy5pbmRleE9mIiwiVmlld0NvbnRhaW5lclJlZl8ucmVtb3ZlIiwiVmlld0NvbnRhaW5lclJlZl8uZGV0YWNoIiwiaGFzTGlmZWN5Y2xlSG9vayIsIkxpZmVjeWNsZUhvb2tzIiwiUXVlcnlMaXN0IiwiUXVlcnlMaXN0LmNvbnN0cnVjdG9yIiwiUXVlcnlMaXN0LmNoYW5nZXMiLCJRdWVyeUxpc3QubGVuZ3RoIiwiUXVlcnlMaXN0LmZpcnN0IiwiUXVlcnlMaXN0Lmxhc3QiLCJRdWVyeUxpc3QubWFwIiwiUXVlcnlMaXN0LmZpbHRlciIsIlF1ZXJ5TGlzdC5yZWR1Y2UiLCJRdWVyeUxpc3QudG9BcnJheSIsIlF1ZXJ5TGlzdFtnZXRTeW1ib2xJdGVyYXRvcigpXSIsIlF1ZXJ5TGlzdC50b1N0cmluZyIsIlF1ZXJ5TGlzdC5yZXNldCIsIlF1ZXJ5TGlzdC5ub3RpZnlPbkNoYW5nZXMiLCJFdmVudENvbmZpZyIsIkV2ZW50Q29uZmlnLmNvbnN0cnVjdG9yIiwiRXZlbnRDb25maWcucGFyc2UiLCJFdmVudENvbmZpZy5nZXRGdWxsTmFtZSIsIl9pc0RpcmVjdGl2ZU1ldGFkYXRhIiwiRGlyZWN0aXZlUmVzb2x2ZXIiLCJEaXJlY3RpdmVSZXNvbHZlci5jb25zdHJ1Y3RvciIsIkRpcmVjdGl2ZVJlc29sdmVyLnJlc29sdmUiLCJEaXJlY3RpdmVSZXNvbHZlci5fbWVyZ2VXaXRoUHJvcGVydHlNZXRhZGF0YSIsIkRpcmVjdGl2ZVJlc29sdmVyLl9tZXJnZSIsIlZpZXdSZXNvbHZlciIsIlZpZXdSZXNvbHZlci5jb25zdHJ1Y3RvciIsIlZpZXdSZXNvbHZlci5yZXNvbHZlIiwiVmlld1Jlc29sdmVyLl9yZXNvbHZlIiwiVmlld1Jlc29sdmVyLl90aHJvd01peGluZ1ZpZXdBbmRDb21wb25lbnQiLCJfaXNQaXBlTWV0YWRhdGEiLCJQaXBlUmVzb2x2ZXIiLCJQaXBlUmVzb2x2ZXIuY29uc3RydWN0b3IiLCJQaXBlUmVzb2x2ZXIucmVzb2x2ZSIsIkNvbXBpbGVkSG9zdFRlbXBsYXRlIiwiQ29tcGlsZWRIb3N0VGVtcGxhdGUuY29uc3RydWN0b3IiLCJDb21waWxlZENvbXBvbmVudFRlbXBsYXRlIiwiQ29tcGlsZWRDb21wb25lbnRUZW1wbGF0ZS5jb25zdHJ1Y3RvciIsIlRleHRDbWQiLCJUZXh0Q21kLmNvbnN0cnVjdG9yIiwiVGV4dENtZC52aXNpdCIsIk5nQ29udGVudENtZCIsIk5nQ29udGVudENtZC5jb25zdHJ1Y3RvciIsIk5nQ29udGVudENtZC52aXNpdCIsIklCZWdpbkVsZW1lbnRDbWQiLCJJQmVnaW5FbGVtZW50Q21kLmNvbnN0cnVjdG9yIiwiSUJlZ2luRWxlbWVudENtZC52YXJpYWJsZU5hbWVBbmRWYWx1ZXMiLCJJQmVnaW5FbGVtZW50Q21kLmV2ZW50VGFyZ2V0QW5kTmFtZXMiLCJJQmVnaW5FbGVtZW50Q21kLmRpcmVjdGl2ZXMiLCJCZWdpbkVsZW1lbnRDbWQiLCJCZWdpbkVsZW1lbnRDbWQuY29uc3RydWN0b3IiLCJCZWdpbkVsZW1lbnRDbWQudmlzaXQiLCJFbmRFbGVtZW50Q21kIiwiRW5kRWxlbWVudENtZC5jb25zdHJ1Y3RvciIsIkVuZEVsZW1lbnRDbWQudmlzaXQiLCJCZWdpbkNvbXBvbmVudENtZCIsIkJlZ2luQ29tcG9uZW50Q21kLmNvbnN0cnVjdG9yIiwiQmVnaW5Db21wb25lbnRDbWQudGVtcGxhdGVJZCIsIkJlZ2luQ29tcG9uZW50Q21kLnZpc2l0IiwiRW5kQ29tcG9uZW50Q21kIiwiRW5kQ29tcG9uZW50Q21kLmNvbnN0cnVjdG9yIiwiRW5kQ29tcG9uZW50Q21kLnZpc2l0IiwiRW1iZWRkZWRUZW1wbGF0ZUNtZCIsIkVtYmVkZGVkVGVtcGxhdGVDbWQuY29uc3RydWN0b3IiLCJFbWJlZGRlZFRlbXBsYXRlQ21kLnZpc2l0IiwidmlzaXRBbGxDb21tYW5kcyIsIkNvbnNvbGUiLCJDb25zb2xlLmNvbnN0cnVjdG9yIiwiQ29uc29sZS5sb2ciLCJEZWJ1Z0VsZW1lbnQiLCJEZWJ1Z0VsZW1lbnQuY29uc3RydWN0b3IiLCJEZWJ1Z0VsZW1lbnQuY29tcG9uZW50SW5zdGFuY2UiLCJEZWJ1Z0VsZW1lbnQubmF0aXZlRWxlbWVudCIsIkRlYnVnRWxlbWVudC5lbGVtZW50UmVmIiwiRGVidWdFbGVtZW50LmNoaWxkcmVuIiwiRGVidWdFbGVtZW50LmNvbXBvbmVudFZpZXdDaGlsZHJlbiIsIkRlYnVnRWxlbWVudC5xdWVyeSIsIkRlYnVnRWxlbWVudC5xdWVyeUFsbCIsIkRlYnVnRWxlbWVudF8iLCJEZWJ1Z0VsZW1lbnRfLmNvbnN0cnVjdG9yIiwiRGVidWdFbGVtZW50Xy5jb21wb25lbnRJbnN0YW5jZSIsIkRlYnVnRWxlbWVudF8ubmF0aXZlRWxlbWVudCIsIkRlYnVnRWxlbWVudF8uZWxlbWVudFJlZiIsIkRlYnVnRWxlbWVudF8uZ2V0RGlyZWN0aXZlSW5zdGFuY2UiLCJEZWJ1Z0VsZW1lbnRfLmNoaWxkcmVuIiwiRGVidWdFbGVtZW50Xy5jb21wb25lbnRWaWV3Q2hpbGRyZW4iLCJEZWJ1Z0VsZW1lbnRfLnRyaWdnZXJFdmVudEhhbmRsZXIiLCJEZWJ1Z0VsZW1lbnRfLmhhc0RpcmVjdGl2ZSIsIkRlYnVnRWxlbWVudF8uaW5qZWN0IiwiRGVidWdFbGVtZW50Xy5nZXRMb2NhbCIsIkRlYnVnRWxlbWVudF8uX2dldENoaWxkRWxlbWVudHMiLCJpbnNwZWN0RWxlbWVudCIsImFzTmF0aXZlRWxlbWVudHMiLCJTY29wZSIsIlNjb3BlLmNvbnN0cnVjdG9yIiwiU2NvcGUuYWxsIiwiU2NvcGUubGlnaHQiLCJTY29wZS52aWV3IiwiX3JlZmxlY3RvciIsIk9ic2VydmFibGVTdHJhdGVneSIsIk9ic2VydmFibGVTdHJhdGVneS5jb25zdHJ1Y3RvciIsIk9ic2VydmFibGVTdHJhdGVneS5jcmVhdGVTdWJzY3JpcHRpb24iLCJPYnNlcnZhYmxlU3RyYXRlZ3kuZGlzcG9zZSIsIk9ic2VydmFibGVTdHJhdGVneS5vbkRlc3Ryb3kiLCJQcm9taXNlU3RyYXRlZ3kiLCJQcm9taXNlU3RyYXRlZ3kuY29uc3RydWN0b3IiLCJQcm9taXNlU3RyYXRlZ3kuY3JlYXRlU3Vic2NyaXB0aW9uIiwiUHJvbWlzZVN0cmF0ZWd5LmRpc3Bvc2UiLCJQcm9taXNlU3RyYXRlZ3kub25EZXN0cm95IiwiQXN5bmNQaXBlIiwiQXN5bmNQaXBlLmNvbnN0cnVjdG9yIiwiQXN5bmNQaXBlLm5nT25EZXN0cm95IiwiQXN5bmNQaXBlLnRyYW5zZm9ybSIsIkFzeW5jUGlwZS5fc3Vic2NyaWJlIiwiQXN5bmNQaXBlLl9zZWxlY3RTdHJhdGVneSIsIkFzeW5jUGlwZS5fZGlzcG9zZSIsIkFzeW5jUGlwZS5fdXBkYXRlTGF0ZXN0VmFsdWUiLCJJbnZhbGlkUGlwZUFyZ3VtZW50RXhjZXB0aW9uIiwiSW52YWxpZFBpcGVBcmd1bWVudEV4Y2VwdGlvbi5jb25zdHJ1Y3RvciIsIlVwcGVyQ2FzZVBpcGUiLCJVcHBlckNhc2VQaXBlLmNvbnN0cnVjdG9yIiwiVXBwZXJDYXNlUGlwZS50cmFuc2Zvcm0iLCJMb3dlckNhc2VQaXBlIiwiTG93ZXJDYXNlUGlwZS5jb25zdHJ1Y3RvciIsIkxvd2VyQ2FzZVBpcGUudHJhbnNmb3JtIiwiSnNvblBpcGUiLCJKc29uUGlwZS5jb25zdHJ1Y3RvciIsIkpzb25QaXBlLnRyYW5zZm9ybSIsIlNsaWNlUGlwZSIsIlNsaWNlUGlwZS5jb25zdHJ1Y3RvciIsIlNsaWNlUGlwZS50cmFuc2Zvcm0iLCJTbGljZVBpcGUuc3VwcG9ydHMiLCJEYXRlUGlwZSIsIkRhdGVQaXBlLmNvbnN0cnVjdG9yIiwiRGF0ZVBpcGUudHJhbnNmb3JtIiwiRGF0ZVBpcGUuc3VwcG9ydHMiLCJOdW1iZXJGb3JtYXRTdHlsZSIsIk51bWJlckZvcm1hdHRlciIsIk51bWJlckZvcm1hdHRlci5jb25zdHJ1Y3RvciIsIk51bWJlckZvcm1hdHRlci5mb3JtYXQiLCJkaWdpdENvbmRpdGlvbiIsIm5hbWVDb25kaXRpb24iLCJleHRyYWN0Q29tcG9uZW50cyIsIkRhdGVGb3JtYXR0ZXIiLCJEYXRlRm9ybWF0dGVyLmNvbnN0cnVjdG9yIiwiRGF0ZUZvcm1hdHRlci5mb3JtYXQiLCJOdW1iZXJQaXBlIiwiTnVtYmVyUGlwZS5jb25zdHJ1Y3RvciIsIk51bWJlclBpcGUuX2Zvcm1hdCIsIkRlY2ltYWxQaXBlIiwiRGVjaW1hbFBpcGUuY29uc3RydWN0b3IiLCJEZWNpbWFsUGlwZS50cmFuc2Zvcm0iLCJQZXJjZW50UGlwZSIsIlBlcmNlbnRQaXBlLmNvbnN0cnVjdG9yIiwiUGVyY2VudFBpcGUudHJhbnNmb3JtIiwiQ3VycmVuY3lQaXBlIiwiQ3VycmVuY3lQaXBlLmNvbnN0cnVjdG9yIiwiQ3VycmVuY3lQaXBlLnRyYW5zZm9ybSIsIk5nQ2xhc3MiLCJOZ0NsYXNzLmNvbnN0cnVjdG9yIiwiTmdDbGFzcy5pbml0aWFsQ2xhc3NlcyIsIk5nQ2xhc3MucmF3Q2xhc3MiLCJOZ0NsYXNzLm5nRG9DaGVjayIsIk5nQ2xhc3MubmdPbkRlc3Ryb3kiLCJOZ0NsYXNzLl9jbGVhbnVwQ2xhc3NlcyIsIk5nQ2xhc3MuX2FwcGx5S2V5VmFsdWVDaGFuZ2VzIiwiTmdDbGFzcy5fYXBwbHlJdGVyYWJsZUNoYW5nZXMiLCJOZ0NsYXNzLl9hcHBseUluaXRpYWxDbGFzc2VzIiwiTmdDbGFzcy5fYXBwbHlDbGFzc2VzIiwiTmdDbGFzcy5fdG9nZ2xlQ2xhc3MiLCJOZ0ZvciIsIk5nRm9yLmNvbnN0cnVjdG9yIiwiTmdGb3IubmdGb3JPZiIsIk5nRm9yLm5nRm9yVGVtcGxhdGUiLCJOZ0Zvci5uZ0RvQ2hlY2siLCJOZ0Zvci5fYXBwbHlDaGFuZ2VzIiwiTmdGb3IuX3BlclZpZXdDaGFuZ2UiLCJOZ0Zvci5fYnVsa1JlbW92ZSIsIk5nRm9yLl9idWxrSW5zZXJ0IiwiUmVjb3JkVmlld1R1cGxlIiwiUmVjb3JkVmlld1R1cGxlLmNvbnN0cnVjdG9yIiwiTmdJZiIsIk5nSWYuY29uc3RydWN0b3IiLCJOZ0lmLm5nSWYiLCJOZ1N0eWxlIiwiTmdTdHlsZS5jb25zdHJ1Y3RvciIsIk5nU3R5bGUucmF3U3R5bGUiLCJOZ1N0eWxlLm5nRG9DaGVjayIsIk5nU3R5bGUuX2FwcGx5Q2hhbmdlcyIsIk5nU3R5bGUuX3NldFN0eWxlIiwiU3dpdGNoVmlldyIsIlN3aXRjaFZpZXcuY29uc3RydWN0b3IiLCJTd2l0Y2hWaWV3LmNyZWF0ZSIsIlN3aXRjaFZpZXcuZGVzdHJveSIsIk5nU3dpdGNoIiwiTmdTd2l0Y2guY29uc3RydWN0b3IiLCJOZ1N3aXRjaC5uZ1N3aXRjaCIsIk5nU3dpdGNoLl9vbldoZW5WYWx1ZUNoYW5nZWQiLCJOZ1N3aXRjaC5fZW1wdHlBbGxBY3RpdmVWaWV3cyIsIk5nU3dpdGNoLl9hY3RpdmF0ZVZpZXdzIiwiTmdTd2l0Y2guX3JlZ2lzdGVyVmlldyIsIk5nU3dpdGNoLl9kZXJlZ2lzdGVyVmlldyIsIk5nU3dpdGNoV2hlbiIsIk5nU3dpdGNoV2hlbi5jb25zdHJ1Y3RvciIsIk5nU3dpdGNoV2hlbi5uZ1N3aXRjaFdoZW4iLCJOZ1N3aXRjaERlZmF1bHQiLCJOZ1N3aXRjaERlZmF1bHQuY29uc3RydWN0b3IiLCJpc0NvbnRyb2wiLCJfZmluZCIsInRvT2JzZXJ2YWJsZSIsIkFic3RyYWN0Q29udHJvbCIsIkFic3RyYWN0Q29udHJvbC5jb25zdHJ1Y3RvciIsIkFic3RyYWN0Q29udHJvbC52YWx1ZSIsIkFic3RyYWN0Q29udHJvbC5zdGF0dXMiLCJBYnN0cmFjdENvbnRyb2wudmFsaWQiLCJBYnN0cmFjdENvbnRyb2wuZXJyb3JzIiwiQWJzdHJhY3RDb250cm9sLnByaXN0aW5lIiwiQWJzdHJhY3RDb250cm9sLmRpcnR5IiwiQWJzdHJhY3RDb250cm9sLnRvdWNoZWQiLCJBYnN0cmFjdENvbnRyb2wudW50b3VjaGVkIiwiQWJzdHJhY3RDb250cm9sLnZhbHVlQ2hhbmdlcyIsIkFic3RyYWN0Q29udHJvbC5zdGF0dXNDaGFuZ2VzIiwiQWJzdHJhY3RDb250cm9sLnBlbmRpbmciLCJBYnN0cmFjdENvbnRyb2wubWFya0FzVG91Y2hlZCIsIkFic3RyYWN0Q29udHJvbC5tYXJrQXNEaXJ0eSIsIkFic3RyYWN0Q29udHJvbC5tYXJrQXNQZW5kaW5nIiwiQWJzdHJhY3RDb250cm9sLnNldFBhcmVudCIsIkFic3RyYWN0Q29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5IiwiQWJzdHJhY3RDb250cm9sLl9ydW5WYWxpZGF0b3IiLCJBYnN0cmFjdENvbnRyb2wuX3J1bkFzeW5jVmFsaWRhdG9yIiwiQWJzdHJhY3RDb250cm9sLl9jYW5jZWxFeGlzdGluZ1N1YnNjcmlwdGlvbiIsIkFic3RyYWN0Q29udHJvbC5zZXRFcnJvcnMiLCJBYnN0cmFjdENvbnRyb2wuZmluZCIsIkFic3RyYWN0Q29udHJvbC5nZXRFcnJvciIsIkFic3RyYWN0Q29udHJvbC5oYXNFcnJvciIsIkFic3RyYWN0Q29udHJvbC5fdXBkYXRlQ29udHJvbHNFcnJvcnMiLCJBYnN0cmFjdENvbnRyb2wuX2luaXRPYnNlcnZhYmxlcyIsIkFic3RyYWN0Q29udHJvbC5fY2FsY3VsYXRlU3RhdHVzIiwiQ29udHJvbCIsIkNvbnRyb2wuY29uc3RydWN0b3IiLCJDb250cm9sLnVwZGF0ZVZhbHVlIiwiQ29udHJvbC5fdXBkYXRlVmFsdWUiLCJDb250cm9sLl9hbnlDb250cm9sc0hhdmVTdGF0dXMiLCJDb250cm9sLnJlZ2lzdGVyT25DaGFuZ2UiLCJDb250cm9sR3JvdXAiLCJDb250cm9sR3JvdXAuY29uc3RydWN0b3IiLCJDb250cm9sR3JvdXAuYWRkQ29udHJvbCIsIkNvbnRyb2xHcm91cC5yZW1vdmVDb250cm9sIiwiQ29udHJvbEdyb3VwLmluY2x1ZGUiLCJDb250cm9sR3JvdXAuZXhjbHVkZSIsIkNvbnRyb2xHcm91cC5jb250YWlucyIsIkNvbnRyb2xHcm91cC5fc2V0UGFyZW50Rm9yQ29udHJvbHMiLCJDb250cm9sR3JvdXAuX3VwZGF0ZVZhbHVlIiwiQ29udHJvbEdyb3VwLl9hbnlDb250cm9sc0hhdmVTdGF0dXMiLCJDb250cm9sR3JvdXAuX3JlZHVjZVZhbHVlIiwiQ29udHJvbEdyb3VwLl9yZWR1Y2VDaGlsZHJlbiIsIkNvbnRyb2xHcm91cC5faW5jbHVkZWQiLCJDb250cm9sQXJyYXkiLCJDb250cm9sQXJyYXkuY29uc3RydWN0b3IiLCJDb250cm9sQXJyYXkuYXQiLCJDb250cm9sQXJyYXkucHVzaCIsIkNvbnRyb2xBcnJheS5pbnNlcnQiLCJDb250cm9sQXJyYXkucmVtb3ZlQXQiLCJDb250cm9sQXJyYXkubGVuZ3RoIiwiQ29udHJvbEFycmF5Ll91cGRhdGVWYWx1ZSIsIkNvbnRyb2xBcnJheS5fYW55Q29udHJvbHNIYXZlU3RhdHVzIiwiQ29udHJvbEFycmF5Ll9zZXRQYXJlbnRGb3JDb250cm9scyIsIkFic3RyYWN0Q29udHJvbERpcmVjdGl2ZSIsIkFic3RyYWN0Q29udHJvbERpcmVjdGl2ZS5jb25zdHJ1Y3RvciIsIkFic3RyYWN0Q29udHJvbERpcmVjdGl2ZS5jb250cm9sIiwiQWJzdHJhY3RDb250cm9sRGlyZWN0aXZlLnZhbHVlIiwiQWJzdHJhY3RDb250cm9sRGlyZWN0aXZlLnZhbGlkIiwiQWJzdHJhY3RDb250cm9sRGlyZWN0aXZlLmVycm9ycyIsIkFic3RyYWN0Q29udHJvbERpcmVjdGl2ZS5wcmlzdGluZSIsIkFic3RyYWN0Q29udHJvbERpcmVjdGl2ZS5kaXJ0eSIsIkFic3RyYWN0Q29udHJvbERpcmVjdGl2ZS50b3VjaGVkIiwiQWJzdHJhY3RDb250cm9sRGlyZWN0aXZlLnVudG91Y2hlZCIsIkFic3RyYWN0Q29udHJvbERpcmVjdGl2ZS5wYXRoIiwiQ29udHJvbENvbnRhaW5lciIsIkNvbnRyb2xDb250YWluZXIuY29uc3RydWN0b3IiLCJDb250cm9sQ29udGFpbmVyLmZvcm1EaXJlY3RpdmUiLCJDb250cm9sQ29udGFpbmVyLnBhdGgiLCJOZ0NvbnRyb2xOYW1lIiwiTmdDb250cm9sTmFtZS5jb25zdHJ1Y3RvciIsIk5nQ29udHJvbE5hbWUubmdPbkNoYW5nZXMiLCJOZ0NvbnRyb2xOYW1lLm5nT25EZXN0cm95IiwiTmdDb250cm9sTmFtZS52aWV3VG9Nb2RlbFVwZGF0ZSIsIk5nQ29udHJvbE5hbWUucGF0aCIsIk5nQ29udHJvbE5hbWUuZm9ybURpcmVjdGl2ZSIsIk5nQ29udHJvbE5hbWUudmFsaWRhdG9yIiwiTmdDb250cm9sTmFtZS5hc3luY1ZhbGlkYXRvciIsIk5nQ29udHJvbE5hbWUuY29udHJvbCIsIk5nQ29udHJvbCIsIk5nQ29udHJvbC5jb25zdHJ1Y3RvciIsIk5nQ29udHJvbC52YWxpZGF0b3IiLCJOZ0NvbnRyb2wuYXN5bmNWYWxpZGF0b3IiLCJjb250cm9sUGF0aCIsInNldFVwQ29udHJvbCIsInNldFVwQ29udHJvbEdyb3VwIiwiX3Rocm93RXJyb3IiLCJjb21wb3NlVmFsaWRhdG9ycyIsImNvbXBvc2VBc3luY1ZhbGlkYXRvcnMiLCJpc1Byb3BlcnR5VXBkYXRlZCIsInNlbGVjdFZhbHVlQWNjZXNzb3IiLCJWYWxpZGF0b3JzIiwiVmFsaWRhdG9ycy5jb25zdHJ1Y3RvciIsIlZhbGlkYXRvcnMucmVxdWlyZWQiLCJWYWxpZGF0b3JzLm1pbkxlbmd0aCIsIlZhbGlkYXRvcnMubWF4TGVuZ3RoIiwiVmFsaWRhdG9ycy5udWxsVmFsaWRhdG9yIiwiVmFsaWRhdG9ycy5jb21wb3NlIiwiVmFsaWRhdG9ycy5jb21wb3NlQXN5bmMiLCJfY29udmVydFRvUHJvbWlzZSIsIl9leGVjdXRlVmFsaWRhdG9ycyIsIl9tZXJnZUVycm9ycyIsIkRlZmF1bHRWYWx1ZUFjY2Vzc29yIiwiRGVmYXVsdFZhbHVlQWNjZXNzb3IuY29uc3RydWN0b3IiLCJEZWZhdWx0VmFsdWVBY2Nlc3Nvci53cml0ZVZhbHVlIiwiRGVmYXVsdFZhbHVlQWNjZXNzb3IucmVnaXN0ZXJPbkNoYW5nZSIsIkRlZmF1bHRWYWx1ZUFjY2Vzc29yLnJlZ2lzdGVyT25Ub3VjaGVkIiwiTnVtYmVyVmFsdWVBY2Nlc3NvciIsIk51bWJlclZhbHVlQWNjZXNzb3IuY29uc3RydWN0b3IiLCJOdW1iZXJWYWx1ZUFjY2Vzc29yLndyaXRlVmFsdWUiLCJOdW1iZXJWYWx1ZUFjY2Vzc29yLnJlZ2lzdGVyT25DaGFuZ2UiLCJOdW1iZXJWYWx1ZUFjY2Vzc29yLnJlZ2lzdGVyT25Ub3VjaGVkIiwiQ2hlY2tib3hDb250cm9sVmFsdWVBY2Nlc3NvciIsIkNoZWNrYm94Q29udHJvbFZhbHVlQWNjZXNzb3IuY29uc3RydWN0b3IiLCJDaGVja2JveENvbnRyb2xWYWx1ZUFjY2Vzc29yLndyaXRlVmFsdWUiLCJDaGVja2JveENvbnRyb2xWYWx1ZUFjY2Vzc29yLnJlZ2lzdGVyT25DaGFuZ2UiLCJDaGVja2JveENvbnRyb2xWYWx1ZUFjY2Vzc29yLnJlZ2lzdGVyT25Ub3VjaGVkIiwiTmdTZWxlY3RPcHRpb24iLCJOZ1NlbGVjdE9wdGlvbi5jb25zdHJ1Y3RvciIsIlNlbGVjdENvbnRyb2xWYWx1ZUFjY2Vzc29yIiwiU2VsZWN0Q29udHJvbFZhbHVlQWNjZXNzb3IuY29uc3RydWN0b3IiLCJTZWxlY3RDb250cm9sVmFsdWVBY2Nlc3Nvci53cml0ZVZhbHVlIiwiU2VsZWN0Q29udHJvbFZhbHVlQWNjZXNzb3IucmVnaXN0ZXJPbkNoYW5nZSIsIlNlbGVjdENvbnRyb2xWYWx1ZUFjY2Vzc29yLnJlZ2lzdGVyT25Ub3VjaGVkIiwiU2VsZWN0Q29udHJvbFZhbHVlQWNjZXNzb3IuX3VwZGF0ZVZhbHVlV2hlbkxpc3RPZk9wdGlvbnNDaGFuZ2VzIiwibm9ybWFsaXplVmFsaWRhdG9yIiwiTmdGb3JtQ29udHJvbCIsIk5nRm9ybUNvbnRyb2wuY29uc3RydWN0b3IiLCJOZ0Zvcm1Db250cm9sLm5nT25DaGFuZ2VzIiwiTmdGb3JtQ29udHJvbC5wYXRoIiwiTmdGb3JtQ29udHJvbC52YWxpZGF0b3IiLCJOZ0Zvcm1Db250cm9sLmFzeW5jVmFsaWRhdG9yIiwiTmdGb3JtQ29udHJvbC5jb250cm9sIiwiTmdGb3JtQ29udHJvbC52aWV3VG9Nb2RlbFVwZGF0ZSIsIk5nRm9ybUNvbnRyb2wuX2lzQ29udHJvbENoYW5nZWQiLCJOZ01vZGVsIiwiTmdNb2RlbC5jb25zdHJ1Y3RvciIsIk5nTW9kZWwubmdPbkNoYW5nZXMiLCJOZ01vZGVsLmNvbnRyb2wiLCJOZ01vZGVsLnBhdGgiLCJOZ01vZGVsLnZhbGlkYXRvciIsIk5nTW9kZWwuYXN5bmNWYWxpZGF0b3IiLCJOZ01vZGVsLnZpZXdUb01vZGVsVXBkYXRlIiwiTmdDb250cm9sR3JvdXAiLCJOZ0NvbnRyb2xHcm91cC5jb25zdHJ1Y3RvciIsIk5nQ29udHJvbEdyb3VwLm5nT25Jbml0IiwiTmdDb250cm9sR3JvdXAubmdPbkRlc3Ryb3kiLCJOZ0NvbnRyb2xHcm91cC5jb250cm9sIiwiTmdDb250cm9sR3JvdXAucGF0aCIsIk5nQ29udHJvbEdyb3VwLmZvcm1EaXJlY3RpdmUiLCJOZ0NvbnRyb2xHcm91cC52YWxpZGF0b3IiLCJOZ0NvbnRyb2xHcm91cC5hc3luY1ZhbGlkYXRvciIsIk5nRm9ybU1vZGVsIiwiTmdGb3JtTW9kZWwuY29uc3RydWN0b3IiLCJOZ0Zvcm1Nb2RlbC5uZ09uQ2hhbmdlcyIsIk5nRm9ybU1vZGVsLmZvcm1EaXJlY3RpdmUiLCJOZ0Zvcm1Nb2RlbC5jb250cm9sIiwiTmdGb3JtTW9kZWwucGF0aCIsIk5nRm9ybU1vZGVsLmFkZENvbnRyb2wiLCJOZ0Zvcm1Nb2RlbC5nZXRDb250cm9sIiwiTmdGb3JtTW9kZWwucmVtb3ZlQ29udHJvbCIsIk5nRm9ybU1vZGVsLmFkZENvbnRyb2xHcm91cCIsIk5nRm9ybU1vZGVsLnJlbW92ZUNvbnRyb2xHcm91cCIsIk5nRm9ybU1vZGVsLmdldENvbnRyb2xHcm91cCIsIk5nRm9ybU1vZGVsLnVwZGF0ZU1vZGVsIiwiTmdGb3JtTW9kZWwub25TdWJtaXQiLCJOZ0Zvcm1Nb2RlbC5fdXBkYXRlRG9tVmFsdWUiLCJOZ0Zvcm0iLCJOZ0Zvcm0uY29uc3RydWN0b3IiLCJOZ0Zvcm0uZm9ybURpcmVjdGl2ZSIsIk5nRm9ybS5jb250cm9sIiwiTmdGb3JtLnBhdGgiLCJOZ0Zvcm0uY29udHJvbHMiLCJOZ0Zvcm0uYWRkQ29udHJvbCIsIk5nRm9ybS5nZXRDb250cm9sIiwiTmdGb3JtLnJlbW92ZUNvbnRyb2wiLCJOZ0Zvcm0uYWRkQ29udHJvbEdyb3VwIiwiTmdGb3JtLnJlbW92ZUNvbnRyb2xHcm91cCIsIk5nRm9ybS5nZXRDb250cm9sR3JvdXAiLCJOZ0Zvcm0udXBkYXRlTW9kZWwiLCJOZ0Zvcm0ub25TdWJtaXQiLCJOZ0Zvcm0uX2ZpbmRDb250YWluZXIiLCJOZ0NvbnRyb2xTdGF0dXMiLCJOZ0NvbnRyb2xTdGF0dXMuY29uc3RydWN0b3IiLCJOZ0NvbnRyb2xTdGF0dXMubmdDbGFzc1VudG91Y2hlZCIsIk5nQ29udHJvbFN0YXR1cy5uZ0NsYXNzVG91Y2hlZCIsIk5nQ29udHJvbFN0YXR1cy5uZ0NsYXNzUHJpc3RpbmUiLCJOZ0NvbnRyb2xTdGF0dXMubmdDbGFzc0RpcnR5IiwiTmdDb250cm9sU3RhdHVzLm5nQ2xhc3NWYWxpZCIsIk5nQ29udHJvbFN0YXR1cy5uZ0NsYXNzSW52YWxpZCIsIlJlcXVpcmVkVmFsaWRhdG9yIiwiUmVxdWlyZWRWYWxpZGF0b3IuY29uc3RydWN0b3IiLCJNaW5MZW5ndGhWYWxpZGF0b3IiLCJNaW5MZW5ndGhWYWxpZGF0b3IuY29uc3RydWN0b3IiLCJNaW5MZW5ndGhWYWxpZGF0b3IudmFsaWRhdGUiLCJNYXhMZW5ndGhWYWxpZGF0b3IiLCJNYXhMZW5ndGhWYWxpZGF0b3IuY29uc3RydWN0b3IiLCJNYXhMZW5ndGhWYWxpZGF0b3IudmFsaWRhdGUiLCJGb3JtQnVpbGRlciIsIkZvcm1CdWlsZGVyLmNvbnN0cnVjdG9yIiwiRm9ybUJ1aWxkZXIuZ3JvdXAiLCJGb3JtQnVpbGRlci5jb250cm9sIiwiRm9ybUJ1aWxkZXIuYXJyYXkiLCJGb3JtQnVpbGRlci5fcmVkdWNlQ29udHJvbHMiLCJGb3JtQnVpbGRlci5fY3JlYXRlQ29udHJvbCIsImNyZWF0ZVdpdGhvdXRQYWNrYWdlUHJlZml4IiwiVXJsUmVzb2x2ZXIiLCJVcmxSZXNvbHZlci5jb25zdHJ1Y3RvciIsIlVybFJlc29sdmVyLnJlc29sdmUiLCJnZXRVcmxTY2hlbWUiLCJfYnVpbGRGcm9tRW5jb2RlZFBhcnRzIiwiX0NvbXBvbmVudEluZGV4IiwiX3NwbGl0IiwiX3JlbW92ZURvdFNlZ21lbnRzIiwiX2pvaW5BbmRDYW5vbmljYWxpemVQYXRoIiwiX3Jlc29sdmVVcmwiLCJYSFIiLCJYSFIuY29uc3RydWN0b3IiLCJYSFIuZ2V0IiwiX2NyZWF0ZUNoYW5nZURldGVjdG9yR2VuQ29uZmlnIiwiUnVudGltZUNvbXBpbGVyIiwiUnVudGltZUNvbXBpbGVyLmNvbnN0cnVjdG9yIiwiUnVudGltZUNvbXBpbGVyXyIsIlJ1bnRpbWVDb21waWxlcl8uY29uc3RydWN0b3IiLCJSdW50aW1lQ29tcGlsZXJfLmNvbXBpbGVJbkhvc3QiLCJSdW50aW1lQ29tcGlsZXJfLmNsZWFyQ2FjaGUiLCJUZW1wbGF0ZUNvbXBpbGVyIiwiVGVtcGxhdGVDb21waWxlci5jb25zdHJ1Y3RvciIsIlRlbXBsYXRlQ29tcGlsZXIubm9ybWFsaXplRGlyZWN0aXZlTWV0YWRhdGEiLCJUZW1wbGF0ZUNvbXBpbGVyLmNvbXBpbGVIb3N0Q29tcG9uZW50UnVudGltZSIsIlRlbXBsYXRlQ29tcGlsZXIuY2xlYXJDYWNoZSIsIlRlbXBsYXRlQ29tcGlsZXIuX2NvbXBpbGVDb21wb25lbnRSdW50aW1lIiwiVGVtcGxhdGVDb21waWxlci5fY29tcGlsZUNvbW1hbmRzUnVudGltZSIsIlRlbXBsYXRlQ29tcGlsZXIuY29tcGlsZVRlbXBsYXRlc0NvZGVHZW4iLCJUZW1wbGF0ZUNvbXBpbGVyLmNvbXBpbGVTdHlsZXNoZWV0Q29kZUdlbiIsIlRlbXBsYXRlQ29tcGlsZXIuX3Byb2Nlc3NUZW1wbGF0ZUNvZGVHZW4iLCJOb3JtYWxpemVkQ29tcG9uZW50V2l0aFZpZXdEaXJlY3RpdmVzIiwiTm9ybWFsaXplZENvbXBvbmVudFdpdGhWaWV3RGlyZWN0aXZlcy5jb25zdHJ1Y3RvciIsImFzc2VydENvbXBvbmVudCIsInRlbXBsYXRlVmFyaWFibGVOYW1lIiwidGVtcGxhdGVHZXR0ZXJOYW1lIiwidGVtcGxhdGVNb2R1bGVVcmwiLCJhZGRBbGwiLCJjb2RlR2VuQ29tcG9uZW50VGVtcGxhdGVGYWN0b3J5IiwicmVtb3ZlRHVwbGljYXRlcyIsIkNvbXBpbGVUeXBlTWV0YWRhdGEiLCJDb21waWxlVHlwZU1ldGFkYXRhLmNvbnN0cnVjdG9yIiwiQ29tcGlsZVR5cGVNZXRhZGF0YS5mcm9tSnNvbiIsIkNvbXBpbGVUeXBlTWV0YWRhdGEudG9Kc29uIiwiQ29tcGlsZVRlbXBsYXRlTWV0YWRhdGEiLCJDb21waWxlVGVtcGxhdGVNZXRhZGF0YS5jb25zdHJ1Y3RvciIsIkNvbXBpbGVUZW1wbGF0ZU1ldGFkYXRhLmZyb21Kc29uIiwiQ29tcGlsZVRlbXBsYXRlTWV0YWRhdGEudG9Kc29uIiwiQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhIiwiQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhLmNvbnN0cnVjdG9yIiwiQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhLmNyZWF0ZSIsIkNvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YS5mcm9tSnNvbiIsIkNvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YS50b0pzb24iLCJjcmVhdGVIb3N0Q29tcG9uZW50TWV0YSIsIkNzc1NlbGVjdG9yIiwiQ3NzU2VsZWN0b3IuY29uc3RydWN0b3IiLCJDc3NTZWxlY3Rvci5wYXJzZSIsIkNzc1NlbGVjdG9yLmlzRWxlbWVudFNlbGVjdG9yIiwiQ3NzU2VsZWN0b3Iuc2V0RWxlbWVudCIsIkNzc1NlbGVjdG9yLmdldE1hdGNoaW5nRWxlbWVudFRlbXBsYXRlIiwiQ3NzU2VsZWN0b3IuYWRkQXR0cmlidXRlIiwiQ3NzU2VsZWN0b3IuYWRkQ2xhc3NOYW1lIiwiQ3NzU2VsZWN0b3IudG9TdHJpbmciLCJTZWxlY3Rvck1hdGNoZXIiLCJTZWxlY3Rvck1hdGNoZXIuY29uc3RydWN0b3IiLCJTZWxlY3Rvck1hdGNoZXIuY3JlYXRlTm90TWF0Y2hlciIsIlNlbGVjdG9yTWF0Y2hlci5hZGRTZWxlY3RhYmxlcyIsIlNlbGVjdG9yTWF0Y2hlci5fYWRkU2VsZWN0YWJsZSIsIlNlbGVjdG9yTWF0Y2hlci5fYWRkVGVybWluYWwiLCJTZWxlY3Rvck1hdGNoZXIuX2FkZFBhcnRpYWwiLCJTZWxlY3Rvck1hdGNoZXIubWF0Y2giLCJTZWxlY3Rvck1hdGNoZXIuX21hdGNoVGVybWluYWwiLCJTZWxlY3Rvck1hdGNoZXIuX21hdGNoUGFydGlhbCIsIlNlbGVjdG9yTGlzdENvbnRleHQiLCJTZWxlY3Rvckxpc3RDb250ZXh0LmNvbnN0cnVjdG9yIiwiU2VsZWN0b3JDb250ZXh0IiwiU2VsZWN0b3JDb250ZXh0LmNvbnN0cnVjdG9yIiwiU2VsZWN0b3JDb250ZXh0LmZpbmFsaXplIiwiZXNjYXBlU2luZ2xlUXVvdGVTdHJpbmciLCJlc2NhcGVEb3VibGVRdW90ZVN0cmluZyIsImVzY2FwZVN0cmluZyIsImNvZGVHZW5FeHBvcnRWYXJpYWJsZSIsImNvZGVHZW5Db25zdENvbnN0cnVjdG9yQ2FsbCIsImNvZGVHZW5WYWx1ZUZuIiwiY29kZUdlblRvU3RyaW5nIiwic3BsaXRBdENvbG9uIiwibW9kdWxlUmVmIiwiU291cmNlTW9kdWxlIiwiU291cmNlTW9kdWxlLmNvbnN0cnVjdG9yIiwiU291cmNlTW9kdWxlLmdldFNvdXJjZVdpdGhJbXBvcnRzIiwiU291cmNlRXhwcmVzc2lvbiIsIlNvdXJjZUV4cHJlc3Npb24uY29uc3RydWN0b3IiLCJTb3VyY2VFeHByZXNzaW9ucyIsIlNvdXJjZUV4cHJlc3Npb25zLmNvbnN0cnVjdG9yIiwiU291cmNlV2l0aEltcG9ydHMiLCJTb3VyY2VXaXRoSW1wb3J0cy5jb25zdHJ1Y3RvciIsIkNoYW5nZURldGVjdGlvbkNvbXBpbGVyIiwiQ2hhbmdlRGV0ZWN0aW9uQ29tcGlsZXIuY29uc3RydWN0b3IiLCJDaGFuZ2VEZXRlY3Rpb25Db21waWxlci5jb21waWxlQ29tcG9uZW50UnVudGltZSIsIkNoYW5nZURldGVjdGlvbkNvbXBpbGVyLl9jcmVhdGVDaGFuZ2VEZXRlY3RvckZhY3RvcnkiLCJDaGFuZ2VEZXRlY3Rpb25Db21waWxlci5jb21waWxlQ29tcG9uZW50Q29kZUdlbiIsImNyZWF0ZUNoYW5nZURldGVjdG9yRGVmaW5pdGlvbnMiLCJQcm90b1ZpZXdWaXNpdG9yIiwiUHJvdG9WaWV3VmlzaXRvci5jb25zdHJ1Y3RvciIsIlByb3RvVmlld1Zpc2l0b3IudmlzaXRFbWJlZGRlZFRlbXBsYXRlIiwiUHJvdG9WaWV3VmlzaXRvci52aXNpdEVsZW1lbnQiLCJQcm90b1ZpZXdWaXNpdG9yLnZpc2l0TmdDb250ZW50IiwiUHJvdG9WaWV3VmlzaXRvci52aXNpdFZhcmlhYmxlIiwiUHJvdG9WaWV3VmlzaXRvci52aXNpdEV2ZW50IiwiUHJvdG9WaWV3VmlzaXRvci52aXNpdEVsZW1lbnRQcm9wZXJ0eSIsIlByb3RvVmlld1Zpc2l0b3IudmlzaXRBdHRyIiwiUHJvdG9WaWV3VmlzaXRvci52aXNpdEJvdW5kVGV4dCIsIlByb3RvVmlld1Zpc2l0b3IudmlzaXRUZXh0IiwiUHJvdG9WaWV3VmlzaXRvci52aXNpdERpcmVjdGl2ZSIsIlByb3RvVmlld1Zpc2l0b3IudmlzaXREaXJlY3RpdmVQcm9wZXJ0eSIsImNyZWF0ZUNoYW5nZURlZmluaXRpb25zIiwiX2NvbGxlY3ROZXN0ZWRQcm90b1ZpZXdzVmFyaWFibGVOYW1lcyIsIlRleHRBc3QiLCJUZXh0QXN0LmNvbnN0cnVjdG9yIiwiVGV4dEFzdC52aXNpdCIsIkJvdW5kVGV4dEFzdCIsIkJvdW5kVGV4dEFzdC5jb25zdHJ1Y3RvciIsIkJvdW5kVGV4dEFzdC52aXNpdCIsIkF0dHJBc3QiLCJBdHRyQXN0LmNvbnN0cnVjdG9yIiwiQXR0ckFzdC52aXNpdCIsIkJvdW5kRWxlbWVudFByb3BlcnR5QXN0IiwiQm91bmRFbGVtZW50UHJvcGVydHlBc3QuY29uc3RydWN0b3IiLCJCb3VuZEVsZW1lbnRQcm9wZXJ0eUFzdC52aXNpdCIsIkJvdW5kRXZlbnRBc3QiLCJCb3VuZEV2ZW50QXN0LmNvbnN0cnVjdG9yIiwiQm91bmRFdmVudEFzdC52aXNpdCIsIkJvdW5kRXZlbnRBc3QuZnVsbE5hbWUiLCJWYXJpYWJsZUFzdCIsIlZhcmlhYmxlQXN0LmNvbnN0cnVjdG9yIiwiVmFyaWFibGVBc3QudmlzaXQiLCJFbGVtZW50QXN0IiwiRWxlbWVudEFzdC5jb25zdHJ1Y3RvciIsIkVsZW1lbnRBc3QudmlzaXQiLCJFbGVtZW50QXN0LmlzQm91bmQiLCJFbGVtZW50QXN0LmdldENvbXBvbmVudCIsIkVtYmVkZGVkVGVtcGxhdGVBc3QiLCJFbWJlZGRlZFRlbXBsYXRlQXN0LmNvbnN0cnVjdG9yIiwiRW1iZWRkZWRUZW1wbGF0ZUFzdC52aXNpdCIsIkJvdW5kRGlyZWN0aXZlUHJvcGVydHlBc3QiLCJCb3VuZERpcmVjdGl2ZVByb3BlcnR5QXN0LmNvbnN0cnVjdG9yIiwiQm91bmREaXJlY3RpdmVQcm9wZXJ0eUFzdC52aXNpdCIsIkRpcmVjdGl2ZUFzdCIsIkRpcmVjdGl2ZUFzdC5jb25zdHJ1Y3RvciIsIkRpcmVjdGl2ZUFzdC52aXNpdCIsIk5nQ29udGVudEFzdCIsIk5nQ29udGVudEFzdC5jb25zdHJ1Y3RvciIsIk5nQ29udGVudEFzdC52aXNpdCIsIlByb3BlcnR5QmluZGluZ1R5cGUiLCJ0ZW1wbGF0ZVZpc2l0QWxsIiwiQ29kZWdlbiIsIkNvZGVnZW4uY29uc3RydWN0b3IiLCJDb2RlZ2VuLmdlbmVyYXRlIiwiQ29kZWdlbi50b1N0cmluZyIsIlN0eWxlQ29tcGlsZXIiLCJTdHlsZUNvbXBpbGVyLmNvbnN0cnVjdG9yIiwiU3R5bGVDb21waWxlci5jb21waWxlQ29tcG9uZW50UnVudGltZSIsIlN0eWxlQ29tcGlsZXIuY29tcGlsZUNvbXBvbmVudENvZGVHZW4iLCJTdHlsZUNvbXBpbGVyLmNvbXBpbGVTdHlsZXNoZWV0Q29kZUdlbiIsIlN0eWxlQ29tcGlsZXIuY2xlYXJDYWNoZSIsIlN0eWxlQ29tcGlsZXIuX2xvYWRTdHlsZXMiLCJTdHlsZUNvbXBpbGVyLl9zdHlsZUNvZGVHZW4iLCJTdHlsZUNvbXBpbGVyLl9zdHlsZU1vZHVsZSIsIlN0eWxlQ29tcGlsZXIuX3NoaW1JZk5lZWRlZCIsIlN0eWxlQ29tcGlsZXIuX2NyZWF0ZU1vZHVsZVVybCIsIlNoYWRvd0NzcyIsIlNoYWRvd0Nzcy5jb25zdHJ1Y3RvciIsIlNoYWRvd0Nzcy5zaGltQ3NzVGV4dCIsIlNoYWRvd0Nzcy5faW5zZXJ0RGlyZWN0aXZlcyIsIlNoYWRvd0Nzcy5faW5zZXJ0UG9seWZpbGxEaXJlY3RpdmVzSW5Dc3NUZXh0IiwiU2hhZG93Q3NzLl9pbnNlcnRQb2x5ZmlsbFJ1bGVzSW5Dc3NUZXh0IiwiU2hhZG93Q3NzLl9zY29wZUNzc1RleHQiLCJTaGFkb3dDc3MuX2V4dHJhY3RVbnNjb3BlZFJ1bGVzRnJvbUNzc1RleHQiLCJTaGFkb3dDc3MuX2NvbnZlcnRDb2xvbkhvc3QiLCJTaGFkb3dDc3MuX2NvbnZlcnRDb2xvbkhvc3RDb250ZXh0IiwiU2hhZG93Q3NzLl9jb252ZXJ0Q29sb25SdWxlIiwiU2hhZG93Q3NzLl9jb2xvbkhvc3RDb250ZXh0UGFydFJlcGxhY2VyIiwiU2hhZG93Q3NzLl9jb2xvbkhvc3RQYXJ0UmVwbGFjZXIiLCJTaGFkb3dDc3MuX2NvbnZlcnRTaGFkb3dET01TZWxlY3RvcnMiLCJTaGFkb3dDc3MuX3Njb3BlU2VsZWN0b3JzIiwiU2hhZG93Q3NzLl9zY29wZVNlbGVjdG9yIiwiU2hhZG93Q3NzLl9zZWxlY3Rvck5lZWRzU2NvcGluZyIsIlNoYWRvd0Nzcy5fbWFrZVNjb3BlTWF0Y2hlciIsIlNoYWRvd0Nzcy5fYXBwbHlTZWxlY3RvclNjb3BlIiwiU2hhZG93Q3NzLl9hcHBseVNpbXBsZVNlbGVjdG9yU2NvcGUiLCJTaGFkb3dDc3MuX2FwcGx5U3RyaWN0U2VsZWN0b3JTY29wZSIsIlNoYWRvd0Nzcy5faW5zZXJ0UG9seWZpbGxIb3N0SW5Dc3NUZXh0Iiwic3RyaXBDb21tZW50cyIsIkNzc1J1bGUiLCJDc3NSdWxlLmNvbnN0cnVjdG9yIiwicHJvY2Vzc1J1bGVzIiwiU3RyaW5nV2l0aEVzY2FwZWRCbG9ja3MiLCJTdHJpbmdXaXRoRXNjYXBlZEJsb2Nrcy5jb25zdHJ1Y3RvciIsImVzY2FwZUJsb2NrcyIsIlN0eWxlV2l0aEltcG9ydHMiLCJTdHlsZVdpdGhJbXBvcnRzLmNvbnN0cnVjdG9yIiwiaXNTdHlsZVVybFJlc29sdmFibGUiLCJleHRyYWN0U3R5bGVVcmxzIiwiZW5jYXBzdWxhdGVTdHlsZXMiLCJjcmVhdGVSZW5kZXJWaWV3IiwiQnVpbGRDb250ZXh0IiwiQnVpbGRDb250ZXh0LmNvbnN0cnVjdG9yIiwiQnVpbGRDb250ZXh0LmJ1aWxkIiwiQnVpbGRDb250ZXh0Ll9idWlsZCIsIkJ1aWxkQ29udGV4dC5lbnF1ZXVlQ29tcG9uZW50QnVpbGRlciIsIkJ1aWxkQ29udGV4dC5lbnF1ZXVlRnJhZ21lbnRCdWlsZGVyIiwiQnVpbGRDb250ZXh0LmVucXVldWVSb290QnVpbGRlciIsIkJ1aWxkQ29udGV4dC5jb25zdW1lSW5wbGFjZUVsZW1lbnQiLCJCdWlsZENvbnRleHQuYWRkRXZlbnRMaXN0ZW5lciIsImNyZWF0ZUV2ZW50SGFuZGxlciIsImNyZWF0ZUdsb2JhbEV2ZW50QWRkZXIiLCJSZW5kZXJWaWV3QnVpbGRlciIsIlJlbmRlclZpZXdCdWlsZGVyLmNvbnN0cnVjdG9yIiwiUmVuZGVyVmlld0J1aWxkZXIuYnVpbGQiLCJSZW5kZXJWaWV3QnVpbGRlci5wYXJlbnQiLCJSZW5kZXJWaWV3QnVpbGRlci52aXNpdFRleHQiLCJSZW5kZXJWaWV3QnVpbGRlci52aXNpdE5nQ29udGVudCIsIlJlbmRlclZpZXdCdWlsZGVyLnZpc2l0QmVnaW5FbGVtZW50IiwiUmVuZGVyVmlld0J1aWxkZXIudmlzaXRFbmRFbGVtZW50IiwiUmVuZGVyVmlld0J1aWxkZXIudmlzaXRCZWdpbkNvbXBvbmVudCIsIlJlbmRlclZpZXdCdWlsZGVyLnZpc2l0RW5kQ29tcG9uZW50IiwiUmVuZGVyVmlld0J1aWxkZXIudmlzaXRFbWJlZGRlZFRlbXBsYXRlIiwiUmVuZGVyVmlld0J1aWxkZXIuX2JlZ2luRWxlbWVudCIsIlJlbmRlclZpZXdCdWlsZGVyLl9lbmRFbGVtZW50IiwiUmVuZGVyVmlld0J1aWxkZXIuX2FkZENoaWxkIiwiQ29tcG9uZW50IiwiQ29tcG9uZW50LmNvbnN0cnVjdG9yIiwiQ29tcG9uZW50LmFkZENvbnRlbnROb2RlIiwiQ29tcG9uZW50LnByb2plY3QiLCJfc2hpbUNvbnRlbnRBdHRyaWJ1dGUiLCJfc2hpbUhvc3RBdHRyaWJ1dGUiLCJEZWZhdWx0UHJvdG9WaWV3UmVmIiwiRGVmYXVsdFByb3RvVmlld1JlZi5jb25zdHJ1Y3RvciIsIkRlZmF1bHRSZW5kZXJGcmFnbWVudFJlZiIsIkRlZmF1bHRSZW5kZXJGcmFnbWVudFJlZi5jb25zdHJ1Y3RvciIsIkRlZmF1bHRSZW5kZXJWaWV3IiwiRGVmYXVsdFJlbmRlclZpZXcuY29uc3RydWN0b3IiLCJEZWZhdWx0UmVuZGVyVmlldy5oeWRyYXRlIiwiRGVmYXVsdFJlbmRlclZpZXcuZGVoeWRyYXRlIiwiRGVmYXVsdFJlbmRlclZpZXcuc2V0RXZlbnREaXNwYXRjaGVyIiwiRGVmYXVsdFJlbmRlclZpZXcuZGlzcGF0Y2hSZW5kZXJFdmVudCIsIkNvbW1hbmRDb21waWxlciIsIkNvbW1hbmRDb21waWxlci5jb25zdHJ1Y3RvciIsIkNvbW1hbmRDb21waWxlci5jb21waWxlQ29tcG9uZW50UnVudGltZSIsIkNvbW1hbmRDb21waWxlci5jb21waWxlQ29tcG9uZW50Q29kZUdlbiIsIlJ1bnRpbWVDb21tYW5kRmFjdG9yeSIsIlJ1bnRpbWVDb21tYW5kRmFjdG9yeS5jb25zdHJ1Y3RvciIsIlJ1bnRpbWVDb21tYW5kRmFjdG9yeS5fbWFwRGlyZWN0aXZlcyIsIlJ1bnRpbWVDb21tYW5kRmFjdG9yeS5jcmVhdGVUZXh0IiwiUnVudGltZUNvbW1hbmRGYWN0b3J5LmNyZWF0ZU5nQ29udGVudCIsIlJ1bnRpbWVDb21tYW5kRmFjdG9yeS5jcmVhdGVCZWdpbkVsZW1lbnQiLCJSdW50aW1lQ29tbWFuZEZhY3RvcnkuY3JlYXRlRW5kRWxlbWVudCIsIlJ1bnRpbWVDb21tYW5kRmFjdG9yeS5jcmVhdGVCZWdpbkNvbXBvbmVudCIsIlJ1bnRpbWVDb21tYW5kRmFjdG9yeS5jcmVhdGVFbmRDb21wb25lbnQiLCJSdW50aW1lQ29tbWFuZEZhY3RvcnkuY3JlYXRlRW1iZWRkZWRUZW1wbGF0ZSIsIkNvZGVnZW5Db21tYW5kRmFjdG9yeSIsIkNvZGVnZW5Db21tYW5kRmFjdG9yeS5jb25zdHJ1Y3RvciIsIkNvZGVnZW5Db21tYW5kRmFjdG9yeS5jcmVhdGVUZXh0IiwiQ29kZWdlbkNvbW1hbmRGYWN0b3J5LmNyZWF0ZU5nQ29udGVudCIsIkNvZGVnZW5Db21tYW5kRmFjdG9yeS5jcmVhdGVCZWdpbkVsZW1lbnQiLCJDb2RlZ2VuQ29tbWFuZEZhY3RvcnkuY3JlYXRlRW5kRWxlbWVudCIsIkNvZGVnZW5Db21tYW5kRmFjdG9yeS5jcmVhdGVCZWdpbkNvbXBvbmVudCIsIkNvZGVnZW5Db21tYW5kRmFjdG9yeS5jcmVhdGVFbmRDb21wb25lbnQiLCJDb2RlZ2VuQ29tbWFuZEZhY3RvcnkuY3JlYXRlRW1iZWRkZWRUZW1wbGF0ZSIsInZpc2l0QW5kUmV0dXJuQ29udGV4dCIsIkNvbW1hbmRCdWlsZGVyVmlzaXRvciIsIkNvbW1hbmRCdWlsZGVyVmlzaXRvci5jb25zdHJ1Y3RvciIsIkNvbW1hbmRCdWlsZGVyVmlzaXRvci5fcmVhZEF0dHJOYW1lQW5kVmFsdWVzIiwiQ29tbWFuZEJ1aWxkZXJWaXNpdG9yLnZpc2l0TmdDb250ZW50IiwiQ29tbWFuZEJ1aWxkZXJWaXNpdG9yLnZpc2l0RW1iZWRkZWRUZW1wbGF0ZSIsIkNvbW1hbmRCdWlsZGVyVmlzaXRvci52aXNpdEVsZW1lbnQiLCJDb21tYW5kQnVpbGRlclZpc2l0b3IudmlzaXRWYXJpYWJsZSIsIkNvbW1hbmRCdWlsZGVyVmlzaXRvci52aXNpdEF0dHIiLCJDb21tYW5kQnVpbGRlclZpc2l0b3IudmlzaXRCb3VuZFRleHQiLCJDb21tYW5kQnVpbGRlclZpc2l0b3IudmlzaXRUZXh0IiwiQ29tbWFuZEJ1aWxkZXJWaXNpdG9yLnZpc2l0RGlyZWN0aXZlIiwiQ29tbWFuZEJ1aWxkZXJWaXNpdG9yLnZpc2l0RXZlbnQiLCJDb21tYW5kQnVpbGRlclZpc2l0b3IudmlzaXREaXJlY3RpdmVQcm9wZXJ0eSIsIkNvbW1hbmRCdWlsZGVyVmlzaXRvci52aXNpdEVsZW1lbnRQcm9wZXJ0eSIsInJlbW92ZUtleVZhbHVlQXJyYXlEdXBsaWNhdGVzIiwia2V5VmFsdWVBcnJheVRvTWFwIiwibWFwVG9LZXlWYWx1ZUFycmF5IiwibWVyZ2VBdHRyaWJ1dGVWYWx1ZSIsIkRpcmVjdGl2ZUNvbnRleHQiLCJEaXJlY3RpdmVDb250ZXh0LmNvbnN0cnVjdG9yIiwiRXhwcmVzc2lvbiIsIkV4cHJlc3Npb24uY29uc3RydWN0b3IiLCJlc2NhcGVWYWx1ZSIsImNvZGVHZW5BcnJheSIsImNvZGVHZW5EaXJlY3RpdmVzQXJyYXkiLCJjb2RlR2VuVmlld0VuY2Fwc3VsYXRpb24iLCJUZW1wbGF0ZVBhcnNlRXJyb3IiLCJUZW1wbGF0ZVBhcnNlRXJyb3IuY29uc3RydWN0b3IiLCJUZW1wbGF0ZVBhcnNlciIsIlRlbXBsYXRlUGFyc2VyLmNvbnN0cnVjdG9yIiwiVGVtcGxhdGVQYXJzZXIucGFyc2UiLCJUZW1wbGF0ZVBhcnNlVmlzaXRvciIsIlRlbXBsYXRlUGFyc2VWaXNpdG9yLmNvbnN0cnVjdG9yIiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IuX3JlcG9ydEVycm9yIiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IuX3BhcnNlSW50ZXJwb2xhdGlvbiIsIlRlbXBsYXRlUGFyc2VWaXNpdG9yLl9wYXJzZUFjdGlvbiIsIlRlbXBsYXRlUGFyc2VWaXNpdG9yLl9wYXJzZUJpbmRpbmciLCJUZW1wbGF0ZVBhcnNlVmlzaXRvci5fcGFyc2VUZW1wbGF0ZUJpbmRpbmdzIiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IudmlzaXRUZXh0IiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IudmlzaXRBdHRyIiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IudmlzaXRFbGVtZW50IiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IuX3BhcnNlSW5saW5lVGVtcGxhdGVCaW5kaW5nIiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IuX3BhcnNlQXR0ciIsIlRlbXBsYXRlUGFyc2VWaXNpdG9yLl9ub3JtYWxpemVBdHRyaWJ1dGVOYW1lIiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IuX3BhcnNlVmFyaWFibGUiLCJUZW1wbGF0ZVBhcnNlVmlzaXRvci5fcGFyc2VQcm9wZXJ0eSIsIlRlbXBsYXRlUGFyc2VWaXNpdG9yLl9wYXJzZVByb3BlcnR5SW50ZXJwb2xhdGlvbiIsIlRlbXBsYXRlUGFyc2VWaXNpdG9yLl9wYXJzZVByb3BlcnR5QXN0IiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IuX3BhcnNlQXNzaWdubWVudEV2ZW50IiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IuX3BhcnNlRXZlbnQiLCJUZW1wbGF0ZVBhcnNlVmlzaXRvci5fcGFyc2VMaXRlcmFsQXR0ciIsIlRlbXBsYXRlUGFyc2VWaXNpdG9yLl9wYXJzZURpcmVjdGl2ZXMiLCJUZW1wbGF0ZVBhcnNlVmlzaXRvci5fY3JlYXRlRGlyZWN0aXZlQXN0cyIsIlRlbXBsYXRlUGFyc2VWaXNpdG9yLl9jcmVhdGVEaXJlY3RpdmVIb3N0UHJvcGVydHlBc3RzIiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IuX2NyZWF0ZURpcmVjdGl2ZUhvc3RFdmVudEFzdHMiLCJUZW1wbGF0ZVBhcnNlVmlzaXRvci5fY3JlYXRlRGlyZWN0aXZlUHJvcGVydHlBc3RzIiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IuX2NyZWF0ZUVsZW1lbnRQcm9wZXJ0eUFzdHMiLCJUZW1wbGF0ZVBhcnNlVmlzaXRvci5fY3JlYXRlRWxlbWVudFByb3BlcnR5QXN0IiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IuX2ZpbmRDb21wb25lbnREaXJlY3RpdmVOYW1lcyIsIlRlbXBsYXRlUGFyc2VWaXNpdG9yLl9hc3NlcnRPbmx5T25lQ29tcG9uZW50IiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IuX2Fzc2VydE5vQ29tcG9uZW50c05vckVsZW1lbnRCaW5kaW5nc09uVGVtcGxhdGUiLCJUZW1wbGF0ZVBhcnNlVmlzaXRvci5fYXNzZXJ0QWxsRXZlbnRzUHVibGlzaGVkQnlEaXJlY3RpdmVzIiwiTm9uQmluZGFibGVWaXNpdG9yIiwiTm9uQmluZGFibGVWaXNpdG9yLmNvbnN0cnVjdG9yIiwiTm9uQmluZGFibGVWaXNpdG9yLnZpc2l0RWxlbWVudCIsIk5vbkJpbmRhYmxlVmlzaXRvci52aXNpdEF0dHIiLCJOb25CaW5kYWJsZVZpc2l0b3IudmlzaXRUZXh0IiwiQm91bmRFbGVtZW50T3JEaXJlY3RpdmVQcm9wZXJ0eSIsIkJvdW5kRWxlbWVudE9yRGlyZWN0aXZlUHJvcGVydHkuY29uc3RydWN0b3IiLCJzcGxpdENsYXNzZXMiLCJDb21wb25lbnQuY3JlYXRlIiwiQ29tcG9uZW50LmZpbmROZ0NvbnRlbnRJbmRleCIsImNyZWF0ZUVsZW1lbnRDc3NTZWxlY3RvciIsIkh0bWxUcmVlRXJyb3IiLCJIdG1sVHJlZUVycm9yLmNvbnN0cnVjdG9yIiwiSHRtbFRyZWVFcnJvci5jcmVhdGUiLCJIdG1sUGFyc2VUcmVlUmVzdWx0IiwiSHRtbFBhcnNlVHJlZVJlc3VsdC5jb25zdHJ1Y3RvciIsIkh0bWxQYXJzZXIiLCJIdG1sUGFyc2VyLmNvbnN0cnVjdG9yIiwiSHRtbFBhcnNlci5wYXJzZSIsIlRyZWVCdWlsZGVyIiwiVHJlZUJ1aWxkZXIuY29uc3RydWN0b3IiLCJUcmVlQnVpbGRlci5idWlsZCIsIlRyZWVCdWlsZGVyLl9hZHZhbmNlIiwiVHJlZUJ1aWxkZXIuX2FkdmFuY2VJZiIsIlRyZWVCdWlsZGVyLl9jb25zdW1lQ2RhdGEiLCJUcmVlQnVpbGRlci5fY29uc3VtZUNvbW1lbnQiLCJUcmVlQnVpbGRlci5fY29uc3VtZVRleHQiLCJUcmVlQnVpbGRlci5fY2xvc2VWb2lkRWxlbWVudCIsIlRyZWVCdWlsZGVyLl9jb25zdW1lU3RhcnRUYWciLCJUcmVlQnVpbGRlci5fcHVzaEVsZW1lbnQiLCJUcmVlQnVpbGRlci5fY29uc3VtZUVuZFRhZyIsIlRyZWVCdWlsZGVyLl9wb3BFbGVtZW50IiwiVHJlZUJ1aWxkZXIuX2NvbnN1bWVBdHRyIiwiVHJlZUJ1aWxkZXIuX2dldFBhcmVudEVsZW1lbnQiLCJUcmVlQnVpbGRlci5fYWRkVG9QYXJlbnQiLCJtZXJnZU5zQW5kTmFtZSIsImdldEVsZW1lbnRGdWxsTmFtZSIsIkh0bWxUZXh0QXN0IiwiSHRtbFRleHRBc3QuY29uc3RydWN0b3IiLCJIdG1sVGV4dEFzdC52aXNpdCIsIkh0bWxBdHRyQXN0IiwiSHRtbEF0dHJBc3QuY29uc3RydWN0b3IiLCJIdG1sQXR0ckFzdC52aXNpdCIsIkh0bWxFbGVtZW50QXN0IiwiSHRtbEVsZW1lbnRBc3QuY29uc3RydWN0b3IiLCJIdG1sRWxlbWVudEFzdC52aXNpdCIsImh0bWxWaXNpdEFsbCIsIkh0bWxUb2tlblR5cGUiLCJIdG1sVG9rZW4iLCJIdG1sVG9rZW4uY29uc3RydWN0b3IiLCJIdG1sVG9rZW5FcnJvciIsIkh0bWxUb2tlbkVycm9yLmNvbnN0cnVjdG9yIiwiSHRtbFRva2VuaXplUmVzdWx0IiwiSHRtbFRva2VuaXplUmVzdWx0LmNvbnN0cnVjdG9yIiwidG9rZW5pemVIdG1sIiwidW5leHBlY3RlZENoYXJhY3RlckVycm9yTXNnIiwidW5rbm93bkVudGl0eUVycm9yTXNnIiwiQ29udHJvbEZsb3dFcnJvciIsIkNvbnRyb2xGbG93RXJyb3IuY29uc3RydWN0b3IiLCJfSHRtbFRva2VuaXplciIsIl9IdG1sVG9rZW5pemVyLmNvbnN0cnVjdG9yIiwiX0h0bWxUb2tlbml6ZXIuX3Byb2Nlc3NDYXJyaWFnZVJldHVybnMiLCJfSHRtbFRva2VuaXplci50b2tlbml6ZSIsIl9IdG1sVG9rZW5pemVyLl9nZXRMb2NhdGlvbiIsIl9IdG1sVG9rZW5pemVyLl9iZWdpblRva2VuIiwiX0h0bWxUb2tlbml6ZXIuX2VuZFRva2VuIiwiX0h0bWxUb2tlbml6ZXIuX2NyZWF0ZUVycm9yIiwiX0h0bWxUb2tlbml6ZXIuX2FkdmFuY2UiLCJfSHRtbFRva2VuaXplci5fYXR0ZW1wdENoYXIiLCJfSHRtbFRva2VuaXplci5fcmVxdWlyZUNoYXIiLCJfSHRtbFRva2VuaXplci5fYXR0ZW1wdENoYXJzIiwiX0h0bWxUb2tlbml6ZXIuX3JlcXVpcmVDaGFycyIsIl9IdG1sVG9rZW5pemVyLl9hdHRlbXB0VW50aWxGbiIsIl9IdG1sVG9rZW5pemVyLl9yZXF1aXJlVW50aWxGbiIsIl9IdG1sVG9rZW5pemVyLl9hdHRlbXB0VW50aWxDaGFyIiwiX0h0bWxUb2tlbml6ZXIuX3JlYWRDaGFyIiwiX0h0bWxUb2tlbml6ZXIuX2RlY29kZUVudGl0eSIsIl9IdG1sVG9rZW5pemVyLl9jb25zdW1lUmF3VGV4dCIsIl9IdG1sVG9rZW5pemVyLl9jb25zdW1lQ29tbWVudCIsIl9IdG1sVG9rZW5pemVyLl9jb25zdW1lQ2RhdGEiLCJfSHRtbFRva2VuaXplci5fY29uc3VtZURvY1R5cGUiLCJfSHRtbFRva2VuaXplci5fY29uc3VtZVByZWZpeEFuZE5hbWUiLCJfSHRtbFRva2VuaXplci5fY29uc3VtZVRhZ09wZW4iLCJfSHRtbFRva2VuaXplci5fY29uc3VtZVJhd1RleHRXaXRoVGFnQ2xvc2UiLCJfSHRtbFRva2VuaXplci5fY29uc3VtZVRhZ09wZW5TdGFydCIsIl9IdG1sVG9rZW5pemVyLl9jb25zdW1lQXR0cmlidXRlTmFtZSIsIl9IdG1sVG9rZW5pemVyLl9jb25zdW1lQXR0cmlidXRlVmFsdWUiLCJfSHRtbFRva2VuaXplci5fY29uc3VtZVRhZ09wZW5FbmQiLCJfSHRtbFRva2VuaXplci5fY29uc3VtZVRhZ0Nsb3NlIiwiX0h0bWxUb2tlbml6ZXIuX2NvbnN1bWVUZXh0IiwiX0h0bWxUb2tlbml6ZXIuX3NhdmVQb3NpdGlvbiIsIl9IdG1sVG9rZW5pemVyLl9yZXN0b3JlUG9zaXRpb24iLCJpc05vdFdoaXRlc3BhY2UiLCJpc05hbWVFbmQiLCJpc1ByZWZpeEVuZCIsImlzRGlnaXRFbnRpdHlFbmQiLCJpc05hbWVkRW50aXR5RW5kIiwiaXNUZXh0RW5kIiwiaXNBc2NpaUxldHRlciIsImlzQXNjaWlIZXhEaWdpdCIsIm1lcmdlVGV4dFRva2VucyIsIlBhcnNlTG9jYXRpb24iLCJQYXJzZUxvY2F0aW9uLmNvbnN0cnVjdG9yIiwiUGFyc2VMb2NhdGlvbi50b1N0cmluZyIsIlBhcnNlU291cmNlRmlsZSIsIlBhcnNlU291cmNlRmlsZS5jb25zdHJ1Y3RvciIsIlBhcnNlRXJyb3IiLCJQYXJzZUVycm9yLmNvbnN0cnVjdG9yIiwiUGFyc2VFcnJvci50b1N0cmluZyIsIlBhcnNlU291cmNlU3BhbiIsIlBhcnNlU291cmNlU3Bhbi5jb25zdHJ1Y3RvciIsIlBhcnNlU291cmNlU3Bhbi50b1N0cmluZyIsIkh0bWxUYWdDb250ZW50VHlwZSIsIkh0bWxUYWdEZWZpbml0aW9uIiwiSHRtbFRhZ0RlZmluaXRpb24uY29uc3RydWN0b3IiLCJIdG1sVGFnRGVmaW5pdGlvbi5yZXF1aXJlRXh0cmFQYXJlbnQiLCJIdG1sVGFnRGVmaW5pdGlvbi5pc0Nsb3NlZEJ5Q2hpbGQiLCJnZXRIdG1sVGFnRGVmaW5pdGlvbiIsInNwbGl0TnNOYW1lIiwiZ2V0TnNQcmVmaXgiLCJFbGVtZW50U2NoZW1hUmVnaXN0cnkiLCJFbGVtZW50U2NoZW1hUmVnaXN0cnkuY29uc3RydWN0b3IiLCJFbGVtZW50U2NoZW1hUmVnaXN0cnkuaGFzUHJvcGVydHkiLCJFbGVtZW50U2NoZW1hUmVnaXN0cnkuZ2V0TWFwcGVkUHJvcE5hbWUiLCJwcmVwYXJzZUVsZW1lbnQiLCJQcmVwYXJzZWRFbGVtZW50VHlwZSIsIlByZXBhcnNlZEVsZW1lbnQiLCJQcmVwYXJzZWRFbGVtZW50LmNvbnN0cnVjdG9yIiwibm9ybWFsaXplTmdDb250ZW50U2VsZWN0IiwiVGVtcGxhdGVOb3JtYWxpemVyIiwiVGVtcGxhdGVOb3JtYWxpemVyLmNvbnN0cnVjdG9yIiwiVGVtcGxhdGVOb3JtYWxpemVyLm5vcm1hbGl6ZVRlbXBsYXRlIiwiVGVtcGxhdGVOb3JtYWxpemVyLm5vcm1hbGl6ZUxvYWRlZFRlbXBsYXRlIiwiVGVtcGxhdGVQcmVwYXJzZVZpc2l0b3IiLCJUZW1wbGF0ZVByZXBhcnNlVmlzaXRvci5jb25zdHJ1Y3RvciIsIlRlbXBsYXRlUHJlcGFyc2VWaXNpdG9yLnZpc2l0RWxlbWVudCIsIlRlbXBsYXRlUHJlcGFyc2VWaXNpdG9yLnZpc2l0QXR0ciIsIlRlbXBsYXRlUHJlcGFyc2VWaXNpdG9yLnZpc2l0VGV4dCIsIlJ1bnRpbWVNZXRhZGF0YVJlc29sdmVyIiwiUnVudGltZU1ldGFkYXRhUmVzb2x2ZXIuY29uc3RydWN0b3IiLCJSdW50aW1lTWV0YWRhdGFSZXNvbHZlci5nZXRNZXRhZGF0YSIsIlJ1bnRpbWVNZXRhZGF0YVJlc29sdmVyLmdldFZpZXdEaXJlY3RpdmVzTWV0YWRhdGEiLCJmbGF0dGVuRGlyZWN0aXZlcyIsImZsYXR0ZW5BcnJheSIsImlzVmFsaWREaXJlY3RpdmUiLCJjYWxjTW9kdWxlVXJsIiwiRG9tRWxlbWVudFNjaGVtYVJlZ2lzdHJ5IiwiRG9tRWxlbWVudFNjaGVtYVJlZ2lzdHJ5LmNvbnN0cnVjdG9yIiwiRG9tRWxlbWVudFNjaGVtYVJlZ2lzdHJ5Ll9nZXRQcm90b0VsZW1lbnQiLCJEb21FbGVtZW50U2NoZW1hUmVnaXN0cnkuaGFzUHJvcGVydHkiLCJEb21FbGVtZW50U2NoZW1hUmVnaXN0cnkuZ2V0TWFwcGVkUHJvcE5hbWUiLCJzZXRSb290RG9tQWRhcHRlciIsIkRvbUFkYXB0ZXIiLCJEb21BZGFwdGVyLmNvbnN0cnVjdG9yIiwiYm9vdHN0cmFwIiwiQW5ndWxhckVudHJ5cG9pbnQiLCJBbmd1bGFyRW50cnlwb2ludC5jb25zdHJ1Y3RvciIsIl9leGNlcHRpb25IYW5kbGVyIiwiX2RvY3VtZW50IiwiaW5pdERvbUFkYXB0ZXIiLCJEb21FdmVudHNQbHVnaW4iLCJEb21FdmVudHNQbHVnaW4uY29uc3RydWN0b3IiLCJEb21FdmVudHNQbHVnaW4uc3VwcG9ydHMiLCJEb21FdmVudHNQbHVnaW4uYWRkRXZlbnRMaXN0ZW5lciIsIkRvbUV2ZW50c1BsdWdpbi5hZGRHbG9iYWxFdmVudExpc3RlbmVyIiwiRXZlbnRNYW5hZ2VyIiwiRXZlbnRNYW5hZ2VyLmNvbnN0cnVjdG9yIiwiRXZlbnRNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIiLCJFdmVudE1hbmFnZXIuYWRkR2xvYmFsRXZlbnRMaXN0ZW5lciIsIkV2ZW50TWFuYWdlci5nZXRab25lIiwiRXZlbnRNYW5hZ2VyLl9maW5kUGx1Z2luRm9yIiwiRXZlbnRNYW5hZ2VyUGx1Z2luIiwiRXZlbnRNYW5hZ2VyUGx1Z2luLmNvbnN0cnVjdG9yIiwiRXZlbnRNYW5hZ2VyUGx1Z2luLnN1cHBvcnRzIiwiRXZlbnRNYW5hZ2VyUGx1Z2luLmFkZEV2ZW50TGlzdGVuZXIiLCJFdmVudE1hbmFnZXJQbHVnaW4uYWRkR2xvYmFsRXZlbnRMaXN0ZW5lciIsIktleUV2ZW50c1BsdWdpbiIsIktleUV2ZW50c1BsdWdpbi5jb25zdHJ1Y3RvciIsIktleUV2ZW50c1BsdWdpbi5zdXBwb3J0cyIsIktleUV2ZW50c1BsdWdpbi5hZGRFdmVudExpc3RlbmVyIiwiS2V5RXZlbnRzUGx1Z2luLnBhcnNlRXZlbnROYW1lIiwiS2V5RXZlbnRzUGx1Z2luLmdldEV2ZW50RnVsbEtleSIsIktleUV2ZW50c1BsdWdpbi5ldmVudENhbGxiYWNrIiwiS2V5RXZlbnRzUGx1Z2luLl9ub3JtYWxpemVLZXkiLCJIYW1tZXJHZXN0dXJlc1BsdWdpbiIsIkhhbW1lckdlc3R1cmVzUGx1Z2luLmNvbnN0cnVjdG9yIiwiSGFtbWVyR2VzdHVyZXNQbHVnaW4uc3VwcG9ydHMiLCJIYW1tZXJHZXN0dXJlc1BsdWdpbi5hZGRFdmVudExpc3RlbmVyIiwiSGFtbWVyR2VzdHVyZXNQbHVnaW5Db21tb24iLCJIYW1tZXJHZXN0dXJlc1BsdWdpbkNvbW1vbi5jb25zdHJ1Y3RvciIsIkhhbW1lckdlc3R1cmVzUGx1Z2luQ29tbW9uLnN1cHBvcnRzIiwiRG9tUmVuZGVyZXIiLCJEb21SZW5kZXJlci5jb25zdHJ1Y3RvciIsIkRvbVJlbmRlcmVyLmdldE5hdGl2ZUVsZW1lbnRTeW5jIiwiRG9tUmVuZGVyZXIuZ2V0Um9vdE5vZGVzIiwiRG9tUmVuZGVyZXIuYXR0YWNoRnJhZ21lbnRBZnRlckZyYWdtZW50IiwiRG9tUmVuZGVyZXIuYW5pbWF0ZU5vZGVzRW50ZXIiLCJEb21SZW5kZXJlci5hdHRhY2hGcmFnbWVudEFmdGVyRWxlbWVudCIsIkRvbVJlbmRlcmVyLmh5ZHJhdGVWaWV3IiwiRG9tUmVuZGVyZXIuZGVoeWRyYXRlVmlldyIsIkRvbVJlbmRlcmVyLmNyZWF0ZVRlbXBsYXRlQW5jaG9yIiwiRG9tUmVuZGVyZXIuY3JlYXRlVGV4dCIsIkRvbVJlbmRlcmVyLmFwcGVuZENoaWxkIiwiRG9tUmVuZGVyZXIuc2V0RWxlbWVudFByb3BlcnR5IiwiRG9tUmVuZGVyZXIuc2V0RWxlbWVudEF0dHJpYnV0ZSIsIkRvbVJlbmRlcmVyLnNldEJpbmRpbmdEZWJ1Z0luZm8iLCJEb21SZW5kZXJlci5zZXRFbGVtZW50Q2xhc3MiLCJEb21SZW5kZXJlci5zZXRFbGVtZW50U3R5bGUiLCJEb21SZW5kZXJlci5pbnZva2VFbGVtZW50TWV0aG9kIiwiRG9tUmVuZGVyZXIuc2V0VGV4dCIsIkRvbVJlbmRlcmVyLnNldEV2ZW50RGlzcGF0Y2hlciIsIkRvbVJlbmRlcmVyXyIsIkRvbVJlbmRlcmVyXy5jb25zdHJ1Y3RvciIsIkRvbVJlbmRlcmVyXy5yZWdpc3RlckNvbXBvbmVudFRlbXBsYXRlIiwiRG9tUmVuZGVyZXJfLmNyZWF0ZVByb3RvVmlldyIsIkRvbVJlbmRlcmVyXy5yZXNvbHZlQ29tcG9uZW50VGVtcGxhdGUiLCJEb21SZW5kZXJlcl8uY3JlYXRlUm9vdEhvc3RWaWV3IiwiRG9tUmVuZGVyZXJfLmNyZWF0ZVZpZXciLCJEb21SZW5kZXJlcl8uX2NyZWF0ZVZpZXciLCJEb21SZW5kZXJlcl8uZGVzdHJveVZpZXciLCJEb21SZW5kZXJlcl8uYW5pbWF0ZU5vZGVFbnRlciIsIkRvbVJlbmRlcmVyXy5hbmltYXRlTm9kZUxlYXZlIiwiRG9tUmVuZGVyZXJfLmRldGFjaEZyYWdtZW50IiwiRG9tUmVuZGVyZXJfLmNyZWF0ZUVsZW1lbnQiLCJEb21SZW5kZXJlcl8ubWVyZ2VFbGVtZW50IiwiRG9tUmVuZGVyZXJfLl9zZXRBdHRyaWJ1dGVzIiwiRG9tUmVuZGVyZXJfLmNyZWF0ZVJvb3RDb250ZW50SW5zZXJ0aW9uUG9pbnQiLCJEb21SZW5kZXJlcl8uY3JlYXRlU2hhZG93Um9vdCIsIkRvbVJlbmRlcmVyXy5vbiIsIkRvbVJlbmRlcmVyXy5nbG9iYWxPbiIsInJlc29sdmVJbnRlcm5hbERvbVZpZXciLCJyZXNvbHZlSW50ZXJuYWxEb21GcmFnbWVudCIsIm1vdmVOb2Rlc0FmdGVyU2libGluZyIsImRlY29yYXRlUHJldmVudERlZmF1bHQiLCJzcGxpdE5hbWVzcGFjZSIsIkFuaW1hdGlvbkJ1aWxkZXIiLCJBbmltYXRpb25CdWlsZGVyLmNvbnN0cnVjdG9yIiwiQW5pbWF0aW9uQnVpbGRlci5jc3MiLCJDc3NBbmltYXRpb25CdWlsZGVyIiwiQ3NzQW5pbWF0aW9uQnVpbGRlci5jb25zdHJ1Y3RvciIsIkNzc0FuaW1hdGlvbkJ1aWxkZXIuYWRkQW5pbWF0aW9uQ2xhc3MiLCJDc3NBbmltYXRpb25CdWlsZGVyLmFkZENsYXNzIiwiQ3NzQW5pbWF0aW9uQnVpbGRlci5yZW1vdmVDbGFzcyIsIkNzc0FuaW1hdGlvbkJ1aWxkZXIuc2V0RHVyYXRpb24iLCJDc3NBbmltYXRpb25CdWlsZGVyLnNldERlbGF5IiwiQ3NzQW5pbWF0aW9uQnVpbGRlci5zZXRTdHlsZXMiLCJDc3NBbmltYXRpb25CdWlsZGVyLnNldEZyb21TdHlsZXMiLCJDc3NBbmltYXRpb25CdWlsZGVyLnNldFRvU3R5bGVzIiwiQ3NzQW5pbWF0aW9uQnVpbGRlci5zdGFydCIsIkNzc0FuaW1hdGlvbk9wdGlvbnMiLCJDc3NBbmltYXRpb25PcHRpb25zLmNvbnN0cnVjdG9yIiwiQW5pbWF0aW9uIiwiQW5pbWF0aW9uLmNvbnN0cnVjdG9yIiwiQW5pbWF0aW9uLnRvdGFsVGltZSIsIkFuaW1hdGlvbi53YWl0IiwiQW5pbWF0aW9uLnNldHVwIiwiQW5pbWF0aW9uLnN0YXJ0IiwiQW5pbWF0aW9uLmFwcGx5U3R5bGVzIiwiQW5pbWF0aW9uLmFkZENsYXNzZXMiLCJBbmltYXRpb24ucmVtb3ZlQ2xhc3NlcyIsIkFuaW1hdGlvbi5hZGRFdmVudHMiLCJBbmltYXRpb24uaGFuZGxlQW5pbWF0aW9uRXZlbnQiLCJBbmltYXRpb24uaGFuZGxlQW5pbWF0aW9uQ29tcGxldGVkIiwiQW5pbWF0aW9uLm9uQ29tcGxldGUiLCJBbmltYXRpb24ucGFyc2VEdXJhdGlvblN0cmluZyIsIkFuaW1hdGlvbi5zdHJpcExldHRlcnMiLCJCcm93c2VyRGV0YWlscyIsIkJyb3dzZXJEZXRhaWxzLmNvbnN0cnVjdG9yIiwiQnJvd3NlckRldGFpbHMuZG9lc0VsYXBzZWRUaW1lSW5jbHVkZXNEZWxheSIsIkJyb3dzZXJEZXRhaWxzLnJhZiIsIlJhZlF1ZXVlIiwiUmFmUXVldWUuY29uc3RydWN0b3IiLCJSYWZRdWV1ZS5fcmFmIiwiUmFmUXVldWUuX25leHRGcmFtZSIsIlJhZlF1ZXVlLmNhbmNlbCIsIlNoYXJlZFN0eWxlc0hvc3QiLCJTaGFyZWRTdHlsZXNIb3N0LmNvbnN0cnVjdG9yIiwiU2hhcmVkU3R5bGVzSG9zdC5hZGRTdHlsZXMiLCJTaGFyZWRTdHlsZXNIb3N0Lm9uU3R5bGVzQWRkZWQiLCJTaGFyZWRTdHlsZXNIb3N0LmdldEFsbFN0eWxlcyIsIkRvbVNoYXJlZFN0eWxlc0hvc3QiLCJEb21TaGFyZWRTdHlsZXNIb3N0LmNvbnN0cnVjdG9yIiwiRG9tU2hhcmVkU3R5bGVzSG9zdC5fYWRkU3R5bGVzVG9Ib3N0IiwiRG9tU2hhcmVkU3R5bGVzSG9zdC5hZGRIb3N0IiwiRG9tU2hhcmVkU3R5bGVzSG9zdC5yZW1vdmVIb3N0IiwiRG9tU2hhcmVkU3R5bGVzSG9zdC5vblN0eWxlc0FkZGVkIiwiQnJvd3NlckRvbUFkYXB0ZXIiLCJCcm93c2VyRG9tQWRhcHRlci5jb25zdHJ1Y3RvciIsIkJyb3dzZXJEb21BZGFwdGVyLnBhcnNlIiwiQnJvd3NlckRvbUFkYXB0ZXIubWFrZUN1cnJlbnQiLCJCcm93c2VyRG9tQWRhcHRlci5oYXNQcm9wZXJ0eSIsIkJyb3dzZXJEb21BZGFwdGVyLnNldFByb3BlcnR5IiwiQnJvd3NlckRvbUFkYXB0ZXIuZ2V0UHJvcGVydHkiLCJCcm93c2VyRG9tQWRhcHRlci5pbnZva2UiLCJCcm93c2VyRG9tQWRhcHRlci5sb2dFcnJvciIsIkJyb3dzZXJEb21BZGFwdGVyLmxvZyIsIkJyb3dzZXJEb21BZGFwdGVyLmxvZ0dyb3VwIiwiQnJvd3NlckRvbUFkYXB0ZXIubG9nR3JvdXBFbmQiLCJCcm93c2VyRG9tQWRhcHRlci5hdHRyVG9Qcm9wTWFwIiwiQnJvd3NlckRvbUFkYXB0ZXIucXVlcnkiLCJCcm93c2VyRG9tQWRhcHRlci5xdWVyeVNlbGVjdG9yIiwiQnJvd3NlckRvbUFkYXB0ZXIucXVlcnlTZWxlY3RvckFsbCIsIkJyb3dzZXJEb21BZGFwdGVyLm9uIiwiQnJvd3NlckRvbUFkYXB0ZXIub25BbmRDYW5jZWwiLCJCcm93c2VyRG9tQWRhcHRlci5kaXNwYXRjaEV2ZW50IiwiQnJvd3NlckRvbUFkYXB0ZXIuY3JlYXRlTW91c2VFdmVudCIsIkJyb3dzZXJEb21BZGFwdGVyLmNyZWF0ZUV2ZW50IiwiQnJvd3NlckRvbUFkYXB0ZXIucHJldmVudERlZmF1bHQiLCJCcm93c2VyRG9tQWRhcHRlci5pc1ByZXZlbnRlZCIsIkJyb3dzZXJEb21BZGFwdGVyLmdldElubmVySFRNTCIsIkJyb3dzZXJEb21BZGFwdGVyLmdldE91dGVySFRNTCIsIkJyb3dzZXJEb21BZGFwdGVyLm5vZGVOYW1lIiwiQnJvd3NlckRvbUFkYXB0ZXIubm9kZVZhbHVlIiwiQnJvd3NlckRvbUFkYXB0ZXIudHlwZSIsIkJyb3dzZXJEb21BZGFwdGVyLmNvbnRlbnQiLCJCcm93c2VyRG9tQWRhcHRlci5maXJzdENoaWxkIiwiQnJvd3NlckRvbUFkYXB0ZXIubmV4dFNpYmxpbmciLCJCcm93c2VyRG9tQWRhcHRlci5wYXJlbnRFbGVtZW50IiwiQnJvd3NlckRvbUFkYXB0ZXIuY2hpbGROb2RlcyIsIkJyb3dzZXJEb21BZGFwdGVyLmNoaWxkTm9kZXNBc0xpc3QiLCJCcm93c2VyRG9tQWRhcHRlci5jbGVhck5vZGVzIiwiQnJvd3NlckRvbUFkYXB0ZXIuYXBwZW5kQ2hpbGQiLCJCcm93c2VyRG9tQWRhcHRlci5yZW1vdmVDaGlsZCIsIkJyb3dzZXJEb21BZGFwdGVyLnJlcGxhY2VDaGlsZCIsIkJyb3dzZXJEb21BZGFwdGVyLnJlbW92ZSIsIkJyb3dzZXJEb21BZGFwdGVyLmluc2VydEJlZm9yZSIsIkJyb3dzZXJEb21BZGFwdGVyLmluc2VydEFsbEJlZm9yZSIsIkJyb3dzZXJEb21BZGFwdGVyLmluc2VydEFmdGVyIiwiQnJvd3NlckRvbUFkYXB0ZXIuc2V0SW5uZXJIVE1MIiwiQnJvd3NlckRvbUFkYXB0ZXIuZ2V0VGV4dCIsIkJyb3dzZXJEb21BZGFwdGVyLnNldFRleHQiLCJCcm93c2VyRG9tQWRhcHRlci5nZXRWYWx1ZSIsIkJyb3dzZXJEb21BZGFwdGVyLnNldFZhbHVlIiwiQnJvd3NlckRvbUFkYXB0ZXIuZ2V0Q2hlY2tlZCIsIkJyb3dzZXJEb21BZGFwdGVyLnNldENoZWNrZWQiLCJCcm93c2VyRG9tQWRhcHRlci5jcmVhdGVDb21tZW50IiwiQnJvd3NlckRvbUFkYXB0ZXIuY3JlYXRlVGVtcGxhdGUiLCJCcm93c2VyRG9tQWRhcHRlci5jcmVhdGVFbGVtZW50IiwiQnJvd3NlckRvbUFkYXB0ZXIuY3JlYXRlRWxlbWVudE5TIiwiQnJvd3NlckRvbUFkYXB0ZXIuY3JlYXRlVGV4dE5vZGUiLCJCcm93c2VyRG9tQWRhcHRlci5jcmVhdGVTY3JpcHRUYWciLCJCcm93c2VyRG9tQWRhcHRlci5jcmVhdGVTdHlsZUVsZW1lbnQiLCJCcm93c2VyRG9tQWRhcHRlci5jcmVhdGVTaGFkb3dSb290IiwiQnJvd3NlckRvbUFkYXB0ZXIuZ2V0U2hhZG93Um9vdCIsIkJyb3dzZXJEb21BZGFwdGVyLmdldEhvc3QiLCJCcm93c2VyRG9tQWRhcHRlci5jbG9uZSIsIkJyb3dzZXJEb21BZGFwdGVyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUiLCJCcm93c2VyRG9tQWRhcHRlci5nZXRFbGVtZW50c0J5VGFnTmFtZSIsIkJyb3dzZXJEb21BZGFwdGVyLmNsYXNzTGlzdCIsIkJyb3dzZXJEb21BZGFwdGVyLmFkZENsYXNzIiwiQnJvd3NlckRvbUFkYXB0ZXIucmVtb3ZlQ2xhc3MiLCJCcm93c2VyRG9tQWRhcHRlci5oYXNDbGFzcyIsIkJyb3dzZXJEb21BZGFwdGVyLnNldFN0eWxlIiwiQnJvd3NlckRvbUFkYXB0ZXIucmVtb3ZlU3R5bGUiLCJCcm93c2VyRG9tQWRhcHRlci5nZXRTdHlsZSIsIkJyb3dzZXJEb21BZGFwdGVyLmhhc1N0eWxlIiwiQnJvd3NlckRvbUFkYXB0ZXIudGFnTmFtZSIsIkJyb3dzZXJEb21BZGFwdGVyLmF0dHJpYnV0ZU1hcCIsIkJyb3dzZXJEb21BZGFwdGVyLmhhc0F0dHJpYnV0ZSIsIkJyb3dzZXJEb21BZGFwdGVyLmdldEF0dHJpYnV0ZSIsIkJyb3dzZXJEb21BZGFwdGVyLnNldEF0dHJpYnV0ZSIsIkJyb3dzZXJEb21BZGFwdGVyLnNldEF0dHJpYnV0ZU5TIiwiQnJvd3NlckRvbUFkYXB0ZXIucmVtb3ZlQXR0cmlidXRlIiwiQnJvd3NlckRvbUFkYXB0ZXIudGVtcGxhdGVBd2FyZVJvb3QiLCJCcm93c2VyRG9tQWRhcHRlci5jcmVhdGVIdG1sRG9jdW1lbnQiLCJCcm93c2VyRG9tQWRhcHRlci5kZWZhdWx0RG9jIiwiQnJvd3NlckRvbUFkYXB0ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwiQnJvd3NlckRvbUFkYXB0ZXIuZ2V0VGl0bGUiLCJCcm93c2VyRG9tQWRhcHRlci5zZXRUaXRsZSIsIkJyb3dzZXJEb21BZGFwdGVyLmVsZW1lbnRNYXRjaGVzIiwiQnJvd3NlckRvbUFkYXB0ZXIuaXNUZW1wbGF0ZUVsZW1lbnQiLCJCcm93c2VyRG9tQWRhcHRlci5pc1RleHROb2RlIiwiQnJvd3NlckRvbUFkYXB0ZXIuaXNDb21tZW50Tm9kZSIsIkJyb3dzZXJEb21BZGFwdGVyLmlzRWxlbWVudE5vZGUiLCJCcm93c2VyRG9tQWRhcHRlci5oYXNTaGFkb3dSb290IiwiQnJvd3NlckRvbUFkYXB0ZXIuaXNTaGFkb3dSb290IiwiQnJvd3NlckRvbUFkYXB0ZXIuaW1wb3J0SW50b0RvYyIsIkJyb3dzZXJEb21BZGFwdGVyLmFkb3B0Tm9kZSIsIkJyb3dzZXJEb21BZGFwdGVyLmdldEhyZWYiLCJCcm93c2VyRG9tQWRhcHRlci5nZXRFdmVudEtleSIsIkJyb3dzZXJEb21BZGFwdGVyLmdldEdsb2JhbEV2ZW50VGFyZ2V0IiwiQnJvd3NlckRvbUFkYXB0ZXIuZ2V0SGlzdG9yeSIsIkJyb3dzZXJEb21BZGFwdGVyLmdldExvY2F0aW9uIiwiQnJvd3NlckRvbUFkYXB0ZXIuZ2V0QmFzZUhyZWYiLCJCcm93c2VyRG9tQWRhcHRlci5yZXNldEJhc2VFbGVtZW50IiwiQnJvd3NlckRvbUFkYXB0ZXIuZ2V0VXNlckFnZW50IiwiQnJvd3NlckRvbUFkYXB0ZXIuc2V0RGF0YSIsIkJyb3dzZXJEb21BZGFwdGVyLmdldERhdGEiLCJCcm93c2VyRG9tQWRhcHRlci5nZXRDb21wdXRlZFN0eWxlIiwiQnJvd3NlckRvbUFkYXB0ZXIuc2V0R2xvYmFsVmFyIiwiQnJvd3NlckRvbUFkYXB0ZXIucmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwiQnJvd3NlckRvbUFkYXB0ZXIuY2FuY2VsQW5pbWF0aW9uRnJhbWUiLCJCcm93c2VyRG9tQWRhcHRlci5wZXJmb3JtYW5jZU5vdyIsImdldEJhc2VFbGVtZW50SHJlZiIsInJlbGF0aXZlUGF0aCIsIkdlbmVyaWNCcm93c2VyRG9tQWRhcHRlciIsIkdlbmVyaWNCcm93c2VyRG9tQWRhcHRlci5jb25zdHJ1Y3RvciIsIkdlbmVyaWNCcm93c2VyRG9tQWRhcHRlci5nZXRYSFIiLCJHZW5lcmljQnJvd3NlckRvbUFkYXB0ZXIuZ2V0RGlzdHJpYnV0ZWROb2RlcyIsIkdlbmVyaWNCcm93c2VyRG9tQWRhcHRlci5yZXNvbHZlQW5kU2V0SHJlZiIsIkdlbmVyaWNCcm93c2VyRG9tQWRhcHRlci5zdXBwb3J0c0RPTUV2ZW50cyIsIkdlbmVyaWNCcm93c2VyRG9tQWRhcHRlci5zdXBwb3J0c05hdGl2ZVNoYWRvd0RPTSIsIkdlbmVyaWNCcm93c2VyRG9tQWRhcHRlci5nZXRBbmltYXRpb25QcmVmaXgiLCJHZW5lcmljQnJvd3NlckRvbUFkYXB0ZXIuZ2V0VHJhbnNpdGlvbkVuZCIsIkdlbmVyaWNCcm93c2VyRG9tQWRhcHRlci5zdXBwb3J0c0FuaW1hdGlvbiIsIlhIUkltcGwiLCJYSFJJbXBsLmNvbnN0cnVjdG9yIiwiWEhSSW1wbC5nZXQiLCJQdWJsaWNUZXN0YWJpbGl0eSIsIlB1YmxpY1Rlc3RhYmlsaXR5LmNvbnN0cnVjdG9yIiwiUHVibGljVGVzdGFiaWxpdHkuaXNTdGFibGUiLCJQdWJsaWNUZXN0YWJpbGl0eS53aGVuU3RhYmxlIiwiUHVibGljVGVzdGFiaWxpdHkuZmluZEJpbmRpbmdzIiwiUHVibGljVGVzdGFiaWxpdHkuZmluZFByb3ZpZGVycyIsIkJyb3dzZXJHZXRUZXN0YWJpbGl0eSIsIkJyb3dzZXJHZXRUZXN0YWJpbGl0eS5jb25zdHJ1Y3RvciIsIkJyb3dzZXJHZXRUZXN0YWJpbGl0eS5pbml0IiwiQnJvd3NlckdldFRlc3RhYmlsaXR5LmFkZFRvV2luZG93IiwiQnJvd3NlckdldFRlc3RhYmlsaXR5LmZpbmRUZXN0YWJpbGl0eUluVHJlZSIsInd0ZkluaXQiLCJUaXRsZSIsIlRpdGxlLmNvbnN0cnVjdG9yIiwiVGl0bGUuZ2V0VGl0bGUiLCJUaXRsZS5zZXRUaXRsZSIsIkJ5IiwiQnkuY29uc3RydWN0b3IiLCJCeS5hbGwiLCJCeS5jc3MiLCJCeS5kaXJlY3RpdmUiLCJfc2V0RWxlbWVudElkIiwiX2dldEVsZW1lbnRJZCIsImluc3BlY3ROYXRpdmVFbGVtZW50IiwiRGVidWdFbGVtZW50Vmlld0xpc3RlbmVyIiwiRGVidWdFbGVtZW50Vmlld0xpc3RlbmVyLmNvbnN0cnVjdG9yIiwiRGVidWdFbGVtZW50Vmlld0xpc3RlbmVyLm9uVmlld0NyZWF0ZWQiLCJEZWJ1Z0VsZW1lbnRWaWV3TGlzdGVuZXIub25WaWV3RGVzdHJveWVkIiwiZW5hYmxlRGVidWdUb29scyIsImRpc2FibGVEZWJ1Z1Rvb2xzIiwiQW5ndWxhclRvb2xzIiwiQW5ndWxhclRvb2xzLmNvbnN0cnVjdG9yIiwiQW5ndWxhclByb2ZpbGVyIiwiQW5ndWxhclByb2ZpbGVyLmNvbnN0cnVjdG9yIiwiQW5ndWxhclByb2ZpbGVyLnRpbWVDaGFuZ2VEZXRlY3Rpb24iLCJodHRwUmVxdWVzdCIsIm1lcmdlT3B0aW9ucyIsIkh0dHAiLCJIdHRwLmNvbnN0cnVjdG9yIiwiSHR0cC5yZXF1ZXN0IiwiSHR0cC5nZXQiLCJIdHRwLnBvc3QiLCJIdHRwLnB1dCIsIkh0dHAuZGVsZXRlIiwiSHR0cC5wYXRjaCIsIkh0dHAuaGVhZCIsIkpzb25wIiwiSnNvbnAuY29uc3RydWN0b3IiLCJKc29ucC5yZXF1ZXN0IiwiQ29ubmVjdGlvbkJhY2tlbmQiLCJDb25uZWN0aW9uQmFja2VuZC5jb25zdHJ1Y3RvciIsIkNvbm5lY3Rpb24iLCJDb25uZWN0aW9uLmNvbnN0cnVjdG9yIiwiUmVxdWVzdCIsIlJlcXVlc3QuY29uc3RydWN0b3IiLCJSZXF1ZXN0LnRleHQiLCJIZWFkZXJzIiwiSGVhZGVycy5jb25zdHJ1Y3RvciIsIkhlYWRlcnMuZnJvbVJlc3BvbnNlSGVhZGVyU3RyaW5nIiwiSGVhZGVycy5hcHBlbmQiLCJIZWFkZXJzLmRlbGV0ZSIsIkhlYWRlcnMuZm9yRWFjaCIsIkhlYWRlcnMuZ2V0IiwiSGVhZGVycy5oYXMiLCJIZWFkZXJzLmtleXMiLCJIZWFkZXJzLnNldCIsIkhlYWRlcnMudmFsdWVzIiwiSGVhZGVycy50b0pTT04iLCJIZWFkZXJzLmdldEFsbCIsIkhlYWRlcnMuZW50cmllcyIsIm5vcm1hbGl6ZU1ldGhvZE5hbWUiLCJnZXRSZXNwb25zZVVSTCIsIlJlcXVlc3RNZXRob2QiLCJSZWFkeVN0YXRlIiwiUmVzcG9uc2VUeXBlIiwiUmVxdWVzdE9wdGlvbnMiLCJSZXF1ZXN0T3B0aW9ucy5jb25zdHJ1Y3RvciIsIlJlcXVlc3RPcHRpb25zLm1lcmdlIiwiQmFzZVJlcXVlc3RPcHRpb25zIiwiQmFzZVJlcXVlc3RPcHRpb25zLmNvbnN0cnVjdG9yIiwicGFyYW1QYXJzZXIiLCJVUkxTZWFyY2hQYXJhbXMiLCJVUkxTZWFyY2hQYXJhbXMuY29uc3RydWN0b3IiLCJVUkxTZWFyY2hQYXJhbXMuY2xvbmUiLCJVUkxTZWFyY2hQYXJhbXMuaGFzIiwiVVJMU2VhcmNoUGFyYW1zLmdldCIsIlVSTFNlYXJjaFBhcmFtcy5nZXRBbGwiLCJVUkxTZWFyY2hQYXJhbXMuc2V0IiwiVVJMU2VhcmNoUGFyYW1zLnNldEFsbCIsIlVSTFNlYXJjaFBhcmFtcy5hcHBlbmQiLCJVUkxTZWFyY2hQYXJhbXMuYXBwZW5kQWxsIiwiVVJMU2VhcmNoUGFyYW1zLnJlcGxhY2VBbGwiLCJVUkxTZWFyY2hQYXJhbXMudG9TdHJpbmciLCJVUkxTZWFyY2hQYXJhbXMuZGVsZXRlIiwiWEhSQ29ubmVjdGlvbiIsIlhIUkNvbm5lY3Rpb24uY29uc3RydWN0b3IiLCJYSFJCYWNrZW5kIiwiWEhSQmFja2VuZC5jb25zdHJ1Y3RvciIsIlhIUkJhY2tlbmQuY3JlYXRlQ29ubmVjdGlvbiIsIlJlc3BvbnNlIiwiUmVzcG9uc2UuY29uc3RydWN0b3IiLCJSZXNwb25zZS5ibG9iIiwiUmVzcG9uc2UuanNvbiIsIlJlc3BvbnNlLnRleHQiLCJSZXNwb25zZS5hcnJheUJ1ZmZlciIsIlJlc3BvbnNlT3B0aW9ucyIsIlJlc3BvbnNlT3B0aW9ucy5jb25zdHJ1Y3RvciIsIlJlc3BvbnNlT3B0aW9ucy5tZXJnZSIsIkJhc2VSZXNwb25zZU9wdGlvbnMiLCJCYXNlUmVzcG9uc2VPcHRpb25zLmNvbnN0cnVjdG9yIiwiQnJvd3NlclhociIsIkJyb3dzZXJYaHIuY29uc3RydWN0b3IiLCJCcm93c2VyWGhyLmJ1aWxkIiwiSlNPTlBDb25uZWN0aW9uIiwiSlNPTlBDb25uZWN0aW9uLmNvbnN0cnVjdG9yIiwiSlNPTlBDb25uZWN0aW9uXyIsIkpTT05QQ29ubmVjdGlvbl8uY29uc3RydWN0b3IiLCJKU09OUENvbm5lY3Rpb25fLmZpbmlzaGVkIiwiSlNPTlBCYWNrZW5kIiwiSlNPTlBCYWNrZW5kLmNvbnN0cnVjdG9yIiwiSlNPTlBCYWNrZW5kXyIsIkpTT05QQmFja2VuZF8uY29uc3RydWN0b3IiLCJKU09OUEJhY2tlbmRfLmNyZWF0ZUNvbm5lY3Rpb24iLCJfZ2V0SnNvbnBDb25uZWN0aW9ucyIsIkJyb3dzZXJKc29ucCIsIkJyb3dzZXJKc29ucC5jb25zdHJ1Y3RvciIsIkJyb3dzZXJKc29ucC5idWlsZCIsIkJyb3dzZXJKc29ucC5uZXh0UmVxdWVzdElEIiwiQnJvd3Nlckpzb25wLnJlcXVlc3RDYWxsYmFjayIsIkJyb3dzZXJKc29ucC5leHBvc2VDb25uZWN0aW9uIiwiQnJvd3Nlckpzb25wLnJlbW92ZUNvbm5lY3Rpb24iLCJCcm93c2VySnNvbnAuc2VuZCIsIkJyb3dzZXJKc29ucC5jbGVhbnVwIiwicm91dGVyRmFjdG9yeSIsInJvdXRlclByaW1hcnlDb21wb25lbnRGYWN0b3J5IiwiUm91dGVyIiwiUm91dGVyLmNvbnN0cnVjdG9yIiwiUm91dGVyLmNoaWxkUm91dGVyIiwiUm91dGVyLmF1eFJvdXRlciIsIlJvdXRlci5yZWdpc3RlclByaW1hcnlPdXRsZXQiLCJSb3V0ZXIucmVnaXN0ZXJBdXhPdXRsZXQiLCJSb3V0ZXIuaXNSb3V0ZUFjdGl2ZSIsIlJvdXRlci5jb25maWciLCJSb3V0ZXIubmF2aWdhdGUiLCJSb3V0ZXIubmF2aWdhdGVCeVVybCIsIlJvdXRlci5uYXZpZ2F0ZUJ5SW5zdHJ1Y3Rpb24iLCJSb3V0ZXIuX25hdmlnYXRlIiwiUm91dGVyLl9zZXR0bGVJbnN0cnVjdGlvbiIsIlJvdXRlci5fZW1pdE5hdmlnYXRpb25GaW5pc2giLCJSb3V0ZXIuX2FmdGVyUHJvbWlzZUZpbmlzaE5hdmlnYXRpbmciLCJSb3V0ZXIuX3JvdXRlckNhblJldXNlIiwiUm91dGVyLl9jYW5BY3RpdmF0ZSIsIlJvdXRlci5fcm91dGVyQ2FuRGVhY3RpdmF0ZSIsIlJvdXRlci5jb21taXQiLCJSb3V0ZXIuX3N0YXJ0TmF2aWdhdGluZyIsIlJvdXRlci5fZmluaXNoTmF2aWdhdGluZyIsIlJvdXRlci5zdWJzY3JpYmUiLCJSb3V0ZXIuZGVhY3RpdmF0ZSIsIlJvdXRlci5yZWNvZ25pemUiLCJSb3V0ZXIuX2dldEFuY2VzdG9ySW5zdHJ1Y3Rpb25zIiwiUm91dGVyLnJlbmF2aWdhdGUiLCJSb3V0ZXIuZ2VuZXJhdGUiLCJSb290Um91dGVyIiwiUm9vdFJvdXRlci5jb25zdHJ1Y3RvciIsIlJvb3RSb3V0ZXIuY29tbWl0IiwiUm9vdFJvdXRlci5kaXNwb3NlIiwiQ2hpbGRSb3V0ZXIiLCJDaGlsZFJvdXRlci5jb25zdHJ1Y3RvciIsIkNoaWxkUm91dGVyLm5hdmlnYXRlQnlVcmwiLCJDaGlsZFJvdXRlci5uYXZpZ2F0ZUJ5SW5zdHJ1Y3Rpb24iLCJjYW5BY3RpdmF0ZU9uZSIsIlJvdXRlUmVnaXN0cnkiLCJSb3V0ZVJlZ2lzdHJ5LmNvbnN0cnVjdG9yIiwiUm91dGVSZWdpc3RyeS5jb25maWciLCJSb3V0ZVJlZ2lzdHJ5LmNvbmZpZ0Zyb21Db21wb25lbnQiLCJSb3V0ZVJlZ2lzdHJ5LnJlY29nbml6ZSIsIlJvdXRlUmVnaXN0cnkuX3JlY29nbml6ZSIsIlJvdXRlUmVnaXN0cnkuX2F1eFJvdXRlc1RvVW5yZXNvbHZlZCIsIlJvdXRlUmVnaXN0cnkuZ2VuZXJhdGUiLCJSb3V0ZVJlZ2lzdHJ5Ll9nZW5lcmF0ZSIsIlJvdXRlUmVnaXN0cnkuaGFzUm91dGUiLCJSb3V0ZVJlZ2lzdHJ5LmdlbmVyYXRlRGVmYXVsdCIsInNwbGl0QW5kRmxhdHRlbkxpbmtQYXJhbXMiLCJtb3N0U3BlY2lmaWMiLCJhc3NlcnRUZXJtaW5hbENvbXBvbmVudCIsIlJvdXRlQ29uZmlnIiwiUm91dGVDb25maWcuY29uc3RydWN0b3IiLCJSb3V0ZSIsIlJvdXRlLmNvbnN0cnVjdG9yIiwiQXV4Um91dGUiLCJBdXhSb3V0ZS5jb25zdHJ1Y3RvciIsIkFzeW5jUm91dGUiLCJBc3luY1JvdXRlLmNvbnN0cnVjdG9yIiwiUmVkaXJlY3QiLCJSZWRpcmVjdC5jb25zdHJ1Y3RvciIsIlJvdXRlTWF0Y2giLCJSb3V0ZU1hdGNoLmNvbnN0cnVjdG9yIiwiUGF0aE1hdGNoIiwiUGF0aE1hdGNoLmNvbnN0cnVjdG9yIiwiUmVkaXJlY3RNYXRjaCIsIlJlZGlyZWN0TWF0Y2guY29uc3RydWN0b3IiLCJSZWRpcmVjdFJlY29nbml6ZXIiLCJSZWRpcmVjdFJlY29nbml6ZXIuY29uc3RydWN0b3IiLCJSZWRpcmVjdFJlY29nbml6ZXIucmVjb2duaXplIiwiUmVkaXJlY3RSZWNvZ25pemVyLmdlbmVyYXRlIiwiUm91dGVSZWNvZ25pemVyIiwiUm91dGVSZWNvZ25pemVyLmNvbnN0cnVjdG9yIiwiUm91dGVSZWNvZ25pemVyLnJlY29nbml6ZSIsIlJvdXRlUmVjb2duaXplci5nZW5lcmF0ZSIsIlJvdXRlUmVjb2duaXplci5nZW5lcmF0ZUNvbXBvbmVudFBhdGhWYWx1ZXMiLCJSb3V0ZVJlY29nbml6ZXIuX2dldEluc3RydWN0aW9uIiwiUm91dGVQYXJhbXMiLCJSb3V0ZVBhcmFtcy5jb25zdHJ1Y3RvciIsIlJvdXRlUGFyYW1zLmdldCIsIlJvdXRlRGF0YSIsIlJvdXRlRGF0YS5jb25zdHJ1Y3RvciIsIlJvdXRlRGF0YS5nZXQiLCJJbnN0cnVjdGlvbiIsIkluc3RydWN0aW9uLmNvbnN0cnVjdG9yIiwiSW5zdHJ1Y3Rpb24udXJsUGF0aCIsIkluc3RydWN0aW9uLnVybFBhcmFtcyIsIkluc3RydWN0aW9uLnNwZWNpZmljaXR5IiwiSW5zdHJ1Y3Rpb24udG9Sb290VXJsIiwiSW5zdHJ1Y3Rpb24uX3RvTm9uUm9vdFVybCIsIkluc3RydWN0aW9uLnRvVXJsUXVlcnkiLCJJbnN0cnVjdGlvbi5yZXBsYWNlQ2hpbGQiLCJJbnN0cnVjdGlvbi50b1VybFBhdGgiLCJJbnN0cnVjdGlvbi50b0xpbmtVcmwiLCJJbnN0cnVjdGlvbi5fdG9MaW5rVXJsIiwiSW5zdHJ1Y3Rpb24uX3N0cmluZ2lmeVBhdGhNYXRyaXhBdXhQcmVmaXhlZCIsIkluc3RydWN0aW9uLl9zdHJpbmdpZnlNYXRyaXhQYXJhbXMiLCJJbnN0cnVjdGlvbi5fc3RyaW5naWZ5UGF0aE1hdHJpeEF1eCIsIkluc3RydWN0aW9uLl9zdHJpbmdpZnlBdXgiLCJSZXNvbHZlZEluc3RydWN0aW9uIiwiUmVzb2x2ZWRJbnN0cnVjdGlvbi5jb25zdHJ1Y3RvciIsIlJlc29sdmVkSW5zdHJ1Y3Rpb24ucmVzb2x2ZUNvbXBvbmVudCIsIkRlZmF1bHRJbnN0cnVjdGlvbiIsIkRlZmF1bHRJbnN0cnVjdGlvbi5jb25zdHJ1Y3RvciIsIkRlZmF1bHRJbnN0cnVjdGlvbi5yZXNvbHZlQ29tcG9uZW50IiwiRGVmYXVsdEluc3RydWN0aW9uLnRvTGlua1VybCIsIkRlZmF1bHRJbnN0cnVjdGlvbi5fdG9MaW5rVXJsIiwiVW5yZXNvbHZlZEluc3RydWN0aW9uIiwiVW5yZXNvbHZlZEluc3RydWN0aW9uLmNvbnN0cnVjdG9yIiwiVW5yZXNvbHZlZEluc3RydWN0aW9uLnVybFBhdGgiLCJVbnJlc29sdmVkSW5zdHJ1Y3Rpb24udXJsUGFyYW1zIiwiVW5yZXNvbHZlZEluc3RydWN0aW9uLnJlc29sdmVDb21wb25lbnQiLCJSZWRpcmVjdEluc3RydWN0aW9uIiwiUmVkaXJlY3RJbnN0cnVjdGlvbi5jb25zdHJ1Y3RvciIsIkNvbXBvbmVudEluc3RydWN0aW9uIiwiQ29tcG9uZW50SW5zdHJ1Y3Rpb24uY29uc3RydWN0b3IiLCJUb3VjaE1hcCIsIlRvdWNoTWFwLmNvbnN0cnVjdG9yIiwiVG91Y2hNYXAuZ2V0IiwiVG91Y2hNYXAuZ2V0VW51c2VkIiwibm9ybWFsaXplU3RyaW5nIiwiQ29udGludWF0aW9uU2VnbWVudCIsIkNvbnRpbnVhdGlvblNlZ21lbnQuY29uc3RydWN0b3IiLCJDb250aW51YXRpb25TZWdtZW50LmdlbmVyYXRlIiwiQ29udGludWF0aW9uU2VnbWVudC5tYXRjaCIsIlN0YXRpY1NlZ21lbnQiLCJTdGF0aWNTZWdtZW50LmNvbnN0cnVjdG9yIiwiU3RhdGljU2VnbWVudC5tYXRjaCIsIlN0YXRpY1NlZ21lbnQuZ2VuZXJhdGUiLCJEeW5hbWljU2VnbWVudCIsIkR5bmFtaWNTZWdtZW50LmNvbnN0cnVjdG9yIiwiRHluYW1pY1NlZ21lbnQubWF0Y2giLCJEeW5hbWljU2VnbWVudC5nZW5lcmF0ZSIsIlN0YXJTZWdtZW50IiwiU3RhclNlZ21lbnQuY29uc3RydWN0b3IiLCJTdGFyU2VnbWVudC5tYXRjaCIsIlN0YXJTZWdtZW50LmdlbmVyYXRlIiwicGFyc2VQYXRoU3RyaW5nIiwicGF0aERzbEhhc2giLCJzcGxpdEJ5U2xhc2giLCJhc3NlcnRQYXRoIiwiUGF0aFJlY29nbml6ZXIiLCJQYXRoUmVjb2duaXplci5jb25zdHJ1Y3RvciIsIlBhdGhSZWNvZ25pemVyLnJlY29nbml6ZSIsIlBhdGhSZWNvZ25pemVyLmdlbmVyYXRlIiwiVXJsIiwiVXJsLmNvbnN0cnVjdG9yIiwiVXJsLnRvU3RyaW5nIiwiVXJsLnNlZ21lbnRUb1N0cmluZyIsIlVybC5fYXV4VG9TdHJpbmciLCJVcmwuX21hdHJpeFBhcmFtc1RvU3RyaW5nIiwiVXJsLl9jaGlsZFN0cmluZyIsIlJvb3RVcmwiLCJSb290VXJsLmNvbnN0cnVjdG9yIiwiUm9vdFVybC50b1N0cmluZyIsIlJvb3RVcmwuc2VnbWVudFRvU3RyaW5nIiwiUm9vdFVybC5fcXVlcnlQYXJhbXNUb1N0cmluZyIsInBhdGhTZWdtZW50c1RvVXJsIiwibWF0Y2hVcmxTZWdtZW50IiwiVXJsUGFyc2VyIiwiVXJsUGFyc2VyLmNvbnN0cnVjdG9yIiwiVXJsUGFyc2VyLnBlZWtTdGFydHNXaXRoIiwiVXJsUGFyc2VyLmNhcHR1cmUiLCJVcmxQYXJzZXIucGFyc2UiLCJVcmxQYXJzZXIucGFyc2VSb290IiwiVXJsUGFyc2VyLnBhcnNlU2VnbWVudCIsIlVybFBhcnNlci5wYXJzZVF1ZXJ5UGFyYW1zIiwiVXJsUGFyc2VyLnBhcnNlTWF0cml4UGFyYW1zIiwiVXJsUGFyc2VyLnBhcnNlUGFyYW0iLCJVcmxQYXJzZXIucGFyc2VBdXhpbGlhcnlSb3V0ZXMiLCJzZXJpYWxpemVQYXJhbXMiLCJDb21wb25lbnRSZWNvZ25pemVyIiwiQ29tcG9uZW50UmVjb2duaXplci5jb25zdHJ1Y3RvciIsIkNvbXBvbmVudFJlY29nbml6ZXIuY29uZmlnIiwiQ29tcG9uZW50UmVjb2duaXplci5fYXNzZXJ0Tm9IYXNoQ29sbGlzaW9uIiwiQ29tcG9uZW50UmVjb2duaXplci5yZWNvZ25pemUiLCJDb21wb25lbnRSZWNvZ25pemVyLnJlY29nbml6ZUF1eGlsaWFyeSIsIkNvbXBvbmVudFJlY29nbml6ZXIuaGFzUm91dGUiLCJDb21wb25lbnRSZWNvZ25pemVyLmNvbXBvbmVudExvYWRlZCIsIkNvbXBvbmVudFJlY29nbml6ZXIubG9hZENvbXBvbmVudCIsIkNvbXBvbmVudFJlY29nbml6ZXIuZ2VuZXJhdGUiLCJDb21wb25lbnRSZWNvZ25pemVyLmdlbmVyYXRlQXV4aWxpYXJ5IiwiQXN5bmNSb3V0ZUhhbmRsZXIiLCJBc3luY1JvdXRlSGFuZGxlci5jb25zdHJ1Y3RvciIsIkFzeW5jUm91dGVIYW5kbGVyLnJlc29sdmVDb21wb25lbnRUeXBlIiwiU3luY1JvdXRlSGFuZGxlciIsIlN5bmNSb3V0ZUhhbmRsZXIuY29uc3RydWN0b3IiLCJTeW5jUm91dGVIYW5kbGVyLnJlc29sdmVDb21wb25lbnRUeXBlIiwibm9ybWFsaXplUm91dGVDb25maWciLCJ3cmFwTG9hZGVyVG9SZWNvbmZpZ3VyZVJlZ2lzdHJ5IiwiYXNzZXJ0Q29tcG9uZW50RXhpc3RzIiwiTG9jYXRpb24iLCJMb2NhdGlvbi5jb25zdHJ1Y3RvciIsIkxvY2F0aW9uLnBhdGgiLCJMb2NhdGlvbi5ub3JtYWxpemUiLCJMb2NhdGlvbi5wcmVwYXJlRXh0ZXJuYWxVcmwiLCJMb2NhdGlvbi5nbyIsIkxvY2F0aW9uLnJlcGxhY2VTdGF0ZSIsIkxvY2F0aW9uLmZvcndhcmQiLCJMb2NhdGlvbi5iYWNrIiwiTG9jYXRpb24uc3Vic2NyaWJlIiwiX3N0cmlwQmFzZUhyZWYiLCJzdHJpcEluZGV4SHRtbCIsInN0cmlwVHJhaWxpbmdTbGFzaCIsIkxvY2F0aW9uU3RyYXRlZ3kiLCJMb2NhdGlvblN0cmF0ZWd5LmNvbnN0cnVjdG9yIiwibm9ybWFsaXplUXVlcnlQYXJhbXMiLCJqb2luV2l0aFNsYXNoIiwiZ2V0Q2FuQWN0aXZhdGVIb29rIiwiUm91dGVMaWZlY3ljbGVIb29rIiwiUm91dGVMaWZlY3ljbGVIb29rLmNvbnN0cnVjdG9yIiwiQ2FuQWN0aXZhdGUiLCJDYW5BY3RpdmF0ZS5jb25zdHJ1Y3RvciIsIlJvdXRlck91dGxldCIsIlJvdXRlck91dGxldC5jb25zdHJ1Y3RvciIsIlJvdXRlck91dGxldC5hY3RpdmF0ZSIsIlJvdXRlck91dGxldC5yZXVzZSIsIlJvdXRlck91dGxldC5kZWFjdGl2YXRlIiwiUm91dGVyT3V0bGV0LnJvdXRlckNhbkRlYWN0aXZhdGUiLCJSb3V0ZXJPdXRsZXQucm91dGVyQ2FuUmV1c2UiLCJSb3V0ZXJMaW5rIiwiUm91dGVyTGluay5jb25zdHJ1Y3RvciIsIlJvdXRlckxpbmsuaXNSb3V0ZUFjdGl2ZSIsIlJvdXRlckxpbmsucm91dGVQYXJhbXMiLCJSb3V0ZXJMaW5rLm9uQ2xpY2siLCJQbGF0Zm9ybUxvY2F0aW9uIiwiUGxhdGZvcm1Mb2NhdGlvbi5jb25zdHJ1Y3RvciIsIlBsYXRmb3JtTG9jYXRpb24uX2luaXQiLCJQbGF0Zm9ybUxvY2F0aW9uLmdldEJhc2VIcmVmRnJvbURPTSIsIlBsYXRmb3JtTG9jYXRpb24ub25Qb3BTdGF0ZSIsIlBsYXRmb3JtTG9jYXRpb24ub25IYXNoQ2hhbmdlIiwiUGxhdGZvcm1Mb2NhdGlvbi5wYXRobmFtZSIsIlBsYXRmb3JtTG9jYXRpb24uc2VhcmNoIiwiUGxhdGZvcm1Mb2NhdGlvbi5oYXNoIiwiUGxhdGZvcm1Mb2NhdGlvbi5wdXNoU3RhdGUiLCJQbGF0Zm9ybUxvY2F0aW9uLnJlcGxhY2VTdGF0ZSIsIlBsYXRmb3JtTG9jYXRpb24uZm9yd2FyZCIsIlBsYXRmb3JtTG9jYXRpb24uYmFjayIsIkhhc2hMb2NhdGlvblN0cmF0ZWd5IiwiSGFzaExvY2F0aW9uU3RyYXRlZ3kuY29uc3RydWN0b3IiLCJIYXNoTG9jYXRpb25TdHJhdGVneS5vblBvcFN0YXRlIiwiSGFzaExvY2F0aW9uU3RyYXRlZ3kuZ2V0QmFzZUhyZWYiLCJIYXNoTG9jYXRpb25TdHJhdGVneS5wYXRoIiwiSGFzaExvY2F0aW9uU3RyYXRlZ3kucHJlcGFyZUV4dGVybmFsVXJsIiwiSGFzaExvY2F0aW9uU3RyYXRlZ3kucHVzaFN0YXRlIiwiSGFzaExvY2F0aW9uU3RyYXRlZ3kucmVwbGFjZVN0YXRlIiwiSGFzaExvY2F0aW9uU3RyYXRlZ3kuZm9yd2FyZCIsIkhhc2hMb2NhdGlvblN0cmF0ZWd5LmJhY2siLCJQYXRoTG9jYXRpb25TdHJhdGVneSIsIlBhdGhMb2NhdGlvblN0cmF0ZWd5LmNvbnN0cnVjdG9yIiwiUGF0aExvY2F0aW9uU3RyYXRlZ3kub25Qb3BTdGF0ZSIsIlBhdGhMb2NhdGlvblN0cmF0ZWd5LmdldEJhc2VIcmVmIiwiUGF0aExvY2F0aW9uU3RyYXRlZ3kucHJlcGFyZUV4dGVybmFsVXJsIiwiUGF0aExvY2F0aW9uU3RyYXRlZ3kucGF0aCIsIlBhdGhMb2NhdGlvblN0cmF0ZWd5LnB1c2hTdGF0ZSIsIlBhdGhMb2NhdGlvblN0cmF0ZWd5LnJlcGxhY2VTdGF0ZSIsIlBhdGhMb2NhdGlvblN0cmF0ZWd5LmZvcndhcmQiLCJQYXRoTG9jYXRpb25TdHJhdGVneS5iYWNrIiwiRml4ZWRQYXJ0IiwiRml4ZWRQYXJ0LmNvbnN0cnVjdG9yIiwiQXV4aWxpYXJ5U3RhcnQiLCJBdXhpbGlhcnlTdGFydC5jb25zdHJ1Y3RvciIsIkF1eGlsaWFyeUVuZCIsIkF1eGlsaWFyeUVuZC5jb25zdHJ1Y3RvciIsIlBhcmFtcyIsIlBhcmFtcy5jb25zdHJ1Y3RvciIsIlJvdXRlckxpbmtMZXhlciIsIlJvdXRlckxpbmtMZXhlci5jb25zdHJ1Y3RvciIsIlJvdXRlckxpbmtMZXhlci50b2tlbml6ZSIsIlJvdXRlckxpbmtMZXhlci5fcGFyc2VUb2tlbiIsIlJvdXRlckxpbmtMZXhlci5fcGFyc2VQYXJhbXMiLCJSb3V0ZXJMaW5rTGV4ZXIuX3BhcnNlRml4ZWRQYXJ0IiwiUm91dGVyTGlua0FzdEdlbmVyYXRvciIsIlJvdXRlckxpbmtBc3RHZW5lcmF0b3IuY29uc3RydWN0b3IiLCJSb3V0ZXJMaW5rQXN0R2VuZXJhdG9yLmdlbmVyYXRlIiwiUm91dGVyTGlua0FzdEdlbmVyYXRvci5fZ2VuQXV4aWxpYXJ5IiwiUm91dGVyTGlua0FzdFRyYW5zZm9ybWVyIiwiUm91dGVyTGlua0FzdFRyYW5zZm9ybWVyLmNvbnN0cnVjdG9yIiwiUm91dGVyTGlua0FzdFRyYW5zZm9ybWVyLnZpc2l0UXVvdGUiLCJwYXJzZVJvdXRlckxpbmtFeHByZXNzaW9uIiwiUm91dGVyTGlua1RyYW5zZm9ybSIsIlJvdXRlckxpbmtUcmFuc2Zvcm0uY29uc3RydWN0b3IiLCJSb3V0ZXJMaW5rVHJhbnNmb3JtLnZpc2l0TmdDb250ZW50IiwiUm91dGVyTGlua1RyYW5zZm9ybS52aXNpdEVtYmVkZGVkVGVtcGxhdGUiLCJSb3V0ZXJMaW5rVHJhbnNmb3JtLnZpc2l0RWxlbWVudCIsIlJvdXRlckxpbmtUcmFuc2Zvcm0udmlzaXRWYXJpYWJsZSIsIlJvdXRlckxpbmtUcmFuc2Zvcm0udmlzaXRFdmVudCIsIlJvdXRlckxpbmtUcmFuc2Zvcm0udmlzaXRFbGVtZW50UHJvcGVydHkiLCJSb3V0ZXJMaW5rVHJhbnNmb3JtLnZpc2l0QXR0ciIsIlJvdXRlckxpbmtUcmFuc2Zvcm0udmlzaXRCb3VuZFRleHQiLCJSb3V0ZXJMaW5rVHJhbnNmb3JtLnZpc2l0VGV4dCIsIlJvdXRlckxpbmtUcmFuc2Zvcm0udmlzaXREaXJlY3RpdmUiLCJSb3V0ZXJMaW5rVHJhbnNmb3JtLnZpc2l0RGlyZWN0aXZlUHJvcGVydHkiLCJVcGdyYWRlQWRhcHRlciIsIlVwZ3JhZGVBZGFwdGVyLmNvbnN0cnVjdG9yIiwiVXBncmFkZUFkYXB0ZXIuZG93bmdyYWRlTmcyQ29tcG9uZW50IiwiVXBncmFkZUFkYXB0ZXIudXBncmFkZU5nMUNvbXBvbmVudCIsIlVwZ3JhZGVBZGFwdGVyLmJvb3RzdHJhcCIsIlVwZ3JhZGVBZGFwdGVyLmFkZFByb3ZpZGVyIiwiVXBncmFkZUFkYXB0ZXIudXBncmFkZU5nMVByb3ZpZGVyIiwiVXBncmFkZUFkYXB0ZXIuZG93bmdyYWRlTmcyUHJvdmlkZXIiLCJVcGdyYWRlQWRhcHRlci5jb21waWxlTmcyQ29tcG9uZW50cyIsIm5nMUNvbXBvbmVudERpcmVjdGl2ZSIsIm5nMUNvbXBvbmVudERpcmVjdGl2ZS5kaXJlY3RpdmVGYWN0b3J5IiwiVXBncmFkZUFkYXB0ZXJSZWYiLCJVcGdyYWRlQWRhcHRlclJlZi5jb25zdHJ1Y3RvciIsIlVwZ3JhZGVBZGFwdGVyUmVmLl9ib290c3RyYXBEb25lIiwiVXBncmFkZUFkYXB0ZXJSZWYucmVhZHkiLCJVcGdyYWRlQWRhcHRlclJlZi5kaXNwb3NlIiwiZ2V0Q29tcG9uZW50SW5mbyIsInBhcnNlRmllbGRzIiwib25FcnJvciIsImNvbnRyb2xsZXJLZXkiLCJEb3duZ3JhZGVOZzJDb21wb25lbnRBZGFwdGVyIiwiRG93bmdyYWRlTmcyQ29tcG9uZW50QWRhcHRlci5jb25zdHJ1Y3RvciIsIkRvd25ncmFkZU5nMkNvbXBvbmVudEFkYXB0ZXIuYm9vdHN0cmFwTmcyIiwiRG93bmdyYWRlTmcyQ29tcG9uZW50QWRhcHRlci5zZXR1cElucHV0cyIsIkRvd25ncmFkZU5nMkNvbXBvbmVudEFkYXB0ZXIucHJvamVjdENvbnRlbnQiLCJEb3duZ3JhZGVOZzJDb21wb25lbnRBZGFwdGVyLnNldHVwT3V0cHV0cyIsIkRvd25ncmFkZU5nMkNvbXBvbmVudEFkYXB0ZXIucmVnaXN0ZXJDbGVhbnVwIiwiTmcxQ2hhbmdlIiwiTmcxQ2hhbmdlLmNvbnN0cnVjdG9yIiwiTmcxQ2hhbmdlLmlzRmlyc3RDaGFuZ2UiLCJVcGdyYWRlTmcxQ29tcG9uZW50QWRhcHRlckJ1aWxkZXIiLCJVcGdyYWRlTmcxQ29tcG9uZW50QWRhcHRlckJ1aWxkZXIuY29uc3RydWN0b3IiLCJVcGdyYWRlTmcxQ29tcG9uZW50QWRhcHRlckJ1aWxkZXIuZXh0cmFjdERpcmVjdGl2ZSIsIlVwZ3JhZGVOZzFDb21wb25lbnRBZGFwdGVyQnVpbGRlci5ub3RTdXBwb3J0ZWQiLCJVcGdyYWRlTmcxQ29tcG9uZW50QWRhcHRlckJ1aWxkZXIuZXh0cmFjdEJpbmRpbmdzIiwiVXBncmFkZU5nMUNvbXBvbmVudEFkYXB0ZXJCdWlsZGVyLmNvbXBpbGVUZW1wbGF0ZSIsIlVwZ3JhZGVOZzFDb21wb25lbnRBZGFwdGVyQnVpbGRlci5jb21waWxlVGVtcGxhdGUuY29tcGlsZUh0bWwiLCJVcGdyYWRlTmcxQ29tcG9uZW50QWRhcHRlckJ1aWxkZXIucmVzb2x2ZSIsIlVwZ3JhZGVOZzFDb21wb25lbnRBZGFwdGVyIiwiVXBncmFkZU5nMUNvbXBvbmVudEFkYXB0ZXIuY29uc3RydWN0b3IiLCJVcGdyYWRlTmcxQ29tcG9uZW50QWRhcHRlci5uZ09uQ2hhbmdlcyIsIlVwZ3JhZGVOZzFDb21wb25lbnRBZGFwdGVyLm5nRG9DaGVjayIsIlVwZ3JhZGVOZzFDb21wb25lbnRBZGFwdGVyLnNldENvbXBvbmVudFByb3BlcnR5IiwiVXBncmFkZU5nMUNvbXBvbmVudEFkYXB0ZXIucmVzb2x2ZVJlcXVpcmVkIiwibm9OZyIsImJlZm9yZUVhY2hQcm92aWRlcnMiLCJfaXNQcm9taXNlTGlrZSIsInJ1bkluVGVzdFpvbmUiLCJfaXQiLCJiZWZvcmVFYWNoIiwiaXQiLCJ4aXQiLCJpaXQiLCJmaXQiLCJfZ2V0Um9vdFByb3ZpZGVycyIsIl9nZXRBcHBCaW5kaW5ncyIsIl9ydW50aW1lQ29tcGlsZXJCaW5kaW5ncyIsImNyZWF0ZVRlc3RJbmplY3RvciIsImNyZWF0ZVRlc3RJbmplY3RvcldpdGhSdW50aW1lQ29tcGlsZXIiLCJpbmplY3QiLCJpbmplY3RBc3luYyIsIkZ1bmN0aW9uV2l0aFBhcmFtVG9rZW5zIiwiRnVuY3Rpb25XaXRoUGFyYW1Ub2tlbnMuY29uc3RydWN0b3IiLCJGdW5jdGlvbldpdGhQYXJhbVRva2Vucy5leGVjdXRlIiwiRnVuY3Rpb25XaXRoUGFyYW1Ub2tlbnMuaGFzVG9rZW4iLCJNb2NrQW5pbWF0aW9uQnVpbGRlciIsIk1vY2tBbmltYXRpb25CdWlsZGVyLmNvbnN0cnVjdG9yIiwiTW9ja0FuaW1hdGlvbkJ1aWxkZXIuY3NzIiwiTW9ja0Nzc0FuaW1hdGlvbkJ1aWxkZXIiLCJNb2NrQ3NzQW5pbWF0aW9uQnVpbGRlci5jb25zdHJ1Y3RvciIsIk1vY2tDc3NBbmltYXRpb25CdWlsZGVyLnN0YXJ0IiwiTW9ja0Jyb3dzZXJBYnN0cmFjdGlvbiIsIk1vY2tCcm93c2VyQWJzdHJhY3Rpb24uY29uc3RydWN0b3IiLCJNb2NrQnJvd3NlckFic3RyYWN0aW9uLmRvZXNFbGFwc2VkVGltZUluY2x1ZGVzRGVsYXkiLCJNb2NrQW5pbWF0aW9uIiwiTW9ja0FuaW1hdGlvbi5jb25zdHJ1Y3RvciIsIk1vY2tBbmltYXRpb24ud2FpdCIsIk1vY2tBbmltYXRpb24uZmx1c2giLCJNb2NrRGlyZWN0aXZlUmVzb2x2ZXIiLCJNb2NrRGlyZWN0aXZlUmVzb2x2ZXIuY29uc3RydWN0b3IiLCJNb2NrRGlyZWN0aXZlUmVzb2x2ZXIucmVzb2x2ZSIsIk1vY2tEaXJlY3RpdmVSZXNvbHZlci5zZXRCaW5kaW5nc092ZXJyaWRlIiwiTW9ja0RpcmVjdGl2ZVJlc29sdmVyLnNldFZpZXdCaW5kaW5nc092ZXJyaWRlIiwiTW9ja0RpcmVjdGl2ZVJlc29sdmVyLnNldFByb3ZpZGVyc092ZXJyaWRlIiwiTW9ja0RpcmVjdGl2ZVJlc29sdmVyLnNldFZpZXdQcm92aWRlcnNPdmVycmlkZSIsIk1vY2tWaWV3UmVzb2x2ZXIiLCJNb2NrVmlld1Jlc29sdmVyLmNvbnN0cnVjdG9yIiwiTW9ja1ZpZXdSZXNvbHZlci5zZXRWaWV3IiwiTW9ja1ZpZXdSZXNvbHZlci5zZXRJbmxpbmVUZW1wbGF0ZSIsIk1vY2tWaWV3UmVzb2x2ZXIub3ZlcnJpZGVWaWV3RGlyZWN0aXZlIiwiTW9ja1ZpZXdSZXNvbHZlci5yZXNvbHZlIiwiTW9ja1ZpZXdSZXNvbHZlci5fY2hlY2tPdmVycmlkZWFibGUiLCJNb2NrTG9jYXRpb25TdHJhdGVneSIsIk1vY2tMb2NhdGlvblN0cmF0ZWd5LmNvbnN0cnVjdG9yIiwiTW9ja0xvY2F0aW9uU3RyYXRlZ3kuc2ltdWxhdGVQb3BTdGF0ZSIsIk1vY2tMb2NhdGlvblN0cmF0ZWd5LnBhdGgiLCJNb2NrTG9jYXRpb25TdHJhdGVneS5wcmVwYXJlRXh0ZXJuYWxVcmwiLCJNb2NrTG9jYXRpb25TdHJhdGVneS5wdXNoU3RhdGUiLCJNb2NrTG9jYXRpb25TdHJhdGVneS5yZXBsYWNlU3RhdGUiLCJNb2NrTG9jYXRpb25TdHJhdGVneS5vblBvcFN0YXRlIiwiTW9ja0xvY2F0aW9uU3RyYXRlZ3kuZ2V0QmFzZUhyZWYiLCJNb2NrTG9jYXRpb25TdHJhdGVneS5iYWNrIiwiTW9ja0xvY2F0aW9uU3RyYXRlZ3kuZm9yd2FyZCIsIl9Nb2NrUG9wU3RhdGVFdmVudCIsIl9Nb2NrUG9wU3RhdGVFdmVudC5jb25zdHJ1Y3RvciIsIk1vY2tOZ1pvbmUiLCJNb2NrTmdab25lLmNvbnN0cnVjdG9yIiwiTW9ja05nWm9uZS5vbkV2ZW50RG9uZSIsIk1vY2tOZ1pvbmUucnVuIiwiTW9ja05nWm9uZS5ydW5PdXRzaWRlQW5ndWxhciIsIk1vY2tOZ1pvbmUuc2ltdWxhdGVab25lRXhpdCIsIkNvbXBvbmVudEZpeHR1cmUiLCJDb21wb25lbnRGaXh0dXJlLmNvbnN0cnVjdG9yIiwiQ29tcG9uZW50Rml4dHVyZV8iLCJDb21wb25lbnRGaXh0dXJlXy5jb25zdHJ1Y3RvciIsIkNvbXBvbmVudEZpeHR1cmVfLmRldGVjdENoYW5nZXMiLCJDb21wb25lbnRGaXh0dXJlXy5kZXN0cm95IiwiVGVzdENvbXBvbmVudEJ1aWxkZXIiLCJUZXN0Q29tcG9uZW50QnVpbGRlci5jb25zdHJ1Y3RvciIsIlRlc3RDb21wb25lbnRCdWlsZGVyLl9jbG9uZSIsIlRlc3RDb21wb25lbnRCdWlsZGVyLm92ZXJyaWRlVGVtcGxhdGUiLCJUZXN0Q29tcG9uZW50QnVpbGRlci5vdmVycmlkZVZpZXciLCJUZXN0Q29tcG9uZW50QnVpbGRlci5vdmVycmlkZURpcmVjdGl2ZSIsIlRlc3RDb21wb25lbnRCdWlsZGVyLm92ZXJyaWRlUHJvdmlkZXJzIiwiVGVzdENvbXBvbmVudEJ1aWxkZXIub3ZlcnJpZGVCaW5kaW5ncyIsIlRlc3RDb21wb25lbnRCdWlsZGVyLm92ZXJyaWRlVmlld1Byb3ZpZGVycyIsIlRlc3RDb21wb25lbnRCdWlsZGVyLm92ZXJyaWRlVmlld0JpbmRpbmdzIiwiVGVzdENvbXBvbmVudEJ1aWxkZXIuY3JlYXRlQXN5bmMiLCJMb2ciLCJMb2cuY29uc3RydWN0b3IiLCJMb2cuYWRkIiwiTG9nLmZuIiwiTG9nLmNsZWFyIiwiTG9nLnJlc3VsdCIsIkJyb3dzZXJEZXRlY3Rpb24iLCJCcm93c2VyRGV0ZWN0aW9uLmNvbnN0cnVjdG9yIiwiQnJvd3NlckRldGVjdGlvbi5pc0ZpcmVmb3giLCJCcm93c2VyRGV0ZWN0aW9uLmlzQW5kcm9pZCIsIkJyb3dzZXJEZXRlY3Rpb24uaXNFZGdlIiwiQnJvd3NlckRldGVjdGlvbi5pc0lFIiwiQnJvd3NlckRldGVjdGlvbi5pc1dlYmtpdCIsIkJyb3dzZXJEZXRlY3Rpb24uaXNJT1M3IiwiQnJvd3NlckRldGVjdGlvbi5pc1Nsb3ciLCJCcm93c2VyRGV0ZWN0aW9uLnN1cHBvcnRzSW50bEFwaSIsImRpc3BhdGNoRXZlbnQiLCJlbCIsImNvbnRhaW5zUmVnZXhwIiwibm9ybWFsaXplQ1NTIiwic3RyaW5naWZ5RWxlbWVudCIsIlNlcmlhbGl6ZXIiLCJTZXJpYWxpemVyLmNvbnN0cnVjdG9yIiwiU2VyaWFsaXplci5zZXJpYWxpemUiLCJTZXJpYWxpemVyLmRlc2VyaWFsaXplIiwiU2VyaWFsaXplci5tYXBUb09iamVjdCIsIlNlcmlhbGl6ZXIub2JqZWN0VG9NYXAiLCJTZXJpYWxpemVyLmFsbG9jYXRlUmVuZGVyVmlld3MiLCJTZXJpYWxpemVyLl9zZXJpYWxpemVXb3JrZXJFbGVtZW50UmVmIiwiU2VyaWFsaXplci5fZGVzZXJpYWxpemVXb3JrZXJFbGVtZW50UmVmIiwiU2VyaWFsaXplci5fc2VyaWFsaXplUmVuZGVyVGVtcGxhdGUiLCJTZXJpYWxpemVyLl9kZXNlcmlhbGl6ZVJlbmRlclRlbXBsYXRlIiwic2VyaWFsaXplVGVtcGxhdGVDbWQiLCJkZXNlcmlhbGl6ZVRlbXBsYXRlQ21kIiwiUmVuZGVyVGVtcGxhdGVDbWRTZXJpYWxpemVyIiwiUmVuZGVyVGVtcGxhdGVDbWRTZXJpYWxpemVyLmNvbnN0cnVjdG9yIiwiUmVuZGVyVGVtcGxhdGVDbWRTZXJpYWxpemVyLnZpc2l0VGV4dCIsIlJlbmRlclRlbXBsYXRlQ21kU2VyaWFsaXplci52aXNpdE5nQ29udGVudCIsIlJlbmRlclRlbXBsYXRlQ21kU2VyaWFsaXplci52aXNpdEJlZ2luRWxlbWVudCIsIlJlbmRlclRlbXBsYXRlQ21kU2VyaWFsaXplci52aXNpdEVuZEVsZW1lbnQiLCJSZW5kZXJUZW1wbGF0ZUNtZFNlcmlhbGl6ZXIudmlzaXRCZWdpbkNvbXBvbmVudCIsIlJlbmRlclRlbXBsYXRlQ21kU2VyaWFsaXplci52aXNpdEVuZENvbXBvbmVudCIsIlJlbmRlclRlbXBsYXRlQ21kU2VyaWFsaXplci52aXNpdEVtYmVkZGVkVGVtcGxhdGUiLCJXZWJXb3JrZXJFbGVtZW50UmVmIiwiV2ViV29ya2VyRWxlbWVudFJlZi5jb25zdHJ1Y3RvciIsIldlYldvcmtlclRlbXBsYXRlQ21kIiwiV2ViV29ya2VyVGVtcGxhdGVDbWQuY29uc3RydWN0b3IiLCJXZWJXb3JrZXJUZW1wbGF0ZUNtZC52aXNpdCIsIldlYldvcmtlclRleHRDbWQiLCJXZWJXb3JrZXJUZXh0Q21kLmNvbnN0cnVjdG9yIiwiV2ViV29ya2VyVGV4dENtZC52aXNpdCIsIldlYldvcmtlck5nQ29udGVudENtZCIsIldlYldvcmtlck5nQ29udGVudENtZC5jb25zdHJ1Y3RvciIsIldlYldvcmtlck5nQ29udGVudENtZC52aXNpdCIsIldlYldvcmtlckJlZ2luRWxlbWVudENtZCIsIldlYldvcmtlckJlZ2luRWxlbWVudENtZC5jb25zdHJ1Y3RvciIsIldlYldvcmtlckJlZ2luRWxlbWVudENtZC52aXNpdCIsIldlYldvcmtlckVuZEVsZW1lbnRDbWQiLCJXZWJXb3JrZXJFbmRFbGVtZW50Q21kLmNvbnN0cnVjdG9yIiwiV2ViV29ya2VyRW5kRWxlbWVudENtZC52aXNpdCIsIldlYldvcmtlckJlZ2luQ29tcG9uZW50Q21kIiwiV2ViV29ya2VyQmVnaW5Db21wb25lbnRDbWQuY29uc3RydWN0b3IiLCJXZWJXb3JrZXJCZWdpbkNvbXBvbmVudENtZC52aXNpdCIsIldlYldvcmtlckVuZENvbXBvbmVudENtZCIsIldlYldvcmtlckVuZENvbXBvbmVudENtZC5jb25zdHJ1Y3RvciIsIldlYldvcmtlckVuZENvbXBvbmVudENtZC52aXNpdCIsIldlYldvcmtlckVtYmVkZGVkVGVtcGxhdGVDbWQiLCJXZWJXb3JrZXJFbWJlZGRlZFRlbXBsYXRlQ21kLmNvbnN0cnVjdG9yIiwiV2ViV29ya2VyRW1iZWRkZWRUZW1wbGF0ZUNtZC52aXNpdCIsIlJlbmRlclByb3RvVmlld1JlZlN0b3JlIiwiUmVuZGVyUHJvdG9WaWV3UmVmU3RvcmUuY29uc3RydWN0b3IiLCJSZW5kZXJQcm90b1ZpZXdSZWZTdG9yZS5hbGxvY2F0ZSIsIlJlbmRlclByb3RvVmlld1JlZlN0b3JlLnN0b3JlIiwiUmVuZGVyUHJvdG9WaWV3UmVmU3RvcmUuZGVzZXJpYWxpemUiLCJSZW5kZXJQcm90b1ZpZXdSZWZTdG9yZS5zZXJpYWxpemUiLCJXZWJXb3JrZXJSZW5kZXJQcm90b1ZpZXdSZWYiLCJXZWJXb3JrZXJSZW5kZXJQcm90b1ZpZXdSZWYuY29uc3RydWN0b3IiLCJSZW5kZXJWaWV3V2l0aEZyYWdtZW50c1N0b3JlIiwiUmVuZGVyVmlld1dpdGhGcmFnbWVudHNTdG9yZS5jb25zdHJ1Y3RvciIsIlJlbmRlclZpZXdXaXRoRnJhZ21lbnRzU3RvcmUuYWxsb2NhdGUiLCJSZW5kZXJWaWV3V2l0aEZyYWdtZW50c1N0b3JlLnN0b3JlIiwiUmVuZGVyVmlld1dpdGhGcmFnbWVudHNTdG9yZS5yZW1vdmUiLCJSZW5kZXJWaWV3V2l0aEZyYWdtZW50c1N0b3JlLl9yZW1vdmVSZWYiLCJSZW5kZXJWaWV3V2l0aEZyYWdtZW50c1N0b3JlLnNlcmlhbGl6ZVJlbmRlclZpZXdSZWYiLCJSZW5kZXJWaWV3V2l0aEZyYWdtZW50c1N0b3JlLnNlcmlhbGl6ZVJlbmRlckZyYWdtZW50UmVmIiwiUmVuZGVyVmlld1dpdGhGcmFnbWVudHNTdG9yZS5kZXNlcmlhbGl6ZVJlbmRlclZpZXdSZWYiLCJSZW5kZXJWaWV3V2l0aEZyYWdtZW50c1N0b3JlLmRlc2VyaWFsaXplUmVuZGVyRnJhZ21lbnRSZWYiLCJSZW5kZXJWaWV3V2l0aEZyYWdtZW50c1N0b3JlLl9yZXRyaWV2ZSIsIlJlbmRlclZpZXdXaXRoRnJhZ21lbnRzU3RvcmUuX3NlcmlhbGl6ZVJlbmRlckZyYWdtZW50T3JWaWV3UmVmIiwiUmVuZGVyVmlld1dpdGhGcmFnbWVudHNTdG9yZS5zZXJpYWxpemVWaWV3V2l0aEZyYWdtZW50cyIsIlJlbmRlclZpZXdXaXRoRnJhZ21lbnRzU3RvcmUuZGVzZXJpYWxpemVWaWV3V2l0aEZyYWdtZW50cyIsIldlYldvcmtlclJlbmRlclZpZXdSZWYiLCJXZWJXb3JrZXJSZW5kZXJWaWV3UmVmLmNvbnN0cnVjdG9yIiwiV2ViV29ya2VyUmVuZGVyVmlld1JlZi5zZXJpYWxpemUiLCJXZWJXb3JrZXJSZW5kZXJWaWV3UmVmLmRlc2VyaWFsaXplIiwiV2ViV29ya2VyUmVuZGVyRnJhZ21lbnRSZWYiLCJXZWJXb3JrZXJSZW5kZXJGcmFnbWVudFJlZi5jb25zdHJ1Y3RvciIsIldlYldvcmtlclJlbmRlckZyYWdtZW50UmVmLnNlcmlhbGl6ZSIsIldlYldvcmtlclJlbmRlckZyYWdtZW50UmVmLmRlc2VyaWFsaXplIiwiY29tcGFyZU1hcCIsIm1lc3NhZ2UiLCJidWlsZEVycm9yIiwiZWxlbWVudFRleHQiLCJmYWtlQXN5bmMiLCJjbGVhclBlbmRpbmdUaW1lcnMiLCJ0aWNrIiwiZmx1c2hNaWNyb3Rhc2tzIiwiX3NldFRpbWVvdXQiLCJfY2xlYXJUaW1lb3V0IiwiX3NldEludGVydmFsIiwiX2NsZWFySW50ZXJ2YWwiLCJfZm5BbmRGbHVzaCIsIl9zY2hlZHVsZU1pY3JvdGFzayIsIl9kZXF1ZXVlVGltZXIiLCJfYXNzZXJ0SW5GYWtlQXN5bmNab25lIiwiTW9ja1hIUiIsIk1vY2tYSFIuY29uc3RydWN0b3IiLCJNb2NrWEhSLmdldCIsIk1vY2tYSFIuZXhwZWN0IiwiTW9ja1hIUi53aGVuIiwiTW9ja1hIUi5mbHVzaCIsIk1vY2tYSFIudmVyaWZ5Tm9PdXRzdGFuZGluZ0V4cGVjdGF0aW9ucyIsIk1vY2tYSFIuX3Byb2Nlc3NSZXF1ZXN0IiwiX1BlbmRpbmdSZXF1ZXN0IiwiX1BlbmRpbmdSZXF1ZXN0LmNvbnN0cnVjdG9yIiwiX1BlbmRpbmdSZXF1ZXN0LmNvbXBsZXRlIiwiX1BlbmRpbmdSZXF1ZXN0LmdldFByb21pc2UiLCJfRXhwZWN0YXRpb24iLCJfRXhwZWN0YXRpb24uY29uc3RydWN0b3IiLCJNb2NrQXBwbGljYXRpb25SZWYiLCJNb2NrQXBwbGljYXRpb25SZWYuY29uc3RydWN0b3IiLCJNb2NrQXBwbGljYXRpb25SZWYucmVnaXN0ZXJCb290c3RyYXBMaXN0ZW5lciIsIk1vY2tBcHBsaWNhdGlvblJlZi5yZWdpc3RlckRpc3Bvc2VMaXN0ZW5lciIsIk1vY2tBcHBsaWNhdGlvblJlZi5ib290c3RyYXAiLCJNb2NrQXBwbGljYXRpb25SZWYuaW5qZWN0b3IiLCJNb2NrQXBwbGljYXRpb25SZWYuem9uZSIsIk1vY2tBcHBsaWNhdGlvblJlZi5kaXNwb3NlIiwiTW9ja0FwcGxpY2F0aW9uUmVmLnRpY2siLCJNb2NrQXBwbGljYXRpb25SZWYuY29tcG9uZW50VHlwZXMiLCJNb2NrQ29ubmVjdGlvbiIsIk1vY2tDb25uZWN0aW9uLmNvbnN0cnVjdG9yIiwiTW9ja0Nvbm5lY3Rpb24ubW9ja1Jlc3BvbmQiLCJNb2NrQ29ubmVjdGlvbi5tb2NrRG93bmxvYWQiLCJNb2NrQ29ubmVjdGlvbi5tb2NrRXJyb3IiLCJNb2NrQmFja2VuZCIsIk1vY2tCYWNrZW5kLmNvbnN0cnVjdG9yIiwiTW9ja0JhY2tlbmQudmVyaWZ5Tm9QZW5kaW5nUmVxdWVzdHMiLCJNb2NrQmFja2VuZC5yZXNvbHZlQWxsQ29ubmVjdGlvbnMiLCJNb2NrQmFja2VuZC5jcmVhdGVDb25uZWN0aW9uIiwiU3B5TG9jYXRpb24iLCJTcHlMb2NhdGlvbi5jb25zdHJ1Y3RvciIsIlNweUxvY2F0aW9uLnNldEluaXRpYWxQYXRoIiwiU3B5TG9jYXRpb24uc2V0QmFzZUhyZWYiLCJTcHlMb2NhdGlvbi5wYXRoIiwiU3B5TG9jYXRpb24uc2ltdWxhdGVVcmxQb3AiLCJTcHlMb2NhdGlvbi5zaW11bGF0ZUhhc2hDaGFuZ2UiLCJTcHlMb2NhdGlvbi5wcmVwYXJlRXh0ZXJuYWxVcmwiLCJTcHlMb2NhdGlvbi5nbyIsIlNweUxvY2F0aW9uLnJlcGxhY2VTdGF0ZSIsIlNweUxvY2F0aW9uLmZvcndhcmQiLCJTcHlMb2NhdGlvbi5iYWNrIiwiU3B5TG9jYXRpb24uc3Vic2NyaWJlIiwiU3B5TG9jYXRpb24ubm9ybWFsaXplIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTztBQ1ZBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVCQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7OztBQ2pCQTs7OztJQUlHO0FBQ0gsOEJBQWMsQ0FBcUIsQ0FBQztBQUNwQyw4QkFBYyxFQUFpQixDQUFDO0FBQ2hDLDhCQUFjLEVBQXNCLENBQUM7QUFDckMsOEJBQWMsQ0FBZSxDQUFDO0FBQzlCLDhCQUFjLEVBQXFCLENBQUM7QUFDcEMsa0NBQTZCLENBQTBCLENBQUM7QUFBaEQsZ0RBQWdEO0FBQ3hELDZDQUFrRSxFQUE0QixDQUFDO0FBQXZGLCtDQUFRO0FBQUUsdURBQVk7QUFBRSxxREFBVztBQUFFLDJEQUFrRDtBQUMvRixnREFNTyxFQUErQixDQUFDO0FBTHJDLDhDQUFNO0FBQ04sNERBQWE7QUFDYixn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LElBQUlBLGlCQUFpQkEsR0FBWUEsRUFBRUEsQ0FBQ0E7U0FDcENBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLEVBQUVBLEdBQUdBLFdBQVdBLENBQUNBLE1BQU1BLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEVBQUVBLENBQUNBLEVBQUVBLEVBQUVBLENBQUNBO2FBQ3pEQSxJQUFJQSxnQkFBZ0JBLEdBQVVBLEVBQUVBLENBQUNBO2FBQ2pDQSxpQkFBaUJBLENBQUNBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsQ0FBQ0E7YUFDekNBLElBQUlBLFVBQVVBLEdBQUdBLFdBQVdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQ2hDQSxFQUFFQSxDQUFDQSxDQUFDQSxVQUFVQSxZQUFZQSxLQUFLQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDaENBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLFVBQVVBLENBQUNBLE1BQU1BLEVBQUVBLENBQUNBLEVBQUVBLEVBQUVBLENBQUNBO3FCQUMzQ0EsZ0JBQWdCQSxDQUFDQSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2lCQUMxREEsQ0FBQ0E7YUFDSEEsQ0FBQ0E7YUFBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsaUJBQVVBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2lCQUNsQ0EsZ0JBQWdCQSxDQUFDQSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBLENBQUNBO2FBQ3ZEQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtpQkFDTkEsZ0JBQWdCQSxDQUFDQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxDQUFDQTthQUNwQ0EsQ0FBQ0E7U0FDSEEsQ0FBQ0E7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QSxDQUFDQTtTQUMvQkEsZ0JBQVdBLEdBQWVBLElBQUlBLENBQUNBO1NBRzdCQSxJQUFJQSxNQUFNQSxHQUFHQSxHQUFHQSxDQUFDQSxNQUFNQSxDQUFDQTtTQUV4QkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDZkEsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsUUFBUUEsQ0FBQ0E7YUFDakNBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBO2FBQ2hDQSxJQUFJQSxDQUFDQSxXQUFXQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxVQUFVQSxDQUFDQTtTQUN2Q0EsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDZkEsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsUUFBUUEsQ0FBQ0E7YUFDakNBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBO2FBQ2hDQSxJQUFJQSxDQUFDQSxXQUFXQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxVQUFVQSxDQUFDQTtTQUN2Q0EsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDZkEsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsUUFBUUEsQ0FBQ0E7YUFDakNBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBO2FBQ2hDQSxJQUFJQSxDQUFDQSxXQUFXQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxVQUFVQSxDQUFDQTtTQUN2Q0EsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDZkEsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsUUFBUUEsQ0FBQ0E7YUFDakNBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBO2FBQ2hDQSxJQUFJQSxDQUFDQSxXQUFXQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxVQUFVQSxDQUFDQTtTQUN2Q0EsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDZkEsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsUUFBUUEsQ0FBQ0E7YUFDakNBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBO2FBQ2hDQSxJQUFJQSxDQUFDQSxXQUFXQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxVQUFVQSxDQUFDQTtTQUN2Q0EsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDZkEsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsUUFBUUEsQ0FBQ0E7YUFDakNBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBO2FBQ2hDQSxJQUFJQSxDQUFDQSxXQUFXQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxVQUFVQSxDQUFDQTtTQUN2Q0EsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDZkEsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsUUFBUUEsQ0FBQ0E7YUFDakNBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBO2FBQ2hDQSxJQUFJQSxDQUFDQSxXQUFXQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxVQUFVQSxDQUFDQTtTQUN2Q0EsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDZkEsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsUUFBUUEsQ0FBQ0E7YUFDakNBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBO2FBQ2hDQSxJQUFJQSxDQUFDQSxXQUFXQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxVQUFVQSxDQUFDQTtTQUN2Q0EsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDZkEsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsUUFBUUEsQ0FBQ0E7YUFDakNBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBO2FBQ2hDQSxJQUFJQSxDQUFDQSxXQUFXQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxVQUFVQSxDQUFDQTtTQUN2Q0EsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDZkEsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsUUFBUUEsQ0FBQ0E7YUFDakNBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBO2FBQ2hDQSxJQUFJQSxDQUFDQSxXQUFXQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxVQUFVQSxDQUFDQTtTQUN2Q0EsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFREQsd0RBQWtCQSxHQUFsQkEsVUFBbUJBLEtBQWFBO1NBQzlCRSxFQUFFQSxDQUFDQSxDQUFDQSxLQUFLQSxJQUFJQSxDQUFDQSxDQUFDQTthQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQTtTQUN0Q0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsS0FBS0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0E7U0FDdENBLEVBQUVBLENBQUNBLENBQUNBLEtBQUtBLElBQUlBLENBQUNBLENBQUNBO2FBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBO1NBQ3RDQSxFQUFFQSxDQUFDQSxDQUFDQSxLQUFLQSxJQUFJQSxDQUFDQSxDQUFDQTthQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQTtTQUN0Q0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsS0FBS0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0E7U0FDdENBLEVBQUVBLENBQUNBLENBQUNBLEtBQUtBLElBQUlBLENB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LElBQUlBLENBQUNBLElBQUlBLENBQUNBO1NBQ25CQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxNQUFNQSxLQUFLQSxLQUFLQSxJQUFJQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxXQUFXQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUM1REEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsS0FBS0EsaUJBQVNBLENBQUNBLENBQUNBLENBQUNBO2lCQUM1QkEsSUFBSUEsQ0FBQ0EsSUFBSUEsR0FBR0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0E7YUFDbkRBLENBQUNBO2FBQ0RBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBO1NBQ25CQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxNQUFNQSxLQUFLQSxLQUFLQSxJQUFJQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxXQUFXQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUM1REEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsS0FBS0EsaUJBQVNBLENBQUNBLENBQUNBLENBQUNBO2lCQUM1QkEsSUFBSUEsQ0FBQ0EsSUFBSUEsR0FBR0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0E7YUFDbkRBLENBQUNBO2FBQ0RBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBO1NBQ25CQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxNQUFNQSxLQUFLQSxLQUFLQSxJQUFJQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxXQUFXQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUM1REEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsS0FBS0EsaUJBQVNBLENBQUNBLENBQUNBLENBQUNBO2lCQUM1QkEsSUFBSUEsQ0FBQ0EsSUFBSUEsR0FBR0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0E7YUFDbkRBLENBQUNBO2FBQ0RBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBO1NBQ25CQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxNQUFNQSxLQUFLQSxLQUFLQSxJQUFJQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxXQUFXQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUM1REEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsS0FBS0EsaUJBQVNBLENBQUNBLENBQUNBLENBQUNBO2lCQUM1QkEsSUFBSUEsQ0FBQ0EsSUFBSUEsR0FBR0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0E7YUFDbkRBLENBQUNBO2FBQ0RBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBO1NBQ25CQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxNQUFNQSxLQUFLQSxLQUFLQSxJQUFJQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxXQUFXQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUM1REEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsS0FBS0EsaUJBQVNBLENBQUNBLENBQUNBLENBQUNBO2lCQUM1QkEsSUFBSUEsQ0FBQ0EsSUFBSUEsR0FBR0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0E7YUFDbkRBLENBQUNBO2FBQ0RBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBO1NBQ25CQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxNQUFNQSxLQUFLQSxLQUFLQSxJQUFJQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxXQUFXQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUM1REEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsS0FBS0EsaUJBQVNBLENBQUNBLENBQUNBLENBQUNBO2lCQUM1QkEsSUFBSUEsQ0FBQ0EsSUFBSUEsR0FBR0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0E7YUFDbkRBLENBQUNBO2FBQ0RBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBO1NBQ25CQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxNQUFNQSxLQUFLQSxLQUFLQSxJQUFJQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxXQUFXQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUM1REEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsS0FBS0EsaUJBQVNBLENBQUNBLENBQUNBLENBQUNBO2lCQUM1QkEsSUFBSUEsQ0FBQ0EsSUFBSUEsR0FBR0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0E7YUFDbkRBLENBQUNBO2FBQ0RBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBO1NBQ25CQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxNQUFNQSxLQUFLQSxLQUFLQSxJQUFJQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxXQUFXQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUM1REEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsS0FBS0EsaUJBQVNBLENBQUNBLENBQUNBLENBQUNBO2lCQUM1QkEsSUFBSUEsQ0FBQ0EsSUFBSUEsR0FBR0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0E7YUFDbkRBLENBQUNBO2FBQ0RBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBO1NBQ25CQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxNQUFNQSxLQUFLQSxLQUFLQSxJQUFJQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxXQUFXQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUM1REEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsS0FBS0EsaUJBQVNBLENBQUNBLENBQUNBLENBQUNBO2lCQUM1QkEsSUFBSUEsQ0FBQ0EsSUFBSUEsR0FBR0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0E7YUFDbkRBLENBQUNBO2FBQ0RBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBO1NBQ25CQSxDQUFDQTtTQUVEQSxNQUFNQSxDQUFDQSxpQkFBU0EsQ0FBQ0E7S0FDbkJBLENBQUNBO0tBRURMLDhDQUFhQSxHQUFiQSxVQUFjQSxLQUFhQTtTQUN6Qk0sRUFBRUEsQ0FBQ0EsQ0FBQ0EsS0FBS0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7U0FDakNBLEVBQUVBLENBQUNBLENBQUNBLEtBQUtBLElBQUlBLENBQUNBLENBQUNBO2FBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBO1NBQ2pDQSxFQUFFQSxDQUFDQSxDQUFDQSxLQUFLQSxJQUFJQSxDQUFDQSxDQUFDQTthQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQTtTQUNqQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsS0FBS0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7U0FDakNBLEVBQUVBLENBQUNBLENBQUNBLEtBQUtBLElBQUlBLENBQUNBLENBQUNBO2FBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBO1NBQ2pDQSxFQUFFQSxDQUFDQSxDQUFDQSxLQUFLQSxJQUFJQSxDQUFDQSxDQUFDQTthQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQTtTQUNqQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsS0FBS0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7U0FDakNBLEVBQUVBLENBQUNBLENBQUNBLEtBQUtBLElBQUlBLENBQUNBLENBQUNBO2FBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBO1NBQ2pDQSxFQUFFQSxDQUFDQSxDQUFDQSxLQUFLQSxJQUFJQSxDQUFDQSxDQUFDQTthQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQTtTQUNqQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsS0FBS0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7U0FDakNBLE1BQU1BLElBQUlBLDZCQUFnQkEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7S0FDcENBLENBQUNBO0tBRUROLHNEQUFx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QSxFQUFFQSxHQUFHQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQzlFQSxFQUFFQSxHQUFHQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQzlFQSxFQUFFQSxHQUFHQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQzlFQSxFQUFFQSxHQUFHQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQzlFQSxFQUFFQSxHQUFHQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQzlFQSxFQUFFQSxHQUFHQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQzlFQSxFQUFFQSxHQUFHQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQzlFQSxFQUFFQSxHQUFHQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQzlFQSxFQUFFQSxHQUFHQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQzlFQSxFQUFFQSxHQUFHQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQzlFQSxHQUFHQSxHQUFHQSxNQUFNQSxHQUFHQSxFQUFFQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQ2pGQSxHQUFHQSxHQUFHQSxNQUFNQSxHQUFHQSxFQUFFQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQ2pGQSxHQUFHQSxHQUFHQSxNQUFNQSxHQUFHQSxFQUFFQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQ2pGQSxHQUFHQSxHQUFHQSxNQUFNQSxHQUFHQSxFQUFFQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQ2pGQSxHQUFHQSxHQUFHQSxNQUFNQSxHQUFHQSxFQUFFQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQ2pGQSxHQUFHQSxHQUFHQSxNQUFNQSxHQUFHQSxFQUFFQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQ2pGQSxHQUFHQSxHQUFHQSxNQUFNQSxHQUFHQSxFQUFFQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQ2pGQSxHQUFHQSxHQUFHQSxNQUFNQSxHQUFHQSxFQUFFQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQ2pGQSxHQUFHQSxHQUFHQSxNQUFNQSxHQUFHQSxFQUFFQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQ2pGQSxHQUFHQSxHQUFHQSxNQUFNQSxHQUFHQSxFQUFFQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO1NBQ25GQSxDQUFFQTtTQUFBQSxLQUFLQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNYQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxZQUFZQSxrQ0FBcUJBLElBQUlBLENBQUNBLFlBQVlBLCtCQUFrQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQzFFQSxDQUFDQSxDQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxFQUFFQSxRQUFRQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQTthQUMvQkEsQ0FBQ0E7YUFDREEsTUFBTUEsQ0FBQ0EsQ0FBQ0E7U0FDVkEsQ0FBQ0E7U0FFREEsSUFBSUEsR0FBR0EsQ0FBQ0E7U0FDUkEsSUFBSUEsQ0FBQ0E7YUFDSEEsTUFBTUEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQ2ZBLEtBQUtBLENBQUNBO3FCQUNKQSxHQUFHQSxHQUFHQSxPQUFPQSxFQUFFQSxDQUFDQTtxQkFDaEJBLEtBQUtBLENBQUNBO2lCQUNSQSxLQUFLQSxDQUFDQTtxQkFDSkEsR0FBR0EsR0FBR0EsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0E7cUJBQ2xCQSxLQUFLQSxDQUFDQTtpQkFDUkEsS0FBS0EsQ0FBQ0E7cUJBQ0pBLEdBQUdBLEdBQUdBLE9BQU9BLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLENBQUNBLENBQUNBO3FCQUN0QkEsS0FBS0EsQ0FBQ0E7aUJBQ1JBLEtBQUtBLENBQUNBO3FCQUNKQSxHQUFHQSxHQUFHQSxPQUFPQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxDQUFDQSxDQUFDQTtxQkFDMUJBLEtBQUtBLENBQUNBO2lCQUNSQSxLQUFLQSxDQUFDQTtxQkFDSkEsR0FBR0EsR0FBR0EsT0FBT0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0E7cUJBQzlCQSxLQUFLQSxDQUFDQTtpQkFDUkEsS0FBS0EsQ0FBQ0E7cUJBQ0pBLEdBQUdBLEdBQUdBLE9BQU9BLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLENBQUNBLENBQUNBO3FCQUNsQ0EsS0FBS0EsQ0FBQ0E7aUJBQ1JBLEtBQUtBLENBQUNBO3FCQUNKQSxHQUFHQSxHQUFHQSxPQUFPQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxDQUFDQSxDQUFDQTtxQkFDdENBLEtBQUtBLENBQUNBO2lCQUNSQSxLQUFLQSxDQUFDQTtxQkFDSkEsR0FBR0EsR0FBR0EsT0FBT0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0E7cUJBQzFDQSxLQUFLQSxDQUFDQTtpQkFDUkEsS0FBS0EsQ0FBQ0E7cUJBQ0pBLEdBQUdBLEdBQUdBLE9BQU9BLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLENBQUNBLENBQUNBO3FCQUM5Q0EsS0FBS0EsQ0FBQ0E7aUJBQ1JBLEtBQUtBLENBQUNBO3FCQUNKQSxHQUFHQSxHQUFHQSxPQUFPQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxDQUFDQSxDQUFDQTtxQkFDbERBLEtBQUtBLENBQUNBO2lCQUNSQSxLQUFLQSxFQUFFQTtxQkFDTEEsR0FBR0EsR0FBR0EsT0FBT0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0E7cUJBQ3REQSxLQUFLQSxDQUFDQTtpQkFDUkEsS0FBS0EsRUFBRUE7cUJBQ0xBLEdBQUdBLEdBQUdBLE9BQU9BLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBO3FCQUMzREEsS0FBS0EsQ0FBQ0E7aUJBQ1JBLEtBQUtBLEVBQUVBO3FCQUNMQSxHQUFHQSxHQUFHQSxPQUFPQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQTtxQkFDaEVBLEtBQUtBLENBQUNBO2lCQUNSQSxLQUFLQSxFQUFFQTtxQkFDTEEsR0FBR0EsR0FBR0EsT0FBT0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0E7cUJBQ3JFQSxLQUFLQSxDQUFDQTtpQkFDUkEsS0FBS0EsRUFBRUE7cUJBQ0xBLEdBQUdBLEdBQUdBLE9BQU9BLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBO3FCQUMxRUEsS0FBS0EsQ0FBQ0E7aUJBQ1JBLEtBQUtBLEVBQUVBO3FCQUNMQSxHQUFHQSxHQUFHQSxPQUFPQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQTtxQkFDL0VBLEtBQUtBLENBQUNBO2lCQUNSQSxLQUFLQSxFQUFFQTtxQkFDTEEsR0FBR0EsR0FBR0EsT0FBT0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0E7cUJBQ3BGQSxLQUFLQSxDQUFDQTtpQkFDUkEsS0FBS0EsRUFBRUE7cUJBQ0xBLEdBQUdBLEdBQUdBLE9BQU9BLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBO3FCQUN6RkEsS0FBS0EsQ0FBQ0E7aUJBQ1JBLEtBQUtBLEVBQUVBO3FCQUNMQSxHQUFHQSxHQUFHQSxPQUFPQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUN6RUEsR0FBR0EsQ0FBQ0EsQ0FBQ0E7cUJBQ25CQSxLQUFLQSxDQUFDQTtpQkFDUkEsS0FBS0EsRUFBRUE7cUJBQ0xBLEdBQUdBLEdBQUdBLE9BQU9BLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQ3pFQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQTtxQkFDeEJBLEtBQUtBLENBQUNBO2lCQUNSQSxLQUFLQSxFQUFFQTtxQkFDTEEsR0FBR0EsR0FBR0EsT0FBT0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FB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QUFDQTtTQUVEQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxJQUFJQSxJQUFJQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNwQkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQzVCQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxFQUFFQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTthQUNyQkEsQ0FBQ0E7U0FDSEEsQ0FBQ0E7U0FFREEsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDWEEsQ0FBQ0E7S0FFTVYsdUJBQU1BLEdBQWJBLFVBQWlCQSxFQUFzQkEsRUFBRUEsRUFBc0JBO1NBQzdEVyxJQUFJQSxFQUFFQSxHQUFHQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQTtTQUN6QkEsSUFBSUEsRUFBRUEsR0FBR0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0E7U0FDekJBLEVBQUVBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLE1BQU1BLElBQUlBLEVBQUVBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBO2FBQzNCQSxNQUFNQSxDQUFDQSxLQUFLQSxDQUFDQTtTQUNmQSxDQUFDQTtTQUNEQSxJQUFJQSxHQUFHQSxDQUFDQTtTQUNSQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQSxFQUFFQSxFQUFFQSxDQUFDQTthQUNuQ0EsR0FBR0EsR0FBR0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDWkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsS0FBS0EsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQ3hCQSxNQUFNQSxDQUFDQSxLQUFLQSxDQUFDQTthQUNmQSxDQUFDQTtTQUNIQSxDQUFDQTtTQUNEQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQTtLQUNkQSxDQUFDQTtLQUNIWCx1QkFBQ0E7QUFBREEsRUFBQ0EsSUFBQTtBQS9EWSx5QkFBZ0IsbUJBK0Q1QjtBQVFEO0tBQUFZO0tBNkZBQyxDQUFDQTtLQTVGQ0QsNkVBQTZFQTtLQUM3RUEscUJBQXFCQTtLQUNkQSwyQkFBZUEsR0FBdEJBLFVBQXVCQSxJQUFZQSxJQUFXRSxNQUFNQSxDQUFDQSxJQUFJQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUNoRUYsOEJBQWtCQSxHQUF6QkEsVUFBMEJBLElBQVlBLElBQVdHLE1BQU1BLENBQUNBLElBQUlBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO0tBQ25FSCxpQkFBS0EsR0FBWkEsVUFBZ0JBLEtBQVVBLElBQVNJLE1BQU1BLENBQUNBLEtBQUtBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO0tBQ3BESiw0QkFBZ0JBLEdBQXZCQSxVQUEyQkEsS0FBVUEsRUFBRUEsRUFBNkJBO1NBQ2xFSyxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxLQUFLQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQSxFQUFFQSxFQUFFQSxDQUFDQTthQUN0Q0EsRUFBRUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7U0FDbEJBLENBQUNBO0tBQ0hBLENBQUNBO0tBQ01MLGlCQUFLQSxHQUFaQSxVQUFnQkEsS0FBVUE7U0FDeEJNLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLEtBQUtBLENBQUNBO2FBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBO1NBQ3hCQSxNQUFNQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUNsQkEsQ0FBQ0E7S0FDTU4sZ0JBQUlBLEdBQVhBLFVBQWVBLEtBQVVBO1NBQ3ZCTyxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxLQUFLQSxJQUFJQSxLQUFLQSxDQUFDQSxNQUFNQSxJQUFJQSxDQUFDQSxDQUFDQTthQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQTtTQUM3Q0EsTUFBTUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDakNBLENBQUNBO0tBQ01QLG1CQUFPQSxHQUFkQSxVQUFrQkEsS0FBVUEsRUFBRUEsS0FBUUEsRUFBRUEsVUFBc0JBO1NBQXRCUSwwQkFBc0JBLEdBQXRCQSxjQUFzQkE7U0FDNURBLE1BQU1BLENBQUNBLEtBQUtBLENBQUNBLE9BQU9BLENBQUNBLEtBQUtBLEVBQUVBLFVBQVVBLENBQUNBLENBQUNBO0tBQzFDQSxDQUFDQTtLQUNNUixvQkFBUUEsR0FBZkEsVUFBbUJBLElBQVNBLEVBQUVBLEVBQUtBLElBQWFTLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO0tBQzFFVCxvQkFBUUEsR0FBZkEsVUFBbUJBLEtBQVVBO1NBQzNCVSxJQUFJQSxDQUFDQSxHQUFHQSxXQUFXQSxDQUFDQSxLQUFLQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQTtTQUNqQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsT0FBT0EsRUFBRUEsQ0FBQ0E7S0FDckJBLENBQUNBO0tBQ01WLGtCQUFNQSxHQUFiQSxVQUFjQSxDQUFRQSxFQUFFQSxDQUFRQSxJQUFXVyxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUN6RFgsa0JBQU1BLEdBQWJBLFVBQWlCQSxJQUFTQSxFQUFFQSxLQUFhQSxFQUFFQSxLQUFRQSxJQUFJWSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxLQUFLQSxFQUFFQSxDQUFDQSxFQUFFQSxLQUFLQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUMvRVosb0JBQVFBLEdBQWZBLFVBQW1CQSxJQUFTQSxFQUFFQSxLQUFhQTtTQUN6Q2EsSUFBSUEsR0FBR0EsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7U0FDdEJBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLEtBQUtBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBO1NBQ3RCQSxNQUFNQSxDQUFDQSxHQUFHQSxDQUFDQTtLQUNiQSxDQUFDQTtLQUNNYixxQkFBU0EsR0FBaEJBLFVBQW9CQSxJQUFTQSxFQUFFQSxLQUFVQTtTQUN2Q2MsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsS0FBS0EsQ0FBQ0EsTUFBTUEsRUFBRUEsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0E7YUFDdENBLElBQUlBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEtBQUtBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQ25DQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxLQUFLQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQTtTQUN4QkEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FDTWQsa0JBQU1BLEdBQWJBLFVBQWlCQSxJQUFTQSxFQUFFQSxFQUFLQTtTQUMvQmUsSUFBSUEsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0E7U0FDN0JBLEVBQUVBLENBQUNBLENBQUNBLEtBQUtBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQ2ZBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLEtBQUtBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBO2FBQ3RCQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQTtTQUNkQSxDQUFDQTtTQUNEQSxNQUFNQSxDQUFDQSxLQUFLQSxDQUFDQTtLQUNmQSxDQUFDQTtLQUNNZixpQkFBS0EsR0FBWkEsVUFBYUEsSUFBV0EsSUFBSWdCLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO0tBQ3ZDaEIsbUJBQU9BLEdBQWRBLFVBQWVBLElBQVdBLElBQWFpQixNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUMxRGpCLGdCQUFJQSxHQUFYQSxVQUFZQSxJQUFXQSxFQUFFQSxLQUFVQSxFQUFFQSxLQUFpQkEsRUFBRUEsR0FBa0JBO1NBQXJDa0IscUJBQWlCQSxHQUFqQkEsU0FBaUJBO1NBQUVBLG1CQUFrQkEsR0FBbEJBLFVBQWtCQTtTQUN4RUEsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsS0FBS0EsRUFBRUEsS0FBS0EsRUFBRUEsR0FBR0EsS0FBS0EsSUFBSUEsR0FBR0EsSUFBSUEsQ0FBQ0EsTUFBTUEsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7S0FDNURBLENBQUNBO0tBQ01sQixrQkFBTUEsR0FBYkEsVUFBY0EsQ0FBUUEsRUFBRUEsQ0FBUUE7U0FDOUJtQixFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxNQUFNQSxJQUFJQSxDQUFDQSxDQUFDQSxNQUFNQSxDQUFDQTthQUFDQSxNQUFNQSxDQUFDQSxLQUFLQSxDQUFDQTtTQUN2Q0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsTUFBTUEsRUFBRUEsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0E7YUFDbENBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2lCQUFDQSxNQUFNQSxDQUFDQSxLQUFLQSxDQUFDQTtTQUNsQ0EsQ0FBQ0E7U0FDREEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7S0FDZEEsQ0FBQ0E7S0FDTW5CLGlCQUFLQSxHQUFaQSxVQUFnQkEsQ0FBTUEsRUFBRUEsSUFBZ0JBLEVBQUVBLEVBQWlCQTtTQUFuQ29CLG9CQUFnQkEsR0FBaEJBLFFBQWdCQTtTQUFFQSxrQkFBaUJBLEdBQWpCQSxTQUFpQkE7U0FDekRBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLEVBQUVBLEVBQUVBLEtBQUtBLElBQUlBLEdBQUdBLFNBQVNBLEdBQUdBLEVBQUVBLENBQUNBLENBQUNBO0tBQ3JEQSxDQUFDQTtLQUNNcEIsa0JBQU1BLEdBQWJBLFVBQWlCQSxDQUFNQSxFQUFFQSxJQUFZQSxFQUFFQSxNQUFjQSxJQUFTcUIsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsRUFBRUEsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDdkZyQixnQkFBSUEsR0FBWEEsVUFBZUEsQ0FBTUEsRUFBRUEsU0FBa0NBO1NBQ3ZEc0IsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLFNBQVNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQ3pCQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxDQUFDQTtTQUNwQkEsQ0FBQ0E7U0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFDTkEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsRUFBRUEsQ0FBQ0E7U0FDWEEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FDTXRCLG9CQUFRQSxHQUFmQSxVQUFtQkEsQ0FBTUEsSUFBWXVCLE1BQU1BLENBQUNBLENBQUNBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBO0tBQ3BEdkIsa0JBQU1BLEdBQWJBLFVBQWlCQSxDQUFNQSxJQUFZd0IsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FFdkR4QixtQkFBT0EsR0FBZEEsVUFBa0JBLElBQVNBLEVBQUVBLFNBQTJCQTtTQUN0RHlCLEVBQUVBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLElBQUlBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQ3JCQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQTtTQUNkQSxDQUFDQTtTQUNEQSxJQUFJQSxRQUFRQSxHQUFHQSxJQUFJQSxDQUFDQTtTQUNwQkEsSUFBSUEsUUFBUUEsR0FBR0EsQ0FBQ0EsUUFBUUEsQ0FBQ0E7U0FDekJBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLEdBQUdBLENBQUNBLEVBQUVBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBLE1BQU1BLEVBQUVBLEtBQUtBLEVBQUVBLEVBQUVBLENBQUNBO2FBQ2pEQSxJQUFJQSxTQUFTQSxHQUFHQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQTthQUM1QkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsY0FBT0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQ3ZCQSxRQUFRQSxDQUFDQTthQUNYQSxDQUFDQTthQUNEQSxJQUFJQSxjQUFjQSxHQUFHQSxTQUFTQSxDQUFDQSxTQUFTQSxDQUFDQSxDQUFDQTthQUMxQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsY0FBY0EsR0FBR0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQzlCQSxRQUFRQSxHQUFHQSxTQUFTQSxDQUFDQTtpQkFDckJBLFFBQVFBLEdBQUdBLGNBQWNBLENBQUNBO2FBQzVCQSxDQUFDQTtTQUNIQSxDQUFDQTtTQUNEQSxNQUFNQSxDQUFDQSxRQUFRQSxDQUFDQTtLQUNsQkEsQ0FBQ0E7S0FDSHpCLGtCQUFDQTtBQUFEQSxFQUFDQSxJQUFBO0FBN0ZZLG9CQUFXLGNBNkZ2QjtBQUVELDZCQUFtQyxHQUFRO0tBQ3pDMEIsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsaUJBQVVBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBO1NBQUNBLE1BQU1BLENBQUNBLEtBQUtBLENBQUNBO0tBQ25DQSxNQUFNQSxDQUFDQSxjQUFPQSxDQUFDQSxHQUFHQSxDQUFDQTtTQUNaQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxZQUFZQSxXQUFHQSxDQUFDQTthQUNyQkEsd0JBQWlCQSxFQUFFQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFFQSwwQ0FBMENBO0FBQ2xGQSxFQUFDQTtBQUxlLDJCQUFrQixxQkFLakM7QUFFRCwwQkFBZ0MsR0FBUSxFQUFFLEVBQVk7S0FDcERDLEVBQUVBLENBQUNBLENBQUNBLGNBQU9BLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO1NBQ2pCQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxHQUFHQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQSxFQUFFQSxFQUFFQSxDQUFDQTthQUNwQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7U0FDYkEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7U0FDTkEsSUFBSUEsUUFBUUEsR0FBR0EsR0FBR0EsQ0FBQ0Esd0JBQWlCQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQTtTQUMxQ0EsSUFBSUEsSUFBSUEsQ0FBQ0E7U0FDVEEsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsR0FBR0EsUUFBUUEsQ0FBQ0EsSUFBSUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsQ0FBQ0E7YUFDeENBLEVBQUVBLENBQUNBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBO1NBQ2pCQSxDQUFDQTtLQUNIQSxDQUFDQTtBQUNIQSxFQUFDQTtBQVplLHdCQUFlLGtCQVk5QjtBQUVELDZFQUE0RTtBQUM1RSx1RUFBc0U7QUFDdEUsS0FBSSxpQkFBaUIsR0FBNkIsQ0FBQztLQUNqRCxJQUFJLElBQUksR0FBRyxJQUFJLFdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUM5QixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDcEIsTUFBTSxDQUFDLDJCQUEyQixHQUFVLElBQWNDLE1BQU1BLENBQUNBLElBQUlBLFdBQUdBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUM7S0FDbkYsQ0FBQztLQUFDLElBQUksQ0FBQyxDQUFDO1NBQ04sTUFBTSxDQUFDLHNDQUFzQyxHQUFVO2FBQ3JEQyxJQUFJQSxHQUFHQSxHQUFHQSxJQUFJQSxXQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQTthQUN2QkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsS0FBS0EsR0FBR0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQzVCQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxHQUFHQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQSxFQUFFQSxFQUFFQSxDQUFDQTtxQkFDcENBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2lCQUNsQkEsQ0FBQ0E7YUFDSEEsQ0FBQ0E7YUFDREEsTUFBTUEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7U0FDYkEsQ0FBQ0EsQ0FBQztLQUNKLENBQUM7QUFDSCxFQUFDLENBQUMsRUFBRSxDQUFDO0FBQ0w7S0FBQUM7S0FJQUMsQ0FBQ0E7S0FIUUQseUJBQWNBLEdBQXJCQSxVQUF5QkEsR0FBUUEsSUFBWUUsTUFBTUEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUN0RUYsY0FBR0EsR0FBVkEsVUFBY0EsQ0FBU0EsRUFBRUEsR0FBTUEsSUFBYUcsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDekRILGlCQUFNQSxHQUFiQSxVQUFpQkEsQ0FBU0EsRUFBRUEsQ0FBSUEsSUFBSUksQ0FBQ0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDcERKLGlCQUFDQTtBQUFEQSxFQUFDQSxJQUFBO0FBSlksbUJBQVUsYUFJdEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3hURCxrQ0FXTyxDQUEwQixDQUFDO0FBQ2xDLHdDQUE4QyxFQUFnQyxDQUFDO0FBQy9FLHdDQUFzQyxFQUFnQyxDQUFDO0FBQ3ZFLHdDQUF3QixFQUF5QyxDQUFDO0FBQ2xFLGlDQUFrQixFQUFPLENBQUM7QUFDMUIsc0NBUU8sQ0FBWSxDQUFDO0FBQ3BCLHdDQUlPLEVBQWMsQ0FBQztBQUN0Qix5Q0FBZ0MsRUFBZSxDQUFDO0FBRWhEOzs7SUFHRztBQUNIO0tBQ0VLLG9CQUFtQkEsR0FBUUEsRUFBU0EsUUFBaUJBLEVBQVNBLG9CQUF5QkEsRUFDcEVBLG9CQUF5QkEsRUFBU0EsVUFBaUJBO1NBRG5EQyxRQUFHQSxHQUFIQSxHQUFHQSxDQUFLQTtTQUFTQSxhQUFRQSxHQUFSQSxRQUFRQSxDQUFTQTtTQUFTQSx5QkFBb0JBLEdBQXBCQSxvQkFBb0JBLENBQUtBO1NBQ3BFQSx5QkFBb0JBLEdBQXBCQSxvQkFBb0JBLENBQUtBO1NBQVNBLGVBQVVBLEdBQVZBLFVBQVVBLENBQU9BO0tBQUdBLENBQUNBO0tBRW5FRCxrQkFBT0EsR0FBZEEsVUFBZUEsR0FBUUEsSUFBZ0JFLE1BQU1BLENBQUNBLElBQUlBLFVBQVVBLENBQUNBLEdBQUdBLEVBQUVBLEtBQUtBLEVBQUVBLElBQUlBLEVBQUVBLElBQUlBLEVBQUVBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO0tBQzdGRixpQkFBQ0E7QUFBREEsRUFBQ0EsSUFBQTtBQUxZLG1CQUFVLGFBS3RCO0FBRUQsS0FBTSxXQUFXLEdBQUcsaUJBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUVuQzs7Ozs7Ozs7Ozs7Ozs7SUFjRztBQUNIO0tBbUlFRyxrQkFBWUEsS0FBS0EsRUFBRUEsRUFPbEJBO2FBUG1CQyxRQUFRQSxnQkFBRUEsUUFBUUEsZ0JBQUVBLFdBQVdBLG1CQUFFQSxVQUFVQSxrQkFBRUEsSUFBSUEsWUFBRUEsS0FBS0E7U0FRMUVBLElBQUlBLENBQUNBLEtBQUtBLEdBQUdBLEtBQUtBLENBQUNBO1NBQ25CQSxJQUFJQSxDQUFDQSxRQUFRQSxHQUFHQSxRQUFRQSxDQUFDQTtTQUN6QkEsSUFBSUEsQ0FBQ0EsUUFBUUEsR0FBR0EsUUFBUUEsQ0FBQ0E7U0FDekJBLElBQUlBLENBQUNBLFdBQVdBLEdBQUdBLFdBQVdBLENBQUNBO1NBQy9CQSxJQUFJQSxDQUFDQSxVQUFVQSxHQUFHQSxVQUFVQSxDQUFDQTtTQUM3QkEsSUFBSUEsQ0FBQ0EsWUFBWUEsR0FBR0EsSUFBSUEsQ0FBQ0E7U0FDekJBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLEtBQUtBLENBQUNBO0tBQ3RCQSxDQUFDQTtLQWdDREQsc0JBQUlBLDJCQUFLQTtTQTlCVEEsa0VBQWtFQTtTQUNsRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7WUE0QkdBO2NBQ0hBLGNBQXVCRSxNQUFNQSxDQUFDQSxvQkFBYUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7OztRQUFBRjtLQWxMN0RBO1NBQUNBLFlBQUtBLEVBQUVBOztrQkFtTFBBO0tBQURBLGVBQUNBO0FBQURBLEVBQUNBLElBQUE7QUFsTFksaUJBQVEsV0FrTHBCO0FBRUQ7Ozs7SUFJRztBQUNIO0tBQzZCRywyQkFBUUE7S0FDbkNBLGlCQUFZQSxLQUFLQSxFQUFFQSxFQUtsQkE7YUFMbUJDLE9BQU9BLGVBQUVBLE9BQU9BLGVBQUVBLE9BQU9BLGVBQUVBLFNBQVNBLGlCQUFFQSxJQUFJQSxZQUFFQSxLQUFLQTtTQU1uRUEsa0JBQU1BLEtBQUtBLEVBQUVBO2FBQ1hBLFFBQVFBLEVBQUVBLE9BQU9BO2FBQ2pCQSxRQUFRQSxFQUFFQSxPQUFPQTthQUNqQkEsV0FBV0EsRUFBRUEsT0FBT0E7YUFDcEJBLFVBQVVBLEVBQUVBLFNBQVNBO2FBQ3JCQSxJQUFJQSxFQUFFQSxJQUFJQTthQUNWQSxLQUFLQSxFQUFFQSxLQUFLQTtVQUNiQSxDQUFDQSxDQUFDQTtLQUNMQSxDQUFDQTtLQUtERCxzQkFBSUEsNEJBQU9BO1NBSFhBOztZQUVHQTtjQUNIQSxjQUFnQkUsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7OztRQUFBRjtLQUt2Q0Esc0JBQUlBLDRCQUFPQTtTQUhYQTs7WUFFR0E7Y0FDSEEsY0FBZ0JHLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLFdBQVdBLENBQUNBLENBQUNBLENBQUNBOzs7UUFBQUg7S0FLMUNBLHNCQUFJQSw4QkFBU0E7U0FIYkE7O1lBRUdBO2NBQ0hBLGNBQWtCSSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQTs7O1FBQUFKO0tBSzNDQSxzQkFBSUEsNEJBQU9BO1NBSFhBOztZQUVHQTtjQUNIQSxjQUFnQkssTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7OztRQUFBTDtLQXBDekNBO1NBQUNBLFlBQUtBLEVBQUVBOztpQkFxQ1BBO0tBQURBLGNBQUNBO0FBQURBLEVBQUNBLEVBcEM0QixRQUFRLEVBb0NwQztBQXBDWSxnQkFBTyxVQW9DbkI7QUEwQ0Q7S0FDRU0sMkJBQW1CQSxHQUFRQSxFQUFTQSxpQkFBb0NBLEVBQ3JEQSxhQUFzQkE7U0FEdEJDLFFBQUdBLEdBQUhBLEdBQUdBLENBQUtBO1NBQVNBLHNCQUFpQkEsR0FBakJBLGlCQUFpQkEsQ0FBbUJBO1NBQ3JEQSxrQkFBYUEsR0FBYkEsYUFBYUEsQ0FBU0E7S0FBR0EsQ0FBQ0E7S0FFN0NELHNCQUFJQSw4Q0FBZUE7Y0FBbkJBLGNBQXlDRSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBOzs7UUFBQUY7S0FDOUVBLHdCQUFDQTtBQUFEQSxFQUFDQSxJQUFBO0FBTFksMEJBQWlCLG9CQUs3QjtBQUVEOztJQUVHO0FBQ0g7S0FDRUc7U0FDSUE7O1lBRUdBO1NBQ0lBLE9BQWlCQTtTQUV4QkE7O1lBRUdBO1NBQ0lBLFlBQTBCQTtTQUwxQkMsWUFBT0EsR0FBUEEsT0FBT0EsQ0FBVUE7U0FLakJBLGlCQUFZQSxHQUFaQSxZQUFZQSxDQUFjQTtLQUFHQSxDQUFDQTtLQUMzQ0Qsc0JBQUNBO0FBQURBLEVBQUNBLElBQUE7QUFYWSx3QkFBZSxrQkFXM0I7QUFFRDs7Ozs7Ozs7Ozs7SUFXRztBQUNILGVBQXFCLEtBQUs7S0FDeEJFLE1BQU1BLENBQUNBLElBQUlBLGVBQWVBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBO0FBQ3BDQSxFQUFDQTtBQUZlLGFBQUksT0FFbkI7QUFFRDs7Ozs7O0lBTUc7QUFDSCxrQkFBd0IsS0FBSyxFQUFFLEVBTzlCO1NBUCtCQyxRQUFRQSxnQkFBRUEsUUFBUUEsZ0JBQUVBLFdBQVdBLG1CQUFFQSxVQUFVQSxrQkFBRUEsSUFBSUEsWUFBRUEsS0FBS0E7S0FRdEZBLE1BQU1BLENBQUNBLElBQUlBLFFBQVFBLENBQUNBLEtBQUtBLEVBQUVBO1NBQ3pCQSxRQUFRQSxFQUFFQSxRQUFRQTtTQUNsQkEsUUFBUUEsRUFBRUEsUUFBUUE7U0FDbEJBLFdBQVdBLEVBQUVBLFdBQVdBO1NBQ3hCQSxVQUFVQSxFQUFFQSxVQUFVQTtTQUN0QkEsSUFBSUEsRUFBRUEsSUFBSUE7U0FDVkEsS0FBS0EsRUFBRUEsS0FBS0E7TUFDYkEsQ0FBQ0EsQ0FBQ0E7QUFDTEEsRUFBQ0E7QUFoQmUsZ0JBQU8sVUFnQnRCO0FBRUQ7O0lBRUc7QUFDSDtLQUNFQyx5QkFBbUJBLEtBQUtBO1NBQUxDLFVBQUtBLEdBQUxBLEtBQUtBO0tBQUdBLENBQUNBO0tBRTVCRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztRQTRCR0E7S0FDSEEsaUNBQU9BLEdBQVBBLFVBQVFBLElBQVVBO1NBQ2hCRSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxhQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNsQkEsTUFBTUEsSUFBSUEsMEJBQWFBLENBQ25CQSw2Q0FBMENBLGdCQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSx1QkFBbUJBLENBQUNBLENBQUNBO1NBQ3BGQSxDQUFDQTtTQUNEQSxNQUFNQSxDQUFDQSxJQUFJQSxRQUFRQSxDQUFDQSxJQUFJQSxDQUFDQSxLQUFLQSxFQUFFQSxFQUFDQSxRQUFRQSxFQUFFQSxJQUFJQSxFQUFDQSxDQUFDQSxDQUFDQTtLQUNwREEsQ0FBQ0E7S0FFREY7Ozs7Ozs7Ozs7OztRQVlHQTtLQUNIQSxpQ0FBT0EsR0FBUEEsVUFBUUEsS0FBVUEsSUFBY0csTUFBTUEsQ0FBQ0EsSUFBSUEsUUFBUUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsS0FBS0EsRUFBRUEsRUFBQ0EsUUFBUUEsRUFBRUEsS0FBS0EsRUFBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FFckZIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1FBK0JHQTtLQUNIQSxpQ0FBT0EsR0FBUEEsVUFBUUEsVUFBd0JBO1NBQzlCSSxFQUFFQSxDQUFDQSxDQUFDQSxjQUFPQSxDQUFDQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUN4QkEsTUFBTUEsSUFBSUEsMEJBQWFBLENBQUNBLG1CQUFpQkEsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLHVCQUFvQkEsQ0FBQ0EsQ0FBQ0E7U0FDdEZBLENBQUNBO1NBQ0RBLE1BQU1BLENBQUNBLElBQUlBLFFBQVFBLENBQUNBLElBQUlBLENBQUNBLEtBQUtBLEVBQUVBLEVBQUNBLFdBQVdBLEVBQUVBLFVBQVVBLEVBQUNBLENBQUNBLENBQUNBO0tBQzdEQSxDQUFDQTtLQUVESjs7Ozs7Ozs7Ozs7Ozs7UUFjR0E7S0FDSEEsbUNBQVNBLEdBQVRBLFVBQVVBLE9BQWlCQSxFQUFFQSxZQUFvQkE7U0FDL0NLLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLGlCQUFVQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUN6QkEsTUFBTUEsSUFBSUEsMEJBQWFBLENBQ25CQSwrQ0FBNENBLGdCQUFTQSxDQUFDQSxPQUFPQSxDQUFDQSwwQkFBc0JBLENBQUNBLENBQUNBO1NBQzVGQSxDQUFDQTtTQUNEQSxNQUFNQSxDQUFDQSxJQUFJQSxRQUFRQSxDQUFDQSxJQUFJQSxDQUFDQSxLQUFLQSxFQUFFQSxFQUFDQSxVQUFVQSxFQUFFQSxPQUFPQSxFQUFFQSxJQUFJQSxFQUFFQSxZQUFZQSxFQUFDQSxDQUFDQSxDQUFDQTtLQUM3RUEsQ0FBQ0E7S0FDSEwsc0JBQUNBO0FBQURBLEVBQUNBLElBQUE7QUFwSFksd0JBQWUsa0JBb0gzQjtBQUVEOztJQUVHO0FBQ0gseUJBQStCLFFBQWtCO0tBQy9DTSxJQUFJQSxTQUFtQkEsQ0FBQ0E7S0FDeEJBLElBQUlBLFlBQVlBLENBQUNBO0tBQ2pCQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7U0FDakNBLElBQUlBLFFBQVFBLEdBQUdBLCtCQUFpQkEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0E7U0FDcERBLFNBQVNBLEdBQUdBLHNCQUFTQSxDQUFDQSxPQUFPQSxDQUFDQSxRQUFRQSxDQUFDQSxDQUFDQTtTQUN4Q0EsWUFBWUEsR0FBR0EsZ0JBQWdCQSxDQUFDQSxRQUFRQSxDQUFDQSxDQUFDQTtLQUM1Q0EsQ0FBQ0E7S0FBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLFFBQVFBLENBQUNBLFdBQVdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO1NBQzNDQSxTQUFTQSxHQUFHQSxVQUFDQSxhQUFhQSxJQUFLQSxvQkFBYUEsRUFBYkEsQ0FBYUEsQ0FBQ0E7U0FDN0NBLFlBQVlBLEdBQUdBLENBQUNBLFVBQVVBLENBQUNBLE9BQU9BLENBQUNBLFNBQUdBLENBQUNBLEdBQUdBLENBQUNBLFFBQVFBLENBQUNBLFdBQVdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO0tBQ3JFQSxDQUFDQTtLQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7U0FDMUNBLFNBQVNBLEdBQUdBLFFBQVFBLENBQUNBLFVBQVVBLENBQUNBO1NBQ2hDQSxZQUFZQSxHQUFHQSxzQkFBc0JBLENBQUNBLFFBQVFBLENBQUNBLFVBQVVBLEVBQUVBLFFBQVFBLENBQUNBLFlBQVlBLENBQUNBLENBQUNBO0tBQ3BGQSxDQUFDQTtLQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUNOQSxTQUFTQSxHQUFHQSxjQUFNQSxlQUFRQSxDQUFDQSxRQUFRQSxFQUFqQkEsQ0FBaUJBLENBQUNBO1NBQ3BDQSxZQUFZQSxHQUFHQSxXQUFXQSxDQUFDQTtLQUM3QkEsQ0FBQ0E7S0FDREEsTUFBTUEsQ0FBQ0EsSUFBSUEsZUFBZUEsQ0FBQ0EsU0FBU0EsRUFBRUEsWUFBWUEsQ0FBQ0EsQ0FBQ0E7QUFDdERBLEVBQUNBO0FBbEJlLHVCQUFjLGlCQWtCN0I7QUFFRDs7Ozs7SUFLRztBQUNILDBCQUFnQyxRQUFrQjtLQUNoREMsTUFBTUEsQ0FBQ0EsSUFBSUEsaUJBQWlCQSxDQUFDQSxTQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxRQUFRQSxDQUFDQSxLQUFLQSxDQUFDQSxFQUFFQSxDQUFDQSxjQUFjQSxDQUFDQSxRQUFRQSxDQUFDQSxDQUFDQSxFQUFFQSxLQUFLQSxDQUFDQSxDQUFDQTtBQUMzRkEsRUFBQ0E7QUFGZSx3QkFBZSxrQkFFOUI7QUFFRDs7SUFFRztBQUNILDJCQUFpQyxTQUF5QztLQUN4RUMsSUFBSUEsVUFBVUEsR0FBR0Esc0JBQXNCQSxDQUFDQSxtQkFBbUJBLENBQ3ZEQSxTQUFTQSxFQUFFQSxJQUFJQSxHQUFHQSxFQUF1REEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDaEZBLE1BQU1BLENBQUNBLFVBQVVBLENBQUNBLEdBQUdBLENBQUNBLFdBQUNBO1NBQ3JCQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxZQUFZQSxtQkFBbUJBLENBQUNBLENBQUNBLENBQUNBO2FBQ3JDQSxNQUFNQSxDQUFDQSxJQUFJQSxpQkFBaUJBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLGVBQWVBLENBQUNBLEVBQUVBLEtBQUtBLENBQUNBLENBQUNBO1NBRWxFQSxDQUFDQTtTQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTthQUNOQSxJQUFJQSxHQUFHQSxHQUEwQkEsQ0FBQ0EsQ0FBQ0E7YUFDbkNBLE1BQU1BLENBQUNBLElBQUlBLGlCQUFpQkEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsV0FBQ0EsSUFBSUEsUUFBQ0EsQ0FBQ0EsZUFBZUEsRUFBakJBLENBQWlCQSxDQUFDQSxFQUFFQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUNsRkEsQ0FBQ0E7S0FDSEEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7QUFDTEEsRUFBQ0E7QUFaZSx5QkFBZ0IsbUJBWS9CO0FBRUQ7Ozs7OztJQU1HO0FBQ0g7S0FDRUMsNkJBQW1CQSxHQUFRQSxFQUFTQSxlQUFnQ0E7U0FBakRDLFFBQUdBLEdBQUhBLEdBQUdBLENBQUtBO1NBQVNBLG9CQUFlQSxHQUFmQSxlQUFlQSxDQUFpQkE7S0FBR0EsQ0FBQ0E7S0FDMUVELDBCQUFDQTtBQUFEQSxFQUFDQSxJQUFBO0FBRUQsaUNBQWdDLGtCQUFvQztLQUNsRUUsTUFBTUEsQ0FBQ0EsdUJBQVVBLENBQUNBLE1BQU1BLENBQUNBLGtCQUFrQkEsQ0FBQ0EsQ0FBQ0E7QUFDL0NBLEVBQUNBO0FBRUQsOEJBQTZCLFNBQTJELEVBQzNELEdBQTZEO0tBRXhGQyxTQUFTQSxDQUFDQSxPQUFPQSxDQUFDQSxXQUFDQTtTQUNqQkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsWUFBWUEsV0FBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDdEJBLGtCQUFrQkEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBQ0EsUUFBUUEsRUFBRUEsQ0FBQ0EsRUFBQ0EsQ0FBQ0EsRUFBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0E7U0FFckRBLENBQUNBO1NBQUNBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLFlBQVlBLFFBQVFBLENBQUNBLENBQUNBLENBQUNBO2FBQ2pDQSxrQkFBa0JBLENBQUNBLENBQUNBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBO1NBRTdCQSxDQUFDQTtTQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxZQUFZQSxLQUFLQSxDQUFDQSxDQUFDQSxDQUFDQTthQUM5QkEsbUJBQW1CQSxDQUFDQSxDQUFDQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQTtTQUU5QkEsQ0FBQ0E7U0FBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsWUFBWUEsZUFBZUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDeENBLE1BQU1BLElBQUlBLGlDQUFvQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7U0FFMUNBLENBQUNBO1NBQUNBLElBQUlBLENBQUNBLENBQUNBO2FBQ05BLE1BQU1BLElBQUlBLGlDQUFvQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7U0FDcENBLENBQUNBO0tBQ0hBLENBQUNBLENBQUNBLENBQUNBO0tBRUhBLE1BQU1BLENBQUNBLEdBQUdBLENBQUNBO0FBQ2JBLEVBQUNBO0FBRUQsNkJBQTRCLENBQVcsRUFDWCxHQUE2RDtLQUN2RkMsSUFBSUEsR0FBR0EsR0FBR0EsU0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7S0FDM0JBLElBQUlBLE9BQU9BLEdBQUdBLGNBQWNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO0tBQ2hDQSxJQUFJQSxVQUFVQSxHQUFHQSxJQUFJQSxtQkFBbUJBLENBQUNBLEdBQUdBLEVBQUVBLE9BQU9BLENBQUNBLENBQUNBO0tBRXZEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQSxDQUFDQTtTQUNaQSxJQUFJQSxnQkFBZ0JBLEdBQUdBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBO1NBRXZDQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBZ0JBLFlBQVlBLEtBQUtBLENBQUNBLENBQUNBLENBQUNBO2FBQ3RDQSxnQkFBZ0JBLENBQUNBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBO1NBRXBDQSxDQUFDQTtTQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxjQUFPQSxDQUFDQSxnQkFBZ0JBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQ3JDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxFQUFFQSxDQUFDQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQTtTQUVoQ0EsQ0FBQ0E7U0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFDTkEsTUFBTUEsSUFBSUEsMERBQTZDQSxDQUFDQSxnQkFBZ0JBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBO1NBQy9FQSxDQUFDQTtLQUVIQSxDQUFDQTtLQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUNOQSxJQUFJQSxnQkFBZ0JBLEdBQUdBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBO1NBRXZDQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBZ0JBLFlBQVlBLEtBQUtBLENBQUNBLENBQUNBLENBQUNBO2FBQ3RDQSxNQUFNQSxJQUFJQSwwREFBNkNBLENBQUNBLGdCQUFnQkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7U0FDL0VBLENBQUNBO1NBRURBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLEVBQUVBLFVBQVVBLENBQUNBLENBQUNBO0tBQzlCQSxDQUFDQTtBQUNIQSxFQUFDQTtBQUVELGlDQUFnQyxlQUF5QixFQUFFLFlBQW1CO0tBQzVFQyxFQUFFQSxDQUFDQSxDQUFDQSxjQUFPQSxDQUFDQSxZQUFZQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtTQUMxQkEsTUFBTUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxlQUFlQSxDQUFDQSxDQUFDQTtLQUMzQ0EsQ0FBQ0E7S0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7U0FDTkEsSUFBSUEsTUFBTUEsR0FBWUEsWUFBWUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsV0FBQ0EsSUFBSUEsUUFBQ0EsQ0FBQ0EsQ0FBQ0EsRUFBSEEsQ0FBR0EsQ0FBQ0EsQ0FBQ0E7U0FDakRBLE1BQU1BLENBQUNBLFlBQVlBLENBQUNBLEdBQUdBLENBQUNBLFdBQUNBLElBQUlBLG9CQUFhQSxDQUFDQSxlQUFlQSxFQUFFQSxDQUFDQSxFQUFFQSxNQUFNQSxDQUFDQSxFQUF6Q0EsQ0FBeUNBLENBQUNBLENBQUNBO0tBQzFFQSxDQUFDQTtBQUNIQSxFQUFDQTtBQUVELDJCQUEwQixVQUFVO0tBQ2xDQyxJQUFJQSxNQUFNQSxHQUFHQSxzQkFBU0EsQ0FBQ0EsVUFBVUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsQ0FBQ0E7S0FDOUNBLEVBQUVBLENBQUNBLENBQUNBLGNBQU9BLENBQUNBLE1BQU1BLENBQUNBLENBQUNBO1NBQUNBLE1BQU1BLENBQUNBLEVBQUVBLENBQUNBO0tBQy9CQSxFQUFFQSxDQUFDQSxDQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxjQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtTQUN6QkEsTUFBTUEsSUFBSUEsOEJBQWlCQSxDQUFDQSxVQUFVQSxFQUFFQSxNQUFNQSxDQUFDQSxDQUFDQTtLQUNsREEsQ0FBQ0E7S0FDREEsTUFBTUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsVUFBQ0EsQ0FBUUEsSUFBS0Esb0JBQWFBLENBQUNBLFVBQVVBLEVBQUVBLENBQUNBLEVBQUVBLE1BQU1BLENBQUNBLEVBQXBDQSxDQUFvQ0EsQ0FBQ0EsQ0FBQ0E7QUFDeEVBLEVBQUNBO0FBRUQsd0JBQXVCLFVBQVUsRUFBRSxRQUFRLENBQUMsZUFBZSxFQUFFLE1BQWU7S0FDMUVDLElBQUlBLFFBQVFBLEdBQUdBLEVBQUVBLENBQUNBO0tBQ2xCQSxJQUFJQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQTtLQUNqQkEsSUFBSUEsUUFBUUEsR0FBR0EsS0FBS0EsQ0FBQ0E7S0FFckJBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLGNBQU9BLENBQUNBLFFBQVFBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO1NBQ3ZCQSxFQUFFQSxDQUFDQSxDQUFDQSxRQUFRQSxZQUFZQSx5QkFBY0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDdkNBLE1BQU1BLENBQUNBLGlCQUFpQkEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsS0FBS0EsRUFBRUEsUUFBUUEsRUFBRUEsSUFBSUEsRUFBRUEsSUFBSUEsRUFBRUEsUUFBUUEsQ0FBQ0EsQ0FBQ0E7U0FDM0VBLENBQUNBO1NBQUNBLElBQUlBLENBQUNBLENBQUNBO2FBQ05BLE1BQU1BLENBQUNBLGlCQUFpQkEsQ0FBQ0EsUUFBUUEsRUFBRUEsUUFBUUEsRUFBRUEsSUFBSUEsRUFBRUEsSUFBSUEsRUFBRUEsUUFBUUEsQ0FBQ0EsQ0FBQ0E7U0FDckVBLENBQUNBO0tBQ0hBLENBQUNBO0tBRURBLElBQUlBLG9CQUFvQkEsR0FBR0EsSUFBSUEsQ0FBQ0E7S0FDaENBLElBQUlBLG9CQUFvQkEsR0FBR0EsSUFBSUEsQ0FBQ0E7S0FFaENBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLFFBQVFBLENBQUNBLE1BQU1BLEVBQUVBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBO1NBQ3pDQSxJQUFJQSxhQUFhQSxHQUFHQSxRQUFRQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtTQUVoQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsYUFBYUEsWUFBWUEsV0FBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDbENBLEtBQUtBLEdBQUdBLGFBQWFBLENBQUNBO1NBRXhCQSxDQUFDQTtTQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxhQUFhQSxZQUFZQSx5QkFBY0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDbkRBLEtBQUtBLEdBQUdBLGFBQWFBLENBQUNBLEtBQUtBLENBQUNBO1NBRTlCQSxDQUFDQTtTQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxhQUFhQSxZQUFZQSwyQkFBZ0JBLENBQUNBLENBQUNBLENBQUNBO2FBQ3JEQSxRQUFRQSxHQUFHQSxJQUFJQSxDQUFDQTtTQUVsQkEsQ0FBQ0E7U0FBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsYUFBYUEsWUFBWUEsdUJBQVlBLENBQUNBLENBQUNBLENBQUNBO2FBQ2pEQSxvQkFBb0JBLEdBQUdBLGFBQWFBLENBQUNBO1NBRXZDQSxDQUFDQTtTQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxhQUFhQSxZQUFZQSx1QkFBWUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDakRBLG9CQUFvQkEsR0FBR0EsYUFBYUEsQ0FBQ0E7U0FFdkNBLENBQUNBO1NBQUNBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLGFBQWFBLFlBQVlBLDJCQUFnQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDckRBLG9CQUFvQkEsR0FBR0EsYUFBYUEsQ0FBQ0E7U0FFdkNBLENBQUNBO1NBQUNBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLGFBQWFBLFlBQVlBLDZCQUFrQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDdkRBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxhQUFhQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDbkNBLEtBQUtBLEdBQUdBLGFBQWFBLENBQUNBLEtBQUtBLENBQUNBO2FBQzlCQSxDQUFDQTthQUNEQSxRQUFRQSxDQUFDQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxDQUFDQTtTQUMvQkEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFREEsS0FBS0EsR0FBR0EsK0JBQWlCQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQTtLQUVqQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO1NBQ3JCQSxNQUFNQSxDQUFDQSxpQkFBaUJBLENBQUNBLEtBQUtBLEVBQUVBLFFBQVFBLEVBQUVBLG9CQUFvQkEsRUFBRUEsb0JBQW9CQSxFQUFFQSxRQUFRQSxDQUFDQSxDQUFDQTtLQUNsR0EsQ0FBQ0E7S0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7U0FDTkEsTUFBTUEsSUFBSUEsOEJBQWlCQSxDQUFDQSxVQUFVQSxFQUFFQSxNQUFNQSxDQUFDQSxDQUFDQTtLQUNsREEsQ0FBQ0E7QUFDSEEsRUFBQ0E7QUFFRCw0QkFBMkIsS0FBSyxFQUFFLFFBQVEsRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFDM0QsUUFBUTtLQUNqQ0MsTUFBTUEsQ0FBQ0EsSUFBSUEsVUFBVUEsQ0FBQ0EsU0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsRUFBRUEsUUFBUUEsRUFBRUEsb0JBQW9CQSxFQUFFQSxvQkFBb0JBLEVBQ3BFQSxRQUFRQSxDQUFDQSxDQUFDQTtBQUNsQ0EsRUFBQ0E7Ozs7Ozs7Ozs7OztBQ2pzQkQsK0NBQStCLEVBQXFCLENBQUM7QUFFckQsK0NBQStCLEVBQXFCLENBQUM7QUFBN0MsaUVBQTZDO0FBRXJEO0tBQW1DQyxpQ0FBS0E7S0FFdENBLHVCQUFtQkEsT0FBc0JBO1NBQTdCQyx1QkFBNkJBLEdBQTdCQSxjQUE2QkE7U0FDdkNBLGtCQUFNQSxPQUFPQSxDQUFDQSxDQUFDQTtTQURFQSxZQUFPQSxHQUFQQSxPQUFPQSxDQUFlQTtTQUV2Q0EsSUFBSUEsQ0FBQ0EsS0FBS0EsR0FBR0EsQ0FBTUEsSUFBSUEsS0FBS0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsS0FBS0EsQ0FBQ0E7S0FDL0NBLENBQUNBO0tBRURELGdDQUFRQSxHQUFSQSxjQUFxQkUsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDN0NGLG9CQUFDQTtBQUFEQSxFQUFDQSxFQVJrQyxLQUFLLEVBUXZDO0FBUlksc0JBQWEsZ0JBUXpCO0FBRUQ7O0lBRUc7QUFDSDtLQUFzQ0csb0NBQUtBO0tBR3pDQSwwQkFBb0JBLGVBQXVCQSxFQUFVQSxrQkFBa0JBLEVBQVVBLGNBQWVBLEVBQzVFQSxRQUFTQTtTQUMzQkMsa0JBQU1BLGVBQWVBLENBQUNBLENBQUNBO1NBRkxBLG9CQUFlQSxHQUFmQSxlQUFlQSxDQUFRQTtTQUFVQSx1QkFBa0JBLEdBQWxCQSxrQkFBa0JBO1NBQVVBLG1CQUFjQSxHQUFkQSxjQUFjQSxDQUFDQTtTQUM1RUEsYUFBUUEsR0FBUkEsUUFBUUEsQ0FBQ0E7U0FFM0JBLElBQUlBLENBQUNBLGFBQWFBLEdBQUdBLENBQU1BLElBQUlBLEtBQUtBLENBQUNBLGVBQWVBLENBQUNBLENBQUNBLENBQUNBLEtBQUtBLENBQUNBO0tBQy9EQSxDQUFDQTtLQUVERCxzQkFBSUEsNENBQWNBO2NBQWxCQSxjQUErQkUsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7OztRQUFBRjtLQUU3REEsc0JBQUlBLDBDQUFZQTtjQUFoQkEsY0FBMEJHLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLENBQUNBLENBQUNBOzs7UUFBQUg7S0FHdERBLHNCQUFJQSwrQ0FBaUJBO2NBQXJCQSxjQUErQkksTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxDQUFDQSxDQUFDQTs7O1FBQUFKO0tBRWhFQSxzQkFBSUEsMkNBQWFBO2NBQWpCQSxjQUEyQkssTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7OztRQUFBTDtLQUd4REEsc0JBQUlBLHFDQUFPQTtjQUFYQSxjQUFxQk0sTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7OztRQUFBTjtLQUU1Q0Esc0JBQUlBLHFDQUFPQTtjQUFYQSxjQUF3Qk8sTUFBTUEsQ0FBQ0Esb0NBQWdCQSxDQUFDQSxpQkFBaUJBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLENBQUNBOzs7UUFBQVA7S0FFMUVBLG1DQUFRQSxHQUFSQSxjQUFxQlEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDN0NSLHVCQUFDQTtBQUFEQSxFQUFDQSxFQXhCcUMsS0FBSyxFQXdCMUM7QUF4QlkseUJBQWdCLG1CQXdCNUI7QUFFRCx3QkFBOEIsT0FBZ0I7S0FDNUNTLE1BQU1BLENBQUNBLElBQUlBLFNBQVNBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBO0FBQ2hDQSxFQUFDQTtBQUZlLHNCQUFhLGdCQUU1QjtBQUVEO0tBQ0VDLE1BQU1BLElBQUlBLGFBQWFBLENBQUNBLGVBQWVBLENBQUNBLENBQUNBO0FBQzNDQSxFQUFDQTtBQUZlLHNCQUFhLGdCQUU1Qjs7Ozs7OztBQ2pERCxrQ0FBd0MsQ0FBMEIsQ0FBQztBQUNuRSx3Q0FBOEMsRUFBZ0MsQ0FBQztBQUMvRSx3Q0FBOEMsRUFBZ0MsQ0FBQztBQUUvRTtLQUFBQztTQUNFQyxRQUFHQSxHQUFVQSxFQUFFQSxDQUFDQTtLQUtsQkEsQ0FBQ0E7S0FKQ0QsMEJBQUdBLEdBQUhBLFVBQUlBLENBQU1BLElBQVVFLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO0tBQ3ZDRiwrQkFBUUEsR0FBUkEsVUFBU0EsQ0FBTUEsSUFBVUcsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDNUNILCtCQUFRQSxHQUFSQSxVQUFTQSxDQUFNQSxJQUFVSSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUM1Q0osa0NBQVdBLEdBQVhBLGNBQWNLLENBQUNBOztLQUNqQkwsbUJBQUNBO0FBQURBLEVBQUNBLElBQUE7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFvQkc7QUFDSDtLQUNFTSwwQkFBb0JBLE9BQVlBLEVBQVVBLGlCQUFpQ0E7U0FBekNDLGlDQUF5Q0EsR0FBekNBLHdCQUF5Q0E7U0FBdkRBLFlBQU9BLEdBQVBBLE9BQU9BLENBQUtBO1NBQVVBLHNCQUFpQkEsR0FBakJBLGlCQUFpQkEsQ0FBZ0JBO0tBQUdBLENBQUNBO0tBRXhFRCxrQ0FBaUJBLEdBQXhCQSxVQUF5QkEsU0FBY0EsRUFBRUEsVUFBc0JBLEVBQUVBLE1BQXFCQTtTQUE3Q0UsMEJBQXNCQSxHQUF0QkEsaUJBQXNCQTtTQUFFQSxzQkFBcUJBLEdBQXJCQSxhQUFxQkE7U0FDcEZBLElBQUlBLENBQUNBLEdBQUdBLElBQUlBLFlBQVlBLEVBQUVBLENBQUNBO1NBQzNCQSxJQUFJQSxDQUFDQSxHQUFHQSxJQUFJQSxnQkFBZ0JBLENBQUNBLENBQUNBLEVBQUVBLEtBQUtBLENBQUNBLENBQUNBO1NBQ3ZDQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxTQUFTQSxFQUFFQSxVQUFVQSxFQUFFQSxNQUFNQSxDQUFDQSxDQUFDQTtTQUN0Q0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7S0FDMUJBLENBQUNBO0tBRURGLCtCQUFJQSxHQUFKQSxVQUFLQSxTQUFjQSxFQUFFQSxVQUFzQkEsRUFBRUEsTUFBcUJBO1NBQTdDRywwQkFBc0JBLEdBQXRCQSxpQkFBc0JBO1NBQUVBLHNCQUFxQkEsR0FBckJBLGFBQXFCQTtTQUNoRUEsSUFBSUEsaUJBQWlCQSxHQUFHQSxJQUFJQSxDQUFDQSxzQkFBc0JBLENBQUNBLFNBQVNBLENBQUNBLENBQUNBO1NBQy9EQSxJQUFJQSxhQUFhQSxHQUFHQSxJQUFJQSxDQUFDQSxrQkFBa0JBLENBQUNBLFNBQVNBLENBQUNBLENBQUNBO1NBQ3ZEQSxJQUFJQSxPQUFPQSxHQUFHQSxJQUFJQSxDQUFDQSxZQUFZQSxDQUFDQSxTQUFTQSxDQUFDQSxDQUFDQTtTQUUzQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsZ0JBQWNBLElBQUlBLENBQUNBLGVBQWVBLENBQUNBLFNBQVNBLENBQUdBLENBQUNBLENBQUNBO1NBRXZFQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsVUFBVUEsQ0FBQ0EsSUFBSUEsY0FBT0EsQ0FBQ0EsYUFBYUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDcERBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLFFBQVFBLENBQUNBLGFBQWFBLENBQUNBLENBQUNBO2FBQ3JDQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxRQUFRQSxDQUFDQSxJQUFJQSxDQUFDQSxlQUFlQSxDQUFDQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQTtTQUMxREEsQ0FBQ0E7U0FFREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQ3RCQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxRQUFRQSxDQUFDQSxhQUFXQSxNQUFRQSxDQUFDQSxDQUFDQTtTQUM3Q0EsQ0FBQ0E7U0FFREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDakNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLFFBQVFBLENBQUNBLHlCQUF1QkEsSUFBSUEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsaUJBQWlCQSxDQUFHQSxDQUFDQSxDQUFDQTtTQUMxRkEsQ0FBQ0E7U0FFREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLGFBQWFBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQzdCQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxRQUFRQSxDQUFDQSxzQkFBc0JBLENBQUNBLENBQUNBO2FBQzlDQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxRQUFRQSxDQUFDQSxJQUFJQSxDQUFDQSxlQUFlQSxDQUFDQSxhQUFhQSxDQUFDQSxDQUFDQSxDQUFDQTtTQUM3REEsQ0FBQ0E7U0FFREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQ3ZCQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxRQUFRQSxDQUFDQSxnQkFBZ0JBLENBQUNBLENBQUNBO2FBQ3hDQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxRQUFRQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQTtTQUNqQ0EsQ0FBQ0E7U0FFREEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsV0FBV0EsRUFBRUEsQ0FBQ0E7U0FFM0JBLGdGQUFnRkE7U0FDaEZBLGtGQUFrRkE7U0FDbEZBLEVBQUVBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLGlCQUFpQkEsQ0FBQ0E7YUFBQ0EsTUFBTUEsU0FBU0EsQ0FBQ0E7S0FDOUNBLENBQUNBO0tBRURILGdCQUFnQkE7S0FDaEJBLDBDQUFlQSxHQUFmQSxVQUFnQkEsU0FBY0E7U0FDNUJJLE1BQU1BLENBQUNBLFNBQVNBLFlBQVlBLDZCQUFnQkEsR0FBR0EsU0FBU0EsQ0FBQ0EsY0FBY0EsR0FBR0EsU0FBU0EsQ0FBQ0EsUUFBUUEsRUFBRUEsQ0FBQ0E7S0FDakdBLENBQUNBO0tBRURKLGdCQUFnQkE7S0FDaEJBLDBDQUFlQSxHQUFmQSxVQUFnQkEsVUFBZUE7U0FDN0JLLE1BQU1BLENBQUNBLCtCQUFrQkEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsR0FBV0EsVUFBV0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsMkJBQTJCQSxDQUFDQTthQUNyREEsVUFBVUEsQ0FBQ0EsUUFBUUEsRUFBRUEsQ0FBQ0E7S0FDaEVBLENBQUNBO0tBRURMLGdCQUFnQkE7S0FDaEJBLHVDQUFZQSxHQUFaQSxVQUFhQSxTQUFjQTtTQUN6Qk0sSUFBSUEsQ0FBQ0E7YUFDSEEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsWUFBWUEsNkJBQWdCQSxDQUFDQSxDQUFDQTtpQkFBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7YUFDMURBLE1BQU1BLENBQUNBLGdCQUFTQSxDQUFDQSxTQUFTQSxDQUFDQSxPQUFPQSxDQUFDQSxHQUFHQSxTQUFTQSxDQUFDQSxPQUFPQTtpQkFDakJBLElBQUlBLENBQUNBLFlBQVlBLENBQUNBLFNBQVNBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsQ0FBQ0E7U0FDdkZBLENBQUVBO1NBQUFBLEtBQUtBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQ1hBLGtGQUFrRkE7YUFDbEZBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBO1NBQ2RBLENBQUNBO0tBQ0hBLENBQUNBO0tBRUROLGdCQUFnQkE7S0FDaEJBLGlEQUFzQkEsR0FBdEJBLFVBQXVCQSxTQUFjQTtTQUNuQ08sRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsWUFBWUEsNkJBQWdCQSxDQUFDQSxDQUFDQTthQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQTtTQUUxREEsSUFBSUEsQ0FBQ0EsR0FBR0EsU0FBU0EsQ0FBQ0EsaUJBQWlCQSxDQUFDQTtTQUNwQ0EsT0FBT0EsQ0FBQ0EsWUFBWUEsNkJBQWdCQSxJQUFJQSxnQkFBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxFQUFFQSxDQUFDQTthQUN2RUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsaUJBQWlCQSxDQUFDQTtTQUMxQkEsQ0FBQ0E7U0FFREEsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDWEEsQ0FBQ0E7S0FFRFAsZ0JBQWdCQTtLQUNoQkEsNkNBQWtCQSxHQUFsQkEsVUFBbUJBLFNBQWNBO1NBQy9CUSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxTQUFTQSxZQUFZQSw2QkFBZ0JBLENBQUNBLENBQUNBO2FBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBO1NBRTFEQSxJQUFJQSxDQUFDQSxHQUFHQSxTQUFTQSxDQUFDQTtTQUNsQkEsSUFBSUEsS0FBS0EsR0FBR0EsU0FBU0EsQ0FBQ0EsYUFBYUEsQ0FBQ0E7U0FDcENBLE9BQU9BLENBQUNBLFlBQVlBLDZCQUFnQkEsSUFBSUEsZ0JBQVNBLENBQUNBLENBQUNBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsRUFBRUEsQ0FBQ0E7YUFDdkVBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLGlCQUFpQkEsQ0FBQ0E7YUFDeEJBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLFlBQVlBLDZCQUFnQkEsSUFBSUEsZ0JBQVNBLENBQUNBLENBQUNBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQ3BFQSxLQUFLQSxHQUFHQSxDQUFDQSxDQUFDQSxhQUFhQSxDQUFDQTthQUMxQkEsQ0FBQ0E7U0FDSEEsQ0FBQ0E7U0FFREEsTUFBTUEsQ0FBQ0EsS0FBS0EsQ0FBQ0E7S0FDZkEsQ0FBQ0E7S0FDSFIsdUJBQUNBO0FBQURBLEVBQUNBLElBQUE7QUFqR1kseUJBQWdCLG1CQWlHNUI7Ozs7Ozs7QUNoSUQsdUNBQXdCLEVBQWEsQ0FBQztBQUN0Qyx1Q0FBd0MsRUFBYSxDQUFDO0FBQTlDLDJDQUFTO0FBQUUscURBQW1DO0FBQ3RELHFEQUFxQyxFQUEyQixDQUFDO0FBRWpFOzs7SUFHRztBQUNRLGtCQUFTLEdBQUcsSUFBSSxxQkFBUyxDQUFDLElBQUksZ0RBQXNCLEVBQUUsQ0FBQyxDQUFDOzs7Ozs7O0FDVm5FLGtDQUF5QyxDQUEwQixDQUFDO0FBQ3BFLHdDQUE4QyxFQUFnQyxDQUFDO0FBQy9FLHdDQU9PLEVBQWdDLENBQUM7QUFNeEM7O0lBRUc7QUFDSDtLQUNFUyx3QkFBbUJBLFdBQW1CQSxFQUFTQSxVQUFvQkEsRUFBU0EsT0FBa0JBLEVBQzNFQSxVQUFrQkEsRUFBU0EsWUFBcUNBO1NBRGhFQyxnQkFBV0EsR0FBWEEsV0FBV0EsQ0FBUUE7U0FBU0EsZUFBVUEsR0FBVkEsVUFBVUEsQ0FBVUE7U0FBU0EsWUFBT0EsR0FBUEEsT0FBT0EsQ0FBV0E7U0FDM0VBLGVBQVVBLEdBQVZBLFVBQVVBLENBQVFBO1NBQVNBLGlCQUFZQSxHQUFaQSxZQUFZQSxDQUF5QkE7S0FBR0EsQ0FBQ0E7S0FDekZELHFCQUFDQTtBQUFEQSxFQUFDQSxJQUFBO0FBSFksdUJBQWMsaUJBRzFCO0FBRUQ7OztJQUdHO0FBQ0g7S0FhRUUsbUJBQVlBLHNCQUFzREE7U0FabEVDLGdCQUFnQkE7U0FDaEJBLG9CQUFlQSxHQUFHQSxJQUFJQSxnQkFBR0EsRUFBdUJBLENBQUNBO1NBQ2pEQSxnQkFBZ0JBO1NBQ2hCQSxhQUFRQSxHQUFHQSxJQUFJQSxnQkFBR0EsRUFBb0JBLENBQUNBO1NBQ3ZDQSxnQkFBZ0JBO1NBQ2hCQSxhQUFRQSxHQUFHQSxJQUFJQSxnQkFBR0EsRUFBb0JBLENBQUNBO1NBQ3ZDQSxnQkFBZ0JBO1NBQ2hCQSxhQUFRQSxHQUFHQSxJQUFJQSxnQkFBR0EsRUFBb0JBLENBQUNBO1NBTXJDQSxJQUFJQSxDQUFDQSxTQUFTQSxHQUFHQSxJQUFJQSxDQUFDQTtTQUN0QkEsSUFBSUEsQ0FBQ0Esc0JBQXNCQSxHQUFHQSxzQkFBc0JBLENBQUNBO0tBQ3ZEQSxDQUFDQTtLQUVERCx1Q0FBbUJBLEdBQW5CQSxjQUFpQ0UsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0Esc0JBQXNCQSxDQUFDQSxtQkFBbUJBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBO0tBRTVGRjs7O1FBR0dBO0tBQ0hBLDhCQUFVQSxHQUFWQSxjQUFxQkcsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsSUFBSUEsZ0JBQUdBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBO0tBRWxESDs7OztRQUlHQTtLQUNIQSxrQ0FBY0EsR0FBZEE7U0FBQUksaUJBTUNBO1NBTENBLEVBQUVBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLFNBQVNBLElBQUlBLElBQUlBLENBQUNBLENBQUNBLENBQUNBO2FBQzNCQSxNQUFNQSxJQUFJQSwwQkFBYUEsQ0FBQ0EsNEJBQTRCQSxDQUFDQSxDQUFDQTtTQUN4REEsQ0FBQ0E7U0FDREEsSUFBSUEsUUFBUUEsR0FBR0EsdUJBQVVBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLGVBQWVBLENBQUNBLENBQUNBO1NBQ3JEQSxNQUFNQSxDQUFDQSxRQUFRQSxDQUFDQSxNQUFNQSxDQUFDQSxhQUFHQSxJQUFJQSxRQUFDQSx1QkFBVUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsS0FBSUEsQ0FBQ0EsU0FBU0EsRUFBRUEsR0FBR0EsQ0FBQ0EsRUFBcENBLENBQW9DQSxDQUFDQSxDQUFDQTtLQUN0RUEsQ0FBQ0E7S0FFREosb0NBQWdCQSxHQUFoQkEsVUFBaUJBLElBQWNBLEVBQUVBLFFBQXdCQTtTQUN2REssSUFBSUEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsRUFBRUEsUUFBUUEsQ0FBQ0EsQ0FBQ0E7S0FDM0NBLENBQUNBO0tBRURMLGdDQUFZQSxHQUFaQSxVQUFhQSxJQUFVQSxFQUFFQSxRQUF3QkE7U0FDL0NNLElBQUlBLENBQUNBLGVBQWVBLENBQUNBLEdBQUdBLENBQUNBLElBQUlBLEVBQUVBLFFBQVFBLENBQUNBLENBQUNBO0tBQzNDQSxDQUFDQTtLQUVETixtQ0FBZUEsR0FBZkEsVUFBZ0JBLE9BQWtDQSxJQUFVTyxVQUFVQSxDQUFDQSxJQUFJQSxDQUFDQSxRQUFRQSxFQUFFQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUVqR1AsbUNBQWVBLEdBQWZBLFVBQWdCQSxPQUFrQ0EsSUFBVVEsVUFBVUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsUUFBUUEsRUFBRUEsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FFakdSLG1DQUFlQSxHQUFmQSxVQUFnQkEsT0FBa0NBLElBQVVTLFVBQVVBLENBQUNBLElBQUlBLENBQUNBLFFBQVFBLEVBQUVBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLENBQUNBO0tBRWpHVCwyQkFBT0EsR0FBUEEsVUFBUUEsSUFBVUE7U0FDaEJVLEVBQUVBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLHVCQUF1QkEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDdkNBLElBQUlBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLGtCQUFrQkEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsT0FBT0EsQ0FBQ0E7YUFDaERBLE1BQU1BLENBQUNBLGdCQUFTQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxHQUFHQSxHQUFHQSxJQUFJQSxDQUFDQTtTQUNyQ0EsQ0FBQ0E7U0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFDTkEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0Esc0JBQXNCQSxDQUFDQSxPQUFPQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUNuREEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFRFYsOEJBQVVBLEdBQVZBLFVBQVdBLFVBQXdCQTtTQUNqQ1csRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsVUFBVUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDekNBLElBQUlBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLGtCQUFrQkEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsQ0FBQ0EsVUFBVUEsQ0FBQ0E7YUFDekRBLE1BQU1BLENBQUNBLGdCQUFTQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxHQUFHQSxHQUFHQSxFQUFFQSxDQUFDQTtTQUNuQ0EsQ0FBQ0E7U0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFDTkEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0Esc0JBQXNCQSxDQUFDQSxVQUFVQSxDQUFDQSxVQUFVQSxDQUFDQSxDQUFDQTtTQUM1REEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFRFgsK0JBQVdBLEdBQVhBLFVBQVlBLFVBQXdCQTtTQUNsQ1ksRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsVUFBVUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDekNBLElBQUlBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLGtCQUFrQkEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0E7YUFDMURBLE1BQU1BLENBQUNBLGdCQUFTQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxHQUFHQSxHQUFHQSxFQUFFQSxDQUFDQTtTQUNuQ0EsQ0FBQ0E7U0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFDTkEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0Esc0JBQXNCQSxDQUFDQSxXQUFXQSxDQUFDQSxVQUFVQSxDQUFDQSxDQUFDQTtTQUM3REEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFRFosZ0NBQVlBLEdBQVpBLFVBQWFBLFVBQXdCQTtTQUNuQ2EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsVUFBVUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDekNBLElBQUlBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLGtCQUFrQkEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsQ0FBQ0EsWUFBWUEsQ0FBQ0E7YUFDM0RBLE1BQU1BLENBQUNBLGdCQUFTQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxHQUFHQSxHQUFHQSxFQUFFQSxDQUFDQTtTQUNuQ0EsQ0FBQ0E7U0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFDTkEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0Esc0JBQXNCQSxDQUFDQSxZQUFZQSxDQUFDQSxVQUFVQSxDQUFDQSxDQUFDQTtTQUM5REEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFRGIsOEJBQVVBLEdBQVZBLFVBQVdBLElBQVVBO1NBQ25CYyxFQUFFQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxlQUFlQSxDQUFDQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNuQ0EsSUFBSUEsR0FBR0EsR0FBR0EsSUFBSUEsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxVQUFVQSxDQUFDQTthQUNuREEsTUFBTUEsQ0FBQ0EsZ0JBQVNBLENBQUNBLEdBQUdBLENBQUNBLEdBQUdBLEdBQUdBLEdBQUdBLEVBQUVBLENBQUNBO1NBQ25DQSxDQUFDQTtTQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTthQUNOQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxzQkFBc0JBLENBQUNBLFVBQVVBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO1NBQ3REQSxDQUFDQTtLQUNIQSxDQUFDQTtLQUVEZCwwQkFBTUEsR0FBTkEsVUFBT0EsSUFBWUE7U0FDakJlLEVBQUVBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLEdBQUdBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQzVCQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxRQUFRQSxDQUFDQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUNqQ0EsQ0FBQ0E7U0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFDTkEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0Esc0JBQXNCQSxDQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUNsREEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFRGYsMEJBQU1BLEdBQU5BLFVBQU9BLElBQVlBO1NBQ2pCZ0IsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDNUJBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLEdBQUdBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO1NBQ2pDQSxDQUFDQTtTQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTthQUNOQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxzQkFBc0JBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLENBQUNBO1NBQ2xEQSxDQUFDQTtLQUNIQSxDQUFDQTtLQUVEaEIsMEJBQU1BLEdBQU5BLFVBQU9BLElBQVlBO1NBQ2pCaUIsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDNUJBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLEdBQUdBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO1NBQ2pDQSxDQUFDQTtTQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTthQUNOQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxzQkFBc0JBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLENBQUNBO1NBQ2xEQSxDQUFDQTtLQUNIQSxDQUFDQTtLQUVEakIsZ0JBQWdCQTtLQUNoQkEsc0NBQWtCQSxHQUFsQkEsVUFBbUJBLFVBQVVBO1NBQzNCa0IsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQzlCQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxHQUFHQSxDQUFDQSxVQUFVQSxDQUFDQSxDQUFDQTtTQUNqQ0EsQ0FBQ0E7U0FDREEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsVUFBVUEsQ0FBQ0EsQ0FBQ0E7S0FDOUNBLENBQUNBO0tBRURsQixnQkFBZ0JBO0tBQ2hCQSwyQ0FBdUJBLEdBQXZCQSxVQUF3QkEsVUFBVUEsSUFBSW1CLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLGVBQWVBLENBQUNBLEdBQUdBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO0tBRXBGbkIsNkJBQVNBLEdBQVRBLFVBQVVBLElBQVVBLElBQVlvQixNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxzQkFBc0JBLENBQUNBLFNBQVNBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO0tBQ3ZGcEIsZ0JBQUNBO0FBQURBLEVBQUNBLElBQUE7QUF0SVksa0JBQVMsWUFzSXJCO0FBRUQscUJBQW9CLE1BQXFCLEVBQUUsTUFBaUM7S0FDMUVxQiw2QkFBZ0JBLENBQUNBLE9BQU9BLENBQUNBLE1BQU1BLEVBQUVBLFVBQUNBLENBQUNBLEVBQUVBLENBQUNBLElBQUtBLGFBQU1BLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLEVBQWhCQSxDQUFnQkEsQ0FBQ0EsQ0FBQ0E7QUFDL0RBLEVBQUNBOzs7Ozs7O0FDcktELGtDQU9PLENBQTBCLENBQUM7QUFDbEMsd0NBQTRCLEVBQWdDLENBQUM7QUFJN0Q7S0FHRUMsZ0NBQVlBLE9BQWFBO1NBQUlDLElBQUlBLENBQUNBLFFBQVFBLEdBQUdBLGdCQUFTQSxDQUFDQSxPQUFPQSxDQUFDQSxHQUFHQSxPQUFPQSxHQUFHQSxhQUFNQSxDQUFDQSxPQUFPQSxDQUFDQTtLQUFDQSxDQUFDQTtLQUU3RkQsb0RBQW1CQSxHQUFuQkEsY0FBaUNFLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBO0tBRS9DRix3Q0FBT0EsR0FBUEEsVUFBUUEsQ0FBZUE7U0FDckJHLE1BQU1BLENBQUNBLENBQUNBLENBQUNBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBO2FBQ2pCQSxLQUFLQSxDQUFDQTtpQkFDSkEsTUFBTUEsQ0FBQ0EsY0FBTUEsV0FBSUEsQ0FBQ0EsRUFBRUEsRUFBUEEsQ0FBT0EsQ0FBQ0E7YUFDdkJBLEtBQUtBLENBQUNBO2lCQUNKQSxNQUFNQSxDQUFDQSxVQUFDQSxFQUFFQSxJQUFLQSxXQUFJQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFUQSxDQUFTQSxDQUFDQTthQUMzQkEsS0FBS0EsQ0FBQ0E7aUJBQ0pBLE1BQU1BLENBQUNBLFVBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLElBQUtBLFdBQUlBLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLENBQUNBLEVBQWJBLENBQWFBLENBQUNBO2FBQ25DQSxLQUFLQSxDQUFDQTtpQkFDSkEsTUFBTUEsQ0FBQ0EsVUFBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsSUFBS0EsV0FBSUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsRUFBakJBLENBQWlCQSxDQUFDQTthQUMzQ0EsS0FBS0EsQ0FBQ0E7aUJBQ0pBLE1BQU1BLENBQUNBLFVBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLElBQUtBLFdBQUlBLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLENBQUNBLEVBQXJCQSxDQUFxQkEsQ0FBQ0E7YUFDbkRBLEtBQUtBLENBQUNBO2lCQUNKQSxNQUFNQSxDQUFDQSxVQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxJQUFLQSxXQUFJQSxDQUFDQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxDQUFDQSxFQUF6QkEsQ0FBeUJBLENBQUNBO2FBQzNEQSxLQUFLQSxDQUFDQTtpQkFDSkEsTUFBTUEsQ0FBQ0EsVUFBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsSUFBS0EsV0FBSUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsRUFBN0JBLENBQTZCQSxDQUFDQTthQUNuRUEsS0FBS0EsQ0FBQ0E7aUJBQ0pBLE1BQU1BLENBQUNBLFVBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLElBQUtBLFdBQUlBLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLENBQUNBLEVBQWpDQSxDQUFpQ0EsQ0FBQ0E7YUFDM0VBLEtBQUtBLENBQUNBO2lCQUNKQSxNQUFNQSxDQUFDQSxVQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxJQUFLQSxXQUFJQSxDQUFDQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxDQUFDQSxFQUFyQ0EsQ0FBcUNBLENBQUNBO2FBQ25GQSxLQUFLQSxDQUFDQTtpQkFDSkEsTUFBTUEsQ0FBQ0EsVUFBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsSUFBS0EsV0FBSUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsRUFBekNBLENBQXlDQSxDQUFDQTthQUMzRkEsS0FBS0EsRUFBRUE7aUJBQ0xBLE1BQU1BLENBQUNBLFVBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEdBQUdBOzRCQUNwQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsR0FBR0EsQ0FBQ0E7aUJBQTlDQSxDQUE4Q0EsQ0FBQ0E7YUFDNURBLEtBQUtBLEVBQUVBO2lCQUNMQSxNQUFNQSxDQUFDQSxVQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQTs0QkFDekNBLElBQUlBLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBO2lCQUFuREEsQ0FBbURBLENBQUNBO2FBQ2pFQSxLQUFLQSxFQUFFQTtpQkFDTEEsTUFBTUEsQ0FBQ0EsVUFBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0E7NEJBQzlDQSxJQUFJQSxDQUFDQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQTtpQkFBeERBLENBQXdEQSxDQUFDQTthQUN0RUEsS0FBS0EsRUFBRUE7aUJBQ0xBLE1BQU1BLENBQUNBLFVBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBOzRCQUNuREEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0E7aUJBQTdEQSxDQUE2REEsQ0FBQ0E7YUFDM0VBLEtBQUtBLEVBQUVBO2lCQUNMQSxNQUFNQSxDQUFDQSxVQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQTs0QkFDeERBLElBQUlBLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBO2lCQUFsRUEsQ0FBa0VBLENBQUNBO2FBQ2hGQSxLQUFLQSxFQUFFQTtpQkFDTEEsTUFBTUEsQ0FBQ0EsVUFBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0E7NEJBQzdEQSxJQUFJQSxDQUFDQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQTtpQkFBdkVBLENBQXVFQSxDQUFDQTthQUNyRkEsS0FBS0EsRUFBRUE7aUJBQ0xBLE1BQU1BLENBQUNBLFVBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBOzRCQUNsRUEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0E7aUJBQTVFQSxDQUE0RUEsQ0FBQ0E7YUFDMUZBLEtBQUtBLEVBQUVBO2lCQUNMQSxNQUFNQSxDQUFDQSxVQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQTs0QkFDdkVBLElBQUlBLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQ3JFQSxHQUFHQSxDQUFDQTtpQkFEVkEsQ0FDVUEsQ0FBQ0E7YUFDeEJBLEtBQUtBLEVBQUVBO2lCQUNMQSxNQUFNQSxDQUFDQSxVQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQTs0QkFDNUVBLElBQUlBLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQzFFQSxHQUFHQSxDQUFDQTtpQkFEVkEsQ0FDVUEsQ0FBQ0E7YUFDeEJBLEtBQUtBLEVBQUVBO2lCQUNMQSxNQUFNQSxDQUFDQSxVQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUMvRUEsR0FBR0E7NEJBQUtBLElBQUlBLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQ3JFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQTtpQkFEcEJBLENBQ29CQSxDQUFDQTthQUN2Q0EsS0FBS0EsRUFBRUE7aUJBQ0xBLE1BQU1BLENBQUNBLFVBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQy9FQSxHQUFHQSxFQUFFQSxHQUFHQTs0QkFBS0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEs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QThCQSxDQUFDQTtTQUVuQ0EsSUFBSUEsSUFBSUEsR0FBR0EsRUFBRUEsQ0FBQ0E7U0FDZEEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsT0FBT0EsRUFBRUEsTUFBTUEsS0FBS0EsSUFBSUEsRUFBRUEsTUFBTUEsR0FBR0EsTUFBTUEsQ0FBQ0EsS0FBS0EsRUFBRUEsQ0FBQ0E7YUFDbkVBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBO1NBQ3BCQSxDQUFDQTtTQUVEQSxJQUFJQSxRQUFRQSxHQUFHQSxFQUFFQSxDQUFDQTtTQUNsQkEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsZUFBZUEsRUFBRUEsTUFBTUEsS0FBS0EsSUFBSUEsRUFBRUEsTUFBTUEsR0FBR0EsTUFBTUEsQ0FBQ0EsYUFBYUEsRUFBRUEsQ0FBQ0E7YUFDbkZBLFFBQVFBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBO1NBQ3hCQSxDQUFDQTtTQUVEQSxJQUFJQSxTQUFTQSxHQUFHQSxFQUFFQSxDQUFDQTtTQUNuQkEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsY0FBY0EsRUFBRUEsTUFBTUEsS0FBS0EsSUFBSUEsRUFBRUEsTUFBTUEsR0FBR0EsTUFBTUEsQ0FBQ0EsVUFBVUEsRUFBRUEsQ0FBQ0E7YUFDL0VBLFNBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBO1NBQ3pCQSxDQUFDQTtTQUNEQSxJQUFJQSxLQUFLQSxHQUFHQSxFQUFFQSxDQUFDQTtTQUNmQSxHQUFHQSxDQUFDQSxDQUFDQSxNQUFNQSxHQUFHQSxJQUFJQSxDQUFDQSxVQUFVQSxFQUFFQSxNQUFNQSxLQUFLQSxJQUFJQSxFQUFFQSxNQUFNQSxHQUFHQSxNQUFNQSxDQUFDQSxVQUFVQSxFQUFFQSxDQUFDQTthQUMzRUEsS0FBS0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0E7U0FDckJBLENBQUNBO1NBRURBLElBQUlBLFFBQVFBLEdBQUdBLEVBQUVBLENBQUNBO1NBQ2xCQSxHQUFHQSxDQUFDQSxDQUFDQSxNQUFNQSxHQUFHQSxJQUFJQSxDQUFDQSxhQUFhQSxFQUFFQSxNQUFNQSxLQUFLQSxJQUFJQSxFQUFFQSxNQUFNQSxHQUFHQSxNQUFNQSxDQUFDQSxZQUFZQSxFQUFFQSxDQUFDQTthQUNoRkEsUUFBUUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0E7U0FDeEJBLENBQUNBO1NBRURBLE1BQU1BLENBQUNBLGNBQWNBLEdBQUdBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLElBQUlBLEdBQUdBLFlBQVlBLEdBQUdBLFFBQVFBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLElBQUlBO2FBQ25GQSxhQUFhQSxHQUFHQSxTQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxJQUFJQSxHQUFHQSxTQUFTQSxHQUFHQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxJQUFJQTthQUNqRkEsWUFBWUEsR0FBR0EsUUFBUUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0E7S0FDbkRBLENBQUNBO0tBQ0h6Qiw0QkFBQ0E7QUFBREEsRUFBQ0EsSUFBQTtBQTljWSw4QkFBcUIsd0JBOGNqQztBQUVEO0tBdUJFMEIsZ0NBQW1CQSxJQUFTQTtTQUFUQyxTQUFJQSxHQUFKQSxJQUFJQSxDQUFLQTtTQXRCNUJBLGlCQUFZQSxHQUFXQSxJQUFJQSxDQUFDQTtTQUM1QkEsa0JBQWFBLEdBQVdBLElBQUlBLENBQUNBO1NBRTdCQSxnQkFBZ0JBO1NBQ2hCQSxrQkFBYUEsR0FBMkJBLElBQUlBLENBQUNBO1NBQzdDQSxnQkFBZ0JBO1NBQ2hCQSxVQUFLQSxHQUEyQkEsSUFBSUEsQ0FBQ0E7U0FDckNBLGdCQUFnQkE7U0FDaEJBLFVBQUtBLEdBQTJCQSxJQUFJQSxDQUFDQTtTQUNyQ0EsZ0JBQWdCQTtTQUNoQkEsYUFBUUEsR0FBMkJBLElBQUlBLENBQUNBO1NBQ3hDQSxnQkFBZ0JBO1NBQ2hCQSxhQUFRQSxHQUEyQkEsSUFBSUEsQ0FBQ0E7U0FDeENBLGdCQUFnQkE7U0FDaEJBLGlCQUFZQSxHQUEyQkEsSUFBSUEsQ0FBQ0E7U0FDNUNBLGdCQUFnQkE7U0FDaEJBLGlCQUFZQSxHQUEyQkEsSUFBSUEsQ0FBQ0E7U0FDNUNBLGdCQUFnQkE7U0FDaEJBLGVBQVVBLEdBQTJCQSxJQUFJQSxDQUFDQTtTQUMxQ0EsZ0JBQWdCQTtTQUNoQkEsZUFBVUEsR0FBMkJBLElBQUlBLENBQUNBO0tBRVhBLENBQUNBO0tBRWhDRCx5Q0FBUUEsR0FBUkE7U0FDRUUsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsYUFBYUEsS0FBS0EsSUFBSUEsQ0FBQ0EsWUFBWUE7YUFDcENBLGdCQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQTthQUNwQkEsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLEdBQUdBLEdBQUdBLGdCQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxHQUFHQSxJQUFJQTtpQkFDN0RBLGdCQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxZQUFZQSxDQUFDQSxHQUFHQSxHQUFHQSxDQUFDQTtLQUNwREEsQ0FBQ0E7S0FDSEYsNkJBQUNBO0FBQURBLEVBQUNBLElBQUE7QUEvQlksK0JBQXNCLHlCQStCbEM7QUFFRCxzRkFBcUY7QUFDckY7S0FBQUc7U0FDRUMsZ0JBQWdCQTtTQUNoQkEsVUFBS0EsR0FBMkJBLElBQUlBLENBQUNBO1NBQ3JDQSxnQkFBZ0JBO1NBQ2hCQSxVQUFLQSxHQUEyQkEsSUFBSUEsQ0FBQ0E7S0FpRXZDQSxDQUFDQTtLQS9EQ0Q7Ozs7UUFJR0E7S0FDSEEsc0NBQUdBLEdBQUhBLFVBQUlBLE1BQThCQTtTQUNoQ0UsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsS0FBS0EsS0FBS0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDeEJBLElBQUlBLENBQUNBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLEdBQUdBLE1BQU1BLENBQUNBO2FBQ2pDQSxNQUFNQSxDQUFDQSxRQUFRQSxHQUFHQSxJQUFJQSxDQUFDQTthQUN2QkEsTUFBTUEsQ0FBQ0EsUUFBUUEsR0FBR0EsSUFBSUEsQ0FBQ0E7U0FDekJBLENBQUNBO1NBQUNBLElBQUlBLENBQUNBLENBQUNBO2FBQ05BLGFBQWFBO2FBQ2JBLHVDQUF1Q0E7YUFDdkNBLDJGQUEyRkE7YUFDM0ZBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLFFBQVFBLEdBQUdBLE1BQU1BLENBQUNBO2FBQzdCQSxNQUFNQSxDQUFDQSxRQUFRQSxHQUFHQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQTthQUM3QkEsTUFBTUEsQ0FBQ0EsUUFBUUEsR0FBR0EsSUFBSUEsQ0FBQ0E7YUFDdkJBLElBQUlBLENBQUNBLEtBQUtBLEdBQUdBLE1BQU1BLENBQUNBO1NBQ3RCQSxDQUFDQTtLQUNIQSxDQUFDQTtLQUVERixrRkFBa0ZBO0tBQ2xGQSxvREFBb0RBO0tBQ3BEQSxzQ0FBR0EsR0FBSEEsVUFBSUEsSUFBU0EsRUFBRUEsVUFBa0JBO1NBQy9CRyxJQUFJQSxNQUE4QkEsQ0FBQ0E7U0FDbkNBLEdBQUdBLENBQUNBLENBQUNBLE1BQU1BLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLEVBQUVBLE1BQU1BLEtBQUtBLElBQUlBLEVBQUVBLE1BQU1BLEdBQUdBLE1BQU1BLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBO2FBQ3BFQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxVQUFVQSxLQUFLQSxJQUFJQSxJQUFJQSxVQUFVQSxHQUFHQSxNQUFNQSxDQUFDQSxZQUFZQSxDQUFDQTtpQkFDekRBLHFCQUFjQSxDQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxFQUFFQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDdENBLE1BQU1BLENBQUNBLE1BQU1BLENBQUNBO2FBQ2hCQSxDQUFDQTtTQUNIQSxDQUFDQTtTQUNEQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQTtLQUNkQSxDQUFDQTtLQUVESDs7OztRQUlHQTtLQUNIQSx5Q0FBTUEsR0FBTkEsVUFBT0EsTUFBOEJBO1NBQ25DSSxhQUFhQTtTQUNiQSxjQUFjQTtTQUNkQSwyREFBMkRBO1NBQzNEQSwyRkFBMkZBO1NBQzNGQSxpREFBaURBO1NBQ2pEQSxLQUFLQTtTQUNMQSxpQkFBaUJBO1NBQ2pCQSxLQUFLQTtTQUVMQSxJQUFJQSxJQUFJQSxHQUEyQkEsTUFBTUEsQ0FBQ0EsUUFBUUEsQ0FBQ0E7U0FDbkRBLElBQUlBLElBQUlBLEdBQTJCQSxNQUFNQSxDQUFDQSxRQUFRQSxDQUFDQTtTQUNuREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsS0FBS0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDbEJBLElBQUlBLENBQUNBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBO1NBQ3BCQSxDQUFDQTtTQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTthQUNOQSxJQUFJQSxDQUFDQSxRQUFRQSxHQUFHQSxJQUFJQSxDQUFDQTtTQUN2QkEsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsS0FBS0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDbEJBLElBQUlBLENBQUNBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBO1NBQ3BCQSxDQUFDQTtTQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTthQUNOQSxJQUFJQSxDQUFDQSxRQUFRQSxHQUFHQSxJQUFJQSxDQUFDQTtTQUN2QkEsQ0FBQ0E7U0FDREEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsS0FBS0EsS0FBS0EsSUFBSUEsQ0FBQ0E7S0FDN0JBLENBQUNBO0tBQ0hKLCtCQUFDQTtBQUFEQSxFQUFDQSxJQUFBO0FBRUQ7S0FBQUs7U0FDRUMsUUFBR0EsR0FBR0EsSUFBSUEsR0FBR0EsRUFBaUNBLENBQUNBO0tBa0RqREEsQ0FBQ0E7S0FoRENELDJCQUFHQSxHQUFIQSxVQUFJQSxNQUE4QkE7U0FDaENFLGlDQUFpQ0E7U0FDakNBLElBQUlBLEdBQUdBLEdBQUdBLGdCQUFTQSxDQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUVqQ0EsSUFBSUEsVUFBVUEsR0FBR0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7U0FDbkNBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUMzQkEsVUFBVUEsR0FBR0EsSUFBSUEsd0JBQXdCQSxFQUFFQSxDQUFDQTthQUM1Q0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsRUFBRUEsVUFBVUEsQ0FBQ0EsQ0FBQ0E7U0FDaENBLENBQUNBO1NBQ0RBLFVBQVVBLENBQUNBLEdBQUdBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBO0tBQ3pCQSxDQUFDQTtLQUVERjs7Ozs7O1FBTUdBO0tBQ0hBLDJCQUFHQSxHQUFIQSxVQUFJQSxLQUFVQSxFQUFFQSxVQUF5QkE7U0FBekJHLDBCQUF5QkEsR0FBekJBLGlCQUF5QkE7U0FDdkNBLElBQUlBLEdBQUdBLEdBQUdBLGdCQUFTQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQTtTQUUzQkEsSUFBSUEsVUFBVUEsR0FBR0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7U0FDbkNBLE1BQU1BLENBQUNBLGNBQU9BLENBQUNBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLEdBQUdBLFVBQVVBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLEVBQUVBLFVBQVVBLENBQUNBLENBQUNBO0tBQ3hFQSxDQUFDQTtLQUVESDs7OztRQUlHQTtLQUNIQSw4QkFBTUEsR0FBTkEsVUFBT0EsTUFBOEJBO1NBQ25DSSxJQUFJQSxHQUFHQSxHQUFHQSxnQkFBU0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7U0FDakNBLGFBQWFBO1NBQ2JBLHFDQUFxQ0E7U0FDckNBLElBQUlBLFVBQVVBLEdBQTZCQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQTtTQUM3REEsbURBQW1EQTtTQUNuREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsVUFBVUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDOUJBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLE1BQU1BLENBQUNBLEdBQUdBLENBQUNBLENBQUNBO1NBQ3ZCQSxDQUFDQTtTQUNEQSxNQUFNQSxDQUFDQSxNQUFNQSxDQUFDQTtLQUNoQkEsQ0FBQ0E7S0FFREosc0JBQUlBLGtDQUFPQTtjQUFYQSxjQUF5QkssTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsS0FBS0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7OztRQUFBTDtLQUV0REEsNkJBQUtBLEdBQUxBLGNBQVVNLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBO0tBRTdCTixnQ0FBUUEsR0FBUkEsY0FBcUJPLE1BQU1BLENBQUNBLGdCQUFnQkEsR0FBR0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBO0tBQzdFUCxvQkFBQ0E7QUFBREEsRUFBQ0EsSUFBQTs7Ozs7Ozs7Ozs7Ozs7OztBQ3ZvQkQsa0NBQXdDLENBQTBCLENBQUM7QUFDbkUsd0NBQTRCLEVBQWdDLENBQUM7QUFDN0Qsd0NBQTBCLEVBQWdDLENBQUM7QUFFM0QsZ0NBQXVFLENBQXNCLENBQUM7QUFrQjlGOztJQUVHO0FBQ0g7S0FHRVEseUJBQW1CQSxTQUFrQ0E7U0FBbENDLGNBQVNBLEdBQVRBLFNBQVNBLENBQXlCQTtLQUFHQSxDQUFDQTtLQUVsREQsc0JBQU1BLEdBQWJBLFVBQWNBLFNBQWtDQSxFQUFFQSxNQUF3QkE7U0FDeEVFLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUN0QkEsSUFBSUEsTUFBTUEsR0FBR0Esd0JBQVdBLENBQUNBLEtBQUtBLENBQUNBLE1BQU1BLENBQUNBLFNBQVNBLENBQUNBLENBQUNBO2FBQ2pEQSxTQUFTQSxHQUFHQSxTQUFTQSxDQUFDQSxNQUFNQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQTthQUNyQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsZUFBZUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0E7U0FDeENBLENBQUNBO1NBQUNBLElBQUlBLENBQUNBLENBQUNBO2FBQ05BLE1BQU1BLENBQUNBLElBQUlBLGVBQWVBLENBQUNBLFNBQVNBLENBQUNBLENBQUNBO1NBQ3hDQSxDQUFDQTtLQUNIQSxDQUFDQTtLQUVERjs7Ozs7Ozs7Ozs7Ozs7Ozs7O1FBa0JHQTtLQUNJQSxzQkFBTUEsR0FBYkEsVUFBY0EsU0FBa0NBO1NBQzlDRyxNQUFNQSxDQUFDQSxJQUFJQSxhQUFRQSxDQUFDQSxlQUFlQSxFQUFFQTthQUNuQ0EsVUFBVUEsRUFBRUEsVUFBQ0EsTUFBdUJBO2lCQUNsQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsY0FBT0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7cUJBQ3BCQSwwRkFBMEZBO3FCQUMxRkEsS0FBS0E7cUJBQ0xBLDZFQUE2RUE7cUJBQzdFQSxNQUFNQSxJQUFJQSwwQkFBYUEsQ0FBQ0EseURBQXlEQSxDQUFDQSxDQUFDQTtpQkFDckZBLENBQUNBO2lCQUNEQSxNQUFNQSxDQUFDQSxlQUFlQSxDQUFDQSxNQUFNQSxDQUFDQSxTQUFTQSxFQUFFQSxNQUFNQSxDQUFDQSxDQUFDQTthQUNuREEsQ0FBQ0E7YUFDREEsNkZBQTZGQTthQUM3RkEsSUFBSUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZUFBZUEsRUFBRUEsSUFBSUEscUJBQWdCQSxFQUFFQSxFQUFFQSxJQUFJQSxxQkFBZ0JBLEVBQUVBLENBQUNBLENBQUNBO1VBQzFFQSxDQUFDQSxDQUFDQTtLQUNMQSxDQUFDQTtLQUVESCw4QkFBSUEsR0FBSkEsVUFBS0EsRUFBVUE7U0FDYkksSUFBSUEsT0FBT0EsR0FBR0EsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsV0FBQ0EsSUFBSUEsUUFBQ0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBZEEsQ0FBY0EsQ0FBQ0EsQ0FBQ0E7U0FDdkRBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUN2QkEsTUFBTUEsQ0FBQ0EsT0FBT0EsQ0FBQ0E7U0FDakJBLENBQUNBO1NBQUNBLElBQUlBLENBQUNBLENBQUNBO2FBQ05BLE1BQU1BLElBQUlBLDBCQUFhQSxDQUFDQSw2Q0FBMkNBLEVBQUVBLE1BQUdBLENBQUNBLENBQUNBO1NBQzVFQSxDQUFDQTtLQUNIQSxDQUFDQTtLQXpESEo7U0FBQ0EsZUFBVUEsRUFBRUE7U0FDWkEsWUFBS0EsRUFBRUE7O3lCQXlEUEE7S0FBREEsc0JBQUNBO0FBQURBLEVBQUNBLElBQUE7QUF4RFksd0JBQWUsa0JBd0QzQjs7Ozs7Ozs7Ozs7Ozs7OztBQ25GRCx3Q0FBMkMsRUFBZ0MsQ0FBQztBQUM1RSxrQ0FBb0UsQ0FBMEIsQ0FBQztBQUMvRix3Q0FBNEIsRUFBZ0MsQ0FBQztBQUk3RDtLQUFBSztLQUtBQyxDQUFDQTtLQUhDRCwrQ0FBUUEsR0FBUkEsVUFBU0EsR0FBUUEsSUFBYUUsTUFBTUEsQ0FBQ0EsR0FBR0EsWUFBWUEsR0FBR0EsSUFBSUEsaUJBQVVBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO0tBRTdFRiw2Q0FBTUEsR0FBTkEsVUFBT0EsS0FBd0JBLElBQW9CRyxNQUFNQSxDQUFDQSxJQUFJQSxxQkFBcUJBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBO0tBSjFGSDtTQUFDQSxZQUFLQSxFQUFFQTs7c0NBS1BBO0tBQURBLG1DQUFDQTtBQUFEQSxFQUFDQSxJQUFBO0FBSlkscUNBQTRCLCtCQUl4QztBQUVEO0tBQUFJO1NBQ1VDLGFBQVFBLEdBQWtCQSxJQUFJQSxHQUFHQSxFQUFFQSxDQUFDQTtTQUNwQ0EsYUFBUUEsR0FBbUJBLElBQUlBLENBQUNBO1NBQ2hDQSxxQkFBZ0JBLEdBQW1CQSxJQUFJQSxDQUFDQTtTQUN4Q0EsaUJBQVlBLEdBQW1CQSxJQUFJQSxDQUFDQTtTQUNwQ0EsaUJBQVlBLEdBQW1CQSxJQUFJQSxDQUFDQTtTQUNwQ0EsbUJBQWNBLEdBQW1CQSxJQUFJQSxDQUFDQTtTQUN0Q0EsbUJBQWNBLEdBQW1CQSxJQUFJQSxDQUFDQTtTQUN0Q0Esa0JBQWFBLEdBQW1CQSxJQUFJQSxDQUFDQTtTQUNyQ0Esa0JBQWFBLEdBQW1CQSxJQUFJQSxDQUFDQTtLQXVUL0NBLENBQUNBO0tBclRDRCxzQkFBSUEsMENBQU9BO2NBQVhBO2FBQ0VFLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLGNBQWNBLEtBQUtBLElBQUlBLElBQUlBLElBQUlBLENBQUNBLFlBQVlBLEtBQUtBLElBQUlBO2lCQUMxREEsSUFBSUEsQ0FBQ0EsYUFBYUEsS0FBS0EsSUFBSUEsQ0FBQ0E7U0FDckNBLENBQUNBOzs7UUFBQUY7S0FFREEsMkNBQVdBLEdBQVhBLFVBQVlBLEVBQVlBO1NBQ3RCRyxJQUFJQSxNQUFzQkEsQ0FBQ0E7U0FDM0JBLEdBQUdBLENBQUNBLENBQUNBLE1BQU1BLEdBQUdBLElBQUlBLENBQUNBLFFBQVFBLEVBQUVBLE1BQU1BLEtBQUtBLElBQUlBLEVBQUVBLE1BQU1BLEdBQUdBLE1BQU1BLENBQUNBLEtBQUtBLEVBQUVBLENBQUNBO2FBQ3BFQSxFQUFFQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQTtTQUNiQSxDQUFDQTtLQUNIQSxDQUFDQTtLQUVESCxtREFBbUJBLEdBQW5CQSxVQUFvQkEsRUFBWUE7U0FDOUJJLElBQUlBLE1BQXNCQSxDQUFDQTtTQUMzQkEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxFQUFFQSxNQUFNQSxLQUFLQSxJQUFJQSxFQUFFQSxNQUFNQSxHQUFHQSxNQUFNQSxDQUFDQSxhQUFhQSxFQUFFQSxDQUFDQTthQUNwRkEsRUFBRUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0E7U0FDYkEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFREosa0RBQWtCQSxHQUFsQkEsVUFBbUJBLEVBQVlBO1NBQzdCSyxJQUFJQSxNQUFzQkEsQ0FBQ0E7U0FDM0JBLEdBQUdBLENBQUNBLENBQUNBLE1BQU1BLEdBQUdBLElBQUlBLENBQUNBLFlBQVlBLEVBQUVBLE1BQU1BLEtBQUtBLElBQUlBLEVBQUVBLE1BQU1BLEdBQUdBLE1BQU1BLENBQUNBLFlBQVlBLEVBQUVBLENBQUNBO2FBQy9FQSxFQUFFQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQTtTQUNiQSxDQUFDQTtLQUNIQSxDQUFDQTtLQUVETCxnREFBZ0JBLEdBQWhCQSxVQUFpQkEsRUFBWUE7U0FDM0JNLElBQUlBLE1BQXNCQSxDQUFDQTtTQUMzQkEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsY0FBY0EsRUFBRUEsTUFBTUEsS0FBS0EsSUFBSUEsRUFBRUEsTUFBTUEsR0FBR0EsTUFBTUEsQ0FBQ0EsVUFBVUEsRUFBRUEsQ0FBQ0E7YUFDL0VBLEVBQUVBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBO1NBQ2JBLENBQUNBO0tBQ0hBLENBQUNBO0tBRUROLGtEQUFrQkEsR0FBbEJBLFVBQW1CQSxFQUFZQTtTQUM3Qk8sSUFBSUEsTUFBc0JBLENBQUNBO1NBQzNCQSxHQUFHQSxDQUFDQSxDQUFDQSxNQUFNQSxHQUFHQSxJQUFJQSxDQUFDQSxhQUFhQSxFQUFFQSxNQUFNQSxLQUFLQSxJQUFJQSxFQUFFQSxNQUFNQSxHQUFHQSxNQUFNQSxDQUFDQSxZQUFZQSxFQUFFQSxDQUFDQTthQUNoRkEsRUFBRUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0E7U0FDYkEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFRFAsb0NBQUlBLEdBQUpBLFVBQUtBLEdBQWtCQTtTQUNyQlEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsY0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7YUFBQ0EsR0FBR0EsR0FBR0EsdUJBQVVBLENBQUNBLGVBQWVBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBO1NBQ3ZEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxZQUFZQSxHQUFHQSxJQUFJQSxpQkFBVUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDN0NBLE1BQU1BLElBQUlBLDBCQUFhQSxDQUFDQSwyQkFBeUJBLEdBQUdBLE1BQUdBLENBQUNBLENBQUNBO1NBQzNEQSxDQUFDQTtTQUVEQSxFQUFFQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNwQkEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7U0FDZEEsQ0FBQ0E7U0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFDTkEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7U0FDZEEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFRFIseUNBQVNBLEdBQVRBLGNBQWFTLENBQUNBO0tBRWRULHFDQUFLQSxHQUFMQSxVQUFNQSxHQUFrQkE7U0FBeEJVLGlCQWtEQ0E7U0FqRENBLElBQUlBLENBQUNBLE1BQU1BLEVBQUVBLENBQUNBO1NBQ2RBLElBQUlBLE9BQU9BLEdBQUdBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBO1NBQzVCQSxJQUFJQSxZQUFZQSxHQUFtQkEsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0E7U0FDakRBLElBQUlBLGdCQUFnQkEsR0FBbUJBLElBQUlBLENBQUNBO1NBQzVDQSxJQUFJQSxnQkFBZ0JBLEdBQW1CQSxJQUFJQSxDQUFDQTtTQUM1Q0EsSUFBSUEsVUFBVUEsR0FBWUEsS0FBS0EsQ0FBQ0E7U0FFaENBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLEdBQUdBLEVBQUVBLFVBQUNBLEtBQUtBLEVBQUVBLEdBQUdBO2FBQzVCQSxJQUFJQSxZQUFZQSxDQUFDQTthQUNqQkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsWUFBWUEsS0FBS0EsSUFBSUEsSUFBSUEsR0FBR0EsS0FBS0EsWUFBWUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQ3REQSxZQUFZQSxHQUFHQSxZQUFZQSxDQUFDQTtpQkFDNUJBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLHFCQUFjQSxDQUFDQSxLQUFLQSxFQUFFQSxZQUFZQSxDQUFDQSxZQUFZQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtxQkFDdERBLFlBQVlBLENBQUNBLGFBQWFBLEdBQUdBLFlBQVlBLENBQUNBLFlBQVlBLENBQUNBO3FCQUN2REEsWUFBWUEsQ0FBQ0EsWUFBWUEsR0FBR0EsS0FBS0EsQ0FBQ0E7cUJBQ2xDQSxLQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxZQUFZQSxDQUFDQSxDQUFDQTtpQkFDbkNBLENBQUNBO2FBQ0hBLENBQUNBO2FBQUNBLElBQUlBLENBQUNBLENBQUNBO2lCQUNOQSxVQUFVQSxHQUFHQSxJQUFJQSxDQUFDQTtpQkFDbEJBLEVBQUVBLENBQUNBLENBQUNBLFlBQVlBLEtBQUtBLElBQUlBLENBQUNBLENBQUNBLENBQUNBO3FCQUMxQkEsWUFBWUEsQ0FBQ0EsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0E7cUJBQzFCQSxLQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxnQkFBZ0JBLEVBQUVBLFlBQVlBLENBQUNBLENBQUNBO3FCQUNwREEsS0FBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsWUFBWUEsQ0FBQ0EsQ0FBQ0E7aUJBQ3BDQSxDQUFDQTtpQkFDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7cUJBQ3JCQSxZQUFZQSxHQUFHQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQTtpQkFDbENBLENBQUNBO2lCQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtxQkFDTkEsWUFBWUEsR0FBR0EsSUFBSUEsY0FBY0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7cUJBQ3ZDQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxFQUFFQSxZQUFZQSxDQUFDQSxDQUFDQTtxQkFDL0JBLFlBQVlBLENBQUNBLFlBQVlBLEdBQUdBLEtBQUtBLENBQUNBO3FCQUNsQ0EsS0FBSUEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsQ0FBQ0E7aUJBQ3JDQSxDQUFDQTthQUNIQSxDQUFDQTthQUVEQSxFQUFFQSxDQUFDQSxDQUFDQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDZkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsS0FBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7cUJBQ3JDQSxLQUFJQSxDQUFDQSxtQkFBbUJBLENBQUNBLFlBQVlBLENBQUNBLENBQUNBO2lCQUN6Q0EsQ0FBQ0E7aUJBQ0RBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFnQkEsSUFBSUEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7cUJBQzdCQSxLQUFJQSxDQUFDQSxRQUFRQSxHQUFHQSxZQUFZQSxDQUFDQTtpQkFDL0JBLENBQUNBO2lCQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtxQkFDTkEsZ0JBQWdCQSxDQUFDQSxLQUFLQSxHQUFHQSxZQUFZQSxDQUFDQTtpQkFDeENBLENBQUNBO2FBQ0hBLENBQUNBO2FBQ0RBLGdCQUFnQkEsR0FBR0EsWUFBWUEsQ0FBQ0E7YUFDaENBLGdCQUFnQkEsR0FBR0EsWUFBWUEsQ0FBQ0E7YUFDaENBLFlBQVlBLEdBQUdBLFlBQVlBLEtBQUtBLElBQUlBLEdBQUdBLElBQUlBLEdBQUdBLFlBQVlBLENBQUNBLEtBQUtBLENBQUNBO1NBQ25FQSxDQUFDQSxDQUFDQSxDQUFDQTtTQUNIQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxnQkFBZ0JBLEVBQUVBLFlBQVlBLENBQUNBLENBQUNBO1NBQy9DQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQTtLQUN0QkEsQ0FBQ0E7S0FFRFYsZ0JBQWdCQTtLQUNoQkEsc0NBQU1BLEdBQU5BO1NBQ0VXLEVBQUVBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBO2FBQ2pCQSxJQUFJQSxNQUFzQkEsQ0FBQ0E7YUFDM0JBLGtDQUFrQ0E7YUFDbENBLEdBQUdBLENBQUNBLENBQUNBLE1BQU1BLEdBQUdBLElBQUlBLENBQUNBLGdCQUFnQkEsR0FBR0EsSUFBSUEsQ0FBQ0EsUUFBUUEsRUFBRUEsTUFBTUEsS0FBS0EsSUFBSUEsRUFBRUEsTUFBTUEsR0FBR0EsTUFBTUEsQ0FBQ0EsS0FBS0EsRUFBRUEsQ0FBQ0E7aUJBQzVGQSxNQUFNQSxDQUFDQSxhQUFhQSxHQUFHQSxNQUFNQSxDQUFDQSxLQUFLQSxDQUFDQTthQUN0Q0EsQ0FBQ0E7YUFFREEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsWUFBWUEsRUFBRUEsTUFBTUEsS0FBS0EsSUFBSUEsRUFBRUEsTUFBTUEsR0FBR0EsTUFBTUEsQ0FBQ0EsWUFBWUEsRUFBRUEsQ0FBQ0E7aUJBQy9FQSxNQUFNQSxDQUFDQSxhQUFhQSxHQUFHQSxNQUFNQSxDQUFDQSxZQUFZQSxDQUFDQTthQUM3Q0EsQ0FBQ0E7YUFFREEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsY0FBY0EsRUFBRUEsTUFBTUEsSUFBSUEsSUFBSUEsRUFBRUEsTUFBTUEsR0FBR0EsTUFBTUEsQ0FBQ0EsVUFBVUEsRUFBRUEsQ0FBQ0E7aUJBQzlFQSxNQUFNQSxDQUFDQSxhQUFhQSxHQUFHQSxNQUFNQSxDQUFDQSxZQUFZQSxDQUFDQTthQUM3Q0EsQ0FBQ0E7YUFFREEsc0NBQXNDQTthQUN0Q0EsY0FBY0E7YUFDZEEseUJBQXlCQTthQUN6QkEsdUJBQXVCQTthQUN2QkEsc0NBQXNDQTthQUN0Q0EsNEJBQTRCQTthQUM1QkEscUJBQXFCQTthQUNyQkEsS0FBS0E7YUFDTEEsRUFBRUE7YUFDRkEsdUJBQXVCQTthQUN2QkEsdUJBQXVCQTthQUN2QkEsb0NBQW9DQTthQUNwQ0EsMEJBQTBCQTthQUMxQkEscUJBQXFCQTthQUNyQkEsS0FBS0E7YUFDTEEsRUFBRUE7YUFDRkEsc0JBQXNCQTthQUN0QkEsdUJBQXVCQTthQUN2QkEsc0NBQXNDQTthQUN0Q0EsNEJBQTRCQTthQUM1QkEscUJBQXFCQTthQUNyQkEsS0FBS0E7YUFDTEEsRUFBRUE7YUFDRkEsZ0JBQWdCQTthQUNoQkEsS0FBS0E7YUFDTEEsSUFBSUEsQ0FBQ0EsWUFBWUEsR0FBR0EsSUFBSUEsQ0FBQ0EsWUFBWUEsR0FBR0EsSUFBSUEsQ0FBQ0E7YUFDN0NBLElBQUlBLENBQUNBLGNBQWNBLEdBQUdBLElBQUlBLENBQUNBLGNBQWNBLEdBQUdBLElBQUlBLENBQUNBO2FBQ2pEQSxJQUFJQSxDQUFDQSxhQUFhQSxHQUFHQSxJQUFJQSxDQUFDQSxhQUFhQSxHQUFHQSxJQUFJQSxDQUFDQTtTQUNqREEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFRFgsZ0JBQWdCQTtLQUNoQkEseUNBQVNBLEdBQVRBLFVBQVVBLFVBQTBCQSxFQUFFQSxNQUFzQkE7U0FDMURZLE9BQU9BLE1BQU1BLEtBQUtBLElBQUlBLEVBQUVBLENBQUNBO2FBQ3ZCQSxFQUFFQSxDQUFDQSxDQUFDQSxVQUFVQSxLQUFLQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDeEJBLElBQUlBLENBQUNBLFFBQVFBLEdBQUdBLElBQUlBLENBQUNBO2FBQ3ZCQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtpQkFDTkEsVUFBVUEsQ0FBQ0EsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0E7YUFDMUJBLENBQUNBO2FBQ0RBLElBQUlBLFVBQVVBLEdBQUdBLE1BQU1BLENBQUNBLEtBQUtBLENBQUNBO2FBQzlCQSxvQkFBb0JBO2FBQ3BCQSxlQUFlQTthQUNmQSx3QkFBd0JBO2FBQ3hCQSxnQkFBZ0JBO2FBQ2hCQSxNQUFNQTthQUNOQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQTthQUM1QkEsVUFBVUEsR0FBR0EsTUFBTUEsQ0FBQ0E7YUFDcEJBLE1BQU1BLEdBQUdBLFVBQVVBLENBQUNBO1NBQ3RCQSxDQUFDQTtTQUVEQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxHQUFtQkEsSUFBSUEsQ0FBQ0EsYUFBYUEsRUFBRUEsR0FBR0EsS0FBS0EsSUFBSUEsRUFBRUEsR0FBR0EsR0FBR0EsR0FBR0EsQ0FBQ0EsWUFBWUEsRUFBRUEsQ0FBQ0E7YUFDeEZBLEdBQUdBLENBQUNBLGFBQWFBLEdBQUdBLEdBQUdBLENBQUNBLFlBQVlBLENBQUNBO2FBQ3JDQSxHQUFHQSxDQUFDQSxZQUFZQSxHQUFHQSxJQUFJQSxDQUFDQTthQUN4QkEsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7U0FDaENBLENBQUNBO0tBQ0hBLENBQUNBO0tBRURaLGdCQUFnQkE7S0FDaEJBLDZDQUFhQSxHQUFiQSxVQUFjQSxNQUFzQkE7U0FDbENhLE1BQU1BLENBQUNBLE1BQU1BLEtBQUtBLElBQUlBLENBQUNBLGFBQWFBLElBQUlBLE1BQU1BLENBQUNBLFlBQVlBLEtBQUtBLElBQUlBO2FBQzdEQSxNQUFNQSxDQUFDQSxZQUFZQSxLQUFLQSxJQUFJQSxDQUFDQTtLQUN0Q0EsQ0FBQ0E7S0FFRGIsZ0JBQWdCQTtLQUNoQkEsOENBQWNBLEdBQWRBLFVBQWVBLE1BQXNCQTtTQUNuQ2Msb0JBQW9CQTtTQUNwQkEsZ0NBQWdDQTtTQUNoQ0EscUNBQXFDQTtTQUNyQ0EsdUNBQXVDQTtTQUN2Q0EsdUNBQXVDQTtTQUN2Q0EsdUNBQXVDQTtTQUN2Q0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsYUFBYUEsS0FBS0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDaENBLElBQUlBLENBQUNBLGFBQWFBLEdBQUdBLElBQUlBLENBQUNBLGFBQWFBLEdBQUdBLE1BQU1BLENBQUNBO1NBQ25EQSxDQUFDQTtTQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTthQUNOQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxZQUFZQSxHQUFHQSxNQUFNQSxDQUFDQTthQUN6Q0EsTUFBTUEsQ0FBQ0EsWUFBWUEsR0FBR0EsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0E7YUFDekNBLElBQUlBLENBQUNBLGFBQWFBLEdBQUdBLE1BQU1BLENBQUNBO1NBQzlCQSxDQUFDQTtLQUNIQSxDQUFDQTtLQUVEZCxnQkFBZ0JBO0tBQ2hCQSw4Q0FBY0EsR0FBZEEsVUFBZUEsSUFBb0JBLEVBQUVBLE1BQXNCQTtTQUN6RGUsSUFBSUEsSUFBSUEsR0FBR0EsTUFBTUEsQ0FBQ0EsS0FBS0EsQ0FBQ0E7U0FDeEJBLEVBQUVBLENBQUNBLENBQUNBLElBQUlBLEtBQUtBLElBQUlBLENBQUNBLENBQUNBLENBQUNBO2FBQ2xCQSxJQUFJQSxDQUFDQSxRQUFRQSxHQUFHQSxJQUFJQSxDQUFDQTtTQUN2QkEsQ0FBQ0E7U0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFDTkEsSUFBSUEsQ0FBQ0EsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0E7U0FDcEJBLENBQUNBO1NBQ0RBLG9CQUFvQkE7U0FDcEJBLGVBQWVBO1NBQ2ZBLHdCQUF3QkE7U0FDeEJBLGdCQUFnQkE7U0FDaEJBLFFBQVFBO0tBQ1ZBLENBQUNBO0tBRURmLGdCQUFnQkE7S0FDaEJBLG1EQUFtQkEsR0FBbkJBLFVBQW9CQSxNQUFzQkE7U0FDeENnQixvQkFBb0JBO1NBQ3BCQSxnQ0FBZ0NBO1NBQ2hDQSxxQ0FBcUNBO1NBQ3JDQSx1Q0FBdUNBO1NBRXZDQSxJQUFJQSxJQUFJQSxHQUFHQSxNQUFNQSxDQUFDQSxZQUFZQSxDQUFDQTtTQUMvQkEsSUFBSUEsSUFBSUEsR0FBR0EsTUFBTUEsQ0FBQ0EsWUFBWUEsQ0FBQ0E7U0FDL0JBLEVBQUVBLENBQUNBLENBQUNBLElBQUlBLEtBQUtBLElBQUlBLENBQUNBLENBQUNBLENBQUNBO2FBQ2xCQSxJQUFJQSxDQUFDQSxhQUFhQSxHQUFHQSxJQUFJQSxDQUFDQTtTQUM1QkEsQ0FBQ0E7U0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFDTkEsSUFBSUEsQ0FBQ0EsWUFBWUEsR0FBR0EsSUFBSUEsQ0FBQ0E7U0FDM0JBLENBQUNBO1NBQ0RBLEVBQUVBLENBQUNBLENBQUNBLElBQUlBLEtBQUtBLElBQUlBLENBQUNBLENBQUNBLENBQUNBO2FBQ2xCQSxJQUFJQSxDQUFDQSxhQUFhQSxHQUFHQSxJQUFJQSxDQUFDQTtTQUM1QkEsQ0FBQ0E7U0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFDTkEsSUFBSUEsQ0FBQ0EsWUFBWUEsR0FBR0EsSUFBSUEsQ0FBQ0E7U0FDM0JBLENBQUNBO1NBQ0RBLE1BQU1BLENBQUNBLFlBQVlBLEdBQUdBLE1BQU1BLENBQUNBLFlBQVlBLEdBQUdBLElBQUlBLENBQUNBO0tBQ25EQSxDQUFDQTtLQUVEaEIsZ0JBQWdCQTtLQUNoQkEsK0NBQWVBLEdBQWZBLFVBQWdCQSxNQUFzQkE7U0FDcENpQixxQkFBcUJBO1NBQ3JCQSxnQ0FBZ0NBO1NBQ2hDQSxxQ0FBcUNBO1NBQ3JDQSx1Q0FBdUNBO1NBQ3ZDQSx1Q0FBdUNBO1NBQ3ZDQSx1Q0FBdUNBO1NBQ3ZDQSxFQUFFQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxjQUFjQSxLQUFLQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNqQ0EsSUFBSUEsQ0FBQ0EsY0FBY0EsR0FBR0EsSUFBSUEsQ0FBQ0EsY0FBY0EsR0FBR0EsTUFBTUEsQ0FBQ0E7U0FDckRBLENBQUNBO1NBQUNBLElBQUlBLENBQUNBLENBQUNBO2FBQ05BLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLFVBQVVBLEdBQUdBLE1BQU1BLENBQUNBO2FBQ3hDQSxJQUFJQSxDQUFDQSxjQUFjQSxHQUFHQSxNQUFNQSxDQUFDQTtTQUMvQkEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFRGpCLGdCQUFnQkE7S0FDaEJBLDZDQUFhQSxHQUFiQSxVQUFjQSxNQUFzQkE7U0FDbENrQixvQkFBb0JBO1NBQ3BCQSxxQ0FBcUNBO1NBQ3JDQSx1Q0FBdUNBO1NBQ3ZDQSx1Q0FBdUNBO1NBQ3ZDQSx1Q0FBdUNBO1NBQ3ZDQSxFQUFFQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxZQUFZQSxLQUFLQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQTthQUMvQkEsSUFBSUEsQ0FBQ0EsWUFBWUEsR0FBR0EsSUFBSUEsQ0FBQ0EsWUFBWUEsR0FBR0EsTUFBTUEsQ0FBQ0E7U0FDakRBLENBQUNBO1NBQUNBLElBQUlBLENBQUNBLENBQUNBO2FBQ05BLElBQUlBLENBQUNBLFlBQVlBLENBQUNBLFlBQVlBLEdBQUdBLE1BQU1BLENBQUNBO2FBQ3hDQSxJQUFJQSxDQUFDQSxZQUFZQSxHQUFHQSxNQUFNQSxDQUFDQTtTQUM3QkEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFRGxCLHdDQUFRQSxHQUFSQTtTQUNFbUIsSUFBSUEsS0FBS0EsR0FBR0EsRUFBRUEsQ0FBQ0E7U0FDZkEsSUFBSUEsUUFBUUEsR0FBR0EsRUFBRUEsQ0FBQ0E7U0FDbEJBLElBQUlBLE9BQU9BLEdBQUdBLEVBQUVBLENBQUNBO1NBQ2pCQSxJQUFJQSxTQUFTQSxHQUFHQSxFQUFFQSxDQUFDQTtTQUNuQkEsSUFBSUEsUUFBUUEsR0FBR0EsRUFBRUEsQ0FBQ0E7U0FDbEJBLElBQUlBLE1BQXNCQSxDQUFDQTtTQUUzQkEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsUUFBUUEsRUFBRUEsTUFBTUEsS0FBS0EsSUFBSUEsRUFBRUEsTUFBTUEsR0FBR0EsTUFBTUEsQ0FBQ0EsS0FBS0EsRUFBRUEsQ0FBQ0E7YUFDcEVBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLGdCQUFTQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQTtTQUNoQ0EsQ0FBQ0E7U0FDREEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxFQUFFQSxNQUFNQSxLQUFLQSxJQUFJQSxFQUFFQSxNQUFNQSxHQUFHQSxNQUFNQSxDQUFDQSxhQUFhQSxFQUFFQSxDQUFDQTthQUNwRkEsUUFBUUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsZ0JBQVNBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBO1NBQ25DQSxDQUFDQTtTQUNEQSxHQUFHQSxDQUFDQSxDQUFDQSxNQUFNQSxHQUFHQSxJQUFJQSxDQUFDQSxZQUFZQSxFQUFFQSxNQUFNQSxLQUFLQSxJQUFJQSxFQUFFQSxNQUFNQSxHQUFHQSxNQUFNQSxDQUFDQSxZQUFZQSxFQUFFQSxDQUFDQTthQUMvRUEsT0FBT0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsZ0JBQVNBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBO1NBQ2xDQSxDQUFDQTtTQUNEQSxHQUFHQSxDQUFDQSxDQUFDQSxNQUFNQSxHQUFHQSxJQUFJQSxDQUFDQSxjQUFjQSxFQUFFQSxNQUFNQSxLQUFLQSxJQUFJQSxFQUFFQSxNQUFNQSxHQUFHQSxNQUFNQSxDQUFDQSxVQUFVQSxFQUFFQSxDQUFDQTthQUMvRUEsU0FBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsZ0JBQVNBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBO1NBQ3BDQSxDQUFDQTtTQUNEQSxHQUFHQSxDQUFDQSxDQUFDQSxNQUFNQSxHQUFHQSxJQUFJQSxDQUFDQSxhQUFhQSxFQUFFQSxNQUFNQSxLQUFLQSxJQUFJQSxFQUFFQSxNQUFNQSxHQUFHQSxNQUFNQSxDQUFDQSxZQUFZQSxFQUFFQSxDQUFDQTthQUNoRkEsUUFBUUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsZ0JBQVNBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBO1NBQ25DQSxDQUFDQTtTQUVEQSxNQUFNQSxDQUFDQSxPQUFPQSxHQUFHQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxJQUFJQSxHQUFHQSxZQUFZQSxHQUFHQSxRQUFRQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxJQUFJQTthQUM3RUEsYUFBYUEsR0FBR0EsU0FBU0EsQ0FBQ0EsSUFBSUEs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QSxPQUFPQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQTtTQUMzQkEsSUFBSUEsTUFBTUEsR0FBWUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsS0FBS0EsS0FBS0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7U0FDN0NBLElBQUlBLENBQUNBLE9BQU9BLEVBQUVBLENBQUNBLENBQUVBLHNCQUFzQkE7U0FDdkNBLE9BQU9BLElBQUlBLEVBQUVBLENBQUNBO2FBQ1pBLEVBQUVBLENBQUNBLENBQUNBLE9BQU9BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBRXpCQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxJQUFJQSxlQUFPQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDaENBLE1BQU1BLEdBQUdBLEtBQUtBLENBQUNBO2FBQ2pCQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxlQUFlQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDdENBLElBQUlBLENBQUNBLE9BQU9BLEVBQUVBLENBQUNBO2lCQUNmQSxFQUFFQSxDQUFDQSxDQUFDQSxjQUFjQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtxQkFBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsRUFBRUEsQ0FBQ0E7aUJBQzlDQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxPQUFPQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtxQkFBQ0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0Esa0JBQWtCQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDNURBLE1BQU1BLEdBQUdBLEtBQUtBLENBQUNBO2FBQ2pCQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtpQkFDTkEsS0FBS0EsQ0FBQ0E7YUFDUkEsQ0FBQ0E7YUFDREEsSUFBSUEsQ0FBQ0EsT0FBT0EsRUFBRUEsQ0FBQ0E7U0FDakJBLENBQUNBO1NBQ0RBLElBQUlBLEdBQUdBLEdBQVdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLFNBQVNBLENBQUNBLEtBQUtBLEVBQUVBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBO1NBQzFEQSxPQUFPQTtTQUNQQSxJQUFJQSxLQUFLQSxHQUNMQSxNQUFNQSxHQUFHQSxvQkFBYUEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxvQkFBYUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7U0FDbEZBLE1BQU1BLENBQUNBLGNBQWNBLENBQUNBLEtBQUtBLEVBQUVBLEtBQUtBLENBQUNBLENBQUNBO0tBQ3RDQSxDQUFDQTtLQUVEUiw2QkFBVUEsR0FBVkE7U0FDRVMsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsSUFBSUEsV0FBR0EsSUFBSUEsSUFBSUEsQ0FBQ0EsSUFBSUEsSUFBSUEsV0FBR0EsQ0FBQ0EsQ0FBQ0E7U0FDN0NBLElBQUlBLEtBQUtBLEdBQVdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBO1NBQy9CQSxJQUFJQSxLQUFLQSxHQUFXQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQTtTQUM5QkEsSUFBSUEsQ0FBQ0EsT0FBT0EsRUFBRUEsQ0FBQ0EsQ0FBRUEsc0JBQXNCQTtTQUV2Q0EsSUFBSUEsTUFBb0JBLENBQUNBO1NBQ3pCQSxJQUFJQSxNQUFNQSxHQUFXQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQTtTQUNoQ0EsSUFBSUEsS0FBS0EsR0FBV0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0E7U0FFL0JBLE9BQU9BLElBQUlBLENBQUNBLElBQUlBLElBQUlBLEtBQUtBLEVBQUVBLENBQUNBO2FBQzFCQSxFQUFFQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxJQUFJQSxrQkFBVUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQzVCQSxFQUFFQSxDQUFDQSxDQUFDQSxNQUFNQSxJQUFJQSxJQUFJQSxDQUFDQTtxQkFBQ0EsTUFBTUEsR0FBR0EsSUFBSUEsbUJBQVlBLEVBQUVBLENBQUNBO2lCQUNoREEsTUFBTUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsTUFBTUEsRUFBRUEsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQ2hEQSxJQUFJQSxDQUFDQSxPQUFPQSxFQUFFQSxDQUFDQTtpQkFDZkEsSUFBSUEsYUFBcUJBLENBQUNBO2lCQUMxQkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsSUFBSUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7cUJBQ3BCQSw4Q0FBOENBO3FCQUM5Q0EsSUFBSUEsR0FBR0EsR0FBV0EsS0FBS0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsS0FBS0EsR0FBR0EsQ0FBQ0EsRUFBRUEsSUFBSUEsQ0FBQ0EsS0FBS0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7cUJBQ2xFQSxJQUFJQSxDQUFDQTt5QkFDSEEsYUFBYUEsR0FBR0Esb0JBQWFBLENBQUNBLFFBQVFBLENBQUNBLEdBQUdBLEVBQUVBLEVBQUVBLENBQUNBLENBQUNBO3FCQUNsREEsQ0FBRUE7cUJBQUFBLEtBQUtBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO3lCQUNYQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxnQ0FBOEJBLEdBQUdBLE1BQUdBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBO3FCQUN0REEsQ0FBQ0E7cUJBQ0RBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLEdBQVdBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLEVBQUVBLENBQUNBO3lCQUNuQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsRUFBRUEsQ0FBQ0E7cUJBQ2pCQSxDQUFDQTtpQkFDSEEsQ0FBQ0E7aUJBQUNBLElBQUlBLENBQUNBLENBQUNBO3FCQUNOQSxhQUFhQSxHQUFHQSxRQUFRQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtxQkFDcENBLElBQUlBLENBQUNBLE9BQU9BLEVBQUVBLENBQUNBO2lCQUNqQkEsQ0FBQ0E7aUJBQ0RBLE1BQU1BLENBQUNBLEdBQUdBLENBQUNBLG9CQUFhQSxDQUFDQSxZQUFZQSxDQUFDQSxhQUFhQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDdERBLE1BQU1BLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBO2FBQ3RCQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxJQUFJQSxZQUFJQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDN0JBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLG9CQUFvQkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDdENBLENBQUNBO2FBQUNBLElBQUlBLENBQUNBLENBQUNBO2lCQUNOQSxJQUFJQSxDQUFDQSxPQUFPQSxFQUFFQSxDQUFDQTthQUNqQkEsQ0FBQ0E7U0FDSEEsQ0FBQ0E7U0FFREEsSUFBSUEsSUFBSUEsR0FBV0EsS0FBS0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsTUFBTUEsRUFBRUEsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7U0FDdkRBLElBQUlBLENBQUNBLE9BQU9BLEVBQUVBLENBQUNBLENBQUVBLDBCQUEwQkE7U0FFM0NBLHNDQUFzQ0E7U0FDdENBLElBQUlBLFNBQVNBLEdBQVdBLElBQUlBLENBQUNBO1NBQzdCQSxFQUFFQSxDQUFDQSxDQUFDQSxNQUFNQSxJQUFJQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNuQkEsTUFBTUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFDakJBLFNBQVNBLEdBQUdBLE1BQU1BLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBO1NBQ2hDQSxDQUFDQTtTQUNEQSxNQUFNQSxDQUFDQSxjQUFjQSxDQUFDQSxLQUFLQSxFQUFFQSxTQUFTQSxDQUFDQSxDQUFDQTtLQUMxQ0EsQ0FBQ0E7S0FFRFQsd0JBQUtBLEdBQUxBLFVBQU1BLE9BQWVBLEVBQUVBLE1BQWNBO1NBQ25DVSxJQUFJQSxRQUFRQSxHQUFXQSxJQUFJQSxDQUFDQSxLQUFLQSxHQUFHQSxNQUFNQSxDQUFDQTtTQUMzQ0EsTUFBTUEsSUFBSUEsWUFBWUEsQ0FDbEJBLGtCQUFnQkEsT0FBT0EsbUJBQWNBLFFBQVFBLHdCQUFtQkEsSUFBSUEsQ0FBQ0EsS0FBS0EsTUFBR0EsQ0FBQ0EsQ0FBQ0E7S0FDckZBLENBQUNBO0tBQ0hWLGVBQUNBO0FBQURBLEVBQUNBLElBQUE7QUFFRCx1QkFBc0IsSUFBWTtLQUNoQ1csTUFBTUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsSUFBSUEsWUFBSUEsSUFBSUEsSUFBSUEsSUFBSUEsY0FBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsSUFBSUEsS0FBS0EsQ0FBQ0EsQ0FBQ0E7QUFDN0RBLEVBQUNBO0FBRUQsNEJBQTJCLElBQVk7S0FDckNDLE1BQU1BLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLElBQUlBLElBQUlBLElBQUlBLElBQUlBLEVBQUVBLENBQUNBLElBQUlBLENBQUNBLEVBQUVBLElBQUlBLElBQUlBLElBQUlBLElBQUlBLElBQUlBLEVBQUVBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLElBQUlBLEVBQUVBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLElBQUlBLFVBQUVBLENBQUNBLENBQUNBO0FBQ2xHQSxFQUFDQTtBQUVELHVCQUE2QixLQUFhO0tBQ3hDQyxFQUFFQSxDQUFDQSxDQUFDQSxLQUFLQSxDQUFDQSxNQUFNQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUFDQSxNQUFNQSxDQUFDQSxLQUFLQSxDQUFDQTtLQUNwQ0EsSUFBSUEsT0FBT0EsR0FBR0EsSUFBSUEsUUFBUUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7S0FDbENBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7U0FBQ0EsTUFBTUEsQ0FBQ0EsS0FBS0EsQ0FBQ0E7S0FDbkRBLE9BQU9BLENBQUNBLE9BQU9BLEVBQUVBLENBQUNBO0tBQ2xCQSxPQUFPQSxPQUFPQSxDQUFDQSxJQUFJQSxLQUFLQSxZQUFJQSxFQUFFQSxDQUFDQTtTQUM3QkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxPQUFPQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTthQUFDQSxNQUFNQSxDQUFDQSxLQUFLQSxDQUFDQTtTQUNsREEsT0FBT0EsQ0FBQ0EsT0FBT0EsRUFBRUEsQ0FBQ0E7S0FDcEJBLENBQUNBO0tBQ0RBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBO0FBQ2RBLEVBQUNBO0FBVmUscUJBQVksZUFVM0I7QUFFRCwyQkFBMEIsSUFBWTtLQUNwQ0MsTUFBTUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsSUFBSUEsSUFBSUEsSUFBSUEsSUFBSUEsSUFBSUEsRUFBRUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsSUFBSUEsSUFBSUEsSUFBSUEsSUFBSUEsSUFBSUEsRUFBRUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsSUFBSUEsSUFBSUEsSUFBSUEsSUFBSUEsSUFBSUEsRUFBRUEsQ0FBQ0E7U0FDdEZBLENBQUNBLElBQUlBLElBQUlBLEVBQUVBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLElBQUlBLFVBQUVBLENBQUNBLENBQUNBO0FBQ3RDQSxFQUFDQTtBQUVELGtCQUFpQixJQUFZO0tBQzNCQyxNQUFNQSxDQUFDQSxFQUFFQSxJQUFJQSxJQUFJQSxJQUFJQSxJQUFJQSxJQUFJQSxFQUFFQSxDQUFDQTtBQUNsQ0EsRUFBQ0E7QUFFRCwwQkFBeUIsSUFBWTtLQUNuQ0MsTUFBTUEsQ0FBQ0EsSUFBSUEsSUFBSUEsRUFBRUEsSUFBSUEsSUFBSUEsSUFBSUEsRUFBRUEsQ0FBQ0E7QUFDbENBLEVBQUNBO0FBRUQseUJBQXdCLElBQVk7S0FDbENDLE1BQU1BLENBQUNBLElBQUlBLElBQUlBLGNBQU1BLElBQUlBLElBQUlBLElBQUlBLGFBQUtBLENBQUNBO0FBQ3pDQSxFQUFDQTtBQUVELG1CQUFrQixJQUFZO0tBQzVCQyxNQUFNQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQTtTQUNiQSxLQUFLQSxFQUFFQTthQUNMQSxNQUFNQSxDQUFDQSxXQUFHQSxDQUFDQTtTQUNiQSxLQUFLQSxFQUFFQTthQUNMQSxNQUFNQSxDQUFDQSxXQUFHQSxDQUFDQTtTQUNiQSxLQUFLQSxFQUFFQTthQUNMQSxNQUFNQSxDQUFDQSxXQUFHQSxDQUFDQTtTQUNiQSxLQUFLQSxFQUFFQTthQUNMQSxNQUFNQSxDQUFDQSxZQUFJQSxDQUFDQTtTQUNkQSxLQUFLQSxFQUFFQTthQUNMQSxNQUFNQSxDQUFDQSxhQUFLQSxDQUFDQTtTQUNmQTthQUNFQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQTtLQUNoQkEsQ0FBQ0E7QUFDSEEsRUFBQ0E7QUFFRCxLQUFJLFNBQVMsR0FBRyx1QkFBVSxDQUFDLGNBQWMsQ0FBQztLQUN4QyxHQUFHO0tBQ0gsR0FBRztLQUNILEdBQUc7S0FDSCxHQUFHO0tBQ0gsR0FBRztLQUNILEdBQUc7S0FDSCxHQUFHO0tBQ0gsSUFBSTtLQUNKLElBQUk7S0FDSixLQUFLO0tBQ0wsS0FBSztLQUNMLEdBQUc7S0FDSCxHQUFHO0tBQ0gsSUFBSTtLQUNKLElBQUk7S0FDSixJQUFJO0tBQ0osSUFBSTtLQUNKLEdBQUc7S0FDSCxHQUFHO0tBQ0gsR0FBRztLQUNILEdBQUc7S0FDSCxHQUFHO0tBQ0gsSUFBSTtFQUNMLENBQUMsQ0FBQztBQUdILEtBQUksUUFBUSxHQUNSLHVCQUFVLENBQUMsY0FBYyxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdmQzRix3Q0FBeUIsQ0FBaUMsQ0FBQztBQUMzRCxrQ0FBZ0QsQ0FBMEIsQ0FBQztBQUMzRSx3Q0FBOEMsRUFBZ0MsQ0FBQztBQUMvRSx3Q0FBMEIsRUFBZ0MsQ0FBQztBQUMzRCxtQ0FlTyxFQUFTLENBQUM7QUFDakIsd0NBQW1DLEVBQXlDLENBQUM7QUFDN0UsaUNBeUJPLEVBQU8sQ0FBQztBQUdmLEtBQUksaUJBQWlCLEdBQUcsSUFBSSxzQkFBZ0IsRUFBRSxDQUFDO0FBQy9DLHFGQUFvRjtBQUNwRixLQUFJLG9CQUFvQixHQUFHLGdCQUFnQixDQUFDO0FBRTVDO0tBQTZCQyxrQ0FBYUE7S0FDeENBLHdCQUFZQSxPQUFlQSxFQUFFQSxLQUFhQSxFQUFFQSxXQUFtQkEsRUFBRUEsV0FBaUJBO1NBQ2hGQyxrQkFBTUEsbUJBQWlCQSxPQUFPQSxTQUFJQSxXQUFXQSxVQUFLQSxLQUFLQSxhQUFRQSxXQUFhQSxDQUFDQSxDQUFDQTtLQUNoRkEsQ0FBQ0E7S0FDSEQscUJBQUNBO0FBQURBLEVBQUNBLEVBSjRCLDBCQUFhLEVBSXpDO0FBRUQ7S0FLRUUsZ0JBQVlBLGdCQUFnQkEsQ0FDVEEsTUFBYUEsRUFBRUEsaUJBQW1DQTtTQUFuQ0MsaUNBQW1DQSxHQUFuQ0Esd0JBQW1DQTtTQUFsREEsV0FBTUEsR0FBTkEsTUFBTUEsQ0FBT0E7U0FDOUJBLElBQUlBLENBQUNBLFVBQVVBLEdBQUdBLGdCQUFTQSxDQUFDQSxpQkFBaUJBLENBQUNBLEdBQUdBLGlCQUFpQkEsR0FBR0Esc0JBQVNBLENBQUNBO0tBQ2pGQSxDQUFDQTtLQUVERCw0QkFBV0EsR0FBWEEsVUFBWUEsS0FBYUEsRUFBRUEsUUFBYUE7U0FDdENFLElBQUlBLENBQUNBLHFCQUFxQkEsQ0FBQ0EsS0FBS0EsRUFBRUEsUUFBUUEsQ0FBQ0EsQ0FBQ0E7U0FDNUNBLElBQUlBLE1BQU1BLEdBQUdBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLFFBQVFBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBO1NBQ3pDQSxJQUFJQSxHQUFHQSxHQUFHQSxJQUFJQSxTQUFTQSxDQUFDQSxLQUFLQSxFQUFFQSxRQUFRQSxFQUFFQSxNQUFNQSxFQUFFQSxJQUFJQSxDQUFDQSxVQUFVQSxFQUFFQSxJQUFJQSxDQUFDQSxDQUFDQSxVQUFVQSxFQUFFQSxDQUFDQTtTQUNyRkEsTUFBTUEsQ0FBQ0EsSUFBSUEsbUJBQWFBLENBQUNBLEdBQUdBLEVBQUVBLEtBQUtBLEVBQUVBLFFBQVFBLENBQUNBLENBQUNBO0tBQ2pEQSxDQUFDQTtLQUVERiw2QkFBWUEsR0FBWkEsVUFBYUEsS0FBYUEsRUFBRUEsUUFBYUE7U0FDdkNHLElBQUlBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsS0FBS0EsRUFBRUEsUUFBUUEsQ0FBQ0EsQ0FBQ0E7U0FDakRBLE1BQU1BLENBQUNBLElBQUlBLG1CQUFhQSxDQUFDQSxHQUFHQSxFQUFFQSxLQUFLQSxFQUFFQSxRQUFRQSxDQUFDQSxDQUFDQTtLQUNqREEsQ0FBQ0E7S0FFREgsbUNBQWtCQSxHQUFsQkEsVUFBbUJBLEtBQWFBLEVBQUVBLFFBQWdCQTtTQUNoREksSUFBSUEsR0FBR0EsR0FBR0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxLQUFLQSxFQUFFQSxRQUFRQSxDQUFDQSxDQUFDQTtTQUNqREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsdUJBQXVCQSxDQUFDQSxLQUFLQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUN4Q0EsTUFBTUEsSUFBSUEsY0FBY0EsQ0FDcEJBLHFFQUFxRUEsRUFBRUEsS0FBS0EsRUFBRUEsUUFBUUEsQ0FBQ0EsQ0FBQ0E7U0FDOUZBLENBQUNBO1NBQ0RBLE1BQU1BLENBQUNBLElBQUlBLG1CQUFhQSxDQUFDQSxHQUFHQSxFQUFFQSxLQUFLQSxFQUFFQSxRQUFRQSxDQUFDQSxDQUFDQTtLQUNqREEsQ0FBQ0E7S0FFT0osaUNBQWdCQSxHQUF4QkEsVUFBeUJBLEtBQWFBLEVBQUVBLFFBQWdCQTtTQUN0REssNkVBQTZFQTtTQUM3RUEsb0VBQW9FQTtTQUNwRUEsSUFBSUEsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0EsV0FBV0EsQ0FBQ0EsS0FBS0EsRUFBRUEsUUFBUUEsQ0FBQ0EsQ0FBQ0E7U0FFOUNBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNyQkEsTUFBTUEsQ0FBQ0EsS0FBS0EsQ0FBQ0E7U0FDZkEsQ0FBQ0E7U0FFREEsSUFBSUEsQ0FBQ0EscUJBQXFCQSxDQUFDQSxLQUFLQSxFQUFFQSxRQUFRQSxDQUFDQSxDQUFDQTtTQUM1Q0EsSUFBSUEsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7U0FDekNBLE1BQU1BLENBQUNBLElBQUlBLFNBQVNBLENBQUNBLEtBQUtBLEVBQUVBLFFBQVFBLEVBQUVBLE1BQU1BLEVBQUVBLElBQUlBLENBQUNBLFVBQVVBLEVBQUVBLEtBQUtBLENBQUNBLENBQUNBLFVBQVVBLEVBQUVBLENBQUNBO0tBQ3JGQSxDQUFDQTtLQUVPTCw0QkFBV0EsR0FBbkJBLFVBQW9CQSxLQUFhQSxFQUFFQSxRQUFhQTtTQUM5Q00sRUFBRUEsQ0FBQ0EsQ0FBQ0EsY0FBT0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7YUFBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7U0FDaENBLElBQUlBLG9CQUFvQkEsR0FBR0EsS0FBS0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7U0FDOUNBLEVBQUVBLENBQUNBLENBQUNBLG9CQUFvQkEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7U0FDNUNBLElBQUlBLE1BQU1BLEdBQUdBLEtBQUtBLENBQUNBLFNBQVNBLENBQUNBLENBQUNBLEVBQUVBLG9CQUFvQkEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsRUFBRUEsQ0FBQ0E7U0FDN0RBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLG9CQUFZQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQTthQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQTtTQUN2Q0EsSUFBSUEsdUJBQXVCQSxHQUFHQSxLQUFLQSxDQUFDQSxTQUFTQSxDQUFDQSxvQkFBb0JBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBO1NBQ3hFQSxNQUFNQSxDQUFDQSxJQUFJQSxXQUFLQSxDQUFDQSxNQUFNQSxFQUFFQSx1QkFBdUJBLEVBQUVBLFFBQVFBLENBQUNBLENBQUNBO0tBQzlEQSxDQUFDQTtLQUVETixzQ0FBcUJBLEdBQXJCQSxVQUFzQkEsS0FBYUEsRUFBRUEsUUFBYUE7U0FDaERPLElBQUlBLE1BQU1BLEdBQUdBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLFFBQVFBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBO1NBQ3pDQSxNQUFNQSxDQUFDQSxJQUFJQSxTQUFTQSxDQUFDQSxLQUFLQSxFQUFFQSxRQUFRQSxFQUFFQSxNQUFNQSxFQUFFQSxJQUFJQSxDQUFDQSxVQUFVQSxFQUFFQSxLQUFLQSxDQUFDQSxDQUFDQSxxQkFBcUJBLEVBQUVBLENBQUNBO0tBQ2hHQSxDQUFDQTtLQUVEUCxtQ0FBa0JBLEdBQWxCQSxVQUFtQkEsS0FBYUEsRUFBRUEsUUFBYUE7U0FDN0NRLElBQUlBLEtBQUtBLEdBQUdBLG9CQUFhQSxDQUFDQSxLQUFLQSxDQUFDQSxLQUFLQSxFQUFFQSxvQkFBb0JBLENBQUNBLENBQUNBO1NBQzdEQSxFQUFFQSxDQUFDQSxDQUFDQSxLQUFLQSxDQUFDQSxNQUFNQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUN0QkEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7U0FDZEEsQ0FBQ0E7U0FDREEsSUFBSUEsT0FBT0EsR0FBR0EsRUFBRUEsQ0FBQ0E7U0FDakJBLElBQUlBLFdBQVdBLEdBQUdBLEVBQUVBLENBQUNBO1NBRXJCQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxLQUFLQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQSxFQUFFQSxFQUFFQSxDQUFDQTthQUN0Q0EsSUFBSUEsSUFBSUEsR0FBV0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDNUJBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2lCQUNoQkEsZUFBZUE7aUJBQ2ZBLE9BQU9BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO2FBQ3JCQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxFQUFFQSxDQUFDQSxNQUFNQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDbENBLElBQUlBLE1BQU1BLEdBQUdBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLFFBQVFBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO2lCQUN4Q0EsSUFBSUEsR0FBR0EsR0FBR0EsSUFBSUEsU0FBU0EsQ0FBQ0EsS0FBS0EsRUFBRUEsUUFBUUEsRUFBRUEsTUFBTUEsRUFBRUEsSUFBSUEsQ0FBQ0EsVUFBVUEsRUFBRUEsS0FBS0EsQ0FBQ0EsQ0FBQ0EsVUFBVUEsRUFBRUEsQ0FBQ0E7aUJBQ3RGQSxXQUFXQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQTthQUN4QkEsQ0FBQ0E7YUFBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7aUJBQ05BLE1BQU1BLElBQUlBLGNBQWNBLENBQUNBLDJEQUEyREEsRUFBRUEsS0FBS0EsRUFDbEVBLGVBQWFBLElBQUlBLENBQUNBLDZCQUE2QkEsQ0FBQ0EsS0FBS0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsUUFBS0EsRUFDOURBLFFBQVFBLENBQUNBLENBQUNBO2FBQ3JDQSxDQUFDQTtTQUNIQSxDQUFDQTtTQUNEQSxNQUFNQSxDQUFDQSxJQUFJQSxtQkFBYUEsQ0FBQ0EsSUFBSUEsbUJBQWFBLENBQUNBLE9BQU9BLEVBQUVBLFdBQVdBLENBQUNBLEVBQUVBLEtBQUtBLEVBQUVBLFFBQVFBLENBQUNBLENBQUNBO0tBQ3JGQSxDQUFDQTtLQUVEUixxQ0FBb0JBLEdBQXBCQSxVQUFxQkEsS0FBYUEsRUFBRUEsUUFBYUE7U0FDL0NTLE1BQU1BLENBQUNBLElBQUlBLG1CQUFhQSxDQUFDQSxJQUFJQSxzQkFBZ0JBLENBQUNBLEtBQUtBLENBQUNBLEVBQUVBLEtBQUtBLEVBQUVBLFFBQVFBLENBQUNBLENBQUNBO0tBQ3pFQSxDQUFDQTtLQUVPVCxzQ0FBcUJBLEdBQTdCQSxVQUE4QkEsS0FBYUEsRUFBRUEsUUFBYUE7U0FDeERVLElBQUlBLEtBQUtBLEdBQUdBLG9CQUFhQSxDQUFDQSxLQUFLQSxDQUFDQSxLQUFLQSxFQUFFQSxvQkFBb0JBLENBQUNBLENBQUNBO1NBQzdEQSxFQUFFQSxDQUFDQSxDQUFDQSxLQUFLQSxDQUFDQSxNQUFNQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNyQkEsTUFBTUEsSUFBSUEsY0FBY0EsQ0FBQ0Esd0RBQXdEQSxFQUFFQSxLQUFLQSxFQUMvREEsZUFBYUEsSUFBSUEsQ0FBQ0EsNkJBQTZCQSxDQUFDQSxLQUFLQSxFQUFFQSxDQUFDQSxDQUFDQSxRQUFLQSxFQUM5REEsUUFBUUEsQ0FBQ0EsQ0FBQ0E7U0FDckNBLENBQUNBO0tBQ0hBLENBQUNBO0tBRU9WLDhDQUE2QkEsR0FBckNBLFVBQXNDQSxLQUFlQSxFQUFFQSxZQUFvQkE7U0FDekVXLElBQUlBLFdBQVdBLEdBQUdBLEVBQUVBLENBQUNBO1NBQ3JCQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxZQUFZQSxFQUFFQSxDQUFDQSxFQUFFQSxFQUFFQSxDQUFDQTthQUN0Q0EsV0FBV0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsR0FBR0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsT0FBS0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsT0FBSUEsQ0FBQ0E7U0FDNURBLENBQUNBO1NBRURBLE1BQU1BLENBQUNBLFdBQVdBLENBQUNBLE1BQU1BLENBQUNBO0tBQzVCQSxDQUFDQTtLQTFHSFg7U0FBQ0EsdUJBQVVBLEVBQUVBOztnQkEyR1pBO0tBQURBLGFBQUNBO0FBQURBLEVBQUNBLElBQUE7QUExR1ksZUFBTSxTQTBHbEI7QUFFRDtLQUVFWSxtQkFBbUJBLEtBQWFBLEVBQVNBLFFBQWFBLEVBQVNBLE1BQWFBLEVBQ3pEQSxTQUFvQkEsRUFBU0EsV0FBb0JBO1NBRGpEQyxVQUFLQSxHQUFMQSxLQUFLQSxDQUFRQTtTQUFTQSxhQUFRQSxHQUFSQSxRQUFRQSxDQUFLQTtTQUFTQSxXQUFNQSxHQUFOQSxNQUFNQSxDQUFPQTtTQUN6REEsY0FBU0EsR0FBVEEsU0FBU0EsQ0FBV0E7U0FBU0EsZ0JBQVdBLEdBQVhBLFdBQVdBLENBQVNBO1NBRnBFQSxVQUFLQSxHQUFXQSxDQUFDQSxDQUFDQTtLQUVxREEsQ0FBQ0E7S0FFeEVELHdCQUFJQSxHQUFKQSxVQUFLQSxNQUFjQTtTQUNqQkUsSUFBSUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0EsR0FBR0EsTUFBTUEsQ0FBQ0E7U0FDNUJBLE1BQU1BLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLE1BQU1BLEdBQUdBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLFdBQUdBLENBQUNBO0tBQ3ZEQSxDQUFDQTtLQUVERixzQkFBSUEsMkJBQUlBO2NBQVJBLGNBQW9CRyxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTs7O1FBQUFIO0tBRTFDQSxzQkFBSUEsaUNBQVVBO2NBQWRBO2FBQ0VJLE1BQU1BLENBQUNBLENBQUNBLElBQUlBLENBQUNBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLE1BQU1BLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLE1BQU1BLENBQUNBO1NBQ2pGQSxDQUFDQTs7O1FBQUFKO0tBRURBLDJCQUFPQSxHQUFQQSxjQUFZSyxJQUFJQSxDQUFDQSxLQUFLQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUUzQkwscUNBQWlCQSxHQUFqQkEsVUFBa0JBLElBQVlBO1NBQzVCTSxFQUFFQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxXQUFXQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNoQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsRUFBRUEsQ0FBQ0E7YUFDZkEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7U0FDZEEsQ0FBQ0E7U0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFDTkEsTUFBTUEsQ0FBQ0EsS0FBS0EsQ0FBQ0E7U0FDZkEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFRE4sc0NBQWtCQSxHQUFsQkE7U0FDRU8sRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsY0FBY0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDMUJBLElBQUlBLENBQUNBLE9BQU9BLEVBQUVBLENBQUNBO2FBQ2ZBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBO1NBQ2RBLENBQUNBO1NBQUNBLElBQUlBLENBQUNBLENBQUNBO2FBQ05BLE1BQU1BLENBQUNBLEtBQUtBLENBQUNBO1NBQ2ZBLENBQUNBO0tBQ0hBLENBQUNBO0tBRURQLGtDQUFjQSxHQUFkQSxjQUE0QlEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsWUFBWUEsRUFBRUEsSUFBSUEsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FFM0ZSLG1DQUFlQSxHQUFmQSxVQUFnQkEsSUFBWUE7U0FDMUJTLEVBQUVBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFBQ0EsTUFBTUEsQ0FBQ0E7U0FDekNBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLHNCQUFvQkEsb0JBQWFBLENBQUNBLFlBQVlBLENBQUNBLElBQUlBLENBQUdBLENBQUNBLENBQUNBO0tBQ3JFQSxDQUFDQTtLQUdEVCxvQ0FBZ0JBLEdBQWhCQSxVQUFpQkEsRUFBVUE7U0FDekJVLEVBQUVBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQzdCQSxJQUFJQSxDQUFDQSxPQUFPQSxFQUFFQSxDQUFDQTthQUNmQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQTtTQUNkQSxDQUFDQTtTQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTthQUNOQSxNQUFNQSxDQUFDQSxLQUFLQSxDQUFDQTtTQUNmQSxDQUFDQTtLQUNIQSxDQUFDQTtLQUVEVixrQ0FBY0EsR0FBZEEsVUFBZUEsUUFBZ0JBO1NBQzdCVyxFQUFFQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLENBQUNBLENBQUNBO2FBQUNBLE1BQU1BLENBQUNBO1NBQzVDQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSwrQkFBNkJBLFFBQVVBLENBQUNBLENBQUNBO0tBQ3REQSxDQUFDQTtLQUVEWCw2Q0FBeUJBLEdBQXpCQTtTQUNFWSxJQUFJQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQTtTQUNsQkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsWUFBWUEsRUFBRUEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDeENBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLHNCQUFvQkEsQ0FBQ0EscUNBQWtDQSxDQUFDQSxDQUFDQTtTQUN0RUEsQ0FBQ0E7U0FDREEsSUFBSUEsQ0FBQ0EsT0FBT0EsRUFBRUEsQ0FBQ0E7U0FDZkEsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsUUFBUUEsRUFBRUEsQ0FBQ0E7S0FDdEJBLENBQUNBO0tBRURaLHFEQUFpQ0EsR0FBakNBO1NBQ0VhLElBQUlBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLElBQUlBLENBQUNBO1NBQ2xCQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxZQUFZQSxFQUFFQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxTQUFTQSxFQUFFQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxRQUFRQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQTthQUN6REEsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0Esc0JBQW9CQSxDQUFDQSw4Q0FBMkNBLENBQUNBLENBQUNBO1NBQy9FQSxDQUFDQTtTQUNEQSxJQUFJQSxDQUFDQSxPQUFPQSxFQUFFQSxDQUFDQTtTQUNmQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxRQUFRQSxFQUFFQSxDQUFDQTtLQUN0QkEsQ0FBQ0E7S0FFRGIsOEJBQVVBLEdBQVZBO1NBQ0VjLElBQUlBLEtBQUtBLEdBQUdBLEVBQUVBLENBQUNBO1NBQ2ZBLE9BQU9BLElBQUlBLENBQUNBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLE1BQU1BLEVBQUVBLENBQUNBO2FBQ3ZDQSxJQUFJQSxJQUFJQSxHQUFHQSxJQUFJQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQTthQUM1QkEsS0FBS0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFFakJBLEVBQUVBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLGlCQUFpQkEsQ0FBQ0Esa0JBQVVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2lCQUN2Q0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7cUJBQ3RCQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxzREFBc0RBLENBQUNBLENBQUNBO2lCQUNyRUEsQ0FBQ0E7aUJBQ0RBLE9BQU9BLElBQUlBLENBQUNBLGlCQUFpQkEsQ0FBQ0Esa0JBQVVBLENBQUNBLEVBQUVBLENBQUNBO2lCQUM1Q0EsQ0FBQ0EsQ0FBRUEsc0JBQXNCQTthQUMzQkEsQ0FBQ0E7YUFBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQzNDQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSx1QkFBcUJBLElBQUlBLENBQUNBLElBQUlBLE1BQUdBLENBQUNBLENBQUNBO2FBQ2hEQSxDQUFDQTtTQUNIQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxLQUFLQSxDQUFDQSxNQUFNQSxJQUFJQSxDQUFDQSxDQUFDQTthQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxlQUFTQSxFQUFFQSxDQUFDQTtTQUM5Q0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsTUFBTUEsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFBQ0EsTUFBTUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7U0FDdkNBLE1BQU1BLENBQUNBLElBQUlBLFdBQUtBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBO0tBQzFCQSxDQUFDQTtLQUVEZCw2QkFBU0EsR0FBVEE7U0FDRWUsSUFBSUEsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsZUFBZUEsRUFBRUEsQ0FBQ0E7U0FDcENBLEVBQUVBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDL0JBLEVBQUVBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLFdBQVdBLENBQUNBLENBQUNBLENBQUNBO2lCQUNyQkEsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsNENBQTRDQSxDQUFDQSxDQUFDQTthQUMzREEsQ0FBQ0E7YUFFREEsR0FBR0EsQ0FBQ0E7aUJBQ0ZBLElBQUlBLElBQUlBLEdBQUdBLElBQUlBLENBQUNBLHlCQUF5QkEsRUFBRUEsQ0FBQ0E7aUJBQzVDQSxJQUFJQSxJQUFJQSxHQUFHQSxFQUFFQSxDQUFDQTtpQkFDZEEsT0FBT0EsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxjQUFNQSxDQUFDQSxFQUFFQSxDQUFDQTtxQkFDdENBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLGVBQWVBLEVBQUVBLENBQUNBLENBQUNBO2lCQUNwQ0EsQ0FBQ0E7aUJBQ0RBLE1BQU1BLEdBQUdBLElBQUlBLGlCQUFXQSxDQUFDQSxNQUFNQSxFQUFFQSxJQUFJQSxFQUFFQSxJQUFJQSxDQUFDQSxDQUFDQTthQUMvQ0EsQ0FBQ0EsUUFBUUEsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQTtTQUN2Q0EsQ0FBQ0E7U0FFREEsTUFBTUEsQ0FBQ0EsTUFBTUEsQ0FBQ0E7S0FDaEJBLENBQUNBO0tBRURmLG1DQUFlQSxHQUFmQSxjQUF5QmdCLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLGdCQUFnQkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FFMURoQixvQ0FBZ0JBLEdBQWhCQTtTQUNFaUIsSUFBSUEsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0E7U0FDNUJBLElBQUlBLE1BQU1BLEdBQUdBLElBQUlBLENBQUNBLGNBQWNBLEVBQUVBLENBQUNBO1NBRW5DQSxFQUFFQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQy9CQSxJQUFJQSxHQUFHQSxHQUFHQSxJQUFJQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQTthQUMzQkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxjQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDcENBLElBQUlBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBO2lCQUMxQkEsSUFBSUEsVUFBVUEsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsS0FBS0EsRUFBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0E7aUJBQ2xEQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSw0QkFBMEJBLFVBQVVBLGdDQUE2QkEsQ0FBQ0EsQ0FBQ0E7YUFDaEZBLENBQUNBO2FBQ0RBLElBQUlBLEVBQUVBLEdBQUdBLElBQUlBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBO2FBQzFCQSxNQUFNQSxDQUFDQSxJQUFJQSxpQkFBV0EsQ0FBQ0EsTUFBTUEsRUFBRUEsR0FBR0EsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0E7U0FDMUNBLENBQUNBO1NBQUNBLElBQUlBLENBQUNBLENBQUNBO2FBQ05BLE1BQU1BLENBQUNBLE1BQU1BLENBQUNBO1NBQ2hCQSxDQUFDQTtLQUNIQSxDQUFDQTtLQUVEakIsa0NBQWNBLEdBQWRBO1NBQ0VrQixPQUFPQTtTQUNQQSxJQUFJQSxNQUFNQSxHQUFHQSxJQUFJQSxDQUFDQSxlQUFlQSxFQUFFQSxDQUFDQTtTQUNwQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQTthQUNuQ0EsTUFBTUEsR0FBR0EsSUFBSUEsWUFBTUEsQ0FBQ0EsSUFBSUEsRUFBRUEsTUFBTUEsRUFBRUEsSUFBSUEsQ0FBQ0EsZUFBZUEsRUFBRUEsQ0FBQ0EsQ0FBQ0E7U0FDNURBLENBQUNBO1NBQ0RBLE1BQU1BLENBQUNBLE1BQU1BLENBQUNBO0tBQ2hCQSxDQUFDQTtLQUVEbEIsbUNBQWVBLEdBQWZBO1NBQ0VtQixPQUFPQTtTQUNQQSxJQUFJQSxNQUFNQSxHQUFHQSxJQUFJQSxDQUFDQSxhQUFhQSxFQUFFQSxDQUFDQTtTQUNsQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQTthQUNuQ0EsTUFBTUEsR0FBR0EsSUFBSUEsWUFBTUEsQ0FBQ0EsSUFBSUEsRUFBRUEsTUFBTUEsRUFBRUEsSUFBSUEsQ0FBQ0EsYUFBYUEsRUFBRUEsQ0FBQ0EsQ0FBQ0E7U0FDMURBLENBQUNBO1NBQ0RBLE1BQU1BLENBQUNBLE1BQU1BLENBQUNBO0tBQ2hCQSxDQUFDQTtLQUVEbkIsaUNBQWFBLEdBQWJBO1NBQ0VvQix3QkFBd0JBO1NBQ3hCQSxJQUFJQSxNQUFNQSxHQUFHQSxJQUFJQSxDQUFDQSxlQUFlQSxFQUFFQSxDQUFDQTtTQUNwQ0EsT0FBT0EsSUFBSUEsRUFBRUEsQ0FBQ0E7YUFDWkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDaENBLE1BQU1BLEdBQUdBLElBQUlBLFlBQU1BLENBQUNBLElBQUlBLEVBQUVBLE1BQU1BLEVBQUVBLElBQUlBLENBQUNBLGVBQWVBLEVBQUVBLENBQUNBLENBQUNBO2FBQzVEQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2lCQUN4Q0EsTUFBTUEsR0FBR0EsSUFBSUEsWUFBTUEsQ0FBQ0EsS0FBS0EsRUFBRUEsTUFBTUEsRUFBRUEsSUFBSUEsQ0FBQ0EsZUFBZUEsRUFBRUEsQ0FBQ0EsQ0FBQ0E7YUFDN0RBLENBQUNBO2FBQUNBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQ3ZDQSxNQUFNQSxHQUFHQSxJQUFJQSxZQUFNQSxDQUFDQSxJQUFJQSxFQUFFQSxNQUFNQSxFQUFFQSxJQUFJQSxDQUFDQSxlQUFlQSxFQUFFQSxDQUFDQSxDQUFDQTthQUM1REEsQ0FBQ0E7YUFBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDeENBLE1BQU1BLEdBQUdBLElBQUlBLFlBQU1BLENBQUNBLEtBQUtBLEVBQUVBLE1BQU1BLEVBQUVBLElBQUlBLENBQUNBLGVBQWVBLEVBQUVBLENBQUNBLENBQUNBO2FBQzdEQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtpQkFDTkEsTUFBTUEsQ0FBQ0EsTUFBTUEsQ0FBQ0E7YUFDaEJBLENBQUNBO1NBQ0hBLENBQUNBO0tBQ0hBLENBQUNBO0tBRURwQixtQ0FBZUEsR0FBZkE7U0FDRXFCLHVCQUF1QkE7U0FDdkJBLElBQUlBLE1BQU1BLEdBQUdBLElBQUlBLENBQUNBLGFBQWFBLEVBQUVBLENBQUNBO1NBQ2xDQSxPQUFPQSxJQUFJQSxFQUFFQSxDQUFDQTthQUNaQSxFQUFFQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2lCQUMvQkEsTUFBTUEsR0FBR0EsSUFBSUEsWUFBTUEsQ0FBQ0EsR0FBR0EsRUFBRUEsTUFBTUEsRUFBRUEsSUFBSUEsQ0FBQ0EsYUFBYUEsRUFBRUEsQ0FBQ0EsQ0FBQ0E7YUFDekRBLENBQUNBO2FBQUNBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQ3RDQSxNQUFNQSxHQUFHQSxJQUFJQSxZQUFNQSxDQUFDQSxHQUFHQSxFQUFFQSxNQUFNQSxFQUFFQSxJQUFJQSxDQUFDQSxhQUFhQSxFQUFFQSxDQUFDQSxDQUFDQTthQUN6REEsQ0FBQ0E7YUFBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDdkNBLE1BQU1BLEdBQUdBLElBQUlBLFlBQU1BLENBQUNBLElBQUlBLEVBQUVBLE1BQU1BLEVBQUVBLElBQUlBLENBQUNBLGFBQWFBLEVBQUVBLENBQUNBLENBQUNBO2FBQzFEQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2lCQUN2Q0EsTUFBTUEsR0FBR0EsSUFBSUEsWUFBTUEsQ0FBQ0EsSUFBSUEsRUFBRUEsTUFBTUEsRUFBRUEsSUFBSUEsQ0FBQ0EsYUFBYUEsRUFBRUEsQ0FBQ0EsQ0FBQ0E7YUFDMURBLENBQUNBO2FBQUNBLElBQUlBLENBQUNBLENBQUNBO2lCQUNOQSxNQUFNQSxDQUFDQSxNQUFNQSxDQUFDQTthQUNoQkEsQ0FBQ0E7U0FDSEEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFRHJCLGlDQUFhQSxHQUFiQTtTQUNFc0IsV0FBV0E7U0FDWEEsSUFBSUEsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsbUJBQW1CQSxFQUFFQSxDQUFDQTtTQUN4Q0EsT0FBT0EsSUFBSUEsRUFBRUEsQ0FBQ0E7YUFDWkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDL0JBLE1BQU1BLEdBQUdBLElBQUlBLFlBQU1BLENBQUNBLEdBQUdBLEVBQUVBLE1BQU1BLEVBQUVBLElBQUlBLENBQUNBLG1CQUFtQkEsRUFBRUEsQ0FBQ0EsQ0FBQ0E7YUFDL0RBLENBQUNBO2FBQUNBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQ3RDQSxNQUFNQSxHQUFHQSxJQUFJQSxZQUFNQSxDQUFDQSxHQUFHQSxFQUFFQSxNQUFNQSxFQUFFQSxJQUFJQSxDQUFDQSxtQkFBbUJBLEVBQUVBLENBQUNBLENBQUNBO2FBQy9EQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtpQkFDTkEsTUFBTUEsQ0FBQ0EsTUFBTUEsQ0FBQ0E7YUFDaEJBLENBQUNBO1NBQ0hBLENBQUNBO0tBQ0hBLENBQUNBO0tBRUR0Qix1Q0FBbUJBLEdBQW5CQTtTQUNFdUIsZ0JBQWdCQTtTQUNoQkEsSUFBSUEsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsV0FBV0EsRUFBRUEsQ0FBQ0E7U0FDaENBLE9BQU9BLElBQUlBLEVBQUVBLENBQUNBO2FBQ1pBLEVBQUVBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQy9CQSxNQUFNQSxHQUFHQSxJQUFJQSxZQUFNQSxDQUFDQSxHQUFHQSxFQUFFQSxNQUFNQSxFQUFFQSxJQUFJQSxDQUFDQSxXQUFXQSxFQUFFQSxDQUFDQSxDQUFDQTthQUN2REEsQ0FBQ0E7YUFBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDdENBLE1BQU1BLEdBQUdBLElBQUlBLFlBQU1BLENBQUNBLEdBQUdBLEVBQUVBLE1BQU1BLEVBQUVBLElBQUlBLENBQUNBLFdBQVdBLEVBQUVBLENBQUNBLENBQUNBO2FBQ3ZEQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2lCQUN0Q0EsTUFBTUEsR0FBR0EsSUFBSUEsWUFBTUEsQ0FBQ0EsR0FBR0EsRUFBRUEsTUFBTUEsRUFBRUEsSUFBSUEsQ0FBQ0EsV0FBV0EsRUFBRUEsQ0FBQ0EsQ0FBQ0E7YUFDdkRBLENBQUNBO2FBQUNBLElBQUlBLENBQUNBLENBQUNBO2lCQUNOQSxNQUFNQSxDQUFDQSxNQUFNQSxDQUFDQTthQUNoQkEsQ0FBQ0E7U0FDSEEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFRHZCLCtCQUFXQSxHQUFYQTtTQUNFd0IsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUMvQkEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsV0FBV0EsRUFBRUEsQ0FBQ0E7U0FDNUJBLENBQUNBO1NBQUNBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDdENBLE1BQU1BLENBQUNBLElBQUlBLFlBQU1BLENBQUNBLEdBQUdBLEVBQUVBLElBQUlBLHNCQUFnQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsSUFBSUEsQ0FBQ0EsV0FBV0EsRUFBRUEsQ0FBQ0EsQ0FBQ0E7U0FDdEVBLENBQUNBO1NBQUNBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDdENBLE1BQU1BLENBQUNBLElBQUlBLGVBQVNBLENBQUNBLElBQUlBLENBQUNBLFdBQVdBLEVBQUVBLENBQUNBLENBQUNBO1NBQzNDQSxDQUFDQTtTQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTthQUNOQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxjQUFjQSxFQUFFQSxDQUFDQTtTQUMvQkEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFRHhCLGtDQUFjQSxHQUFkQTtTQUNFeUIsSUFBSUEsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsWUFBWUEsRUFBRUEsQ0FBQ0E7U0FDakNBLE9BQU9BLElBQUlBLEVBQUVBLENBQUNBO2FBQ1pBLEVBQUVBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsZUFBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQ3BDQSxNQUFNQSxHQUFHQSxJQUFJQSxDQUFDQSw2QkFBNkJBLENBQUNBLE1BQU1BLEVBQUVBLEtBQUtBLENBQUNBLENBQUNBO2FBRTdEQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2lCQUN2Q0EsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsNkJBQTZCQSxDQUFDQSxNQUFNQSxFQUFFQSxJQUFJQSxDQUFDQSxDQUFDQTthQUU1REEsQ0FBQ0E7YUFBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxpQkFBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQzdDQSxJQUFJQSxHQUFHQSxHQUFHQSxJQUFJQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQTtpQkFDM0JBLElBQUlBLENBQUNBLGVBQWVBLENBQUNBLGlCQUFTQSxDQUFDQSxDQUFDQTtpQkFDaENBLEVBQUVBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7cUJBQy9CQSxJQUFJQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLEVBQUVBLENBQUNBO3FCQUNwQ0EsTUFBTUEsR0FBR0EsSUFBSUEsZ0JBQVVBLENBQUNBLE1BQU1BLEVBQUVBLEdBQUdBLEVBQUVBLEtBQUtBLENBQUNBLENBQUNBO2lCQUM5Q0EsQ0FBQ0E7aUJBQUNBLElBQUlBLENBQUNBLENBQUNBO3FCQUNOQSxNQUFNQSxHQUFHQSxJQUFJQSxlQUFTQSxDQUFDQSxNQUFNQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQTtpQkFDdENBLENBQUNBO2FBRUhBLENBQUNBO2FBQUNBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsZUFBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQzNDQSxJQUFJQSxJQUFJQSxHQUFHQSxJQUFJQSxDQUFDQSxrQkFBa0JBLEVBQUVBLENBQUNBO2lCQUNyQ0EsSUFBSUEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsZUFBT0EsQ0FBQ0EsQ0FBQ0E7aUJBQzlCQSxNQUFNQSxHQUFHQSxJQUFJQSxrQkFBWUEsQ0FBQ0EsTUFBTUEsRUFBRUEsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFFMUNBLENBQUNBO2FBQUNBLElBQUlBLENBQUNBLENBQUNBO2lCQUNOQSxNQUFNQSxDQUFDQSxNQUFNQSxDQUFDQTthQUNoQkEsQ0FBQ0E7U0FDSEEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFRHpCLGdDQUFZQSxHQUFaQTtTQUNFMEIsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxlQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNwQ0EsSUFBSUEsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0E7YUFDOUJBLElBQUlBLENBQUNBLGVBQWVBLENBQUNBLGVBQU9BLENBQUNBLENBQUNBO2FBQzlCQSxNQUFNQSxDQUFDQSxNQUFNQSxDQUFDQTtTQUNoQkEsQ0FBQ0E7U0FBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsYUFBYUEsRUFBRUEsSUFBSUEsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0Esa0JBQWtCQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQTthQUN2RUEsSUFBSUEsQ0FBQ0EsT0FBT0EsRUFBRUEsQ0FBQ0E7YUFDZkEsTUFBTUEsQ0FBQ0EsSUFBSUEsc0JBQWdCQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUVwQ0EsQ0FBQ0E7U0FBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsYUFBYUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDckNBLElBQUlBLENBQUNBLE9BQU9BLEVBQUVBLENBQUNBO2FBQ2ZBLE1BQU1BLENBQUNBLElBQUlBLHNCQUFnQkEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7U0FFcENBLENBQUNBO1NBQUNBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLGNBQWNBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBO2FBQ3RDQSxJQUFJQSxDQUFDQSxPQUFPQSxFQUFFQSxDQUFDQTthQUNmQSxNQUFNQSxDQUFDQSxJQUFJQSxzQkFBZ0JBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBO1NBRXJDQSxDQUFDQTtTQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLGlCQUFTQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUM3Q0EsSUFBSUEsUUFBUUEsR0FBR0EsSUFBSUEsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxpQkFBU0EsQ0FBQ0EsQ0FBQ0E7YUFDbkRBLElBQUlBLENBQUNBLGVBQWVBLENBQUNBLGlCQUFTQSxDQUFDQSxDQUFDQTthQUNoQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsa0JBQVlBLENBQUNBLFFBQVFBLENBQUNBLENBQUNBO1NBRXBDQSxDQUFDQTtTQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxXQUFXQSxDQUFDQSxlQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUMxQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsZUFBZUEsRUFBRUEsQ0FBQ0E7U0FFaENBLENBQUNBO1NBQUNBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLFlBQVlBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBO2FBQ3BDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSw2QkFBNkJBLENBQUNBLGlCQUFpQkEsRUFBRUEsS0FBS0EsQ0FBQ0EsQ0FBQ0E7U0FFdEVBLENBQUNBO1NBQUNBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBO2FBQ2hDQSxJQUFJQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxRQUFRQSxFQUFFQSxDQUFDQTthQUNqQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsRUFBRUEsQ0FBQ0E7YUFDZkEsTUFBTUEsQ0FBQ0EsSUFBSUEsc0JBQWdCQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQTtTQUVyQ0EsQ0FBQ0E7U0FBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsUUFBUUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDaENBLElBQUlBLFlBQVlBLEdBQUdBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBO2FBQ3hDQSxJQUFJQSxDQUFDQSxPQUFPQSxFQUFFQSxDQUFDQTthQUNmQSxNQUFNQSxDQUFDQSxJQUFJQSxzQkFBZ0JBLENBQUNBLFlBQVlBLENBQUNBLENBQUNBO1NBRTVDQSxDQUFDQTtTQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxLQUFLQSxJQUFJQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQTthQUM1Q0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsbUNBQWlDQSxJQUFJQSxDQUFDQSxLQUFPQSxDQUFDQSxDQUFDQTtTQUU1REEsQ0FBQ0E7U0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFDTkEsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0Esc0JBQW9CQSxJQUFJQSxDQUFDQSxJQUFNQSxDQUFDQSxDQUFDQTtTQUM5Q0EsQ0FBQ0E7U0FDREEsMENBQTBDQTtTQUMxQ0EsTUFBTUEsSUFBSUEsMEJBQWFBLENBQUNBLHdDQUF3Q0EsQ0FBQ0EsQ0FBQ0E7S0FDcEVBLENBQUNBO0tBRUQxQix1Q0FBbUJBLEdBQW5CQSxVQUFvQkEsVUFBa0JBO1NBQ3BDMkIsSUFBSUEsTUFBTUEsR0FBR0EsRUFBRUEsQ0FBQ0E7U0FDaEJBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLFdBQVdBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQ3ZDQSxHQUFHQSxDQUFDQTtpQkFDRkEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0E7YUFDaENBLENBQUNBLFFBQVFBLElBQUlBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsY0FBTUEsQ0FBQ0EsRUFBRUE7U0FDM0NBLENBQUNBO1NBQ0RBLE1BQU1BLENBQUNBLE1BQU1BLENBQUNBO0tBQ2hCQSxDQUFDQTtLQUVEM0IsbUNBQWVBLEdBQWZBO1NBQ0U0QixJQUFJQSxJQUFJQSxHQUFHQSxFQUFFQSxDQUFDQTtTQUNkQSxJQUFJQSxNQUFNQSxHQUFHQSxFQUFFQSxDQUFDQTtTQUNoQkEsSUFBSUEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsZUFBT0EsQ0FBQ0EsQ0FBQ0E7U0FDOUJBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsZUFBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDckNBLEdBQUdBLENBQUNBO2lCQUNGQSxJQUFJQSxHQUFHQSxHQUFHQSxJQUFJQSxDQUFDQSxpQ0FBaUNBLEVBQUVBLENBQUNBO2lCQUNuREEsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7aUJBQ2ZBLElBQUlBLENBQUNBLGVBQWVBLENBQUNBLGNBQU1BLENBQUNBLENBQUNBO2lCQUM3QkEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0E7YUFDaENBLENBQUNBLFFBQVFBLElBQUlBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsY0FBTUEsQ0FBQ0EsRUFBRUE7YUFDekNBLElBQUlBLENBQUNBLGVBQWVBLENBQUNBLGVBQU9BLENBQUNBLENBQUNBO1NBQ2hDQSxDQUFDQTtTQUNEQSxNQUFNQSxDQUFDQSxJQUFJQSxnQkFBVUEsQ0FBQ0EsSUFBSUEsRUFBRUEsTUFBTUEsQ0FBQ0EsQ0FBQ0E7S0FDdENBLENBQUNBO0tBRUQ1QixpREFBNkJBLEdBQTdCQSxVQUE4QkEsUUFBYUEsRUFBRUEsTUFBdUJBO1NBQXZCNkIsc0JBQXVCQSxHQUF2QkEsY0FBdUJBO1NBQ2xFQSxJQUFJQSxFQUFFQSxHQUFHQSxJQUFJQSxDQUFDQSx5QkFBeUJBLEVBQUVBLENBQUNBO1NBRTFDQSxFQUFFQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLGVBQU9BLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQ3BDQSxJQUFJQSxJQUFJQSxHQUFHQSxJQUFJQSxDQUFDQSxrQkFBa0JBLEVBQUVBLENBQUNBO2FBQ3JDQSxJQUFJQSxDQUFDQSxlQUFlQSxDQUFDQSxlQUFPQSxDQUFDQSxDQUFDQTthQUM5QkEsSUFBSUEsRUFBRUEsR0FBR0EsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0E7YUFDbkNBLE1BQU1BLENBQUNBLE1BQU1BLEdBQUdBLElBQUlBLG9CQUFjQSxDQUFDQSxRQUFRQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxJQUFJQSxDQUFDQTtpQkFDMUNBLElBQUlBLGdCQUFVQSxDQUFDQSxRQUFRQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUV6REEsQ0FBQ0E7U0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFDTkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQ1hBLEVBQUVBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7cUJBQy9CQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxvREFBb0RBLENBQUNBLENBQUNBO2lCQUNuRUEsQ0FBQ0E7aUJBQUNBLElBQUlBLENBQUNBLENBQUNBO3FCQUNOQSxNQUFNQSxDQUFDQSxJQUFJQSxzQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLEVBQUVBLEVBQUVBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLE1BQU1BLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBO2lCQUN2RUEsQ0FBQ0E7YUFDSEEsQ0FBQ0E7YUFBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7aUJBQ05BLEVBQUVBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7cUJBQy9CQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxXQUFXQSxDQUFDQSxDQUFDQSxDQUFDQTt5QkFDdEJBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLHFDQUFxQ0EsQ0FBQ0EsQ0FBQ0E7cUJBQ3BEQSxDQUFDQTtxQkFFREEsSUFBSUEsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxFQUFFQSxDQUFDQTtxQkFDcENBLE1BQU1BLENBQUNBLElBQUlBLG1CQUFhQSxDQUFDQSxRQUFRQSxFQUFFQSxFQUFFQSxFQUFFQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxNQUFNQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxLQUFLQSxDQUFDQSxDQUFDQTtpQkFDM0VBLENBQUNBO2lCQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtxQkFDTkEsTUFBTUEsQ0FBQ0EsSUFBSUEsa0JBQVlBLENBQUNBLFFBQVFBLEVBQUVBLEVBQUVBLEVBQUVBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLE1BQU1BLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBO2lCQUNuRUEsQ0FBQ0E7YUFDSEEsQ0FBQ0E7U0FDSEEsQ0FBQ0E7U0FFREEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7S0FDZEEsQ0FBQ0E7S0FFRDdCLHNDQUFrQkEsR0FBbEJBO1NBQ0U4QixFQUFFQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxXQUFXQSxDQUFDQSxlQUFPQSxDQUFDQSxDQUFDQTthQUFDQSxNQUFNQSxDQUFDQSxFQUFFQSxDQUFDQTtTQUM5Q0EsSUFBSUEsV0FBV0EsR0FBR0EsRUFBRUEsQ0FBQ0E7U0FDckJBLEdBQUdBLENBQUNBO2FBQ0ZBLFdBQVdBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLENBQUNBO1NBQ3JDQSxDQUFDQSxRQUFRQSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLGNBQU1BLENBQUNBLEVBQUVBO1NBQ3pDQSxNQUFNQSxDQUFDQSxXQUFXQSxDQUFDQTtLQUNyQkEsQ0FBQ0E7S0FFRDlCLHFDQUFpQkEsR0FBakJBO1NBQ0UrQixFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxXQUFXQSxDQUFDQSxDQUFDQSxDQUFDQTthQUN0QkEsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0Esc0RBQXNEQSxDQUFDQSxDQUFDQTtTQUNyRUEsQ0FBQ0E7U0FDREEsSUFBSUEsS0FBS0EsR0FBR0EsRUFBRUEsQ0FBQ0E7U0FDZkEsT0FBT0EsSUFBSUEsQ0FBQ0EsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsTUFBTUEsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsV0FBV0EsQ0FBQ0EsZUFBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0E7YUFDMUVBLElBQUlBLElBQUlBLEdBQUdBLElBQUlBLENBQUNBLGVBQWVBLEVBQUVBLENBQUNBO2FBQ2xDQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTthQUVqQkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxrQkFBVUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQ3ZDQSxPQUFPQSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLGtCQUFVQSxDQUFDQSxFQUFFQSxDQUFDQTtpQkFDNUNBLENBQUNBLENBQUVBLHNCQUFzQkE7YUFDM0JBLENBQUNBO1NBQ0hBLENBQUNBO1NBQ0RBLEVBQUVBLENBQUNBLENBQUNBLEtBQUtBLENBQUNBLE1BQU1BLElBQUlBLENBQUNBLENBQUNBO2FBQUNBLE1BQU1BLENBQUNBLElBQUlBLGVBQVNBLEVBQUVBLENBQUNBO1NBQzlDQSxFQUFFQSxDQUFDQSxDQUFDQSxLQUFLQSxDQUFDQSxNQUFNQSxJQUFJQSxDQUFDQSxDQUFDQTthQUFDQSxNQUFNQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtTQUV2Q0EsTUFBTUEsQ0FBQ0EsSUFBSUEsV0FBS0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7S0FDMUJBLENBQUNBO0tBR0QvQjs7UUFFR0E7S0FDSEEsNENBQXdCQSxHQUF4QkE7U0FDRWdDLElBQUlBLE1BQU1BLEdBQUdBLEVBQUVBLENBQUNBO1NBQ2hCQSxJQUFJQSxhQUFhQSxHQUFHQSxLQUFLQSxDQUFDQTtTQUMxQkEsR0FBR0EsQ0FBQ0E7YUFDRkEsTUFBTUEsSUFBSUEsSUFBSUEsQ0FBQ0EsaUNBQWlDQSxFQUFFQSxDQUFDQTthQUNuREEsYUFBYUEsR0FBR0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQTthQUMzQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsYUFBYUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQ2xCQSxNQUFNQSxJQUFJQSxHQUFHQSxDQUFDQTthQUNoQkEsQ0FBQ0E7U0FDSEEsQ0FBQ0EsUUFBUUEsYUFBYUEsRUFBRUE7U0FFeEJBLE1BQU1BLENBQUNBLE1BQU1BLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBO0tBQzNCQSxDQUFDQTtLQUVEaEMseUNBQXFCQSxHQUFyQkE7U0FDRWlDLElBQUlBLFFBQVFBLEdBQUdBLEVBQUVBLENBQUNBO1NBQ2xCQSxJQUFJQSxNQUFNQSxHQUFHQSxJQUFJQSxDQUFDQTtTQUNsQkEsT0FBT0EsSUFBSUEsQ0FBQ0EsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsTUFBTUEsRUFBRUEsQ0FBQ0E7YUFDdkNBLElBQUlBLFFBQVFBLEdBQVlBLElBQUlBLENBQUNBLGtCQUFrQkEsRUFBRUEsQ0FBQ0E7YUFDbERBLElBQUlBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLHdCQUF3QkEsRUFBRUEsQ0FBQ0E7YUFDMUNBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLFFBQVFBLENBQUNBLENBQUNBLENBQUNBO2lCQUNkQSxFQUFFQSxDQUFDQSxDQUFDQSxNQUFNQSxJQUFJQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQTtxQkFDbkJBLE1BQU1BLEdBQUdBLEdBQUdBLENBQUNBO2lCQUNmQSxDQUFDQTtpQkFBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7cUJBQ05BLEdBQUdBLEdBQUdBLE1BQU1BLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLFdBQVdBLEVBQUVBLEdBQUdBLEdBQUdBLENBQUNBLFNBQVNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2lCQUN6REEsQ0FBQ0E7YUFDSEEsQ0FBQ0E7YUFDREEsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxjQUFNQSxDQUFDQSxDQUFDQTthQUMvQkEsSUFBSUEsSUFBSUEsR0FBR0EsSUFBSUEsQ0FBQ0E7YUFDaEJBLElBQUlBLFVBQVVBLEdBQUdBLElBQUlBLENBQUNBO2FBQ3RCQSxFQUFFQSxDQUFDQSxDQUFDQSxRQUFRQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDYkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtxQkFDL0JBLElBQUlBLEdBQUdBLElBQUlBLENBQUNBLHdCQUF3QkEsRUFBRUEsQ0FBQ0E7aUJBQ3pDQSxDQUFDQTtpQkFBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7cUJBQ05BLElBQUlBLEdBQUdBLFlBQVlBLENBQUNBO2lCQUN0QkEsQ0FBQ0E7YUFDSEEsQ0FBQ0E7YUFBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsS0FBS0EsV0FBR0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsY0FBY0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQ3ZEQSxJQUFJQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQTtpQkFDNUJBLElBQUlBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBO2lCQUMzQkEsSUFBSUEsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsS0FBS0EsRUFBRUEsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsQ0FBQ0E7aUJBQzFEQSxVQUFVQSxHQUFHQSxJQUFJQSxtQkFBYUEsQ0FBQ0EsR0FBR0EsRUFBRUEsTUFBTUEsRUFBRUEsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0E7YUFDN0RBLENBQUNBO2FBQ0RBLFFBQVFBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLHFCQUFlQSxDQUFDQSxHQUFHQSxFQUFFQSxRQUFRQSxFQUFFQSxJQUFJQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNwRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxrQkFBVUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQ3hDQSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLGNBQU1BLENBQUNBLENBQUNBO2FBQ2pDQSxDQUFDQTtTQUNIQSxDQUFDQTtTQUNEQSxNQUFNQSxDQUFDQSxRQUFRQSxDQUFDQTtLQUNsQkEsQ0FBQ0E7S0FFRGpDLHlCQUFLQSxHQUFMQSxVQUFNQSxPQUFlQSxFQUFFQSxLQUFvQkE7U0FBcEJrQyxxQkFBb0JBLEdBQXBCQSxZQUFvQkE7U0FDekNBLEVBQUVBLENBQUNBLENBQUNBLGNBQU9BLENBQUNBLEtBQUtBLENBQUNBLENBQUNBO2FBQUNBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBO1NBRXZDQSxJQUFJQSxRQUFRQSxHQUFHQSxDQUFDQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxNQUFNQSxDQUFDQSxHQUFHQSxnQkFBYUEsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsS0FBS0EsR0FBR0EsQ0FBQ0EsU0FBS0E7YUFDOUNBLDhCQUE4QkEsQ0FBQ0E7U0FFN0VBLE1BQU1BLElBQUlBLGNBQWNBLENBQUNBLE9BQU9BLEVBQUVBLElBQUlBLENBQUNBLEtBQUtBLEVBQUVBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLENBQUNBO0tBQ3pFQSxDQUFDQTtLQUNIbEMsZ0JBQUNBO0FBQURBLEVBQUNBLElBQUE7QUE5Y1ksa0JBQVMsWUE4Y3JCO0FBRUQ7S0FBQW1DO1NBT0VDLFdBQU1BLEdBQUdBLElBQUlBLENBQUNBO0tBK0NoQkEsQ0FBQ0E7S0FyRFFELDZCQUFLQSxHQUFaQSxVQUFhQSxHQUFRQTtTQUNuQkUsSUFBSUEsQ0FBQ0EsR0FBR0EsSUFBSUEsdUJBQXVCQSxFQUFFQSxDQUFDQTtTQUN0Q0EsR0FBR0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7U0FDYkEsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsTUFBTUEsQ0FBQ0E7S0FDbEJBLENBQUNBO0tBSURGLHVEQUFxQkEsR0FBckJBLFVBQXNCQSxHQUFxQkEsSUFBR0csQ0FBQ0E7S0FFL0NILG9EQUFrQkEsR0FBbEJBLFVBQW1CQSxHQUFrQkEsSUFBSUksSUFBSUEsQ0FBQ0EsTUFBTUEsR0FBR0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FFL0RKLHVEQUFxQkEsR0FBckJBLFVBQXNCQSxHQUFxQkEsSUFBR0ssQ0FBQ0E7S0FFL0NMLG1EQUFpQkEsR0FBakJBLFVBQWtCQSxHQUFpQkEsSUFBR00sQ0FBQ0E7S0FFdkNOLG9EQUFrQkEsR0FBbEJBLFVBQW1CQSxHQUFrQkEsSUFBSU8sSUFBSUEsQ0FBQ0EsTUFBTUEsR0FBR0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FFL0RQLHVEQUFxQkEsR0FBckJBLFVBQXNCQSxHQUFxQkEsSUFBSVEsSUFBSUEsQ0FBQ0EsTUFBTUEsR0FBR0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FFckVSLGlEQUFlQSxHQUFmQSxVQUFnQkEsR0FBZUEsSUFBSVMsSUFBSUEsQ0FBQ0EsTUFBTUEsR0FBR0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FFekRULHFEQUFtQkEsR0FBbkJBLFVBQW9CQSxHQUFtQkEsSUFBSVUsSUFBSUEsQ0FBQ0EsTUFBTUEsR0FBR0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FFakVWLG1EQUFpQkEsR0FBakJBLFVBQWtCQSxHQUFpQkEsSUFBSVcsSUFBSUEsQ0FBQ0EsTUFBTUEsR0FBR0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FFN0RYLG1EQUFpQkEsR0FBakJBLFVBQWtCQSxHQUFpQkEsSUFBSVksSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FFeEVaLGlEQUFlQSxHQUFmQSxVQUFnQkEsR0FBZUEsSUFBSWEsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FFL0RiLDZDQUFXQSxHQUFYQSxVQUFZQSxHQUFXQSxJQUFJYyxJQUFJQSxDQUFDQSxNQUFNQSxHQUFHQSxLQUFLQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUVqRGQsZ0RBQWNBLEdBQWRBLFVBQWVBLEdBQWNBLElBQUllLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLEtBQUtBLENBQUNBLENBQUNBLENBQUNBO0tBRXZEZixrREFBZ0JBLEdBQWhCQSxVQUFpQkEsR0FBZ0JBLElBQUlnQixJQUFJQSxDQUFDQSxNQUFNQSxHQUFHQSxLQUFLQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUUzRGhCLDJDQUFTQSxHQUFUQSxVQUFVQSxHQUFnQkEsSUFBSWlCLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLEtBQUtBLENBQUNBLENBQUNBLENBQUNBO0tBRXBEakIsZ0RBQWNBLEdBQWRBLFVBQWVBLEdBQWNBLElBQUlrQixJQUFJQSxDQUFDQSxNQUFNQSxHQUFHQSxLQUFLQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUV2RGxCLGlEQUFlQSxHQUFmQSxVQUFnQkEsR0FBZUEsSUFBSW1CLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLEtBQUtBLENBQUNBLENBQUNBLENBQUNBO0tBRXpEbkIsMENBQVFBLEdBQVJBLFVBQVNBLElBQVdBO1NBQ2xCb0IsSUFBSUEsR0FBR0EsR0FBR0Esd0JBQVdBLENBQUNBLGVBQWVBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBO1NBQ25EQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxNQUFNQSxFQUFFQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQTthQUNyQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7U0FDL0JBLENBQUNBO1NBQ0RBLE1BQU1BLENBQUNBLEdBQUdBLENBQUNBO0tBQ2JBLENBQUNBO0tBRURwQiw0Q0FBVUEsR0FBVkEsVUFBV0EsR0FBVUEsSUFBSXFCLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLEtBQUtBLENBQUNBLENBQUNBLENBQUNBO0tBRS9DckIsNENBQVVBLEdBQVZBLFVBQVdBLEdBQVVBLElBQUlzQixJQUFJQSxDQUFDQSxNQUFNQSxHQUFHQSxLQUFLQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUNqRHRCLDhCQUFDQTtBQUFEQSxFQUFDQSxJQUFBOzs7Ozs7O0FDOXFCRCxrQ0FBd0IsQ0FBMEIsQ0FBQztBQUNuRCx3Q0FBNEIsRUFBZ0MsQ0FBQztBQUM3RCx3Q0FBc0MsRUFBZ0MsQ0FBQztBQUV2RTtLQUNFdUIsZ0JBQW1CQSxNQUFjQSxFQUFTQSxPQUFzQkE7U0FBN0NDLFdBQU1BLEdBQU5BLE1BQU1BLENBQVFBO1NBQVNBLFlBQU9BLEdBQVBBLE9BQU9BLENBQWVBO0tBQUdBLENBQUNBO0tBRXBFRCx5QkFBUUEsR0FBUkEsVUFBU0EsSUFBWUE7U0FDbkJFLEVBQUVBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEdBQUdBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQzNCQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQTtTQUNkQSxDQUFDQTtTQUVEQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDM0JBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLFFBQVFBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO1NBQ3BDQSxDQUFDQTtTQUVEQSxNQUFNQSxDQUFDQSxLQUFLQSxDQUFDQTtLQUNmQSxDQUFDQTtLQUVERixvQkFBR0EsR0FBSEEsVUFBSUEsSUFBWUE7U0FDZEcsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDM0JBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEdBQUdBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO1NBQ2hDQSxDQUFDQTtTQUVEQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDM0JBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLEdBQUdBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO1NBQy9CQSxDQUFDQTtTQUVEQSxNQUFNQSxJQUFJQSwwQkFBYUEsQ0FBQ0Esa0JBQWdCQSxJQUFJQSxNQUFHQSxDQUFDQSxDQUFDQTtLQUNuREEsQ0FBQ0E7S0FFREgsb0JBQUdBLEdBQUhBLFVBQUlBLElBQVlBLEVBQUVBLEtBQVVBO1NBQzFCSSwyRUFBMkVBO1NBQzNFQSw2QkFBNkJBO1NBQzdCQSx5REFBeURBO1NBQ3pEQSxFQUFFQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUMzQkEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsRUFBRUEsS0FBS0EsQ0FBQ0EsQ0FBQ0E7U0FDaENBLENBQUNBO1NBQUNBLElBQUlBLENBQUNBLENBQUNBO2FBQ05BLE1BQU1BLElBQUlBLDBCQUFhQSxDQUNuQkEsa0VBQWdFQSxJQUFJQSxNQUFHQSxDQUFDQSxDQUFDQTtTQUMvRUEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFREosNEJBQVdBLEdBQVhBLGNBQXNCSyx1QkFBVUEsQ0FBQ0EsV0FBV0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDL0RMLGFBQUNBO0FBQURBLEVBQUNBLElBQUE7QUF4Q1ksZUFBTSxTQXdDbEI7Ozs7Ozs7Ozs7OztBQzVDRCx3Q0FBOEMsRUFBZ0MsQ0FBQztBQUUvRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFnQ0c7QUFDSDtLQUFxRU0sbUVBQWFBO0tBQ2hGQSx5REFBWUEsR0FBV0EsRUFBRUEsUUFBYUEsRUFBRUEsU0FBY0EsRUFBRUEsT0FBWUE7U0FDbEVDLGtCQUFNQSxrQkFBZUEsR0FBR0EsMENBQXNDQTthQUN4REEsdUJBQW9CQSxRQUFRQSwyQkFBc0JBLFNBQVNBLE9BQUdBLENBQUNBLENBQUNBO0tBQ3hFQSxDQUFDQTtLQUNIRCxzREFBQ0E7QUFBREEsRUFBQ0EsRUFMb0UsMEJBQWEsRUFLakY7QUFMWSx3REFBK0Msa0RBSzNEO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQThCRztBQUNIO0tBQTBDRSx3Q0FBZ0JBO0tBTXhEQSw4QkFBWUEsR0FBV0EsRUFBRUEsaUJBQXNCQSxFQUFFQSxhQUFrQkEsRUFBRUEsT0FBWUE7U0FDL0VDLGtCQUFTQSxpQkFBaUJBLGFBQVFBLEdBQUdBLE1BQUdBLEVBQUVBLGlCQUFpQkEsRUFBRUEsYUFBYUEsRUFBRUEsT0FBT0EsQ0FBQ0EsQ0FBQ0E7U0FDckZBLElBQUlBLENBQUNBLFFBQVFBLEdBQUdBLEdBQUdBLENBQUNBO0tBQ3RCQSxDQUFDQTtLQUNIRCwyQkFBQ0E7QUFBREEsRUFBQ0EsRUFWeUMsNkJBQWdCLEVBVXpEO0FBVlksNkJBQW9CLHVCQVVoQztBQUVEOzs7Ozs7SUFNRztBQUNIO0tBQXlDRSx1Q0FBYUE7S0FDcERBO1NBQWdCQyxrQkFBTUEscURBQXFEQSxDQUFDQSxDQUFDQTtLQUFDQSxDQUFDQTtLQUNqRkQsMEJBQUNBO0FBQURBLEVBQUNBLEVBRndDLDBCQUFhLEVBRXJEO0FBRlksNEJBQW1CLHNCQUUvQjs7Ozs7OztBQ3hGRDtLQUNFRSxzQkFBbUJBLE9BQVlBLEVBQVNBLGdCQUFxQkEsRUFBU0EsU0FBY0EsRUFDakVBLE9BQVlBLEVBQVNBLE1BQVdBLEVBQVNBLFFBQWFBO1NBRHREQyxZQUFPQSxHQUFQQSxPQUFPQSxDQUFLQTtTQUFTQSxxQkFBZ0JBLEdBQWhCQSxnQkFBZ0JBLENBQUtBO1NBQVNBLGNBQVNBLEdBQVRBLFNBQVNBLENBQUtBO1NBQ2pFQSxZQUFPQSxHQUFQQSxPQUFPQSxDQUFLQTtTQUFTQSxXQUFNQSxHQUFOQSxNQUFNQSxDQUFLQTtTQUFTQSxhQUFRQSxHQUFSQSxRQUFRQSxDQUFLQTtLQUFHQSxDQUFDQTtLQUMvRUQsbUJBQUNBO0FBQURBLEVBQUNBLElBQUE7QUFIWSxxQkFBWSxlQUd4QjtBQStCRDtLQUNFRSxpQ0FBbUJBLFlBQXFCQSxFQUFTQSxnQkFBeUJBLEVBQ3ZEQSxNQUFlQTtTQURmQyxpQkFBWUEsR0FBWkEsWUFBWUEsQ0FBU0E7U0FBU0EscUJBQWdCQSxHQUFoQkEsZ0JBQWdCQSxDQUFTQTtTQUN2REEsV0FBTUEsR0FBTkEsTUFBTUEsQ0FBU0E7S0FBR0EsQ0FBQ0E7S0FDeENELDhCQUFDQTtBQUFEQSxFQUFDQSxJQUFBO0FBSFksZ0NBQXVCLDBCQUduQztBQUVEO0tBQ0VFLGtDQUFtQkEsRUFBVUEsRUFBU0EsUUFBaUNBLEVBQ3BEQSxhQUF1QkEsRUFBU0EsY0FBK0JBLEVBQy9EQSxZQUE2QkEsRUFBU0EsZ0JBQW1DQSxFQUN6RUEsU0FBa0NBO1NBSGxDQyxPQUFFQSxHQUFGQSxFQUFFQSxDQUFRQTtTQUFTQSxhQUFRQSxHQUFSQSxRQUFRQSxDQUF5QkE7U0FDcERBLGtCQUFhQSxHQUFiQSxhQUFhQSxDQUFVQTtTQUFTQSxtQkFBY0EsR0FBZEEsY0FBY0EsQ0FBaUJBO1NBQy9EQSxpQkFBWUEsR0FBWkEsWUFBWUEsQ0FBaUJBO1NBQVNBLHFCQUFnQkEsR0FBaEJBLGdCQUFnQkEsQ0FBbUJBO1NBQ3pFQSxjQUFTQSxHQUFUQSxTQUFTQSxDQUF5QkE7S0FBR0EsQ0FBQ0E7S0FDM0RELCtCQUFDQTtBQUFEQSxFQUFDQSxJQUFBO0FBTFksaUNBQXdCLDJCQUtwQzs7Ozs7OztBQ2xERCxrQ0FBb0QsQ0FBMEIsQ0FBQztBQUUvRTs7SUFFRztBQUNILFlBQVksbUJBQW1CO0tBQzdCRTs7O1FBR0dBO0tBQ0hBLDZFQUFZQTtLQUVaQTs7O1FBR0dBO0tBQ0hBLCtFQUFhQTtLQUViQTs7OztRQUlHQTtLQUNIQSxtRUFBT0E7QUFDVEEsRUFBQ0EsRUFuQlcsMkJBQW1CLEtBQW5CLDJCQUFtQixRQW1COUI7QUFuQkQsS0FBWSxtQkFBbUIsR0FBbkIsMkJBbUJYO0FBRUQ7OztJQUdHO0FBQ0gsWUFBWSx1QkFBdUI7S0FDakNDOzs7UUFHR0E7S0FDSEEsK0VBQVNBO0tBRVRBOzs7UUFHR0E7S0FDSEEsMkVBQU9BO0tBRVBBOzs7UUFHR0E7S0FDSEEsbUZBQVdBO0tBRVhBOzs7UUFHR0E7S0FDSEEsNkVBQVFBO0tBRVJBOztRQUVHQTtLQUNIQSx5RUFBTUE7S0FFTkE7O1FBRUdBO0tBQ0hBLDJFQUFPQTtLQUVQQTs7UUFFR0E7S0FDSEEsdUZBQWFBO0FBQ2ZBLEVBQUNBLEVBdkNXLCtCQUF1QixLQUF2QiwrQkFBdUIsUUF1Q2xDO0FBdkNELEtBQVksdUJBQXVCLEdBQXZCLCtCQXVDWDtBQUVEOztJQUVHO0FBQ1EseUNBQWdDLEdBQUc7S0FDNUMsdUJBQXVCLENBQUMsU0FBUztLQUNqQyx1QkFBdUIsQ0FBQyxPQUFPO0tBQy9CLHVCQUF1QixDQUFDLFdBQVc7S0FDbkMsdUJBQXVCLENBQUMsUUFBUTtLQUNoQyx1QkFBdUIsQ0FBQyxNQUFNO0tBQzlCLHVCQUF1QixDQUFDLE9BQU87S0FDL0IsdUJBQXVCLENBQUMsYUFBYTtFQUN0QyxDQUFDO0FBRUY7O0lBRUc7QUFDUSxxQ0FBNEIsR0FBRztLQUN4QyxtQkFBbUIsQ0FBQyxZQUFZO0tBQ2hDLG1CQUFtQixDQUFDLGFBQWE7S0FDakMsbUJBQW1CLENBQUMsT0FBTztFQUM1QixDQUFDO0FBRUYsMkNBQ0ksdUJBQWdEO0tBQ2xEQyxNQUFNQSxDQUFDQSxjQUFPQSxDQUFDQSx1QkFBdUJBLENBQUNBO1NBQ2hDQSx1QkFBdUJBLEtBQUtBLHVCQUF1QkEsQ0FBQ0EsT0FBT0EsQ0FBQ0E7QUFDckVBLEVBQUNBO0FBSmUseUNBQWdDLG1DQUkvQzs7Ozs7OztBQ2pHRCxrQ0FBaUQsQ0FBMEIsQ0FBQztBQUM1RSx3Q0FBNEIsRUFBZ0MsQ0FBQztBQUM3RCx3Q0FBd0QsRUFBZ0MsQ0FBQztBQUV6RixpQ0F1Qk8sRUFBYyxDQUFDO0FBR3RCLG1EQUFrQyxFQUF5QixDQUFDO0FBQzVELHFEQUFvQyxFQUEyQixDQUFDO0FBRWhFLDhDQUE4QyxFQUFvQixDQUFDO0FBQ25FLDJDQUEyQixFQUFpQixDQUFDO0FBRTdDLHNDQUF1QixFQUFZLENBQUM7QUFDcEMsMENBQXNDLEVBQWdCLENBQUM7QUFFdkQ7S0FVRUMsb0NBQW9CQSxXQUFxQ0E7U0FBckNDLGdCQUFXQSxHQUFYQSxXQUFXQSxDQUEwQkE7U0FDdkRBLElBQUlBLENBQUNBLHVCQUF1QkEsR0FBR0EscUJBQXFCQSxDQUFDQSxXQUFXQSxDQUFDQSxDQUFDQTtTQUNsRUEsSUFBSUEsQ0FBQ0Esb0JBQW9CQSxHQUFHQSxrQkFBa0JBLENBQUNBLFdBQVdBLENBQUNBLENBQUNBO1NBQzVEQSxJQUFJQSxDQUFDQSx1QkFBdUJBLEdBQUdBLElBQUlBLENBQUNBLFdBQVdBLENBQUNBLGNBQWNBLENBQUNBLEdBQUdBLENBQUNBLFdBQUNBLElBQUlBLFFBQUNBLENBQUNBLE1BQU1BLEVBQVJBLENBQVFBLENBQUNBLENBQUNBO1NBQ2xGQSxJQUFJQSxDQUFDQSxpQkFBaUJBLEdBQUdBLElBQUlBLENBQUNBLFdBQVdBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsV0FBQ0EsSUFBSUEsUUFBQ0EsQ0FBQ0EsY0FBY0EsRUFBaEJBLENBQWdCQSxDQUFDQSxDQUFDQTtLQUN4RkEsQ0FBQ0E7S0FFREQsZ0RBQVdBLEdBQVhBLFVBQVlBLFVBQWVBO1NBQ3pCRSxNQUFNQSxDQUFDQSxJQUFJQSwrQ0FBcUJBLENBQzVCQSxJQUFJQSxDQUFDQSxXQUFXQSxDQUFDQSxFQUFFQSxFQUFFQSxVQUFVQSxFQUFFQSxJQUFJQSxDQUFDQSx1QkFBdUJBLENBQUNBLE1BQU1BLEVBQ3BFQSxJQUFJQSxDQUFDQSx1QkFBdUJBLEVBQUVBLElBQUlBLENBQUNBLGlCQUFpQkEsRUFBRUEsSUFBSUEsQ0FBQ0EsV0FBV0EsQ0FBQ0EsUUFBUUEsRUFDL0VBLElBQUlBLENBQUNBLHVCQUF1QkEsRUFBRUEsSUFBSUEsQ0FBQ0Esb0JBQW9CQSxFQUFFQSxJQUFJQSxDQUFDQSxXQUFXQSxDQUFDQSxnQkFBZ0JBLEVBQzFGQSxJQUFJQSxDQUFDQSxXQUFXQSxDQUFDQSxTQUFTQSxDQUFDQSxDQUFDQTtLQUNsQ0EsQ0FBQ0E7S0FDSEYsaUNBQUNBO0FBQURBLEVBQUNBLElBQUE7QUF4QlksbUNBQTBCLDZCQXdCdEM7QUFFRCxnQ0FBc0MsVUFBb0M7S0FDeEVHLElBQUlBLGFBQWFBLEdBQUdBLElBQUlBLGtCQUFrQkEsRUFBRUEsQ0FBQ0E7S0FDN0NBLHdCQUFXQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFVBQVVBLENBQUNBLGNBQWNBLEVBQ3pCQSxVQUFDQSxDQUFDQSxFQUFFQSxLQUFLQSxJQUFLQSxvQkFBYUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsVUFBVUEsQ0FBQ0EsYUFBYUEsRUFBRUEsS0FBS0EsQ0FBQ0EsRUFBckRBLENBQXFEQSxDQUFDQSxDQUFDQTtLQUNsR0EsTUFBTUEsQ0FBQ0EsbUJBQVFBLENBQUNBLGFBQWFBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBO0FBQ3pDQSxFQUFDQTtBQUxlLDhCQUFxQix3QkFLcEM7QUFFRCw2QkFBbUMsVUFBb0M7S0FDckVDLHdGQUF3RkE7S0FDeEZBLElBQUlBLFFBQVFBLEdBQUdBLHdCQUFXQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQSxRQUFRQSxDQUFDQSxFQUFFQSxVQUFVQSxDQUFDQSxhQUFhQSxDQUFDQSxDQUFDQTtLQUN4RUEsTUFBTUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsWUFBRUE7U0FDbkNBLElBQUlBLE9BQU9BLEdBQUdBLDJCQUEyQkEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsRUFBRUEsRUFBRUEsUUFBUUEsQ0FBQ0EsQ0FBQ0E7U0FDL0RBLElBQUlBLFFBQVFBLEdBQUdBLEVBQUVBLENBQUNBLGdCQUFnQkEsWUFBWUEsaUNBQWNBLEdBQUdBLEVBQUVBLENBQUNBLGdCQUFnQkEsR0FBR0EsSUFBSUEsQ0FBQ0E7U0FDMUZBLE1BQU1BLENBQUNBLElBQUlBLDRCQUFZQSxDQUFDQSxFQUFFQSxDQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxFQUFFQSxFQUFFQSxDQUFDQSxNQUFNQSxDQUFDQSxZQUFZQSxFQUFFQSxRQUFRQSxFQUFFQSxPQUFPQSxDQUFDQSxDQUFDQTtLQUNyRkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7QUFDTEEsRUFBQ0E7QUFSZSwyQkFBa0IscUJBUWpDO0FBRUQ7S0FBQUM7U0FDRUMsWUFBT0EsR0FBa0JBLEVBQUVBLENBQUNBO0tBMkM5QkEsQ0FBQ0E7S0F6Q0NELGdDQUFHQSxHQUFIQSxVQUFJQSxDQUFnQkEsRUFBRUEsYUFBdUJBLEVBQUVBLFlBQW9CQTtTQUNqRUUsSUFBSUEsT0FBT0EsR0FBR0Esd0JBQVdBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBO1NBQzdDQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsSUFBSUEsT0FBT0EsQ0FBQ0EsYUFBYUEsQ0FBQ0EsZUFBZUEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsZUFBZUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDckZBLE9BQU9BLENBQUNBLGVBQWVBLEdBQUdBLEtBQUtBLENBQUNBO1NBQ2xDQSxDQUFDQTtTQUNEQSxJQUFJQSxxQkFBcUJBLEdBQUdBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLE1BQU1BLENBQUNBO1NBQ2hEQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxDQUFDQSxFQUFFQSxhQUFhQSxFQUFFQSxZQUFZQSxDQUFDQSxDQUFDQTtTQUNwREEsSUFBSUEsT0FBT0EsR0FBR0Esd0JBQVdBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBO1NBQzdDQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsSUFBSUEsT0FBT0EsS0FBS0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDOUNBLE9BQU9BLENBQUNBLGFBQWFBLEdBQUdBLElBQUlBLENBQUNBO2FBQzdCQSxPQUFPQSxDQUFDQSxlQUFlQSxHQUFHQSxJQUFJQSxDQUFDQTthQUMvQkEsSUFBSUEsQ0FBQ0EsMEJBQTBCQSxDQUFDQSxxQkFBcUJBLENBQUNBLENBQUNBO1NBQ3pEQSxDQUFDQTtLQUNIQSxDQUFDQTtLQUVERixnQkFBZ0JBO0tBQ2hCQSx1REFBMEJBLEdBQTFCQSxVQUEyQkEsVUFBa0JBO1NBQTdDRyxpQkFhQ0E7U0FaQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsVUFBVUEsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsTUFBTUEsRUFBRUEsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0E7YUFDdERBLElBQUlBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQzFCQSxFQUFFQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxjQUFjQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDekJBLEdBQUdBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLHFCQUFXQSxJQUFJQSxZQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxXQUFXQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxzQkFBc0JBO3FCQUMvREEsSUFBSUEsRUFET0EsQ0FDUEEsQ0FBQ0EsQ0FBQ0E7YUFDN0JBLENBQUNBO2FBQ0RBLEVBQUVBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLElBQUlBLEtBQUtBLHlCQUFVQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDakNBLEdBQUdBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLHFCQUFXQSxJQUFJQSxZQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxXQUFXQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxzQkFBc0JBO3FCQUMvREEsSUFBSUEsRUFET0EsQ0FDUEEsQ0FBQ0EsQ0FBQ0E7aUJBQzNCQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFDQSxZQUFZQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxzQkFBc0JBLEdBQUdBLElBQUlBLENBQUNBO2FBQ25FQSxDQUFDQTtTQUNIQSxDQUFDQTtLQUNIQSxDQUFDQTtLQUVESCxnQkFBZ0JBO0tBQ2hCQSwyQ0FBY0EsR0FBZEEsVUFBZUEsQ0FBZ0JBLEVBQUVBLGFBQXVCQSxFQUFFQSxZQUFvQkE7U0FDNUVJLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLG9CQUFvQkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDN0JBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLDBCQUFXQSxDQUFDQSx5QkFBVUEsQ0FBQ0Esa0JBQWtCQSxFQUFFQSxDQUFDQSxDQUFDQSxjQUFjQSxFQUFFQSxJQUFJQSxFQUFFQSxFQUFFQSxFQUN6REEsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsSUFBSUEsRUFBRUEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsS0FBS0EsRUFBRUEsS0FBS0EsRUFDdERBLEtBQUtBLEVBQUVBLEtBQUtBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBLENBQUNBO1NBQ3pEQSxDQUFDQTtTQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTthQUNOQSwyQkFBMkJBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLEVBQUVBLENBQUNBLEVBQUVBLGFBQWFBLEVBQUVBLFlBQVlBLENBQUNBLENBQUNBO1NBQ25GQSxDQUFDQTtLQUNIQSxDQUFDQTtLQUNISix5QkFBQ0E7QUFBREEsRUFBQ0EsSUFBQTtBQTVDWSwyQkFBa0IscUJBNEM5QjtBQUVEO0tBQ0VLLHFDQUFvQkEsUUFBdUJBLEVBQVVBLGNBQTZCQSxFQUM5REEsY0FBd0JBLEVBQVVBLGFBQXFCQTtTQUR2REMsYUFBUUEsR0FBUkEsUUFBUUEsQ0FBZUE7U0FBVUEsbUJBQWNBLEdBQWRBLGNBQWNBLENBQWVBO1NBQzlEQSxtQkFBY0EsR0FBZEEsY0FBY0EsQ0FBVUE7U0FBVUEsa0JBQWFBLEdBQWJBLGFBQWFBLENBQVFBO0tBQUdBLENBQUNBO0tBRXhFRCxrQ0FBTUEsR0FBYkEsVUFBY0EsT0FBc0JBLEVBQUVBLENBQWdCQSxFQUFFQSxhQUF1QkEsRUFDakVBLFlBQW9CQTtTQUNoQ0UsSUFBSUEsQ0FBQ0EsR0FBR0EsSUFBSUEsMkJBQTJCQSxDQUFDQSxPQUFPQSxFQUFFQSxDQUFDQSxFQUFFQSxhQUFhQSxFQUFFQSxZQUFZQSxDQUFDQSxDQUFDQTtTQUNqRkEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDakJBLENBQUNBO0tBRU1GLGtDQUFNQSxHQUFiQSxVQUFjQSxDQUFnQkEsRUFBRUEsYUFBb0JBO1NBQ2xERyxJQUFJQSxHQUFHQSxHQUFHQSxFQUFFQSxDQUFDQTtTQUNiQSwyQkFBMkJBLENBQUNBLE1BQU1BLENBQUNBLEdBQUdBLEVBQUVBLENBQUNBLEVBQUVBLGFBQWFBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBO1NBQ2hFQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxNQUFNQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxhQUFhQSxHQUFHQSxJQUFJQSxDQUFDQTtTQUN6Q0EsTUFBTUEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7S0FDYkEsQ0FBQ0E7S0FFREgsMkRBQXFCQSxHQUFyQkEsVUFBc0JBLEdBQXFCQSxJQUFTSSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxnQkFBZ0JBLENBQUNBLENBQUNBLENBQUNBO0tBRWxHSix3REFBa0JBLEdBQWxCQSxVQUFtQkEsR0FBa0JBO1NBQ25DSyxJQUFJQSxJQUFJQSxHQUFHQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxHQUFHQSxDQUFDQSxXQUFXQSxDQUFDQSxDQUFDQTtTQUMzQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EseUJBQVVBLENBQUNBLFdBQVdBLEVBQUVBLGFBQWFBLEVBQUVBLGdCQUFnQkEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsRUFDcEVBLElBQUlBLEVBQUVBLEdBQUdBLENBQUNBLE9BQU9BLEVBQUVBLENBQUNBLENBQUNBLENBQUNBO0tBQy9DQSxDQUFDQTtLQUVETCwyREFBcUJBLEdBQXJCQSxVQUFzQkEsR0FBcUJBO1NBQ3pDTSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSx5QkFBVUEsQ0FBQ0EsS0FBS0EsRUFBRUEsU0FBU0EsRUFBRUEsR0FBR0EsQ0FBQ0EsS0FBS0EsRUFBRUEsRUFBRUEsRUFBRUEsSUFBSUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDOUVBLENBQUNBO0tBRUROLHVEQUFpQkEsR0FBakJBLFVBQWtCQSxHQUFpQkE7U0FDakNPLElBQUlBLFFBQVFBLEdBQUdBLEdBQUdBLENBQUNBLFFBQVFBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO1NBQ3hDQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsSUFBSUEsd0JBQVdBLENBQUNBLFFBQVFBLENBQUNBLElBQUlBLENBQUNBLGNBQWNBLEVBQUVBLEdBQUdBLENBQUNBLElBQUlBLENBQUNBO2FBQ3JGQSxHQUFHQSxDQUFDQSxRQUFRQSxZQUFZQSxzQkFBZ0JBLENBQUNBLENBQUNBLENBQUNBO2FBQzdDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSx5QkFBVUEsQ0FBQ0EsS0FBS0EsRUFBRUEsR0FBR0EsQ0FBQ0EsSUFBSUEsRUFBRUEsR0FBR0EsQ0FBQ0EsSUFBSUEsRUFBRUEsRUFBRUEsRUFBRUEsSUFBSUEsRUFBRUEsUUFBUUEsQ0FBQ0EsQ0FBQ0E7U0FDbkZBLENBQUNBO1NBQUNBLElBQUlBLENBQUNBLENBQUNBO2FBQ05BLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLHlCQUFVQSxDQUFDQSxZQUFZQSxFQUFFQSxHQUFHQSxDQUFDQSxJQUFJQSxFQUFFQSxHQUFHQSxDQUFDQSxNQUFNQSxFQUFFQSxFQUFFQSxFQUFFQSxJQUFJQSxFQUFFQSxRQUFRQSxDQUFDQSxDQUFDQTtTQUM1RkEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFRFAsd0RBQWtCQSxHQUFsQkEsVUFBbUJBLEdBQWtCQTtTQUNuQ1EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLElBQUlBLHdCQUFXQSxDQUFDQSxRQUFRQSxDQUFDQSxJQUFJQSxDQUFDQSxjQUFjQSxFQUFFQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQTthQUNyRkEsR0FBR0EsQ0FBQ0EsUUFBUUEsWUFBWUEsc0JBQWdCQSxDQUFDQSxDQUFDQSxDQUFDQTthQUM3Q0EsTUFBTUEsSUFBSUEsMEJBQWFBLENBQUNBLHdDQUFzQ0EsR0FBR0EsQ0FBQ0EsSUFBTUEsQ0FBQ0EsQ0FBQ0E7U0FDNUVBLENBQUNBO1NBQUNBLElBQUlBLENBQUNBLENBQUNBO2FBQ05BLElBQUlBLFFBQVFBLEdBQUdBLEdBQUdBLENBQUNBLFFBQVFBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO2FBQ3hDQSxJQUFJQSxLQUFLQSxHQUFHQSxHQUFHQSxDQUFDQSxLQUFLQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTthQUNsQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EseUJBQVVBLENBQUNBLGFBQWFBLEVBQUVBLEdBQUdBLENBQUNBLElBQUlBLEVBQUVBLEdBQUdBLENBQUNBLE1BQU1BLEVBQUVBLENBQUNBLEtBQUtBLENBQUNBLEVBQUVBLElBQUlBLEVBQzdEQSxRQUFRQSxDQUFDQSxDQUFDQTtTQUNuQ0EsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFRFIscURBQWVBLEdBQWZBLFVBQWdCQSxHQUFlQTtTQUM3QlMsSUFBSUEsR0FBR0EsR0FBR0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7U0FDOUJBLElBQUlBLEdBQUdBLEdBQUdBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO1NBQzlCQSxJQUFJQSxLQUFLQSxHQUFHQSxHQUFHQSxDQUFDQSxLQUFLQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUNsQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EseUJBQVVBLENBQUNBLFVBQVVBLEVBQUVBLElBQUlBLEVBQUVBLElBQUlBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEtBQUtBLENBQUNBLEVBQUVBLElBQUlBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBO0tBQ3JGQSxDQUFDQTtLQUVEVCwyREFBcUJBLEdBQXJCQSxVQUFzQkEsR0FBcUJBO1NBQ3pDVSxJQUFJQSxRQUFRQSxHQUFHQSxHQUFHQSxDQUFDQSxRQUFRQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUN4Q0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EseUJBQVVBLENBQUNBLFlBQVlBLEVBQUVBLEdBQUdBLENBQUNBLElBQUlBLEVBQUVBLEdBQUdBLENBQUNBLE1BQU1BLEVBQUVBLEVBQUVBLEVBQUVBLElBQUlBLEVBQUVBLFFBQVFBLENBQUNBLENBQUNBO0tBQzVGQSxDQUFDQTtLQUVEVixxREFBZUEsR0FBZkEsVUFBZ0JBLEdBQWVBO1NBQzdCVyxJQUFJQSxRQUFRQSxHQUFHQSxHQUFHQSxDQUFDQSxRQUFRQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUN4Q0EsSUFBSUEsSUFBSUEsR0FBR0EsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7U0FDcENBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxJQUFJQSx3QkFBV0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsY0FBY0EsRUFBRUEsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDMUZBLElBQUlBLE1BQU1BLEdBQUdBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLHlCQUFVQSxDQUFDQSxLQUFLQSxFQUFFQSxHQUFHQSxDQUFDQSxJQUFJQSxFQUFFQSxHQUFHQSxDQUFDQSxJQUFJQSxFQUFFQSxFQUFFQSxFQUFFQSxJQUFJQSxFQUFFQSxRQUFRQSxDQUFDQSxDQUFDQTthQUN2RkEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EseUJBQVVBLENBQUNBLGFBQWFBLEVBQUVBLFNBQVNBLEVBQUVBLElBQUlBLEVBQUVBLElBQUlBLEVBQUVBLElBQUlBLEVBQUVBLE1BQU1BLENBQUNBLENBQUNBO1NBQ3hGQSxDQUFDQTtTQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTthQUNOQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSx5QkFBVUEsQ0FBQ0EsWUFBWUEsRUFBRUEsR0FBR0EsQ0FBQ0EsSUFBSUEsRUFBRUEsR0FBR0EsQ0FBQ0EsRUFBRUEsRUFBRUEsSUFBSUEsRUFBRUEsSUFBSUEsRUFBRUEsUUFBUUEsQ0FBQ0EsQ0FBQ0E7U0FDMUZBLENBQUNBO0tBQ0hBLENBQUNBO0tBRURYLHlEQUFtQkEsR0FBbkJBLFVBQW9CQSxHQUFtQkE7U0FDckNZLElBQUlBLFFBQVFBLEdBQUdBLEdBQUdBLENBQUNBLFFBQVFBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO1NBQ3hDQSxJQUFJQSxJQUFJQSxHQUFHQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUNwQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EseUJBQVVBLENBQUNBLGdCQUFnQkEsRUFBRUEsR0FBR0EsQ0FBQ0EsSUFBSUEsRUFBRUEsR0FBR0EsQ0FBQ0EsRUFBRUEsRUFBRUEsSUFBSUEsRUFBRUEsSUFBSUEsRUFBRUEsUUFBUUEsQ0FBQ0EsQ0FBQ0E7S0FDOUZBLENBQUNBO0tBRURaLHVEQUFpQkEsR0FBakJBLFVBQWtCQSxHQUFpQkE7U0FDakNhLElBQUlBLE1BQU1BLEdBQUdBLEdBQUdBLENBQUNBLE1BQU1BLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO1NBQ3BDQSxJQUFJQSxJQUFJQSxHQUFHQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUNwQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EseUJBQVVBLENBQUNBLGFBQWFBLEVBQUVBLFNBQVNBLEVBQUVBLElBQUlBLEVBQUVBLElBQUlBLEVBQUVBLElBQUlBLEVBQUVBLE1BQU1BLENBQUNBLENBQUNBO0tBQ3hGQSxDQUFDQTtLQUVEYix1REFBaUJBLEdBQWpCQSxVQUFrQkEsR0FBaUJBO1NBQ2pDYyxJQUFJQSxhQUFhQSxHQUFHQSxZQUFVQSxHQUFHQSxDQUFDQSxXQUFXQSxDQUFDQSxNQUFRQSxDQUFDQTtTQUN2REEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EseUJBQVVBLENBQUNBLGlCQUFpQkEsRUFBRUEsYUFBYUEsRUFDM0NBLFFBQVFBLENBQUNBLEdBQUdBLENBQUNBLFdBQVdBLENBQUNBLE1BQU1BLENBQUNBLEVBQUVBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLEdBQUdBLENBQUNBLFdBQVdBLENBQUNBLEVBQUVBLElBQUlBLEVBQ3ZFQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUM1QkEsQ0FBQ0E7S0FFRGQscURBQWVBLEdBQWZBLFVBQWdCQSxHQUFlQTtTQUM3QmUsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EseUJBQVVBLENBQUNBLGlCQUFpQkEsRUFBRUEsaUJBQWlCQSxDQUFDQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxFQUN6REEsMkNBQW1CQSxDQUFDQSxLQUFLQSxDQUFDQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxHQUFHQSxDQUFDQSxNQUFNQSxDQUFDQSxFQUFFQSxJQUFJQSxFQUNyRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDNUJBLENBQUNBO0tBRURmLGlEQUFXQSxHQUFYQSxVQUFZQSxHQUFXQTtTQUNyQmdCLElBQUlBLElBQUlBLEdBQUdBLEdBQUdBLENBQUNBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO1NBQ2hDQSxNQUFNQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxTQUFTQSxDQUFDQSxDQUFDQSxDQUFDQTthQUN0QkEsS0FBS0EsSUFBSUE7aUJBQ1BBLElBQUlBLFNBQVNBLEdBQUdBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO2lCQUN2QkEsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EseUJBQVVBLENBQUNBLGdCQUFnQkEsRUFBRUEsa0JBQWtCQSxFQUFFQSxJQUFJQSxFQUFFQSxFQUFFQSxFQUFFQSxTQUFTQSxFQUFFQSxJQUFJQSxDQUFDQSxDQUFDQTtpQkFDNUZBLElBQUlBLEtBQUtBLEdBQUdBLEdBQUdBLENBQUNBLEtBQUtBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO2lCQUNsQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsS0FBS0EsQ0FBQ0E7aUJBQ3JCQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSx5QkFBVUEsQ0FBQ0EsV0FBV0EsRUFBRUEsTUFBTUEsRUFBRUEsMkNBQW1CQSxDQUFDQSxJQUFJQSxFQUN4REEsQ0FBQ0EsSUFBSUEsRUFBRUEsS0FBS0EsRUFBRUEsSUFBSUEsQ0FBQ0EsRUFBRUEsSUFBSUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFFdkRBLEtBQUtBLElBQUlBO2lCQUNQQSxJQUFJQSxTQUFTQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtpQkFDdkJBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLHlCQUFVQSxDQUFDQSxhQUFhQSxFQUFFQSxlQUFlQSxFQUFFQSxJQUFJQSxFQUFFQSxFQUFFQSxFQUFFQSxTQUFTQSxFQUFFQSxJQUFJQSxDQUFDQSxDQUFDQTtpQkFDdEZBLElBQUlBLEtBQUtBLEdBQUdBLEdBQUdBLENBQUNBLEtBQUtBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO2lCQUNsQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsS0FBS0EsQ0FBQ0E7aUJBQ3JCQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSx5QkFBVUEsQ0FBQ0EsV0FBV0EsRUFBRUEsTUFBTUEs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QUN0Q0MsSUFBSUEsTUFBTUEsR0FBR0EsT0FBT0EsQ0FBQ0EsTUFBTUEsQ0FBQ0E7S0FDNUJBLElBQUlBLEVBQUVBLEdBQUdBLE1BQU1BLEdBQUdBLENBQUNBLEdBQUdBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO0tBQ3hDQSxJQUFJQSxFQUFFQSxHQUFHQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQTtLQUN4Q0EsSUFBSUEsRUFBRUEsR0FBR0EsTUFBTUEsR0FBR0EsQ0FBQ0EsR0FBR0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0E7S0FDeENBLElBQUlBLEVBQUVBLEdBQUdBLE1BQU1BLEdBQUdBLENBQUNBLEdBQUdBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO0tBQ3hDQSxJQUFJQSxFQUFFQSxHQUFHQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQTtLQUN4Q0EsSUFBSUEsRUFBRUEsR0FBR0EsTUFBTUEsR0FBR0EsQ0FBQ0EsR0FBR0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0E7S0FDeENBLElBQUlBLEVBQUVBLEdBQUdBLE1BQU1BLEdBQUdBLENBQUNBLEdBQUdBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO0tBQ3hDQSxJQUFJQSxFQUFFQSxHQUFHQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQTtLQUN4Q0EsSUFBSUEsRUFBRUEsR0FBR0EsTUFBTUEsR0FBR0EsQ0FBQ0EsR0FBR0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0E7S0FDeENBLElBQUlBLEVBQUVBLEdBQUdBLE1BQU1BLEdBQUdBLENBQUNBLEdBQUdBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO0tBQ3hDQSxNQUFNQSxDQUFDQSxDQUFDQSxNQUFNQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtTQUNuQkEsS0FBS0EsQ0FBQ0E7YUFDSkEsTUFBTUEsQ0FBQ0EsVUFBQ0EsRUFBRUEsSUFBS0EsU0FBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsRUFBRUEsRUFBZkEsQ0FBZUEsQ0FBQ0E7U0FDakNBLEtBQUtBLENBQUNBO2FBQ0pBLE1BQU1BLENBQUNBLFVBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLElBQUtBLFNBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEVBQTVCQSxDQUE0QkEsQ0FBQ0E7U0FDbERBLEtBQUtBLENBQUNBO2FBQ0pBLE1BQU1BLENBQUNBLFVBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLElBQUtBLFNBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEVBQXpDQSxDQUF5Q0EsQ0FBQ0E7U0FDbkVBLEtBQUtBLENBQUNBO2FBQ0pBLE1BQU1BLENBQUNBLFVBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLElBQUtBLFNBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEVBQXREQSxDQUFzREEsQ0FBQ0E7U0FDcEZBLEtBQUtBLENBQUNBO2FBQ0pBLE1BQU1BLENBQUNBLFVBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBO3dCQUNmQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQTthQUFuRUEsQ0FBbUVBLENBQUNBO1NBQ2pGQSxLQUFLQSxDQUFDQTthQUNKQSxNQUFNQSxDQUFDQSxVQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQTt3QkFDbkJBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBO2FBQWhGQSxDQUFnRkEsQ0FBQ0E7U0FDOUZBLEtBQUtBLENBQUNBO2FBQ0pBLE1BQU1BLENBQUNBLFVBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLElBQUtBLFNBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBO2lCQUNqREEsRUFBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsRUFBRUEsRUFEekNBLENBQ3lDQSxDQUFDQTtTQUNuRkEsS0FBS0EsQ0FBQ0E7YUFDSkEsTUFBTUEsQ0FBQ0EsVUFBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsSUFBS0EsU0FBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0E7aUJBQ2pEQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQTtpQkFDakRBLEVBQUVBLEVBRkZBLENBRUVBLENBQUNBO1NBQ2hEQSxLQUFLQSxDQUFDQTthQUNKQSxNQUFNQSxDQUFDQSxVQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxF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QUFDQSxDQUFDQTtBQUNYQSxFQUFDQTtBQUVELDBDQUF5QztBQUN6QztLQUFBQztLQW1IQUMsQ0FBQ0E7S0FoSFFELDRCQUFRQSxHQUFmQSxjQUEyQkUsTUFBTUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDaENGLDRCQUFRQSxHQUFmQSxVQUFnQkEsRUFBRUEsSUFBV0csTUFBTUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDcENILDRCQUFRQSxHQUFmQSxVQUFnQkEsRUFBRUEsRUFBRUEsRUFBRUEsSUFBV0ksTUFBTUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDNUNKLDRCQUFRQSxHQUFmQSxVQUFnQkEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsSUFBV0ssTUFBTUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDcERMLDRCQUFRQSxHQUFmQSxVQUFnQkEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsSUFBV00sTUFBTUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDNUROLDRCQUFRQSxHQUFmQSxVQUFnQkEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsSUFBV08sTUFBTUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDcEVQLDRCQUFRQSxHQUFmQSxVQUFnQkEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsSUFBV1EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDNUVSLDRCQUFRQSxHQUFmQSxVQUFnQkEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsSUFBV1MsTUFBTUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDcEZULDRCQUFRQSxHQUFmQSxVQUFnQkEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUE7U0FDNUNVLE1BQU1BLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLENBQUNBLENBQUNBO0tBQzFDQSxDQUFDQTtLQUNNViw0QkFBUUEsR0FBZkEsVUFBZ0JBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBO1NBQ2hEVyxNQUFNQSxDQUFDQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxDQUFDQSxDQUFDQTtLQUM5Q0EsQ0FBQ0E7S0FFTVgsb0NBQWdCQSxHQUF2QkEsVUFBd0JB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LENBQUNBLENBQUNBLEVBQUVBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQ2hEQSxDQUFDQTthQUNEQSxNQUFNQSxDQUFDQSxHQUFHQSxDQUFDQTtTQUNiQSxDQUFDQTtTQUVERCxNQUFNQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNwQkEsS0FBS0EsQ0FBQ0E7aUJBQ0pBLE1BQU1BLENBQUNBLGNBQU1BLFNBQUVBLEVBQUZBLENBQUVBLENBQUNBO2FBQ2xCQSxLQUFLQSxDQUFDQTtpQkFDSkEsTUFBTUEsQ0FBQ0EsVUFBQ0EsRUFBRUEsSUFBS0EsZUFBUUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsRUFBZEEsQ0FBY0EsQ0FBQ0E7YUFDaENBLEtBQUtBLENBQUNBO2lCQUNKQSxNQUFNQSxDQUFDQSxVQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxJQUFLQSxlQUFRQSxDQUFDQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxDQUFDQSxDQUFDQSxFQUFsQkEsQ0FBa0JBLENBQUNBO2FBQ3hDQSxLQUFLQSxDQUFDQTtpQkFDSkEsTUFBTUEsQ0FBQ0EsVUFBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsSUFBS0EsZUFBUUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsRUFBdEJBLENBQXNCQSxDQUFDQTthQUNoREEsS0FBS0EsQ0FBQ0E7aUJBQ0pBLE1BQU1BLENBQUNBLFVBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLElBQUtBLGVBQVFBLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLENBQUNBLENBQUNBLEVBQTFCQSxDQUEwQkEsQ0FBQ0E7YUFDeERBLEtBQUtBLENBQUNBO2lCQUNKQSxNQUFNQSxDQUFDQSxVQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxJQUFLQSxlQUFRQSxDQUFDQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxDQUFDQSxDQUFDQSxFQUE5QkEsQ0FBOEJBLENBQUNBO2FBQ2hFQSxLQUFLQSxDQUFDQTtpQkFDSkEsTUFBTUEsQ0FBQ0EsVUFBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsSUFBS0EsZUFBUUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsRUFBbENBLENBQWtDQSxDQUFDQTthQUN4RUEsS0FBS0EsQ0FBQ0E7aUJBQ0pBLE1BQU1BLENBQUNBLFVBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLElBQUtBLGVBQVFBLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLENBQUNBLENBQUNBLEVBQXRDQSxDQUFzQ0EsQ0FBQ0E7YUFDaEZBLEtBQUtBLENBQUNBO2lCQUNKQSxNQUFNQSxDQUFDQSxVQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxJQUFLQSxlQUFRQSxDQUFDQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxDQUFDQSxDQUFDQSxFQUExQ0EsQ0FBMENBLENB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QSwwQkFBYUEsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxDQUFDQTtLQUMvQ0EsQ0FBQ0E7S0FFT0gsa0RBQWtCQSxHQUExQkEsVUFBMkJBLFVBQWtCQSxFQUFFQSxLQUFrQkEsRUFBRUEsTUFBYUE7U0FDOUVJLEVBQUVBLENBQUNBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLEtBQUtBLHlCQUFVQSxDQUFDQSxXQUFXQSxDQUFDQSxDQUFDQSxDQUFDQTthQUMxQ0EsTUFBTUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsVUFBVUEsR0FBR0EsQ0FBQ0EsQ0FBQ0E7U0FDN0NBLENBQUNBO1NBRURBLEVBQUVBLENBQUNBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLEtBQUtBLHlCQUFVQSxDQUFDQSxhQUFhQSxDQUFDQSxDQUFDQSxDQUFDQTthQUM1Q0EsSUFBSUEsU0FBU0EsR0FBR0EsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsS0FBS0EsRUFBRUEsTUFBTUEsQ0FBQ0EsQ0FBQ0E7YUFDakRBLE1BQU1BLENBQUNBLFNBQVNBLEdBQUdBLEtBQUtBLENBQUNBLFNBQVNBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLFVBQVVBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBO1NBQzdEQSxDQUFDQTtTQUVEQSxFQUFFQSxDQUFDQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxLQUFLQSx5QkFBVUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxDQUFDQSxDQUFDQTthQUMvQ0EsSUFBSUEsU0FBU0EsR0FBR0EsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsS0FBS0EsRUFBRUEsTUFBTUEsQ0FBQ0EsQ0FBQ0E7YUFDakRBLE1BQU1BLENBQUNBLFNBQVNBLEdBQUdBLENBQUNBLEdBQUdBLEtBQUtBLENBQUNBLFNBQVNBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLFVBQVVBLEdBQUdBLENBQUNBLENBQUNBO1NBQzdEQSxDQUFDQTtTQUVEQSxNQUFNQSxJQUFJQSwwQkFBYUEsQ0FBQ0EsbUJB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QUFhQSxDQUFDQTs2QkFBQ0EsSUFBSUEsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxDQUFDQSxDQUFDQTt5QkFFakVBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLEtBQUtBLEVBQUVBLFNBQVNBLEVBQUVBLE1BQU1BLENBQUNBLENBQUNBO3lCQUMxQ0EsSUFBSUEsQ0FBQ0EsV0FBV0EsQ0FBQ0EsS0FBS0EsRUFBRUEsSUFBSUEsQ0FBQ0EsQ0FBQ0E7eUJBRTlCQSxNQUFNQSxDQUFDQSxNQUFNQSxDQUFDQTtxQkFFaEJBLENBQUNBO3FCQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTt5QkFDTkEsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsS0FBS0EsRUFBRUEsU0FBU0EsRUFBRUEsTUFBTUEsQ0FBQ0EsQ0FBQ0E7eUJBQzFDQSxJQUFJQSxDQUFDQSxXQUFXQSxDQUFDQSxLQUFLQSxFQUFFQSxJQUFJQSxDQUFDQSxDQUFDQTt5QkFDOUJBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBO3FCQUNkQSxDQUFDQTtpQkFDSEEsQ0FBQ0E7aUJBQUNBLElBQUlBLENBQUNBLENBQUNBO3FCQUNOQSxJQUFJQSxDQUFDQSxXQUFXQSxDQUFDQSxLQUFLQSxFQUFFQSxLQUFLQSxDQUFDQSxDQUFDQTtxQkFDL0JBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBO2lCQUNkQSxDQUFDQTthQUNIQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtpQkFDTkEsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsS0FBS0EsRUFBRUEsU0FBU0EsRUFBRUEsTUFBTUEsQ0FBQ0EsQ0FBQ0E7aUJBQzFDQSxJQUFJQSxDQUFDQSxXQUFXQSxDQUFDQSxLQUFLQSxFQUFFQSxJQUFJQSxDQUFDQSxDQUFDQTtpQkFDOUJBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBO2FBQ2RBLENBQUNBO1NBQ0hBLENBQUNBO0tBQ0hBLENBQUNBO0tBRU90Qix3Q0FBUUEsR0FBaEJBLFVBQWlCQSxLQUFrQkEsRUFBRUEsT0FBT0E7U0FDMUN1QixJ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Q0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0E7S0FDekVBLENBQUNBO0tBRURELHNEQUF3QkEsR0FBeEJBO1NBQ0VFLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxXQUFXQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQTtTQUNqRkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLFdBQVdBLENBQUNBO2FBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBO1NBQ2pGQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsV0FBV0EsQ0FBQ0E7YUFBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0E7S0FDbkZBLENBQUNBO0tBRURGLG1EQUFxQkEsR0FBckJBO1NBQ0VHLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxXQUFXQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQTtTQUNoRkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLFdBQVdBLENBQUNBO2FBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBO1NBQ2hGQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsV0FBV0EsQ0FBQ0E7YUFBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0E7S0FDbEZBLENBQUNBO0tBRURILHFDQUFPQSxHQUFQQTtTQUNFSSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0E7YUFBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsT0FBT0EsRUFBRUEsQ0FBQ0E7U0FDbERBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxPQUFPQSxFQUFFQSxDQUFDQTtTQUNsREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBO2FBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLE9BQU9BLEVBQUVBLENBQUNBO0tBQ3BEQSxDQUFDQTtLQUVESix1Q0FBU0EsR0FBVEE7U0FDRUssRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBO2FBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBO1NBQ3BEQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0E7YUFBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0E7U0FDcERBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQTtLQUN0REEsQ0FBQ0E7S0FFREwsa0RBQW9CQSxHQUFwQkE7U0FDRU0sRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLFdBQVdBLENBQUNBLENBQUNBLENBQUNBO2FBQ3ZEQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQTtTQUN2QkEsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLFdBQVdBLENBQUNBLENBQUNBLENBQUNBO2FBQ3ZEQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQTtTQUN2QkEsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLFdBQVdBLENBQUNBLENBQUNBLENBQUNBO2FBQ3ZEQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQTtTQUN2QkEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFRE4sK0NBQWlCQSxHQUFqQkE7U0FDRU8sRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLFdBQVdBLENBQUNBLENBQUNBLENBQUNBO2FBQ3REQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQTtTQUN2QkEsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLFdBQVdBLENBQUNBLENBQUNBLENBQUNBO2FBQ3REQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQTtTQUN2QkEsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLFdBQVdBLENBQUNBLENBQUNBLENBQUNBO2FBQ3REQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQTtTQUN2QkEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFRFAsdUNBQVNBLEdBQVRBLFVBQVVBLEtBQW9CQTtTQUM1QlEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLGFBQWFBLENBQUNBLEtBQUtBLEtBQUtBLEtBQUtBLENBQUNBLENBQUNBLENBQUNBO2FBQ3hFQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQTtTQUNyQkEsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLGFBQWFBLENBQUNBLEtBQUtBLEtBQUtBLEtBQUtBLENBQUNBLENBQUNBLENBQUNBO2FBQ3hFQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQTtTQUNyQkEsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLGFBQWFBLENBQUNBLEtBQUtBLEtBQUtBLEtBQUtBLENBQUNBLENBQUNBLENBQUNBO2FBQ3hFQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQTtTQUNyQkEsQ0FBQ0E7U0FDREEsTUFBTUEsSUFBSUEsMEJBQWFBLENBQUNBLHFDQUFtQ0EsS0FBS0EsTUFBR0EsQ0FBQ0EsQ0FBQ0E7S0FDdkVBLENBQUNBO0tBeEVNUiwrQ0FBMkJBLEdBQUdBLENBQUNBLENBQUNBO0tBeUV6Q0EsMEJBQUNBO0FBQURBLEVBQUNBLElBQUE7QUFFRDtLQUdFUyw4QkFBWUEsRUFBbUJBO1NBQzdCQyxJQUFJQSxDQUFDQSxPQUFPQSxHQUFHQSxFQUFFQSxDQUFDQSxNQUFNQSxDQUFDQSxjQUFjQSxDQUFDQSxHQUFHQSxDQUFDQSxXQUFDQSxJQUFJQSxXQUFJQSxRQUFRQSxDQUFDQSxDQUFDQSxFQUFFQSxFQUFFQSxDQUFDQSxFQUFuQkEsQ0FBbUJBLENBQUNBLENBQUNBO0tBQ3hFQSxDQUFDQTtLQUVERCx1REFBd0JBLEdBQXhCQTtTQUNFRSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxNQUFNQSxFQUFFQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQTthQUM3Q0EsSUFBSUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDeEJBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLFdBQVdBLENBQUNBO2lCQUFDQSxDQUFDQSxDQUFDQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQTtTQUNyQ0EsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFREYsb0RBQXFCQSxHQUFyQkE7U0FDRUcsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsTUFBTUEsRUFBRUEsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0E7YUFDN0NBLElBQUlBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQ3hCQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxXQUFXQSxDQUFDQTtpQkFBQ0EsQ0FBQ0EsQ0FBQ0EsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0E7U0FDcENBLENBQUNBO0tBQ0hBLENBQUNBO0tBRURILHNDQUFPQSxHQUFQQTtTQUNFSSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxNQUFNQSxFQUFFQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQTthQUM3Q0EsSUFBSUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDeEJBLENBQUNBLENBQUNBLE9BQU9BLEVBQUVBLENBQUNBO1NBQ2RBLENBQUNBO0tBQ0hBLENBQUNBO0tBRURKLHdDQUFTQSxHQUFUQTtTQUNFSyxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxNQUFNQSxFQUFFQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQTthQUM3Q0EsSUFBSUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDeEJBLENBQUNBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBO1NBQ2hCQSxDQUFDQTtLQUNIQSxDQUFDQTtLQUVETCxtREFBb0JBLEdBQXBCQTtTQUNFTSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxNQUFNQSxFQUFFQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQTthQUM3Q0EsSUFBSUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FB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QVNBLFlBQVlBLGlCQUFpQkE7YUFDcEJBLENBQUNBLENBQUNBLFNBQVVBLENBQUNBLGFBQWFBLENBQUNBLENBQUNBLENBQUNBO2FBQ25EQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxXQUFXQSxFQUFFQSxDQUFDQTtTQUN2QkEsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsWUFBWUEsaUJBQWlCQTthQUNwQkEsQ0FBQ0EsQ0FBQ0EsU0FBVUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDbkRBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLFdBQVdBLEVBQUVBLENBQUNBO1NBQ3ZCQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxTQUFTQSxZQUFZQSxpQkFBaUJBO2FBQ3BCQSxDQUFDQSxDQUFDQSxTQUFVQSxDQUFDQSxhQUFhQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNuREEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsV0FBV0EsRUFBRUEsQ0FBQ0E7U0FDdkJBLENBQUNBO1NBQ0RBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLFNBQVNBLFlBQVlBLGlCQUFpQkE7YUFDcEJBLENBQUNBLENBQUNBLFNBQVVBLENBQUNBLGFBQWFBLENBQUNBLENBQUNBLENBQUNBO2FBQ25EQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxXQUFXQSxFQUFFQSxDQUFDQTtTQUN2QkEsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsWUFBWUEsaUJBQWlCQTthQUNwQkEsQ0FBQ0EsQ0FBQ0EsU0FBVUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDbkRBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLFdBQVdBLEVBQUVBLENBQUNBO1NBQ3ZCQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxTQUFTQSxZQUFZQSxpQkFBaUJBO2FBQ3BCQSxDQUFDQSxDQUFD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QUNBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0E7YUFDckZBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO1NBQ3BCQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsS0FBS0EsS0FBS0EsS0FBS0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDdkVBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLElBQUlBLEtBQUtBLG9CQUFTQSxDQUFDQTtpQkFBQ0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxDQUFDQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxDQUFDQSxXQUFXQSxDQUFDQSxDQUFDQTthQUNyRkEsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7U0FDcEJBLENBQUNBO1NBQ0RBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxDQUFDQSxDQUFDQSxTQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxTQUFTQSxDQUFDQSxHQUFHQSxDQUFDQSxLQUFLQSxLQUFLQSxLQUFLQSxDQUFDQSxRQUFRQSxDQUFDQSxDQUFDQSxDQUFDQTthQUN2RUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsS0FBS0Esb0JBQVNBLENBQUNBO2lCQUFDQSxDQUFDQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxtQkFBbUJBLENBQUNBLENBQUNBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLENBQUNBLFdBQVdBLENBQUNBLENBQUNBO2FBQ3JGQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUNwQkEsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLENBQUNBLENBQUNBLFNBQVNBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLFNBQVNBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLEtBQUtBLEtBQUtBLENBQUNBLFFBQVFBLENBQUNBLENBQUNBLENBQUNBO2FBQ3ZFQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxJQUFJQSxLQUFLQSxvQkFBU0EsQ0FBQ0E7aUJBQUNBLENBQUNBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0E7YUFDckZBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO1NBQ3BCQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsS0FBS0EsS0FBS0EsS0FBS0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDdkVBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLElBQUlBLEtBQUtBLG9CQUFTQSxDQUFDQTtpQkFBQ0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxDQUFDQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxDQUFDQSxXQUFXQSxDQUFDQSxDQUFDQTthQUNyRkEsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7U0FDcEJBLENBQUNBO1NBQ0RBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxDQUFDQSxDQUFDQSxTQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxTQUFTQSxDQUFDQSxHQUFHQSxDQUFDQSxLQUFLQSxLQUFLQSxLQUFLQSxDQUFDQSxRQUFRQSxDQUFDQSxDQUFDQSxDQUFDQTthQUN2RUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsS0FBS0Esb0JBQVNBLENBQUNBO2lCQUFDQSxDQUFDQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxtQkFBbUJBLENBQUNBLENBQUNBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLENBQUNBLFdBQVdBLENBQUNBLENBQUNBO2FBQ3JGQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUNwQkEsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLENBQUNBLENBQUNBLFNBQVNBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLFNBQVNBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLEtBQUtBLEtBQUtBLENBQUNBLFFBQVFBLENBQUNBLENBQUNBLENBQUNBO2FBQ3ZFQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxJQUFJQSxLQUFLQSxvQkFBU0EsQ0FBQ0E7aUJBQUNBLENBQUNBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0E7YUFDckZBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO1NBQ3BCQSxDQUFDQTtLQUNIQSxDQUFDQTtLQUNIUCxvQ0FBQ0E7QUFBREEsRUFBQ0EsSUFBQTtBQUVEOzs7SUFHRztBQUNIO0tBQ0VRLHdDQUFtQkEsZ0JBQXlDQSxFQUFTQSxHQUFvQkE7U0FBdEVDLHFCQUFnQkEsR0FBaEJBLGdCQUFnQkEsQ0FBeUJBO1NBQVNBLFFBQUdBLEdBQUhBLEdBQUdBLENBQWlCQTtLQUFHQSxDQUFDQTtLQUU3RkQsZ0RBQU9BLEdBQVBBO1NBQ0VFLElBQUlBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0E7U0FDaENBLElBQUlBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLGFBQWFBLENBQUNBO1NBQzFCQSxHQUFHQSxDQUFDQSx3QkFBd0JBLEVBQUVBLENBQUNBO1NBRS9CQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxNQUFNQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQSxFQUFFQSxFQUFFQSxDQUFDQTthQUN6Q0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsWUFBWUEsaUJBQWlCQSxJQUFJQSxnQkFBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQ3JFQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxLQUFLQSxvQkFBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQzlCQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxHQUFHQSxDQUFDQSxtQkFBbUJBLENBQUNBLENBQUNBLENBQUNBLFNBQVNBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLFlBQVlBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQzNFQSxDQUFDQTtTQUNIQSxDQUFDQTtLQUNIQSxDQUFDQTtLQUVERixrREFBU0EsR0FBVEE7U0FDRUcsSUFBSUEsR0FBR0EsR0FBR0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQTtTQUNoQ0Esd0JBQVdBLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLElBQUlBLEVBQUVBLG9CQUFTQSxDQUFDQSxDQUFDQTtLQUN4Q0EsQ0FBQ0E7S0FFREgsc0RBQWFBLEdBQWJBO1NBQ0VJLElBQUlBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0E7U0FDaENBLElBQUlBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLGFBQWFBLENBQUNBO1NBRTFCQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxTQUFTQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQSxFQUFFQSxFQUFFQSxDQUFDQTthQUM1Q0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsWUFBWUEsaUJBQWlCQTtpQkFDdkJBLENBQUNBLENBQUNBLFNBQVNBLENBQUNBLENBQUNBLENBQUVBLENBQUNBLGFBQWFBLENBQUNBLENBQUNBLENBQUNBO2lCQUN0REEsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsV0FBV0EsRUFBRUEsQ0FBQ0E7YUFDNUJBLENBQUNBO1NBQ0hBLENBQUNBO0tBQ0hBLENBQUNBO0tBRURKLHFEQUFZQSxHQUFaQSxjQUFzQkssTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUU3REwsdURBQWNBLEdBQWRBLFVBQWVBLEdBQVFBO1NBQ3JCTSxJQUFJQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLGFBQWFBLENBQUNBO1NBQzVDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxNQUFNQSxDQUFDQSx5QkFBeUJBLElBQUlBLGdCQUFTQSxDQUFDQSxHQUFHQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxFQUFFQSxLQUFLQSxDQUFDQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUMvRkEsQ0FBQ0E7S0FFRE4sbUVBQTBCQSxHQUExQkEsVUFBMkJBLEtBQW9CQSxFQUFFQSxJQUFXQTtTQUMxRE8sSUFBSUEsR0FBR0EsR0FBR0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQTtTQUNoQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsR0FBR0EsQ0FBQ0EsYUFBYUEsQ0FBQ0E7U0FFMUJBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLFNBQVNBLENBQUNBLE1BQU1BLEVBQUVBLENBQUNBLEVBQUVBLEVBQUVBLENBQUNBO2FBQzVDQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxTQUFTQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxLQUFLQSxLQUFLQSxLQUFLQSxDQUFDQSxRQUFRQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDaERBLEVBQUVBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLEtBQUtBLG9CQUFTQSxDQUFDQSxDQUFDQSxDQUFDQTtxQkFDOUJBLEdBQUdBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsWUFBWUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQzNFQSxDQUFDQTtpQkFDREEsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDekJBLENBQUNBO1NBQ0hBLENBQUNBO0tBQ0hBLENBQUNBO0tBQ0hQLHFDQUFDQTtBQUFEQSxFQUFDQSxJQUFBO0FBRUQ7S0FDRVEsdUJBQW1CQSxRQUFnQkEsRUFBU0EsTUFBZ0JBLEVBQVNBLEtBQW9CQTtTQUF0RUMsYUFBUUEsR0FBUkEsUUFBUUEsQ0FBUUE7U0FBU0EsV0FBTUEsR0FBTkEsTUFBTUEsQ0FBVUE7U0FBU0EsVUFBS0EsR0FBTEEsS0FBS0EsQ0FBZUE7S0FBR0EsQ0FBQ0E7S0FFN0ZELHNCQUFJQSw2Q0FBa0JBO2NBQXRCQSxjQUFvQ0UsTUFBTUEsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBLENBQUNBOzs7UUFBQUY7S0FDdEVBLG9CQUFDQTtBQUFEQSxFQUFDQSxJQUFBO0FBSlksc0JBQWEsZ0JBSXpCO0FBRUQ7S0FJRUcsa0JBQW1CQSxhQUE0QkEsRUFBVUEsVUFBMkJBO1NBQWpFQyxrQkFBYUEsR0FBYkEsYUFBYUEsQ0FBZUE7U0FBVUEsZUFBVUEsR0FBVkEsVUFBVUEsQ0FBaUJBO0tBQUdBLENBQUNBO0tBRXhGRCxzQkFBSUEsaUNBQVdBO2NBQWZBLGNBQTZCRSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxLQUFLQSxDQUFDQSxXQUFXQSxDQUFDQSxDQUFDQSxDQUFDQTs7O1FBQUFGO0tBRTNFQSx5QkFBTUEsR0FBTkE7U0FDRUcsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0E7YUFBQ0EsTUFBTUEsQ0FBQ0E7U0FDeEJBLElBQUlBLENBQUNBLE9BQU9BLEVBQUVBLENBQUNBO1NBQ2ZBLElBQUlBLENBQUNBLEtBQUtBLEdBQUdBLEtBQUtBLENBQUNBO1NBRW5CQSw4REFBOERBO1NBQzlEQSxFQUFFQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxrQkFBa0JBLENBQUNBLENBQUNBLENBQUNBO2FBQzFDQSxJQUFJQSxHQUFHQSxHQUFHQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxtQkFBbUJBLENBQUNBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLFFBQVFBLENBQUNBLENBQUNBO2FBQzNFQSxFQUFFQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxLQUFLQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDbkNBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLE1BQU1BLENBQUNBLEdBQUdBLEVBQUVBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBLENBQUNBO2FBQ2hGQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtpQkFDTkEsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsR0FBR0EsRUFBRUEsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFDNUNBLENBQUNBO1NBQ0hBLENBQUNBO1NBRURBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLGVBQWVBLEVBQUVBLENBQUNBO0tBQzlCQSxDQUFDQTtLQUVPSCwwQkFBT0EsR0FBZkE7U0FDRUksSUFBSUEsVUFBVUEsR0FBR0EsRUFBRUEsQ0FBQ0E7U0FDcEJBLEVBQUVBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLEtBQUtBLENBQUNBLFdBQVdBLENBQUNBLENBQUNBLENBQUNBO2FBQ3pDQSxJQUFJQSxJQUFJQSxHQUFHQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxPQUFPQSxFQUFFQSxDQUFDQTthQUNyQ0Esc0RBQXNEQTthQUN0REEsSUFBSUEsVUFBVUEsR0FDVkEsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsYUFBYUEsR0FBR0EsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0Esb0JBQW9CQSxFQUFFQSxDQUFDQSxDQUFDQTthQUNwRkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBO2lCQUFDQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxVQUFVQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQTtTQUNyRUEsQ0FBQ0E7U0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFDTkEsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsRUFBRUEsVUFBVUEsQ0FBQ0EsQ0FBQ0E7U0FDM0NBLENBQUNBO1NBQ0RBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBO0tBQzlCQSxDQUFDQTs7S0FFT0oseUJBQU1BLEdBQWRBLFVBQWVBLEdBQW9CQSxFQUFFQSxVQUFpQkE7U0FDcERLLElBQUlBLElBQUlBLEdBQUdBLEdBQUdBLENBQUNBLE9BQU9BLEVBQUVBLENBQUNBO1NBQ3pCQSxJQUFJQSxRQUFRQSxHQUFHQSxJQUFJQSxDQUFDQSxhQUFhQSxHQUFHQSxHQUFHQSxDQUFDQSxNQUFNQSxDQUFDQSxLQUFLQSxDQUFDQTtTQUNyREEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsUUFBUUEsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsYUFBYUEsR0FBR0EsSUFBSUEsQ0FBQ0EsZUFBZUEsRUFBRUEsQ0FBQ0EsRUFBRUEsRUFBRUEsQ0FBQ0E7YUFDMUVBLElBQUlBLE1BQU1BLEdBQUdBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDdENBLEVBQUVBLENBQUNBLENBQUNBLGNBQU9BLENBQUNBLE1BQU1BLENBQUNBLENBQUNBO2lCQUFDQSxRQUFRQSxDQUFDQTthQUM5QkEsc0VBQXNFQTthQUN0RUEsd0VBQXdFQTthQUN4RUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsUUFBUUEsSUFBSUEsQ0FBQ0EsY0FBT0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsY0FBT0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsTUFBTUEsQ0FBQ0E7aUJBQ3pDQSxJQUFJQSxDQUFDQSxhQUFhQSxHQUFHQSxNQUFNQSxDQUFDQSxNQUFNQSxDQUFDQSxNQUFNQSxDQUFDQSxLQUFLQSxHQUFHQSxRQUFRQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDakZBLEtBQUtBLENBQUNBO2FBQ1JBLENBQUNBO2FBRURBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLEtBQUtBLENBQUNBLFdBQVdBO2lCQUNyQ0EsQ0FBQ0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsTUFBTUEsSUFBSUEsSUFBSUEsQ0FBQ0EsVUFBVUEsSUFBSUEsTUFBTUEsSUFBSUEsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsQ0FBQ0E7aUJBQ25FQSxRQUFRQSxDQUFDQTthQUVYQSwrRUFBK0VBO2FBQy9FQSx3RUFBd0VBO2FBQ3hFQSx1RUFBdUVBO2FBQ3ZFQSw2Q0FBNkNBO2FBQzdDQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxNQUFNQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQTthQUN4Q0EsSUFBSUEsRUFBRUEsR0FBR0EsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDaENBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQTtpQkFBQ0EsSUFBSUEsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxFQUFFQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQTtTQUM5REEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFT0wsaUNBQWNBLEdBQXRCQSxVQUF1QkEsR0FBb0JBLEVBQUVBLFVBQWlCQTtTQUM1RE0sRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxDQUFDQSxDQUFDQTthQUMvQ0EsSUFBSUEsQ0FBQ0EseUJBQXlCQSxDQUFDQSxHQUFHQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQTtTQUNsREEsQ0FBQ0E7U0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFDTkEsSUFBSUEsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxHQUFHQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQTtTQUM1Q0EsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFT04sc0NBQW1CQSxHQUEzQkEsVUFBNEJBLEVBQW9CQSxFQUFFQSxVQUFpQkE7U0FDakVPLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLENBQUNBLEtBQUtBLENBQUNBLE1BQU1BLEVBQUVBLENBQUNBLEVBQUVBLEVBQUVBLENBQUNBO2FBQ3pDQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxFQUFFQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQSxDQUFDQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQTtTQUMzQ0EsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFT1AsNkJBQVVBLEdBQWxCQSxVQUFtQkEsSUFBYUEsRUFBRUEsVUFBaUJBO1NBQ2pEUSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxhQUFhQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxhQUFhQSxHQUFHQSxJQUFJQSxDQUFDQSxlQUFlQSxFQUFFQSxDQUFDQSxFQUFFQSxFQUFFQSxDQUFDQTthQUNwRkEsSUFBSUEsR0FBR0EsR0FBR0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNuQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsY0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7aUJBQUNBLFFBQVFBLENBQUNBO2FBRTNCQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxHQUFHQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQTthQUVyQ0EsSUFBSUEsRUFBRUEsR0FBR0EsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDaENBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQTtpQkFBQ0EsSUFBSUEsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxFQUFFQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQTtTQUM5REEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFT1IsNENBQXlCQSxHQUFqQ0EsVUFBa0NBLEdBQW9CQSxFQUFFQSxVQUFpQkE7U0FDdkVTLElBQUlBLEVBQUVBLEdBQUdBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLEtBQUtBLENBQUNBLFdBQVdBLENBQUNBO1NBQzlDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQSxDQUFDQSxNQUFNQSxFQUFFQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQTthQUNuQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDbENBLFVBQVVBLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLGtCQUFrQkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDakRBLENBQUNBO1NBQ0hBLENBQUNBO0tBQ0hBLENBQUNBO0tBRU9ULHNDQUFtQkEsR0FBM0JBLFVBQTRCQSxHQUFvQkEsRUFBRUEsVUFBaUJBO1NBQ2pFVSxHQUFHQSxDQUFDQSwwQkFBMEJBLENBQUNBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLEtBQUtBLEVBQUVBLFVBQVVBLENBQUNBLENBQUNBO0tBQ3ZFQSxDQUFDQTtLQUVEViw0QkFBU0EsR0FBVEEsY0FBb0JXLElBQUlBLENBQUNBLElBQUlBLEdBQUdBLElBQUlBLENBQUNBLENBQUNBLENBQUNBO0tBRXZDWCwwQkFBT0EsR0FBUEE7U0FDRVksSUFBSUEsQ0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsc0JBQVNBLEVBQU9BLENBQUNBO1NBQ2pDQSxJQUFJQSxDQUFDQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQTtLQUNwQkEsQ0FBQ0E7S0FDSFosZUFBQ0E7QUFBREEsRUFBQ0EsSUFBQTtBQWhIWSxpQkFBUSxXQWdIcEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzdqQ0QsZ0NBT08sQ0FBc0IsQ0FBQztBQUM5QixrQ0FBaUMsQ0FBMEIsQ0FBQztBQUM1RCx3Q0FBNEIsRUFBZ0MsQ0FBQztBQUM3RCxLQUFZLFVBQVUsdUJBQU0sRUFBUSxDQUFDO0FBRXJDLHNDQUFrRixFQUFZLENBQUM7QUFHL0YsaUNBS08sRUFBOEIsQ0FBQztBQUN0QyxnREFBa0MsRUFBc0IsQ0FBQztBQUN6RCx1Q0FBMEIsRUFBYSxDQUFDO0FBQ3hDLDJDQUE4QixFQUFpQixDQUFDO0FBQ2hELHFDQUFtRCxFQUFvQixDQUFDO0FBQ3hFLGdEQUErQixFQUFzQixDQUFDO0FBRXREOzs7OztJQUtHO0FBQ0g7S0FBQWE7S0FxSkFDLENBQUNBO0tBL0lDRDs7UUFFR0E7S0FDSEEsdUNBQWNBLEdBQWRBLFVBQWVBLFdBQXdCQTtTQUNyQ0UsSUFBSUEsUUFBUUEsR0FBR0EsdUJBQVlBLENBQVVBLFdBQVdBLENBQUNBLENBQUNBO1NBQ2xEQSxFQUFFQSxDQUFDQSxDQUFDQSxRQUFRQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxLQUFLQSxVQUFVQSxDQUFDQSxRQUFRQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNyREEsTUFBTUEsSUFBSUEsMEJBQWFBLENBQUNBLDhDQUE4Q0EsQ0FBQ0EsQ0FBQ0E7U0FDMUVBLENBQUNBO1NBQ0RBLE1BQU1BLENBQUNBLFFBQVFBLENBQUNBLFdBQVdBLENBQUNBLFFBQVFBLENBQUNBLGFBQWFBLENBQUNBLENBQUNBO0tBQ3REQSxDQUFDQTtLQXNJSEYscUJBQUNBO0FBQURBLEVBQUNBLElBQUE7QUFySnFCLHVCQUFjLGlCQXFKbkM7QUFFRDtLQUNxQ0csbUNBQWNBO0tBR2pEQSx5QkFBb0JBLFNBQXNCQSxFQUFVQSxhQUE4QkEsRUFDOURBLE1BQTJCQSxFQUFVQSxTQUFtQkEsRUFDcEJBLGlCQUFpQkE7U0FDdkVDLGlCQUFPQSxDQUFDQTtTQUhVQSxjQUFTQSxHQUFUQSxTQUFTQSxDQUFhQTtTQUFVQSxrQkFBYUEsR0FBYkEsYUFBYUEsQ0FBaUJBO1NBQzlEQSxXQUFNQSxHQUFOQSxNQUFNQSxDQUFxQkE7U0FBVUEsY0FBU0EsR0FBVEEsU0FBU0EsQ0FBVUE7U0FnQzVFQSxnQkFBZ0JBO1NBQ2hCQSw2QkFBd0JBLEdBQWVBLHdCQUFjQSxDQUFDQSxxQ0FBcUNBLENBQUNBLENBQUNBO1NBb0I3RkEsZ0JBQWdCQTtTQUNoQkEsOEJBQXlCQSxHQUFlQSx3QkFBY0EsQ0FBQ0Esc0NBQXNDQSxDQUFDQSxDQUFDQTtTQWUvRkEsZ0JBQWdCQTtTQUNoQkEsd0NBQW1DQSxHQUMvQkEsd0JBQWNBLENBQUNBLGdEQUFnREEsQ0FBQ0EsQ0FBQ0E7U0FjckVBLGdCQUFnQkE7U0FDaEJBLG9DQUErQkEsR0FDM0JBLHdCQUFjQSxDQUFDQSw0Q0FBNENBLENBQUNBLENBQUNBO1NBcUVqRUEsZ0JBQWdCQTtTQUNoQkEsaUNBQTRCQSxHQUFHQSx3QkFBY0EsQ0FBQ0EsMENBQTBDQSxDQUFDQSxDQUFDQTtTQVUxRkEsZ0JBQWdCQTtTQUNoQkEsZ0NBQTJCQSxHQUFHQSx3QkFBY0EsQ0FBQ0EseUNBQXlDQSxDQUFDQSxDQUFDQTtTQW9CeEZBLGdCQUFnQkE7U0FDaEJBLGdDQUEyQkEsR0FBR0Esd0JBQWNBLENBQUNBLHlDQUF5Q0EsQ0FBQ0EsQ0FBQ0E7U0ExTHRGQSxJQUFJQSxDQUFDQSxpQkFBaUJBLEdBQUdBLGlCQUFpQkEsQ0FBQ0E7S0FDN0NBLENBQUNBO0tBRURELDBDQUFnQkEsR0FBaEJBLFVBQWlCQSxRQUFvQkE7U0FDbkNFLElBQUlBLFFBQVFBLEdBQUdBLHVCQUFZQSxDQUFlQSxRQUFTQSxDQUFDQSxVQUFVQSxDQUFDQSxDQUFDQTtTQUNoRUEsTUFBTUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsZ0JBQWdCQSxDQUFlQSxRQUFTQSxDQUFDQSxpQkFBaUJBLENBQUNBO2NBQ3RFQSxtQkFBbUJBLEVBQUVBLENBQUNBO0tBQzdCQSxDQUFDQTtLQUVERix3REFBOEJBLEdBQTlCQSxVQUErQkEsWUFBd0JBLEVBQUVBLFlBQW9CQTtTQUMzRUcsSUFBSUEsUUFBUUEsR0FBR0EsdUJBQVlBLENBQWVBLFlBQWFBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBO1NBQ3BFQSxJQUFJQSxpQkFBaUJBLEdBQWlCQSxZQUFhQSxDQUFDQSxpQkFBaUJBLENBQUNBO1NBQ3RFQSxJQUFJQSxhQUFhQSxHQUFHQSxRQUFRQSxDQUFDQSxhQUFhQSxDQUFDQSxpQkFBaUJBLENBQUNBLENBQUNBO1NBQzlEQSxFQUFFQSxDQUFDQSxDQUFDQSxjQUFPQSxDQUFDQSxhQUFhQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUMzQkEsTUFBTUEsSUFBSUEsMEJBQWFBLENBQUNBLGdEQUE4Q0EsaUJBQW1CQSxDQUFDQSxDQUFDQTtTQUM3RkEsQ0FBQ0E7U0FDREEsSUFBSUEsU0FBU0EsR0FBR0EsYUFBYUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxHQUFHQSxDQUFDQSxZQUFZQSxDQUFDQSxDQUFDQTtTQUN4RUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsY0FBT0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDdkJBLE1BQU1BLElBQUlBLDBCQUFhQSxDQUFDQSw2QkFBMkJBLFlBQWNBLENBQUNBLENBQUNBO1NBQ3JFQSxDQUFDQTtTQUNEQSxNQUFNQSxDQUFDQSxhQUFhQSxDQUFDQSxXQUFXQSxDQUFDQSxhQUFhQSxDQUFDQSxhQUFhQSxHQUFHQSxTQUFTQSxDQUFDQSxDQUFDQTtLQUM1RUEsQ0FBQ0E7S0FFREgsc0NBQVlBLEdBQVpBLFVBQWFBLFlBQXdCQTtTQUNuQ0ksSUFBSUEsUUFBUUEsR0FBR0EsdUJBQVlBLENBQWVBLFlBQWFBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBO1NBQ3BFQSxJQUFJQSxpQkFBaUJBLEdBQWlCQSxZQUFhQSxDQUFDQSxpQkFBaUJBLENBQUNBO1NBQ3RFQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxvQkFBb0JBLENBQUNBLFFBQVFBLEVBQUVBLGlCQUFpQkEsQ0FBQ0EsQ0FBQ0E7S0FDdkVBLENBQUNBO0tBS0RKLDRDQUFrQkEsR0FBbEJBLFVBQW1CQSxnQkFBOEJBLEVBQUVBLGdCQUF3QkEsRUFDeERBLFFBQWtCQTtTQUNuQ0ssSUFBSUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0Esd0JBQXdCQSxFQUFFQSxDQUFDQTtTQUN4Q0EsSUFBSUEsYUFBYUEsR0FBNEJBLDRCQUFpQkEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxDQUFDQTtTQUNqRkEsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSwyQkFBMkJBLENBQUNBLGFBQWFBLENBQUNBLENBQUNBO1NBQ2xFQSxJQUFJQSxtQkFBbUJBLEdBQUdBLGdCQUFnQkEsQ0FBQ0E7U0FDM0NBLEVBQUVBLENBQUNBLENBQUNBLGNBQU9BLENBQUNBLG1CQUFtQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDakNBLG1CQUFtQkEsR0FBR0EsYUFBYUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxRQUFRQSxDQUFDQSxRQUFRQSxDQUFDQTtTQUM3RkEsQ0FBQ0E7U0FDREEsSUFBSUEsdUJBQXVCQSxHQUFHQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxrQkFBa0JBLENBQzNEQSxhQUFhQSxDQUFDQSxNQUFNQSxFQUFFQSxhQUFhQSxDQUFDQSxTQUFTQSxDQUFDQSxpQkFBaUJBLEdBQUdBLENBQUNBLEVBQUVBLG1CQUFtQkEsQ0FBQ0EsQ0FBQ0E7U0FDOUZBLElBQUlBLFFBQVFBLEdBQUdBLElBQUlBLENBQUNBLGVBQWVBLENBQUNBLGFBQWFBLEVBQUVBLHVCQUF1QkEsQ0FBQ0EsQ0FBQ0E7U0FFNUVBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLFdBQVdBLENBQUNBLFFBQVFBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBO1NBQzVDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxtQkFBbUJBLENBQUNBLFFBQVFBLEVBQUVBLFFBQVFBLENBQUNBLENBQUNBO1NBQ3BEQSxNQUFNQSxDQUFDQSxrQkFBUUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsUUFBUUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7S0FDbkNBLENBQUNBO0tBS0RMLDZDQUFtQkEsR0FBbkJBLFVBQW9CQSxXQUF3QkE7U0FDMUNNLGtEQUFrREE7U0FDbERBLDhEQUE4REE7U0FDOURBLElBQUlBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLHlCQUF5QkEsRUFBRUEsQ0FBQ0E7U0FDekNBLElBQUlBLFFBQVFBLEdBQUdBLHVCQUFZQSxDQUFVQSxXQUFXQSxDQUFDQSxDQUFDQTtTQUNsREEsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsY0FBY0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0E7U0FDdkRBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLGFBQWFBLENBQUNBLFFBQVFBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBO1NBQzlDQSxJQUFJQSxDQUFDQSxxQkFBcUJBLENBQUNBLFFBQVFBLENBQUNBLENBQUNBO1NBQ3JDQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxlQUFlQSxDQUFDQSxRQUFRQSxDQUFDQSxDQUFDQTtTQUM3Q0EsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0E7U0FDNUNBLGtCQUFRQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUNkQSxDQUFDQTtLQU1ETix1REFBNkJBLEdBQTdCQSxVQUE4QkEscUJBQWlDQSxFQUFFQSxLQUFhQSxFQUNoREEsV0FBd0JBO1NBQ3BETyxJQUFJQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxtQ0FBbUNBLEVBQUVBLENBQUNBO1NBQ25EQSxJQUFJQSxTQUFTQSxHQUFHQSw0QkFBaUJBLENBQWdCQSxXQUFZQSxDQUFDQSxZQUFZQSxDQUFDQSxDQUFDQTtTQUM1RUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsSUFBSUEsS0FBS0EsVUFBVUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDcERBLE1BQU1BLElBQUlBLDBCQUFhQSxDQUFDQSwwREFBMERBLENBQUNBLENBQUNBO1NBQ3RGQSxDQUFDQTtTQUNEQSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLDJCQUEyQkEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0E7U0FDOURBLE1BQU1BLENBQUNBLGtCQUFRQSxDQUFDQSxDQUFDQSxFQUFFQSxJQUFJQSxDQUFDQSxzQkFBc0JBLENBQUNBLHFCQUFxQkEsRUFBRUEsS0FBS0EsRUFBRUEsU0FBU0EsRUFDdkNBLFdBQVdBLENBQUNBLFVBQVVBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBLENBQUNBO0tBQ2hGQSxDQUFDQTtLQU1EUCxtREFBeUJBLEdBQXpCQSxVQUEwQkEscUJBQWlDQSxFQUFFQSxLQUFhQSxFQUNoREEsWUFBMEJBLEVBQzFCQSwyQkFBK0NBO1NBQ3ZFUSxJQUFJQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSwrQkFBK0JBLEVBQUVBLENBQUNBO1NBQy9DQSxJQUFJQSxTQUFTQSxHQUFHQSw0QkFBaUJBLENBQUNBLFlBQVlBLENBQUNBLENBQUNBO1NBQ2hEQSxFQUFFQSxDQUFDQSxDQUFDQSxTQUFTQSxDQUFDQSxJQUFJQSxLQUFLQSxVQUFVQSxDQUFDQSxRQUFRQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNoREEsTUFBTUEsSUFBSUEsMEJBQWFBLENBQUNBLHNEQUFzREEsQ0FBQ0EsQ0FBQ0E7U0FDbEZBLENBQUNBO1NBQ0RBLElBQUlBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsMkJBQTJCQSxDQUFDQSxTQUFTQSxDQUFDQSxDQUFDQTtTQUM5REEsTUFBTUEsQ0FBQ0Esa0JBQVFBLENBQ1hBLENBQUNBLEVBQUVBLElBQUlBLENBQUNBLHNCQUFzQkEsQ0FBQ0EscUJBQXFCQSxFQUFFQSxLQUFLQSxFQUFFQSxTQUFTQSxFQUN2Q0EscUJBQXFCQSxFQUFFQSwyQkFBMkJBLENBQUNBLENBQUNBLENBQUNBO0tBQzFGQSxDQUFDQTtLQUVEUjs7OztRQUlHQTtLQUNIQSxnREFBc0JBLEdBQXRCQSxVQUF1QkEscUJBQWlDQSxFQUFFQSxLQUFhQSxFQUNoREEsU0FBa0NBLEVBQUVBLE9BQW1CQSxFQUN2REEsMkJBQStDQTtTQUNwRVMsSUFBSUEsVUFBVUEsR0FBR0EsdUJBQVlBLENBQWVBLHFCQUFzQkEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsQ0FBQ0E7U0FDL0VBLElBQUlBLGlCQUFpQkEsR0FBaUJBLHFCQUFzQkEsQ0FBQ0EsaUJBQWlCQSxDQUFDQTtTQUMvRUEsSUFBSUEsV0FBV0EsR0FBR0EsdUJBQVlBLENBQWVBLE9BQVFBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBO1NBQ2xFQSxJQUFJQSx3QkFBd0JBLEdBQWlCQSxPQUFRQSxDQUFDQSxpQkFBaUJBLENBQUNBO1NBQ3hFQSxJQUFJQSxvQkFBb0JBLEdBQUdBLFdBQVdBLENBQUNBLGFBQWFBLENBQUNBLHdCQUF3QkEsQ0FBQ0EsQ0FBQ0E7U0FDL0VBLElBQUlBLElBQUlBLENBQUNBO1NBQ1RBLEVBQUVBLENBQUNBLENBQUNBLFNBQVNBLENBQUNBLElBQUlBLEtBQUtBLFVBQVVBLENBQUNBLFFBQVFBLENBQUNBLFFBQVFBLElBQUlBLGdCQUFTQSxDQUFDQSxvQkFBb0JBLENBQUNBO2FBQ2xGQSxDQUFDQSxvQkFBb0JBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBO2FBQ3JDQSxzRkFBc0ZBO2FBQ3RGQSxJQUFJQSxHQUFHQSxvQkFBb0JBLENBQUNBO2FBQzVCQSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLFVBQVVBLEVBQUVBLGlCQUFpQkEsRUFBRUEsS0FBS0EsRUFBRUEsSUFBSUEsQ0FBQ0EsQ0FBQ0E7U0FDckVBLENBQUNBO1NBQUNBLElBQUlBLENBQUNBLENBQUNBO2FBQ05BLHdFQUF3RUE7YUFDeEVBLDBCQUEwQkE7YUFDMUJBLG1FQUFtRUE7YUFDbkVBLElBQUlBLEdBQUdBLElBQUlBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0E7YUFDekNBLElBQUlBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsVUFBVUEsRUFBRUEsaUJBQWlCQSxFQUFFQSxLQUFLQSxFQUFFQSxJQUFJQSxDQUFDQSxDQUFDQTthQUNuRUEsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0E7U0FDMUNBLENBQUNBO1NBQ0RBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLHFCQUFxQkEsQ0FBQ0EsVUFBVUEsRUFBRUEsaUJBQWlCQSxFQUFFQSxXQUFXQSxFQUMxQ0Esd0JBQXdCQSxFQUFFQSxLQUFLQSxFQUFFQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUV6RUEsSUFBSUEsQ0FBQ0E7YUFDSEEsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0Esc0JBQXNCQSxDQUFDQSxVQUFVQSxFQUFFQSxpQkFBaUJBLEVBQUVBLFdBQVdBLEVBQzFDQSx3QkFBd0JBLEVBQUVBLEtBQUtBLEVBQy9CQSwyQkFBMkJBLENBQUNBLENBQUNBO1NBQ2xFQSxDQUFFQTtTQUFBQSxLQUFLQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNYQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxxQkFBcUJBLENBQUNBLFVBQVVBLEVBQUVBLGlCQUFpQkEsRUFBRUEsS0FBS0EsQ0FBQ0EsQ0FBQ0E7YUFDeEVBLE1BQU1BLENBQUNBLENBQUNBO1NBQ1ZBLENBQUNBO1NBQ0RBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBO0tBQ2xCQSxDQUFDQTtLQUVEVCxnQkFBZ0JBO0tBQ2hCQSwyQ0FBaUJBLEdBQWpCQSxVQUFrQkEsVUFBOEJBLEVBQUVBLGlCQUF5QkEsRUFBRUEsS0FBYUEsRUFDeEVBLElBQXdCQTtTQUN4Q1UsSUFBSUEsVUFBVUEsR0FBR0EsVUFBVUEsQ0FBQ0EsV0FBV0EsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxDQUFDQTtTQUMzREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsS0FBS0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDaEJBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLDBCQUEwQkEsQ0FBQ0EsVUFBVUEsRUFBRUEsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0E7U0FDN0VBLENBQUNBO1NBQUNBLElBQUlBLENBQUNBLENBQUNBO2FBQ05BLElBQUlBLFFBQVFBLEdBQUdBLFVBQVVBLENBQUNBLGNBQWNBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsS0FBS0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDN0VBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLDJCQUEyQkEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsY0FBY0EsRUFBRUEsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0E7U0FDM0ZBLENBQUNBO0tBQ0hBLENBQUNBO0tBS0RWLGdEQUFzQkEsR0FBdEJBLFVBQXVCQSxxQkFBaUNBLEVBQUVBLEtBQWFBO1NBQ3JFVyxJQUFJQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSw0QkFBNEJBLEVBQUVBLENBQUNBO1NBQzVDQSxJQUFJQSxVQUFVQSxHQUFHQSx1QkFBWUEsQ0FBZUEscUJBQXNCQSxDQUFDQSxVQUFVQSxDQUFDQSxDQUFDQTtTQUMvRUEsSUFBSUEsaUJBQWlCQSxHQUFpQkEscUJBQXNCQSxDQUFDQSxpQkFBaUJBLENBQUNBO1NBQy9FQSxJQUFJQSxDQUFDQSx1QkFBdUJBLENBQUNBLFVBQVVBLEVBQUVBLGlCQUFpQkEsRUFBRUEsS0FBS0EsQ0FBQ0EsQ0FBQ0E7U0FDbkVBLGtCQUFRQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUNkQSxDQUFDQTtLQUtEWCx1RkFBdUZBO0tBQ3ZGQSwrQ0FBcUJBLEdBQXJCQSxVQUFzQkEscUJBQWlDQSxFQUFFQSxLQUFhQSxFQUNoREEsT0FBZ0JBO1NBQ3BDWSxJQUFJQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSwyQkFBMkJBLEVBQUVBLENBQUNBO1NBQzNDQSxJQUFJQSxJQUFJQSxHQUFHQSx1QkFBWUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0E7U0FDakNBLElBQUlBLFVBQVVBLEdBQUdBLHVCQUFZQSxDQUFlQSxxQkFBc0JBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBO1NBQy9FQSxJQUFJQSxpQkFBaUJBLEdBQWlCQSxxQkFBc0JBLENBQUNBLGlCQUFpQkEsQ0FBQ0E7U0FDL0VBLCtFQUErRUE7U0FDL0VBLDJEQUEyREE7U0FDM0RBLGlGQUFpRkE7U0FDakZBLGlGQUFpRkE7U0FDakZBLDBDQUEwQ0E7U0FDMUNBLDBDQUEwQ0E7U0FDMUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLHFCQUFxQkEsQ0FBQ0EsVUFBVUEsRUFBRUEsaUJBQWlCQSxFQUFFQSxJQUFJQSxFQUFFQSxJQUFJQSxFQUFFQSxLQUFLQSxFQUFFQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUMxRkEsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxVQUFVQSxFQUFFQSxpQkFBaUJBLEVBQUVBLEtBQUtBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBO1NBQ25FQSxNQUFNQSxDQUFDQSxrQkFBUUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsT0FBT0EsQ0FBQ0EsQ0FBQ0E7S0FDOUJBLENBQUNBO0tBS0RaLHVGQUF1RkE7S0FDdkZBLCtDQUFxQkEsR0FBckJBLFVBQXNCQSxxQkFBaUNBLEVBQUVBLEtBQWFBO1NBQ3BFYSxJQUFJQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSwyQkFBMkJBLEVBQUVBLENBQUNBO1NBQzNDQSxJQUFJQSxVQUFVQSxHQUFHQSx1QkFBWUEsQ0FBZUEscUJBQXNCQSxDQUFDQSxVQUFVQSxDQUFDQSxDQUFDQTtTQUMvRUEsSUFBSUEsaUJBQWlCQSxHQUFpQkEscUJBQXNCQSxDQUFDQSxpQkFBaUJBLENBQUNBO1NBQy9FQSxJQUFJQSxhQUFhQSxHQUFHQSxVQUFVQSxDQUFDQSxjQUFjQSxDQUFDQSxpQkFBaUJBLENBQUNBLENBQUNBO1NBQ2pFQSxJQUFJQSxJQUFJQSxHQUFHQSxhQUFhQSxDQUFDQSxLQUFLQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQTtTQUN0Q0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EscUJBQXFCQSxDQUFDQSxVQUFVQSxFQUFFQSxpQkFBaUJBLEVBQUVBLEtBQUtBLENBQUNBLENBQUNBO1NBQ3hFQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxjQUFjQSxDQUFDQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxDQUFDQTtTQUNuREEsTUFBTUEsQ0FBQ0Esa0JBQVFBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBO0tBQy9CQSxDQUFDQTtLQUVEYixnQkFBZ0JBO0tBQ2hCQSx5Q0FBZUEsR0FBZkEsVUFBZ0JBLFNBQWtDQSxFQUNsQ0EsdUJBQWdEQTtTQUM5RGMsSUFBSUEsZ0JBQWdCQSxHQUNoQkEsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsU0FBU0EsRUFBRUEsdUJBQXVCQSxFQUFFQSxJQUFJQSxFQUFFQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxDQUFDQTtTQUNyRkEsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxnQkFBZ0JBLENBQUNBLE1BQU1BLEVBQUVBLGdCQUFnQkEsQ0FBQ0EsQ0FBQ0E7U0FDN0VBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLGFBQWFBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsQ0FBQ0E7U0FDbkRBLE1BQU1BLENBQUNBLGdCQUFnQkEsQ0FBQ0E7S0FDMUJBLENBQUNBO0tBRURkLGdCQUFnQkE7S0FDaEJBLDJDQUFpQkEsR0FBakJBLFVBQWtCQSxTQUFrQ0E7U0FDbERlLElBQUlBLElBQUlBLEdBQUdBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLE9BQU9BLENBQUNBLFNBQVNBLENBQUNBLENBQUNBO1NBQzdDQSxFQUFFQSxDQUFDQSxDQUFDQSxjQUFPQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNsQkEsSUFBSUEsR0FBR0EsSUFBSUEsQ0FBQ0EsZUFBZUEsQ0FDdkJBLFNBQVNBLEVBQ1RBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLFVBQVVBLENBQUNBLFNBQVNBLENBQUNBLE1BQU1BLEVBQUVBLFNBQVNBLENBQUNBLFNBQVNBLENBQUNBLGlCQUFpQkEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7U0FDOUZBLENBQUNBO1NBQ0RBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBO0tBQ2RBLENBQUNBO0tBRURmLGdCQUFnQkE7S0FDaEJBLDRDQUFrQkEsR0FBbEJBLFVBQW1CQSxJQUF3QkE7U0FDekNnQixJQUFJQSxXQUFXQSxHQUFHQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxVQUFVQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUNsREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDakJBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLGVBQWVBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO2FBQ3pDQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxXQUFXQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQTtTQUMxQ0EsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFRGhCLGdCQUFnQkE7S0FDaEJBLGlEQUF1QkEsR0FBdkJBLFVBQXdCQSxVQUE4QkEsRUFBRUEsaUJBQXlCQSxFQUN6REEsS0FBYUE7U0FDbkNpQixJQUFJQSxhQUFhQSxHQUFHQSxVQUFVQSxDQUFDQSxjQUFjQSxDQUFDQSxpQkFBaUJBLENBQUNBLENBQUNBO1NBQ2pFQSxJQUFJQSxJQUFJQSxHQUFHQSxhQUFhQSxDQUFDQSxLQUFLQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQTtTQUV0Q0EsSUFBSUEsQ0FBQ0EscUJBQXFCQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUNqQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EscUJBQXFCQSxDQUFDQSxVQUFVQSxFQUFFQSxpQkFBaUJBLEVBQUVBLEtBQUtBLENBQUNBLENBQUNBO1NBQ3hFQSxFQUFFQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxVQUFVQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUN4QkEsK0NBQStDQTthQUMvQ0EsMkJBQTJCQTthQUMzQkEsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsY0FBY0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0E7U0FDckRBLENBQUNBO1NBQUNBLElBQUlBLENBQUNBLENBQUNBO2FBQ05BLG1EQUFtREE7YUFDbkRBLDRCQUE0QkE7YUFDNUJBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLGFBQWFBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBO2FBQzFDQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxjQUFjQSxDQUFDQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxDQUFDQTthQUNuREEsSUFBSUEsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUNoQ0EsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFRGpCLGdCQUFnQkE7S0FDaEJBLCtDQUFxQkEsR0FBckJBLFVBQXNCQSxJQUF3QkE7U0FDNUNrQixFQUFFQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxRQUFRQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNwQkEsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7U0FDbENBLENBQUNBO1NBQ0RBLElBQUlBLGNBQWNBLEdBQUdBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBO1NBQ3pDQSxJQUFJQSxlQUFlQSxHQUFHQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQTtTQUN0Q0EsSUFBSUEsYUFBYUEsR0FBR0EsSUFBSUEsQ0FBQ0EsVUFBVUEsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsU0FBU0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7U0FDekVBLElBQUlBLGFBQWFBLEdBQUdBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBO1NBQ3ZDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxPQUFPQSxHQUFHQSxlQUFlQSxFQUFFQSxPQUFPQSxJQUFJQSxhQUFhQSxFQUFFQSxPQUFPQSxFQUFFQSxFQUFFQSxDQUFDQTthQUN4RUEsSUFBSUEsUUFBUUEsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0E7YUFDbkNBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLFNBQVNBLEdBQUdBLENBQUNBLEVBQUVBLFNBQVNBLEdBQUdBLFFBQVFBLENBQUNBLEtBQUtBLENBQUNBLGNBQWNBLENBQUNBLE1BQU1BLEVBQ25FQSxTQUFTQSxFQUFFQSxFQUFFQSxhQUFhQSxFQUFFQSxFQUFFQSxDQUFDQTtpQkFDbENBLElBQUlBLEVBQUVBLEdBQUdBLGNBQWNBLENBQUNBLGFBQWFBLENBQUNBLENBQUNBO2lCQUN2Q0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO3FCQUNsQkEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsRUFBRUEsQ0FBQ0E7eUJBQzlDQSxJQUFJQSxDQUFDQSx1QkFBdUJBLENBQUNBLFFBQVFBLEVBQUVBLGFBQWFBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBO3FCQUMzREEsQ0FBQ0E7aUJBQ0hBLENBQUNBO2FBQ0hBLENBQUNBO1NBQ0hBLENBQUNBO0tBQ0hBLENBQUNBO0tBeFJIbEI7U0FBQ0EsZUFBVUEsRUFBRUE7U0FNQ0EsV0FBQ0EsV0FBTUEsQ0FBQ0EsZUFBVUEsQ0FBQ0EsY0FBTUEsNENBQWdCQSxFQUFoQkEsQ0FBZ0JBLENBQUNBLENBQUNBOzt5QkFtUnhEQTtLQUFEQSxzQkFBQ0E7QUFBREEsRUFBQ0EsRUF4Um9DLGNBQWMsRUF3UmxEO0FBeFJZLHdCQUFlLGtCQXdSM0I7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqZEQsZ0NBQStELENBQXNCLENBQUM7QUFDdEYsd0NBQTZELEVBQWdDLENBQUM7QUFDOUYsS0FBWSxHQUFHLHVCQUFNLEVBQW9CLENBQUM7QUFDMUMsa0NBQWlDLENBQTBCLENBQUM7QUFDNUQsS0FBWSxVQUFVLHVCQUFNLEVBQVEsQ0FBQztBQUVyQyx5Q0FBc0MsRUFBZSxDQUFDO0FBQ3RELDBDQUF3QyxFQUFnQixDQUFDO0FBR3pELG1DQUFvQixFQUErQixDQUFDO0FBRXBEO0tBRUVtQjtLQUFlQyxDQUFDQTtLQUVoQkQsa0RBQW9CQSxHQUFwQkEsVUFBcUJBLFVBQThCQSxFQUFFQSxpQkFBeUJBO1NBQzVFRSxJQUFJQSxHQUFHQSxHQUFHQSxVQUFVQSxDQUFDQSxnQkFBZ0JBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsQ0FBQ0E7U0FDekRBLE1BQU1BLENBQUNBLEdBQUdBLENBQUNBLFlBQVlBLEVBQUVBLENBQUNBO0tBQzVCQSxDQUFDQTtLQUVERix3Q0FBVUEsR0FBVkEsVUFBV0EscUJBQThDQSxFQUM5Q0EsdUJBQWdEQSxFQUNoREEsV0FBcUNBLEVBQUVBLFFBQWtCQTtTQUNsRUcsSUFBSUEsZUFBZUEsR0FBR0EsdUJBQXVCQSxDQUFDQSxZQUFZQSxDQUFDQTtTQUMzREEsSUFBSUEsVUFBVUEsR0FBR0EsdUJBQXVCQSxDQUFDQSxPQUFPQSxDQUFDQTtTQUVqREEsSUFBSUEsWUFBWUEsR0FBR0EscUJBQXFCQSxDQUFDQSxTQUFTQSxDQUFDQSxZQUFZQSxDQUFDQTtTQUNoRUEsSUFBSUEsU0FBU0EsR0FBR0EscUJBQXFCQSxDQUFDQSxTQUFTQSxDQUFDQSxTQUFTQSxDQUFDQTtTQUMxREEsSUFBSUEsV0FBV0EsR0FBaUJBLHdCQUFXQSxDQUFDQSxlQUFlQSxDQUFDQSxZQUFZQSxDQUFDQSxDQUFDQTtTQUMxRUEsSUFBSUEsY0FBY0EsR0FBR0Esd0JBQVdBLENBQUNBLGVBQWVBLENBQUNBLFlBQVlBLENBQUNBLENBQUNBO1NBQy9EQSxJQUFJQSxlQUFlQSxHQUEwQkEsd0JBQVdBLENBQUNBLGVBQWVBLENBQUNBLFlBQVlBLENBQUNBLENBQUNBO1NBQ3ZGQSxJQUFJQSxnQkFBZ0JBLEdBQTBCQSx3QkFBV0EsQ0FBQ0EsZUFBZUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsQ0FBQ0E7U0FDeEZBLElBQUlBLEtBQUtBLEdBQUdBLHdCQUFXQSxDQUFDQSxlQUFlQSxDQUFDQSxTQUFTQSxDQUFDQSxDQUFDQTtTQUVuREEsSUFBSUEsYUFBYUEsR0FBR0EsQ0FBQ0EsQ0FBQ0E7U0FDdEJBLElBQUlBLFVBQVVBLEdBQUdBLENBQUNBLENBQUNBO1NBQ25CQSxJQUFJQSxXQUFXQSxHQUFHQSxDQUFDQSxDQUFDQTtTQUNwQkEsSUFBSUEsa0NBQWtDQSxHQUFhQSx3QkFBV0EsQ0FBQ0EsZUFBZUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0E7U0FDMUZBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLFVBQVVBLEdBQUdBLENBQUNBLEVBQUVBLFVBQVVBLEdBQUdBLFNBQVNBLEVBQUVBLFVBQVVBLEVBQUVBLEVBQUVBLENBQUNBO2FBQzlEQSxJQUFJQSxxQkFBcUJBLEdBQUdBLGtDQUFrQ0EsQ0FBQ0EsVUFBVUEsQ0FBQ0EsQ0FBQ0E7YUFDM0VBLElBQUlBLHdCQUF3QkEsR0FDeEJBLGdCQUFTQSxDQUFDQSxxQkFBcUJBLENBQUNBLEdBQUdBLGdCQUFnQkEsQ0FBQ0EscUJBQXFCQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQTthQUN0RkEsSUFBSUEsVUFBVUEsR0FDVkEsZ0JBQVNBLENBQUNBLHdCQUF3QkEsQ0FBQ0EsR0FBR0EsZUFBZUEsQ0FBQ0EscUJBQXFCQSxDQUFDQSxDQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxDQUFDQTthQUM3RkEsSUFBSUEsU0FBU0EsR0FDVEEsZ0JBQVNBLENBQUNBLHFCQUFxQkEsQ0FBQ0E7aUJBQzVCQSxVQUFVQSxDQUFDQSxLQUFLQSxDQUFDQSxjQUFjQSxDQUFDQSxxQkFBcUJBLEdBQUdBLFVBQVVBLENBQUNBLGFBQWFBLENBQUNBO3NCQUM1RUEsZUFBZUE7aUJBQ3BCQSxxQkFBcUJBLENBQUNBO2FBQzlCQSxJQUFJQSxjQUFjQSxHQUFHQSxJQUFJQSxDQUFDQTthQUMxQkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsVUFBVUEsS0FBS0EsQ0FBQ0EsSUFBSUEsU0FBU0EsQ0FBQ0EsSUFBSUEsS0FBS0EsVUFBVUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQ3hFQSxjQUFjQSxHQUFHQSxlQUFlQSxDQUFDQSxXQUFXQSxFQUFFQSxDQUFDQSxDQUFDQTthQUNsREEsQ0FBQ0E7YUFDREEsSUFBSUEsV0FBV0EsR0FBR0EsSUFBSUEsVUFBVUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsUUFBUUEsRUFBRUEsU0FBU0EsRUFBRUEsVUFBVUEsRUFBRUEsYUFBYUEsRUFDOUNBLFVBQVVBLEVBQUVBLFNBQVNBLENBQUNBLFdBQVdBLEVBQUVBLFVBQVVBLEVBQzdDQSxjQUFjQSxFQUFFQSx3QkFBd0JBLENBQUNBLENBQUNBO2FBQ25GQSxLQUFLQSxDQUFDQSxVQUFVQSxDQUFDQSxHQUFHQSxXQUFXQSxDQUFDQTthQUNoQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLHFCQUFxQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQ3JDQSxlQUFlQSxDQUFDQSxxQkFBcUJBLENBQUNBLENBQUNBLFVBQVVBLEdBQUdBLFdBQVdBLENBQUNBO2FBQ2xFQSxDQUFDQTthQUNEQSxJQUFJQSxvQkFBb0JBLEdBQUdBLEVBQUVBLENBQUNBO2FBQzlCQSxJQUFJQSxnQkFBZ0JBLEdBQUdBLFVBQVVBLEdBQUdBLENBQUNBLENBQUNBO2FBQ3RDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxTQUFTQSxHQUFHQSxDQUFDQSxFQUFFQSxTQUFTQSxHQUFHQSxTQUFTQSxDQUFDQSxjQUFjQSxDQUFDQSxNQUFNQSxFQUFFQSxTQUFTQSxFQUFFQSxFQUFFQSxDQUFDQTtpQkFDakZBLElBQUlBLE1BQU1BLEdBQUdBLFNBQVNBLENBQUNBLGNBQWNBLENBQUNBLFNBQVNBLENBQUNBLENBQUNBO2lCQUNqREEsSUFBSUEsaUJBQWlCQSxHQUFHQSxhQUFhQSxHQUFHQSxTQUFTQSxDQUFDQTtpQkFDbERBLElBQUlBLGVBQWVBLEdBQUdBLElBQUlBLENBQUNBO2lCQUUzQkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLE1BQU1BLENBQUNBLGVBQWVBLENBQUNBLElBQUlBLE1BQU1BLENBQUNBLGVBQWVBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBLENBQUNBO3FCQUMzRUEsa0NBQWtDQSxDQUFDQSxnQkFBZ0JBLENBQUNBLEdBQUdBLGlCQUFpQkEsQ0FBQ0E7cUJBQ3pFQSxnQkFBZ0JBLElBQUlBLE1BQU1BLENBQUNBLGVBQWVBLENBQUNBLFNBQVNBLENBQUNBLFNBQVNBLENBQUNBO2lCQUNqRUEsQ0FBQ0E7aUJBRURBLDRDQUE0Q0E7aUJBQzVDQSxJQUFJQSxvQkFBb0JBLEdBQUdBLE1BQU1BLENBQUNBLG9CQUFvQkEsQ0FBQ0E7aUJBQ3ZEQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0Esb0JBQW9CQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtxQkFDcENBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxvQkFBb0JBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBLENBQUNBO3lCQUMzQ0EsSUFBSUEscUJBQXFCQSxHQUNyQkEsZ0JBQWdCQSxDQUFDQSxhQUFhQSxHQUFHQSxvQkFBb0JBLENBQUNBLE1BQU1BLENBQUNBLEtBQUtBLENBQUNBLENBQUNBO3lCQUN4RUEsZUFBZUEsR0FBR0Esb0JBQW9CQSxDQUFDQSxXQUFXQSxDQUFDQSxxQkFBcUJBLENBQUNBLENBQUNBO3FCQUM1RUEsQ0FBQ0E7cUJBQUNBLElBQUlBLENBQUNBLENBQUNBO3lCQUNOQSxlQUFlQSxHQUFHQSxvQkFBb0JBLENBQUNBLFdBQVdBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO3lCQUN6REEsb0JBQW9CQSxDQUFDQSxJQUFJQSxDQUFDQSxlQUFlQSxDQUFDQSxDQUFDQTtxQkFDN0NBLENBQUNBO2lCQUNIQSxDQUFDQTtpQkFDREEsZ0JBQWdCQSxDQUFDQSxpQkFBaUJBLENBQUNBLEdBQUdBLGVBQWVBLENBQUNBO2lCQUV0REEsY0FBY0E7aUJBQ2RBLElBQUlBLEVBQUVBLEdBQUdBLElBQUlBLHlCQUFXQSxDQUFDQSxXQUFXQSxDQUFDQSxHQUFHQSxFQUFFQSxpQkFBaUJBLEVBQUVBLFFBQVFBLENBQUNBLENBQUNBO2lCQUN2RUEsV0FBV0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxHQUFHQSxFQUFFQSxDQUFDQTtpQkFFdkNBLGtCQUFrQkE7aUJBQ2xCQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsZUFBZUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7cUJBQy9CQSxJQUFJQSxXQUFXQSxHQUFHQSxnQkFBU0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsZUFBZUEsQ0FBQ0E7eUJBQ3pCQSxNQUFNQSxDQUFDQSxlQUFlQSxDQUFDQSxJQUFJQSxLQUFLQSxVQUFVQSxDQUFDQSxRQUFRQSxDQUFDQSxRQUFRQTt5QkFDaEVBLElBQUlBLDJCQUFZQSxDQUFDQSxFQUFFQSxDQUFDQTt5QkFDcEJBLElBQUlBLENBQUNBO3FCQUMzQkEsZUFBZUEsQ0FBQ0EsaUJBQWlCQSxDQUFDQTt5QkFDOUJBLElBQUlBLEdBQUdBLENBQUNBLGVBQWVBLENBQUNBLFdBQVdBLEVBQUVBLFdBQVdBLEVBQUVBLEVBQUVBLEVBQUVBLFdBQVdBLENBQUNBLENBQUNBO2lCQUN6RUEsQ0FBQ0E7YUFDSEEsQ0FBQ0E7YUFDREEsV0FBV0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EscUJBQXFCQSxDQUFDQSxXQUFXQSxDQUFDQSxFQUFFQSxnQkFBZ0JBLEVBQzlEQSxvQkFBb0JBLEVBQUVBLGVBQWVBLEVBQUVBLEtBQUtBLEVBQUVBLFdBQVdBLEVBQUVBLGNBQWNBLENBQUNBLENBQUNBO2FBQzVGQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsVUFBVUEsQ0FBQ0EsSUFBSUEsU0FBU0EsQ0FBQ0EsSUFBSUEsS0FBS0EsVUFBVUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQzlFQSxVQUFVQSxDQUFDQSxjQUFjQSxDQUFDQSxZQUFZQSxDQUFDQSxXQUFXQSxDQUFDQSxjQUFjQSxDQUFDQSxDQUFDQTthQUNyRUEsQ0FBQ0E7YUFDREEsYUFBYUEsSUFBSUEsU0FBU0EsQ0FBQ0EsY0FBY0EsQ0FBQ0EsTUFBTUEsQ0FBQ0E7YUFDakRBLFVBQVVBLElBQUlBLFNBQVNBLENBQUNBLGdCQUFnQkEsQ0FBQ0E7U0FDM0NBLENBQUNBO1NBQ0RBLE1BQU1BLENBQUNBLEtBQUtBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO0tBQ2xCQSxDQUFDQTtLQUVESCxpREFBbUJBLEdBQW5CQSxVQUFvQkEsUUFBNEJBLEVBQUVBLFFBQWtCQTtTQUNsRUksSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsUUFBUUEsRUFBRUEsUUFBUUEsRUFBRUEsSUFBSUEsRUFBRUEsSUFBSUEsTUFBTUEsRUFBRUEsRUFBRUEsSUFBSUEsQ0FBQ0EsQ0FBQ0E7S0FDbEVBLENBQUNBO0tBRURKLGlFQUFpRUE7S0FDakVBLG1EQUFxQkEsR0FBckJBLFVBQXNCQSxVQUE4QkEsRUFBRUEsaUJBQXlCQSxFQUN6REEsV0FBK0JBLEVBQUVBLHdCQUFnQ0EsRUFDakVBLEtBQWFBLEVBQUVBLElBQXdCQTtTQUMzREssRUFBRUEsQ0FBQ0EsQ0FBQ0EsY0FBT0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDekJBLFdBQVdBLEdBQUdBLFVBQVVBLENBQUNBO2FBQ3pCQSx3QkFBd0JBLEdBQUdBLGlCQUFpQkEsQ0FBQ0E7U0FDL0NBLENBQUNBO1NBQ0RBLFVBQVVBLENBQUNBLGNBQWNBLENBQUNBLGVBQWVBLENBQUNBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLENBQUNBO1NBQy9EQSxJQUFJQSxhQUFhQSxHQUFHQSxVQUFVQSxDQUFDQSxjQUFjQSxDQUFDQSxpQkFBaUJBLENBQUNBLENBQUNBO1NBQ2pFQSxFQUFFQSxDQUFDQSxDQUFDQSxjQUFPQSxDQUFDQSxhQUFhQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUMzQkEsYUFBYUEsR0FBR0EsSUFBSUEsVUFBVUEsQ0FBQ0EsZ0JBQWdCQSxFQUFFQSxDQUFDQTthQUNsREEsVUFBVUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxHQUFHQSxhQUFhQSxDQUFDQTtTQUMvREEsQ0FBQ0E7U0FDREEsd0JBQVdBLENBQUNBLE1BQU1BLENBQUNBLGFBQWFBLENBQUNBLEtBQUtBLEVBQUVBLEtBQUtBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBO1NBQ3JEQSxJQUFJQSxlQUFlQSxHQUFHQSxXQUFXQSxDQUFDQSxnQkFBZ0JBLENBQUNBLHdCQUF3QkEsQ0FBQ0EsQ0FBQ0E7U0FFN0VBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLG9CQUFvQkEsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsRUFBRUEsQ0FBQ0E7YUFDL0RBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxlQUFlQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDdENBLElBQUlBLENBQUNBLG9CQUFvQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0E7YUFDNURBLENBQUNBO1NBQ0hBLENBQUNBO1NBQ0RBLGVBQWVBLENBQUNBLDRCQUE0QkEsRUFBRUEsQ0FBQ0E7S0FDakRBLENBQUNBO0tBRURMLG1EQUFxQkEsR0FBckJBLFVBQXNCQSxVQUE4QkEsRUFBRUEsaUJBQXlCQSxFQUFFQSxLQUFhQTtTQUM1Rk0sSUFBSUEsYUFBYUEsR0FBR0EsVUFBVUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxDQUFDQTtTQUNqRUEsSUFBSUEsSUFBSUEsR0FBR0EsYUFBYUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7U0FFdENBLFVBQVVBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxDQUFDQSw0QkFBNEJBLEVBQUVBLENBQUNBO1NBRTlFQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQTtTQUM3QkEsd0JBQVdBLENBQUNBLFFBQVFBLENBQUNBLGFBQWFBLENBQUNBLEtBQUtBLEVBQUVBLEtBQUtBLENBQUNBLENBQUNBO1NBQ2pEQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxvQkFBb0JBLENBQUNBLE1BQU1BLEVBQUVBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBO2FBQzFEQSxJQUFJQSxHQUFHQSxHQUFHQSxJQUFJQSxDQUFDQSxvQkFBb0JBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQ3ZDQSxHQUFHQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQTtTQUNmQSxDQUFDQTtLQUNIQSxDQUFDQTtLQUdETixvREFBc0JBLEdBQXRCQSxVQUF1QkEsVUFBOEJBLEVBQUVBLGlCQUF5QkEsRUFDekRBLFdBQStCQSxFQUFFQSx3QkFBZ0NBLEVBQ2pFQSxLQUFhQSxFQUFFQSw0QkFBZ0RBO1NBQ3BGTyxFQUFFQSxDQUFDQSxDQUFDQSxjQUFPQSxDQUFDQSxXQUFXQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUN6QkEsV0FBV0EsR0FBR0EsVUFBVUEsQ0FBQ0E7YUFDekJBLHdCQUF3QkEsR0FBR0EsaUJBQWlCQSxDQUFDQTtTQUMvQ0EsQ0FBQ0E7U0FDREEsSUFBSUEsYUFBYUEsR0FBR0EsVUFBVUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxDQUFDQTtTQUNqRUEsSUFBSUEsSUFBSUEsR0FBR0EsYUFBYUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7U0FDdENBLElBQUlBLGVBQWVBLEdBQUdBLFdBQVdBLENBQUNBLGdCQUFnQkEsQ0FBQ0Esd0JBQXdCQSxDQUFDQSxDQUFDQTtTQUU3RUEsSUFBSUEsUUFBUUEsR0FBR0EsZ0JBQVNBLENBQUNBLDRCQUE0QkEsQ0FBQ0E7YUFDbkNBLGFBQVFBLENBQUNBLHFCQUFxQkEsQ0FBQ0EsNEJBQTRCQSxDQUFDQTthQUM1REEsSUFBSUEsQ0FBQ0E7U0FDeEJBLElBQUlBLENBQUNBLFlBQVlBLENBQUNBLElBQUlBLEVBQUVBLFFBQVFBLEVBQUVBLGVBQWVBLENBQUNBLE9BQU9BLEVBQUVBLEVBQUVBLFdBQVdBLENBQUNBLE9BQU9BLEVBQzlEQSxXQUFXQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQTtLQUN4Q0EsQ0FBQ0E7S0FFRFAsZ0JBQWdCQTtLQUNoQkEsMENBQVlBLEdBQVpBLFVBQWFBLFFBQTRCQSxFQUFFQSwyQkFBcUNBLEVBQ25FQSxtQkFBd0NBLEVBQUVBLE9BQWVBLEVBQUVBLFlBQW9CQTtTQUMxRlEsSUFBSUEsT0FBT0EsR0FBR0EsUUFBUUEsQ0FBQ0EsVUFBVUEsQ0FBQ0E7U0FDbENBLElBQUlBLGFBQWFBLEdBQUdBLE9BQU9BLEdBQUdBLFFBQVFBLENBQUNBLEtBQUtBLENBQUNBLFNBQVNBLENBQUNBLFNBQVNBLEdBQUdBLENBQUNBLENBQUNBO1NBQ3JFQSxPQUFPQSxPQUFPQSxJQUFJQSxhQUFhQSxFQUFFQSxDQUFDQTthQUNoQ0EsSUFBSUEsUUFBUUEsR0FBR0EsUUFBUUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0E7YUFDdkNBLElBQUlBLGFBQWFBLEdBQUdBLFFBQVFBLENBQUNBLEtBQUtBLENBQUNBO2FBQ25DQSxFQUFFQSxDQUFDQSxDQUFDQSxRQUFRQSxLQUFLQSxRQUFRQSxJQUFJQSxRQUFRQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxLQUFLQSxVQUFVQSxDQUFDQSxRQUFRQSxDQUFDQSxRQUFRQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDbEZBLHVEQUF1REE7aUJBQ3ZEQSxPQUFPQSxJQUFJQSxRQUFRQSxDQUFDQSxLQUFLQSxDQUFDQSxTQUFTQSxDQUFDQSxTQUFTQSxDQUFDQTthQUNoREEsQ0FBQ0E7YUFBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7aUJBQ05BLEVBQUVBLENBQUNBLENBQUNBLFFBQVFBLEtBQUtBLFFBQVFBLENBQUNBLENBQUNBLENBQUNBO3FCQUMxQkEsa0NBQWtDQTtxQkFDbENBLDJCQUEyQkEsR0FBR0EsSUFBSUEsQ0FBQ0E7cUJBQ25DQSxZQUFZQSxHQUFHQSxJQUFJQSxDQUFDQTtxQkFDcEJBLG1CQUFtQkEsR0FBR0EsUUFBUUEsQ0FBQ0Esd0JBQXdCQSxDQUFDQTtxQkFDeERBLE9BQU9BLEdBQUdBLG1CQUFtQkEsQ0FBQ0EsWUFBWUEsRUFBRUEsQ0FBQ0E7aUJBQy9DQSxDQUFDQTtpQkFDREEsUUFBUUEsQ0FBQ0EsT0FBT0EsR0FBR0EsT0FBT0EsQ0FBQ0E7aUJBQzNCQSxRQUFRQSxDQUFDQSxNQUFNQSxDQUFDQSxNQUFNQSxHQUFHQSxZQUFZQSxDQUFDQTtpQkFDdENBLElBQUlBLE9BQU9BLEdBQUdBLGFBQWFBLENBQUNBLGNBQWNBLENBQUNBO2lCQUMzQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsU0FBU0EsR0FBR0EsQ0FBQ0EsRUFBRUEsU0FBU0EsR0FBR0EsT0FBT0EsQ0FBQ0EsTUFBTUEsRUFBRUEsU0FBU0EsRUFBRUEsRUFBRUEsQ0FBQ0E7cUJBQ2hFQSxJQUFJQSxpQkFBaUJBLEdBQUdBLFNBQVNBLEdBQUdBLFFBQVFBLENBQUNBLGFBQWFBLENBQUNBO3FCQUMzREEsSUFBSUEsZUFBZUEsR0FBR0EsUUFBUUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxpQkFBaUJBLENBQUNBLENBQUNBO3FCQUVuRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLGVBQWVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO3lCQUMvQkEsZUFBZUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsMkJBQTJCQSxFQUFFQSxtQkFBbUJBLEVBQ2hEQSxRQUFRQSxDQUFDQSxlQUFlQSxDQUFDQSxpQkFBaUJBLENBQUNBLENBQUNBLENBQUNBO3lCQUNyRUEsSUFBSUEsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxRQUFRQSxFQUFFQSxlQUFlQSxFQUFFQSxpQkFBaUJBLENBQUNBLENBQUNBO3lCQUN2RUEsSUFBSUEsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxRQUFRQSxFQUFFQSxlQUFlQSxFQUFFQSxpQkFBaUJBLENBQUNBLENBQUNBO3FCQUN6RUEsQ0FBQ0E7aUJBQ0hBLENBQUNBO2lCQUNEQSxJQUFJQSxLQUFLQSxHQUFHQSxnQkFBU0EsQ0FBQ0EsbUJBQW1CQSxDQUFDQTtxQkFDMUJBLElBQUlBLGFBQUtBLENBQUNBLFFBQVFBLENBQUNBLEtBQUtBLENBQUNBLEtBQUtBLEVBQUVBLG1CQUFtQkEsQ0FBQ0EsV0FBV0EsRUFBRUEsQ0FBQ0E7cUJBQ2xFQSxJQUFJQSxDQUFDQTtpQkFDckJBLFFBQVFBLENBQUNBLGNBQWNBLENBQUNBLE9BQU9BLENBQUNBLFFBQVFBLENBQUNBLE9BQU9BLEVBQUVBLFFBQVFBLENBQUNBLE1BQU1BLEVBQUVBLFFBQVFBLEVBQUVBLEtBQUtBLENBQUNBLENBQUNBO2lCQUNwRkEsT0FBT0EsRUFBRUEsQ0FBQ0E7YUFDWkEsQ0FBQ0E7U0FDSEEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFRFIsZ0JBQWdCQTtLQUNoQkEsaURBQW1CQSxHQUFuQkEsVUFBb0JBLElBQXdCQSxFQUFFQSxlQUFvQ0EsRUFDOURBLGVBQXVCQTtTQUN6Q1MsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLGVBQWVBLENBQUNBLDRCQUE0QkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDOURBLGVBQWVBLENBQUNBLDRCQUE0QkEsRUFBRUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsVUFBQ0EsY0FBY0EsRUFBRUEsSUFBSUE7aUJBQzFFQSxFQUFFQSxDQUFDQSxDQUFDQSxjQUFPQSxDQUFDQSxjQUFjQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtxQkFDNUJBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLEdBQUdBLENBQUNBLElBQUlBLEVBQUVBLElBQUlBLENBQUNBLFdBQVdBLENBQUNBLGVBQWVBLENBQUNBLENBQUNBLGFBQWFBLENBQUNBLENBQUNBO2lCQUN6RUEsQ0FBQ0E7aUJBQUNBLElBQUlBLENBQUNBLENBQUNBO3FCQUNOQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxHQUFHQSxDQUFDQSxJQUFJQSxFQUFFQSxlQUFlQSxDQUFDQSxtQkFBbUJBLENBQUNBLGNBQWNBLENBQUNBLENBQUNBLENBQUNBO2lCQUM3RUEsQ0FBQ0E7YUFDSEEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7U0FDTEEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFRFQsZ0JBQWdCQTtLQUNoQkEsaURBQW1CQSxHQUFuQkEsVUFBb0JBLElBQXdCQSxFQUFFQSxlQUFvQ0EsRUFDOURBLGlCQUF5QkE7U0FDM0NVLElBQUlBLFFBQVFBLEdBQUdBLGVBQWVBLENBQUNBLHdCQUF3QkEsRUFBRUEsQ0FBQ0E7U0FDMURBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLGNBQWNBLEdBQUdBLENBQUNBLEVBQUVBLGNBQWNBLEdBQUdBLFFBQVFBLENBQUNBLE1BQU1BLEVBQUVBLEVBQUVBLGNBQWNBLEVBQUVBLENBQUNBO2FBQ2hGQSxJQUFJQSxpQkFBaUJBLEdBQUdBLFFBQVFBLENBQUNBLGNBQWNBLENBQUNBLENBQUNBO2FBQ2pEQSxJQUFJQSxTQUFTQSxHQUFHQSxlQUFlQSxDQUFDQSxtQkFBbUJBLENBQUNBLGNBQWNBLENBQUNBLENBQUNBO2FBRXBFQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxVQUFVQSxHQUFHQSxDQUFDQSxFQUFFQSxVQUFVQSxHQUFHQSxpQkFBaUJBLENBQUNBLE1BQU1BLEVBQUVBLEVBQUVBLFVBQVVBLEVBQUVBLENBQUNBO2lCQUM3RUEsSUFBSUEsb0JBQW9CQSxHQUFHQSxpQkFBaUJBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBO2lCQUN6REEsb0JBQW9CQSxDQUFDQSxTQUFTQSxDQUFDQSxJQUFJQSxFQUFFQSxpQkFBaUJBLEVBQUVBLFNBQVNBLENBQUNBLENBQUNBO2FBQ3JFQSxDQUFDQTtTQUNIQSxDQUFDQTtLQUNIQSxDQUFDQTtLQUVEViwyQ0FBYUEsR0FBYkEsVUFBY0EsUUFBNEJBO1NBQ3hDVyxJQUFJQSxhQUFhQSxHQUFHQSxRQUFRQSxDQUFDQSxVQUFVQSxHQUFHQSxRQUFRQSxDQUFDQSxLQUFLQSxDQUFDQSxTQUFTQSxDQUFDQSxTQUFTQSxHQUFHQSxDQUFDQSxDQUFDQTtTQUNqRkEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsT0FBT0EsR0FBR0EsUUFBUUEsQ0FBQ0EsVUFBVUEsRUFBRUEsT0FBT0EsSUFBSUEsYUFBYUEsRUFBRUEsT0FBT0EsRUFBRUEsRUFBRUEsQ0FBQ0E7YUFDNUVBLElBQUlBLFFBQVFBLEdBQUdBLFFBQVFBLENBQUNBLEtBQUtBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBO2FBQ3ZDQSxFQUFFQSxDQUFDQSxDQUFDQSxRQUFRQSxDQUFDQSxRQUFRQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDeEJBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxRQUFRQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtxQkFDL0JBLFFBQVFBLENBQUNBLE1BQU1BLENBQUNBLFdBQVdBLEVBQUVBLENBQUNBO2lCQUNoQ0EsQ0FBQ0E7aUJBQ0RBLFFBQVFBLENBQUNBLE9BQU9BLEdBQUdBLElBQUlBLENBQUNBO2lCQUN4QkEsUUFBUUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0E7aUJBQ3BDQSxJQUFJQSxPQUFPQSxHQUFHQSxRQUFRQSxDQUFDQSxLQUFLQSxDQUFDQSxjQUFjQSxDQUFDQTtpQkFDNUNBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLFNBQVNBLEdBQUdBLENBQUNBLEVBQUVBLFNBQVNBLEdBQUdBLE9BQU9BLENBQUNBLE1BQU1BLEVBQUVBLFNBQVNBLEVBQUVBLEVBQUVBLENBQUNBO3FCQUNoRUEsSUFBSUEsR0FBR0EsR0FBR0EsUUFBUUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxRQUFRQSxDQUFDQSxhQUFhQSxHQUFHQSxTQUFTQSxDQUFDQSxDQUFDQTtxQkFDeEVBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTt5QkFDbkJBLEdBQUdBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBO3FCQUNsQkEsQ0FBQ0E7aUJBQ0hBLENBQUNBO2FBQ0hBLENBQUNBO1NBQ0hBLENBQUNBO0tBQ0hBLENBQUNBO0tBNVBIWDtTQUFDQSxlQUFVQSxFQUFFQTs7NkJBNlBaQTtLQUFEQSwwQkFBQ0E7QUFBREEsRUFBQ0EsSUFBQTtBQTVQWSw0QkFBbUIsc0JBNFAvQjs7Ozs7Ozs7Ozs7O0FDelFELHdDQUEyQyxFQUFnQyxDQUFDO0FBSTVFOzs7Ozs7Ozs7SUFTRztBQUNIO0tBQUFZO0tBdUNBQyxDQUFDQTtLQUhDRCxzQkFBSUEscUNBQWFBO1NBbkJqQkE7Ozs7Ozs7Ozs7Ozs7Ozs7OztZQWtCR0E7Y0FDSEEsY0FBMkJFLE1BQU1BLENBQUNBLDBCQUFhQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQTs7O1FBQUFGOztLQUVwREEsc0JBQUlBLGtDQUFVQTtjQUFkQSxjQUFrQ0csTUFBTUEsQ0FBQ0EsMEJBQWFBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBOzs7UUFBQUg7S0FDN0RBLGlCQUFDQTtBQUFEQSxFQUFDQSxJQUFBO0FBdkNxQixtQkFBVSxhQXVDL0I7QUFFRDtLQUFpQ0ksK0JBQVVBO0tBQ3pDQSxxQkFBbUJBLFVBQW1CQTtTQUUxQkE7Ozs7WUFJR0E7U0FDSUEsaUJBQXlCQSxFQUFVQSxTQUFtQkE7U0FDdkVDLGlCQUFPQSxDQUFDQTtTQVJTQSxlQUFVQSxHQUFWQSxVQUFVQSxDQUFTQTtTQU9uQkEsc0JBQWlCQSxHQUFqQkEsaUJBQWlCQSxDQUFRQTtTQUFVQSxjQUFTQSxHQUFUQSxTQUFTQSxDQUFVQTtLQUV6RUEsQ0FBQ0E7S0FFREQsc0JBQUlBLG1DQUFVQTtjQUFkQSxjQUFrQ0UsTUFBTUEsQ0FBWUEsSUFBSUEsQ0FBQ0EsVUFBV0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7Y0FDOUVGLFVBQWVBLEtBQUtBLElBQUlFLDBCQUFhQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQTs7O1FBRG9DRjtLQUU5RUEsc0JBQUlBLHNDQUFhQTtjQUFqQkEsY0FBMkJHLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLG9CQUFvQkEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7OztRQUFBSDtLQUNoRkEsa0JBQUNBO0FBQURBLEVBQUNBLEVBZmdDLFVBQVUsRUFlMUM7QUFmWSxvQkFBVyxjQWV2Qjs7Ozs7Ozs7Ozs7O0FDdEVELHNDQUF5QyxFQUFZLENBQUM7QUFJdEQ7Ozs7Ozs7Ozs7O0lBV0c7QUFDSDtLQUFBSTtLQW1CQUMsQ0FBQ0E7S0FBREQsa0JBQUNBO0FBQURBLEVBQUNBLElBQUE7QUFuQnFCLG9CQUFXLGNBbUJoQztBQUVEO0tBQWtDRSxnQ0FBV0E7S0FDM0NBLHNCQUFZQSxVQUFzQkE7U0FDaENDLGlCQUFPQSxDQUFDQTtTQUNSQSxJQUFJQSxDQUFDQSxVQUFVQSxHQUFHQSxVQUFVQSxDQUFDQTtLQUMvQkEsQ0FBQ0E7S0FFT0Qsb0NBQWFBLEdBQXJCQTtTQUNFRSxJQUFJQSxVQUFVQSxHQUFnQkEsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0E7U0FDOUNBLElBQUlBLFVBQVVBLEdBQUdBLHVCQUFZQSxDQUFDQSxVQUFVQSxDQUFDQSxVQUFVQSxDQUFDQSxDQUFDQTtTQUNyREEsTUFBTUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsY0FBY0EsQ0FBQ0EsVUFBVUEsQ0FBQ0EsaUJBQWlCQSxHQUFHQSxVQUFVQSxDQUFDQSxhQUFhQSxDQUFDQTtjQUMxRkEsZUFBZUEsQ0FBQ0E7S0FDdkJBLENBQUNBO0tBTURGLHNCQUFJQSxzQ0FBWUE7U0FKaEJBOzs7WUFHR0E7Y0FDSEEsY0FBbUNHLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLGFBQWFBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBOzs7UUFBQUg7S0FFckVBLCtCQUFRQSxHQUFSQSxVQUFTQSxJQUFZQTtTQUNuQkksTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsYUFBYUEsRUFBRUEsQ0FBQ0Esd0JBQXdCQSxDQUFDQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtLQUNqRUEsQ0FBQ0E7S0FDSEosbUJBQUNBO0FBQURBLEVBQUNBLEVBdEJpQyxXQUFXLEVBc0I1QztBQXRCWSxxQkFBWSxlQXNCeEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMzREQsZ0NBQThDLENBQXNCLENBQUM7QUFFckUsa0NBQTZDLENBQTBCLENBQUM7QUFDeEUsd0NBQThCLEVBQWdDLENBQUM7QUFJbEQsK0JBQXNCLEdBQUcsaUJBQVUsQ0FBQyxJQUFJLGdCQUFXLENBQUMsOEJBQThCLENBQUMsQ0FBQyxDQUFDO0FBRWxHO0tBT0VLLHFCQUE0Q0Esd0JBQXdCQTtTQUhwRUMsZ0JBQWdCQTtTQUNoQkEsNkJBQXdCQSxHQUFHQSxJQUFJQSxnQkFBR0EsRUFBc0RBLENBQUNBO1NBR3ZGQSxJQUFJQSxDQUFDQSx5QkFBeUJBLEdBQUdBLHdCQUF3QkEsQ0FBQ0E7S0FDNURBLENBQUNBO0tBRURELDZCQUFPQSxHQUFQQSxVQUFRQSxTQUFrQ0E7U0FDeENFLElBQUlBLFdBQVdBLEdBQUdBLElBQUlBLENBQUNBLHdCQUF3QkEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0E7U0FDL0RBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxXQUFXQSxDQUFDQSxJQUFJQSxXQUFXQSxDQUFDQSxNQUFNQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNyREEsTUFBTUEsQ0FBQ0EsV0FBV0EsQ0FBQ0EsR0FBR0EsRUFBRUEsQ0FBQ0E7U0FDM0JBLENBQUNBO1NBQ0RBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBO0tBQ2RBLENBQUNBO0tBRURGLGdDQUFVQSxHQUFWQSxVQUFXQSxJQUF3QkE7U0FDakNHLElBQUlBLFNBQVNBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBO1NBQzNCQSxJQUFJQSxXQUFXQSxHQUFHQSxJQUFJQSxDQUFDQSx3QkFBd0JBLENBQUNBLEdBQUdBLENBQUNBLFNBQVNBLENBQUNBLENBQUNBO1NBQy9EQSxFQUFFQSxDQUFDQSxDQUFDQSxjQUFPQSxDQUFDQSxXQUFXQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUN6QkEsV0FBV0EsR0FBR0EsRUFBRUEsQ0FBQ0E7YUFDakJBLElBQUlBLENBQUNBLHdCQUF3QkEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsU0FBU0EsRUFBRUEsV0FBV0EsQ0FBQ0EsQ0FBQ0E7U0FDNURBLENBQUNBO1NBQ0RBLElBQUlBLHFCQUFxQkEsR0FBR0EsV0FBV0EsQ0FBQ0EsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EseUJBQXlCQSxDQUFDQTtTQUNoRkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EscUJBQXFCQSxDQUFDQSxDQUFDQSxDQUFDQTthQUMxQkEsV0FBV0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7U0FDekJBLENBQUNBO1NBQ0RBLE1BQU1BLENBQUNBLHFCQUFxQkEsQ0FBQ0E7S0FDL0JBLENBQUNBO0tBL0JISDtTQUFDQSxlQUFVQSxFQUFFQTtTQU9DQSxXQUFDQSxXQUFNQSxDQUFDQSw4QkFBc0JBLENBQUNBOztxQkF5QjVDQTtLQUFEQSxrQkFBQ0E7QUFBREEsRUFBQ0EsSUFBQTtBQS9CWSxvQkFBVyxjQStCdkI7Ozs7Ozs7Ozs7Ozs7Ozs7QUN6Q0QsZ0NBQXlCLENBQXNCLENBQUM7QUFHaEQ7O0lBRUc7QUFDSDtLQUFBSTtLQUlBQyxDQUFDQTtLQUZDRCx1Q0FBYUEsR0FBYkEsVUFBY0EsSUFBd0JBLElBQUdFLENBQUNBO0tBQzFDRix5Q0FBZUEsR0FBZkEsVUFBZ0JBLElBQXdCQSxJQUFHRyxDQUFDQTtLQUg5Q0g7U0FBQ0EsZUFBVUEsRUFBRUE7O3lCQUlaQTtLQUFEQSxzQkFBQ0E7QUFBREEsRUFBQ0EsSUFBQTtBQUhZLHdCQUFlLGtCQUczQjs7Ozs7Ozs7Ozs7O0FDVkQsd0NBQTBCLEVBQWdDLENBQUM7QUFDM0Qsd0NBQTRCLEVBQWdDLENBQUM7QUFFN0Qsa0NBQWlDLENBQTBCLENBQUM7QUFPNUQsc0NBQStELEVBQVksQ0FBQztBQUU1RTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQW1CRztBQUNIO0tBQUFJO0tBaUZBQyxDQUFDQTtLQTFFQ0Q7O1FBRUdBO0tBQ0hBLGdDQUFLQSxHQUFMQTtTQUNFRSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxNQUFNQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxFQUFFQSxDQUFDQTthQUMxQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7U0FDakJBLENBQUNBO0tBQ0hBLENBQUNBO0tBVURGLHNCQUFJQSxvQ0FBTUE7U0FIVkE7O1lBRUdBO2NBQ0hBLGNBQXVCRyxNQUFNQSxDQUFDQSwwQkFBYUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7OztRQUFBSDs7S0F5RGxEQSx1QkFBQ0E7QUFBREEsRUFBQ0EsSUFBQTtBQWpGcUIseUJBQWdCLG1CQWlGckM7QUFFRDtLQUF1Q0kscUNBQWdCQTtLQUNyREEsMkJBQW1CQSxXQUFxQ0EsRUFBRUEsT0FBbUJBO1NBQzNFQyxpQkFBT0EsQ0FBQ0E7U0FEU0EsZ0JBQVdBLEdBQVhBLFdBQVdBLENBQTBCQTtTQUV0REEsSUFBSUEsQ0FBQ0EsT0FBT0EsR0FBR0EsT0FBT0EsQ0FBQ0E7S0FDekJBLENBQUNBO0tBRU9ELHFDQUFTQSxHQUFqQkE7U0FDRUUsSUFBSUEsT0FBT0EsR0FBZ0JBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBO1NBQ3hDQSxJQUFJQSxFQUFFQSxHQUFHQSx1QkFBWUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsVUFBVUEsQ0FBQ0EsQ0FBQ0EsY0FBY0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxDQUFDQTtTQUNwRkEsTUFBTUEsQ0FBQ0EsZ0JBQVNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLENBQUNBLEtBQUtBLEdBQUdBLEVBQUVBLENBQUNBO0tBQ3ZDQSxDQUFDQTtLQUVERiwrQkFBR0EsR0FBSEEsVUFBSUEsS0FBYUEsSUFBYUcsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDbkVILHNCQUFJQSxxQ0FBTUE7Y0FBVkEsY0FBdUJJLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBOzs7UUFBQUo7S0FFeERBLHVFQUF1RUE7S0FDdkVBLHdCQUF3QkE7S0FDeEJBLDhDQUFrQkEsR0FBbEJBLFVBQW1CQSxXQUF3QkEsRUFBRUEsS0FBa0JBO1NBQWxCSyxxQkFBa0JBLEdBQWxCQSxTQUFpQkEsQ0FBQ0E7U0FDN0RBLEVBQUVBLENBQUNBLENBQUNBLEtBQUtBLElBQUlBLENBQUNBLENBQUNBLENBQUNBO2FBQUNBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBO1NBQ3JDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxXQUFXQSxDQUFDQSw2QkFBNkJBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLEVBQUVBLEtBQUtBLEVBQUVBLFdBQVdBLENBQUNBLENBQUNBO0tBQzFGQSxDQUFDQTtLQUVETCwwQ0FBY0EsR0FBZEEsVUFBZUEsWUFBaUNBLEVBQUVBLEtBQWtCQSxFQUNyREEsMkJBQXNEQTtTQUR0RE0sNEJBQWlDQSxHQUFqQ0EsbUJBQWlDQTtTQUFFQSxxQkFBa0JBLEdBQWxCQSxTQUFpQkEsQ0FBQ0E7U0FDckRBLDJDQUFzREEsR0FBdERBLGtDQUFzREE7U0FDbkVBLEVBQUVBLENBQUNBLENBQUNBLEtBQUtBLElBQUlBLENBQUNBLENBQUNBLENBQUNBO2FBQUNBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBO1NBQ3JDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxXQUFXQSxDQUFDQSx5QkFBeUJBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLEVBQUVBLEtBQUtBLEVBQUVBLFlBQVlBLEVBQ2pDQSwyQkFBMkJBLENBQUNBLENBQUNBO0tBQ2pGQSxDQUFDQTtLQUVETiw0Q0FBNENBO0tBQzVDQSxrQ0FBTUEsR0FBTkEsVUFBT0EsT0FBZ0JBLEVBQUVBLEtBQWtCQTtTQUFsQk8scUJBQWtCQSxHQUFsQkEsU0FBaUJBLENBQUNBO1NBQ3pDQSxFQUFFQSxDQUFDQSxDQUFDQSxLQUFLQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQTthQUFDQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQTtTQUNyQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsV0FBV0EsQ0FBQ0EscUJBQXFCQSxDQUFDQSxJQUFJQSxDQUFDQSxPQUFPQSxFQUFFQSxLQUFLQSxFQUFFQSxPQUFPQSxDQUFDQSxDQUFDQTtLQUM5RUEsQ0FBQ0E7S0FFRFAsbUNBQU9BLEdBQVBBLFVBQVFBLE9BQWdCQTtTQUN0QlEsTUFBTUEsQ0FBQ0Esd0JBQVdBLENBQUNBLE9BQU9BLENBQUNBLElBQUlBLENBQUNBLFNBQVNBLEVBQUVBLEVBQUVBLHVCQUFZQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUN0RUEsQ0FBQ0E7S0FFRFIsNkJBQTZCQTtLQUM3QkEsa0NBQU1BLEdBQU5BLFVBQU9BLEtBQWtCQTtTQUFsQlMscUJBQWtCQSxHQUFsQkEsU0FBaUJBLENBQUNBO1NBQ3ZCQSxFQUFFQSxDQUFDQSxDQUFDQSxLQUFLQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQTthQUFDQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQSxNQUFNQSxHQUFHQSxDQUFDQSxDQUFDQTtTQUN6Q0EsSUFBSUEsQ0FBQ0EsV0FBV0EsQ0FBQ0Esc0JBQXNCQSxDQUFDQSxJQUFJQSxDQUFDQSxPQUFPQSxFQUFFQSxLQUFLQSxDQUFDQSxDQUFDQTtTQUM3REEsb0RBQW9EQTtLQUN0REEsQ0FBQ0E7S0FFRFQsNENBQTRDQTtLQUM1Q0Esa0NBQU1BLEdBQU5BLFVBQU9BLEtBQWtCQTtTQUFsQlUscUJBQWtCQSxHQUFsQkEsU0FBaUJBLENBQUNBO1NBQ3ZCQSxFQUFFQSxDQUFDQSxDQUFDQSxLQUFLQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQTthQUFDQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQSxNQUFNQSxHQUFHQSxDQUFDQSxDQUFDQTtTQUN6Q0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsV0FBV0EsQ0FBQ0EscUJBQXFCQSxDQUFDQSxJQUFJQSxDQUFDQSxPQUFPQSxFQUFFQSxLQUFLQSxDQUFDQSxDQUFDQTtLQUNyRUEsQ0FBQ0E7S0FDSFYsd0JBQUNBO0FBQURBLEVBQUNBLEVBbkRzQyxnQkFBZ0IsRUFtRHREO0FBbkRZLDBCQUFpQixvQkFtRDdCOzs7Ozs7O0FDdEtELGtDQUFtQixDQUEwQixDQUFDO0FBQzlDLHdDQUE2QixFQUFjLENBQUM7QUFFNUMsMkJBQWlDLFdBQTJCLEVBQUUsS0FBSztLQUNqRVcsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsS0FBS0EsWUFBWUEsV0FBSUEsQ0FBQ0EsQ0FBQ0E7U0FBQ0EsTUFBTUEsQ0FBQ0EsS0FBS0EsQ0FBQ0E7S0FFM0NBLElBQUlBLEtBQUtBLEdBQVNBLEtBQU1BLENBQUNBLFNBQVNBLENBQUNBO0tBRW5DQSxNQUFNQSxDQUFDQSxDQUFDQSxXQUFXQSxDQUFDQSxDQUFDQSxDQUFDQTtTQUNwQkEsS0FBS0EsMkJBQWNBLENBQUNBLGdCQUFnQkE7YUFDbENBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBLEtBQUtBLENBQUNBLGtCQUFrQkEsQ0FBQ0E7U0FDcENBLEtBQUtBLDJCQUFjQSxDQUFDQSxtQkFBbUJBO2FBQ3JDQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxLQUFLQSxDQUFDQSxxQkFBcUJBLENBQUNBO1NBQ3ZDQSxLQUFLQSwyQkFBY0EsQ0FBQ0EsYUFBYUE7YUFDL0JBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBLEtBQUtBLENBQUNBLGVBQWVBLENBQUNBO1NBQ2pDQSxLQUFLQSwyQkFBY0EsQ0FBQ0EsZ0JBQWdCQTthQUNsQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsS0FBS0EsQ0FBQ0Esa0JBQWtCQSxDQUFDQTtTQUNwQ0EsS0FBS0EsMkJBQWNBLENBQUNBLFNBQVNBO2FBQzNCQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxLQUFLQSxDQUFDQSxXQUFXQSxDQUFDQTtTQUM3QkEsS0FBS0EsMkJBQWNBLENBQUNBLE9BQU9BO2FBQ3pCQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxLQUFLQSxDQUFDQSxTQUFTQSxDQUFDQTtTQUMzQkEsS0FBS0EsMkJBQWNBLENBQUNBLFNBQVNBO2FBQzNCQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxLQUFLQSxDQUFDQSxXQUFXQSxDQUFDQTtTQUM3QkEsS0FBS0EsMkJBQWNBLENBQUNBLE1BQU1BO2FBQ3hCQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxLQUFLQSxDQUFDQSxRQUFRQSxDQUFDQTtTQUMxQkE7YUFDRUEsTUFBTUEsQ0FBQ0EsS0FBS0EsQ0FBQ0E7S0FDakJBLENBQUNBO0FBQ0hBLEVBQUNBO0FBekJlLHlCQUFnQixtQkF5Qi9COzs7Ozs7O0FDekJELFlBQVksY0FBYztLQUN4QkMsdURBQU1BO0tBQ05BLDZEQUFTQTtLQUNUQSx5REFBT0E7S0FDUEEsNkRBQVNBO0tBQ1RBLDJFQUFnQkE7S0FDaEJBLGlGQUFtQkE7S0FDbkJBLHFFQUFhQTtLQUNiQSwyRUFBZ0JBO0FBQ2xCQSxFQUFDQSxFQVRXLHNCQUFjLEtBQWQsc0JBQWMsUUFTekI7QUFURCxLQUFZLGNBQWMsR0FBZCxzQkFTWDtBQUVEOztJQUVHO0FBQ1EsK0JBQXNCLEdBQUc7S0FDbEMsY0FBYyxDQUFDLE1BQU07S0FDckIsY0FBYyxDQUFDLFNBQVM7S0FDeEIsY0FBYyxDQUFDLE9BQU87S0FDdEIsY0FBYyxDQUFDLFNBQVM7S0FDeEIsY0FBYyxDQUFDLGdCQUFnQjtLQUMvQixjQUFjLENBQUMsbUJBQW1CO0tBQ2xDLGNBQWMsQ0FBQyxhQUFhO0tBQzVCLGNBQWMsQ0FBQyxnQkFBZ0I7RUFDaEMsQ0FBQzs7Ozs7OztBQzFCRix3Q0FBc0MsRUFBZ0MsQ0FBQztBQUN2RSxrQ0FBZ0MsQ0FBMEIsQ0FBQztBQUMzRCxtQ0FBdUMsRUFBMkIsQ0FBQztBQUduRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUF1Qkc7QUFDSDtLQUFBQztTQUNVQyxhQUFRQSxHQUFhQSxFQUFFQSxDQUFDQTtTQUN4QkEsYUFBUUEsR0FBR0EsSUFBSUEsb0JBQVlBLEVBQUVBLENBQUNBO0tBc0N4Q0EsQ0FBQ0E7S0FwQ0NELHNCQUFJQSw4QkFBT0E7Y0FBWEEsY0FBaUNFLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLENBQUNBLENBQUNBOzs7UUFBQUY7S0FDeERBLHNCQUFJQSw2QkFBTUE7Y0FBVkEsY0FBdUJHLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBOzs7UUFBQUg7S0FDckRBLHNCQUFJQSw0QkFBS0E7Y0FBVEEsY0FBaUJJLE1BQU1BLENBQUNBLHdCQUFXQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxRQUFRQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTs7O1FBQUFKO0tBQzNEQSxzQkFBSUEsMkJBQUlBO2NBQVJBLGNBQWdCSyxNQUFNQSxDQUFDQSx3QkFBV0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7OztRQUFBTDtLQUV6REE7O1FBRUdBO0tBQ0hBLHVCQUFHQSxHQUFIQSxVQUFPQSxFQUFrQkEsSUFBU00sTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FFakVOOztRQUVHQTtLQUNIQSwwQkFBTUEsR0FBTkEsVUFBT0EsRUFBd0JBLElBQVNPLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLE1BQU1BLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO0tBRTFFUDs7UUFFR0E7S0FDSEEsMEJBQU1BLEdBQU5BLFVBQVVBLEVBQTBCQSxFQUFFQSxJQUFPQSxJQUFPUSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxRQUFRQSxDQUFDQSxNQUFNQSxDQUFDQSxFQUFFQSxFQUFFQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUU1RlI7O1FBRUdBO0tBQ0hBLDJCQUFPQSxHQUFQQSxjQUFpQlMsTUFBTUEsQ0FBQ0Esd0JBQVdBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO0tBRTNEVCxvQkFBQ0Esd0JBQWlCQSxFQUFFQSxDQUFDQSxHQUFyQkEsY0FBK0JVLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLHdCQUFpQkEsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FFN0VWLDRCQUFRQSxHQUFSQSxjQUFxQlcsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsUUFBUUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FFdkRYOztRQUVHQTtLQUNIQSx5QkFBS0EsR0FBTEEsVUFBTUEsR0FBUUEsSUFBVVksSUFBSUEsQ0FBQ0EsUUFBUUEsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FFOUNaLGdCQUFnQkE7S0FDaEJBLG1DQUFlQSxHQUFmQSxjQUEwQmEsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDdkRiLGdCQUFDQTtBQUFEQSxFQUFDQSxJQUFBO0FBeENZLGtCQUFTLFlBd0NyQjs7Ozs7OztBQ3JFWSwrQkFBc0IsR0FBRyxHQUFHLENBQUM7QUFFMUM7S0FDRWMscUJBQW1CQSxTQUFpQkEsRUFBU0EsU0FBaUJBLEVBQVNBLFVBQW1CQTtTQUF2RUMsY0FBU0EsR0FBVEEsU0FBU0EsQ0FBUUE7U0FBU0EsY0FBU0EsR0FBVEEsU0FBU0EsQ0FBUUE7U0FBU0EsZUFBVUEsR0FBVkEsVUFBVUEsQ0FBU0E7S0FBR0EsQ0FBQ0E7S0FFdkZELGlCQUFLQSxHQUFaQSxVQUFhQSxXQUFtQkE7U0FDOUJFLElBQUlBLFNBQVNBLEdBQUdBLFdBQVdBLEVBQUVBLFNBQVNBLEdBQUdBLFdBQVdBLEVBQUVBLFVBQVVBLEdBQUdBLEtBQUtBLENBQUNBO1NBQ3pFQSxJQUFJQSxZQUFZQSxHQUFHQSxXQUFXQSxDQUFDQSxPQUFPQSxDQUFDQSw4QkFBc0JBLENBQUNBLENBQUNBO1NBQy9EQSxFQUFFQSxDQUFDQSxDQUFDQSxZQUFZQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUN0QkEsc0NBQXNDQTthQUN0Q0EsU0FBU0EsR0FBR0EsV0FBV0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsWUFBWUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsRUFBRUEsQ0FBQ0E7YUFDMURBLFNBQVNBLEdBQUdBLFdBQVdBLENBQUNBLFNBQVNBLENBQUNBLFlBQVlBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLElBQUlBLEVBQUVBLENBQUNBO2FBQzNEQSxVQUFVQSxHQUFHQSxJQUFJQSxDQUFDQTtTQUNwQkEsQ0FBQ0E7U0FDREEsTUFBTUEsQ0FBQ0EsSUFBSUEsV0FBV0EsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsVUFBVUEsQ0FBQ0EsQ0FBQ0E7S0FDM0RBLENBQUNBO0tBRURGLGlDQUFXQSxHQUFYQTtTQUNFRyxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxVQUFVQSxHQUFHQSxLQUFHQSxJQUFJQSxDQUFDQSxTQUFTQSxHQUFHQSw4QkFBc0JBLEdBQUdBLElBQUlBLENBQUNBLFNBQVdBO2FBQzdEQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQTtLQUMxQ0EsQ0FBQ0E7S0FDSEgsa0JBQUNBO0FBQURBLEVBQUNBLElBQUE7QUFuQlksb0JBQVcsY0FtQnZCOzs7Ozs7Ozs7Ozs7Ozs7O0FDckJELGdDQUE0QyxDQUFzQixDQUFDO0FBQ25FLGtDQUFrRCxDQUEwQixDQUFDO0FBQzdFLHdDQUE0QixFQUFnQyxDQUFDO0FBQzdELHdDQUE0QyxFQUFnQyxDQUFDO0FBQzdFLHNDQVdPLENBQTRCLENBQUM7QUFDcEMsd0NBQXdCLEVBQXlDLENBQUM7QUFFbEUsK0JBQThCLElBQVM7S0FDckNJLE1BQU1BLENBQUNBLElBQUlBLFlBQVlBLDRCQUFpQkEsQ0FBQ0E7QUFDM0NBLEVBQUNBO0FBRUQ7Ozs7OztJQU1HO0FBQ0g7S0FBQUM7S0E4R0FDLENBQUNBO0tBNUdDRDs7UUFFR0E7S0FDSEEsbUNBQU9BLEdBQVBBLFVBQVFBLElBQVVBO1NBQ2hCRSxJQUFJQSxZQUFZQSxHQUFHQSxzQkFBU0EsQ0FBQ0EsV0FBV0EsQ0FBQ0Esc0JBQWlCQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQTtTQUNsRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLFlBQVlBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQzVCQSxJQUFJQSxRQUFRQSxHQUFHQSxZQUFZQSxDQUFDQSxJQUFJQSxDQUFDQSxvQkFBb0JBLENBQUNBLENBQUNBO2FBQ3ZEQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQ3hCQSxJQUFJQSxnQkFBZ0JBLEdBQUdBLHNCQUFTQSxDQUFDQSxZQUFZQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtpQkFDcERBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLDBCQUEwQkEsQ0FBQ0EsUUFBUUEsRUFBRUEsZ0JBQWdCQSxDQUFDQSxDQUFDQTthQUNyRUEsQ0FBQ0E7U0FDSEEsQ0FBQ0E7U0FFREEsTUFBTUEsSUFBSUEsMEJBQWFBLENBQUNBLHNDQUFvQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUdBLENBQUNBLENBQUNBO0tBQ2pGQSxDQUFDQTtLQUVPRixzREFBMEJBLEdBQWxDQSxVQUFtQ0EsRUFBcUJBLEVBQ3JCQSxnQkFBd0NBO1NBQ3pFRyxJQUFJQSxNQUFNQSxHQUFHQSxFQUFFQSxDQUFDQTtTQUNoQkEsSUFBSUEsT0FBT0EsR0FBR0EsRUFBRUEsQ0FBQ0E7U0FDakJBLElBQUlBLElBQUlBLEdBQTRCQSxFQUFFQSxDQUFDQTtTQUN2Q0EsSUFBSUEsT0FBT0EsR0FBeUJBLEVBQUVBLENBQUNBO1NBRXZDQSw2QkFBZ0JBLENBQUNBLE9BQU9BLENBQUNBLGdCQUFnQkEsRUFBRUEsVUFBQ0EsUUFBZUEsRUFBRUEsUUFBZ0JBO2FBQzNFQSxRQUFRQSxDQUFDQSxPQUFPQSxDQUFDQSxXQUFDQTtpQkFDaEJBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLFlBQVlBLHdCQUFhQSxDQUFDQSxDQUFDQSxDQUFDQTtxQkFDL0JBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxDQUFDQSxDQUFDQSxtQkFBbUJBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO3lCQUNyQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBSUEsUUFBUUEsVUFBS0EsQ0FBQ0EsQ0FBQ0EsbUJBQXFCQSxDQUFDQSxDQUFDQTtxQkFDdkRBLENBQUNBO3FCQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTt5QkFDTkEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0E7cUJBQ3hCQSxDQUFDQTtpQkFDSEEsQ0FBQ0E7aUJBRURBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLFlBQVlBLHlCQUFjQSxDQUFDQSxDQUFDQSxDQUFDQTtxQkFDaENBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxDQUFDQSxDQUFDQSxtQkFBbUJBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO3lCQUNyQ0EsT0FBT0EsQ0FBQ0EsSUFBSUEsQ0FBSUEsUUFBUUEsVUFBS0EsQ0FBQ0EsQ0FBQ0EsbUJBQXFCQSxDQUFDQSxDQUFDQTtxQkFDeERBLENBQUNBO3FCQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTt5QkFDTkEsT0FBT0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0E7cUJBQ3pCQSxDQUFDQTtpQkFDSEEsQ0FBQ0E7aUJBRURBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLFlBQVlBLDhCQUFtQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7cUJBQ3JDQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTt5QkFDbENBLElBQUlBLENBQUNBLE9BQUlBLENBQUNBLENBQUNBLGdCQUFnQkEsT0FBR0EsQ0FBQ0EsR0FBR0EsUUFBUUEsQ0FBQ0E7cUJBQzdDQSxDQUFDQTtxQkFBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7eUJBQ05BLElBQUlBLENBQUNBLE9BQUlBLFFBQVFBLE9BQUdBLENBQUNBLEdBQUdBLFFBQVFBLENBQUNBO3FCQUNuQ0EsQ0FBQ0E7aUJBQ0hBLENBQUNBO2lCQUVEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxZQUFZQSwrQkFBb0JBLENBQUNBLENBQUNBLENBQUNBO3FCQUN0Q0EsSUFBSUEsSUFBSUEsR0FBR0EsZ0JBQVNBLENBQUNBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLEdBQVdBLENBQUNBLENBQUNBLElBQUtBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLEVBQUVBLENBQUNBO3FCQUMvREEsSUFBSUEsQ0FBQ0EsT0FBSUEsQ0FBQ0EsQ0FBQ0EsU0FBU0EsT0FBR0EsQ0FBQ0EsR0FBTUEsUUFBUUEsU0FBSUEsSUFBSUEsTUFBR0EsQ0FBQ0E7aUJBQ3BEQSxDQUFDQTtpQkFFREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsWUFBWUEsa0NBQXVCQSxDQUFDQSxDQUFDQSxDQUFDQTtxQkFDekNBLE9BQU9BLENBQUNBLFFBQVFBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBO2lCQUN4QkEsQ0FBQ0E7aUJBRURBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLFlBQVlBLCtCQUFvQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7cUJBQ3RDQSxPQUFPQSxDQUFDQSxRQUFRQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQTtpQkFDeEJBLENBQUNBO2lCQUVEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxZQUFZQSwrQkFBb0JBLENBQUNBLENBQUNBLENBQUNBO3FCQUN0Q0EsT0FBT0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7aUJBQ3hCQSxDQUFDQTtpQkFFREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsWUFBWUEsNEJBQWlCQSxDQUFDQSxDQUFDQSxDQUFDQTtxQkFDbkNBLE9BQU9BLENBQUNBLFFBQVFBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBO2lCQUN4QkEsQ0FBQ0E7YUFDSEEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7U0FDTEEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7U0FDSEEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsRUFBRUEsRUFBRUEsTUFBTUEsRUFBRUEsT0FBT0EsRUFBRUEsSUFBSUEsRUFBRUEsT0FBT0EsQ0FBQ0EsQ0FBQ0E7S0FDekRBLENBQUNBO0tBRU9ILGtDQUFNQSxHQUFkQSxVQUFlQSxFQUFxQkEsRUFBRUEsTUFBZ0JBLEVBQUVBLE9BQWlCQSxFQUMxREEsSUFBNkJBLEVBQUVBLE9BQTZCQTtTQUN6RUksSUFBSUEsWUFBWUEsR0FBR0EsZ0JBQVNBLENBQUNBLEVBQUVBLENBQUNBLE1BQU1BLENBQUNBLEdBQUdBLHdCQUFXQSxDQUFDQSxNQUFNQSxDQUFDQSxFQUFFQSxDQUFDQSxNQUFNQSxFQUFFQSxNQUFNQSxDQUFDQSxHQUFHQSxNQUFNQSxDQUFDQTtTQUN6RkEsSUFBSUEsYUFBYUEsR0FBR0EsZ0JBQVNBLENBQUNBLEVBQUVBLENBQUNBLE9BQU9BLENBQUNBLEdBQUdBLHdCQUFXQSxDQUFDQSxNQUFNQSxDQUFDQSxFQUFFQSxDQUFDQSxPQUFPQSxFQUFFQSxPQUFPQSxDQUFDQSxHQUFHQSxPQUFPQSxDQUFDQTtTQUM5RkEsSUFBSUEsVUFBVUEsR0FBR0EsZ0JBQVNBLENBQUNBLEVBQUVBLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLDZCQUFnQkEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsSUFBSUEsRUFBRUEsSUFBSUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0E7U0FDbkZBLElBQUlBLGFBQWFBLEdBQ2JBLGdCQUFTQSxDQUFDQSxFQUFFQSxDQUFDQSxPQUFPQSxDQUFDQSxHQUFHQSw2QkFBZ0JBLENBQUNBLEtBQUtBLENBQUNBLEVBQUVBLENBQUNBLE9BQU9BLEVBQUVBLE9BQU9BLENBQUNBLEdBQUdBLE9BQU9BLENBQUNBO1NBRWxGQSxFQUFFQSxDQUFDQSxDQUFDQSxFQUFFQSxZQUFZQSw0QkFBaUJBLENBQUNBLENBQUNBLENBQUNBO2FBQ3BDQSxNQUFNQSxDQUFDQSxJQUFJQSw0QkFBaUJBLENBQUNBO2lCQUMzQkEsUUFBUUEsRUFBRUEsRUFBRUEsQ0FBQ0EsUUFBUUE7aUJBQ3JCQSxNQUFNQSxFQUFFQSxZQUFZQTtpQkFDcEJBLE9BQU9BLEVBQUVBLGFBQWFBO2lCQUN0QkEsSUFBSUEsRUFBRUEsVUFBVUE7aUJBQ2hCQSxRQUFRQSxFQUFFQSxFQUFFQSxDQUFDQSxRQUFRQTtpQkFDckJBLFFBQVFBLEVBQUVBLEVBQUVBLENBQUNBLFFBQVFBO2lCQUNyQkEsT0FBT0EsRUFBRUEsYUFBYUE7aUJBQ3RCQSxlQUFlQSxFQUFFQSxFQUFFQSxDQUFDQSxlQUFlQTtpQkFDbkNBLFNBQVNBLEVBQUVBLEVBQUVBLENBQUNBLFNBQVNBO2lCQUN2QkEsYUFBYUEsRUFBRUEsRUFBRUEsQ0FBQ0EsYUFBYUE7Y0FDaENBLENBQUNBLENBQUNBO1NBRUxBLENBQUNBO1NBQUNBLElBQUlBLENBQUNBLENBQUNBO2FBQ05BLE1BQU1BLENBQUNBLElBQUlBLDRCQUFpQkEsQ0FBQ0E7aUJBQzNCQSxRQUFRQSxFQUFFQSxFQUFFQSxDQUFDQSxRQUFRQTtpQkFDckJBLE1BQU1BLEVBQUVBLFlBQVlBO2lCQUNwQkEsT0FBT0EsRUFBRUEsYUFBYUE7aUJBQ3RCQSxJQUFJQSxFQUFFQSxVQUFVQTtpQkFDaEJBLFFBQVFBLEVBQUVBLEVBQUVBLENBQUNBLFFBQVFBO2lCQUNyQkEsT0FBT0EsRUFBRUEsYUFBYUE7aUJBQ3RCQSxTQUFTQSxFQUFFQSxFQUFFQSxDQUFDQSxTQUFTQTtjQUN4QkEsQ0FBQ0EsQ0FBQ0E7U0FDTEEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0E3R0hKO1NBQUNBLGVBQVVBLEVBQUVBOzsyQkE4R1pBO0tBQURBLHdCQUFDQTtBQUFEQSxFQUFDQSxJQUFBO0FBN0dZLDBCQUFpQixvQkE2RzdCOzs7Ozs7Ozs7Ozs7Ozs7O0FDM0lELGdDQUF5QixDQUFzQixDQUFDO0FBQ2hELGtDQUEyQixFQUFrQixDQUFDO0FBQzlDLHdDQUFnQyxFQUF3QixDQUFDO0FBRXpELGtDQUFrRCxDQUEwQixDQUFDO0FBQzdFLHdDQUE0QixFQUFnQyxDQUFDO0FBQzdELHdDQUFrQixFQUFnQyxDQUFDO0FBRW5ELHdDQUF3QixFQUF5QyxDQUFDO0FBR2xFOztJQUVHO0FBQ0g7S0FBQUs7U0FFRUMsZ0JBQWdCQTtTQUNoQkEsV0FBTUEsR0FBR0EsSUFBSUEsZ0JBQUdBLEVBQXNCQSxDQUFDQTtLQWtGekNBLENBQUNBO0tBaEZDRCw4QkFBT0EsR0FBUEEsVUFBUUEsU0FBZUE7U0FDckJFLElBQUlBLElBQUlBLEdBQUdBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLEdBQUdBLENBQUNBLFNBQVNBLENBQUNBLENBQUNBO1NBRXRDQSxFQUFFQSxDQUFDQSxDQUFDQSxjQUFPQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNsQkEsSUFBSUEsR0FBR0EsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0E7YUFDaENBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLEdBQUdBLENBQUNBLFNBQVNBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBO1NBQ25DQSxDQUFDQTtTQUVEQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQTtLQUNkQSxDQUFDQTtLQUVERixnQkFBZ0JBO0tBQ2hCQSwrQkFBUUEsR0FBUkEsVUFBU0EsU0FBZUE7U0FDdEJHLElBQUlBLFFBQTJCQSxDQUFDQTtTQUNoQ0EsSUFBSUEsUUFBc0JBLENBQUNBO1NBRTNCQSxzQkFBU0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsV0FBQ0E7YUFDeENBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLFlBQVlBLG1CQUFZQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDOUJBLFFBQVFBLEdBQUdBLENBQUNBLENBQUNBO2FBQ2ZBLENBQUNBO2FBQ0RBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLFlBQVlBLDhCQUFpQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQ25DQSxRQUFRQSxHQUFHQSxDQUFDQSxDQUFDQTthQUNmQSxDQUFDQTtTQUNIQSxDQUFDQSxDQUFDQSxDQUFDQTtTQUVIQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDeEJBLEVBQUVBLENBQUNBLENBQUNBLGNBQU9BLENBQUNBLFFBQVFBLENBQUNBLFFBQVFBLENBQUNBLElBQUlBLGNBQU9BLENBQUNBLFFBQVFBLENBQUNBLFdBQVdBLENBQUNBLElBQUlBLGNBQU9BLENBQUNBLFFBQVFBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2lCQUNyRkEsTUFBTUEsSUFBSUEsMEJBQWFBLENBQ25CQSxnQkFBY0EsZ0JBQVNBLENBQUNBLFNBQVNBLENBQUNBLGtFQUErREEsQ0FBQ0EsQ0FBQ0E7YUFFekdBLENBQUNBO2FBQUNBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxRQUFRQSxDQUFDQSxRQUFRQSxDQUFDQSxJQUFJQSxnQkFBU0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQy9EQSxJQUFJQSxDQUFDQSw0QkFBNEJBLENBQUNBLFVBQVVBLEVBQUVBLFNBQVNBLENBQUNBLENBQUNBO2FBRTNEQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsV0FBV0EsQ0FBQ0EsSUFBSUEsZ0JBQVNBLENBQUNBLFFBQVFBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2lCQUNsRUEsSUFBSUEsQ0FBQ0EsNEJBQTRCQSxDQUFDQSxhQUFhQSxFQUFFQSxTQUFTQSxDQUFDQSxDQUFDQTthQUU5REEsQ0FBQ0E7YUFBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLFFBQVFBLENBQUNBLFVBQVVBLENBQUNBLElBQUlBLGdCQUFTQSxDQUFDQSxRQUFRQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDakVBLElBQUlBLENBQUNBLDRCQUE0QkEsQ0FBQ0EsWUFBWUEsRUFBRUEsU0FBU0EsQ0FBQ0EsQ0FBQ0E7YUFFN0RBLENBQUNBO2FBQUNBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxRQUFRQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxnQkFBU0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQzVEQSxJQUFJQSxDQUFDQSw0QkFBNEJBLENBQUNBLE9BQU9BLEVBQUVBLFNBQVNBLENBQUNBLENBQUNBO2FBRXhEQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsSUFBSUEsZ0JBQVNBLENBQUNBLFFBQVFBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2lCQUNwRUEsSUFBSUEsQ0FBQ0EsNEJBQTRCQSxDQUFDQSxlQUFlQSxFQUFFQSxTQUFTQSxDQUFDQSxDQUFDQTthQUVoRUEsQ0FBQ0E7YUFBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLFFBQVFBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLGdCQUFTQSxDQUFDQSxRQUFRQSxDQUFD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QUNBLENBQUNBLENBQUNBO0tBQ25DQSxJQUFJQSxTQUFTQSxHQUFHQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtLQUU3QkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLEtBQUtBLENBQUNBLGVBQWVBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO1NBQzdDQSxNQUFNQSxDQUFDQSx3QkFBd0JBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBO0tBQ3pDQSxDQUFDQTtLQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUNOQSxLQUFLQSxDQUFDQSxlQUFlQSxDQUFDQSxNQUFNQSxDQUFDQSxHQUFHQSxTQUFTQSxDQUFDQSxlQUFlQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQTtLQUNwRUEsQ0FBQ0E7S0FFREEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsZUFBZUEsQ0FBQ0EsTUFBTUEsRUFBRUEsQ0FBQ0EsSUFBSUEsZUFBZUEsQ0FBQ0EsSUFBSUEsRUFBRUEsQ0FBQ0EsRUFBRUEsRUFBRUEsQ0FBQ0E7U0FDcEVBLEVBQUVBLENBQUNBLENBQUNBLGNBQU9BLENBQUNBLEtBQUtBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQ3RCQSxLQUFLQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxTQUFTQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtTQUMxQkEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsZUFBZUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7U0FDMUNBLE1BQU1BLENBQUNBLHdCQUF3QkEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7S0FDekNBLENBQUNBO0tBRURBLElBQUlBLElBQUlBLEdBQUdBLFNBQVNBLENBQUNBLGVBQWVBLENBQUNBLElBQUlBLENBQUNB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QUM1QkEsR0FBR0EsSUFBSUEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0E7U0FDdEJBLENBQUNBO1NBQ0RBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUMvQkEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsTUFBTUEsRUFBRUEsQ0FBQ0EsRUFBRUEsRUFBRUEsQ0FBQ0E7aUJBQ2hEQSxHQUFHQSxJQUFJQSxHQUFHQSxHQUFHQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNsQ0EsQ0FBQ0E7U0FDSEEsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQzFCQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxNQUFNQSxHQUFHQSxDQUFDQTtpQkFDdkNBLElBQUlBLFFBQVFBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBO2lCQUMvQkEsSUFBSUEsU0FBU0EsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0E7aUJBQ2hDQSxHQUFHQSxJQUFJQSxHQUFHQSxHQUFHQSxRQUFRQSxDQUFDQTtpQkFDdEJBLEVBQUVBLENBQUNBLENBQUNBLFNBQVNBLENBQUNBLE1BQU1BLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO3FCQUN6QkEsR0FBR0EsSUFBSUEsR0FBR0EsR0FBR0EsU0FBU0EsQ0FBQ0E7aUJBQ3pCQSxDQUFDQTtpQkFDREEsR0FBR0EsSUFB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QkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLFNBQVNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQ3pCQSxVQUFVQSxHQUFHQSxJQUFJQSxDQUFDQTthQUNsQkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLFNBQVNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2lCQUM1QkEsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsU0FBU0EsRUFBRUEsSUFBSUEsQ0FBQ0EsVUFBVUEsRUFBRUEsb0JBQW9CQSxFQUM5REEsV0FBV0EsQ0FBQ0EsQ0FBQ0E7YUFFbkNBLENBQUNBO2FBQUNBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUNMQSxTQUFTQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDN0JBLElBQUlBLFVBQVVBLEdBQUdBLFNBQVNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2lCQUM5QkEsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsVUFBVUEsRUFBRUEsU0FBU0EsRUFBRUEsSUFBSUEsQ0FBQ0EsVUFBVUEsRUFBRUEsVUFBVUEsQ0FBQ0EsQ0FBQ0E7YUFFMUVBLENBQUNBO2FBQUNBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxTQUFTQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDbkNBLElBQUlBLENBQUNBLFdBQVdBLENBQUNBLFNBQVNBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLFNBQVNBLEVBQUVBLElBQUlBLENBQUNBLFVBQVVBLEVBQUVBLG9CQUFvQkEsRUFDOURBLFlBQVlBLENBQUNBLENBQUNBO2FBRWpDQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0EsQ0FB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Q0FBQ0EsZ0JBQWdCQSxDQUFDQSxJQUFJQSxDQUFDQSxRQUFRQSxFQUFFQSxDQUFDQSxDQUFDQTthQUN6Q0EsQ0FBQ0E7YUFBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsS0FBS0EsMEJBQWFBLENBQUNBLFNBQVNBLENBQUNBLENBQUNBLENBQUNBO2lCQUN0REEsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsUUFBUUEsRUFBRUEsQ0FBQ0EsQ0FBQ0E7YUFDdkNBLENBQUNBO2FBQUNBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLEtBQUtBLDBCQUFhQSxDQUFDQSxXQUFXQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDeERBLElBQUlBLENBQUNBLGlCQUFpQkEsRUFBRUEsQ0FBQ0E7aUJBQ3pCQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxJQUFJQSxDQUFDQSxRQUFRQSxFQUFFQSxDQUFDQSxDQUFDQTthQUN0Q0EsQ0FBQ0E7YUFBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsS0FBS0EsMEJBQWFBLENBQUNBLGFBQWFBLENBQUNBLENBQUNBLENBQUNBO2lCQUMxREEsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxFQUFFQSxDQUFDQTtpQkFDekJBLElBQUlBLENBQUNBLGVBQWVBLENBQUNBLElBQUlBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBLENBQUNBO2FBQ3hDQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxLQUFLQSwwQkFBYUEsQ0FBQ0EsSUFBSUE7aUJBQ3JDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxLQUFLQSwwQkFBYUEsQ0FBQ0EsUUFBUUE7aUJBQ3pDQSxJQUFJQSxDQUFDQSxJQUFJQSxD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eENBLElBQUlBLFFBQVFBLEdBQUdBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLE1BQU1BLENBQUNBO1NBQ3BDQSxFQUFFQSxDQUFDQSxDQUFDQSxRQUFRQSxHQUFHQSxNQUFNQSxDQUFDQSxNQUFNQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNqQ0EsUUFBUUEsR0FBR0EsTUFBTUEsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0E7U0FDL0JBLENBQUNBO1NBQ0RBLElBQUlBLE1BQU1BLEdBQUdBLFFBQVFBLENBQUNBO1NBQ3RCQSxJQUFJQSxNQUFNQSxHQUFHQSxDQUFDQSxDQUFDQTtTQUNmQSxJQUFJQSxRQUFRQSxHQUFHQSxDQUFDQSxDQUFDQTtTQUVqQkEsT0FBT0EsTUFBTUEsR0FBR0EsR0FBR0EsSUFBSUEsUUFBUUEsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0E7YUFDcENBLFFBQVFBLEVBQUVBLENBQUNBO2FBQ1hBLE1BQU1BLEVBQUVBLENBQUNBO2FBQ1RBLEVBQUVBLENBQUNBLENBQUNBLE1BQU1BLENBQUNBLFFBQVFBLENBQUNBLElBQUlBLElBQUlBLENBQUNBLENBQUNBLENBQUNBO2lCQUM3QkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsUUFBUUEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7cUJBQ3BCQSxLQUFLQSxDQUFDQTtpQkFDUkEsQ0FBQ0E7YUFDSEEsQ0FBQ0E7U0FDSEEsQ0FBQ0E7U0FFREEsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0E7U0FDWEEsUUFBUUEsR0FBR0EsQ0FBQ0EsQ0FBQ0E7U0FDYkEsT0FBT0EsTUFBTUEsR0FBR0EsR0FBR0EsSUFBSUEsTUFBTUEsR0FBR0EsTUFBTUEsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0E7YUFDbERBLE1BQU1BLEVBQUVBLENBQUNBO2FBQ1RBLE1BQU1BLEVBQUVBLENBQUNBO2FBQ1RBLEVBQUVBLENBQUNBLENBQUNBLE1BQU1BLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLElBQUlBLENB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QixRQUFRLEVBQUUsUUFBUTtLQUNsQixRQUFRLEVBQUUsUUFBUTtLQUNsQixRQUFRLEVBQUUsUUFBUTtLQUNsQixPQUFPLEVBQUUsUUFBUTtLQUNqQixPQUFPLEVBQUUsUUFBUTtLQUNqQixPQUFPLEVBQUUsUUFBUTtLQUNqQixRQUFRLEVBQUUsUUFBUTtLQUNsQixRQUFRLEVBQUUsUUFBUTtLQUNsQixPQUFPLEVBQUUsUUFBUTtLQUNqQixPQUFPLEVBQUUsUUFBUTtLQUNqQixLQUFLLEVBQUUsUUFBUTtLQUNmLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLElBQUksRUFBRSxRQUFRO0tBQ2QsUUFBUSxFQUFFLFFBQVE7S0FDbEIsUUFBUSxFQUFFLFFBQVE7S0FDbEIsS0FBSyxFQUFFLFFBQVE7S0FDZixLQUFLLEVBQUUsUUFBUTtLQUNmLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLElBQUksRUFBRSxHQUFHO0tBQ1QsTUFBTSxFQUFFLFFBQVE7S0FDaEIsT0FBTyxFQUFFLFFBQVE7S0FDakIsT0FBTyxFQUFFLFFBQVE7S0FDakIsUUFBUSxFQUFFLFFBQVE7S0FDbEIsT0FBTyxFQUFFLFFBQVE7S0FDakIsSUFBSSxFQUFFLFFBQVE7S0FDZCxJQUFJLEVBQUUsUUFBUTtLQUNkLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLElBQUksRUFBRSxRQUFRO0tBQ2QsSUFBSSxFQUFFLFFBQVE7S0FDZCxLQUFLLEVBQUUsUUFBUTtLQUNmLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLElBQUksRUFBRSxRQUFRO0tBQ2QsSUFBSSxFQUFFLFFBQVE7S0FDZCxRQUFRLEVBQUUsUUFBUTtLQUNsQixRQUFRLEVBQUUsUUFBUTtLQUNsQixPQUFPLEVBQUUsUUFBUTtLQUNqQixPQUFPLEVBQUUsUUFBUTtLQUNqQixPQUFPLEVBQUUsUUFBUTtLQUNqQixPQUFPLEVBQUUsUUFBUTtLQUNqQixRQUFRLEVBQUUsUUFBUTtLQUNsQixRQUFRLEVBQUUsUUFBUTtLQUNsQixPQUFPLEVBQUUsUUFBUTtLQUNqQixPQUFPLEVBQUUsUUFBUTtLQUNqQixPQUFPLEVBQUUsUUFBUTtLQUNqQixTQUFTLEVBQUUsUUFBUTtLQUNuQixTQUFTLEVBQUUsUUFBUTtLQUNuQixPQUFPLEVBQUUsUUFBUTtLQUNqQixJQUFJLEVBQUUsUUFBUTtLQUNkLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLEtBQUssRUFBRSxRQUFRO0tBQ2YsS0FBSyxFQUFFLFFBQVE7S0FDZixJQUFJLEVBQUUsUUFBUTtLQUNkLElBQUksRUFBRSxRQUFRO0tBQ2QsS0FBSyxFQUFFLFFBQVE7S0FDZixRQUFRLEVBQUUsUUFBUTtLQUNsQixPQUFPLEVBQUUsUUFBUTtLQUNqQixPQUFPLEVBQUUsUUFBUTtLQUNqQixPQUFPLEVBQUUsUUFBUTtLQUNqQixNQUFNLEVBQUUsUUFBUTtLQUNoQixNQUFNLEVBQUUsUUFBUTtLQUNoQixLQUFLLEVBQUUsUUFBUTtLQUNmLEtBQUssRUFBRSxRQUFRO0tBQ2YsTUFBTSxFQUFFLFFBQVE7S0FDaEIsT0FBTyxFQUFFLFFBQVE7S0FDakIsTUFBTSxFQUFFLFFBQVE7S0FDaEIsT0FBTyxFQUFFLFFBQVE7S0FDakIsTUFBTSxFQUFFLFFBQVE7S0FDaEIsTUFBTSxFQUFFLFFBQVE7S0FDaEIsT0FBTyxFQUFFLFFBQVE7S0FDakIsT0FBTyxFQUFFLFFBQVE7S0FDakIsTUFBTSxFQUFFLFFBQVE7S0FDaEIsS0FBSyxFQUFFLFFBQVE7S0FDZixRQUFRLEVBQUUsUUFBUTtLQUNsQixLQUFLLEVBQUUsUUFBUTtLQUNmLEtBQUssRUFBRSxRQUFRO0tBQ2YsS0FBSyxFQUFFLFFBQVE7S0FDZixRQUFRLEVBQUUsUUFBUTtLQUNsQixPQUFPLEVBQUUsUUFBUTtLQUNqQixPQUFPLEVBQUUsUUFBUTtLQUNqQixRQUFRLEVBQUUsUUFBUTtLQUNsQixRQUFRLEVBQUUsUUFBUTtLQUNsQixNQUFNLEVBQUUsUUFBUTtLQUNoQixNQUFNLEVBQUUsUUFBUTtLQUNoQixLQUFLLEVBQUUsUUFBUTtLQUNmLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLEtBQUssRUFBRSxRQUFRO0tBQ2YsUUFBUSxFQUFFLFFBQVE7S0FDbEIsS0FBSyxFQUFFLFFBQVE7S0FDZixNQUFNLEVBQUUsUUFBUTtLQUNoQixLQUFLLEVBQUUsUUFBUTtLQUNmLEtBQUssRUFBRSxRQUFRO0tBQ2YsTUFBTSxFQUFFLFFBQVE7S0FDaEIsTUFBTSxFQUFFLFFBQVE7S0FDaEIsTUFBTSxFQUFFLFFBQVE7S0FDaEIsTUFBTSxFQUFFLFFBQVE7S0FDaEIsT0FBTyxFQUFFLFFBQVE7S0FD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SUEsSUFBSUEsSUFBSUEsUUFBUUEsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDNUNBLE1BQU1BLENBQUNBLFFBQVFBLENBQUNBO1NBQ2xCQSxDQUFDQTtTQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxRQUFRQSxDQUFDQSxTQUFTQSxDQUFDQSxRQUFRQSxDQUFDQSxNQUFNQSxHQUFHQSxDQUFDQSxDQUFDQSxJQUFJQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQTthQUMzREEsSUFBSUEsS0FBS0EsR0FBR0Esb0JBQWFBLENBQUNBLFFBQVFBLENBQUNBLElBQUlBLENBQUNBLFlBQVlBLENBQUNBLFFBQVFBLENBQUNBLEVBQUVBLEVBQUVBLENBQUNBLENBQUNBO2FBQ3BFQSxFQUFFQSxDQUFDQSxDQUFDQSxLQUFLQSxHQUFHQSxRQUFRQSxDQUFDQTtpQkFBQ0EsUUFBUUEsR0FBR0EsS0FBS0EsQ0FBQ0E7U0FDekNBLENBQUNBO1NBQUNBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLFFBQVFBLENBQUNBLFNBQVNBLENBQUNBLFFBQVFBLENBQUNBLE1BQU1BLEdBQUdBLENBQUNBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBO2FBQzFEQSxJQUFJQSxFQUFFQSxHQUFHQSxvQkFBYUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0E7YUFDdEVBLElBQUlBLEtBQUtBLEdBQUdBLFdBQUlBLENBQUNBLEtBQUtBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBO2FBQzNCQSxFQUFFQSxDQUFDQSxDQUFDQSxLQUFLQSxHQUFHQSxRQUFRQSxDQUFDQTtpQkFBQ0EsUUFBUUEsR0FBR0EsS0FBS0EsQ0FBQ0E7U0FDekNBLENBQUNBO1NBQ0RBLE1BQU1BLENBQUNBLFFBQVFBLENBQUNBO0tBQ2xCQSxDQUFDQTtLQUVEYjs7OztRQUlHQTtLQUNIQSxnQ0FB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Ozs7Ozs7OztRQXdCR0E7S0FDSEEsOEJBQUtBLEdBQUxBLFVBQU1BLE9BQTRCQTtTQUNoQ0UsTUFBTUEsQ0FBQ0EsSUFBSUEsY0FBY0EsQ0FBQ0E7YUFDeEJBLE1BQU1BLEVBQUVBLGdCQUFTQSxDQUFDQSxPQUFPQSxDQUFDQSxJQUFJQSxnQkFBU0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsR0FBR0EsT0FBT0EsQ0FBQ0EsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsTUFBTUE7YUFDdEZBLE9BQU9BLEVBQUVBLGdCQUFTQSxDQUFDQSxPQUFPQSxDQUFDQSxJQUFJQSxnQkFBU0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsR0FBR0EsT0FBT0EsQ0FBQ0EsT0FBT0EsR0FBR0EsSUFBSUEsQ0FBQ0EsT0FBT0E7YUFDMUZBLElBQUlBLEVBQUVBLGdCQUFTQSxDQUFDQSxPQUFPQSxDQUFDQSxJQUFJQSxnQkFBU0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsT0FBT0EsQ0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsQ0FBQ0EsSUFBSUE7YUFDOUVBLEdBQUdBLEVBQUVBLGdCQUFTQSxDQUFDQSxPQUFPQSxDQUFDQSxJQUFJQSxnQkFBU0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsT0FBT0EsQ0FBQ0EsR0FBR0EsR0FBR0EsSUFBSUEsQ0FBQ0EsR0FBR0E7YUFDMUVBLE1BQU1BLEVBQUVBLGdCQUFTQSxDQUFDQSxPQUFPQSxDQUFDQSxJQUFJQSxnQkFBU0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsTUFBTUEsQ0FBQ0E7aUJBQzNDQSxDQUFDQSxlQUFRQSxDQUFDQSxPQUFPQSxDQUFDQSxNQUFNQSxDQUFDQSxHQUFHQSxJQUFJQSxtQ0FBZUEsQ0FBU0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0E7cUJBQzNCQSxDQUFDQSxPQUFPQSxDQUFDQSxNQUFNQSxDQUFFQSxDQUFDQSxLQUFLQSxFQUFFQSxDQUFDQTtpQkFDeEVBLElBQUlBLENB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QSxnQkFBU0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsR0FBR0EsUUFBUUEsR0FBR0EsRUFBRUEsQ0FBQ0E7YUFDL0NBLHdCQUFXQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTthQUN4QkEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsS0FBS0EsQ0FBQ0EsTUFBTUEsRUFBRUEsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0E7aUJBQ3RDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUN0QkEsQ0FBQ0E7YUFDREEsS0FBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsS0FBS0EsRUFBRUEsSUFBSUEsQ0FBQ0EsQ0FBQ0E7U0FDbENBLENBQUNBLENBQUNBLENBQUNBO0tBQ0xBLENBQUNBO0tBRURWLGtDQUFRQSxHQUFSQTtTQUNFVyxJQUFJQSxVQUFVQSxHQUFHQSxFQUFFQSxDQUFDQTtTQUNwQkEsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsVUFBQ0EsTUFBTUEsRUFBRUEsQ0FBQ0EsSUFBT0EsTUFBTUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsV0FBQ0EsSUFBSUEsaUJBQVVBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLEVBQTVCQSxDQUE0QkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7U0FDOUZBLE1BQU1BLENBQUNBLFVBQVVBLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBO0tBQzlCQSxDQUFDQTtLQUVEWCxnQ0FBTUEsR0FBTkEsVUFBUUEsS0FBYUEsSUFBVVksSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDaEVaLHNCQUFDQTtBQUFEQSxFQUFDQSxJQUFB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U0EsR0FBR0EsZ0JBQWdCQSxDQUFDQTthQUM3QkEsU0FBU0EsR0FBR0EsRUFBRUEsQ0FBQ0E7YUFDZkEsU0FBU0EsR0FBR0EsRUFBRUEsQ0FBQ0E7U0FDakJBLENBQUNBO1NBQ0RBLE1BQU1BLENBQUNBLEVBQUNBLGdCQUFPQSxFQUFFQSxvQkFBU0EsRUFBRUEsb0JBQVNBLEVBQUVBLG9CQUFTQSxFQUFFQSx3QkFBV0EsRUFBQ0EsQ0FBQ0E7S0FDakVBLENBQUNBO0tBR0RGLGlDQUFRQSxHQUFSQSxVQUFTQSxNQUE0QkE7U0FDbkNHLElBQUlBLFdBQVdBLEdBQUdBLElBQUlBLFFBQVFBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBO1NBRXZDQSxJQUFJQSxJQUFJQSxHQUFHQSxFQUFFQSxDQUFDQTtTQUVkQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQSxFQUFFQSxFQUFFQSxDQUFDQTthQUMvQ0EsSUFBSUEsT0FBT0EsR0FBR0EsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDaENBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLE9BQU9BLFlBQVlBLG1CQUFtQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQzlDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxRQUFRQSxDQUFDQSxXQUFXQSxDQUFDQSxDQUFDQSxDQUFDQTthQUMzQ0EsQ0FBQ0E7U0FDSEEsQ0FBQ0E7U0FDREEsSUFBSUEsT0FBT0EsR0FBR0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7U0FFN0JBLElBQUlBLG1CQUFtQkEsR0FBR0EsV0FBV0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0E7U0FDbERBLElBQUlBLFNBQVNBLEdBQUdBLDRCQUFlQSxDQUFDQSxtQkFBbUJBLENBQUNBLENBQUNB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QUFDQSxNQUFNQSxDQUFDQSxDQUFDQTtLQUM3REEsQ0FBQ0E7S0FFREosaURBQWtCQSxHQUFsQkEsVUFBbUJBLFFBQWdCQTtTQUNqQ0ssSUFBSUEsR0FBR0EsR0FBR0EsaUNBQWFBLENBQUNBLElBQUlBLENBQUNBLFNBQVNBLEVBQUVBLFFBQVFBLENBQUNBLENBQUNBO1NBQ2xEQSxNQUFNQSxDQUFDQSxHQUFHQSxDQUFDQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxHQUFHQSxHQUFHQSxDQUFDQSxHQUFHQSxHQUFHQSxDQUFDQTtLQUM1Q0EsQ0FBQ0E7S0FFREwsd0NBQVNBLEdBQVRBLFVBQVVBLEtBQVVBLEVBQUVBLEtBQWFBLEVBQUVBLElBQVlBLEVBQUVBLFdBQW1CQTtTQUNwRU0sSUFBSUEsR0FBR0EsR0FBR0EsSUFBSUEsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxJQUFJQSxHQUFHQSx3Q0FBb0JBLENBQUNBLFdBQVdBLENBQUNBLENBQUNBLENBQUNBO1NBQzVFQSxFQUFFQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxNQUFNQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNwQkEsR0FBR0EsR0FBR0EsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxRQUFRQSxDQUFDQTtTQUN4Q0EsQ0FBQ0E7U0FDREEsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxTQUFTQSxDQUFDQSxLQUFLQSxFQUFFQSxLQUFLQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQTtLQUN0REEsQ0FBQ0E7S0FFRE4sMkNBQVlBLEdBQVpBLFVBQWFBLEtBQVVBLEVBQUVBLEtBQWFBLEVBQUVBLElBQVlBLEVBQUVBLFdBQW1CQTtTQUN2RU8sSUFBSUEsR0FBR0EsR0FBR0EsSUFBSUEsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxJQUFJQSxHQUFHQSx3Q0FBb0JBLENBQUNBLFdBQVdBLENBQUNBLENBQUNBLENBQUNBO1NBQzVFQSxFQUFFQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxNQUFNQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNwQkEsR0FBR0EsR0FBR0EsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxRQUFRQSxDQUFDQTtTQUN4Q0EsQ0FBQ0E7U0FDREEsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxZQUFZQSxDQUFDQSxLQUFLQSxFQUFFQSxLQUFLQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQTtLQUN6REEsQ0FBQ0E7S0FFRFAsc0NBQU9BLEdBQVBBLGNBQWtCUSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLE9BQU9BLEVBQUVBLENBQUNBLENBQUNBLENBQUNBO0tBRXJEUixtQ0FBSUEsR0FBSkEsY0FBZVMsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxJQUFJQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQTtLQXJEakRUO1NBQUNBLGlCQUFVQSxFQUFFQTtTQUlDQSxXQUFDQSxlQUFRQSxFQUFFQTtTQUFDQSxXQUFDQSxhQUFNQSxDQUFDQSxpQ0FBYUEsQ0FBQ0E7OzhCQWtEL0NBO0tBQURBLDJCQUFDQTtBQUFEQSxFQUFDQSxFQXJEeUMsb0NBQWdCLEVBcUR6RDtBQXJEWSw2QkFBb0IsdUJBcURoQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdkdELGtDQUEyQyxDQUFlLENBQUM7QUFFM0Qsa0NBQXNCLENBQTBCLENBQUM7QUFDakQsd0NBQTRCLEVBQWdDLENBQUM7QUFDN0QsK0NBS08sR0FBcUIsQ0FBQztBQUM3QiwrQ0FBK0IsR0FBcUIsQ0FBQztBQUVyRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUE0Q0c7QUFDSDtLQUMwQ1Usd0NBQWdCQTtLQUd4REEsOEJBQW9CQSxpQkFBbUNBLEVBQ1JBLElBQWFBO1NBQzFEQyxpQkFBT0EsQ0FBQ0E7U0FGVUEsc0JBQWlCQSxHQUFqQkEsaUJBQWlCQSxDQUFrQkE7U0FJckRBLEVBQUVBLENBQUNBLENBQUNBLGNBQU9BLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQ2xCQSxJQUFJQSxHQUFHQSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLGtCQUFrQkEsRUFBRUEsQ0FBQ0E7U0FDckRBLENBQUNBO1NBRURBLEVBQUVBLENBQUNBLENBQUNBLGNBQU9BLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQ2xCQSxNQUFNQSxJQUFJQSwwQkFBYUEsQ0FDbkJBLDZHQUE2R0EsQ0FBQ0EsQ0FBQ0E7U0FDckhBLENBQUNBO1NBRURBLElBQUlBLENBQUNBLFNBQVNBLEdBQUdBLElBQUlBLENBQUNBO0tBQ3hCQSxDQUFDQTtLQUVERCx5Q0FBVUEsR0FBVkEsVUFBV0EsRUFBaUJBO1NBQzFCRSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLFVBQVVBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBO1NBQ3RDQSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLFlBQVlBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBO0tBQzFDQSxDQUFDQTtLQUVERiwwQ0FBV0EsR0FBWEEsY0FBd0JHLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLENBQUNBLENBQUNBO0tBRWhESCxpREFBa0JBLEdBQWxCQSxVQUFtQkEsUUFBZ0JBLElBQVlJLE1BQU1BLENBQUNBLGlDQUFhQSxDQUFDQSxJQUFJQSxDQUFDQSxTQUFTQSxFQUFFQSxRQUFRQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUVoR0osbUNBQUlBLEdBQUpBO1NBQ0VLLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsUUFBUUEsR0FBR0Esd0NBQW9CQSxDQUFDQSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBO0tBQy9GQSxDQUFDQTtLQUVETCx3Q0FBU0EsR0FBVEEsVUFBVUEsS0FBVUEsRUFBRUEsS0FBYUEsRUFBRUEsR0FBV0EsRUFBRUEsV0FBbUJBO1NBQ25FTSxJQUFJQSxXQUFXQSxHQUFHQSxJQUFJQSxDQUFDQSxrQkFBa0JBLENBQUNBLEdBQUdBLEdBQUdBLHdDQUFvQkEsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7U0FDbkZBLElBQUlBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsS0FBS0EsRUFBRUEsS0FBS0EsRUFBRUEsV0FBV0EsQ0FBQ0EsQ0FBQ0E7S0FDOURBLENBQUNBO0tBRUROLDJDQUFZQSxHQUFaQSxVQUFhQSxLQUFVQSxFQUFFQSxLQUFhQSxFQUFFQSxHQUFXQSxFQUFFQSxXQUFtQkE7U0FDdEVPLElBQUlBLFdBQVdBLEdBQUdBLElBQUlBLENBQUNBLGtCQUFrQkEsQ0FBQ0EsR0FBR0EsR0FBR0Esd0NBQW9CQSxDQUFDQSxXQUFXQSxDQUFDQSxDQUFDQSxDQUFDQTtTQUNuRkEsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxZQUFZQSxDQUFDQSxLQUFLQSxFQUFFQSxLQUFLQSxFQUFFQSxXQUFXQSxDQUFDQSxDQUFDQTtLQUNqRUEsQ0FBQ0E7S0FFRFAsc0NBQU9BLEdBQVBBLGNBQWtCUSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLE9BQU9BLEVBQUVBLENBQUNBLENBQUNBLENBQUNBO0tBRXJEUixtQ0FBSUEsR0FBSkEsY0FBZVMsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxJQUFJQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQTtLQTdDakRUO1NBQUNBLGlCQUFVQSxFQUFFQTtTQUtDQSxXQUFDQSxlQUFRQSxFQUFFQTtTQUFDQSxXQUFDQSxhQUFNQSxDQUFDQSxpQ0FBYUEsQ0FBQ0E7OzhCQXlDL0NBO0tBQURBLDJCQUFDQTtBQUFEQSxFQUFDQSxFQTdDeUMsb0NBQWdCLEVBNkN6RDtBQTdDWSw2QkFBb0IsdUJBNkNoQzs7Ozs7Ozs7Ozs7OztBQ3ZHRCxzQ0FBa0MsR0FBbUIsQ0FBQztBQUN0RCxrQ0FBdUIsQ0FBZSxDQUFDO0FBQ3ZDLG1EQUFrQyxHQUEyQyxDQUFDO0FBQzlFLGtDQUF5QixDQUEwQixDQUFDO0FBRXBELG1EQUFrQyxHQUEyQyxDQUFDO0FBQXRFLDJFQUFzRTtBQUU5RTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQXlCRztBQUNVLGlDQUF3QixHQUNqQyxpQkFBVSxDQUFDLElBQUksZUFBUSxDQUFDLDhCQUFtQixFQUFFLEVBQUMsUUFBUSxFQUFFLDJDQUFtQixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2xDaEcsc0NBTU8sR0FBbUIsQ0FBQztBQUMzQixpQ0FRTyxFQUErQyxDQUFDO0FBQ3ZELHdDQUE0QixFQUFnQyxDQUFDO0FBQzdELGtDQUF5QixDQUFlLENBQUM7QUFDekMsb0NBQXFCLEVBQWtELENBQUM7QUFFeEU7O0lBRUc7QUFDSDtLQUNFVSxtQkFBbUJBLEtBQWFBO1NBQWJDLFVBQUtBLEdBQUxBLEtBQUtBLENBQVFBO0tBQUdBLENBQUNBO0tBQ3RDRCxnQkFBQ0E7QUFBREEsRUFBQ0EsSUFBQTtBQUVEOztJQUVHO0FBQ0g7S0FDRUU7S0FBZUMsQ0FBQ0E7S0FDbEJELHFCQUFDQTtBQUFEQSxFQUFDQSxJQUFBO0FBRUQ7O0lBRUc7QUFDSDtLQUNFRTtLQUFlQyxDQUFDQTtLQUNsQkQsbUJBQUNBO0FBQURBLEVBQUNBLElBQUE7QUFFRDs7SUFFRztBQUNIO0tBQ0VFLGdCQUFtQkEsR0FBUUE7U0FBUkMsUUFBR0EsR0FBSEEsR0FBR0EsQ0FBS0E7S0FBR0EsQ0FBQ0E7S0FDakNELGFBQUNBO0FBQURBLEVBQUNBLElBQUE7QUFFRDtLQUdFRSx5QkFBb0JBLE1BQWNBLEVBQVVBLEdBQVdBO1NBQW5DQyxXQUFNQSxHQUFOQSxNQUFNQSxDQUFRQTtTQUFVQSxRQUFHQSxHQUFIQSxHQUFHQSxDQUFRQTtTQUZ2REEsVUFBS0EsR0FBV0EsQ0FBQ0EsQ0FBQ0E7S0FFd0NBLENBQUNBO0tBRTNERCxrQ0FBUUEsR0FBUkE7U0FDRUUsSUFBSUEsTUFBTUEsR0FBR0EsRUFBRUEsQ0FBQ0E7U0FDaEJBLE9BQU9BLElBQUlBLENBQUNBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLE1BQU1BLEVBQUVBLENBQUNBO2FBQ3BDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxXQUFXQSxFQUFFQSxDQUFDQSxDQUFDQTtTQUNsQ0EsQ0FBQ0E7U0FDREEsTUFBTUEsQ0FBQ0EsTUFBTUEsQ0FBQ0E7S0FDaEJBLENBQUNBO0tBRU9GLHFDQUFXQSxHQUFuQkE7U0FDRUcsSUFBSUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7U0FDN0JBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBO2FBQ2JBLElBQUlBLENBQUNBLEtBQUtBLEVBQUVBLENBQUNBO2FBQ2JBLE1BQU1BLENBQUNBLElBQUlBLGNBQWNBLEVBQUVBLENBQUNBO1NBRTlCQSxDQUFDQTtTQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNwQkEsSUFBSUEsQ0FBQ0EsS0FBS0EsRUFBRUEsQ0FBQ0E7YUFDYkEsTUFBTUEsQ0FBQ0EsSUFBSUEsWUFBWUEsRUFBRUEsQ0FBQ0E7U0FFNUJBLENBQUNBO1NBQUNBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBO2FBQ3BCQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxZQUFZQSxFQUFFQSxDQUFDQTtTQUU3QkEsQ0FBQ0E7U0FBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsSUFBSUEsQ0FBQ0EsS0FBS0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDeENBLElBQUlBLENBQUNBLEtBQUtBLEVBQUVBLENBQUNBO2FBQ2JBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLGVBQWVBLEVBQUVBLENBQUNBO1NBRWhDQSxDQUFDQTtTQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTthQUNOQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxlQUFlQSxFQUFFQSxDQUFDQTtTQUNoQ0EsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFT0gsc0NBQVlBLEdBQXBCQTtTQUNFSSxJQUFJQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQTtTQUN2QkEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsSUFBSUEsQ0FBQ0EsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsTUFBTUEsRUFBRUEsRUFBRUEsSUFBSUEsQ0FBQ0EsS0FBS0EsRUFBRUEsQ0FBQ0E7YUFDbERBLElBQUlBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBO2FBQzdCQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDYkEsSUFBSUEsYUFBYUEsR0FBR0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsS0FBS0EsR0FBR0EsQ0FBQ0EsRUFBRUEsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7aUJBQzlEQSxJQUFJQSxDQUFDQSxLQUFLQSxFQUFFQSxDQUFDQTtpQkFDYkEsTUFBTUEsQ0FBQ0EsSUFBSUEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsTUFBSUEsYUFBYUEsTUFBR0EsRUFBRUEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7YUFDOUVBLENBQUNBO1NBQ0hBLENBQUNBO1NBQ0RBLE1BQU1BLElBQUlBLDBCQUFhQSxDQUFDQSxpQkFBaUJBLENBQUNBLENBQUNBO0tBQzdDQSxDQUFDQTtLQUVPSix5Q0FBZUEsR0FBdkJBO1NBQ0VLLElBQUlBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBO1NBQ3ZCQSxJQUFJQSxXQUFXQSxHQUFHQSxLQUFLQSxDQUFDQTtTQUd4QkEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsSUFBSUEsQ0FBQ0EsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsTUFBTUEsRUFBRUEsRUFBRUEsSUFBSUEsQ0FBQ0EsS0FBS0EsRUFBRUEsQ0FBQ0E7YUFDbERBLElBQUlBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBO2FBRTdCQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxDQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxDQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxXQUFXQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDbEVBLEtBQUtBLENBQUNBO2FBQ1JBLENBQUNBO2FBRURBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLElBQUlBLEdBQUdBLElBQUlBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBO2lCQUN6QkEsV0FBV0EsR0FBR0EsSUFBSUEsQ0FBQ0E7YUFDckJBLENBQUNBO1NBQ0hBLENBQUNBO1NBRURBLElBQUlBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLFNBQVNBLENBQUNBLEtBQUtBLEVBQUVBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBO1NBRWxEQSxFQUFFQSxDQUFDQSxDQUFDQSxLQUFLQSxLQUFLQSxJQUFJQSxDQUFDQSxLQUFLQSxJQUFJQSxDQUFDQSxXQUFXQSxJQUFJQSxLQUFLQSxDQUFDQSxVQUFVQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNuRUEsTUFBTUEsSUFBSUEsMEJBQWFBLENBQUNBLHFCQUFxQkEsQ0FBQ0EsQ0FBQ0E7U0FDakRBLENBQUNBO1NBRURBLE1BQU1BLENBQUNBLElBQUlBLFNBQVNBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBO0tBQzlCQSxDQUFDQTtLQUNITCxzQkFB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Six3Q0FBU0EsR0FBVEEsVUFBVUEsR0FBUUEsRUFBRUEsS0FBYUEsRUFBRUEsSUFBWUEsRUFBRUEsS0FBYUE7U0FDNURLLElBQUlBLENBQUNBLGFBQWFBLEdBQUdBLEtBQUtBLENBQUNBO1NBRTNCQSxJQUFJQSxHQUFHQSxHQUFHQSxJQUFJQSxHQUFHQSxDQUFDQSxLQUFLQSxDQUFDQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxHQUFHQSxLQUFLQSxDQUFDQSxHQUFHQSxFQUFFQSxDQUFDQSxDQUFDQTtTQUN6REEsSUFBSUEsQ0FBQ0EsWUFBWUEsR0FBR0EsR0FBR0EsQ0FBQ0E7U0FFeEJBLElBQUlBLFdBQVdBLEdBQUdBLElBQUlBLENBQUNBLGtCQUFrQkEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7U0FDL0NBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLElBQUlBLENBQUNBLFdBQVdBLENBQUNBLENBQUNBO0tBQ3BDQSxDQUFDQTtLQUVETCwyQ0FBWUEsR0FBWkEsVUFBYUEsR0FBUUEsRUFBRUEsS0FBYUEsRUFBRUEsSUFBWUEsRUFBRUEsS0FBYUE7U0FDL0RNLElBQUlBLENBQUNBLGFBQWFBLEdBQUdBLEtBQUtBLENBQUNBO1NBRTNCQSxJQUFJQSxHQUFHQSxHQUFHQSxJQUFJQSxHQUFHQSxDQUFDQSxLQUFLQSxDQUFDQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxHQUFHQSxLQUFLQSxDQUFDQSxHQUFHQSxFQUFFQSxDQUFDQSxDQUFDQTtTQUN6REEsSUFBSUEsQ0FBQ0EsWUFBWUEsR0FBR0EsR0FBR0EsQ0FBQ0E7U0FFeEJBLElBQUlBLFdBQVdBLEdBQUdBLElBQUlBLENBQUNBLGtCQUFrQkEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7U0FDL0NBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLElBQUlBLENBQUNBLFdBQVdBLEdBQUdBLFdBQVdBLENBQUNBLENBQUNBO0tBQ2xEQSxDQUFDQTtLQUVETix5Q0FBVUEsR0FBVkEsVUFBV0EsRUFBd0JBLElB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T0FBT0EsRUFBRUEsUUFBUUEsQ0FBQ0EsQ0FBQ0E7S0FDL0VBLENBQUNBO0tBSURaLCtCQUFTQSxHQUFUQSxVQUFVQSxHQUFXQSxJQUFZYSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQTtLQXhFakRiO1NBQUNBLGVBQVVBLEVBQUVBOztxQkF5RVpBO0tBQURBLGtCQUFDQTtBQUFEQSxFQUFDQSxJQUFBO0FBeEVZLG9CQUFXLGNBd0V2QiIsImZpbGUiOiJkaXN0L2pzL2J1bmRsZS9hbmd1bGFyMi1hbGwtdGVzdGluZy51bWQuZGV2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiUnhcIiksIHJlcXVpcmUoXCJyeGpzL29ic2VydmFibGUvZnJvbVByb21pc2VcIiksIHJlcXVpcmUoXCJyeGpzL29wZXJhdG9yL3RvUHJvbWlzZVwiKSwgcmVxdWlyZShcInJ4anMvc3ViamVjdC9SZXBsYXlTdWJqZWN0XCIpLCByZXF1aXJlKFwicnhqcy9vcGVyYXRvci90YWtlXCIpKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtcIlJ4XCIsIFwicnhqcy9vYnNlcnZhYmxlL2Zyb21Qcm9taXNlXCIsIFwicnhqcy9vcGVyYXRvci90b1Byb21pc2VcIiwgXCJyeGpzL3N1YmplY3QvUmVwbGF5U3ViamVjdFwiLCBcInJ4anMvb3BlcmF0b3IvdGFrZVwiXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJuZ1wiXSA9IGZhY3RvcnkocmVxdWlyZShcIlJ4XCIpLCByZXF1aXJlKFwicnhqcy9vYnNlcnZhYmxlL2Zyb21Qcm9taXNlXCIpLCByZXF1aXJlKFwicnhqcy9vcGVyYXRvci90b1Byb21pc2VcIiksIHJlcXVpcmUoXCJyeGpzL3N1YmplY3QvUmVwbGF5U3ViamVjdFwiKSwgcmVxdWlyZShcInJ4anMvb3BlcmF0b3IvdGFrZVwiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wibmdcIl0gPSBmYWN0b3J5KHJvb3RbXCJSeFwiXSwgcm9vdFtcIlJ4XCJdW1wiT2JzZXJ2YWJsZVwiXSwgcm9vdFtcIlJ4XCJdW1wiT2JzZXJ2YWJsZVwiXVtcInByb3RvdHlwZVwiXSwgcm9vdFtcIlJ4XCJdLCByb290W1wiUnhcIl1bXCJPYnNlcnZhYmxlXCJdW1wicHJvdG90eXBlXCJdKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfNjJfXywgX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV82M19fLCBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzY0X18sIF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfMjc5X18sIF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfMjgwX18pIHtcbnJldHVybiBcblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiB3ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb25cbiAqKi8iLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0ZXhwb3J0czoge30sXG4gXHRcdFx0aWQ6IG1vZHVsZUlkLFxuIFx0XHRcdGxvYWRlZDogZmFsc2VcbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIHdlYnBhY2svYm9vdHN0cmFwIDAwNWE1ZWUyNTAyYzUwNDE4MWI0XG4gKiovIiwiLy8gdGhpcyBidW5kbGUgaXMgYWxtb3N0IGlkZW50aWNhbCB0byB0aGUgYW5ndWxhcjIudW1kLmpzXG4vLyB0aGUgb25seSBkaWZmZXJlbmNlIGJlaW5nIFwidGVzdGluZ1wiIGV4cG9ydFxuZXhwb3J0cy5jb3JlID0gcmVxdWlyZSgnYW5ndWxhcjIvY29yZScpO1xuZXhwb3J0cy5jb21tb24gPSByZXF1aXJlKCdhbmd1bGFyMi9jb21tb24nKTtcbmV4cG9ydHMuY29tcGlsZXIgPSByZXF1aXJlKCdhbmd1bGFyMi9jb21waWxlcicpO1xuZXhwb3J0cy5wbGF0Zm9ybSA9IHtcbiAgYnJvd3NlcjogcmVxdWlyZSgnYW5ndWxhcjIvcGxhdGZvcm0vYnJvd3NlcicpLFxuICBjb21tb25fZG9tOiByZXF1aXJlKCdhbmd1bGFyMi9wbGF0Zm9ybS9jb21tb25fZG9tJylcbn07XG5leHBvcnRzLmh0dHAgPSByZXF1aXJlKCdhbmd1bGFyMi9odHRwJyk7XG5leHBvcnRzLnJvdXRlciA9IHJlcXVpcmUoJ2FuZ3VsYXIyL3JvdXRlcicpO1xuZXhwb3J0cy5yb3V0ZXJfbGlua19kc2wgPSByZXF1aXJlKCdhbmd1bGFyMi9yb3V0ZXIvcm91dGVyX2xpbmtfZHNsLmpzJyk7XG5leHBvcnRzLmluc3RydW1lbnRhdGlvbiA9IHJlcXVpcmUoJ2FuZ3VsYXIyL2luc3RydW1lbnRhdGlvbicpO1xuZXhwb3J0cy51cGdyYWRlID0gcmVxdWlyZSgnYW5ndWxhcjIvdXBncmFkZScpO1xuLy8gdGhpcyBpcyB0aGUgb25seSBkaWZmZXJlbmNlIGFzIGNvbXBhcmVkIHRvIHRoZSBhbmd1bGFyMi1hbGwudW1kLmpzIGJ1bmRsZVxuZXhwb3J0cy50ZXN0aW5nID0gcmVxdWlyZSgnYW5ndWxhcjIvdGVzdGluZycpO1xuZXhwb3J0cy5odHRwLnRlc3RpbmcgPSByZXF1aXJlKCdhbmd1bGFyMi9odHRwL3Rlc3RpbmcnKTtcbmV4cG9ydHMucm91dGVyLnRlc3RpbmcgPSByZXF1aXJlKCdhbmd1bGFyMi9yb3V0ZXIvdGVzdGluZycpO1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL3Rvb2xzL2J1aWxkL3dlYnBhY2svYW5ndWxhcjItYWxsLXRlc3RpbmcudW1kLmpzXG4gKiogbW9kdWxlIGlkID0gMVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLyoqXG4gKiBAbW9kdWxlXG4gKiBAZGVzY3JpcHRpb25cbiAqIFN0YXJ0aW5nIHBvaW50IHRvIGltcG9ydCBhbGwgcHVibGljIGNvcmUgQVBJcy5cbiAqL1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvY29yZS9tZXRhZGF0YSc7XG5leHBvcnQgKiBmcm9tICcuL3NyYy9jb3JlL3V0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvY29yZS9wcm9kX21vZGUnO1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvY29yZS9kaSc7XG5leHBvcnQgKiBmcm9tICcuL3NyYy9mYWNhZGUvZmFjYWRlJztcbmV4cG9ydCB7ZW5hYmxlUHJvZE1vZGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5leHBvcnQge3BsYXRmb3JtLCBjcmVhdGVOZ1pvbmUsIFBsYXRmb3JtUmVmLCBBcHBsaWNhdGlvblJlZn0gZnJvbSAnLi9zcmMvY29yZS9hcHBsaWNhdGlvbl9yZWYnO1xuZXhwb3J0IHtcbiAgQVBQX0lELFxuICBBUFBfQ09NUE9ORU5ULFxuICBBUFBfSU5JVElBTElaRVIsXG4gIFBBQ0tBR0VfUk9PVF9VUkwsXG4gIFBMQVRGT1JNX0lOSVRJQUxJWkVSXG59IGZyb20gJy4vc3JjL2NvcmUvYXBwbGljYXRpb25fdG9rZW5zJztcbmV4cG9ydCAqIGZyb20gJy4vc3JjL2NvcmUvem9uZSc7XG5leHBvcnQgKiBmcm9tICcuL3NyYy9jb3JlL3JlbmRlcic7XG5leHBvcnQgKiBmcm9tICcuL3NyYy9jb3JlL2xpbmtlcic7XG5leHBvcnQge1xuICBEZWJ1Z0VsZW1lbnQsXG4gIFNjb3BlLFxuICBpbnNwZWN0RWxlbWVudCxcbiAgYXNOYXRpdmVFbGVtZW50c1xufSBmcm9tICcuL3NyYy9jb3JlL2RlYnVnL2RlYnVnX2VsZW1lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvY29yZS90ZXN0YWJpbGl0eS90ZXN0YWJpbGl0eSc7XG5leHBvcnQgKiBmcm9tICcuL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvY29yZS9wbGF0Zm9ybV9kaXJlY3RpdmVzX2FuZF9waXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL3NyYy9jb3JlL3BsYXRmb3JtX2NvbW1vbl9wcm92aWRlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvY29yZS9hcHBsaWNhdGlvbl9jb21tb25fcHJvdmlkZXJzJztcbmV4cG9ydCAqIGZyb20gJy4vc3JjL2NvcmUvcmVmbGVjdGlvbi9yZWZsZWN0aW9uJztcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL2NvcmUudHNcbiAqKi8iLCIvKipcbiAqIFRoaXMgaW5kaXJlY3Rpb24gaXMgbmVlZGVkIHRvIGZyZWUgdXAgQ29tcG9uZW50LCBldGMgc3ltYm9scyBpbiB0aGUgcHVibGljIEFQSVxuICogdG8gYmUgdXNlZCBieSB0aGUgZGVjb3JhdG9yIHZlcnNpb25zIG9mIHRoZXNlIGFubm90YXRpb25zLlxuICovXG5cbmV4cG9ydCB7XG4gIFF1ZXJ5TWV0YWRhdGEsXG4gIENvbnRlbnRDaGlsZHJlbk1ldGFkYXRhLFxuICBDb250ZW50Q2hpbGRNZXRhZGF0YSxcbiAgVmlld0NoaWxkcmVuTWV0YWRhdGEsXG4gIFZpZXdRdWVyeU1ldGFkYXRhLFxuICBWaWV3Q2hpbGRNZXRhZGF0YSxcbiAgQXR0cmlidXRlTWV0YWRhdGFcbn0gZnJvbSAnLi9tZXRhZGF0YS9kaSc7XG5cbmV4cG9ydCB7XG4gIENvbXBvbmVudE1ldGFkYXRhLFxuICBEaXJlY3RpdmVNZXRhZGF0YSxcbiAgUGlwZU1ldGFkYXRhLFxuICBJbnB1dE1ldGFkYXRhLFxuICBPdXRwdXRNZXRhZGF0YSxcbiAgSG9zdEJpbmRpbmdNZXRhZGF0YSxcbiAgSG9zdExpc3RlbmVyTWV0YWRhdGFcbn0gZnJvbSAnLi9tZXRhZGF0YS9kaXJlY3RpdmVzJztcblxuZXhwb3J0IHtWaWV3TWV0YWRhdGEsIFZpZXdFbmNhcHN1bGF0aW9ufSBmcm9tICcuL21ldGFkYXRhL3ZpZXcnO1xuXG5pbXBvcnQge1xuICBRdWVyeU1ldGFkYXRhLFxuICBDb250ZW50Q2hpbGRyZW5NZXRhZGF0YSxcbiAgQ29udGVudENoaWxkTWV0YWRhdGEsXG4gIFZpZXdDaGlsZHJlbk1ldGFkYXRhLFxuICBWaWV3Q2hpbGRNZXRhZGF0YSxcbiAgVmlld1F1ZXJ5TWV0YWRhdGEsXG4gIEF0dHJpYnV0ZU1ldGFkYXRhXG59IGZyb20gJy4vbWV0YWRhdGEvZGknO1xuXG5pbXBvcnQge1xuICBDb21wb25lbnRNZXRhZGF0YSxcbiAgRGlyZWN0aXZlTWV0YWRhdGEsXG4gIFBpcGVNZXRhZGF0YSxcbiAgSW5wdXRNZXRhZGF0YSxcbiAgT3V0cHV0TWV0YWRhdGEsXG4gIEhvc3RCaW5kaW5nTWV0YWRhdGEsXG4gIEhvc3RMaXN0ZW5lck1ldGFkYXRhXG59IGZyb20gJy4vbWV0YWRhdGEvZGlyZWN0aXZlcyc7XG5cbmltcG9ydCB7Vmlld01ldGFkYXRhLCBWaWV3RW5jYXBzdWxhdGlvbn0gZnJvbSAnLi9tZXRhZGF0YS92aWV3JztcbmltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3l9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vY2hhbmdlX2RldGVjdGlvbic7XG5cbmltcG9ydCB7XG4gIG1ha2VEZWNvcmF0b3IsXG4gIG1ha2VQYXJhbURlY29yYXRvcixcbiAgbWFrZVByb3BEZWNvcmF0b3IsXG4gIFR5cGVEZWNvcmF0b3IsXG4gIENsYXNzXG59IGZyb20gJy4vdXRpbC9kZWNvcmF0b3JzJztcbmltcG9ydCB7VHlwZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIHRoZSB7QGxpbmsgRGlyZWN0aXZlTWV0YWRhdGF9IGRlY29yYXRvciBmdW5jdGlvbi5cbiAqXG4gKiBTZWUge0BsaW5rIERpcmVjdGl2ZUZhY3Rvcnl9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERpcmVjdGl2ZURlY29yYXRvciBleHRlbmRzIFR5cGVEZWNvcmF0b3Ige31cblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIHRoZSB7QGxpbmsgQ29tcG9uZW50TWV0YWRhdGF9IGRlY29yYXRvciBmdW5jdGlvbi5cbiAqXG4gKiBTZWUge0BsaW5rIENvbXBvbmVudEZhY3Rvcnl9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudERlY29yYXRvciBleHRlbmRzIFR5cGVEZWNvcmF0b3Ige1xuICAvKipcbiAgICogQ2hhaW4ge0BsaW5rIFZpZXdNZXRhZGF0YX0gYW5ub3RhdGlvbi5cbiAgICovXG4gIFZpZXcob2JqOiB7XG4gICAgdGVtcGxhdGVVcmw/OiBzdHJpbmcsXG4gICAgdGVtcGxhdGU/OiBzdHJpbmcsXG4gICAgZGlyZWN0aXZlcz86IEFycmF5PFR5cGUgfCBhbnlbXT4sXG4gICAgcGlwZXM/OiBBcnJheTxUeXBlIHwgYW55W10+LFxuICAgIHJlbmRlcmVyPzogc3RyaW5nLFxuICAgIHN0eWxlcz86IHN0cmluZ1tdLFxuICAgIHN0eWxlVXJscz86IHN0cmluZ1tdLFxuICB9KTogVmlld0RlY29yYXRvcjtcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIHRoZSB7QGxpbmsgVmlld01ldGFkYXRhfSBkZWNvcmF0b3IgZnVuY3Rpb24uXG4gKlxuICogU2VlIHtAbGluayBWaWV3RmFjdG9yeX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlld0RlY29yYXRvciBleHRlbmRzIFR5cGVEZWNvcmF0b3Ige1xuICAvKipcbiAgICogQ2hhaW4ge0BsaW5rIFZpZXdNZXRhZGF0YX0gYW5ub3RhdGlvbi5cbiAgICovXG4gIFZpZXcob2JqOiB7XG4gICAgdGVtcGxhdGVVcmw/OiBzdHJpbmcsXG4gICAgdGVtcGxhdGU/OiBzdHJpbmcsXG4gICAgZGlyZWN0aXZlcz86IEFycmF5PFR5cGUgfCBhbnlbXT4sXG4gICAgcGlwZXM/OiBBcnJheTxUeXBlIHwgYW55W10+LFxuICAgIHJlbmRlcmVyPzogc3RyaW5nLFxuICAgIHN0eWxlcz86IHN0cmluZ1tdLFxuICAgIHN0eWxlVXJscz86IHN0cmluZ1tdLFxuICB9KTogVmlld0RlY29yYXRvcjtcbn1cblxuLyoqXG4gKiB7QGxpbmsgRGlyZWN0aXZlTWV0YWRhdGF9IGZhY3RvcnkgZm9yIGNyZWF0aW5nIGFubm90YXRpb25zLCBkZWNvcmF0b3JzIG9yIERTTC5cbiAqXG4gKiAjIyMgRXhhbXBsZSBhcyBUeXBlU2NyaXB0IERlY29yYXRvclxuICpcbiAqIHtAZXhhbXBsZSBjb3JlL3RzL21ldGFkYXRhL21ldGFkYXRhLnRzIHJlZ2lvbj0nZGlyZWN0aXZlJ31cbiAqXG4gKiAjIyMgRXhhbXBsZSBhcyBFUzUgRFNMXG4gKlxuICogYGBgXG4gKiB2YXIgTXlEaXJlY3RpdmUgPSBuZ1xuICogICAuRGlyZWN0aXZlKHsuLi59KVxuICogICAuQ2xhc3Moe1xuICogICAgIGNvbnN0cnVjdG9yOiBmdW5jdGlvbigpIHtcbiAqICAgICAgIC4uLlxuICogICAgIH1cbiAqICAgfSlcbiAqIGBgYFxuICpcbiAqICMjIyBFeGFtcGxlIGFzIEVTNSBhbm5vdGF0aW9uXG4gKlxuICogYGBgXG4gKiB2YXIgTXlEaXJlY3RpdmUgPSBmdW5jdGlvbigpIHtcbiAqICAgLi4uXG4gKiB9O1xuICpcbiAqIE15RGlyZWN0aXZlLmFubm90YXRpb25zID0gW1xuICogICBuZXcgbmcuRGlyZWN0aXZlKHsuLi59KVxuICogXVxuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGlyZWN0aXZlRmFjdG9yeSB7XG4gIChvYmo6IHtcbiAgICBzZWxlY3Rvcj86IHN0cmluZyxcbiAgICBpbnB1dHM/OiBzdHJpbmdbXSxcbiAgICBvdXRwdXRzPzogc3RyaW5nW10sXG4gICAgcHJvcGVydGllcz86IHN0cmluZ1tdLFxuICAgIGV2ZW50cz86IHN0cmluZ1tdLFxuICAgIGhvc3Q/OiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSxcbiAgICBiaW5kaW5ncz86IGFueVtdLFxuICAgIHByb3ZpZGVycz86IGFueVtdLFxuICAgIGV4cG9ydEFzPzogc3RyaW5nLFxuICAgIHF1ZXJpZXM/OiB7W2tleTogc3RyaW5nXTogYW55fVxuICB9KTogRGlyZWN0aXZlRGVjb3JhdG9yO1xuICBuZXcgKG9iajoge1xuICAgIHNlbGVjdG9yPzogc3RyaW5nLFxuICAgIGlucHV0cz86IHN0cmluZ1tdLFxuICAgIG91dHB1dHM/OiBzdHJpbmdbXSxcbiAgICBwcm9wZXJ0aWVzPzogc3RyaW5nW10sXG4gICAgZXZlbnRzPzogc3RyaW5nW10sXG4gICAgaG9zdD86IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9LFxuICAgIGJpbmRpbmdzPzogYW55W10sXG4gICAgcHJvdmlkZXJzPzogYW55W10sXG4gICAgZXhwb3J0QXM/OiBzdHJpbmcsXG4gICAgcXVlcmllcz86IHtba2V5OiBzdHJpbmddOiBhbnl9XG4gIH0pOiBEaXJlY3RpdmVNZXRhZGF0YTtcbn1cblxuLyoqXG4gKiB7QGxpbmsgQ29tcG9uZW50TWV0YWRhdGF9IGZhY3RvcnkgZm9yIGNyZWF0aW5nIGFubm90YXRpb25zLCBkZWNvcmF0b3JzIG9yIERTTC5cbiAqXG4gKiAjIyMgRXhhbXBsZSBhcyBUeXBlU2NyaXB0IERlY29yYXRvclxuICpcbiAqIHtAZXhhbXBsZSBjb3JlL3RzL21ldGFkYXRhL21ldGFkYXRhLnRzIHJlZ2lvbj0nY29tcG9uZW50J31cbiAqXG4gKiAjIyMgRXhhbXBsZSBhcyBFUzUgRFNMXG4gKlxuICogYGBgXG4gKiB2YXIgTXlDb21wb25lbnQgPSBuZ1xuICogICAuQ29tcG9uZW50KHsuLi59KVxuICogICAuQ2xhc3Moe1xuICogICAgIGNvbnN0cnVjdG9yOiBmdW5jdGlvbigpIHtcbiAqICAgICAgIC4uLlxuICogICAgIH1cbiAqICAgfSlcbiAqIGBgYFxuICpcbiAqICMjIyBFeGFtcGxlIGFzIEVTNSBhbm5vdGF0aW9uXG4gKlxuICogYGBgXG4gKiB2YXIgTXlDb21wb25lbnQgPSBmdW5jdGlvbigpIHtcbiAqICAgLi4uXG4gKiB9O1xuICpcbiAqIE15Q29tcG9uZW50LmFubm90YXRpb25zID0gW1xuICogICBuZXcgbmcuQ29tcG9uZW50KHsuLi59KVxuICogXVxuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50RmFjdG9yeSB7XG4gIChvYmo6IHtcbiAgICBzZWxlY3Rvcj86IHN0cmluZyxcbiAgICBpbnB1dHM/OiBzdHJpbmdbXSxcbiAgICBvdXRwdXRzPzogc3RyaW5nW10sXG4gICAgcHJvcGVydGllcz86IHN0cmluZ1tdLFxuICAgIGV2ZW50cz86IHN0cmluZ1tdLFxuICAgIGhvc3Q/OiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSxcbiAgICAvKiBAZGVwcmVjYXRlZCAqL1xuICAgIGJpbmRpbmdzPzogYW55W10sXG4gICAgcHJvdmlkZXJzPzogYW55W10sXG4gICAgZXhwb3J0QXM/OiBzdHJpbmcsXG4gICAgbW9kdWxlSWQ/OiBzdHJpbmcsXG4gICAgcXVlcmllcz86IHtba2V5OiBzdHJpbmddOiBhbnl9LFxuICAgIHZpZXdCaW5kaW5ncz86IGFueVtdLFxuICAgIHZpZXdQcm92aWRlcnM/OiBhbnlbXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb24/OiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICB0ZW1wbGF0ZVVybD86IHN0cmluZyxcbiAgICB0ZW1wbGF0ZT86IHN0cmluZyxcbiAgICBzdHlsZVVybHM/OiBzdHJpbmdbXSxcbiAgICBzdHlsZXM/OiBzdHJpbmdbXSxcbiAgICBkaXJlY3RpdmVzPzogQXJyYXk8VHlwZSB8IGFueVtdPixcbiAgICBwaXBlcz86IEFycmF5PFR5cGUgfCBhbnlbXT4sXG4gICAgZW5jYXBzdWxhdGlvbj86IFZpZXdFbmNhcHN1bGF0aW9uXG4gIH0pOiBDb21wb25lbnREZWNvcmF0b3I7XG4gIG5ldyAob2JqOiB7XG4gICAgc2VsZWN0b3I/OiBzdHJpbmcsXG4gICAgaW5wdXRzPzogc3RyaW5nW10sXG4gICAgb3V0cHV0cz86IHN0cmluZ1tdLFxuICAgIHByb3BlcnRpZXM/OiBzdHJpbmdbXSxcbiAgICBldmVudHM/OiBzdHJpbmdbXSxcbiAgICBob3N0Pzoge1trZXk6IHN0cmluZ106IHN0cmluZ30sXG4gICAgLyogQGRlcHJlY2F0ZWQgKi9cbiAgICBiaW5kaW5ncz86IGFueVtdLFxuICAgIHByb3ZpZGVycz86IGFueVtdLFxuICAgIGV4cG9ydEFzPzogc3RyaW5nLFxuICAgIG1vZHVsZUlkPzogc3RyaW5nLFxuICAgIHF1ZXJpZXM/OiB7W2tleTogc3RyaW5nXTogYW55fSxcbiAgICAvKiBAZGVwcmVjYXRlZCAqL1xuICAgIHZpZXdCaW5kaW5ncz86IGFueVtdLFxuICAgIHZpZXdQcm92aWRlcnM/OiBhbnlbXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb24/OiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICB0ZW1wbGF0ZVVybD86IHN0cmluZyxcbiAgICB0ZW1wbGF0ZT86IHN0cmluZyxcbiAgICBzdHlsZVVybHM/OiBzdHJpbmdbXSxcbiAgICBzdHlsZXM/OiBzdHJpbmdbXSxcbiAgICBkaXJlY3RpdmVzPzogQXJyYXk8VHlwZSB8IGFueVtdPixcbiAgICBwaXBlcz86IEFycmF5PFR5cGUgfCBhbnlbXT4sXG4gICAgZW5jYXBzdWxhdGlvbj86IFZpZXdFbmNhcHN1bGF0aW9uXG4gIH0pOiBDb21wb25lbnRNZXRhZGF0YTtcbn1cblxuLyoqXG4gKiB7QGxpbmsgVmlld01ldGFkYXRhfSBmYWN0b3J5IGZvciBjcmVhdGluZyBhbm5vdGF0aW9ucywgZGVjb3JhdG9ycyBvciBEU0wuXG4gKlxuICogIyMjIEV4YW1wbGUgYXMgVHlwZVNjcmlwdCBEZWNvcmF0b3JcbiAqXG4gKiBgYGBcbiAqIGltcG9ydCB7Q29tcG9uZW50LCBWaWV3fSBmcm9tIFwiYW5ndWxhcjIvY29yZVwiO1xuICpcbiAqIEBDb21wb25lbnQoey4uLn0pXG4gKiBAVmlldyh7Li4ufSlcbiAqIGNsYXNzIE15Q29tcG9uZW50IHtcbiAqICAgY29uc3RydWN0b3IoKSB7XG4gKiAgICAgLi4uXG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqICMjIyBFeGFtcGxlIGFzIEVTNSBEU0xcbiAqXG4gKiBgYGBcbiAqIHZhciBNeUNvbXBvbmVudCA9IG5nXG4gKiAgIC5Db21wb25lbnQoey4uLn0pXG4gKiAgIC5WaWV3KHsuLi59KVxuICogICAuQ2xhc3Moe1xuICogICAgIGNvbnN0cnVjdG9yOiBmdW5jdGlvbigpIHtcbiAqICAgICAgIC4uLlxuICogICAgIH1cbiAqICAgfSlcbiAqIGBgYFxuICpcbiAqICMjIyBFeGFtcGxlIGFzIEVTNSBhbm5vdGF0aW9uXG4gKlxuICogYGBgXG4gKiB2YXIgTXlDb21wb25lbnQgPSBmdW5jdGlvbigpIHtcbiAqICAgLi4uXG4gKiB9O1xuICpcbiAqIE15Q29tcG9uZW50LmFubm90YXRpb25zID0gW1xuICogICBuZXcgbmcuQ29tcG9uZW50KHsuLi59KSxcbiAqICAgbmV3IG5nLlZpZXcoey4uLn0pXG4gKiBdXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaWV3RmFjdG9yeSB7XG4gIChvYmo6IHtcbiAgICB0ZW1wbGF0ZVVybD86IHN0cmluZyxcbiAgICB0ZW1wbGF0ZT86IHN0cmluZyxcbiAgICBkaXJlY3RpdmVzPzogQXJyYXk8VHlwZSB8IGFueVtdPixcbiAgICBwaXBlcz86IEFycmF5PFR5cGUgfCBhbnlbXT4sXG4gICAgZW5jYXBzdWxhdGlvbj86IFZpZXdFbmNhcHN1bGF0aW9uLFxuICAgIHN0eWxlcz86IHN0cmluZ1tdLFxuICAgIHN0eWxlVXJscz86IHN0cmluZ1tdLFxuICB9KTogVmlld0RlY29yYXRvcjtcbiAgbmV3IChvYmo6IHtcbiAgICB0ZW1wbGF0ZVVybD86IHN0cmluZyxcbiAgICB0ZW1wbGF0ZT86IHN0cmluZyxcbiAgICBkaXJlY3RpdmVzPzogQXJyYXk8VHlwZSB8IGFueVtdPixcbiAgICBwaXBlcz86IEFycmF5PFR5cGUgfCBhbnlbXT4sXG4gICAgZW5jYXBzdWxhdGlvbj86IFZpZXdFbmNhcHN1bGF0aW9uLFxuICAgIHN0eWxlcz86IHN0cmluZ1tdLFxuICAgIHN0eWxlVXJscz86IHN0cmluZ1tdLFxuICB9KTogVmlld01ldGFkYXRhO1xufVxuXG4vKipcbiAqIHtAbGluayBBdHRyaWJ1dGVNZXRhZGF0YX0gZmFjdG9yeSBmb3IgY3JlYXRpbmcgYW5ub3RhdGlvbnMsIGRlY29yYXRvcnMgb3IgRFNMLlxuICpcbiAqICMjIyBFeGFtcGxlIGFzIFR5cGVTY3JpcHQgRGVjb3JhdG9yXG4gKlxuICoge0BleGFtcGxlIGNvcmUvdHMvbWV0YWRhdGEvbWV0YWRhdGEudHMgcmVnaW9uPSdhdHRyaWJ1dGVGYWN0b3J5J31cbiAqXG4gKiAjIyMgRXhhbXBsZSBhcyBFUzUgRFNMXG4gKlxuICogYGBgXG4gKiB2YXIgTXlDb21wb25lbnQgPSBuZ1xuICogICAuQ29tcG9uZW50KHsuLi59KVxuICogICAuQ2xhc3Moe1xuICogICAgIGNvbnN0cnVjdG9yOiBbbmV3IG5nLkF0dHJpYnV0ZSgndGl0bGUnKSwgZnVuY3Rpb24odGl0bGUpIHtcbiAqICAgICAgIC4uLlxuICogICAgIH1dXG4gKiAgIH0pXG4gKiBgYGBcbiAqXG4gKiAjIyMgRXhhbXBsZSBhcyBFUzUgYW5ub3RhdGlvblxuICpcbiAqIGBgYFxuICogdmFyIE15Q29tcG9uZW50ID0gZnVuY3Rpb24odGl0bGUpIHtcbiAqICAgLi4uXG4gKiB9O1xuICpcbiAqIE15Q29tcG9uZW50LmFubm90YXRpb25zID0gW1xuICogICBuZXcgbmcuQ29tcG9uZW50KHsuLi59KVxuICogXVxuICogTXlDb21wb25lbnQucGFyYW1ldGVycyA9IFtcbiAqICAgW25ldyBuZy5BdHRyaWJ1dGUoJ3RpdGxlJyldXG4gKiBdXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdHRyaWJ1dGVGYWN0b3J5IHtcbiAgKG5hbWU6IHN0cmluZyk6IFR5cGVEZWNvcmF0b3I7XG4gIG5ldyAobmFtZTogc3RyaW5nKTogQXR0cmlidXRlTWV0YWRhdGE7XG59XG5cbi8qKlxuICoge0BsaW5rIFF1ZXJ5TWV0YWRhdGF9IGZhY3RvcnkgZm9yIGNyZWF0aW5nIGFubm90YXRpb25zLCBkZWNvcmF0b3JzIG9yIERTTC5cbiAqXG4gKiAjIyMgRXhhbXBsZSBhcyBUeXBlU2NyaXB0IERlY29yYXRvclxuICpcbiAqIGBgYFxuICogaW1wb3J0IHtRdWVyeSwgUXVlcnlMaXN0LCBDb21wb25lbnR9IGZyb20gXCJhbmd1bGFyMi9jb3JlXCI7XG4gKlxuICogQENvbXBvbmVudCh7Li4ufSlcbiAqIGNsYXNzIE15Q29tcG9uZW50IHtcbiAqICAgY29uc3RydWN0b3IoQFF1ZXJ5KFNvbWVUeXBlKSBxdWVyeUxpc3Q6IFF1ZXJ5TGlzdDxTb21lVHlwZT4pIHtcbiAqICAgICAuLi5cbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogIyMjIEV4YW1wbGUgYXMgRVM1IERTTFxuICpcbiAqIGBgYFxuICogdmFyIE15Q29tcG9uZW50ID0gbmdcbiAqICAgLkNvbXBvbmVudCh7Li4ufSlcbiAqICAgLkNsYXNzKHtcbiAqICAgICBjb25zdHJ1Y3RvcjogW25ldyBuZy5RdWVyeShTb21lVHlwZSksIGZ1bmN0aW9uKHF1ZXJ5TGlzdCkge1xuICogICAgICAgLi4uXG4gKiAgICAgfV1cbiAqICAgfSlcbiAqIGBgYFxuICpcbiAqICMjIyBFeGFtcGxlIGFzIEVTNSBhbm5vdGF0aW9uXG4gKlxuICogYGBgXG4gKiB2YXIgTXlDb21wb25lbnQgPSBmdW5jdGlvbihxdWVyeUxpc3QpIHtcbiAqICAgLi4uXG4gKiB9O1xuICpcbiAqIE15Q29tcG9uZW50LmFubm90YXRpb25zID0gW1xuICogICBuZXcgbmcuQ29tcG9uZW50KHsuLi59KVxuICogXVxuICogTXlDb21wb25lbnQucGFyYW1ldGVycyA9IFtcbiAqICAgW25ldyBuZy5RdWVyeShTb21lVHlwZSldXG4gKiBdXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWVyeUZhY3Rvcnkge1xuICAoc2VsZWN0b3I6IFR5cGUgfCBzdHJpbmcsIHtkZXNjZW5kYW50c30/OiB7ZGVzY2VuZGFudHM/OiBib29sZWFufSk6IFBhcmFtZXRlckRlY29yYXRvcjtcbiAgbmV3IChzZWxlY3RvcjogVHlwZSB8IHN0cmluZywge2Rlc2NlbmRhbnRzfT86IHtkZXNjZW5kYW50cz86IGJvb2xlYW59KTogUXVlcnlNZXRhZGF0YTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZvciB7QGxpbmsgQ29udGVudENoaWxkcmVufS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250ZW50Q2hpbGRyZW5GYWN0b3J5IHtcbiAgKHNlbGVjdG9yOiBUeXBlIHwgc3RyaW5nLCB7ZGVzY2VuZGFudHN9Pzoge2Rlc2NlbmRhbnRzPzogYm9vbGVhbn0pOiBhbnk7XG4gIG5ldyAoc2VsZWN0b3I6IFR5cGUgfCBzdHJpbmcsIHtkZXNjZW5kYW50c30/OiB7ZGVzY2VuZGFudHM/OiBib29sZWFufSk6IENvbnRlbnRDaGlsZHJlbk1ldGFkYXRhO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZm9yIHtAbGluayBDb250ZW50Q2hpbGR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRlbnRDaGlsZEZhY3Rvcnkge1xuICAoc2VsZWN0b3I6IFR5cGUgfCBzdHJpbmcpOiBhbnk7XG4gIG5ldyAoc2VsZWN0b3I6IFR5cGUgfCBzdHJpbmcpOiBDb250ZW50Q2hpbGRGYWN0b3J5O1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZm9yIHtAbGluayBWaWV3Q2hpbGRyZW59LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpZXdDaGlsZHJlbkZhY3Rvcnkge1xuICAoc2VsZWN0b3I6IFR5cGUgfCBzdHJpbmcpOiBhbnk7XG4gIG5ldyAoc2VsZWN0b3I6IFR5cGUgfCBzdHJpbmcpOiBWaWV3Q2hpbGRyZW5NZXRhZGF0YTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZvciB7QGxpbmsgVmlld0NoaWxkfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaWV3Q2hpbGRGYWN0b3J5IHtcbiAgKHNlbGVjdG9yOiBUeXBlIHwgc3RyaW5nKTogYW55O1xuICBuZXcgKHNlbGVjdG9yOiBUeXBlIHwgc3RyaW5nKTogVmlld0NoaWxkRmFjdG9yeTtcbn1cblxuXG4vKipcbiAqIHtAbGluayBQaXBlTWV0YWRhdGF9IGZhY3RvcnkgZm9yIGNyZWF0aW5nIGRlY29yYXRvcnMuXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiB7QGV4YW1wbGUgY29yZS90cy9tZXRhZGF0YS9tZXRhZGF0YS50cyByZWdpb249J3BpcGUnfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBpcGVGYWN0b3J5IHtcbiAgKG9iajoge25hbWU6IHN0cmluZywgcHVyZT86IGJvb2xlYW59KTogYW55O1xuICBuZXcgKG9iajoge25hbWU6IHN0cmluZywgcHVyZT86IGJvb2xlYW59KTogYW55O1xufVxuXG4vKipcbiAqIHtAbGluayBJbnB1dE1ldGFkYXRhfSBmYWN0b3J5IGZvciBjcmVhdGluZyBkZWNvcmF0b3JzLlxuICpcbiAqIFNlZSB7QGxpbmsgSW5wdXRNZXRhZGF0YX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5wdXRGYWN0b3J5IHtcbiAgKGJpbmRpbmdQcm9wZXJ0eU5hbWU/OiBzdHJpbmcpOiBhbnk7XG4gIG5ldyAoYmluZGluZ1Byb3BlcnR5TmFtZT86IHN0cmluZyk6IGFueTtcbn1cblxuLyoqXG4gKiB7QGxpbmsgT3V0cHV0TWV0YWRhdGF9IGZhY3RvcnkgZm9yIGNyZWF0aW5nIGRlY29yYXRvcnMuXG4gKlxuICogU2VlIHtAbGluayBPdXRwdXRNZXRhZGF0YX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3V0cHV0RmFjdG9yeSB7XG4gIChiaW5kaW5nUHJvcGVydHlOYW1lPzogc3RyaW5nKTogYW55O1xuICBuZXcgKGJpbmRpbmdQcm9wZXJ0eU5hbWU/OiBzdHJpbmcpOiBhbnk7XG59XG5cbi8qKlxuICoge0BsaW5rIEhvc3RCaW5kaW5nTWV0YWRhdGF9IGZhY3RvcnkgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG9zdEJpbmRpbmdGYWN0b3J5IHtcbiAgKGhvc3RQcm9wZXJ0eU5hbWU/OiBzdHJpbmcpOiBhbnk7XG4gIG5ldyAoaG9zdFByb3BlcnR5TmFtZT86IHN0cmluZyk6IGFueTtcbn1cblxuLyoqXG4gKiB7QGxpbmsgSG9zdExpc3RlbmVyTWV0YWRhdGF9IGZhY3RvcnkgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG9zdExpc3RlbmVyRmFjdG9yeSB7XG4gIChldmVudE5hbWU6IHN0cmluZywgYXJncz86IHN0cmluZ1tdKTogYW55O1xuICBuZXcgKGV2ZW50TmFtZTogc3RyaW5nLCBhcmdzPzogc3RyaW5nW10pOiBhbnk7XG59XG5cbi8vIFRPRE8oYWxleGVhZ2xlKTogcmVtb3ZlIHRoZSBkdXBsaWNhdGlvbiBvZiB0aGlzIGRvYy4gSXQgaXMgY29waWVkIGZyb20gQ29tcG9uZW50TWV0YWRhdGEuXG4vKipcbiAqIERlY2xhcmUgcmV1c2FibGUgVUkgYnVpbGRpbmcgYmxvY2tzIGZvciBhbiBhcHBsaWNhdGlvbi5cbiAqXG4gKiBFYWNoIEFuZ3VsYXIgY29tcG9uZW50IHJlcXVpcmVzIGEgc2luZ2xlIGBAQ29tcG9uZW50YCBhbmQgYXQgbGVhc3Qgb25lIGBAVmlld2AgYW5ub3RhdGlvbi4gVGhlXG4gKiBgQENvbXBvbmVudGBcbiAqIGFubm90YXRpb24gc3BlY2lmaWVzIHdoZW4gYSBjb21wb25lbnQgaXMgaW5zdGFudGlhdGVkLCBhbmQgd2hpY2ggcHJvcGVydGllcyBhbmQgaG9zdExpc3RlbmVycyBpdFxuICogYmluZHMgdG8uXG4gKlxuICogV2hlbiBhIGNvbXBvbmVudCBpcyBpbnN0YW50aWF0ZWQsIEFuZ3VsYXJcbiAqIC0gY3JlYXRlcyBhIHNoYWRvdyBET00gZm9yIHRoZSBjb21wb25lbnQuXG4gKiAtIGxvYWRzIHRoZSBzZWxlY3RlZCB0ZW1wbGF0ZSBpbnRvIHRoZSBzaGFkb3cgRE9NLlxuICogLSBjcmVhdGVzIGFsbCB0aGUgaW5qZWN0YWJsZSBvYmplY3RzIGNvbmZpZ3VyZWQgd2l0aCBgcHJvdmlkZXJzYCBhbmQgYHZpZXdQcm92aWRlcnNgLlxuICpcbiAqIEFsbCB0ZW1wbGF0ZSBleHByZXNzaW9ucyBhbmQgc3RhdGVtZW50cyBhcmUgdGhlbiBldmFsdWF0ZWQgYWdhaW5zdCB0aGUgY29tcG9uZW50IGluc3RhbmNlLlxuICpcbiAqIEZvciBkZXRhaWxzIG9uIHRoZSBgQFZpZXdgIGFubm90YXRpb24sIHNlZSB7QGxpbmsgVmlld01ldGFkYXRhfS5cbiAqXG4gKiAjIyBMaWZlY3ljbGUgaG9va3NcbiAqXG4gKiBXaGVuIHRoZSBjb21wb25lbnQgY2xhc3MgaW1wbGVtZW50cyBzb21lIHtAbGluayBhbmd1bGFyMi9saWZlY3ljbGVfaG9va3N9IHRoZSBjYWxsYmFja3MgYXJlXG4gKiBjYWxsZWQgYnkgdGhlIGNoYW5nZSBkZXRlY3Rpb24gYXQgZGVmaW5lZCBwb2ludHMgaW4gdGltZSBkdXJpbmcgdGhlIGxpZmUgb2YgdGhlIGNvbXBvbmVudC5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIHtAZXhhbXBsZSBjb3JlL3RzL21ldGFkYXRhL21ldGFkYXRhLnRzIHJlZ2lvbj0nY29tcG9uZW50J31cbiAqL1xuZXhwb3J0IHZhciBDb21wb25lbnQ6IENvbXBvbmVudEZhY3RvcnkgPVxuICAgIDxDb21wb25lbnRGYWN0b3J5Pm1ha2VEZWNvcmF0b3IoQ29tcG9uZW50TWV0YWRhdGEsIChmbjogYW55KSA9PiBmbi5WaWV3ID0gVmlldyk7XG5cbi8vIFRPRE8oYWxleGVhZ2xlKTogcmVtb3ZlIHRoZSBkdXBsaWNhdGlvbiBvZiB0aGlzIGRvYy4gSXQgaXMgY29waWVkIGZyb20gRGlyZWN0aXZlTWV0YWRhdGEuXG4vKipcbiAqIERpcmVjdGl2ZXMgYWxsb3cgeW91IHRvIGF0dGFjaCBiZWhhdmlvciB0byBlbGVtZW50cyBpbiB0aGUgRE9NLlxuICpcbiAqIHtAbGluayBEaXJlY3RpdmVNZXRhZGF0YX1zIHdpdGggYW4gZW1iZWRkZWQgdmlldyBhcmUgY2FsbGVkIHtAbGluayBDb21wb25lbnRNZXRhZGF0YX1zLlxuICpcbiAqIEEgZGlyZWN0aXZlIGNvbnNpc3RzIG9mIGEgc2luZ2xlIGRpcmVjdGl2ZSBhbm5vdGF0aW9uIGFuZCBhIGNvbnRyb2xsZXIgY2xhc3MuIFdoZW4gdGhlXG4gKiBkaXJlY3RpdmUncyBgc2VsZWN0b3JgIG1hdGNoZXNcbiAqIGVsZW1lbnRzIGluIHRoZSBET00sIHRoZSBmb2xsb3dpbmcgc3RlcHMgb2NjdXI6XG4gKlxuICogMS4gRm9yIGVhY2ggZGlyZWN0aXZlLCB0aGUgYEVsZW1lbnRJbmplY3RvcmAgYXR0ZW1wdHMgdG8gcmVzb2x2ZSB0aGUgZGlyZWN0aXZlJ3MgY29uc3RydWN0b3JcbiAqIGFyZ3VtZW50cy5cbiAqIDIuIEFuZ3VsYXIgaW5zdGFudGlhdGVzIGRpcmVjdGl2ZXMgZm9yIGVhY2ggbWF0Y2hlZCBlbGVtZW50IHVzaW5nIGBFbGVtZW50SW5qZWN0b3JgIGluIGFcbiAqIGRlcHRoLWZpcnN0IG9yZGVyLFxuICogICAgYXMgZGVjbGFyZWQgaW4gdGhlIEhUTUwuXG4gKlxuICogIyMgVW5kZXJzdGFuZGluZyBIb3cgSW5qZWN0aW9uIFdvcmtzXG4gKlxuICogVGhlcmUgYXJlIHRocmVlIHN0YWdlcyBvZiBpbmplY3Rpb24gcmVzb2x1dGlvbi5cbiAqIC0gKlByZS1leGlzdGluZyBJbmplY3RvcnMqOlxuICogICAtIFRoZSB0ZXJtaW5hbCB7QGxpbmsgSW5qZWN0b3J9IGNhbm5vdCByZXNvbHZlIGRlcGVuZGVuY2llcy4gSXQgZWl0aGVyIHRocm93cyBhbiBlcnJvciBvciwgaWZcbiAqIHRoZSBkZXBlbmRlbmN5IHdhc1xuICogICAgIHNwZWNpZmllZCBhcyBgQE9wdGlvbmFsYCwgcmV0dXJucyBgbnVsbGAuXG4gKiAgIC0gVGhlIHBsYXRmb3JtIGluamVjdG9yIHJlc29sdmVzIGJyb3dzZXIgc2luZ2xldG9uIHJlc291cmNlcywgc3VjaCBhczogY29va2llcywgdGl0bGUsXG4gKiBsb2NhdGlvbiwgYW5kIG90aGVycy5cbiAqIC0gKkNvbXBvbmVudCBJbmplY3RvcnMqOiBFYWNoIGNvbXBvbmVudCBpbnN0YW5jZSBoYXMgaXRzIG93biB7QGxpbmsgSW5qZWN0b3J9LCBhbmQgdGhleSBmb2xsb3dcbiAqIHRoZSBzYW1lIHBhcmVudC1jaGlsZCBoaWVyYXJjaHlcbiAqICAgICBhcyB0aGUgY29tcG9uZW50IGluc3RhbmNlcyBpbiB0aGUgRE9NLlxuICogLSAqRWxlbWVudCBJbmplY3RvcnMqOiBFYWNoIGNvbXBvbmVudCBpbnN0YW5jZSBoYXMgYSBTaGFkb3cgRE9NLiBXaXRoaW4gdGhlIFNoYWRvdyBET00gZWFjaFxuICogZWxlbWVudCBoYXMgYW4gYEVsZW1lbnRJbmplY3RvcmBcbiAqICAgICB3aGljaCBmb2xsb3cgdGhlIHNhbWUgcGFyZW50LWNoaWxkIGhpZXJhcmNoeSBhcyB0aGUgRE9NIGVsZW1lbnRzIHRoZW1zZWx2ZXMuXG4gKlxuICogV2hlbiBhIHRlbXBsYXRlIGlzIGluc3RhbnRpYXRlZCwgaXQgYWxzbyBtdXN0IGluc3RhbnRpYXRlIHRoZSBjb3JyZXNwb25kaW5nIGRpcmVjdGl2ZXMgaW4gYVxuICogZGVwdGgtZmlyc3Qgb3JkZXIuIFRoZVxuICogY3VycmVudCBgRWxlbWVudEluamVjdG9yYCByZXNvbHZlcyB0aGUgY29uc3RydWN0b3IgZGVwZW5kZW5jaWVzIGZvciBlYWNoIGRpcmVjdGl2ZS5cbiAqXG4gKiBBbmd1bGFyIHRoZW4gcmVzb2x2ZXMgZGVwZW5kZW5jaWVzIGFzIGZvbGxvd3MsIGFjY29yZGluZyB0byB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcHBlYXIgaW4gdGhlXG4gKiB7QGxpbmsgVmlld01ldGFkYXRhfTpcbiAqXG4gKiAxLiBEZXBlbmRlbmNpZXMgb24gdGhlIGN1cnJlbnQgZWxlbWVudFxuICogMi4gRGVwZW5kZW5jaWVzIG9uIGVsZW1lbnQgaW5qZWN0b3JzIGFuZCB0aGVpciBwYXJlbnRzIHVudGlsIGl0IGVuY291bnRlcnMgYSBTaGFkb3cgRE9NIGJvdW5kYXJ5XG4gKiAzLiBEZXBlbmRlbmNpZXMgb24gY29tcG9uZW50IGluamVjdG9ycyBhbmQgdGhlaXIgcGFyZW50cyB1bnRpbCBpdCBlbmNvdW50ZXJzIHRoZSByb290IGNvbXBvbmVudFxuICogNC4gRGVwZW5kZW5jaWVzIG9uIHByZS1leGlzdGluZyBpbmplY3RvcnNcbiAqXG4gKlxuICogVGhlIGBFbGVtZW50SW5qZWN0b3JgIGNhbiBpbmplY3Qgb3RoZXIgZGlyZWN0aXZlcywgZWxlbWVudC1zcGVjaWZpYyBzcGVjaWFsIG9iamVjdHMsIG9yIGl0IGNhblxuICogZGVsZWdhdGUgdG8gdGhlIHBhcmVudFxuICogaW5qZWN0b3IuXG4gKlxuICogVG8gaW5qZWN0IG90aGVyIGRpcmVjdGl2ZXMsIGRlY2xhcmUgdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciBhczpcbiAqIC0gYGRpcmVjdGl2ZTpEaXJlY3RpdmVUeXBlYDogYSBkaXJlY3RpdmUgb24gdGhlIGN1cnJlbnQgZWxlbWVudCBvbmx5XG4gKiAtIGBASG9zdCgpIGRpcmVjdGl2ZTpEaXJlY3RpdmVUeXBlYDogYW55IGRpcmVjdGl2ZSB0aGF0IG1hdGNoZXMgdGhlIHR5cGUgYmV0d2VlbiB0aGUgY3VycmVudFxuICogZWxlbWVudCBhbmQgdGhlXG4gKiAgICBTaGFkb3cgRE9NIHJvb3QuXG4gKiAtIGBAUXVlcnkoRGlyZWN0aXZlVHlwZSkgcXVlcnk6UXVlcnlMaXN0PERpcmVjdGl2ZVR5cGU+YDogQSBsaXZlIGNvbGxlY3Rpb24gb2YgZGlyZWN0IGNoaWxkXG4gKiBkaXJlY3RpdmVzLlxuICogLSBgQFF1ZXJ5RGVzY2VuZGFudHMoRGlyZWN0aXZlVHlwZSkgcXVlcnk6UXVlcnlMaXN0PERpcmVjdGl2ZVR5cGU+YDogQSBsaXZlIGNvbGxlY3Rpb24gb2YgYW55XG4gKiBjaGlsZCBkaXJlY3RpdmVzLlxuICpcbiAqIFRvIGluamVjdCBlbGVtZW50LXNwZWNpZmljIHNwZWNpYWwgb2JqZWN0cywgZGVjbGFyZSB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIGFzOlxuICogLSBgZWxlbWVudDogRWxlbWVudFJlZmAgdG8gb2J0YWluIGEgcmVmZXJlbmNlIHRvIGxvZ2ljYWwgZWxlbWVudCBpbiB0aGUgdmlldy5cbiAqIC0gYHZpZXdDb250YWluZXI6IFZpZXdDb250YWluZXJSZWZgIHRvIGNvbnRyb2wgY2hpbGQgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiwgZm9yXG4gKiB7QGxpbmsgRGlyZWN0aXZlTWV0YWRhdGF9IGRpcmVjdGl2ZXMgb25seVxuICogLSBgYmluZGluZ1Byb3BhZ2F0aW9uOiBCaW5kaW5nUHJvcGFnYXRpb25gIHRvIGNvbnRyb2wgY2hhbmdlIGRldGVjdGlvbiBpbiBhIG1vcmUgZ3JhbnVsYXIgd2F5LlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogVGhlIGZvbGxvd2luZyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgZGVwZW5kZW5jeSBpbmplY3Rpb24gcmVzb2x2ZXMgY29uc3RydWN0b3IgYXJndW1lbnRzIGluXG4gKiBwcmFjdGljZS5cbiAqXG4gKlxuICogQXNzdW1lIHRoaXMgSFRNTCB0ZW1wbGF0ZTpcbiAqXG4gKiBgYGBcbiAqIDxkaXYgZGVwZW5kZW5jeT1cIjFcIj5cbiAqICAgPGRpdiBkZXBlbmRlbmN5PVwiMlwiPlxuICogICAgIDxkaXYgZGVwZW5kZW5jeT1cIjNcIiBteS1kaXJlY3RpdmU+XG4gKiAgICAgICA8ZGl2IGRlcGVuZGVuY3k9XCI0XCI+XG4gKiAgICAgICAgIDxkaXYgZGVwZW5kZW5jeT1cIjVcIj48L2Rpdj5cbiAqICAgICAgIDwvZGl2PlxuICogICAgICAgPGRpdiBkZXBlbmRlbmN5PVwiNlwiPjwvZGl2PlxuICogICAgIDwvZGl2PlxuICogICA8L2Rpdj5cbiAqIDwvZGl2PlxuICogYGBgXG4gKlxuICogV2l0aCB0aGUgZm9sbG93aW5nIGBkZXBlbmRlbmN5YCBkZWNvcmF0b3IgYW5kIGBTb21lU2VydmljZWAgaW5qZWN0YWJsZSBjbGFzcy5cbiAqXG4gKiBgYGBcbiAqIEBJbmplY3RhYmxlKClcbiAqIGNsYXNzIFNvbWVTZXJ2aWNlIHtcbiAqIH1cbiAqXG4gKiBARGlyZWN0aXZlKHtcbiAqICAgc2VsZWN0b3I6ICdbZGVwZW5kZW5jeV0nLFxuICogICBpbnB1dHM6IFtcbiAqICAgICAnaWQ6IGRlcGVuZGVuY3knXG4gKiAgIF1cbiAqIH0pXG4gKiBjbGFzcyBEZXBlbmRlbmN5IHtcbiAqICAgaWQ6c3RyaW5nO1xuICogfVxuICogYGBgXG4gKlxuICogTGV0J3Mgc3RlcCB0aHJvdWdoIHRoZSBkaWZmZXJlbnQgd2F5cyBpbiB3aGljaCBgTXlEaXJlY3RpdmVgIGNvdWxkIGJlIGRlY2xhcmVkLi4uXG4gKlxuICpcbiAqICMjIyBObyBpbmplY3Rpb25cbiAqXG4gKiBIZXJlIHRoZSBjb25zdHJ1Y3RvciBpcyBkZWNsYXJlZCB3aXRoIG5vIGFyZ3VtZW50cywgdGhlcmVmb3JlIG5vdGhpbmcgaXMgaW5qZWN0ZWQgaW50b1xuICogYE15RGlyZWN0aXZlYC5cbiAqXG4gKiBgYGBcbiAqIEBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tteS1kaXJlY3RpdmVdJyB9KVxuICogY2xhc3MgTXlEaXJlY3RpdmUge1xuICogICBjb25zdHJ1Y3RvcigpIHtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogVGhpcyBkaXJlY3RpdmUgd291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggbm8gZGVwZW5kZW5jaWVzLlxuICpcbiAqXG4gKiAjIyMgQ29tcG9uZW50LWxldmVsIGluamVjdGlvblxuICpcbiAqIERpcmVjdGl2ZXMgY2FuIGluamVjdCBhbnkgaW5qZWN0YWJsZSBpbnN0YW5jZSBmcm9tIHRoZSBjbG9zZXN0IGNvbXBvbmVudCBpbmplY3RvciBvciBhbnkgb2YgaXRzXG4gKiBwYXJlbnRzLlxuICpcbiAqIEhlcmUsIHRoZSBjb25zdHJ1Y3RvciBkZWNsYXJlcyBhIHBhcmFtZXRlciwgYHNvbWVTZXJ2aWNlYCwgYW5kIGluamVjdHMgdGhlIGBTb21lU2VydmljZWAgdHlwZVxuICogZnJvbSB0aGUgcGFyZW50XG4gKiBjb21wb25lbnQncyBpbmplY3Rvci5cbiAqIGBgYFxuICogQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW215LWRpcmVjdGl2ZV0nIH0pXG4gKiBjbGFzcyBNeURpcmVjdGl2ZSB7XG4gKiAgIGNvbnN0cnVjdG9yKHNvbWVTZXJ2aWNlOiBTb21lU2VydmljZSkge1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBUaGlzIGRpcmVjdGl2ZSB3b3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIGRlcGVuZGVuY3kgb24gYFNvbWVTZXJ2aWNlYC5cbiAqXG4gKlxuICogIyMjIEluamVjdGluZyBhIGRpcmVjdGl2ZSBmcm9tIHRoZSBjdXJyZW50IGVsZW1lbnRcbiAqXG4gKiBEaXJlY3RpdmVzIGNhbiBpbmplY3Qgb3RoZXIgZGlyZWN0aXZlcyBkZWNsYXJlZCBvbiB0aGUgY3VycmVudCBlbGVtZW50LlxuICpcbiAqIGBgYFxuICogQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW215LWRpcmVjdGl2ZV0nIH0pXG4gKiBjbGFzcyBNeURpcmVjdGl2ZSB7XG4gKiAgIGNvbnN0cnVjdG9yKGRlcGVuZGVuY3k6IERlcGVuZGVuY3kpIHtcbiAqICAgICBleHBlY3QoZGVwZW5kZW5jeS5pZCkudG9FcXVhbCgzKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKiBUaGlzIGRpcmVjdGl2ZSB3b3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBgRGVwZW5kZW5jeWAgZGVjbGFyZWQgYXQgdGhlIHNhbWUgZWxlbWVudCwgaW4gdGhpcyBjYXNlXG4gKiBgZGVwZW5kZW5jeT1cIjNcImAuXG4gKlxuICogIyMjIEluamVjdGluZyBhIGRpcmVjdGl2ZSBmcm9tIGFueSBhbmNlc3RvciBlbGVtZW50c1xuICpcbiAqIERpcmVjdGl2ZXMgY2FuIGluamVjdCBvdGhlciBkaXJlY3RpdmVzIGRlY2xhcmVkIG9uIGFueSBhbmNlc3RvciBlbGVtZW50IChpbiB0aGUgY3VycmVudCBTaGFkb3dcbiAqIERPTSksIGkuZS4gb24gdGhlIGN1cnJlbnQgZWxlbWVudCwgdGhlXG4gKiBwYXJlbnQgZWxlbWVudCwgb3IgaXRzIHBhcmVudHMuXG4gKiBgYGBcbiAqIEBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tteS1kaXJlY3RpdmVdJyB9KVxuICogY2xhc3MgTXlEaXJlY3RpdmUge1xuICogICBjb25zdHJ1Y3RvcihASG9zdCgpIGRlcGVuZGVuY3k6IERlcGVuZGVuY3kpIHtcbiAqICAgICBleHBlY3QoZGVwZW5kZW5jeS5pZCkudG9FcXVhbCgyKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogYEBIb3N0YCBjaGVja3MgdGhlIGN1cnJlbnQgZWxlbWVudCwgdGhlIHBhcmVudCwgYXMgd2VsbCBhcyBpdHMgcGFyZW50cyByZWN1cnNpdmVseS4gSWZcbiAqIGBkZXBlbmRlbmN5PVwiMlwiYCBkaWRuJ3RcbiAqIGV4aXN0IG9uIHRoZSBkaXJlY3QgcGFyZW50LCB0aGlzIGluamVjdGlvbiB3b3VsZFxuICogaGF2ZSByZXR1cm5lZFxuICogYGRlcGVuZGVuY3k9XCIxXCJgLlxuICpcbiAqXG4gKiAjIyMgSW5qZWN0aW5nIGEgbGl2ZSBjb2xsZWN0aW9uIG9mIGRpcmVjdCBjaGlsZCBkaXJlY3RpdmVzXG4gKlxuICpcbiAqIEEgZGlyZWN0aXZlIGNhbiBhbHNvIHF1ZXJ5IGZvciBvdGhlciBjaGlsZCBkaXJlY3RpdmVzLiBTaW5jZSBwYXJlbnQgZGlyZWN0aXZlcyBhcmUgaW5zdGFudGlhdGVkXG4gKiBiZWZvcmUgY2hpbGQgZGlyZWN0aXZlcywgYSBkaXJlY3RpdmUgY2FuJ3Qgc2ltcGx5IGluamVjdCB0aGUgbGlzdCBvZiBjaGlsZCBkaXJlY3RpdmVzLiBJbnN0ZWFkLFxuICogdGhlIGRpcmVjdGl2ZSBpbmplY3RzIGEge0BsaW5rIFF1ZXJ5TGlzdH0sIHdoaWNoIHVwZGF0ZXMgaXRzIGNvbnRlbnRzIGFzIGNoaWxkcmVuIGFyZSBhZGRlZCxcbiAqIHJlbW92ZWQsIG9yIG1vdmVkIGJ5IGEgZGlyZWN0aXZlIHRoYXQgdXNlcyBhIHtAbGluayBWaWV3Q29udGFpbmVyUmVmfSBzdWNoIGFzIGEgYG5nRm9yYCwgYW5cbiAqIGBuZ0lmYCwgb3IgYW4gYG5nU3dpdGNoYC5cbiAqXG4gKiBgYGBcbiAqIEBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tteS1kaXJlY3RpdmVdJyB9KVxuICogY2xhc3MgTXlEaXJlY3RpdmUge1xuICogICBjb25zdHJ1Y3RvcihAUXVlcnkoRGVwZW5kZW5jeSkgZGVwZW5kZW5jaWVzOlF1ZXJ5TGlzdDxEZXBlbmRlbmN5Pikge1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBUaGlzIGRpcmVjdGl2ZSB3b3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIHtAbGluayBRdWVyeUxpc3R9IHdoaWNoIGNvbnRhaW5zIGBEZXBlbmRlbmN5YCA0IGFuZFxuICogNi4gSGVyZSwgYERlcGVuZGVuY3lgIDUgd291bGQgbm90IGJlIGluY2x1ZGVkLCBiZWNhdXNlIGl0IGlzIG5vdCBhIGRpcmVjdCBjaGlsZC5cbiAqXG4gKiAjIyMgSW5qZWN0aW5nIGEgbGl2ZSBjb2xsZWN0aW9uIG9mIGRlc2NlbmRhbnQgZGlyZWN0aXZlc1xuICpcbiAqIEJ5IHBhc3NpbmcgdGhlIGRlc2NlbmRhbnQgZmxhZyB0byBgQFF1ZXJ5YCBhYm92ZSwgd2UgY2FuIGluY2x1ZGUgdGhlIGNoaWxkcmVuIG9mIHRoZSBjaGlsZFxuICogZWxlbWVudHMuXG4gKlxuICogYGBgXG4gKiBARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbbXktZGlyZWN0aXZlXScgfSlcbiAqIGNsYXNzIE15RGlyZWN0aXZlIHtcbiAqICAgY29uc3RydWN0b3IoQFF1ZXJ5KERlcGVuZGVuY3ksIHtkZXNjZW5kYW50czogdHJ1ZX0pIGRlcGVuZGVuY2llczpRdWVyeUxpc3Q8RGVwZW5kZW5jeT4pIHtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogVGhpcyBkaXJlY3RpdmUgd291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggYSBRdWVyeSB3aGljaCB3b3VsZCBjb250YWluIGBEZXBlbmRlbmN5YCA0LCA1IGFuZCA2LlxuICpcbiAqICMjIyBPcHRpb25hbCBpbmplY3Rpb25cbiAqXG4gKiBUaGUgbm9ybWFsIGJlaGF2aW9yIG9mIGRpcmVjdGl2ZXMgaXMgdG8gcmV0dXJuIGFuIGVycm9yIHdoZW4gYSBzcGVjaWZpZWQgZGVwZW5kZW5jeSBjYW5ub3QgYmVcbiAqIHJlc29sdmVkLiBJZiB5b3VcbiAqIHdvdWxkIGxpa2UgdG8gaW5qZWN0IGBudWxsYCBvbiB1bnJlc29sdmVkIGRlcGVuZGVuY3kgaW5zdGVhZCwgeW91IGNhbiBhbm5vdGF0ZSB0aGF0IGRlcGVuZGVuY3lcbiAqIHdpdGggYEBPcHRpb25hbCgpYC5cbiAqIFRoaXMgZXhwbGljaXRseSBwZXJtaXRzIHRoZSBhdXRob3Igb2YgYSB0ZW1wbGF0ZSB0byB0cmVhdCBzb21lIG9mIHRoZSBzdXJyb3VuZGluZyBkaXJlY3RpdmVzIGFzXG4gKiBvcHRpb25hbC5cbiAqXG4gKiBgYGBcbiAqIEBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tteS1kaXJlY3RpdmVdJyB9KVxuICogY2xhc3MgTXlEaXJlY3RpdmUge1xuICogICBjb25zdHJ1Y3RvcihAT3B0aW9uYWwoKSBkZXBlbmRlbmN5OkRlcGVuZGVuY3kpIHtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogVGhpcyBkaXJlY3RpdmUgd291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggYSBgRGVwZW5kZW5jeWAgZGlyZWN0aXZlIGZvdW5kIG9uIHRoZSBjdXJyZW50IGVsZW1lbnQuXG4gKiBJZiBub25lIGNhbiBiZVxuICogZm91bmQsIHRoZSBpbmplY3RvciBzdXBwbGllcyBgbnVsbGAgaW5zdGVhZCBvZiB0aHJvd2luZyBhbiBlcnJvci5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIEhlcmUgd2UgdXNlIGEgZGVjb3JhdG9yIGRpcmVjdGl2ZSB0byBzaW1wbHkgZGVmaW5lIGJhc2ljIHRvb2wtdGlwIGJlaGF2aW9yLlxuICpcbiAqIGBgYFxuICogQERpcmVjdGl2ZSh7XG4gKiAgIHNlbGVjdG9yOiAnW3Rvb2x0aXBdJyxcbiAqICAgaW5wdXRzOiBbXG4gKiAgICAgJ3RleHQ6IHRvb2x0aXAnXG4gKiAgIF0sXG4gKiAgIGhvc3Q6IHtcbiAqICAgICAnKG1vdXNlZW50ZXIpJzogJ29uTW91c2VFbnRlcigpJyxcbiAqICAgICAnKG1vdXNlbGVhdmUpJzogJ29uTW91c2VMZWF2ZSgpJ1xuICogICB9XG4gKiB9KVxuICogY2xhc3MgVG9vbHRpcHtcbiAqICAgdGV4dDpzdHJpbmc7XG4gKiAgIG92ZXJsYXk6T3ZlcmxheTsgLy8gTk9UIFlFVCBJTVBMRU1FTlRFRFxuICogICBvdmVybGF5TWFuYWdlcjpPdmVybGF5TWFuYWdlcjsgLy8gTk9UIFlFVCBJTVBMRU1FTlRFRFxuICpcbiAqICAgY29uc3RydWN0b3Iob3ZlcmxheU1hbmFnZXI6T3ZlcmxheU1hbmFnZXIpIHtcbiAqICAgICB0aGlzLm92ZXJsYXkgPSBvdmVybGF5O1xuICogICB9XG4gKlxuICogICBvbk1vdXNlRW50ZXIoKSB7XG4gKiAgICAgLy8gZXhhY3Qgc2lnbmF0dXJlIHRvIGJlIGRldGVybWluZWRcbiAqICAgICB0aGlzLm92ZXJsYXkgPSB0aGlzLm92ZXJsYXlNYW5hZ2VyLm9wZW4odGV4dCwgLi4uKTtcbiAqICAgfVxuICpcbiAqICAgb25Nb3VzZUxlYXZlKCkge1xuICogICAgIHRoaXMub3ZlcmxheS5jbG9zZSgpO1xuICogICAgIHRoaXMub3ZlcmxheSA9IG51bGw7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICogSW4gb3VyIEhUTUwgdGVtcGxhdGUsIHdlIGNhbiB0aGVuIGFkZCB0aGlzIGJlaGF2aW9yIHRvIGEgYDxkaXY+YCBvciBhbnkgb3RoZXIgZWxlbWVudCB3aXRoIHRoZVxuICogYHRvb2x0aXBgIHNlbGVjdG9yLFxuICogbGlrZSBzbzpcbiAqXG4gKiBgYGBcbiAqIDxkaXYgdG9vbHRpcD1cInNvbWUgdGV4dCBoZXJlXCI+PC9kaXY+XG4gKiBgYGBcbiAqXG4gKiBEaXJlY3RpdmVzIGNhbiBhbHNvIGNvbnRyb2wgdGhlIGluc3RhbnRpYXRpb24sIGRlc3RydWN0aW9uLCBhbmQgcG9zaXRpb25pbmcgb2YgaW5saW5lIHRlbXBsYXRlXG4gKiBlbGVtZW50czpcbiAqXG4gKiBBIGRpcmVjdGl2ZSB1c2VzIGEge0BsaW5rIFZpZXdDb250YWluZXJSZWZ9IHRvIGluc3RhbnRpYXRlLCBpbnNlcnQsIG1vdmUsIGFuZCBkZXN0cm95IHZpZXdzIGF0XG4gKiBydW50aW1lLlxuICogVGhlIHtAbGluayBWaWV3Q29udGFpbmVyUmVmfSBpcyBjcmVhdGVkIGFzIGEgcmVzdWx0IG9mIGA8dGVtcGxhdGU+YCBlbGVtZW50LCBhbmQgcmVwcmVzZW50cyBhXG4gKiBsb2NhdGlvbiBpbiB0aGUgY3VycmVudCB2aWV3XG4gKiB3aGVyZSB0aGVzZSBhY3Rpb25zIGFyZSBwZXJmb3JtZWQuXG4gKlxuICogVmlld3MgYXJlIGFsd2F5cyBjcmVhdGVkIGFzIGNoaWxkcmVuIG9mIHRoZSBjdXJyZW50IHtAbGluayBWaWV3TWV0YWRhdGF9LCBhbmQgYXMgc2libGluZ3Mgb2YgdGhlXG4gKiBgPHRlbXBsYXRlPmAgZWxlbWVudC4gVGh1cyBhXG4gKiBkaXJlY3RpdmUgaW4gYSBjaGlsZCB2aWV3IGNhbm5vdCBpbmplY3QgdGhlIGRpcmVjdGl2ZSB0aGF0IGNyZWF0ZWQgaXQuXG4gKlxuICogU2luY2UgZGlyZWN0aXZlcyB0aGF0IGNyZWF0ZSB2aWV3cyB2aWEgVmlld0NvbnRhaW5lcnMgYXJlIGNvbW1vbiBpbiBBbmd1bGFyLCBhbmQgdXNpbmcgdGhlIGZ1bGxcbiAqIGA8dGVtcGxhdGU+YCBlbGVtZW50IHN5bnRheCBpcyB3b3JkeSwgQW5ndWxhclxuICogYWxzbyBzdXBwb3J0cyBhIHNob3J0aGFuZCBub3RhdGlvbjogYDxsaSAqZm9vPVwiYmFyXCI+YCBhbmQgYDxsaSB0ZW1wbGF0ZT1cImZvbzogYmFyXCI+YCBhcmVcbiAqIGVxdWl2YWxlbnQuXG4gKlxuICogVGh1cyxcbiAqXG4gKiBgYGBcbiAqIDx1bD5cbiAqICAgPGxpICpmb289XCJiYXJcIiB0aXRsZT1cInRleHRcIj48L2xpPlxuICogPC91bD5cbiAqIGBgYFxuICpcbiAqIEV4cGFuZHMgaW4gdXNlIHRvOlxuICpcbiAqIGBgYFxuICogPHVsPlxuICogICA8dGVtcGxhdGUgW2Zvb109XCJiYXJcIj5cbiAqICAgICA8bGkgdGl0bGU9XCJ0ZXh0XCI+PC9saT5cbiAqICAgPC90ZW1wbGF0ZT5cbiAqIDwvdWw+XG4gKiBgYGBcbiAqXG4gKiBOb3RpY2UgdGhhdCBhbHRob3VnaCB0aGUgc2hvcnRoYW5kIHBsYWNlcyBgKmZvbz1cImJhclwiYCB3aXRoaW4gdGhlIGA8bGk+YCBlbGVtZW50LCB0aGUgYmluZGluZyBmb3JcbiAqIHRoZSBkaXJlY3RpdmVcbiAqIGNvbnRyb2xsZXIgaXMgY29ycmVjdGx5IGluc3RhbnRpYXRlZCBvbiB0aGUgYDx0ZW1wbGF0ZT5gIGVsZW1lbnQgcmF0aGVyIHRoYW4gdGhlIGA8bGk+YCBlbGVtZW50LlxuICpcbiAqICMjIExpZmVjeWNsZSBob29rc1xuICpcbiAqIFdoZW4gdGhlIGRpcmVjdGl2ZSBjbGFzcyBpbXBsZW1lbnRzIHNvbWUge0BsaW5rIGFuZ3VsYXIyL2xpZmVjeWNsZV9ob29rc30gdGhlIGNhbGxiYWNrcyBhcmVcbiAqIGNhbGxlZCBieSB0aGUgY2hhbmdlIGRldGVjdGlvbiBhdCBkZWZpbmVkIHBvaW50cyBpbiB0aW1lIGR1cmluZyB0aGUgbGlmZSBvZiB0aGUgZGlyZWN0aXZlLlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogTGV0J3Mgc3VwcG9zZSB3ZSB3YW50IHRvIGltcGxlbWVudCB0aGUgYHVubGVzc2AgYmVoYXZpb3IsIHRvIGNvbmRpdGlvbmFsbHkgaW5jbHVkZSBhIHRlbXBsYXRlLlxuICpcbiAqIEhlcmUgaXMgYSBzaW1wbGUgZGlyZWN0aXZlIHRoYXQgdHJpZ2dlcnMgb24gYW4gYHVubGVzc2Agc2VsZWN0b3I6XG4gKlxuICogYGBgXG4gKiBARGlyZWN0aXZlKHtcbiAqICAgc2VsZWN0b3I6ICdbdW5sZXNzXScsXG4gKiAgIGlucHV0czogWyd1bmxlc3MnXVxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBVbmxlc3Mge1xuICogICB2aWV3Q29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmO1xuICogICB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY7XG4gKiAgIHByZXZDb25kaXRpb246IGJvb2xlYW47XG4gKlxuICogICBjb25zdHJ1Y3Rvcih2aWV3Q29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmLCB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWYpIHtcbiAqICAgICB0aGlzLnZpZXdDb250YWluZXIgPSB2aWV3Q29udGFpbmVyO1xuICogICAgIHRoaXMudGVtcGxhdGVSZWYgPSB0ZW1wbGF0ZVJlZjtcbiAqICAgICB0aGlzLnByZXZDb25kaXRpb24gPSBudWxsO1xuICogICB9XG4gKlxuICogICBzZXQgdW5sZXNzKG5ld0NvbmRpdGlvbikge1xuICogICAgIGlmIChuZXdDb25kaXRpb24gJiYgKGlzQmxhbmsodGhpcy5wcmV2Q29uZGl0aW9uKSB8fCAhdGhpcy5wcmV2Q29uZGl0aW9uKSkge1xuICogICAgICAgdGhpcy5wcmV2Q29uZGl0aW9uID0gdHJ1ZTtcbiAqICAgICAgIHRoaXMudmlld0NvbnRhaW5lci5jbGVhcigpO1xuICogICAgIH0gZWxzZSBpZiAoIW5ld0NvbmRpdGlvbiAmJiAoaXNCbGFuayh0aGlzLnByZXZDb25kaXRpb24pIHx8IHRoaXMucHJldkNvbmRpdGlvbikpIHtcbiAqICAgICAgIHRoaXMucHJldkNvbmRpdGlvbiA9IGZhbHNlO1xuICogICAgICAgdGhpcy52aWV3Q29udGFpbmVyLmNyZWF0ZSh0aGlzLnRlbXBsYXRlUmVmKTtcbiAqICAgICB9XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqIFdlIGNhbiB0aGVuIHVzZSB0aGlzIGB1bmxlc3NgIHNlbGVjdG9yIGluIGEgdGVtcGxhdGU6XG4gKiBgYGBcbiAqIDx1bD5cbiAqICAgPGxpICp1bmxlc3M9XCJleHByXCI+PC9saT5cbiAqIDwvdWw+XG4gKiBgYGBcbiAqXG4gKiBPbmNlIHRoZSBkaXJlY3RpdmUgaW5zdGFudGlhdGVzIHRoZSBjaGlsZCB2aWV3LCB0aGUgc2hvcnRoYW5kIG5vdGF0aW9uIGZvciB0aGUgdGVtcGxhdGUgZXhwYW5kc1xuICogYW5kIHRoZSByZXN1bHQgaXM6XG4gKlxuICogYGBgXG4gKiA8dWw+XG4gKiAgIDx0ZW1wbGF0ZSBbdW5sZXNzXT1cImV4cFwiPlxuICogICAgIDxsaT48L2xpPlxuICogICA8L3RlbXBsYXRlPlxuICogICA8bGk+PC9saT5cbiAqIDwvdWw+XG4gKiBgYGBcbiAqXG4gKiBOb3RlIGFsc28gdGhhdCBhbHRob3VnaCB0aGUgYDxsaT48L2xpPmAgdGVtcGxhdGUgc3RpbGwgZXhpc3RzIGluc2lkZSB0aGUgYDx0ZW1wbGF0ZT48L3RlbXBsYXRlPmAsXG4gKiB0aGUgaW5zdGFudGlhdGVkXG4gKiB2aWV3IG9jY3VycyBvbiB0aGUgc2Vjb25kIGA8bGk+PC9saT5gIHdoaWNoIGlzIGEgc2libGluZyB0byB0aGUgYDx0ZW1wbGF0ZT5gIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCB2YXIgRGlyZWN0aXZlOiBEaXJlY3RpdmVGYWN0b3J5ID0gPERpcmVjdGl2ZUZhY3Rvcnk+bWFrZURlY29yYXRvcihEaXJlY3RpdmVNZXRhZGF0YSk7XG5cbi8vIFRPRE8oYWxleGVhZ2xlKTogcmVtb3ZlIHRoZSBkdXBsaWNhdGlvbiBvZiB0aGlzIGRvYy4gSXQgaXMgY29waWVkIGZyb20gVmlld01ldGFkYXRhLlxuLyoqXG4gKiBNZXRhZGF0YSBwcm9wZXJ0aWVzIGF2YWlsYWJsZSBmb3IgY29uZmlndXJpbmcgVmlld3MuXG4gKlxuICogRWFjaCBBbmd1bGFyIGNvbXBvbmVudCByZXF1aXJlcyBhIHNpbmdsZSBgQENvbXBvbmVudGAgYW5kIGF0IGxlYXN0IG9uZSBgQFZpZXdgIGFubm90YXRpb24uIFRoZVxuICogYEBWaWV3YCBhbm5vdGF0aW9uIHNwZWNpZmllcyB0aGUgSFRNTCB0ZW1wbGF0ZSB0byB1c2UsIGFuZCBsaXN0cyB0aGUgZGlyZWN0aXZlcyB0aGF0IGFyZSBhY3RpdmVcbiAqIHdpdGhpbiB0aGUgdGVtcGxhdGUuXG4gKlxuICogV2hlbiBhIGNvbXBvbmVudCBpcyBpbnN0YW50aWF0ZWQsIHRoZSB0ZW1wbGF0ZSBpcyBsb2FkZWQgaW50byB0aGUgY29tcG9uZW50J3Mgc2hhZG93IHJvb3QsIGFuZFxuICogdGhlIGV4cHJlc3Npb25zIGFuZCBzdGF0ZW1lbnRzIGluIHRoZSB0ZW1wbGF0ZSBhcmUgZXZhbHVhdGVkIGFnYWluc3QgdGhlIGNvbXBvbmVudC5cbiAqXG4gKiBGb3IgZGV0YWlscyBvbiB0aGUgYEBDb21wb25lbnRgIGFubm90YXRpb24sIHNlZSB7QGxpbmsgQ29tcG9uZW50TWV0YWRhdGF9LlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogYGBgXG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICdncmVldCcsXG4gKiAgIHRlbXBsYXRlOiAnSGVsbG8ge3tuYW1lfX0hJyxcbiAqICAgZGlyZWN0aXZlczogW0dyZWV0VXNlciwgQm9sZF1cbiAqIH0pXG4gKiBjbGFzcyBHcmVldCB7XG4gKiAgIG5hbWU6IHN0cmluZztcbiAqXG4gKiAgIGNvbnN0cnVjdG9yKCkge1xuICogICAgIHRoaXMubmFtZSA9ICdXb3JsZCc7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgdmFyIFZpZXc6IFZpZXdGYWN0b3J5ID1cbiAgICA8Vmlld0ZhY3Rvcnk+bWFrZURlY29yYXRvcihWaWV3TWV0YWRhdGEsIChmbjogYW55KSA9PiBmbi5WaWV3ID0gVmlldyk7XG5cbi8qKlxuICogU3BlY2lmaWVzIHRoYXQgYSBjb25zdGFudCBhdHRyaWJ1dGUgdmFsdWUgc2hvdWxkIGJlIGluamVjdGVkLlxuICpcbiAqIFRoZSBkaXJlY3RpdmUgY2FuIGluamVjdCBjb25zdGFudCBzdHJpbmcgbGl0ZXJhbHMgb2YgaG9zdCBlbGVtZW50IGF0dHJpYnV0ZXMuXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBTdXBwb3NlIHdlIGhhdmUgYW4gYDxpbnB1dD5gIGVsZW1lbnQgYW5kIHdhbnQgdG8ga25vdyBpdHMgYHR5cGVgLlxuICpcbiAqIGBgYGh0bWxcbiAqIDxpbnB1dCB0eXBlPVwidGV4dFwiPlxuICogYGBgXG4gKlxuICogQSBkZWNvcmF0b3IgY2FuIGluamVjdCBzdHJpbmcgbGl0ZXJhbCBgdGV4dGAgbGlrZSBzbzpcbiAqXG4gKiB7QGV4YW1wbGUgY29yZS90cy9tZXRhZGF0YS9tZXRhZGF0YS50cyByZWdpb249J2F0dHJpYnV0ZU1ldGFkYXRhJ31cbiAqL1xuZXhwb3J0IHZhciBBdHRyaWJ1dGU6IEF0dHJpYnV0ZUZhY3RvcnkgPSBtYWtlUGFyYW1EZWNvcmF0b3IoQXR0cmlidXRlTWV0YWRhdGEpO1xuXG4vLyBUT0RPKGFsZXhlYWdsZSk6IHJlbW92ZSB0aGUgZHVwbGljYXRpb24gb2YgdGhpcyBkb2MuIEl0IGlzIGNvcGllZCBmcm9tIFF1ZXJ5TWV0YWRhdGEuXG4vKipcbiAqIERlY2xhcmVzIGFuIGluamVjdGFibGUgcGFyYW1ldGVyIHRvIGJlIGEgbGl2ZSBsaXN0IG9mIGRpcmVjdGl2ZXMgb3IgdmFyaWFibGVcbiAqIGJpbmRpbmdzIGZyb20gdGhlIGNvbnRlbnQgY2hpbGRyZW4gb2YgYSBkaXJlY3RpdmUuXG4gKlxuICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L2xZOW04SEx5N3owNnZEb1VhU04yP3A9cHJldmlldykpXG4gKlxuICogQXNzdW1lIHRoYXQgYDx0YWJzPmAgY29tcG9uZW50IHdvdWxkIGxpa2UgdG8gZ2V0IGEgbGlzdCBpdHMgY2hpbGRyZW4gYDxwYW5lPmBcbiAqIGNvbXBvbmVudHMgYXMgc2hvd24gaW4gdGhpcyBleGFtcGxlOlxuICpcbiAqIGBgYGh0bWxcbiAqIDx0YWJzPlxuICogICA8cGFuZSB0aXRsZT1cIk92ZXJ2aWV3XCI+Li4uPC9wYW5lPlxuICogICA8cGFuZSAqbmdGb3I9XCIjbyBvZiBvYmplY3RzXCIgW3RpdGxlXT1cIm8udGl0bGVcIj57e28udGV4dH19PC9wYW5lPlxuICogPC90YWJzPlxuICogYGBgXG4gKlxuICogVGhlIHByZWZlcnJlZCBzb2x1dGlvbiBpcyB0byBxdWVyeSBmb3IgYFBhbmVgIGRpcmVjdGl2ZXMgdXNpbmcgdGhpcyBkZWNvcmF0b3IuXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAncGFuZScsXG4gKiAgIGlucHV0czogWyd0aXRsZSddXG4gKiB9KVxuICogY2xhc3MgUGFuZSB7XG4gKiAgIHRpdGxlOnN0cmluZztcbiAqIH1cbiAqXG4gKiBAQ29tcG9uZW50KHtcbiAqICBzZWxlY3RvcjogJ3RhYnMnLFxuICogIHRlbXBsYXRlOiBgXG4gKiAgICA8dWw+XG4gKiAgICAgIDxsaSAqbmdGb3I9XCIjcGFuZSBvZiBwYW5lc1wiPnt7cGFuZS50aXRsZX19PC9saT5cbiAqICAgIDwvdWw+XG4gKiAgICA8Y29udGVudD48L2NvbnRlbnQ+XG4gKiAgYFxuICogfSlcbiAqIGNsYXNzIFRhYnMge1xuICogICBwYW5lczogUXVlcnlMaXN0PFBhbmU+O1xuICogICBjb25zdHJ1Y3RvcihAUXVlcnkoUGFuZSkgcGFuZXM6UXVlcnlMaXN0PFBhbmU+KSB7XG4gKiAgICAgdGhpcy5wYW5lcyA9IHBhbmVzO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBBIHF1ZXJ5IGNhbiBsb29rIGZvciB2YXJpYWJsZSBiaW5kaW5ncyBieSBwYXNzaW5nIGluIGEgc3RyaW5nIHdpdGggZGVzaXJlZCBiaW5kaW5nIHN5bWJvbC5cbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvc1QyajI1Y0gxZFVSQXlCUkNLeDE/cD1wcmV2aWV3KSlcbiAqIGBgYGh0bWxcbiAqIDxzZWVrZXI+XG4gKiAgIDxkaXYgI2ZpbmRtZT4uLi48L2Rpdj5cbiAqIDwvc2Vla2VyPlxuICpcbiAqIEBDb21wb25lbnQoeyBzZWxlY3RvcjogJ2ZvbycgfSlcbiAqIGNsYXNzIHNlZWtlciB7XG4gKiAgIGNvbnN0cnVjdG9yKEBRdWVyeSgnZmluZG1lJykgZWxMaXN0OiBRdWVyeUxpc3Q8RWxlbWVudFJlZj4pIHsuLi59XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBJbiB0aGlzIGNhc2UgdGhlIG9iamVjdCB0aGF0IGlzIGluamVjdGVkIGRlcGVuZCBvbiB0aGUgdHlwZSBvZiB0aGUgdmFyaWFibGVcbiAqIGJpbmRpbmcuIEl0IGNhbiBiZSBhbiBFbGVtZW50UmVmLCBhIGRpcmVjdGl2ZSBvciBhIGNvbXBvbmVudC5cbiAqXG4gKiBQYXNzaW5nIGluIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgdmFyaWFibGUgYmluZGluZ3Mgd2lsbCBxdWVyeSBmb3IgYWxsIG9mIHRoZW0uXG4gKlxuICogYGBgaHRtbFxuICogPHNlZWtlcj5cbiAqICAgPGRpdiAjZmluZE1lPi4uLjwvZGl2PlxuICogICA8ZGl2ICNmaW5kTWVUb28+Li4uPC9kaXY+XG4gKiA8L3NlZWtlcj5cbiAqXG4gKiAgQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAnZm9vJ1xuICogfSlcbiAqIGNsYXNzIFNlZWtlciB7XG4gKiAgIGNvbnN0cnVjdG9yKEBRdWVyeSgnZmluZE1lLCBmaW5kTWVUb28nKSBlbExpc3Q6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPikgey4uLn1cbiAqIH1cbiAqIGBgYFxuICpcbiAqIENvbmZpZ3VyZSB3aGV0aGVyIHF1ZXJ5IGxvb2tzIGZvciBkaXJlY3QgY2hpbGRyZW4gb3IgYWxsIGRlc2NlbmRhbnRzXG4gKiBvZiB0aGUgcXVlcnlpbmcgZWxlbWVudCwgYnkgdXNpbmcgdGhlIGBkZXNjZW5kYW50c2AgcGFyYW1ldGVyLlxuICogSXQgaXMgc2V0IHRvIGBmYWxzZWAgYnkgZGVmYXVsdC5cbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvd3RHZUI5NzdidjdxdkE1RlRZbDk/cD1wcmV2aWV3KSlcbiAqIGBgYGh0bWxcbiAqIDxjb250YWluZXIgI2ZpcnN0PlxuICogICA8aXRlbT5hPC9pdGVtPlxuICogICA8aXRlbT5iPC9pdGVtPlxuICogICA8Y29udGFpbmVyICNzZWNvbmQ+XG4gKiAgICAgPGl0ZW0+YzwvaXRlbT5cbiAqICAgPC9jb250YWluZXI+XG4gKiA8L2NvbnRhaW5lcj5cbiAqIGBgYFxuICpcbiAqIFdoZW4gcXVlcnlpbmcgZm9yIGl0ZW1zLCB0aGUgZmlyc3QgY29udGFpbmVyIHdpbGwgc2VlIG9ubHkgYGFgIGFuZCBgYmAgYnkgZGVmYXVsdCxcbiAqIGJ1dCB3aXRoIGBRdWVyeShUZXh0RGlyZWN0aXZlLCB7ZGVzY2VuZGFudHM6IHRydWV9KWAgaXQgd2lsbCBzZWUgYGNgIHRvby5cbiAqXG4gKiBUaGUgcXVlcmllZCBkaXJlY3RpdmVzIGFyZSBrZXB0IGluIGEgZGVwdGgtZmlyc3QgcHJlLW9yZGVyIHdpdGggcmVzcGVjdCB0byB0aGVpclxuICogcG9zaXRpb25zIGluIHRoZSBET00uXG4gKlxuICogUXVlcnkgZG9lcyBub3QgbG9vayBkZWVwIGludG8gYW55IHN1YmNvbXBvbmVudCB2aWV3cy5cbiAqXG4gKiBRdWVyeSBpcyB1cGRhdGVkIGFzIHBhcnQgb2YgdGhlIGNoYW5nZS1kZXRlY3Rpb24gY3ljbGUuIFNpbmNlIGNoYW5nZSBkZXRlY3Rpb25cbiAqIGhhcHBlbnMgYWZ0ZXIgY29uc3RydWN0aW9uIG9mIGEgZGlyZWN0aXZlLCBRdWVyeUxpc3Qgd2lsbCBhbHdheXMgYmUgZW1wdHkgd2hlbiBvYnNlcnZlZCBpbiB0aGVcbiAqIGNvbnN0cnVjdG9yLlxuICpcbiAqIFRoZSBpbmplY3RlZCBvYmplY3QgaXMgYW4gdW5tb2RpZmlhYmxlIGxpdmUgbGlzdC5cbiAqIFNlZSB7QGxpbmsgUXVlcnlMaXN0fSBmb3IgbW9yZSBkZXRhaWxzLlxuICovXG5leHBvcnQgdmFyIFF1ZXJ5OiBRdWVyeUZhY3RvcnkgPSBtYWtlUGFyYW1EZWNvcmF0b3IoUXVlcnlNZXRhZGF0YSk7XG5cbi8vIFRPRE8oYWxleGVhZ2xlKTogcmVtb3ZlIHRoZSBkdXBsaWNhdGlvbiBvZiB0aGlzIGRvYy4gSXQgaXMgY29waWVkIGZyb20gQ29udGVudENoaWxkcmVuTWV0YWRhdGEuXG4vKipcbiAqIENvbmZpZ3VyZXMgYSBjb250ZW50IHF1ZXJ5LlxuICpcbiAqIENvbnRlbnQgcXVlcmllcyBhcmUgc2V0IGJlZm9yZSB0aGUgYG5nQWZ0ZXJDb250ZW50SW5pdGAgY2FsbGJhY2sgaXMgY2FsbGVkLlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogYGBgXG4gKiBARGlyZWN0aXZlKHtcbiAqICAgc2VsZWN0b3I6ICdzb21lRGlyJ1xuICogfSlcbiAqIGNsYXNzIFNvbWVEaXIge1xuICogICBAQ29udGVudENoaWxkcmVuKENoaWxkRGlyZWN0aXZlKSBjb250ZW50Q2hpbGRyZW46IFF1ZXJ5TGlzdDxDaGlsZERpcmVjdGl2ZT47XG4gKlxuICogICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gKiAgICAgLy8gY29udGVudENoaWxkcmVuIGlzIHNldFxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IHZhciBDb250ZW50Q2hpbGRyZW46IENvbnRlbnRDaGlsZHJlbkZhY3RvcnkgPSBtYWtlUHJvcERlY29yYXRvcihDb250ZW50Q2hpbGRyZW5NZXRhZGF0YSk7XG5cbi8vIFRPRE8oYWxleGVhZ2xlKTogcmVtb3ZlIHRoZSBkdXBsaWNhdGlvbiBvZiB0aGlzIGRvYy4gSXQgaXMgY29waWVkIGZyb20gQ29udGVudENoaWxkTWV0YWRhdGEuXG4vKipcbiAqIENvbmZpZ3VyZXMgYSBjb250ZW50IHF1ZXJ5LlxuICpcbiAqIENvbnRlbnQgcXVlcmllcyBhcmUgc2V0IGJlZm9yZSB0aGUgYG5nQWZ0ZXJDb250ZW50SW5pdGAgY2FsbGJhY2sgaXMgY2FsbGVkLlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogYGBgXG4gKiBARGlyZWN0aXZlKHtcbiAqICAgc2VsZWN0b3I6ICdzb21lRGlyJ1xuICogfSlcbiAqIGNsYXNzIFNvbWVEaXIge1xuICogICBAQ29udGVudENoaWxkKENoaWxkRGlyZWN0aXZlKSBjb250ZW50Q2hpbGQ7XG4gKlxuICogICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gKiAgICAgLy8gY29udGVudENoaWxkIGlzIHNldFxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IHZhciBDb250ZW50Q2hpbGQ6IENvbnRlbnRDaGlsZEZhY3RvcnkgPSBtYWtlUHJvcERlY29yYXRvcihDb250ZW50Q2hpbGRNZXRhZGF0YSk7XG5cbi8vIFRPRE8oYWxleGVhZ2xlKTogcmVtb3ZlIHRoZSBkdXBsaWNhdGlvbiBvZiB0aGlzIGRvYy4gSXQgaXMgY29waWVkIGZyb20gVmlld0NoaWxkcmVuTWV0YWRhdGEuXG4vKipcbiAqIENvbmZpZ3VyZXMgYSB2aWV3IHF1ZXJ5LlxuICpcbiAqIFZpZXcgcXVlcmllcyBhcmUgc2V0IGJlZm9yZSB0aGUgYG5nQWZ0ZXJWaWV3SW5pdGAgY2FsbGJhY2sgaXMgY2FsbGVkLlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogYGBgXG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICdzb21lRGlyJyxcbiAqICAgdGVtcGxhdGVVcmw6ICdzb21lVGVtcGxhdGUnLFxuICogICBkaXJlY3RpdmVzOiBbSXRlbURpcmVjdGl2ZV1cbiAqIH0pXG4gKiBjbGFzcyBTb21lRGlyIHtcbiAqICAgQFZpZXdDaGlsZHJlbihJdGVtRGlyZWN0aXZlKSB2aWV3Q2hpbGRyZW46IFF1ZXJ5TGlzdDxJdGVtRGlyZWN0aXZlPjtcbiAqXG4gKiAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAqICAgICAvLyB2aWV3Q2hpbGRyZW4gaXMgc2V0XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgdmFyIFZpZXdDaGlsZHJlbjogVmlld0NoaWxkcmVuRmFjdG9yeSA9IG1ha2VQcm9wRGVjb3JhdG9yKFZpZXdDaGlsZHJlbk1ldGFkYXRhKTtcblxuLy8gVE9ETyhhbGV4ZWFnbGUpOiByZW1vdmUgdGhlIGR1cGxpY2F0aW9uIG9mIHRoaXMgZG9jLiBJdCBpcyBjb3BpZWQgZnJvbSBWaWV3Q2hpbGRNZXRhZGF0YS5cbi8qKlxuICogQ29uZmlndXJlcyBhIHZpZXcgcXVlcnkuXG4gKlxuICogVmlldyBxdWVyaWVzIGFyZSBzZXQgYmVmb3JlIHRoZSBgbmdBZnRlclZpZXdJbml0YCBjYWxsYmFjayBpcyBjYWxsZWQuXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGBcbiAqIEBDb21wb25lbnQoe1xuICogICBzZWxlY3RvcjogJ3NvbWVEaXInLFxuICogICB0ZW1wbGF0ZVVybDogJ3NvbWVUZW1wbGF0ZScsXG4gKiAgIGRpcmVjdGl2ZXM6IFtJdGVtRGlyZWN0aXZlXVxuICogfSlcbiAqIGNsYXNzIFNvbWVEaXIge1xuICogICBAVmlld0NoaWxkKEl0ZW1EaXJlY3RpdmUpIHZpZXdDaGlsZDpJdGVtRGlyZWN0aXZlO1xuICpcbiAqICAgbmdBZnRlclZpZXdJbml0KCkge1xuICogICAgIC8vIHZpZXdDaGlsZCBpcyBzZXRcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCB2YXIgVmlld0NoaWxkOiBWaWV3Q2hpbGRGYWN0b3J5ID0gbWFrZVByb3BEZWNvcmF0b3IoVmlld0NoaWxkTWV0YWRhdGEpO1xuXG4vLyBUT0RPKGFsZXhlYWdsZSk6IHJlbW92ZSB0aGUgZHVwbGljYXRpb24gb2YgdGhpcyBkb2MuIEl0IGlzIGNvcGllZCBmcm9tIFZpZXdRdWVyeU1ldGFkYXRhLlxuLyoqXG4gKiBTaW1pbGFyIHRvIHtAbGluayBRdWVyeU1ldGFkYXRhfSwgYnV0IHF1ZXJ5aW5nIHRoZSBjb21wb25lbnQgdmlldywgaW5zdGVhZCBvZlxuICogdGhlIGNvbnRlbnQgY2hpbGRyZW4uXG4gKlxuICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L2VOc0ZIRGY3WWp5TTZJekt4TTFqP3A9cHJldmlldykpXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogQENvbXBvbmVudCh7Li4ufSlcbiAqIEBWaWV3KHtcbiAqICAgdGVtcGxhdGU6IGBcbiAqICAgICA8aXRlbT4gYSA8L2l0ZW0+XG4gKiAgICAgPGl0ZW0+IGIgPC9pdGVtPlxuICogICAgIDxpdGVtPiBjIDwvaXRlbT5cbiAqICAgYFxuICogfSlcbiAqIGNsYXNzIE15Q29tcG9uZW50IHtcbiAqICAgc2hvd246IGJvb2xlYW47XG4gKlxuICogICBjb25zdHJ1Y3Rvcihwcml2YXRlIEBRdWVyeShJdGVtKSBpdGVtczpRdWVyeUxpc3Q8SXRlbT4pIHtcbiAqICAgICBpdGVtcy5vbkNoYW5nZSgoKSA9PiBjb25zb2xlLmxvZyhpdGVtcy5sZW5ndGgpKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogU3VwcG9ydHMgdGhlIHNhbWUgcXVlcnlpbmcgcGFyYW1ldGVycyBhcyB7QGxpbmsgUXVlcnlNZXRhZGF0YX0sIGV4Y2VwdFxuICogYGRlc2NlbmRhbnRzYC4gVGhpcyBhbHdheXMgcXVlcmllcyB0aGUgd2hvbGUgdmlldy5cbiAqXG4gKiBBcyBgc2hvd25gIGlzIGZsaXBwZWQgYmV0d2VlbiB0cnVlIGFuZCBmYWxzZSwgaXRlbXMgd2lsbCBjb250YWluIHplcm8gb2Ygb25lXG4gKiBpdGVtcy5cbiAqXG4gKiBTcGVjaWZpZXMgdGhhdCBhIHtAbGluayBRdWVyeUxpc3R9IHNob3VsZCBiZSBpbmplY3RlZC5cbiAqXG4gKiBUaGUgaW5qZWN0ZWQgb2JqZWN0IGlzIGFuIGl0ZXJhYmxlIGFuZCBvYnNlcnZhYmxlIGxpdmUgbGlzdC5cbiAqIFNlZSB7QGxpbmsgUXVlcnlMaXN0fSBmb3IgbW9yZSBkZXRhaWxzLlxuICovXG5leHBvcnQgdmFyIFZpZXdRdWVyeTogUXVlcnlGYWN0b3J5ID0gbWFrZVBhcmFtRGVjb3JhdG9yKFZpZXdRdWVyeU1ldGFkYXRhKTtcblxuLy8gVE9ETyhhbGV4ZWFnbGUpOiByZW1vdmUgdGhlIGR1cGxpY2F0aW9uIG9mIHRoaXMgZG9jLiBJdCBpcyBjb3BpZWQgZnJvbSBQaXBlTWV0YWRhdGEuXG4vKipcbiAqIERlY2xhcmUgcmV1c2FibGUgcGlwZSBmdW5jdGlvbi5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIHtAZXhhbXBsZSBjb3JlL3RzL21ldGFkYXRhL21ldGFkYXRhLnRzIHJlZ2lvbj0ncGlwZSd9XG4gKi9cbmV4cG9ydCB2YXIgUGlwZTogUGlwZUZhY3RvcnkgPSA8UGlwZUZhY3Rvcnk+bWFrZURlY29yYXRvcihQaXBlTWV0YWRhdGEpO1xuXG4vLyBUT0RPKGFsZXhlYWdsZSk6IHJlbW92ZSB0aGUgZHVwbGljYXRpb24gb2YgdGhpcyBkb2MuIEl0IGlzIGNvcGllZCBmcm9tIElucHV0TWV0YWRhdGEuXG4vKipcbiAqIERlY2xhcmVzIGEgZGF0YS1ib3VuZCBpbnB1dCBwcm9wZXJ0eS5cbiAqXG4gKiBBbmd1bGFyIGF1dG9tYXRpY2FsbHkgdXBkYXRlcyBkYXRhLWJvdW5kIHByb3BlcnRpZXMgZHVyaW5nIGNoYW5nZSBkZXRlY3Rpb24uXG4gKlxuICogYElucHV0TWV0YWRhdGFgIHRha2VzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciB0aGF0IHNwZWNpZmllcyB0aGUgbmFtZVxuICogdXNlZCB3aGVuIGluc3RhbnRpYXRpbmcgYSBjb21wb25lbnQgaW4gdGhlIHRlbXBsYXRlLiBXaGVuIG5vdCBwcm92aWRlZCxcbiAqIHRoZSBuYW1lIG9mIHRoZSBkZWNvcmF0ZWQgcHJvcGVydHkgaXMgdXNlZC5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBjcmVhdGVzIGEgY29tcG9uZW50IHdpdGggdHdvIGlucHV0IHByb3BlcnRpZXMuXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAnYmFuay1hY2NvdW50JyxcbiAqICAgdGVtcGxhdGU6IGBcbiAqICAgICBCYW5rIE5hbWU6IHt7YmFua05hbWV9fVxuICogICAgIEFjY291bnQgSWQ6IHt7aWR9fVxuICogICBgXG4gKiB9KVxuICogY2xhc3MgQmFua0FjY291bnQge1xuICogICBASW5wdXQoKSBiYW5rTmFtZTogc3RyaW5nO1xuICogICBASW5wdXQoJ2FjY291bnQtaWQnKSBpZDogc3RyaW5nO1xuICpcbiAqICAgLy8gdGhpcyBwcm9wZXJ0eSBpcyBub3QgYm91bmQsIGFuZCB3b24ndCBiZSBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgYnkgQW5ndWxhclxuICogICBub3JtYWxpemVkQmFua05hbWU6IHN0cmluZztcbiAqIH1cbiAqXG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICdhcHAnLFxuICogICB0ZW1wbGF0ZTogYFxuICogICAgIDxiYW5rLWFjY291bnQgYmFuay1uYW1lPVwiUkJDXCIgYWNjb3VudC1pZD1cIjQ3NDdcIj48L2JhbmstYWNjb3VudD5cbiAqICAgYCxcbiAqICAgZGlyZWN0aXZlczogW0JhbmtBY2NvdW50XVxuICogfSlcbiAqIGNsYXNzIEFwcCB7fVxuICpcbiAqIGJvb3RzdHJhcChBcHApO1xuICogYGBgXG4gKi9cbmV4cG9ydCB2YXIgSW5wdXQ6IElucHV0RmFjdG9yeSA9IG1ha2VQcm9wRGVjb3JhdG9yKElucHV0TWV0YWRhdGEpO1xuXG4vLyBUT0RPKGFsZXhlYWdsZSk6IHJlbW92ZSB0aGUgZHVwbGljYXRpb24gb2YgdGhpcyBkb2MuIEl0IGlzIGNvcGllZCBmcm9tIE91dHB1dE1ldGFkYXRhLlxuLyoqXG4gKiBEZWNsYXJlcyBhbiBldmVudC1ib3VuZCBvdXRwdXQgcHJvcGVydHkuXG4gKlxuICogV2hlbiBhbiBvdXRwdXQgcHJvcGVydHkgZW1pdHMgYW4gZXZlbnQsIGFuIGV2ZW50IGhhbmRsZXIgYXR0YWNoZWQgdG8gdGhhdCBldmVudFxuICogdGhlIHRlbXBsYXRlIGlzIGludm9rZWQuXG4gKlxuICogYE91dHB1dE1ldGFkYXRhYCB0YWtlcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgdGhhdCBzcGVjaWZpZXMgdGhlIG5hbWVcbiAqIHVzZWQgd2hlbiBpbnN0YW50aWF0aW5nIGEgY29tcG9uZW50IGluIHRoZSB0ZW1wbGF0ZS4gV2hlbiBub3QgcHJvdmlkZWQsXG4gKiB0aGUgbmFtZSBvZiB0aGUgZGVjb3JhdGVkIHByb3BlcnR5IGlzIHVzZWQuXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBARGlyZWN0aXZlKHtcbiAqICAgc2VsZWN0b3I6ICdpbnRlcnZhbC1kaXInLFxuICogfSlcbiAqIGNsYXNzIEludGVydmFsRGlyIHtcbiAqICAgQE91dHB1dCgpIGV2ZXJ5U2Vjb25kID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICogICBAT3V0cHV0KCdldmVyeUZpdmVTZWNvbmRzJykgZml2ZTVTZWNzID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICpcbiAqICAgY29uc3RydWN0b3IoKSB7XG4gKiAgICAgc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy5ldmVyeVNlY29uZC5lbWl0KFwiZXZlbnRcIiksIDEwMDApO1xuICogICAgIHNldEludGVydmFsKCgpID0+IHRoaXMuZml2ZTVTZWNzLmVtaXQoXCJldmVudFwiKSwgNTAwMCk7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICdhcHAnLFxuICogICB0ZW1wbGF0ZTogYFxuICogICAgIDxpbnRlcnZhbC1kaXIgKGV2ZXJ5LXNlY29uZCk9XCJldmVyeVNlY29uZCgpXCIgKGV2ZXJ5LWZpdmUtc2Vjb25kcyk9XCJldmVyeUZpdmVTZWNvbmRzKClcIj5cbiAqICAgICA8L2ludGVydmFsLWRpcj5cbiAqICAgYCxcbiAqICAgZGlyZWN0aXZlczogW0ludGVydmFsRGlyXVxuICogfSlcbiAqIGNsYXNzIEFwcCB7XG4gKiAgIGV2ZXJ5U2Vjb25kKCkgeyBjb25zb2xlLmxvZygnc2Vjb25kJyk7IH1cbiAqICAgZXZlcnlGaXZlU2Vjb25kcygpIHsgY29uc29sZS5sb2coJ2ZpdmUgc2Vjb25kcycpOyB9XG4gKiB9XG4gKiBib290c3RyYXAoQXBwKTtcbiAqIGBgYFxuICovXG5leHBvcnQgdmFyIE91dHB1dDogT3V0cHV0RmFjdG9yeSA9IG1ha2VQcm9wRGVjb3JhdG9yKE91dHB1dE1ldGFkYXRhKTtcblxuLy8gVE9ETyhhbGV4ZWFnbGUpOiByZW1vdmUgdGhlIGR1cGxpY2F0aW9uIG9mIHRoaXMgZG9jLiBJdCBpcyBjb3BpZWQgZnJvbSBIb3N0QmluZGluZ01ldGFkYXRhLlxuLyoqXG4gKiBEZWNsYXJlcyBhIGhvc3QgcHJvcGVydHkgYmluZGluZy5cbiAqXG4gKiBBbmd1bGFyIGF1dG9tYXRpY2FsbHkgY2hlY2tzIGhvc3QgcHJvcGVydHkgYmluZGluZ3MgZHVyaW5nIGNoYW5nZSBkZXRlY3Rpb24uXG4gKiBJZiBhIGJpbmRpbmcgY2hhbmdlcywgaXQgd2lsbCB1cGRhdGUgdGhlIGhvc3QgZWxlbWVudCBvZiB0aGUgZGlyZWN0aXZlLlxuICpcbiAqIGBIb3N0QmluZGluZ01ldGFkYXRhYCB0YWtlcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgdGhhdCBzcGVjaWZpZXMgdGhlIHByb3BlcnR5XG4gKiBuYW1lIG9mIHRoZSBob3N0IGVsZW1lbnQgdGhhdCB3aWxsIGJlIHVwZGF0ZWQuIFdoZW4gbm90IHByb3ZpZGVkLFxuICogdGhlIGNsYXNzIHByb3BlcnR5IG5hbWUgaXMgdXNlZC5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBjcmVhdGVzIGEgZGlyZWN0aXZlIHRoYXQgc2V0cyB0aGUgYHZhbGlkYCBhbmQgYGludmFsaWRgIGNsYXNzZXNcbiAqIG9uIHRoZSBET00gZWxlbWVudCB0aGF0IGhhcyBuZ01vZGVsIGRpcmVjdGl2ZSBvbiBpdC5cbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBARGlyZWN0aXZlKHtzZWxlY3RvcjogJ1tuZ01vZGVsXSd9KVxuICogY2xhc3MgTmdNb2RlbFN0YXR1cyB7XG4gKiAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250cm9sOk5nTW9kZWwpIHt9XG4gKiAgIEBIb3N0QmluZGluZygnW2NsYXNzLnZhbGlkXScpIGdldCB2YWxpZCB7IHJldHVybiB0aGlzLmNvbnRyb2wudmFsaWQ7IH1cbiAqICAgQEhvc3RCaW5kaW5nKCdbY2xhc3MuaW52YWxpZF0nKSBnZXQgaW52YWxpZCB7IHJldHVybiB0aGlzLmNvbnRyb2wuaW52YWxpZDsgfVxuICogfVxuICpcbiAqIEBDb21wb25lbnQoe1xuICogICBzZWxlY3RvcjogJ2FwcCcsXG4gKiAgIHRlbXBsYXRlOiBgPGlucHV0IFsobmdNb2RlbCldPVwicHJvcFwiPmAsXG4gKiAgIGRpcmVjdGl2ZXM6IFtGT1JNX0RJUkVDVElWRVMsIE5nTW9kZWxTdGF0dXNdXG4gKiB9KVxuICogY2xhc3MgQXBwIHtcbiAqICAgcHJvcDtcbiAqIH1cbiAqXG4gKiBib290c3RyYXAoQXBwKTtcbiAqIGBgYFxuICovXG5leHBvcnQgdmFyIEhvc3RCaW5kaW5nOiBIb3N0QmluZGluZ0ZhY3RvcnkgPSBtYWtlUHJvcERlY29yYXRvcihIb3N0QmluZGluZ01ldGFkYXRhKTtcblxuLy8gVE9ETyhhbGV4ZWFnbGUpOiByZW1vdmUgdGhlIGR1cGxpY2F0aW9uIG9mIHRoaXMgZG9jLiBJdCBpcyBjb3BpZWQgZnJvbSBIb3N0TGlzdGVuZXJNZXRhZGF0YS5cbi8qKlxuICogRGVjbGFyZXMgYSBob3N0IGxpc3RlbmVyLlxuICpcbiAqIEFuZ3VsYXIgd2lsbCBpbnZva2UgdGhlIGRlY29yYXRlZCBtZXRob2Qgd2hlbiB0aGUgaG9zdCBlbGVtZW50IGVtaXRzIHRoZSBzcGVjaWZpZWQgZXZlbnQuXG4gKlxuICogSWYgdGhlIGRlY29yYXRlZCBtZXRob2QgcmV0dXJucyBgZmFsc2VgLCB0aGVuIGBwcmV2ZW50RGVmYXVsdGAgaXMgYXBwbGllZCBvbiB0aGUgRE9NXG4gKiBldmVudC5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZWNsYXJlcyBhIGRpcmVjdGl2ZSB0aGF0IGF0dGFjaGVzIGEgY2xpY2sgbGlzdGVuZXIgdG8gdGhlIGJ1dHRvbiBhbmRcbiAqIGNvdW50cyBjbGlja3MuXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogQERpcmVjdGl2ZSh7c2VsZWN0b3I6ICdidXR0b25bY291bnRpbmddJ30pXG4gKiBjbGFzcyBDb3VudENsaWNrcyB7XG4gKiAgIG51bWJlck9mQ2xpY2tzID0gMDtcbiAqXG4gKiAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQudGFyZ2V0J10pXG4gKiAgIG9uQ2xpY2soYnRuKSB7XG4gKiAgICAgY29uc29sZS5sb2coXCJidXR0b25cIiwgYnRuLCBcIm51bWJlciBvZiBjbGlja3M6XCIsIHRoaXMubnVtYmVyT2ZDbGlja3MrKyk7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICdhcHAnLFxuICogICB0ZW1wbGF0ZTogYDxidXR0b24gY291bnRpbmc+SW5jcmVtZW50PC9idXR0b24+YCxcbiAqICAgZGlyZWN0aXZlczogW0NvdW50Q2xpY2tzXVxuICogfSlcbiAqIGNsYXNzIEFwcCB7fVxuICpcbiAqIGJvb3RzdHJhcChBcHApO1xuICogYGBgXG4gKi9cbmV4cG9ydCB2YXIgSG9zdExpc3RlbmVyOiBIb3N0TGlzdGVuZXJGYWN0b3J5ID0gbWFrZVByb3BEZWNvcmF0b3IoSG9zdExpc3RlbmVyTWV0YWRhdGEpO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvbWV0YWRhdGEudHNcbiAqKi8iLCJpbXBvcnQge0NPTlNULCBUeXBlLCBzdHJpbmdpZnksIGlzUHJlc2VudCwgaXNTdHJpbmd9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge3Jlc29sdmVGb3J3YXJkUmVmfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5pbXBvcnQge0RlcGVuZGVuY3lNZXRhZGF0YX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvZGkvbWV0YWRhdGEnO1xuXG4vKipcbiAqIFNwZWNpZmllcyB0aGF0IGEgY29uc3RhbnQgYXR0cmlidXRlIHZhbHVlIHNob3VsZCBiZSBpbmplY3RlZC5cbiAqXG4gKiBUaGUgZGlyZWN0aXZlIGNhbiBpbmplY3QgY29uc3RhbnQgc3RyaW5nIGxpdGVyYWxzIG9mIGhvc3QgZWxlbWVudCBhdHRyaWJ1dGVzLlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogU3VwcG9zZSB3ZSBoYXZlIGFuIGA8aW5wdXQ+YCBlbGVtZW50IGFuZCB3YW50IHRvIGtub3cgaXRzIGB0eXBlYC5cbiAqXG4gKiBgYGBodG1sXG4gKiA8aW5wdXQgdHlwZT1cInRleHRcIj5cbiAqIGBgYFxuICpcbiAqIEEgZGVjb3JhdG9yIGNhbiBpbmplY3Qgc3RyaW5nIGxpdGVyYWwgYHRleHRgIGxpa2Ugc286XG4gKlxuICoge0BleGFtcGxlIGNvcmUvdHMvbWV0YWRhdGEvbWV0YWRhdGEudHMgcmVnaW9uPSdhdHRyaWJ1dGVNZXRhZGF0YSd9XG4gKi9cbkBDT05TVCgpXG5leHBvcnQgY2xhc3MgQXR0cmlidXRlTWV0YWRhdGEgZXh0ZW5kcyBEZXBlbmRlbmN5TWV0YWRhdGEge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgYXR0cmlidXRlTmFtZTogc3RyaW5nKSB7IHN1cGVyKCk7IH1cblxuICBnZXQgdG9rZW4oKTogQXR0cmlidXRlTWV0YWRhdGEge1xuICAgIC8vIE5vcm1hbGx5IG9uZSB3b3VsZCBkZWZhdWx0IGEgdG9rZW4gdG8gYSB0eXBlIG9mIGFuIGluamVjdGVkIHZhbHVlIGJ1dCBoZXJlXG4gICAgLy8gdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBcInN0cmluZ1wiIGFuZCB3ZSBjYW4ndCB1c2UgcHJpbWl0aXZlIHR5cGUgYXMgYSByZXR1cm4gdmFsdWVcbiAgICAvLyBzbyB3ZSB1c2UgaW5zdGFuY2Ugb2YgQXR0cmlidXRlIGluc3RlYWQuIFRoaXMgZG9lc24ndCBtYXR0ZXIgbXVjaCBpbiBwcmFjdGljZSBhcyBhcmd1bWVudHNcbiAgICAvLyB3aXRoIEBBdHRyaWJ1dGUgYW5ub3RhdGlvbiBhcmUgaW5qZWN0ZWQgYnkgRWxlbWVudEluamVjdG9yIHRoYXQgZG9lc24ndCB0YWtlIHRva2VucyBpbnRvXG4gICAgLy8gYWNjb3VudC5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICB0b1N0cmluZygpOiBzdHJpbmcgeyByZXR1cm4gYEBBdHRyaWJ1dGUoJHtzdHJpbmdpZnkodGhpcy5hdHRyaWJ1dGVOYW1lKX0pYDsgfVxufVxuXG4vKipcbiAqIERlY2xhcmVzIGFuIGluamVjdGFibGUgcGFyYW1ldGVyIHRvIGJlIGEgbGl2ZSBsaXN0IG9mIGRpcmVjdGl2ZXMgb3IgdmFyaWFibGVcbiAqIGJpbmRpbmdzIGZyb20gdGhlIGNvbnRlbnQgY2hpbGRyZW4gb2YgYSBkaXJlY3RpdmUuXG4gKlxuICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L2xZOW04SEx5N3owNnZEb1VhU04yP3A9cHJldmlldykpXG4gKlxuICogQXNzdW1lIHRoYXQgYDx0YWJzPmAgY29tcG9uZW50IHdvdWxkIGxpa2UgdG8gZ2V0IGEgbGlzdCBpdHMgY2hpbGRyZW4gYDxwYW5lPmBcbiAqIGNvbXBvbmVudHMgYXMgc2hvd24gaW4gdGhpcyBleGFtcGxlOlxuICpcbiAqIGBgYGh0bWxcbiAqIDx0YWJzPlxuICogICA8cGFuZSB0aXRsZT1cIk92ZXJ2aWV3XCI+Li4uPC9wYW5lPlxuICogICA8cGFuZSAqbmdGb3I9XCIjbyBvZiBvYmplY3RzXCIgW3RpdGxlXT1cIm8udGl0bGVcIj57e28udGV4dH19PC9wYW5lPlxuICogPC90YWJzPlxuICogYGBgXG4gKlxuICogVGhlIHByZWZlcnJlZCBzb2x1dGlvbiBpcyB0byBxdWVyeSBmb3IgYFBhbmVgIGRpcmVjdGl2ZXMgdXNpbmcgdGhpcyBkZWNvcmF0b3IuXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAncGFuZScsXG4gKiAgIGlucHV0czogWyd0aXRsZSddXG4gKiB9KVxuICogY2xhc3MgUGFuZSB7XG4gKiAgIHRpdGxlOnN0cmluZztcbiAqIH1cbiAqXG4gKiBAQ29tcG9uZW50KHtcbiAqICBzZWxlY3RvcjogJ3RhYnMnLFxuICogIHRlbXBsYXRlOiBgXG4gKiAgICA8dWw+XG4gKiAgICAgIDxsaSAqbmdGb3I9XCIjcGFuZSBvZiBwYW5lc1wiPnt7cGFuZS50aXRsZX19PC9saT5cbiAqICAgIDwvdWw+XG4gKiAgICA8Y29udGVudD48L2NvbnRlbnQ+XG4gKiAgYFxuICogfSlcbiAqIGNsYXNzIFRhYnMge1xuICogICBwYW5lczogUXVlcnlMaXN0PFBhbmU+O1xuICogICBjb25zdHJ1Y3RvcihAUXVlcnkoUGFuZSkgcGFuZXM6UXVlcnlMaXN0PFBhbmU+KSB7XG4gICogICAgdGhpcy5wYW5lcyA9IHBhbmVzO1xuICAqICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBBIHF1ZXJ5IGNhbiBsb29rIGZvciB2YXJpYWJsZSBiaW5kaW5ncyBieSBwYXNzaW5nIGluIGEgc3RyaW5nIHdpdGggZGVzaXJlZCBiaW5kaW5nIHN5bWJvbC5cbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvc1QyajI1Y0gxZFVSQXlCUkNLeDE/cD1wcmV2aWV3KSlcbiAqIGBgYGh0bWxcbiAqIDxzZWVrZXI+XG4gKiAgIDxkaXYgI2ZpbmRtZT4uLi48L2Rpdj5cbiAqIDwvc2Vla2VyPlxuICpcbiAqIEBDb21wb25lbnQoeyBzZWxlY3RvcjogJ3NlZWtlcicgfSlcbiAqIGNsYXNzIFNlZWtlciB7XG4gKiAgIGNvbnN0cnVjdG9yKEBRdWVyeSgnZmluZG1lJykgZWxMaXN0OiBRdWVyeUxpc3Q8RWxlbWVudFJlZj4pIHsuLi59XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBJbiB0aGlzIGNhc2UgdGhlIG9iamVjdCB0aGF0IGlzIGluamVjdGVkIGRlcGVuZCBvbiB0aGUgdHlwZSBvZiB0aGUgdmFyaWFibGVcbiAqIGJpbmRpbmcuIEl0IGNhbiBiZSBhbiBFbGVtZW50UmVmLCBhIGRpcmVjdGl2ZSBvciBhIGNvbXBvbmVudC5cbiAqXG4gKiBQYXNzaW5nIGluIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgdmFyaWFibGUgYmluZGluZ3Mgd2lsbCBxdWVyeSBmb3IgYWxsIG9mIHRoZW0uXG4gKlxuICogYGBgaHRtbFxuICogPHNlZWtlcj5cbiAqICAgPGRpdiAjZmluZC1tZT4uLi48L2Rpdj5cbiAqICAgPGRpdiAjZmluZC1tZS10b28+Li4uPC9kaXY+XG4gKiA8L3NlZWtlcj5cbiAqXG4gKiAgQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAnc2Vla2VyJ1xuICogfSlcbiAqIGNsYXNzIFNlZWtlciB7XG4gKiAgIGNvbnN0cnVjdG9yKEBRdWVyeSgnZmluZE1lLCBmaW5kTWVUb28nKSBlbExpc3Q6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPikgey4uLn1cbiAqIH1cbiAqIGBgYFxuICpcbiAqIENvbmZpZ3VyZSB3aGV0aGVyIHF1ZXJ5IGxvb2tzIGZvciBkaXJlY3QgY2hpbGRyZW4gb3IgYWxsIGRlc2NlbmRhbnRzXG4gKiBvZiB0aGUgcXVlcnlpbmcgZWxlbWVudCwgYnkgdXNpbmcgdGhlIGBkZXNjZW5kYW50c2AgcGFyYW1ldGVyLlxuICogSXQgaXMgc2V0IHRvIGBmYWxzZWAgYnkgZGVmYXVsdC5cbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvd3RHZUI5NzdidjdxdkE1RlRZbDk/cD1wcmV2aWV3KSlcbiAqIGBgYGh0bWxcbiAqIDxjb250YWluZXIgI2ZpcnN0PlxuICogICA8aXRlbT5hPC9pdGVtPlxuICogICA8aXRlbT5iPC9pdGVtPlxuICogICA8Y29udGFpbmVyICNzZWNvbmQ+XG4gKiAgICAgPGl0ZW0+YzwvaXRlbT5cbiAqICAgPC9jb250YWluZXI+XG4gKiA8L2NvbnRhaW5lcj5cbiAqIGBgYFxuICpcbiAqIFdoZW4gcXVlcnlpbmcgZm9yIGl0ZW1zLCB0aGUgZmlyc3QgY29udGFpbmVyIHdpbGwgc2VlIG9ubHkgYGFgIGFuZCBgYmAgYnkgZGVmYXVsdCxcbiAqIGJ1dCB3aXRoIGBRdWVyeShUZXh0RGlyZWN0aXZlLCB7ZGVzY2VuZGFudHM6IHRydWV9KWAgaXQgd2lsbCBzZWUgYGNgIHRvby5cbiAqXG4gKiBUaGUgcXVlcmllZCBkaXJlY3RpdmVzIGFyZSBrZXB0IGluIGEgZGVwdGgtZmlyc3QgcHJlLW9yZGVyIHdpdGggcmVzcGVjdCB0byB0aGVpclxuICogcG9zaXRpb25zIGluIHRoZSBET00uXG4gKlxuICogUXVlcnkgZG9lcyBub3QgbG9vayBkZWVwIGludG8gYW55IHN1YmNvbXBvbmVudCB2aWV3cy5cbiAqXG4gKiBRdWVyeSBpcyB1cGRhdGVkIGFzIHBhcnQgb2YgdGhlIGNoYW5nZS1kZXRlY3Rpb24gY3ljbGUuIFNpbmNlIGNoYW5nZSBkZXRlY3Rpb25cbiAqIGhhcHBlbnMgYWZ0ZXIgY29uc3RydWN0aW9uIG9mIGEgZGlyZWN0aXZlLCBRdWVyeUxpc3Qgd2lsbCBhbHdheXMgYmUgZW1wdHkgd2hlbiBvYnNlcnZlZCBpbiB0aGVcbiAqIGNvbnN0cnVjdG9yLlxuICpcbiAqIFRoZSBpbmplY3RlZCBvYmplY3QgaXMgYW4gdW5tb2RpZmlhYmxlIGxpdmUgbGlzdC5cbiAqIFNlZSB7QGxpbmsgUXVlcnlMaXN0fSBmb3IgbW9yZSBkZXRhaWxzLlxuICovXG5AQ09OU1QoKVxuZXhwb3J0IGNsYXNzIFF1ZXJ5TWV0YWRhdGEgZXh0ZW5kcyBEZXBlbmRlbmN5TWV0YWRhdGEge1xuICAvKipcbiAgICogd2hldGhlciB3ZSB3YW50IHRvIHF1ZXJ5IG9ubHkgZGlyZWN0IGNoaWxkcmVuIChmYWxzZSkgb3IgYWxsXG4gICAqIGNoaWxkcmVuICh0cnVlKS5cbiAgICovXG4gIGRlc2NlbmRhbnRzOiBib29sZWFuO1xuICBmaXJzdDogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9zZWxlY3RvcjogVHlwZSB8IHN0cmluZyxcbiAgICAgICAgICAgICAge2Rlc2NlbmRhbnRzID0gZmFsc2UsIGZpcnN0ID0gZmFsc2V9OiB7ZGVzY2VuZGFudHM/OiBib29sZWFuLCBmaXJzdD86IGJvb2xlYW59ID0ge30pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZGVzY2VuZGFudHMgPSBkZXNjZW5kYW50cztcbiAgICB0aGlzLmZpcnN0ID0gZmlyc3Q7XG4gIH1cblxuICAvKipcbiAgICogYWx3YXlzIGBmYWxzZWAgdG8gZGlmZmVyZW50aWF0ZSBpdCB3aXRoIHtAbGluayBWaWV3UXVlcnlNZXRhZGF0YX0uXG4gICAqL1xuICBnZXQgaXNWaWV3UXVlcnkoKTogYm9vbGVhbiB7IHJldHVybiBmYWxzZTsgfVxuXG4gIC8qKlxuICAgKiB3aGF0IHRoaXMgaXMgcXVlcnlpbmcgZm9yLlxuICAgKi9cbiAgZ2V0IHNlbGVjdG9yKCkgeyByZXR1cm4gcmVzb2x2ZUZvcndhcmRSZWYodGhpcy5fc2VsZWN0b3IpOyB9XG5cbiAgLyoqXG4gICAqIHdoZXRoZXIgdGhpcyBpcyBxdWVyeWluZyBmb3IgYSB2YXJpYWJsZSBiaW5kaW5nIG9yIGEgZGlyZWN0aXZlLlxuICAgKi9cbiAgZ2V0IGlzVmFyQmluZGluZ1F1ZXJ5KCk6IGJvb2xlYW4geyByZXR1cm4gaXNTdHJpbmcodGhpcy5zZWxlY3Rvcik7IH1cblxuICAvKipcbiAgICogcmV0dXJucyBhIGxpc3Qgb2YgdmFyaWFibGUgYmluZGluZ3MgdGhpcyBpcyBxdWVyeWluZyBmb3IuXG4gICAqIE9ubHkgYXBwbGljYWJsZSBpZiB0aGlzIGlzIGEgdmFyaWFibGUgYmluZGluZ3MgcXVlcnkuXG4gICAqL1xuICBnZXQgdmFyQmluZGluZ3MoKTogc3RyaW5nW10geyByZXR1cm4gdGhpcy5zZWxlY3Rvci5zcGxpdCgnLCcpOyB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHsgcmV0dXJuIGBAUXVlcnkoJHtzdHJpbmdpZnkodGhpcy5zZWxlY3Rvcil9KWA7IH1cbn1cblxuLy8gVE9ETzogYWRkIGFuIGV4YW1wbGUgYWZ0ZXIgQ29udGVudENoaWxkcmVuIGFuZCBWaWV3Q2hpbGRyZW4gYXJlIGluIG1hc3RlclxuLyoqXG4gKiBDb25maWd1cmVzIGEgY29udGVudCBxdWVyeS5cbiAqXG4gKiBDb250ZW50IHF1ZXJpZXMgYXJlIHNldCBiZWZvcmUgdGhlIGBuZ0FmdGVyQ29udGVudEluaXRgIGNhbGxiYWNrIGlzIGNhbGxlZC5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIGBgYFxuICogQERpcmVjdGl2ZSh7XG4gKiAgIHNlbGVjdG9yOiAnc29tZURpcidcbiAqIH0pXG4gKiBjbGFzcyBTb21lRGlyIHtcbiAqICAgQENvbnRlbnRDaGlsZHJlbihDaGlsZERpcmVjdGl2ZSkgY29udGVudENoaWxkcmVuOiBRdWVyeUxpc3Q8Q2hpbGREaXJlY3RpdmU+O1xuICpcbiAqICAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICogICAgIC8vIGNvbnRlbnRDaGlsZHJlbiBpcyBzZXRcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbkBDT05TVCgpXG5leHBvcnQgY2xhc3MgQ29udGVudENoaWxkcmVuTWV0YWRhdGEgZXh0ZW5kcyBRdWVyeU1ldGFkYXRhIHtcbiAgY29uc3RydWN0b3IoX3NlbGVjdG9yOiBUeXBlIHwgc3RyaW5nLCB7ZGVzY2VuZGFudHMgPSBmYWxzZX06IHtkZXNjZW5kYW50cz86IGJvb2xlYW59ID0ge30pIHtcbiAgICBzdXBlcihfc2VsZWN0b3IsIHtkZXNjZW5kYW50czogZGVzY2VuZGFudHN9KTtcbiAgfVxufVxuXG4vLyBUT0RPOiBhZGQgYW4gZXhhbXBsZSBhZnRlciBDb250ZW50Q2hpbGQgYW5kIFZpZXdDaGlsZCBhcmUgaW4gbWFzdGVyXG4vKipcbiAqIENvbmZpZ3VyZXMgYSBjb250ZW50IHF1ZXJ5LlxuICpcbiAqIENvbnRlbnQgcXVlcmllcyBhcmUgc2V0IGJlZm9yZSB0aGUgYG5nQWZ0ZXJDb250ZW50SW5pdGAgY2FsbGJhY2sgaXMgY2FsbGVkLlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogYGBgXG4gKiBARGlyZWN0aXZlKHtcbiAqICAgc2VsZWN0b3I6ICdzb21lRGlyJ1xuICogfSlcbiAqIGNsYXNzIFNvbWVEaXIge1xuICogICBAQ29udGVudENoaWxkKENoaWxkRGlyZWN0aXZlKSBjb250ZW50Q2hpbGQ7XG4gKlxuICogICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gKiAgICAgLy8gY29udGVudENoaWxkIGlzIHNldFxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuQENPTlNUKClcbmV4cG9ydCBjbGFzcyBDb250ZW50Q2hpbGRNZXRhZGF0YSBleHRlbmRzIFF1ZXJ5TWV0YWRhdGEge1xuICBjb25zdHJ1Y3Rvcihfc2VsZWN0b3I6IFR5cGUgfCBzdHJpbmcpIHsgc3VwZXIoX3NlbGVjdG9yLCB7ZGVzY2VuZGFudHM6IHRydWUsIGZpcnN0OiB0cnVlfSk7IH1cbn1cblxuLyoqXG4gKiBTaW1pbGFyIHRvIHtAbGluayBRdWVyeU1ldGFkYXRhfSwgYnV0IHF1ZXJ5aW5nIHRoZSBjb21wb25lbnQgdmlldywgaW5zdGVhZCBvZlxuICogdGhlIGNvbnRlbnQgY2hpbGRyZW4uXG4gKlxuICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L2VOc0ZIRGY3WWp5TTZJekt4TTFqP3A9cHJldmlldykpXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogQENvbXBvbmVudCh7Li4ufSlcbiAqIEBWaWV3KHtcbiAqICAgdGVtcGxhdGU6IGBcbiAqICAgICA8aXRlbT4gYSA8L2l0ZW0+XG4gKiAgICAgPGl0ZW0+IGIgPC9pdGVtPlxuICogICAgIDxpdGVtPiBjIDwvaXRlbT5cbiAqICAgYFxuICogfSlcbiAqIGNsYXNzIE15Q29tcG9uZW50IHtcbiAqICAgc2hvd246IGJvb2xlYW47XG4gKlxuICogICBjb25zdHJ1Y3Rvcihwcml2YXRlIEBRdWVyeShJdGVtKSBpdGVtczpRdWVyeUxpc3Q8SXRlbT4pIHtcbiAqICAgICBpdGVtcy5vbkNoYW5nZSgoKSA9PiBjb25zb2xlLmxvZyhpdGVtcy5sZW5ndGgpKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogU3VwcG9ydHMgdGhlIHNhbWUgcXVlcnlpbmcgcGFyYW1ldGVycyBhcyB7QGxpbmsgUXVlcnlNZXRhZGF0YX0sIGV4Y2VwdFxuICogYGRlc2NlbmRhbnRzYC4gVGhpcyBhbHdheXMgcXVlcmllcyB0aGUgd2hvbGUgdmlldy5cbiAqXG4gKiBBcyBgc2hvd25gIGlzIGZsaXBwZWQgYmV0d2VlbiB0cnVlIGFuZCBmYWxzZSwgaXRlbXMgd2lsbCBjb250YWluIHplcm8gb2Ygb25lXG4gKiBpdGVtcy5cbiAqXG4gKiBTcGVjaWZpZXMgdGhhdCBhIHtAbGluayBRdWVyeUxpc3R9IHNob3VsZCBiZSBpbmplY3RlZC5cbiAqXG4gKiBUaGUgaW5qZWN0ZWQgb2JqZWN0IGlzIGFuIGl0ZXJhYmxlIGFuZCBvYnNlcnZhYmxlIGxpdmUgbGlzdC5cbiAqIFNlZSB7QGxpbmsgUXVlcnlMaXN0fSBmb3IgbW9yZSBkZXRhaWxzLlxuICovXG5AQ09OU1QoKVxuZXhwb3J0IGNsYXNzIFZpZXdRdWVyeU1ldGFkYXRhIGV4dGVuZHMgUXVlcnlNZXRhZGF0YSB7XG4gIGNvbnN0cnVjdG9yKF9zZWxlY3RvcjogVHlwZSB8IHN0cmluZyxcbiAgICAgICAgICAgICAge2Rlc2NlbmRhbnRzID0gZmFsc2UsIGZpcnN0ID0gZmFsc2V9OiB7ZGVzY2VuZGFudHM/OiBib29sZWFuLCBmaXJzdD86IGJvb2xlYW59ID0ge30pIHtcbiAgICBzdXBlcihfc2VsZWN0b3IsIHtkZXNjZW5kYW50czogZGVzY2VuZGFudHMsIGZpcnN0OiBmaXJzdH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIGFsd2F5cyBgdHJ1ZWAgdG8gZGlmZmVyZW50aWF0ZSBpdCB3aXRoIHtAbGluayBRdWVyeU1ldGFkYXRhfS5cbiAgICovXG4gIGdldCBpc1ZpZXdRdWVyeSgpIHsgcmV0dXJuIHRydWU7IH1cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHsgcmV0dXJuIGBAVmlld1F1ZXJ5KCR7c3RyaW5naWZ5KHRoaXMuc2VsZWN0b3IpfSlgOyB9XG59XG5cbi8qKlxuICogQ29uZmlndXJlcyBhIHZpZXcgcXVlcnkuXG4gKlxuICogVmlldyBxdWVyaWVzIGFyZSBzZXQgYmVmb3JlIHRoZSBgbmdBZnRlclZpZXdJbml0YCBjYWxsYmFjayBpcyBjYWxsZWQuXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGBcbiAqIEBDb21wb25lbnQoe1xuICogICBzZWxlY3RvcjogJ3NvbWVEaXInLFxuICogICB0ZW1wbGF0ZVVybDogJ3NvbWVUZW1wbGF0ZScsXG4gKiAgIGRpcmVjdGl2ZXM6IFtJdGVtRGlyZWN0aXZlXVxuICogfSlcbiAqIGNsYXNzIFNvbWVEaXIge1xuICogICBAVmlld0NoaWxkcmVuKEl0ZW1EaXJlY3RpdmUpIHZpZXdDaGlsZHJlbjogUXVlcnlMaXN0PEl0ZW1EaXJlY3RpdmU+O1xuICpcbiAqICAgbmdBZnRlclZpZXdJbml0KCkge1xuICogICAgIC8vIHZpZXdDaGlsZHJlbiBpcyBzZXRcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbkBDT05TVCgpXG5leHBvcnQgY2xhc3MgVmlld0NoaWxkcmVuTWV0YWRhdGEgZXh0ZW5kcyBWaWV3UXVlcnlNZXRhZGF0YSB7XG4gIGNvbnN0cnVjdG9yKF9zZWxlY3RvcjogVHlwZSB8IHN0cmluZykgeyBzdXBlcihfc2VsZWN0b3IsIHtkZXNjZW5kYW50czogdHJ1ZX0pOyB9XG59XG5cbi8qKlxuICogQ29uZmlndXJlcyBhIHZpZXcgcXVlcnkuXG4gKlxuICogVmlldyBxdWVyaWVzIGFyZSBzZXQgYmVmb3JlIHRoZSBgbmdBZnRlclZpZXdJbml0YCBjYWxsYmFjayBpcyBjYWxsZWQuXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGBcbiAqIEBDb21wb25lbnQoe1xuICogICBzZWxlY3RvcjogJ3NvbWVEaXInLFxuICogICB0ZW1wbGF0ZVVybDogJ3NvbWVUZW1wbGF0ZScsXG4gKiAgIGRpcmVjdGl2ZXM6IFtJdGVtRGlyZWN0aXZlXVxuICogfSlcbiAqIGNsYXNzIFNvbWVEaXIge1xuICogICBAVmlld0NoaWxkKEl0ZW1EaXJlY3RpdmUpIHZpZXdDaGlsZDpJdGVtRGlyZWN0aXZlO1xuICpcbiAqICAgbmdBZnRlclZpZXdJbml0KCkge1xuICogICAgIC8vIHZpZXdDaGlsZCBpcyBzZXRcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbkBDT05TVCgpXG5leHBvcnQgY2xhc3MgVmlld0NoaWxkTWV0YWRhdGEgZXh0ZW5kcyBWaWV3UXVlcnlNZXRhZGF0YSB7XG4gIGNvbnN0cnVjdG9yKF9zZWxlY3RvcjogVHlwZSB8IHN0cmluZykgeyBzdXBlcihfc2VsZWN0b3IsIHtkZXNjZW5kYW50czogdHJ1ZSwgZmlyc3Q6IHRydWV9KTsgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvbWV0YWRhdGEvZGkudHNcbiAqKi8iLCIvLyBUT0RPKGp0ZXBsaXR6NjAyKTogTG9hZCBXb3JrZXJHbG9iYWxTY29wZSBmcm9tIGxpYi53ZWJ3b3JrZXIuZC50cyBmaWxlICMzNDkyXG5kZWNsYXJlIHZhciBXb3JrZXJHbG9iYWxTY29wZTtcbnZhciBnbG9iYWxTY29wZTogQnJvd3Nlck5vZGVHbG9iYWw7XG5pZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgaWYgKHR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSAhPT0gJ3VuZGVmaW5lZCcgJiYgc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlKSB7XG4gICAgLy8gVE9ETzogUmVwbGFjZSBhbnkgd2l0aCBXb3JrZXJHbG9iYWxTY29wZSBmcm9tIGxpYi53ZWJ3b3JrZXIuZC50cyAjMzQ5MlxuICAgIGdsb2JhbFNjb3BlID0gPGFueT5zZWxmO1xuICB9IGVsc2Uge1xuICAgIGdsb2JhbFNjb3BlID0gPGFueT5nbG9iYWw7XG4gIH1cbn0gZWxzZSB7XG4gIGdsb2JhbFNjb3BlID0gPGFueT53aW5kb3c7XG59O1xuXG5leHBvcnQgY29uc3QgSVNfREFSVCA9IGZhbHNlO1xuXG4vLyBOZWVkIHRvIGRlY2xhcmUgYSBuZXcgdmFyaWFibGUgZm9yIGdsb2JhbCBoZXJlIHNpbmNlIFR5cGVTY3JpcHRcbi8vIGV4cG9ydHMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHRoZSBzeW1ib2wuXG52YXIgX2dsb2JhbDogQnJvd3Nlck5vZGVHbG9iYWwgPSBnbG9iYWxTY29wZTtcblxuZXhwb3J0IHtfZ2xvYmFsIGFzIGdsb2JhbH07XG5cbmV4cG9ydCB2YXIgVHlwZSA9IEZ1bmN0aW9uO1xuXG4vKipcbiAqIFJ1bnRpbWUgcmVwcmVzZW50YXRpb24gYSB0eXBlIHRoYXQgYSBDb21wb25lbnQgb3Igb3RoZXIgb2JqZWN0IGlzIGluc3RhbmNlcyBvZi5cbiAqXG4gKiBBbiBleGFtcGxlIG9mIGEgYFR5cGVgIGlzIGBNeUN1c3RvbUNvbXBvbmVudGAgY2xhc3MsIHdoaWNoIGluIEphdmFTY3JpcHQgaXMgYmUgcmVwcmVzZW50ZWQgYnlcbiAqIHRoZSBgTXlDdXN0b21Db21wb25lbnRgIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFR5cGUgZXh0ZW5kcyBGdW5jdGlvbiB7fVxuXG4vKipcbiAqIFJ1bnRpbWUgcmVwcmVzZW50YXRpb24gb2YgYSB0eXBlIHRoYXQgaXMgY29uc3RydWN0YWJsZSAobm9uLWFic3RyYWN0KS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25jcmV0ZVR5cGUgZXh0ZW5kcyBUeXBlIHsgbmV3ICguLi5hcmdzKTogYW55OyB9XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlTmFtZUZvckRlYnVnZ2luZyh0eXBlOiBUeXBlKTogc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVbJ25hbWUnXTtcbn1cblxuXG5leHBvcnQgdmFyIE1hdGggPSBfZ2xvYmFsLk1hdGg7XG5leHBvcnQgdmFyIERhdGUgPSBfZ2xvYmFsLkRhdGU7XG5cbnZhciBfZGV2TW9kZTogYm9vbGVhbiA9IHRydWU7XG52YXIgX21vZGVMb2NrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuZXhwb3J0IGZ1bmN0aW9uIGxvY2tNb2RlKCkge1xuICBfbW9kZUxvY2tlZCA9IHRydWU7XG59XG5cbi8qKlxuICogRGlzYWJsZSBBbmd1bGFyJ3MgZGV2ZWxvcG1lbnQgbW9kZSwgd2hpY2ggdHVybnMgb2ZmIGFzc2VydGlvbnMgYW5kIG90aGVyXG4gKiBjaGVja3Mgd2l0aGluIHRoZSBmcmFtZXdvcmsuXG4gKlxuICogT25lIGltcG9ydGFudCBhc3NlcnRpb24gdGhpcyBkaXNhYmxlcyB2ZXJpZmllcyB0aGF0IGEgY2hhbmdlIGRldGVjdGlvbiBwYXNzXG4gKiBkb2VzIG5vdCByZXN1bHQgaW4gYWRkaXRpb25hbCBjaGFuZ2VzIHRvIGFueSBiaW5kaW5ncyAoYWxzbyBrbm93biBhc1xuICogdW5pZGlyZWN0aW9uYWwgZGF0YSBmbG93KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuYWJsZVByb2RNb2RlKCkge1xuICBpZiAoX21vZGVMb2NrZWQpIHtcbiAgICAvLyBDYW5ub3QgdXNlIEJhc2VFeGNlcHRpb24gYXMgdGhhdCBlbmRzIHVwIGltcG9ydGluZyBmcm9tIGZhY2FkZS9sYW5nLlxuICAgIHRocm93ICdDYW5ub3QgZW5hYmxlIHByb2QgbW9kZSBhZnRlciBwbGF0Zm9ybSBzZXR1cC4nO1xuICB9XG4gIF9kZXZNb2RlID0gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRpb25zRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIF9kZXZNb2RlO1xufVxuXG4vLyBUT0RPOiByZW1vdmUgY2FsbHMgdG8gYXNzZXJ0IGluIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRcbi8vIE5vdGU6IENhbid0IGp1c3QgZXhwb3J0IHRoaXMgYW5kIGltcG9ydCBpbiBpbiBvdGhlciBmaWxlc1xuLy8gYXMgYGFzc2VydGAgaXMgYSByZXNlcnZlZCBrZXl3b3JkIGluIERhcnRcbl9nbG9iYWwuYXNzZXJ0ID0gZnVuY3Rpb24gYXNzZXJ0KGNvbmRpdGlvbikge1xuICAvLyBUT0RPOiB0byBiZSBmaXhlZCBwcm9wZXJseSB2aWEgIzI4MzAsIG5vb3AgZm9yIG5vd1xufTtcblxuLy8gVGhpcyBmdW5jdGlvbiBpcyBuZWVkZWQgb25seSB0byBwcm9wZXJseSBzdXBwb3J0IERhcnQncyBjb25zdCBleHByZXNzaW9uc1xuLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL3RzMmRhcnQvcHVsbC8xNTEgZm9yIG1vcmUgaW5mb1xuZXhwb3J0IGZ1bmN0aW9uIENPTlNUX0VYUFI8VD4oZXhwcjogVCk6IFQge1xuICByZXR1cm4gZXhwcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIENPTlNUKCk6IENsYXNzRGVjb3JhdG9yICYgUHJvcGVydHlEZWNvcmF0b3Ige1xuICByZXR1cm4gKHRhcmdldCkgPT4gdGFyZ2V0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcmVzZW50KG9iajogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiBvYmogIT09IHVuZGVmaW5lZCAmJiBvYmogIT09IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0JsYW5rKG9iajogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiBvYmogPT09IHVuZGVmaW5lZCB8fCBvYmogPT09IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1N0cmluZyhvYmo6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gXCJzdHJpbmdcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRnVuY3Rpb24ob2JqOiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVHlwZShvYmo6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNGdW5jdGlvbihvYmopO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmdNYXAob2JqOiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaiAhPT0gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJvbWlzZShvYmo6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gb2JqIGluc3RhbmNlb2YgKDxhbnk+X2dsb2JhbCkuUHJvbWlzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQXJyYXkob2JqOiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkob2JqKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVtYmVyKG9iaik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ251bWJlcic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGUob2JqKTogYm9vbGVhbiB7XG4gIHJldHVybiBvYmogaW5zdGFuY2VvZiBEYXRlICYmICFpc05hTihvYmoudmFsdWVPZigpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5naWZ5KHRva2VuKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdG9rZW47XG4gIH1cblxuICBpZiAodG9rZW4gPT09IHVuZGVmaW5lZCB8fCB0b2tlbiA9PT0gbnVsbCkge1xuICAgIHJldHVybiAnJyArIHRva2VuO1xuICB9XG5cbiAgaWYgKHRva2VuLm5hbWUpIHtcbiAgICByZXR1cm4gdG9rZW4ubmFtZTtcbiAgfVxuXG4gIHZhciByZXMgPSB0b2tlbi50b1N0cmluZygpO1xuICB2YXIgbmV3TGluZUluZGV4ID0gcmVzLmluZGV4T2YoXCJcXG5cIik7XG4gIHJldHVybiAobmV3TGluZUluZGV4ID09PSAtMSkgPyByZXMgOiByZXMuc3Vic3RyaW5nKDAsIG5ld0xpbmVJbmRleCk7XG59XG5cbi8vIHNlcmlhbGl6ZSAvIGRlc2VyaWFsaXplIGVudW0gZXhpc3Qgb25seSBmb3IgY29uc2lzdGVuY3kgd2l0aCBkYXJ0IEFQSVxuLy8gZW51bXMgaW4gdHlwZXNjcmlwdCBkb24ndCBuZWVkIHRvIGJlIHNlcmlhbGl6ZWRcblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZUVudW0odmFsKTogbnVtYmVyIHtcbiAgcmV0dXJuIHZhbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplRW51bSh2YWwsIHZhbHVlczogTWFwPG51bWJlciwgYW55Pik6IGFueSB7XG4gIHJldHVybiB2YWw7XG59XG5cbmV4cG9ydCBjbGFzcyBTdHJpbmdXcmFwcGVyIHtcbiAgc3RhdGljIGZyb21DaGFyQ29kZShjb2RlOiBudW1iZXIpOiBzdHJpbmcgeyByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKTsgfVxuXG4gIHN0YXRpYyBjaGFyQ29kZUF0KHM6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IG51bWJlciB7IHJldHVybiBzLmNoYXJDb2RlQXQoaW5kZXgpOyB9XG5cbiAgc3RhdGljIHNwbGl0KHM6IHN0cmluZywgcmVnRXhwOiBSZWdFeHApOiBzdHJpbmdbXSB7IHJldHVybiBzLnNwbGl0KHJlZ0V4cCk7IH1cblxuICBzdGF0aWMgZXF1YWxzKHM6IHN0cmluZywgczI6IHN0cmluZyk6IGJvb2xlYW4geyByZXR1cm4gcyA9PT0gczI7IH1cblxuICBzdGF0aWMgc3RyaXBMZWZ0KHM6IHN0cmluZywgY2hhclZhbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAocyAmJiBzLmxlbmd0aCkge1xuICAgICAgdmFyIHBvcyA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHNbaV0gIT0gY2hhclZhbCkgYnJlYWs7XG4gICAgICAgIHBvcysrO1xuICAgICAgfVxuICAgICAgcyA9IHMuc3Vic3RyaW5nKHBvcyk7XG4gICAgfVxuICAgIHJldHVybiBzO1xuICB9XG5cbiAgc3RhdGljIHN0cmlwUmlnaHQoczogc3RyaW5nLCBjaGFyVmFsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChzICYmIHMubGVuZ3RoKSB7XG4gICAgICB2YXIgcG9zID0gcy5sZW5ndGg7XG4gICAgICBmb3IgKHZhciBpID0gcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBpZiAoc1tpXSAhPSBjaGFyVmFsKSBicmVhaztcbiAgICAgICAgcG9zLS07XG4gICAgICB9XG4gICAgICBzID0gcy5zdWJzdHJpbmcoMCwgcG9zKTtcbiAgICB9XG4gICAgcmV0dXJuIHM7XG4gIH1cblxuICBzdGF0aWMgcmVwbGFjZShzOiBzdHJpbmcsIGZyb206IHN0cmluZywgcmVwbGFjZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcy5yZXBsYWNlKGZyb20sIHJlcGxhY2UpO1xuICB9XG5cbiAgc3RhdGljIHJlcGxhY2VBbGwoczogc3RyaW5nLCBmcm9tOiBSZWdFeHAsIHJlcGxhY2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHMucmVwbGFjZShmcm9tLCByZXBsYWNlKTtcbiAgfVxuXG4gIHN0YXRpYyBzbGljZTxUPihzOiBzdHJpbmcsIGZyb206IG51bWJlciA9IDAsIHRvOiBudW1iZXIgPSBudWxsKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcy5zbGljZShmcm9tLCB0byA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IHRvKTtcbiAgfVxuXG4gIHN0YXRpYyByZXBsYWNlQWxsTWFwcGVkKHM6IHN0cmluZywgZnJvbTogUmVnRXhwLCBjYjogRnVuY3Rpb24pOiBzdHJpbmcge1xuICAgIHJldHVybiBzLnJlcGxhY2UoZnJvbSwgZnVuY3Rpb24oLi4ubWF0Y2hlcykge1xuICAgICAgLy8gUmVtb3ZlIG9mZnNldCAmIHN0cmluZyBmcm9tIHRoZSByZXN1bHQgYXJyYXlcbiAgICAgIG1hdGNoZXMuc3BsaWNlKC0yLCAyKTtcbiAgICAgIC8vIFRoZSBjYWxsYmFjayByZWNlaXZlcyBtYXRjaCwgcDEsIC4uLiwgcG5cbiAgICAgIHJldHVybiBjYihtYXRjaGVzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBjb250YWlucyhzOiBzdHJpbmcsIHN1YnN0cjogc3RyaW5nKTogYm9vbGVhbiB7IHJldHVybiBzLmluZGV4T2Yoc3Vic3RyKSAhPSAtMTsgfVxuXG4gIHN0YXRpYyBjb21wYXJlKGE6IHN0cmluZywgYjogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBpZiAoYSA8IGIpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9IGVsc2UgaWYgKGEgPiBiKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdHJpbmdKb2luZXIge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcGFydHMgPSBbXSkge31cblxuICBhZGQocGFydDogc3RyaW5nKTogdm9pZCB7IHRoaXMucGFydHMucHVzaChwYXJ0KTsgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLnBhcnRzLmpvaW4oXCJcIik7IH1cbn1cblxuZXhwb3J0IGNsYXNzIE51bWJlclBhcnNlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIG5hbWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbWVzc2FnZTogc3RyaW5nKSB7IHN1cGVyKCk7IH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5tZXNzYWdlOyB9XG59XG5cblxuZXhwb3J0IGNsYXNzIE51bWJlcldyYXBwZXIge1xuICBzdGF0aWMgdG9GaXhlZChuOiBudW1iZXIsIGZyYWN0aW9uRGlnaXRzOiBudW1iZXIpOiBzdHJpbmcgeyByZXR1cm4gbi50b0ZpeGVkKGZyYWN0aW9uRGlnaXRzKTsgfVxuXG4gIHN0YXRpYyBlcXVhbChhOiBudW1iZXIsIGI6IG51bWJlcik6IGJvb2xlYW4geyByZXR1cm4gYSA9PT0gYjsgfVxuXG4gIHN0YXRpYyBwYXJzZUludEF1dG9SYWRpeCh0ZXh0OiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHZhciByZXN1bHQ6IG51bWJlciA9IHBhcnNlSW50KHRleHQpO1xuICAgIGlmIChpc05hTihyZXN1bHQpKSB7XG4gICAgICB0aHJvdyBuZXcgTnVtYmVyUGFyc2VFcnJvcihcIkludmFsaWQgaW50ZWdlciBsaXRlcmFsIHdoZW4gcGFyc2luZyBcIiArIHRleHQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgc3RhdGljIHBhcnNlSW50KHRleHQ6IHN0cmluZywgcmFkaXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHJhZGl4ID09IDEwKSB7XG4gICAgICBpZiAoL14oXFwtfFxcKyk/WzAtOV0rJC8udGVzdCh0ZXh0KSkge1xuICAgICAgICByZXR1cm4gcGFyc2VJbnQodGV4dCwgcmFkaXgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmFkaXggPT0gMTYpIHtcbiAgICAgIGlmICgvXihcXC18XFwrKT9bMC05QUJDREVGYWJjZGVmXSskLy50ZXN0KHRleHQpKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUludCh0ZXh0LCByYWRpeCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciByZXN1bHQ6IG51bWJlciA9IHBhcnNlSW50KHRleHQsIHJhZGl4KTtcbiAgICAgIGlmICghaXNOYU4ocmVzdWx0KSkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgTnVtYmVyUGFyc2VFcnJvcihcIkludmFsaWQgaW50ZWdlciBsaXRlcmFsIHdoZW4gcGFyc2luZyBcIiArIHRleHQgKyBcIiBpbiBiYXNlIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWRpeCk7XG4gIH1cblxuICAvLyBUT0RPOiBOYU4gaXMgYSB2YWxpZCBsaXRlcmFsIGJ1dCBpcyByZXR1cm5lZCBieSBwYXJzZUZsb2F0IHRvIGluZGljYXRlIGFuIGVycm9yLlxuICBzdGF0aWMgcGFyc2VGbG9hdCh0ZXh0OiBzdHJpbmcpOiBudW1iZXIgeyByZXR1cm4gcGFyc2VGbG9hdCh0ZXh0KTsgfVxuXG4gIHN0YXRpYyBnZXQgTmFOKCk6IG51bWJlciB7IHJldHVybiBOYU47IH1cblxuICBzdGF0aWMgaXNOYU4odmFsdWU6IGFueSk6IGJvb2xlYW4geyByZXR1cm4gaXNOYU4odmFsdWUpOyB9XG5cbiAgc3RhdGljIGlzSW50ZWdlcih2YWx1ZTogYW55KTogYm9vbGVhbiB7IHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKTsgfVxufVxuXG5leHBvcnQgdmFyIFJlZ0V4cCA9IF9nbG9iYWwuUmVnRXhwO1xuXG5leHBvcnQgY2xhc3MgUmVnRXhwV3JhcHBlciB7XG4gIHN0YXRpYyBjcmVhdGUocmVnRXhwU3RyOiBzdHJpbmcsIGZsYWdzOiBzdHJpbmcgPSAnJyk6IFJlZ0V4cCB7XG4gICAgZmxhZ3MgPSBmbGFncy5yZXBsYWNlKC9nL2csICcnKTtcbiAgICByZXR1cm4gbmV3IF9nbG9iYWwuUmVnRXhwKHJlZ0V4cFN0ciwgZmxhZ3MgKyAnZycpO1xuICB9XG4gIHN0YXRpYyBmaXJzdE1hdGNoKHJlZ0V4cDogUmVnRXhwLCBpbnB1dDogc3RyaW5nKTogUmVnRXhwRXhlY0FycmF5IHtcbiAgICAvLyBSZXNldCBtdWx0aW1hdGNoIHJlZ2V4IHN0YXRlXG4gICAgcmVnRXhwLmxhc3RJbmRleCA9IDA7XG4gICAgcmV0dXJuIHJlZ0V4cC5leGVjKGlucHV0KTtcbiAgfVxuICBzdGF0aWMgdGVzdChyZWdFeHA6IFJlZ0V4cCwgaW5wdXQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJlZ0V4cC5sYXN0SW5kZXggPSAwO1xuICAgIHJldHVybiByZWdFeHAudGVzdChpbnB1dCk7XG4gIH1cbiAgc3RhdGljIG1hdGNoZXIocmVnRXhwOiBSZWdFeHAsIGlucHV0OiBzdHJpbmcpOiB7XG4gICAgcmU6IFJlZ0V4cDtcbiAgICBpbnB1dDogc3RyaW5nXG4gIH1cbiAge1xuICAgIC8vIFJlc2V0IHJlZ2V4IHN0YXRlIGZvciB0aGUgY2FzZVxuICAgIC8vIHNvbWVvbmUgZGlkIG5vdCBsb29wIG92ZXIgYWxsIG1hdGNoZXNcbiAgICAvLyBsYXN0IHRpbWUuXG4gICAgcmVnRXhwLmxhc3RJbmRleCA9IDA7XG4gICAgcmV0dXJuIHtyZTogcmVnRXhwLCBpbnB1dDogaW5wdXR9O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWdFeHBNYXRjaGVyV3JhcHBlciB7XG4gIHN0YXRpYyBuZXh0KG1hdGNoZXI6IHtcbiAgICByZTogUmVnRXhwO1xuICAgIGlucHV0OiBzdHJpbmdcbiAgfSk6IFJlZ0V4cEV4ZWNBcnJheSB7XG4gICAgcmV0dXJuIG1hdGNoZXIucmUuZXhlYyhtYXRjaGVyLmlucHV0KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRnVuY3Rpb25XcmFwcGVyIHtcbiAgc3RhdGljIGFwcGx5KGZuOiBGdW5jdGlvbiwgcG9zQXJnczogYW55KTogYW55IHsgcmV0dXJuIGZuLmFwcGx5KG51bGwsIHBvc0FyZ3MpOyB9XG59XG5cbi8vIEpTIGhhcyBOYU4gIT09IE5hTlxuZXhwb3J0IGZ1bmN0aW9uIGxvb3NlSWRlbnRpY2FsKGEsIGIpOiBib29sZWFuIHtcbiAgcmV0dXJuIGEgPT09IGIgfHwgdHlwZW9mIGEgPT09IFwibnVtYmVyXCIgJiYgdHlwZW9mIGIgPT09IFwibnVtYmVyXCIgJiYgaXNOYU4oYSkgJiYgaXNOYU4oYik7XG59XG5cbi8vIEpTIGNvbnNpZGVycyBOYU4gaXMgdGhlIHNhbWUgYXMgTmFOIGZvciBtYXAgS2V5ICh3aGlsZSBOYU4gIT09IE5hTiBvdGhlcndpc2UpXG4vLyBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvTWFwXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFwS2V5PFQ+KHZhbHVlOiBUKTogVCB7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUJsYW5rKG9iajogT2JqZWN0KTogYW55IHtcbiAgcmV0dXJuIGlzQmxhbmsob2JqKSA/IG51bGwgOiBvYmo7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVCb29sKG9iajogYm9vbGVhbik6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNCbGFuayhvYmopID8gZmFsc2UgOiBvYmo7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0pzT2JqZWN0KG86IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gbyAhPT0gbnVsbCAmJiAodHlwZW9mIG8gPT09IFwiZnVuY3Rpb25cIiB8fCB0eXBlb2YgbyA9PT0gXCJvYmplY3RcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludChvYmo6IEVycm9yIHwgT2JqZWN0KSB7XG4gIGNvbnNvbGUubG9nKG9iaik7XG59XG5cbi8vIENhbid0IGJlIGFsbCB1cHBlcmNhc2UgYXMgb3VyIHRyYW5zcGlsZXIgd291bGQgdGhpbmsgaXQgaXMgYSBzcGVjaWFsIGRpcmVjdGl2ZS4uLlxuZXhwb3J0IGNsYXNzIEpzb24ge1xuICBzdGF0aWMgcGFyc2Uoczogc3RyaW5nKTogT2JqZWN0IHsgcmV0dXJuIF9nbG9iYWwuSlNPTi5wYXJzZShzKTsgfVxuICBzdGF0aWMgc3RyaW5naWZ5KGRhdGE6IE9iamVjdCk6IHN0cmluZyB7XG4gICAgLy8gRGFydCBkb2Vzbid0IHRha2UgMyBhcmd1bWVudHNcbiAgICByZXR1cm4gX2dsb2JhbC5KU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGF0ZVdyYXBwZXIge1xuICBzdGF0aWMgY3JlYXRlKHllYXI6IG51bWJlciwgbW9udGg6IG51bWJlciA9IDEsIGRheTogbnVtYmVyID0gMSwgaG91cjogbnVtYmVyID0gMCxcbiAgICAgICAgICAgICAgICBtaW51dGVzOiBudW1iZXIgPSAwLCBzZWNvbmRzOiBudW1iZXIgPSAwLCBtaWxsaXNlY29uZHM6IG51bWJlciA9IDApOiBEYXRlIHtcbiAgICByZXR1cm4gbmV3IERhdGUoeWVhciwgbW9udGggLSAxLCBkYXksIGhvdXIsIG1pbnV0ZXMsIHNlY29uZHMsIG1pbGxpc2Vjb25kcyk7XG4gIH1cbiAgc3RhdGljIGZyb21JU09TdHJpbmcoc3RyOiBzdHJpbmcpOiBEYXRlIHsgcmV0dXJuIG5ldyBEYXRlKHN0cik7IH1cbiAgc3RhdGljIGZyb21NaWxsaXMobXM6IG51bWJlcik6IERhdGUgeyByZXR1cm4gbmV3IERhdGUobXMpOyB9XG4gIHN0YXRpYyB0b01pbGxpcyhkYXRlOiBEYXRlKTogbnVtYmVyIHsgcmV0dXJuIGRhdGUuZ2V0VGltZSgpOyB9XG4gIHN0YXRpYyBub3coKTogRGF0ZSB7IHJldHVybiBuZXcgRGF0ZSgpOyB9XG4gIHN0YXRpYyB0b0pzb24oZGF0ZTogRGF0ZSk6IHN0cmluZyB7IHJldHVybiBkYXRlLnRvSlNPTigpOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRWYWx1ZU9uUGF0aChnbG9iYWw6IGFueSwgcGF0aDogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gIHZhciBwYXJ0cyA9IHBhdGguc3BsaXQoJy4nKTtcbiAgdmFyIG9iajogYW55ID0gZ2xvYmFsO1xuICB3aGlsZSAocGFydHMubGVuZ3RoID4gMSkge1xuICAgIHZhciBuYW1lID0gcGFydHMuc2hpZnQoKTtcbiAgICBpZiAob2JqLmhhc093blByb3BlcnR5KG5hbWUpICYmIGlzUHJlc2VudChvYmpbbmFtZV0pKSB7XG4gICAgICBvYmogPSBvYmpbbmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIG9iaiA9IG9ialtuYW1lXSA9IHt9O1xuICAgIH1cbiAgfVxuICBpZiAob2JqID09PSB1bmRlZmluZWQgfHwgb2JqID09PSBudWxsKSB7XG4gICAgb2JqID0ge307XG4gIH1cbiAgb2JqW3BhcnRzLnNoaWZ0KCldID0gdmFsdWU7XG59XG5cbi8vIFdoZW4gU3ltYm9sLml0ZXJhdG9yIGRvZXNuJ3QgZXhpc3QsIHJldHJpZXZlcyB0aGUga2V5IHVzZWQgaW4gZXM2LXNoaW1cbmRlY2xhcmUgdmFyIFN5bWJvbDtcbnZhciBfc3ltYm9sSXRlcmF0b3IgPSBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN5bWJvbEl0ZXJhdG9yKCk6IHN0cmluZyB8IHN5bWJvbCB7XG4gIGlmIChpc0JsYW5rKF9zeW1ib2xJdGVyYXRvcikpIHtcbiAgICBpZiAoaXNQcmVzZW50KFN5bWJvbCkgJiYgaXNQcmVzZW50KFN5bWJvbC5pdGVyYXRvcikpIHtcbiAgICAgIF9zeW1ib2xJdGVyYXRvciA9IFN5bWJvbC5pdGVyYXRvcjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZXM2LXNoaW0gc3BlY2lmaWMgbG9naWNcbiAgICAgIHZhciBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTWFwLnByb3RvdHlwZSk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICAgIGlmIChrZXkgIT09ICdlbnRyaWVzJyAmJiBrZXkgIT09ICdzaXplJyAmJlxuICAgICAgICAgICAgTWFwLnByb3RvdHlwZVtrZXldID09PSBNYXAucHJvdG90eXBlWydlbnRyaWVzJ10pIHtcbiAgICAgICAgICBfc3ltYm9sSXRlcmF0b3IgPSBrZXk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIF9zeW1ib2xJdGVyYXRvcjtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZy50c1xuICoqLyIsIi8qKlxuICogQG1vZHVsZVxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGUgYGRpYCBtb2R1bGUgcHJvdmlkZXMgZGVwZW5kZW5jeSBpbmplY3Rpb24gY29udGFpbmVyIHNlcnZpY2VzLlxuICovXG5cbmV4cG9ydCB7XG4gIEluamVjdE1ldGFkYXRhLFxuICBPcHRpb25hbE1ldGFkYXRhLFxuICBJbmplY3RhYmxlTWV0YWRhdGEsXG4gIFNlbGZNZXRhZGF0YSxcbiAgSG9zdE1ldGFkYXRhLFxuICBTa2lwU2VsZk1ldGFkYXRhLFxuICBEZXBlbmRlbmN5TWV0YWRhdGFcbn0gZnJvbSAnLi9kaS9tZXRhZGF0YSc7XG5cbi8vIHdlIGhhdmUgdG8gcmVleHBvcnQgKiBiZWNhdXNlIERhcnQgYW5kIFRTIGV4cG9ydCB0d28gZGlmZmVyZW50IHNldHMgb2YgdHlwZXNcbmV4cG9ydCAqIGZyb20gJy4vZGkvZGVjb3JhdG9ycyc7XG5cbmV4cG9ydCB7Zm9yd2FyZFJlZiwgcmVzb2x2ZUZvcndhcmRSZWYsIEZvcndhcmRSZWZGbn0gZnJvbSAnLi9kaS9mb3J3YXJkX3JlZic7XG5leHBvcnQge0luamVjdG9yfSBmcm9tICcuL2RpL2luamVjdG9yJztcbmV4cG9ydCB7XG4gIEJpbmRpbmcsXG4gIFByb3ZpZGVyQnVpbGRlcixcbiAgUmVzb2x2ZWRCaW5kaW5nLFxuICBSZXNvbHZlZEZhY3RvcnksXG4gIERlcGVuZGVuY3ksXG4gIGJpbmQsXG5cbiAgUHJvdmlkZXIsXG4gIFJlc29sdmVkUHJvdmlkZXIsXG4gIHByb3ZpZGVcbn0gZnJvbSAnLi9kaS9wcm92aWRlcic7XG5leHBvcnQge0tleSwgVHlwZUxpdGVyYWx9IGZyb20gJy4vZGkva2V5JztcbmV4cG9ydCB7XG4gIE5vUHJvdmlkZXJFcnJvcixcbiAgQWJzdHJhY3RQcm92aWRlckVycm9yLFxuICBDeWNsaWNEZXBlbmRlbmN5RXJyb3IsXG4gIEluc3RhbnRpYXRpb25FcnJvcixcbiAgSW52YWxpZFByb3ZpZGVyRXJyb3IsXG4gIE5vQW5ub3RhdGlvbkVycm9yLFxuICBPdXRPZkJvdW5kc0Vycm9yXG59IGZyb20gJy4vZGkvZXhjZXB0aW9ucyc7XG5leHBvcnQge09wYXF1ZVRva2VufSBmcm9tICcuL2RpL29wYXF1ZV90b2tlbic7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9kaS50c1xuICoqLyIsImltcG9ydCB7Q09OU1QsIENPTlNUX0VYUFIsIHN0cmluZ2lmeSwgaXNCbGFuaywgaXNQcmVzZW50fSBmcm9tIFwiYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nXCI7XG5cbi8qKlxuICogQSBwYXJhbWV0ZXIgbWV0YWRhdGEgdGhhdCBzcGVjaWZpZXMgYSBkZXBlbmRlbmN5LlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC82dUhZSks/cD1wcmV2aWV3KSlcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBFbmdpbmUge31cbiAqXG4gKiBASW5qZWN0YWJsZSgpXG4gKiBjbGFzcyBDYXIge1xuICogICBlbmdpbmU7XG4gKiAgIGNvbnN0cnVjdG9yKEBJbmplY3QoXCJNeUVuZ2luZVwiKSBlbmdpbmU6RW5naW5lKSB7XG4gKiAgICAgdGhpcy5lbmdpbmUgPSBlbmdpbmU7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiB2YXIgaW5qZWN0b3IgPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtcbiAqICBwcm92aWRlKFwiTXlFbmdpbmVcIiwge3VzZUNsYXNzOiBFbmdpbmV9KSxcbiAqICBDYXJcbiAqIF0pO1xuICpcbiAqIGV4cGVjdChpbmplY3Rvci5nZXQoQ2FyKS5lbmdpbmUgaW5zdGFuY2VvZiBFbmdpbmUpLnRvQmUodHJ1ZSk7XG4gKiBgYGBcbiAqXG4gKiBXaGVuIGBASW5qZWN0KClgIGlzIG5vdCBwcmVzZW50LCB7QGxpbmsgSW5qZWN0b3J9IHdpbGwgdXNlIHRoZSB0eXBlIGFubm90YXRpb24gb2YgdGhlIHBhcmFtZXRlci5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIEVuZ2luZSB7fVxuICpcbiAqIEBJbmplY3RhYmxlKClcbiAqIGNsYXNzIENhciB7XG4gKiAgIGNvbnN0cnVjdG9yKHB1YmxpYyBlbmdpbmU6IEVuZ2luZSkge30gLy9zYW1lIGFzIGNvbnN0cnVjdG9yKEBJbmplY3QoRW5naW5lKSBlbmdpbmU6RW5naW5lKVxuICogfVxuICpcbiAqIHZhciBpbmplY3RvciA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW0VuZ2luZSwgQ2FyXSk7XG4gKiBleHBlY3QoaW5qZWN0b3IuZ2V0KENhcikuZW5naW5lIGluc3RhbmNlb2YgRW5naW5lKS50b0JlKHRydWUpO1xuICogYGBgXG4gKi9cbkBDT05TVCgpXG5leHBvcnQgY2xhc3MgSW5qZWN0TWV0YWRhdGEge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdG9rZW4pIHt9XG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7IHJldHVybiBgQEluamVjdCgke3N0cmluZ2lmeSh0aGlzLnRva2VuKX0pYDsgfVxufVxuXG4vKipcbiAqIEEgcGFyYW1ldGVyIG1ldGFkYXRhIHRoYXQgbWFya3MgYSBkZXBlbmRlbmN5IGFzIG9wdGlvbmFsLiB7QGxpbmsgSW5qZWN0b3J9IHByb3ZpZGVzIGBudWxsYCBpZlxuICogdGhlIGRlcGVuZGVuY3kgaXMgbm90IGZvdW5kLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9Bc3J5T20/cD1wcmV2aWV3KSlcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBFbmdpbmUge31cbiAqXG4gKiBASW5qZWN0YWJsZSgpXG4gKiBjbGFzcyBDYXIge1xuICogICBlbmdpbmU7XG4gKiAgIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIGVuZ2luZTpFbmdpbmUpIHtcbiAqICAgICB0aGlzLmVuZ2luZSA9IGVuZ2luZTtcbiAqICAgfVxuICogfVxuICpcbiAqIHZhciBpbmplY3RvciA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW0Nhcl0pO1xuICogZXhwZWN0KGluamVjdG9yLmdldChDYXIpLmVuZ2luZSkudG9CZU51bGwoKTtcbiAqIGBgYFxuICovXG5AQ09OU1QoKVxuZXhwb3J0IGNsYXNzIE9wdGlvbmFsTWV0YWRhdGEge1xuICB0b1N0cmluZygpOiBzdHJpbmcgeyByZXR1cm4gYEBPcHRpb25hbCgpYDsgfVxufVxuXG4vKipcbiAqIGBEZXBlbmRlbmN5TWV0YWRhdGFgIGlzIHVzZWQgYnkgdGhlIGZyYW1ld29yayB0byBleHRlbmQgREkuXG4gKiBUaGlzIGlzIGludGVybmFsIHRvIEFuZ3VsYXIgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBkaXJlY3RseS5cbiAqL1xuQENPTlNUKClcbmV4cG9ydCBjbGFzcyBEZXBlbmRlbmN5TWV0YWRhdGEge1xuICBnZXQgdG9rZW4oKSB7IHJldHVybiBudWxsOyB9XG59XG5cbi8qKlxuICogQSBtYXJrZXIgbWV0YWRhdGEgdGhhdCBtYXJrcyBhIGNsYXNzIGFzIGF2YWlsYWJsZSB0byB7QGxpbmsgSW5qZWN0b3J9IGZvciBjcmVhdGlvbi5cbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvV2s0RE1RP3A9cHJldmlldykpXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogQEluamVjdGFibGUoKVxuICogY2xhc3MgVXNlZnVsU2VydmljZSB7fVxuICpcbiAqIEBJbmplY3RhYmxlKClcbiAqIGNsYXNzIE5lZWRzU2VydmljZSB7XG4gKiAgIGNvbnN0cnVjdG9yKHB1YmxpYyBzZXJ2aWNlOlVzZWZ1bFNlcnZpY2UpIHt9XG4gKiB9XG4gKlxuICogdmFyIGluamVjdG9yID0gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbTmVlZHNTZXJ2aWNlLCBVc2VmdWxTZXJ2aWNlXSk7XG4gKiBleHBlY3QoaW5qZWN0b3IuZ2V0KE5lZWRzU2VydmljZSkuc2VydmljZSBpbnN0YW5jZW9mIFVzZWZ1bFNlcnZpY2UpLnRvQmUodHJ1ZSk7XG4gKiBgYGBcbiAqIHtAbGluayBJbmplY3Rvcn0gd2lsbCB0aHJvdyB7QGxpbmsgTm9Bbm5vdGF0aW9uRXJyb3J9IHdoZW4gdHJ5aW5nIHRvIGluc3RhbnRpYXRlIGEgY2xhc3MgdGhhdFxuICogZG9lcyBub3QgaGF2ZSBgQEluamVjdGFibGVgIG1hcmtlciwgYXMgc2hvd24gaW4gdGhlIGV4YW1wbGUgYmVsb3cuXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVXNlZnVsU2VydmljZSB7fVxuICpcbiAqIGNsYXNzIE5lZWRzU2VydmljZSB7XG4gKiAgIGNvbnN0cnVjdG9yKHB1YmxpYyBzZXJ2aWNlOlVzZWZ1bFNlcnZpY2UpIHt9XG4gKiB9XG4gKlxuICogdmFyIGluamVjdG9yID0gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbTmVlZHNTZXJ2aWNlLCBVc2VmdWxTZXJ2aWNlXSk7XG4gKiBleHBlY3QoKCkgPT4gaW5qZWN0b3IuZ2V0KE5lZWRzU2VydmljZSkpLnRvVGhyb3dFcnJvcigpO1xuICogYGBgXG4gKi9cbkBDT05TVCgpXG5leHBvcnQgY2xhc3MgSW5qZWN0YWJsZU1ldGFkYXRhIHtcbiAgY29uc3RydWN0b3IoKSB7fVxufVxuXG4vKipcbiAqIFNwZWNpZmllcyB0aGF0IGFuIHtAbGluayBJbmplY3Rvcn0gc2hvdWxkIHJldHJpZXZlIGEgZGVwZW5kZW5jeSBvbmx5IGZyb20gaXRzZWxmLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9OZWFnQWc/cD1wcmV2aWV3KSlcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBEZXBlbmRlbmN5IHtcbiAqIH1cbiAqXG4gKiBASW5qZWN0YWJsZSgpXG4gKiBjbGFzcyBOZWVkc0RlcGVuZGVuY3kge1xuICogICBkZXBlbmRlbmN5O1xuICogICBjb25zdHJ1Y3RvcihAU2VsZigpIGRlcGVuZGVuY3k6RGVwZW5kZW5jeSkge1xuICogICAgIHRoaXMuZGVwZW5kZW5jeSA9IGRlcGVuZGVuY3k7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiB2YXIgaW5qID0gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbRGVwZW5kZW5jeSwgTmVlZHNEZXBlbmRlbmN5XSk7XG4gKiB2YXIgbmQgPSBpbmouZ2V0KE5lZWRzRGVwZW5kZW5jeSk7XG4gKlxuICogZXhwZWN0KG5kLmRlcGVuZGVuY3kgaW5zdGFuY2VvZiBEZXBlbmRlbmN5KS50b0JlKHRydWUpO1xuICpcbiAqIHZhciBpbmogPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtEZXBlbmRlbmN5XSk7XG4gKiB2YXIgY2hpbGQgPSBpbmoucmVzb2x2ZUFuZENyZWF0ZUNoaWxkKFtOZWVkc0RlcGVuZGVuY3ldKTtcbiAqIGV4cGVjdCgoKSA9PiBjaGlsZC5nZXQoTmVlZHNEZXBlbmRlbmN5KSkudG9UaHJvd0Vycm9yKCk7XG4gKiBgYGBcbiAqL1xuQENPTlNUKClcbmV4cG9ydCBjbGFzcyBTZWxmTWV0YWRhdGEge1xuICB0b1N0cmluZygpOiBzdHJpbmcgeyByZXR1cm4gYEBTZWxmKClgOyB9XG59XG5cbi8qKlxuICogU3BlY2lmaWVzIHRoYXQgdGhlIGRlcGVuZGVuY3kgcmVzb2x1dGlvbiBzaG91bGQgc3RhcnQgZnJvbSB0aGUgcGFyZW50IGluamVjdG9yLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9XY2hkemI/cD1wcmV2aWV3KSlcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBEZXBlbmRlbmN5IHtcbiAqIH1cbiAqXG4gKiBASW5qZWN0YWJsZSgpXG4gKiBjbGFzcyBOZWVkc0RlcGVuZGVuY3kge1xuICogICBkZXBlbmRlbmN5O1xuICogICBjb25zdHJ1Y3RvcihAU2tpcFNlbGYoKSBkZXBlbmRlbmN5OkRlcGVuZGVuY3kpIHtcbiAqICAgICB0aGlzLmRlcGVuZGVuY3kgPSBkZXBlbmRlbmN5O1xuICogICB9XG4gKiB9XG4gKlxuICogdmFyIHBhcmVudCA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW0RlcGVuZGVuY3ldKTtcbiAqIHZhciBjaGlsZCA9IHBhcmVudC5yZXNvbHZlQW5kQ3JlYXRlQ2hpbGQoW05lZWRzRGVwZW5kZW5jeV0pO1xuICogZXhwZWN0KGNoaWxkLmdldChOZWVkc0RlcGVuZGVuY3kpLmRlcGVuZGVuY3kgaW5zdGFuY2VvZiBEZXBlZGVuY3kpLnRvQmUodHJ1ZSk7XG4gKlxuICogdmFyIGluaiA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW0RlcGVuZGVuY3ksIE5lZWRzRGVwZW5kZW5jeV0pO1xuICogZXhwZWN0KCgpID0+IGluai5nZXQoTmVlZHNEZXBlbmRlbmN5KSkudG9UaHJvd0Vycm9yKCk7XG4gKiBgYGBcbiAqL1xuQENPTlNUKClcbmV4cG9ydCBjbGFzcyBTa2lwU2VsZk1ldGFkYXRhIHtcbiAgdG9TdHJpbmcoKTogc3RyaW5nIHsgcmV0dXJuIGBAU2tpcFNlbGYoKWA7IH1cbn1cblxuLyoqXG4gKiBTcGVjaWZpZXMgdGhhdCBhbiBpbmplY3RvciBzaG91bGQgcmV0cmlldmUgYSBkZXBlbmRlbmN5IGZyb20gYW55IGluamVjdG9yIHVudGlsIHJlYWNoaW5nIHRoZVxuICogY2xvc2VzdCBob3N0LlxuICpcbiAqIEluIEFuZ3VsYXIsIGEgY29tcG9uZW50IGVsZW1lbnQgaXMgYXV0b21hdGljYWxseSBkZWNsYXJlZCBhcyBhIGhvc3QgZm9yIGFsbCB0aGUgaW5qZWN0b3JzIGluXG4gKiBpdHMgdmlldy5cbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvR1g3OXBWP3A9cHJldmlldykpXG4gKlxuICogSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlIGBBcHBgIGNvbnRhaW5zIGBQYXJlbnRDbXBgLCB3aGljaCBjb250YWlucyBgQ2hpbGREaXJlY3RpdmVgLlxuICogU28gYFBhcmVudENtcGAgaXMgdGhlIGhvc3Qgb2YgYENoaWxkRGlyZWN0aXZlYC5cbiAqXG4gKiBgQ2hpbGREaXJlY3RpdmVgIGRlcGVuZHMgb24gdHdvIHNlcnZpY2VzOiBgSG9zdFNlcnZpY2VgIGFuZCBgT3RoZXJTZXJ2aWNlYC5cbiAqIGBIb3N0U2VydmljZWAgaXMgZGVmaW5lZCBhdCBgUGFyZW50Q21wYCwgYW5kIGBPdGhlclNlcnZpY2VgIGlzIGRlZmluZWQgYXQgYEFwcGAuXG4gKlxuICpgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBPdGhlclNlcnZpY2Uge31cbiAqIGNsYXNzIEhvc3RTZXJ2aWNlIHt9XG4gKlxuICogQERpcmVjdGl2ZSh7XG4gKiAgIHNlbGVjdG9yOiAnY2hpbGQtZGlyZWN0aXZlJ1xuICogfSlcbiAqIGNsYXNzIENoaWxkRGlyZWN0aXZlIHtcbiAqICAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgQEhvc3QoKSBvczpPdGhlclNlcnZpY2UsIEBPcHRpb25hbCgpIEBIb3N0KCkgaHM6SG9zdFNlcnZpY2Upe1xuICogICAgIGNvbnNvbGUubG9nKFwib3MgaXMgbnVsbFwiLCBvcyk7XG4gKiAgICAgY29uc29sZS5sb2coXCJocyBpcyBOT1QgbnVsbFwiLCBocyk7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICdwYXJlbnQtY21wJyxcbiAqICAgcHJvdmlkZXJzOiBbSG9zdFNlcnZpY2VdLFxuICogICB0ZW1wbGF0ZTogYFxuICogICAgIERpcjogPGNoaWxkLWRpcmVjdGl2ZT48L2NoaWxkLWRpcmVjdGl2ZT5cbiAqICAgYCxcbiAqICAgZGlyZWN0aXZlczogW0NoaWxkRGlyZWN0aXZlXVxuICogfSlcbiAqIGNsYXNzIFBhcmVudENtcCB7XG4gKiB9XG4gKlxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAnYXBwJyxcbiAqICAgcHJvdmlkZXJzOiBbT3RoZXJTZXJ2aWNlXSxcbiAqICAgdGVtcGxhdGU6IGBcbiAqICAgICBQYXJlbnQ6IDxwYXJlbnQtY21wPjwvcGFyZW50LWNtcD5cbiAqICAgYCxcbiAqICAgZGlyZWN0aXZlczogW1BhcmVudENtcF1cbiAqIH0pXG4gKiBjbGFzcyBBcHAge1xuICogfVxuICpcbiAqIGJvb3RzdHJhcChBcHApO1xuICpgYGBcbiAqL1xuQENPTlNUKClcbmV4cG9ydCBjbGFzcyBIb3N0TWV0YWRhdGEge1xuICB0b1N0cmluZygpOiBzdHJpbmcgeyByZXR1cm4gYEBIb3N0KClgOyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9kaS9tZXRhZGF0YS50c1xuICoqLyIsImltcG9ydCB7XG4gIEluamVjdE1ldGFkYXRhLFxuICBPcHRpb25hbE1ldGFkYXRhLFxuICBJbmplY3RhYmxlTWV0YWRhdGEsXG4gIFNlbGZNZXRhZGF0YSxcbiAgSG9zdE1ldGFkYXRhLFxuICBTa2lwU2VsZk1ldGFkYXRhXG59IGZyb20gJy4vbWV0YWRhdGEnO1xuaW1wb3J0IHttYWtlRGVjb3JhdG9yLCBtYWtlUGFyYW1EZWNvcmF0b3J9IGZyb20gJy4uL3V0aWwvZGVjb3JhdG9ycyc7XG5cbi8qKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcge0BsaW5rIEluamVjdE1ldGFkYXRhfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmplY3RGYWN0b3J5IHtcbiAgKHRva2VuOiBhbnkpOiBhbnk7XG4gIG5ldyAodG9rZW46IGFueSk6IEluamVjdE1ldGFkYXRhO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZm9yIGNyZWF0aW5nIHtAbGluayBPcHRpb25hbE1ldGFkYXRhfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcHRpb25hbEZhY3Rvcnkge1xuICAoKTogYW55O1xuICBuZXcgKCk6IE9wdGlvbmFsTWV0YWRhdGE7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcge0BsaW5rIEluamVjdGFibGVNZXRhZGF0YX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5qZWN0YWJsZUZhY3Rvcnkge1xuICAoKTogYW55O1xuICBuZXcgKCk6IEluamVjdGFibGVNZXRhZGF0YTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZvciBjcmVhdGluZyB7QGxpbmsgU2VsZk1ldGFkYXRhfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWxmRmFjdG9yeSB7XG4gICgpOiBhbnk7XG4gIG5ldyAoKTogU2VsZk1ldGFkYXRhO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZm9yIGNyZWF0aW5nIHtAbGluayBIb3N0TWV0YWRhdGF9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhvc3RGYWN0b3J5IHtcbiAgKCk6IGFueTtcbiAgbmV3ICgpOiBIb3N0TWV0YWRhdGE7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcge0BsaW5rIFNraXBTZWxmTWV0YWRhdGF9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNraXBTZWxmRmFjdG9yeSB7XG4gICgpOiBhbnk7XG4gIG5ldyAoKTogU2tpcFNlbGZNZXRhZGF0YTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZvciBjcmVhdGluZyB7QGxpbmsgSW5qZWN0TWV0YWRhdGF9LlxuICovXG5leHBvcnQgdmFyIEluamVjdDogSW5qZWN0RmFjdG9yeSA9IG1ha2VQYXJhbURlY29yYXRvcihJbmplY3RNZXRhZGF0YSk7XG5cbi8qKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcge0BsaW5rIE9wdGlvbmFsTWV0YWRhdGF9LlxuICovXG5leHBvcnQgdmFyIE9wdGlvbmFsOiBPcHRpb25hbEZhY3RvcnkgPSBtYWtlUGFyYW1EZWNvcmF0b3IoT3B0aW9uYWxNZXRhZGF0YSk7XG5cbi8qKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcge0BsaW5rIEluamVjdGFibGVNZXRhZGF0YX0uXG4gKi9cbmV4cG9ydCB2YXIgSW5qZWN0YWJsZTogSW5qZWN0YWJsZUZhY3RvcnkgPSA8SW5qZWN0YWJsZUZhY3Rvcnk+bWFrZURlY29yYXRvcihJbmplY3RhYmxlTWV0YWRhdGEpO1xuXG4vKipcbiAqIEZhY3RvcnkgZm9yIGNyZWF0aW5nIHtAbGluayBTZWxmTWV0YWRhdGF9LlxuICovXG5leHBvcnQgdmFyIFNlbGY6IFNlbGZGYWN0b3J5ID0gbWFrZVBhcmFtRGVjb3JhdG9yKFNlbGZNZXRhZGF0YSk7XG5cbi8qKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcge0BsaW5rIEhvc3RNZXRhZGF0YX0uXG4gKi9cbmV4cG9ydCB2YXIgSG9zdDogSG9zdEZhY3RvcnkgPSBtYWtlUGFyYW1EZWNvcmF0b3IoSG9zdE1ldGFkYXRhKTtcblxuLyoqXG4gKiBGYWN0b3J5IGZvciBjcmVhdGluZyB7QGxpbmsgU2tpcFNlbGZNZXRhZGF0YX0uXG4gKi9cbmV4cG9ydCB2YXIgU2tpcFNlbGY6IFNraXBTZWxmRmFjdG9yeSA9IG1ha2VQYXJhbURlY29yYXRvcihTa2lwU2VsZk1ldGFkYXRhKTtcblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9kaS9kZWNvcmF0b3JzLnRzXG4gKiovIiwiaW1wb3J0IHtDb25jcmV0ZVR5cGUsIGdsb2JhbCwgVHlwZSwgaXNGdW5jdGlvbiwgc3RyaW5naWZ5fSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuXG4vKipcbiAqIERlY2xhcmVzIHRoZSBpbnRlcmZhY2UgdG8gYmUgdXNlZCB3aXRoIHtAbGluayBDbGFzc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xhc3NEZWZpbml0aW9uIHtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGFyZ3VtZW50IGZvciBzcGVjaWZ5aW5nIHRoZSBzdXBlcmNsYXNzLlxuICAgKi9cbiAgZXh0ZW5kcz86IFR5cGU7XG5cbiAgLyoqXG4gICAqIFJlcXVpcmVkIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIGZvciBhIGNsYXNzLlxuICAgKlxuICAgKiBUaGUgZnVuY3Rpb24gbWF5IGJlIG9wdGlvbmFsbHkgd3JhcHBlZCBpbiBhbiBgQXJyYXlgLCBpbiB3aGljaCBjYXNlIGFkZGl0aW9uYWwgcGFyYW1ldGVyXG4gICAqIGFubm90YXRpb25zIG1heSBiZSBzcGVjaWZpZWQuXG4gICAqIFRoZSBudW1iZXIgb2YgYXJndW1lbnRzIGFuZCB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlciBhbm5vdGF0aW9ucyBtdXN0IG1hdGNoLlxuICAgKlxuICAgKiBTZWUge0BsaW5rIENsYXNzfSBmb3IgZXhhbXBsZSBvZiB1c2FnZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yOiBGdW5jdGlvbiB8IGFueVtdO1xuXG4gIC8qKlxuICAgKiBPdGhlciBtZXRob2RzIG9uIHRoZSBjbGFzcy4gTm90ZSB0aGF0IHZhbHVlcyBzaG91bGQgaGF2ZSB0eXBlICdGdW5jdGlvbicgYnV0IFRTIHJlcXVpcmVzXG4gICAqIGFsbCBwcm9wZXJ0aWVzIHRvIGhhdmUgYSBuYXJyb3dlciB0eXBlIHRoYW4gdGhlIGluZGV4IHNpZ25hdHVyZS5cbiAgICovXG4gIFt4OiBzdHJpbmddOiBUeXBlIHwgRnVuY3Rpb24gfCBhbnlbXTtcbn1cblxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgYWxsIEFuZ3VsYXIgdHlwZSBkZWNvcmF0b3JzLCB3aGljaCBhbGxvd3MgdGhlbSB0byBiZSB1c2VkIGFzIEVTN1xuICogZGVjb3JhdG9ycyBhcyB3ZWxsIGFzXG4gKiBBbmd1bGFyIERTTCBzeW50YXguXG4gKlxuICogRFNMIHN5bnRheDpcbiAqXG4gKiBgYGBcbiAqIHZhciBNeUNsYXNzID0gbmdcbiAqICAgLkNvbXBvbmVudCh7Li4ufSlcbiAqICAgLlZpZXcoey4uLn0pXG4gKiAgIC5DbGFzcyh7Li4ufSk7XG4gKiBgYGBcbiAqXG4gKiBFUzcgc3ludGF4OlxuICpcbiAqIGBgYFxuICogQG5nLkNvbXBvbmVudCh7Li4ufSlcbiAqIEBuZy5WaWV3KHsuLi59KVxuICogY2xhc3MgTXlDbGFzcyB7Li4ufVxuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHlwZURlY29yYXRvciB7XG4gIC8qKlxuICAgKiBJbnZva2UgYXMgRVM3IGRlY29yYXRvci5cbiAgICovXG4gIDxUIGV4dGVuZHMgVHlwZT4odHlwZTogVCk6IFQ7XG5cbiAgLy8gTWFrZSBUeXBlRGVjb3JhdG9yIGFzc2lnbmFibGUgdG8gYnVpbHQtaW4gUGFyYW1ldGVyRGVjb3JhdG9yIHR5cGUuXG4gIC8vIFBhcmFtZXRlckRlY29yYXRvciBpcyBkZWNsYXJlZCBpbiBsaWIuZC50cyBhcyBhIGBkZWNsYXJlIHR5cGVgXG4gIC8vIHNvIHdlIGNhbm5vdCBkZWNsYXJlIHRoaXMgaW50ZXJmYWNlIGFzIGEgc3VidHlwZS5cbiAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzMzNzkjaXNzdWVjb21tZW50LTEyNjE2OTQxN1xuICAodGFyZ2V0OiBPYmplY3QsIHByb3BlcnR5S2V5Pzogc3RyaW5nIHwgc3ltYm9sLCBwYXJhbWV0ZXJJbmRleD86IG51bWJlcik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFN0b3JhZ2UgZm9yIHRoZSBhY2N1bXVsYXRlZCBhbm5vdGF0aW9ucyBzbyBmYXIgdXNlZCBieSB0aGUgRFNMIHN5bnRheC5cbiAgICpcbiAgICogVXNlZCBieSB7QGxpbmsgQ2xhc3N9IHRvIGFubm90YXRlIHRoZSBnZW5lcmF0ZWQgY2xhc3MuXG4gICAqL1xuICBhbm5vdGF0aW9uczogYW55W107XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEgY2xhc3MgZnJvbSB0aGUgZGVmaW5pdGlvbiBhbmQgYW5ub3RhdGUgaXQgd2l0aCB7QGxpbmsgVHlwZURlY29yYXRvciNhbm5vdGF0aW9uc30uXG4gICAqL1xuICBDbGFzcyhvYmo6IENsYXNzRGVmaW5pdGlvbik6IENvbmNyZXRlVHlwZTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdEFubm90YXRpb24oYW5ub3RhdGlvbjogYW55KTogYW55IHtcbiAgaWYgKGlzRnVuY3Rpb24oYW5ub3RhdGlvbikgJiYgYW5ub3RhdGlvbi5oYXNPd25Qcm9wZXJ0eSgnYW5ub3RhdGlvbicpKSB7XG4gICAgLy8gaXQgaXMgYSBkZWNvcmF0b3IsIGV4dHJhY3QgYW5ub3RhdGlvblxuICAgIGFubm90YXRpb24gPSBhbm5vdGF0aW9uLmFubm90YXRpb247XG4gIH1cbiAgcmV0dXJuIGFubm90YXRpb247XG59XG5cbmZ1bmN0aW9uIGFwcGx5UGFyYW1zKGZuT3JBcnJheTogKEZ1bmN0aW9uIHwgYW55W10pLCBrZXk6IHN0cmluZyk6IEZ1bmN0aW9uIHtcbiAgaWYgKGZuT3JBcnJheSA9PT0gT2JqZWN0IHx8IGZuT3JBcnJheSA9PT0gU3RyaW5nIHx8IGZuT3JBcnJheSA9PT0gRnVuY3Rpb24gfHxcbiAgICAgIGZuT3JBcnJheSA9PT0gTnVtYmVyIHx8IGZuT3JBcnJheSA9PT0gQXJyYXkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbiBub3QgdXNlIG5hdGl2ZSAke3N0cmluZ2lmeShmbk9yQXJyYXkpfSBhcyBjb25zdHJ1Y3RvcmApO1xuICB9XG4gIGlmIChpc0Z1bmN0aW9uKGZuT3JBcnJheSkpIHtcbiAgICByZXR1cm4gPEZ1bmN0aW9uPmZuT3JBcnJheTtcbiAgfSBlbHNlIGlmIChmbk9yQXJyYXkgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgIHZhciBhbm5vdGF0aW9uczogYW55W10gPSBmbk9yQXJyYXk7XG4gICAgdmFyIGZuOiBGdW5jdGlvbiA9IGZuT3JBcnJheVtmbk9yQXJyYXkubGVuZ3RoIC0gMV07XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGZuKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBMYXN0IHBvc2l0aW9uIG9mIENsYXNzIG1ldGhvZCBhcnJheSBtdXN0IGJlIEZ1bmN0aW9uIGluIGtleSAke2tleX0gd2FzICcke3N0cmluZ2lmeShmbil9J2ApO1xuICAgIH1cbiAgICB2YXIgYW5ub0xlbmd0aCA9IGFubm90YXRpb25zLmxlbmd0aCAtIDE7XG4gICAgaWYgKGFubm9MZW5ndGggIT0gZm4ubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE51bWJlciBvZiBhbm5vdGF0aW9ucyAoJHthbm5vTGVuZ3RofSkgZG9lcyBub3QgbWF0Y2ggbnVtYmVyIG9mIGFyZ3VtZW50cyAoJHtmbi5sZW5ndGh9KSBpbiB0aGUgZnVuY3Rpb246ICR7c3RyaW5naWZ5KGZuKX1gKTtcbiAgICB9XG4gICAgdmFyIHBhcmFtc0Fubm90YXRpb25zOiBhbnlbXVtdID0gW107XG4gICAgZm9yICh2YXIgaSA9IDAsIGlpID0gYW5ub3RhdGlvbnMubGVuZ3RoIC0gMTsgaSA8IGlpOyBpKyspIHtcbiAgICAgIHZhciBwYXJhbUFubm90YXRpb25zOiBhbnlbXSA9IFtdO1xuICAgICAgcGFyYW1zQW5ub3RhdGlvbnMucHVzaChwYXJhbUFubm90YXRpb25zKTtcbiAgICAgIHZhciBhbm5vdGF0aW9uID0gYW5ub3RhdGlvbnNbaV07XG4gICAgICBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYW5ub3RhdGlvbi5sZW5ndGg7IGorKykge1xuICAgICAgICAgIHBhcmFtQW5ub3RhdGlvbnMucHVzaChleHRyYWN0QW5ub3RhdGlvbihhbm5vdGF0aW9uW2pdKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihhbm5vdGF0aW9uKSkge1xuICAgICAgICBwYXJhbUFubm90YXRpb25zLnB1c2goZXh0cmFjdEFubm90YXRpb24oYW5ub3RhdGlvbikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFyYW1Bbm5vdGF0aW9ucy5wdXNoKGFubm90YXRpb24pO1xuICAgICAgfVxuICAgIH1cbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKCdwYXJhbWV0ZXJzJywgcGFyYW1zQW5ub3RhdGlvbnMsIGZuKTtcbiAgICByZXR1cm4gZm47XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgT25seSBGdW5jdGlvbiBvciBBcnJheSBpcyBzdXBwb3J0ZWQgaW4gQ2xhc3MgZGVmaW5pdGlvbiBmb3Iga2V5ICcke2tleX0nIGlzICcke3N0cmluZ2lmeShmbk9yQXJyYXkpfSdgKTtcbiAgfVxufVxuXG4vKipcbiAqIFByb3ZpZGVzIGEgd2F5IGZvciBleHByZXNzaW5nIEVTNiBjbGFzc2VzIHdpdGggcGFyYW1ldGVyIGFubm90YXRpb25zIGluIEVTNS5cbiAqXG4gKiAjIyBCYXNpYyBFeGFtcGxlXG4gKlxuICogYGBgXG4gKiB2YXIgR3JlZXRlciA9IG5nLkNsYXNzKHtcbiAqICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKG5hbWUpIHtcbiAqICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICogICB9LFxuICpcbiAqICAgZ3JlZXQ6IGZ1bmN0aW9uKCkge1xuICogICAgIGFsZXJ0KCdIZWxsbyAnICsgdGhpcy5uYW1lICsgJyEnKTtcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBpcyBlcXVpdmFsZW50IHRvIEVTNjpcbiAqXG4gKiBgYGBcbiAqIGNsYXNzIEdyZWV0ZXIge1xuICogICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gKiAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAqICAgfVxuICpcbiAqICAgZ3JlZXQoKSB7XG4gKiAgICAgYWxlcnQoJ0hlbGxvICcgKyB0aGlzLm5hbWUgKyAnIScpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBvciBlcXVpdmFsZW50IHRvIEVTNTpcbiAqXG4gKiBgYGBcbiAqIHZhciBHcmVldGVyID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAqICAgdGhpcy5uYW1lID0gbmFtZTtcbiAqIH1cbiAqXG4gKiBHcmVldGVyLnByb3RvdHlwZS5ncmVldCA9IGZ1bmN0aW9uICgpIHtcbiAqICAgYWxlcnQoJ0hlbGxvICcgKyB0aGlzLm5hbWUgKyAnIScpO1xuICogfVxuICogYGBgXG4gKlxuICogIyMjIEV4YW1wbGUgd2l0aCBwYXJhbWV0ZXIgYW5ub3RhdGlvbnNcbiAqXG4gKiBgYGBcbiAqIHZhciBNeVNlcnZpY2UgPSBuZy5DbGFzcyh7XG4gKiAgIGNvbnN0cnVjdG9yOiBbU3RyaW5nLCBbbmV3IFF1ZXJ5KCksIFF1ZXJ5TGlzdF0sIGZ1bmN0aW9uKG5hbWUsIHF1ZXJ5TGlzdCkge1xuICogICAgIC4uLlxuICogICB9XVxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBpcyBlcXVpdmFsZW50IHRvIEVTNjpcbiAqXG4gKiBgYGBcbiAqIGNsYXNzIE15U2VydmljZSB7XG4gKiAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgQFF1ZXJ5KCkgcXVlcnlMaXN0OiBRdWVyeUxpc3QpIHtcbiAqICAgICAuLi5cbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogIyMjIEV4YW1wbGUgd2l0aCBpbmhlcml0YW5jZVxuICpcbiAqIGBgYFxuICogdmFyIFNoYXBlID0gbmcuQ2xhc3Moe1xuICogICBjb25zdHJ1Y3RvcjogKGNvbG9yKSB7XG4gKiAgICAgdGhpcy5jb2xvciA9IGNvbG9yO1xuICogICB9XG4gKiB9KTtcbiAqXG4gKiB2YXIgU3F1YXJlID0gbmcuQ2xhc3Moe1xuICogICBleHRlbmRzOiBTaGFwZSxcbiAqICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGNvbG9yLCBzaXplKSB7XG4gKiAgICAgU2hhcGUuY2FsbCh0aGlzLCBjb2xvcik7XG4gKiAgICAgdGhpcy5zaXplID0gc2l6ZTtcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENsYXNzKGNsc0RlZjogQ2xhc3NEZWZpbml0aW9uKTogQ29uY3JldGVUeXBlIHtcbiAgdmFyIGNvbnN0cnVjdG9yID0gYXBwbHlQYXJhbXMoXG4gICAgICBjbHNEZWYuaGFzT3duUHJvcGVydHkoJ2NvbnN0cnVjdG9yJykgPyBjbHNEZWYuY29uc3RydWN0b3IgOiB1bmRlZmluZWQsICdjb25zdHJ1Y3RvcicpO1xuICB2YXIgcHJvdG8gPSBjb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIGlmIChjbHNEZWYuaGFzT3duUHJvcGVydHkoJ2V4dGVuZHMnKSkge1xuICAgIGlmIChpc0Z1bmN0aW9uKGNsc0RlZi5leHRlbmRzKSkge1xuICAgICAgKDxGdW5jdGlvbj5jb25zdHJ1Y3RvcikucHJvdG90eXBlID0gcHJvdG8gPVxuICAgICAgICAgIE9iamVjdC5jcmVhdGUoKDxGdW5jdGlvbj5jbHNEZWYuZXh0ZW5kcykucHJvdG90eXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDbGFzcyBkZWZpbml0aW9uICdleHRlbmRzJyBwcm9wZXJ0eSBtdXN0IGJlIGEgY29uc3RydWN0b3IgZnVuY3Rpb24gd2FzOiAke3N0cmluZ2lmeShjbHNEZWYuZXh0ZW5kcyl9YCk7XG4gICAgfVxuICB9XG4gIGZvciAodmFyIGtleSBpbiBjbHNEZWYpIHtcbiAgICBpZiAoa2V5ICE9ICdleHRlbmRzJyAmJiBrZXkgIT0gJ3Byb3RvdHlwZScgJiYgY2xzRGVmLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIHByb3RvW2tleV0gPSBhcHBseVBhcmFtcyhjbHNEZWZba2V5XSwga2V5KTtcbiAgICB9XG4gIH1cblxuICBpZiAodGhpcyAmJiB0aGlzLmFubm90YXRpb25zIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKCdhbm5vdGF0aW9ucycsIHRoaXMuYW5ub3RhdGlvbnMsIGNvbnN0cnVjdG9yKTtcbiAgfVxuXG4gIHJldHVybiA8Q29uY3JldGVUeXBlPmNvbnN0cnVjdG9yO1xufVxuXG52YXIgUmVmbGVjdCA9IGdsb2JhbC5SZWZsZWN0O1xuaWYgKCEoUmVmbGVjdCAmJiBSZWZsZWN0LmdldE1ldGFkYXRhKSkge1xuICB0aHJvdyAncmVmbGVjdC1tZXRhZGF0YSBzaGltIGlzIHJlcXVpcmVkIHdoZW4gdXNpbmcgY2xhc3MgZGVjb3JhdG9ycyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlRGVjb3JhdG9yKFxuICAgIGFubm90YXRpb25DbHMsIGNoYWluRm46IChmbjogRnVuY3Rpb24pID0+IHZvaWQgPSBudWxsKTogKC4uLmFyZ3M6IGFueVtdKSA9PiAoY2xzOiBhbnkpID0+IGFueSB7XG4gIGZ1bmN0aW9uIERlY29yYXRvckZhY3Rvcnkob2JqT3JUeXBlKTogKGNsczogYW55KSA9PiBhbnkge1xuICAgIHZhciBhbm5vdGF0aW9uSW5zdGFuY2UgPSBuZXcgKDxhbnk+YW5ub3RhdGlvbkNscykob2JqT3JUeXBlKTtcbiAgICBpZiAodGhpcyBpbnN0YW5jZW9mIGFubm90YXRpb25DbHMpIHtcbiAgICAgIHJldHVybiBhbm5vdGF0aW9uSW5zdGFuY2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBjaGFpbkFubm90YXRpb24gPVxuICAgICAgICAgIGlzRnVuY3Rpb24odGhpcykgJiYgdGhpcy5hbm5vdGF0aW9ucyBpbnN0YW5jZW9mIEFycmF5ID8gdGhpcy5hbm5vdGF0aW9ucyA6IFtdO1xuICAgICAgY2hhaW5Bbm5vdGF0aW9uLnB1c2goYW5ub3RhdGlvbkluc3RhbmNlKTtcbiAgICAgIHZhciBUeXBlRGVjb3JhdG9yOiBUeXBlRGVjb3JhdG9yID0gPFR5cGVEZWNvcmF0b3I+ZnVuY3Rpb24gVHlwZURlY29yYXRvcihjbHMpIHtcbiAgICAgICAgdmFyIGFubm90YXRpb25zID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YSgnYW5ub3RhdGlvbnMnLCBjbHMpO1xuICAgICAgICBhbm5vdGF0aW9ucyA9IGFubm90YXRpb25zIHx8IFtdO1xuICAgICAgICBhbm5vdGF0aW9ucy5wdXNoKGFubm90YXRpb25JbnN0YW5jZSk7XG4gICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoJ2Fubm90YXRpb25zJywgYW5ub3RhdGlvbnMsIGNscyk7XG4gICAgICAgIHJldHVybiBjbHM7XG4gICAgICB9O1xuICAgICAgVHlwZURlY29yYXRvci5hbm5vdGF0aW9ucyA9IGNoYWluQW5ub3RhdGlvbjtcbiAgICAgIFR5cGVEZWNvcmF0b3IuQ2xhc3MgPSBDbGFzcztcbiAgICAgIGlmIChjaGFpbkZuKSBjaGFpbkZuKFR5cGVEZWNvcmF0b3IpO1xuICAgICAgcmV0dXJuIFR5cGVEZWNvcmF0b3I7XG4gICAgfVxuICB9XG4gIERlY29yYXRvckZhY3RvcnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShhbm5vdGF0aW9uQ2xzLnByb3RvdHlwZSk7XG4gIHJldHVybiBEZWNvcmF0b3JGYWN0b3J5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFrZVBhcmFtRGVjb3JhdG9yKGFubm90YXRpb25DbHMpOiBhbnkge1xuICBmdW5jdGlvbiBQYXJhbURlY29yYXRvckZhY3RvcnkoLi4uYXJncyk6IGFueSB7XG4gICAgdmFyIGFubm90YXRpb25JbnN0YW5jZSA9IE9iamVjdC5jcmVhdGUoYW5ub3RhdGlvbkNscy5wcm90b3R5cGUpO1xuICAgIGFubm90YXRpb25DbHMuYXBwbHkoYW5ub3RhdGlvbkluc3RhbmNlLCBhcmdzKTtcbiAgICBpZiAodGhpcyBpbnN0YW5jZW9mIGFubm90YXRpb25DbHMpIHtcbiAgICAgIHJldHVybiBhbm5vdGF0aW9uSW5zdGFuY2U7XG4gICAgfSBlbHNlIHtcbiAgICAgICg8YW55PlBhcmFtRGVjb3JhdG9yKS5hbm5vdGF0aW9uID0gYW5ub3RhdGlvbkluc3RhbmNlO1xuICAgICAgcmV0dXJuIFBhcmFtRGVjb3JhdG9yO1xuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gUGFyYW1EZWNvcmF0b3IoY2xzLCB1bnVzZWRLZXksIGluZGV4KTogYW55IHtcbiAgICAgIHZhciBwYXJhbWV0ZXJzOiBhbnlbXVtdID0gUmVmbGVjdC5nZXRNZXRhZGF0YSgncGFyYW1ldGVycycsIGNscyk7XG4gICAgICBwYXJhbWV0ZXJzID0gcGFyYW1ldGVycyB8fCBbXTtcblxuICAgICAgLy8gdGhlcmUgbWlnaHQgYmUgZ2FwcyBpZiBzb21lIGluIGJldHdlZW4gcGFyYW1ldGVycyBkbyBub3QgaGF2ZSBhbm5vdGF0aW9ucy5cbiAgICAgIC8vIHdlIHBhZCB3aXRoIG51bGxzLlxuICAgICAgd2hpbGUgKHBhcmFtZXRlcnMubGVuZ3RoIDw9IGluZGV4KSB7XG4gICAgICAgIHBhcmFtZXRlcnMucHVzaChudWxsKTtcbiAgICAgIH1cblxuICAgICAgcGFyYW1ldGVyc1tpbmRleF0gPSBwYXJhbWV0ZXJzW2luZGV4XSB8fCBbXTtcbiAgICAgIHZhciBhbm5vdGF0aW9uc0ZvclBhcmFtOiBhbnlbXSA9IHBhcmFtZXRlcnNbaW5kZXhdO1xuICAgICAgYW5ub3RhdGlvbnNGb3JQYXJhbS5wdXNoKGFubm90YXRpb25JbnN0YW5jZSk7XG5cbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoJ3BhcmFtZXRlcnMnLCBwYXJhbWV0ZXJzLCBjbHMpO1xuICAgICAgcmV0dXJuIGNscztcbiAgICB9XG4gIH1cbiAgUGFyYW1EZWNvcmF0b3JGYWN0b3J5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoYW5ub3RhdGlvbkNscy5wcm90b3R5cGUpO1xuICByZXR1cm4gUGFyYW1EZWNvcmF0b3JGYWN0b3J5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFrZVByb3BEZWNvcmF0b3IoZGVjb3JhdG9yQ2xzKTogYW55IHtcbiAgZnVuY3Rpb24gUHJvcERlY29yYXRvckZhY3RvcnkoLi4uYXJncyk6IGFueSB7XG4gICAgdmFyIGRlY29yYXRvckluc3RhbmNlID0gT2JqZWN0LmNyZWF0ZShkZWNvcmF0b3JDbHMucHJvdG90eXBlKTtcbiAgICBkZWNvcmF0b3JDbHMuYXBwbHkoZGVjb3JhdG9ySW5zdGFuY2UsIGFyZ3MpO1xuXG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBkZWNvcmF0b3JDbHMpIHtcbiAgICAgIHJldHVybiBkZWNvcmF0b3JJbnN0YW5jZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIFByb3BEZWNvcmF0b3IodGFyZ2V0OiBhbnksIG5hbWU6IHN0cmluZykge1xuICAgICAgICB2YXIgbWV0YSA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoJ3Byb3BNZXRhZGF0YScsIHRhcmdldC5jb25zdHJ1Y3Rvcik7XG4gICAgICAgIG1ldGEgPSBtZXRhIHx8IHt9O1xuICAgICAgICBtZXRhW25hbWVdID0gbWV0YVtuYW1lXSB8fCBbXTtcbiAgICAgICAgbWV0YVtuYW1lXS51bnNoaWZ0KGRlY29yYXRvckluc3RhbmNlKTtcbiAgICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YSgncHJvcE1ldGFkYXRhJywgbWV0YSwgdGFyZ2V0LmNvbnN0cnVjdG9yKTtcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIFByb3BEZWNvcmF0b3JGYWN0b3J5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoZGVjb3JhdG9yQ2xzLnByb3RvdHlwZSk7XG4gIHJldHVybiBQcm9wRGVjb3JhdG9yRmFjdG9yeTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL3V0aWwvZGVjb3JhdG9ycy50c1xuICoqLyIsImltcG9ydCB7VHlwZSwgc3RyaW5naWZ5LCBpc0Z1bmN0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuXG4vKipcbiAqIEFuIGludGVyZmFjZSB0aGF0IGEgZnVuY3Rpb24gcGFzc2VkIGludG8ge0BsaW5rIGZvcndhcmRSZWZ9IGhhcyB0byBpbXBsZW1lbnQuXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiB7QGV4YW1wbGUgY29yZS9kaS90cy9mb3J3YXJkX3JlZi9mb3J3YXJkX3JlZi50cyByZWdpb249J2ZvcndhcmRfcmVmX2ZuJ31cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGb3J3YXJkUmVmRm4geyAoKTogYW55OyB9XG5cbi8qKlxuICogQWxsb3dzIHRvIHJlZmVyIHRvIHJlZmVyZW5jZXMgd2hpY2ggYXJlIG5vdCB5ZXQgZGVmaW5lZC5cbiAqXG4gKiBGb3IgaW5zdGFuY2UsIGBmb3J3YXJkUmVmYCBpcyB1c2VkIHdoZW4gdGhlIGB0b2tlbmAgd2hpY2ggd2UgbmVlZCB0byByZWZlciB0byBmb3IgdGhlIHB1cnBvc2VzIG9mXG4gKiBESSBpcyBkZWNsYXJlZCxcbiAqIGJ1dCBub3QgeWV0IGRlZmluZWQuIEl0IGlzIGFsc28gdXNlZCB3aGVuIHRoZSBgdG9rZW5gIHdoaWNoIHdlIHVzZSB3aGVuIGNyZWF0aW5nIGEgcXVlcnkgaXMgbm90XG4gKiB5ZXQgZGVmaW5lZC5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICoge0BleGFtcGxlIGNvcmUvZGkvdHMvZm9yd2FyZF9yZWYvZm9yd2FyZF9yZWYudHMgcmVnaW9uPSdmb3J3YXJkX3JlZid9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3J3YXJkUmVmKGZvcndhcmRSZWZGbjogRm9yd2FyZFJlZkZuKTogVHlwZSB7XG4gICg8YW55PmZvcndhcmRSZWZGbikuX19mb3J3YXJkX3JlZl9fID0gZm9yd2FyZFJlZjtcbiAgKDxhbnk+Zm9yd2FyZFJlZkZuKS50b1N0cmluZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gc3RyaW5naWZ5KHRoaXMoKSk7IH07XG4gIHJldHVybiAoPFR5cGU+PGFueT5mb3J3YXJkUmVmRm4pO1xufVxuXG4vKipcbiAqIExhemlseSByZXRyaWV2ZXMgdGhlIHJlZmVyZW5jZSB2YWx1ZSBmcm9tIGEgZm9yd2FyZFJlZi5cbiAqXG4gKiBBY3RzIGFzIHRoZSBpZGVudGl0eSBmdW5jdGlvbiB3aGVuIGdpdmVuIGEgbm9uLWZvcndhcmQtcmVmIHZhbHVlLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9HVTcybUpyazFmaW9kQ2hjbWlEUj9wPXByZXZpZXcpKVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHZhciByZWYgPSBmb3J3YXJkUmVmKCgpID0+IFwicmVmVmFsdWVcIik7XG4gKiBleHBlY3QocmVzb2x2ZUZvcndhcmRSZWYocmVmKSkudG9FcXVhbChcInJlZlZhbHVlXCIpO1xuICogZXhwZWN0KHJlc29sdmVGb3J3YXJkUmVmKFwicmVndWxhclZhbHVlXCIpKS50b0VxdWFsKFwicmVndWxhclZhbHVlXCIpO1xuICogYGBgXG4gKlxuICogU2VlOiB7QGxpbmsgZm9yd2FyZFJlZn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVGb3J3YXJkUmVmKHR5cGU6IGFueSk6IGFueSB7XG4gIGlmIChpc0Z1bmN0aW9uKHR5cGUpICYmIHR5cGUuaGFzT3duUHJvcGVydHkoJ19fZm9yd2FyZF9yZWZfXycpICYmXG4gICAgICB0eXBlLl9fZm9yd2FyZF9yZWZfXyA9PT0gZm9yd2FyZFJlZikge1xuICAgIHJldHVybiAoPEZvcndhcmRSZWZGbj50eXBlKSgpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB0eXBlO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9kaS9mb3J3YXJkX3JlZi50c1xuICoqLyIsImltcG9ydCB7TWFwLCBNYXBXcmFwcGVyLCBMaXN0V3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcbmltcG9ydCB7XG4gIFJlc29sdmVkUHJvdmlkZXIsXG4gIFByb3ZpZGVyLFxuICBEZXBlbmRlbmN5LFxuICBQcm92aWRlckJ1aWxkZXIsXG4gIFJlc29sdmVkRmFjdG9yeSxcbiAgcHJvdmlkZSxcbiAgcmVzb2x2ZVByb3ZpZGVyc1xufSBmcm9tICcuL3Byb3ZpZGVyJztcbmltcG9ydCB7XG4gIEFic3RyYWN0UHJvdmlkZXJFcnJvcixcbiAgTm9Qcm92aWRlckVycm9yLFxuICBDeWNsaWNEZXBlbmRlbmN5RXJyb3IsXG4gIEluc3RhbnRpYXRpb25FcnJvcixcbiAgSW52YWxpZFByb3ZpZGVyRXJyb3IsXG4gIE91dE9mQm91bmRzRXJyb3Jcbn0gZnJvbSAnLi9leGNlcHRpb25zJztcbmltcG9ydCB7RnVuY3Rpb25XcmFwcGVyLCBUeXBlLCBpc1ByZXNlbnQsIGlzQmxhbmssIENPTlNUX0VYUFJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge0tleX0gZnJvbSAnLi9rZXknO1xuaW1wb3J0IHtTZWxmTWV0YWRhdGEsIEhvc3RNZXRhZGF0YSwgU2tpcFNlbGZNZXRhZGF0YX0gZnJvbSAnLi9tZXRhZGF0YSc7XG5cbi8vIFRocmVzaG9sZCBmb3IgdGhlIGR5bmFtaWMgdmVyc2lvblxuY29uc3QgX01BWF9DT05TVFJVQ1RJT05fQ09VTlRFUiA9IDEwO1xuXG5leHBvcnQgY29uc3QgVU5ERUZJTkVEOiBPYmplY3QgPSBDT05TVF9FWFBSKG5ldyBPYmplY3QoKSk7XG5cbi8qKlxuICogVmlzaWJpbGl0eSBvZiBhIHtAbGluayBQcm92aWRlcn0uXG4gKi9cbmV4cG9ydCBlbnVtIFZpc2liaWxpdHkge1xuICAvKipcbiAgICogQSBgUHVibGljYCB7QGxpbmsgUHJvdmlkZXJ9IGlzIG9ubHkgdmlzaWJsZSB0byByZWd1bGFyIChhcyBvcHBvc2VkIHRvIGhvc3QpIGNoaWxkIGluamVjdG9ycy5cbiAgICovXG4gIFB1YmxpYyxcbiAgLyoqXG4gICAqIEEgYFByaXZhdGVgIHtAbGluayBQcm92aWRlcn0gaXMgb25seSB2aXNpYmxlIHRvIGhvc3QgKGFzIG9wcG9zZWQgdG8gcmVndWxhcikgY2hpbGQgaW5qZWN0b3JzLlxuICAgKi9cbiAgUHJpdmF0ZSxcbiAgLyoqXG4gICAqIEEgYFB1YmxpY0FuZFByaXZhdGVgIHtAbGluayBQcm92aWRlcn0gaXMgdmlzaWJsZSB0byBib3RoIGhvc3QgYW5kIHJlZ3VsYXIgY2hpbGQgaW5qZWN0b3JzLlxuICAgKi9cbiAgUHVibGljQW5kUHJpdmF0ZVxufVxuXG5mdW5jdGlvbiBjYW5TZWUoc3JjOiBWaXNpYmlsaXR5LCBkc3Q6IFZpc2liaWxpdHkpOiBib29sZWFuIHtcbiAgcmV0dXJuIChzcmMgPT09IGRzdCkgfHxcbiAgICAgICAgIChkc3QgPT09IFZpc2liaWxpdHkuUHVibGljQW5kUHJpdmF0ZSB8fCBzcmMgPT09IFZpc2liaWxpdHkuUHVibGljQW5kUHJpdmF0ZSk7XG59XG5cblxuZXhwb3J0IGludGVyZmFjZSBQcm90b0luamVjdG9yU3RyYXRlZ3kge1xuICBnZXRQcm92aWRlckF0SW5kZXgoaW5kZXg6IG51bWJlcik6IFJlc29sdmVkUHJvdmlkZXI7XG4gIGNyZWF0ZUluamVjdG9yU3RyYXRlZ3koaW5qOiBJbmplY3Rvcik6IEluamVjdG9yU3RyYXRlZ3k7XG59XG5cbmV4cG9ydCBjbGFzcyBQcm90b0luamVjdG9ySW5saW5lU3RyYXRlZ3kgaW1wbGVtZW50cyBQcm90b0luamVjdG9yU3RyYXRlZ3kge1xuICBwcm92aWRlcjA6IFJlc29sdmVkUHJvdmlkZXIgPSBudWxsO1xuICBwcm92aWRlcjE6IFJlc29sdmVkUHJvdmlkZXIgPSBudWxsO1xuICBwcm92aWRlcjI6IFJlc29sdmVkUHJvdmlkZXIgPSBudWxsO1xuICBwcm92aWRlcjM6IFJlc29sdmVkUHJvdmlkZXIgPSBudWxsO1xuICBwcm92aWRlcjQ6IFJlc29sdmVkUHJvdmlkZXIgPSBudWxsO1xuICBwcm92aWRlcjU6IFJlc29sdmVkUHJvdmlkZXIgPSBudWxsO1xuICBwcm92aWRlcjY6IFJlc29sdmVkUHJvdmlkZXIgPSBudWxsO1xuICBwcm92aWRlcjc6IFJlc29sdmVkUHJvdmlkZXIgPSBudWxsO1xuICBwcm92aWRlcjg6IFJlc29sdmVkUHJvdmlkZXIgPSBudWxsO1xuICBwcm92aWRlcjk6IFJlc29sdmVkUHJvdmlkZXIgPSBudWxsO1xuXG4gIGtleUlkMDogbnVtYmVyID0gbnVsbDtcbiAga2V5SWQxOiBudW1iZXIgPSBudWxsO1xuICBrZXlJZDI6IG51bWJlciA9IG51bGw7XG4gIGtleUlkMzogbnVtYmVyID0gbnVsbDtcbiAga2V5SWQ0OiBudW1iZXIgPSBudWxsO1xuICBrZXlJZDU6IG51bWJlciA9IG51bGw7XG4gIGtleUlkNjogbnVtYmVyID0gbnVsbDtcbiAga2V5SWQ3OiBudW1iZXIgPSBudWxsO1xuICBrZXlJZDg6IG51bWJlciA9IG51bGw7XG4gIGtleUlkOTogbnVtYmVyID0gbnVsbDtcblxuICB2aXNpYmlsaXR5MDogVmlzaWJpbGl0eSA9IG51bGw7XG4gIHZpc2liaWxpdHkxOiBWaXNpYmlsaXR5ID0gbnVsbDtcbiAgdmlzaWJpbGl0eTI6IFZpc2liaWxpdHkgPSBudWxsO1xuICB2aXNpYmlsaXR5MzogVmlzaWJpbGl0eSA9IG51bGw7XG4gIHZpc2liaWxpdHk0OiBWaXNpYmlsaXR5ID0gbnVsbDtcbiAgdmlzaWJpbGl0eTU6IFZpc2liaWxpdHkgPSBudWxsO1xuICB2aXNpYmlsaXR5NjogVmlzaWJpbGl0eSA9IG51bGw7XG4gIHZpc2liaWxpdHk3OiBWaXNpYmlsaXR5ID0gbnVsbDtcbiAgdmlzaWJpbGl0eTg6IFZpc2liaWxpdHkgPSBudWxsO1xuICB2aXNpYmlsaXR5OTogVmlzaWJpbGl0eSA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHJvdG9FSTogUHJvdG9JbmplY3RvciwgYnd2OiBQcm92aWRlcldpdGhWaXNpYmlsaXR5W10pIHtcbiAgICB2YXIgbGVuZ3RoID0gYnd2Lmxlbmd0aDtcblxuICAgIGlmIChsZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnByb3ZpZGVyMCA9IGJ3dlswXS5wcm92aWRlcjtcbiAgICAgIHRoaXMua2V5SWQwID0gYnd2WzBdLmdldEtleUlkKCk7XG4gICAgICB0aGlzLnZpc2liaWxpdHkwID0gYnd2WzBdLnZpc2liaWxpdHk7XG4gICAgfVxuICAgIGlmIChsZW5ndGggPiAxKSB7XG4gICAgICB0aGlzLnByb3ZpZGVyMSA9IGJ3dlsxXS5wcm92aWRlcjtcbiAgICAgIHRoaXMua2V5SWQxID0gYnd2WzFdLmdldEtleUlkKCk7XG4gICAgICB0aGlzLnZpc2liaWxpdHkxID0gYnd2WzFdLnZpc2liaWxpdHk7XG4gICAgfVxuICAgIGlmIChsZW5ndGggPiAyKSB7XG4gICAgICB0aGlzLnByb3ZpZGVyMiA9IGJ3dlsyXS5wcm92aWRlcjtcbiAgICAgIHRoaXMua2V5SWQyID0gYnd2WzJdLmdldEtleUlkKCk7XG4gICAgICB0aGlzLnZpc2liaWxpdHkyID0gYnd2WzJdLnZpc2liaWxpdHk7XG4gICAgfVxuICAgIGlmIChsZW5ndGggPiAzKSB7XG4gICAgICB0aGlzLnByb3ZpZGVyMyA9IGJ3dlszXS5wcm92aWRlcjtcbiAgICAgIHRoaXMua2V5SWQzID0gYnd2WzNdLmdldEtleUlkKCk7XG4gICAgICB0aGlzLnZpc2liaWxpdHkzID0gYnd2WzNdLnZpc2liaWxpdHk7XG4gICAgfVxuICAgIGlmIChsZW5ndGggPiA0KSB7XG4gICAgICB0aGlzLnByb3ZpZGVyNCA9IGJ3dls0XS5wcm92aWRlcjtcbiAgICAgIHRoaXMua2V5SWQ0ID0gYnd2WzRdLmdldEtleUlkKCk7XG4gICAgICB0aGlzLnZpc2liaWxpdHk0ID0gYnd2WzRdLnZpc2liaWxpdHk7XG4gICAgfVxuICAgIGlmIChsZW5ndGggPiA1KSB7XG4gICAgICB0aGlzLnByb3ZpZGVyNSA9IGJ3dls1XS5wcm92aWRlcjtcbiAgICAgIHRoaXMua2V5SWQ1ID0gYnd2WzVdLmdldEtleUlkKCk7XG4gICAgICB0aGlzLnZpc2liaWxpdHk1ID0gYnd2WzVdLnZpc2liaWxpdHk7XG4gICAgfVxuICAgIGlmIChsZW5ndGggPiA2KSB7XG4gICAgICB0aGlzLnByb3ZpZGVyNiA9IGJ3dls2XS5wcm92aWRlcjtcbiAgICAgIHRoaXMua2V5SWQ2ID0gYnd2WzZdLmdldEtleUlkKCk7XG4gICAgICB0aGlzLnZpc2liaWxpdHk2ID0gYnd2WzZdLnZpc2liaWxpdHk7XG4gICAgfVxuICAgIGlmIChsZW5ndGggPiA3KSB7XG4gICAgICB0aGlzLnByb3ZpZGVyNyA9IGJ3dls3XS5wcm92aWRlcjtcbiAgICAgIHRoaXMua2V5SWQ3ID0gYnd2WzddLmdldEtleUlkKCk7XG4gICAgICB0aGlzLnZpc2liaWxpdHk3ID0gYnd2WzddLnZpc2liaWxpdHk7XG4gICAgfVxuICAgIGlmIChsZW5ndGggPiA4KSB7XG4gICAgICB0aGlzLnByb3ZpZGVyOCA9IGJ3dls4XS5wcm92aWRlcjtcbiAgICAgIHRoaXMua2V5SWQ4ID0gYnd2WzhdLmdldEtleUlkKCk7XG4gICAgICB0aGlzLnZpc2liaWxpdHk4ID0gYnd2WzhdLnZpc2liaWxpdHk7XG4gICAgfVxuICAgIGlmIChsZW5ndGggPiA5KSB7XG4gICAgICB0aGlzLnByb3ZpZGVyOSA9IGJ3dls5XS5wcm92aWRlcjtcbiAgICAgIHRoaXMua2V5SWQ5ID0gYnd2WzldLmdldEtleUlkKCk7XG4gICAgICB0aGlzLnZpc2liaWxpdHk5ID0gYnd2WzldLnZpc2liaWxpdHk7XG4gICAgfVxuICB9XG5cbiAgZ2V0UHJvdmlkZXJBdEluZGV4KGluZGV4OiBudW1iZXIpOiBhbnkge1xuICAgIGlmIChpbmRleCA9PSAwKSByZXR1cm4gdGhpcy5wcm92aWRlcjA7XG4gICAgaWYgKGluZGV4ID09IDEpIHJldHVybiB0aGlzLnByb3ZpZGVyMTtcbiAgICBpZiAoaW5kZXggPT0gMikgcmV0dXJuIHRoaXMucHJvdmlkZXIyO1xuICAgIGlmIChpbmRleCA9PSAzKSByZXR1cm4gdGhpcy5wcm92aWRlcjM7XG4gICAgaWYgKGluZGV4ID09IDQpIHJldHVybiB0aGlzLnByb3ZpZGVyNDtcbiAgICBpZiAoaW5kZXggPT0gNSkgcmV0dXJuIHRoaXMucHJvdmlkZXI1O1xuICAgIGlmIChpbmRleCA9PSA2KSByZXR1cm4gdGhpcy5wcm92aWRlcjY7XG4gICAgaWYgKGluZGV4ID09IDcpIHJldHVybiB0aGlzLnByb3ZpZGVyNztcbiAgICBpZiAoaW5kZXggPT0gOCkgcmV0dXJuIHRoaXMucHJvdmlkZXI4O1xuICAgIGlmIChpbmRleCA9PSA5KSByZXR1cm4gdGhpcy5wcm92aWRlcjk7XG4gICAgdGhyb3cgbmV3IE91dE9mQm91bmRzRXJyb3IoaW5kZXgpO1xuICB9XG5cbiAgY3JlYXRlSW5qZWN0b3JTdHJhdGVneShpbmplY3RvcjogSW5qZWN0b3IpOiBJbmplY3RvclN0cmF0ZWd5IHtcbiAgICByZXR1cm4gbmV3IEluamVjdG9ySW5saW5lU3RyYXRlZ3koaW5qZWN0b3IsIHRoaXMpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQcm90b0luamVjdG9yRHluYW1pY1N0cmF0ZWd5IGltcGxlbWVudHMgUHJvdG9JbmplY3RvclN0cmF0ZWd5IHtcbiAgcHJvdmlkZXJzOiBSZXNvbHZlZFByb3ZpZGVyW107XG4gIGtleUlkczogbnVtYmVyW107XG4gIHZpc2liaWxpdGllczogVmlzaWJpbGl0eVtdO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RvSW5qOiBQcm90b0luamVjdG9yLCBid3Y6IFByb3ZpZGVyV2l0aFZpc2liaWxpdHlbXSkge1xuICAgIHZhciBsZW4gPSBid3YubGVuZ3RoO1xuXG4gICAgdGhpcy5wcm92aWRlcnMgPSBMaXN0V3JhcHBlci5jcmVhdGVGaXhlZFNpemUobGVuKTtcbiAgICB0aGlzLmtleUlkcyA9IExpc3RXcmFwcGVyLmNyZWF0ZUZpeGVkU2l6ZShsZW4pO1xuICAgIHRoaXMudmlzaWJpbGl0aWVzID0gTGlzdFdyYXBwZXIuY3JlYXRlRml4ZWRTaXplKGxlbik7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB0aGlzLnByb3ZpZGVyc1tpXSA9IGJ3dltpXS5wcm92aWRlcjtcbiAgICAgIHRoaXMua2V5SWRzW2ldID0gYnd2W2ldLmdldEtleUlkKCk7XG4gICAgICB0aGlzLnZpc2liaWxpdGllc1tpXSA9IGJ3dltpXS52aXNpYmlsaXR5O1xuICAgIH1cbiAgfVxuXG4gIGdldFByb3ZpZGVyQXRJbmRleChpbmRleDogbnVtYmVyKTogYW55IHtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMucHJvdmlkZXJzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IE91dE9mQm91bmRzRXJyb3IoaW5kZXgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wcm92aWRlcnNbaW5kZXhdO1xuICB9XG5cbiAgY3JlYXRlSW5qZWN0b3JTdHJhdGVneShlaTogSW5qZWN0b3IpOiBJbmplY3RvclN0cmF0ZWd5IHtcbiAgICByZXR1cm4gbmV3IEluamVjdG9yRHluYW1pY1N0cmF0ZWd5KHRoaXMsIGVpKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUHJvdG9JbmplY3RvciB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3N0cmF0ZWd5OiBQcm90b0luamVjdG9yU3RyYXRlZ3k7XG4gIG51bWJlck9mUHJvdmlkZXJzOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoYnd2OiBQcm92aWRlcldpdGhWaXNpYmlsaXR5W10pIHtcbiAgICB0aGlzLm51bWJlck9mUHJvdmlkZXJzID0gYnd2Lmxlbmd0aDtcbiAgICB0aGlzLl9zdHJhdGVneSA9IGJ3di5sZW5ndGggPiBfTUFYX0NPTlNUUlVDVElPTl9DT1VOVEVSID9cbiAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJvdG9JbmplY3RvckR5bmFtaWNTdHJhdGVneSh0aGlzLCBid3YpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJvdG9JbmplY3RvcklubGluZVN0cmF0ZWd5KHRoaXMsIGJ3dik7XG4gIH1cblxuICBnZXRQcm92aWRlckF0SW5kZXgoaW5kZXg6IG51bWJlcik6IGFueSB7IHJldHVybiB0aGlzLl9zdHJhdGVneS5nZXRQcm92aWRlckF0SW5kZXgoaW5kZXgpOyB9XG59XG5cblxuXG5leHBvcnQgaW50ZXJmYWNlIEluamVjdG9yU3RyYXRlZ3kge1xuICBnZXRPYmpCeUtleUlkKGtleUlkOiBudW1iZXIsIHZpc2liaWxpdHk6IFZpc2liaWxpdHkpOiBhbnk7XG4gIGdldE9iakF0SW5kZXgoaW5kZXg6IG51bWJlcik6IGFueTtcbiAgZ2V0TWF4TnVtYmVyT2ZPYmplY3RzKCk6IG51bWJlcjtcblxuICBhdHRhY2gocGFyZW50OiBJbmplY3RvciwgaXNIb3N0OiBib29sZWFuKTogdm9pZDtcbiAgcmVzZXRDb25zdHJ1Y3Rpb25Db3VudGVyKCk6IHZvaWQ7XG4gIGluc3RhbnRpYXRlUHJvdmlkZXIocHJvdmlkZXI6IFJlc29sdmVkUHJvdmlkZXIsIHZpc2liaWxpdHk6IFZpc2liaWxpdHkpOiBhbnk7XG59XG5cbmV4cG9ydCBjbGFzcyBJbmplY3RvcklubGluZVN0cmF0ZWd5IGltcGxlbWVudHMgSW5qZWN0b3JTdHJhdGVneSB7XG4gIG9iajA6IGFueSA9IFVOREVGSU5FRDtcbiAgb2JqMTogYW55ID0gVU5ERUZJTkVEO1xuICBvYmoyOiBhbnkgPSBVTkRFRklORUQ7XG4gIG9iajM6IGFueSA9IFVOREVGSU5FRDtcbiAgb2JqNDogYW55ID0gVU5ERUZJTkVEO1xuICBvYmo1OiBhbnkgPSBVTkRFRklORUQ7XG4gIG9iajY6IGFueSA9IFVOREVGSU5FRDtcbiAgb2JqNzogYW55ID0gVU5ERUZJTkVEO1xuICBvYmo4OiBhbnkgPSBVTkRFRklORUQ7XG4gIG9iajk6IGFueSA9IFVOREVGSU5FRDtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgaW5qZWN0b3I6IEluamVjdG9yLCBwdWJsaWMgcHJvdG9TdHJhdGVneTogUHJvdG9JbmplY3RvcklubGluZVN0cmF0ZWd5KSB7fVxuXG4gIHJlc2V0Q29uc3RydWN0aW9uQ291bnRlcigpOiB2b2lkIHsgdGhpcy5pbmplY3Rvci5fY29uc3RydWN0aW9uQ291bnRlciA9IDA7IH1cblxuICBpbnN0YW50aWF0ZVByb3ZpZGVyKHByb3ZpZGVyOiBSZXNvbHZlZFByb3ZpZGVyLCB2aXNpYmlsaXR5OiBWaXNpYmlsaXR5KTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5pbmplY3Rvci5fbmV3KHByb3ZpZGVyLCB2aXNpYmlsaXR5KTtcbiAgfVxuXG4gIGF0dGFjaChwYXJlbnQ6IEluamVjdG9yLCBpc0hvc3Q6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB2YXIgaW5qID0gdGhpcy5pbmplY3RvcjtcbiAgICBpbmouX3BhcmVudCA9IHBhcmVudDtcbiAgICBpbmouX2lzSG9zdCA9IGlzSG9zdDtcbiAgfVxuXG4gIGdldE9iakJ5S2V5SWQoa2V5SWQ6IG51bWJlciwgdmlzaWJpbGl0eTogVmlzaWJpbGl0eSk6IGFueSB7XG4gICAgdmFyIHAgPSB0aGlzLnByb3RvU3RyYXRlZ3k7XG4gICAgdmFyIGluaiA9IHRoaXMuaW5qZWN0b3I7XG5cbiAgICBpZiAocC5rZXlJZDAgPT09IGtleUlkICYmIGNhblNlZShwLnZpc2liaWxpdHkwLCB2aXNpYmlsaXR5KSkge1xuICAgICAgaWYgKHRoaXMub2JqMCA9PT0gVU5ERUZJTkVEKSB7XG4gICAgICAgIHRoaXMub2JqMCA9IGluai5fbmV3KHAucHJvdmlkZXIwLCBwLnZpc2liaWxpdHkwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLm9iajA7XG4gICAgfVxuICAgIGlmIChwLmtleUlkMSA9PT0ga2V5SWQgJiYgY2FuU2VlKHAudmlzaWJpbGl0eTEsIHZpc2liaWxpdHkpKSB7XG4gICAgICBpZiAodGhpcy5vYmoxID09PSBVTkRFRklORUQpIHtcbiAgICAgICAgdGhpcy5vYmoxID0gaW5qLl9uZXcocC5wcm92aWRlcjEsIHAudmlzaWJpbGl0eTEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMub2JqMTtcbiAgICB9XG4gICAgaWYgKHAua2V5SWQyID09PSBrZXlJZCAmJiBjYW5TZWUocC52aXNpYmlsaXR5MiwgdmlzaWJpbGl0eSkpIHtcbiAgICAgIGlmICh0aGlzLm9iajIgPT09IFVOREVGSU5FRCkge1xuICAgICAgICB0aGlzLm9iajIgPSBpbmouX25ldyhwLnByb3ZpZGVyMiwgcC52aXNpYmlsaXR5Mik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5vYmoyO1xuICAgIH1cbiAgICBpZiAocC5rZXlJZDMgPT09IGtleUlkICYmIGNhblNlZShwLnZpc2liaWxpdHkzLCB2aXNpYmlsaXR5KSkge1xuICAgICAgaWYgKHRoaXMub2JqMyA9PT0gVU5ERUZJTkVEKSB7XG4gICAgICAgIHRoaXMub2JqMyA9IGluai5fbmV3KHAucHJvdmlkZXIzLCBwLnZpc2liaWxpdHkzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLm9iajM7XG4gICAgfVxuICAgIGlmIChwLmtleUlkNCA9PT0ga2V5SWQgJiYgY2FuU2VlKHAudmlzaWJpbGl0eTQsIHZpc2liaWxpdHkpKSB7XG4gICAgICBpZiAodGhpcy5vYmo0ID09PSBVTkRFRklORUQpIHtcbiAgICAgICAgdGhpcy5vYmo0ID0gaW5qLl9uZXcocC5wcm92aWRlcjQsIHAudmlzaWJpbGl0eTQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMub2JqNDtcbiAgICB9XG4gICAgaWYgKHAua2V5SWQ1ID09PSBrZXlJZCAmJiBjYW5TZWUocC52aXNpYmlsaXR5NSwgdmlzaWJpbGl0eSkpIHtcbiAgICAgIGlmICh0aGlzLm9iajUgPT09IFVOREVGSU5FRCkge1xuICAgICAgICB0aGlzLm9iajUgPSBpbmouX25ldyhwLnByb3ZpZGVyNSwgcC52aXNpYmlsaXR5NSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5vYmo1O1xuICAgIH1cbiAgICBpZiAocC5rZXlJZDYgPT09IGtleUlkICYmIGNhblNlZShwLnZpc2liaWxpdHk2LCB2aXNpYmlsaXR5KSkge1xuICAgICAgaWYgKHRoaXMub2JqNiA9PT0gVU5ERUZJTkVEKSB7XG4gICAgICAgIHRoaXMub2JqNiA9IGluai5fbmV3KHAucHJvdmlkZXI2LCBwLnZpc2liaWxpdHk2KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLm9iajY7XG4gICAgfVxuICAgIGlmIChwLmtleUlkNyA9PT0ga2V5SWQgJiYgY2FuU2VlKHAudmlzaWJpbGl0eTcsIHZpc2liaWxpdHkpKSB7XG4gICAgICBpZiAodGhpcy5vYmo3ID09PSBVTkRFRklORUQpIHtcbiAgICAgICAgdGhpcy5vYmo3ID0gaW5qLl9uZXcocC5wcm92aWRlcjcsIHAudmlzaWJpbGl0eTcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMub2JqNztcbiAgICB9XG4gICAgaWYgKHAua2V5SWQ4ID09PSBrZXlJZCAmJiBjYW5TZWUocC52aXNpYmlsaXR5OCwgdmlzaWJpbGl0eSkpIHtcbiAgICAgIGlmICh0aGlzLm9iajggPT09IFVOREVGSU5FRCkge1xuICAgICAgICB0aGlzLm9iajggPSBpbmouX25ldyhwLnByb3ZpZGVyOCwgcC52aXNpYmlsaXR5OCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5vYmo4O1xuICAgIH1cbiAgICBpZiAocC5rZXlJZDkgPT09IGtleUlkICYmIGNhblNlZShwLnZpc2liaWxpdHk5LCB2aXNpYmlsaXR5KSkge1xuICAgICAgaWYgKHRoaXMub2JqOSA9PT0gVU5ERUZJTkVEKSB7XG4gICAgICAgIHRoaXMub2JqOSA9IGluai5fbmV3KHAucHJvdmlkZXI5LCBwLnZpc2liaWxpdHk5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLm9iajk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFVOREVGSU5FRDtcbiAgfVxuXG4gIGdldE9iakF0SW5kZXgoaW5kZXg6IG51bWJlcik6IGFueSB7XG4gICAgaWYgKGluZGV4ID09IDApIHJldHVybiB0aGlzLm9iajA7XG4gICAgaWYgKGluZGV4ID09IDEpIHJldHVybiB0aGlzLm9iajE7XG4gICAgaWYgKGluZGV4ID09IDIpIHJldHVybiB0aGlzLm9iajI7XG4gICAgaWYgKGluZGV4ID09IDMpIHJldHVybiB0aGlzLm9iajM7XG4gICAgaWYgKGluZGV4ID09IDQpIHJldHVybiB0aGlzLm9iajQ7XG4gICAgaWYgKGluZGV4ID09IDUpIHJldHVybiB0aGlzLm9iajU7XG4gICAgaWYgKGluZGV4ID09IDYpIHJldHVybiB0aGlzLm9iajY7XG4gICAgaWYgKGluZGV4ID09IDcpIHJldHVybiB0aGlzLm9iajc7XG4gICAgaWYgKGluZGV4ID09IDgpIHJldHVybiB0aGlzLm9iajg7XG4gICAgaWYgKGluZGV4ID09IDkpIHJldHVybiB0aGlzLm9iajk7XG4gICAgdGhyb3cgbmV3IE91dE9mQm91bmRzRXJyb3IoaW5kZXgpO1xuICB9XG5cbiAgZ2V0TWF4TnVtYmVyT2ZPYmplY3RzKCk6IG51bWJlciB7IHJldHVybiBfTUFYX0NPTlNUUlVDVElPTl9DT1VOVEVSOyB9XG59XG5cblxuZXhwb3J0IGNsYXNzIEluamVjdG9yRHluYW1pY1N0cmF0ZWd5IGltcGxlbWVudHMgSW5qZWN0b3JTdHJhdGVneSB7XG4gIG9ianM6IGFueVtdO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwcm90b1N0cmF0ZWd5OiBQcm90b0luamVjdG9yRHluYW1pY1N0cmF0ZWd5LCBwdWJsaWMgaW5qZWN0b3I6IEluamVjdG9yKSB7XG4gICAgdGhpcy5vYmpzID0gTGlzdFdyYXBwZXIuY3JlYXRlRml4ZWRTaXplKHByb3RvU3RyYXRlZ3kucHJvdmlkZXJzLmxlbmd0aCk7XG4gICAgTGlzdFdyYXBwZXIuZmlsbCh0aGlzLm9ianMsIFVOREVGSU5FRCk7XG4gIH1cblxuICByZXNldENvbnN0cnVjdGlvbkNvdW50ZXIoKTogdm9pZCB7IHRoaXMuaW5qZWN0b3IuX2NvbnN0cnVjdGlvbkNvdW50ZXIgPSAwOyB9XG5cbiAgaW5zdGFudGlhdGVQcm92aWRlcihwcm92aWRlcjogUmVzb2x2ZWRQcm92aWRlciwgdmlzaWJpbGl0eTogVmlzaWJpbGl0eSk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuaW5qZWN0b3IuX25ldyhwcm92aWRlciwgdmlzaWJpbGl0eSk7XG4gIH1cblxuICBhdHRhY2gocGFyZW50OiBJbmplY3RvciwgaXNIb3N0OiBib29sZWFuKTogdm9pZCB7XG4gICAgdmFyIGluaiA9IHRoaXMuaW5qZWN0b3I7XG4gICAgaW5qLl9wYXJlbnQgPSBwYXJlbnQ7XG4gICAgaW5qLl9pc0hvc3QgPSBpc0hvc3Q7XG4gIH1cblxuICBnZXRPYmpCeUtleUlkKGtleUlkOiBudW1iZXIsIHZpc2liaWxpdHk6IFZpc2liaWxpdHkpOiBhbnkge1xuICAgIHZhciBwID0gdGhpcy5wcm90b1N0cmF0ZWd5O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwLmtleUlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHAua2V5SWRzW2ldID09PSBrZXlJZCAmJiBjYW5TZWUocC52aXNpYmlsaXRpZXNbaV0sIHZpc2liaWxpdHkpKSB7XG4gICAgICAgIGlmICh0aGlzLm9ianNbaV0gPT09IFVOREVGSU5FRCkge1xuICAgICAgICAgIHRoaXMub2Jqc1tpXSA9IHRoaXMuaW5qZWN0b3IuX25ldyhwLnByb3ZpZGVyc1tpXSwgcC52aXNpYmlsaXRpZXNbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMub2Jqc1tpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gVU5ERUZJTkVEO1xuICB9XG5cbiAgZ2V0T2JqQXRJbmRleChpbmRleDogbnVtYmVyKTogYW55IHtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMub2Jqcy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBPdXRPZkJvdW5kc0Vycm9yKGluZGV4KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5vYmpzW2luZGV4XTtcbiAgfVxuXG4gIGdldE1heE51bWJlck9mT2JqZWN0cygpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5vYmpzLmxlbmd0aDsgfVxufVxuXG5leHBvcnQgY2xhc3MgUHJvdmlkZXJXaXRoVmlzaWJpbGl0eSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwcm92aWRlcjogUmVzb2x2ZWRQcm92aWRlciwgcHVibGljIHZpc2liaWxpdHk6IFZpc2liaWxpdHkpe307XG5cbiAgZ2V0S2V5SWQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMucHJvdmlkZXIua2V5LmlkOyB9XG59XG5cbi8qKlxuICogVXNlZCB0byBwcm92aWRlIGRlcGVuZGVuY2llcyB0aGF0IGNhbm5vdCBiZSBlYXNpbHkgZXhwcmVzc2VkIGFzIHByb3ZpZGVycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBlbmRlbmN5UHJvdmlkZXIge1xuICBnZXREZXBlbmRlbmN5KGluamVjdG9yOiBJbmplY3RvciwgcHJvdmlkZXI6IFJlc29sdmVkUHJvdmlkZXIsIGRlcGVuZGVuY3k6IERlcGVuZGVuY3kpOiBhbnk7XG59XG5cbi8qKlxuICogQSBkZXBlbmRlbmN5IGluamVjdGlvbiBjb250YWluZXIgdXNlZCBmb3IgaW5zdGFudGlhdGluZyBvYmplY3RzIGFuZCByZXNvbHZpbmcgZGVwZW5kZW5jaWVzLlxuICpcbiAqIEFuIGBJbmplY3RvcmAgaXMgYSByZXBsYWNlbWVudCBmb3IgYSBgbmV3YCBvcGVyYXRvciwgd2hpY2ggY2FuIGF1dG9tYXRpY2FsbHkgcmVzb2x2ZSB0aGVcbiAqIGNvbnN0cnVjdG9yIGRlcGVuZGVuY2llcy5cbiAqXG4gKiBJbiB0eXBpY2FsIHVzZSwgYXBwbGljYXRpb24gY29kZSBhc2tzIGZvciB0aGUgZGVwZW5kZW5jaWVzIGluIHRoZSBjb25zdHJ1Y3RvciBhbmQgdGhleSBhcmVcbiAqIHJlc29sdmVkIGJ5IHRoZSBgSW5qZWN0b3JgLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9qemplYzA/cD1wcmV2aWV3KSlcbiAqXG4gKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgY3JlYXRlcyBhbiBgSW5qZWN0b3JgIGNvbmZpZ3VyZWQgdG8gY3JlYXRlIGBFbmdpbmVgIGFuZCBgQ2FyYC5cbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBASW5qZWN0YWJsZSgpXG4gKiBjbGFzcyBFbmdpbmUge1xuICogfVxuICpcbiAqIEBJbmplY3RhYmxlKClcbiAqIGNsYXNzIENhciB7XG4gKiAgIGNvbnN0cnVjdG9yKHB1YmxpYyBlbmdpbmU6RW5naW5lKSB7fVxuICogfVxuICpcbiAqIHZhciBpbmplY3RvciA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW0NhciwgRW5naW5lXSk7XG4gKiB2YXIgY2FyID0gaW5qZWN0b3IuZ2V0KENhcik7XG4gKiBleHBlY3QoY2FyIGluc3RhbmNlb2YgQ2FyKS50b0JlKHRydWUpO1xuICogZXhwZWN0KGNhci5lbmdpbmUgaW5zdGFuY2VvZiBFbmdpbmUpLnRvQmUodHJ1ZSk7XG4gKiBgYGBcbiAqXG4gKiBOb3RpY2UsIHdlIGRvbid0IHVzZSB0aGUgYG5ld2Agb3BlcmF0b3IgYmVjYXVzZSB3ZSBleHBsaWNpdGx5IHdhbnQgdG8gaGF2ZSB0aGUgYEluamVjdG9yYFxuICogcmVzb2x2ZSBhbGwgb2YgdGhlIG9iamVjdCdzIGRlcGVuZGVuY2llcyBhdXRvbWF0aWNhbGx5LlxuICovXG5leHBvcnQgY2xhc3MgSW5qZWN0b3Ige1xuICAvKipcbiAgICogVHVybnMgYW4gYXJyYXkgb2YgcHJvdmlkZXIgZGVmaW5pdGlvbnMgaW50byBhbiBhcnJheSBvZiByZXNvbHZlZCBwcm92aWRlcnMuXG4gICAqXG4gICAqIEEgcmVzb2x1dGlvbiBpcyBhIHByb2Nlc3Mgb2YgZmxhdHRlbmluZyBtdWx0aXBsZSBuZXN0ZWQgYXJyYXlzIGFuZCBjb252ZXJ0aW5nIGluZGl2aWR1YWxcbiAgICogcHJvdmlkZXJzIGludG8gYW4gYXJyYXkgb2Yge0BsaW5rIFJlc29sdmVkUHJvdmlkZXJ9cy5cbiAgICpcbiAgICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L0FpWFRIaT9wPXByZXZpZXcpKVxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIEBJbmplY3RhYmxlKClcbiAgICogY2xhc3MgRW5naW5lIHtcbiAgICogfVxuICAgKlxuICAgKiBASW5qZWN0YWJsZSgpXG4gICAqIGNsYXNzIENhciB7XG4gICAqICAgY29uc3RydWN0b3IocHVibGljIGVuZ2luZTpFbmdpbmUpIHt9XG4gICAqIH1cbiAgICpcbiAgICogdmFyIHByb3ZpZGVycyA9IEluamVjdG9yLnJlc29sdmUoW0NhciwgW1tFbmdpbmVdXV0pO1xuICAgKlxuICAgKiBleHBlY3QocHJvdmlkZXJzLmxlbmd0aCkudG9FcXVhbCgyKTtcbiAgICpcbiAgICogZXhwZWN0KHByb3ZpZGVyc1swXSBpbnN0YW5jZW9mIFJlc29sdmVkUHJvdmlkZXIpLnRvQmUodHJ1ZSk7XG4gICAqIGV4cGVjdChwcm92aWRlcnNbMF0ua2V5LmRpc3BsYXlOYW1lKS50b0JlKFwiQ2FyXCIpO1xuICAgKiBleHBlY3QocHJvdmlkZXJzWzBdLmRlcGVuZGVuY2llcy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAqIGV4cGVjdChwcm92aWRlcnNbMF0uZmFjdG9yeSkudG9CZURlZmluZWQoKTtcbiAgICpcbiAgICogZXhwZWN0KHByb3ZpZGVyc1sxXS5rZXkuZGlzcGxheU5hbWUpLnRvQmUoXCJFbmdpbmVcIik7XG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICpcbiAgICogU2VlIHtAbGluayBJbmplY3RvciNmcm9tUmVzb2x2ZWRQcm92aWRlcnN9IGZvciBtb3JlIGluZm8uXG4gICAqL1xuICBzdGF0aWMgcmVzb2x2ZShwcm92aWRlcnM6IEFycmF5PFR5cGUgfCBQcm92aWRlciB8IGFueVtdPik6IFJlc29sdmVkUHJvdmlkZXJbXSB7XG4gICAgcmV0dXJuIHJlc29sdmVQcm92aWRlcnMocHJvdmlkZXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhbiBhcnJheSBvZiBwcm92aWRlcnMgYW5kIGNyZWF0ZXMgYW4gaW5qZWN0b3IgZnJvbSB0aG9zZSBwcm92aWRlcnMuXG4gICAqXG4gICAqIFRoZSBwYXNzZWQtaW4gcHJvdmlkZXJzIGNhbiBiZSBhbiBhcnJheSBvZiBgVHlwZWAsIHtAbGluayBQcm92aWRlcn0sXG4gICAqIG9yIGEgcmVjdXJzaXZlIGFycmF5IG9mIG1vcmUgcHJvdmlkZXJzLlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvZVBPY2NBP3A9cHJldmlldykpXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogQEluamVjdGFibGUoKVxuICAgKiBjbGFzcyBFbmdpbmUge1xuICAgKiB9XG4gICAqXG4gICAqIEBJbmplY3RhYmxlKClcbiAgICogY2xhc3MgQ2FyIHtcbiAgICogICBjb25zdHJ1Y3RvcihwdWJsaWMgZW5naW5lOkVuZ2luZSkge31cbiAgICogfVxuICAgKlxuICAgKiB2YXIgaW5qZWN0b3IgPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtDYXIsIEVuZ2luZV0pO1xuICAgKiBleHBlY3QoaW5qZWN0b3IuZ2V0KENhcikgaW5zdGFuY2VvZiBDYXIpLnRvQmUodHJ1ZSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHNsb3dlciB0aGFuIHRoZSBjb3JyZXNwb25kaW5nIGBmcm9tUmVzb2x2ZWRQcm92aWRlcnNgXG4gICAqIGJlY2F1c2UgaXQgbmVlZHMgdG8gcmVzb2x2ZSB0aGUgcGFzc2VkLWluIHByb3ZpZGVycyBmaXJzdC5cbiAgICogU2VlIHtAbGluayBJbmplY3RvciNyZXNvbHZlfSBhbmQge0BsaW5rIEluamVjdG9yI2Zyb21SZXNvbHZlZFByb3ZpZGVyc30uXG4gICAqL1xuICBzdGF0aWMgcmVzb2x2ZUFuZENyZWF0ZShwcm92aWRlcnM6IEFycmF5PFR5cGUgfCBQcm92aWRlciB8IGFueVtdPik6IEluamVjdG9yIHtcbiAgICB2YXIgcmVzb2x2ZWRQcm92aWRlcnMgPSBJbmplY3Rvci5yZXNvbHZlKHByb3ZpZGVycyk7XG4gICAgcmV0dXJuIEluamVjdG9yLmZyb21SZXNvbHZlZFByb3ZpZGVycyhyZXNvbHZlZFByb3ZpZGVycyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbmplY3RvciBmcm9tIHByZXZpb3VzbHkgcmVzb2x2ZWQgcHJvdmlkZXJzLlxuICAgKlxuICAgKiBUaGlzIEFQSSBpcyB0aGUgcmVjb21tZW5kZWQgd2F5IHRvIGNvbnN0cnVjdCBpbmplY3RvcnMgaW4gcGVyZm9ybWFuY2Utc2Vuc2l0aXZlIHBhcnRzLlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvS3JTTWNpP3A9cHJldmlldykpXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogQEluamVjdGFibGUoKVxuICAgKiBjbGFzcyBFbmdpbmUge1xuICAgKiB9XG4gICAqXG4gICAqIEBJbmplY3RhYmxlKClcbiAgICogY2xhc3MgQ2FyIHtcbiAgICogICBjb25zdHJ1Y3RvcihwdWJsaWMgZW5naW5lOkVuZ2luZSkge31cbiAgICogfVxuICAgKlxuICAgKiB2YXIgcHJvdmlkZXJzID0gSW5qZWN0b3IucmVzb2x2ZShbQ2FyLCBFbmdpbmVdKTtcbiAgICogdmFyIGluamVjdG9yID0gSW5qZWN0b3IuZnJvbVJlc29sdmVkUHJvdmlkZXJzKHByb3ZpZGVycyk7XG4gICAqIGV4cGVjdChpbmplY3Rvci5nZXQoQ2FyKSBpbnN0YW5jZW9mIENhcikudG9CZSh0cnVlKTtcbiAgICogYGBgXG4gICAqL1xuICBzdGF0aWMgZnJvbVJlc29sdmVkUHJvdmlkZXJzKHByb3ZpZGVyczogUmVzb2x2ZWRQcm92aWRlcltdKTogSW5qZWN0b3Ige1xuICAgIHZhciBiZCA9IHByb3ZpZGVycy5tYXAoYiA9PiBuZXcgUHJvdmlkZXJXaXRoVmlzaWJpbGl0eShiLCBWaXNpYmlsaXR5LlB1YmxpYykpO1xuICAgIHZhciBwcm90byA9IG5ldyBQcm90b0luamVjdG9yKGJkKTtcbiAgICByZXR1cm4gbmV3IEluamVjdG9yKHByb3RvLCBudWxsLCBudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgc3RhdGljIGZyb21SZXNvbHZlZEJpbmRpbmdzKHByb3ZpZGVyczogUmVzb2x2ZWRQcm92aWRlcltdKTogSW5qZWN0b3Ige1xuICAgIHJldHVybiBJbmplY3Rvci5mcm9tUmVzb2x2ZWRQcm92aWRlcnMocHJvdmlkZXJzKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3N0cmF0ZWd5OiBJbmplY3RvclN0cmF0ZWd5O1xuICAvKiogQGludGVybmFsICovXG4gIF9pc0hvc3Q6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfY29uc3RydWN0aW9uQ291bnRlcjogbnVtYmVyID0gMDtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgX3Byb3RvOiBhbnkgLyogUHJvdG9JbmplY3RvciAqLztcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgX3BhcmVudDogSW5qZWN0b3I7XG4gIC8qKlxuICAgKiBQcml2YXRlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihfcHJvdG86IGFueSAvKiBQcm90b0luamVjdG9yICovLCBfcGFyZW50OiBJbmplY3RvciA9IG51bGwsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2RlcFByb3ZpZGVyOiBhbnkgLyogRGVwZW5kZW5jeVByb3ZpZGVyICovID0gbnVsbCxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfZGVidWdDb250ZXh0OiBGdW5jdGlvbiA9IG51bGwpIHtcbiAgICB0aGlzLl9wcm90byA9IF9wcm90bztcbiAgICB0aGlzLl9wYXJlbnQgPSBfcGFyZW50O1xuICAgIHRoaXMuX3N0cmF0ZWd5ID0gX3Byb3RvLl9zdHJhdGVneS5jcmVhdGVJbmplY3RvclN0cmF0ZWd5KHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZGVidWdDb250ZXh0KCk6IGFueSB7IHJldHVybiB0aGlzLl9kZWJ1Z0NvbnRleHQoKTsgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYW4gaW5zdGFuY2UgZnJvbSB0aGUgaW5qZWN0b3IgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHRva2VuLlxuICAgKiBUaHJvd3Mge0BsaW5rIE5vUHJvdmlkZXJFcnJvcn0gaWYgbm90IGZvdW5kLlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvSGVYU0hnP3A9cHJldmlldykpXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogdmFyIGluamVjdG9yID0gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbXG4gICAqICAgcHJvdmlkZShcInZhbGlkVG9rZW5cIiwge3VzZVZhbHVlOiBcIlZhbHVlXCJ9KVxuICAgKiBdKTtcbiAgICogZXhwZWN0KGluamVjdG9yLmdldChcInZhbGlkVG9rZW5cIikpLnRvRXF1YWwoXCJWYWx1ZVwiKTtcbiAgICogZXhwZWN0KCgpID0+IGluamVjdG9yLmdldChcImludmFsaWRUb2tlblwiKSkudG9UaHJvd0Vycm9yKCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBgSW5qZWN0b3JgIHJldHVybnMgaXRzZWxmIHdoZW4gZ2l2ZW4gYEluamVjdG9yYCBhcyBhIHRva2VuLlxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHZhciBpbmplY3RvciA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW10pO1xuICAgKiBleHBlY3QoaW5qZWN0b3IuZ2V0KEluamVjdG9yKSkudG9CZShpbmplY3Rvcik7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0KHRva2VuOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9nZXRCeUtleShLZXkuZ2V0KHRva2VuKSwgbnVsbCwgbnVsbCwgZmFsc2UsIFZpc2liaWxpdHkuUHVibGljQW5kUHJpdmF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIGFuIGluc3RhbmNlIGZyb20gdGhlIGluamVjdG9yIGJhc2VkIG9uIHRoZSBwcm92aWRlZCB0b2tlbi5cbiAgICogUmV0dXJucyBudWxsIGlmIG5vdCBmb3VuZC5cbiAgICpcbiAgICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L3RwRWJFeT9wPXByZXZpZXcpKVxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHZhciBpbmplY3RvciA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW1xuICAgKiAgIHByb3ZpZGUoXCJ2YWxpZFRva2VuXCIsIHt1c2VWYWx1ZTogXCJWYWx1ZVwifSlcbiAgICogXSk7XG4gICAqIGV4cGVjdChpbmplY3Rvci5nZXRPcHRpb25hbChcInZhbGlkVG9rZW5cIikpLnRvRXF1YWwoXCJWYWx1ZVwiKTtcbiAgICogZXhwZWN0KGluamVjdG9yLmdldE9wdGlvbmFsKFwiaW52YWxpZFRva2VuXCIpKS50b0JlKG51bGwpO1xuICAgKiBgYGBcbiAgICpcbiAgICogYEluamVjdG9yYCByZXR1cm5zIGl0c2VsZiB3aGVuIGdpdmVuIGBJbmplY3RvcmAgYXMgYSB0b2tlbi5cbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiB2YXIgaW5qZWN0b3IgPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtdKTtcbiAgICogZXhwZWN0KGluamVjdG9yLmdldE9wdGlvbmFsKEluamVjdG9yKSkudG9CZShpbmplY3Rvcik7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0T3B0aW9uYWwodG9rZW46IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldEJ5S2V5KEtleS5nZXQodG9rZW4pLCBudWxsLCBudWxsLCB0cnVlLCBWaXNpYmlsaXR5LlB1YmxpY0FuZFByaXZhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZ2V0QXQoaW5kZXg6IG51bWJlcik6IGFueSB7IHJldHVybiB0aGlzLl9zdHJhdGVneS5nZXRPYmpBdEluZGV4KGluZGV4KTsgfVxuXG4gIC8qKlxuICAgKiBQYXJlbnQgb2YgdGhpcyBpbmplY3Rvci5cbiAgICpcbiAgICogPCEtLSBUT0RPOiBBZGQgYSBsaW5rIHRvIHRoZSBzZWN0aW9uIG9mIHRoZSB1c2VyIGd1aWRlIHRhbGtpbmcgYWJvdXQgaGllcmFyY2hpY2FsIGluamVjdGlvbi5cbiAgICogLS0+XG4gICAqXG4gICAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9lb3NNR28/cD1wcmV2aWV3KSlcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiB2YXIgcGFyZW50ID0gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbXSk7XG4gICAqIHZhciBjaGlsZCA9IHBhcmVudC5yZXNvbHZlQW5kQ3JlYXRlQ2hpbGQoW10pO1xuICAgKiBleHBlY3QoY2hpbGQucGFyZW50KS50b0JlKHBhcmVudCk7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0IHBhcmVudCgpOiBJbmplY3RvciB7IHJldHVybiB0aGlzLl9wYXJlbnQ7IH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEludGVybmFsLiBEbyBub3QgdXNlLlxuICAgKiBXZSByZXR1cm4gYGFueWAgbm90IHRvIGV4cG9ydCB0aGUgSW5qZWN0b3JTdHJhdGVneSB0eXBlLlxuICAgKi9cbiAgZ2V0IGludGVybmFsU3RyYXRlZ3koKTogYW55IHsgcmV0dXJuIHRoaXMuX3N0cmF0ZWd5OyB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGFuIGFycmF5IG9mIHByb3ZpZGVycyBhbmQgY3JlYXRlcyBhIGNoaWxkIGluamVjdG9yIGZyb20gdGhvc2UgcHJvdmlkZXJzLlxuICAgKlxuICAgKiA8IS0tIFRPRE86IEFkZCBhIGxpbmsgdG8gdGhlIHNlY3Rpb24gb2YgdGhlIHVzZXIgZ3VpZGUgdGFsa2luZyBhYm91dCBoaWVyYXJjaGljYWwgaW5qZWN0aW9uLlxuICAgKiAtLT5cbiAgICpcbiAgICogVGhlIHBhc3NlZC1pbiBwcm92aWRlcnMgY2FuIGJlIGFuIGFycmF5IG9mIGBUeXBlYCwge0BsaW5rIFByb3ZpZGVyfSxcbiAgICogb3IgYSByZWN1cnNpdmUgYXJyYXkgb2YgbW9yZSBwcm92aWRlcnMuXG4gICAqXG4gICAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9vcEIzVDQ/cD1wcmV2aWV3KSlcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjbGFzcyBQYXJlbnRQcm92aWRlciB7fVxuICAgKiBjbGFzcyBDaGlsZFByb3ZpZGVyIHt9XG4gICAqXG4gICAqIHZhciBwYXJlbnQgPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtQYXJlbnRQcm92aWRlcl0pO1xuICAgKiB2YXIgY2hpbGQgPSBwYXJlbnQucmVzb2x2ZUFuZENyZWF0ZUNoaWxkKFtDaGlsZFByb3ZpZGVyXSk7XG4gICAqXG4gICAqIGV4cGVjdChjaGlsZC5nZXQoUGFyZW50UHJvdmlkZXIpIGluc3RhbmNlb2YgUGFyZW50UHJvdmlkZXIpLnRvQmUodHJ1ZSk7XG4gICAqIGV4cGVjdChjaGlsZC5nZXQoQ2hpbGRQcm92aWRlcikgaW5zdGFuY2VvZiBDaGlsZFByb3ZpZGVyKS50b0JlKHRydWUpO1xuICAgKiBleHBlY3QoY2hpbGQuZ2V0KFBhcmVudFByb3ZpZGVyKSkudG9CZShwYXJlbnQuZ2V0KFBhcmVudFByb3ZpZGVyKSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHNsb3dlciB0aGFuIHRoZSBjb3JyZXNwb25kaW5nIGBjcmVhdGVDaGlsZEZyb21SZXNvbHZlZGBcbiAgICogYmVjYXVzZSBpdCBuZWVkcyB0byByZXNvbHZlIHRoZSBwYXNzZWQtaW4gcHJvdmlkZXJzIGZpcnN0LlxuICAgKiBTZWUge0BsaW5rIEluamVjdG9yI3Jlc29sdmV9IGFuZCB7QGxpbmsgSW5qZWN0b3IjY3JlYXRlQ2hpbGRGcm9tUmVzb2x2ZWR9LlxuICAgKi9cbiAgcmVzb2x2ZUFuZENyZWF0ZUNoaWxkKHByb3ZpZGVyczogQXJyYXk8VHlwZSB8IFByb3ZpZGVyIHwgYW55W10+KTogSW5qZWN0b3Ige1xuICAgIHZhciByZXNvbHZlZFByb3ZpZGVycyA9IEluamVjdG9yLnJlc29sdmUocHJvdmlkZXJzKTtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVDaGlsZEZyb21SZXNvbHZlZChyZXNvbHZlZFByb3ZpZGVycyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGNoaWxkIGluamVjdG9yIGZyb20gcHJldmlvdXNseSByZXNvbHZlZCBwcm92aWRlcnMuXG4gICAqXG4gICAqIDwhLS0gVE9ETzogQWRkIGEgbGluayB0byB0aGUgc2VjdGlvbiBvZiB0aGUgdXNlciBndWlkZSB0YWxraW5nIGFib3V0IGhpZXJhcmNoaWNhbCBpbmplY3Rpb24uXG4gICAqIC0tPlxuICAgKlxuICAgKiBUaGlzIEFQSSBpcyB0aGUgcmVjb21tZW5kZWQgd2F5IHRvIGNvbnN0cnVjdCBpbmplY3RvcnMgaW4gcGVyZm9ybWFuY2Utc2Vuc2l0aXZlIHBhcnRzLlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvVmh5ZmpOP3A9cHJldmlldykpXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY2xhc3MgUGFyZW50UHJvdmlkZXIge31cbiAgICogY2xhc3MgQ2hpbGRQcm92aWRlciB7fVxuICAgKlxuICAgKiB2YXIgcGFyZW50UHJvdmlkZXJzID0gSW5qZWN0b3IucmVzb2x2ZShbUGFyZW50UHJvdmlkZXJdKTtcbiAgICogdmFyIGNoaWxkUHJvdmlkZXJzID0gSW5qZWN0b3IucmVzb2x2ZShbQ2hpbGRQcm92aWRlcl0pO1xuICAgKlxuICAgKiB2YXIgcGFyZW50ID0gSW5qZWN0b3IuZnJvbVJlc29sdmVkUHJvdmlkZXJzKHBhcmVudFByb3ZpZGVycyk7XG4gICAqIHZhciBjaGlsZCA9IHBhcmVudC5jcmVhdGVDaGlsZEZyb21SZXNvbHZlZChjaGlsZFByb3ZpZGVycyk7XG4gICAqXG4gICAqIGV4cGVjdChjaGlsZC5nZXQoUGFyZW50UHJvdmlkZXIpIGluc3RhbmNlb2YgUGFyZW50UHJvdmlkZXIpLnRvQmUodHJ1ZSk7XG4gICAqIGV4cGVjdChjaGlsZC5nZXQoQ2hpbGRQcm92aWRlcikgaW5zdGFuY2VvZiBDaGlsZFByb3ZpZGVyKS50b0JlKHRydWUpO1xuICAgKiBleHBlY3QoY2hpbGQuZ2V0KFBhcmVudFByb3ZpZGVyKSkudG9CZShwYXJlbnQuZ2V0KFBhcmVudFByb3ZpZGVyKSk7XG4gICAqIGBgYFxuICAgKi9cbiAgY3JlYXRlQ2hpbGRGcm9tUmVzb2x2ZWQocHJvdmlkZXJzOiBSZXNvbHZlZFByb3ZpZGVyW10pOiBJbmplY3RvciB7XG4gICAgdmFyIGJkID0gcHJvdmlkZXJzLm1hcChiID0+IG5ldyBQcm92aWRlcldpdGhWaXNpYmlsaXR5KGIsIFZpc2liaWxpdHkuUHVibGljKSk7XG4gICAgdmFyIHByb3RvID0gbmV3IFByb3RvSW5qZWN0b3IoYmQpO1xuICAgIHZhciBpbmogPSBuZXcgSW5qZWN0b3IocHJvdG8sIG51bGwsIG51bGwpO1xuICAgIGluai5fcGFyZW50ID0gdGhpcztcbiAgICByZXR1cm4gaW5qO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGEgcHJvdmlkZXIgYW5kIGluc3RhbnRpYXRlcyBhbiBvYmplY3QgaW4gdGhlIGNvbnRleHQgb2YgdGhlIGluamVjdG9yLlxuICAgKlxuICAgKiBUaGUgY3JlYXRlZCBvYmplY3QgZG9lcyBub3QgZ2V0IGNhY2hlZCBieSB0aGUgaW5qZWN0b3IuXG4gICAqXG4gICAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC95dlZYb0I/cD1wcmV2aWV3KSlcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBASW5qZWN0YWJsZSgpXG4gICAqIGNsYXNzIEVuZ2luZSB7XG4gICAqIH1cbiAgICpcbiAgICogQEluamVjdGFibGUoKVxuICAgKiBjbGFzcyBDYXIge1xuICAgKiAgIGNvbnN0cnVjdG9yKHB1YmxpYyBlbmdpbmU6RW5naW5lKSB7fVxuICAgKiB9XG4gICAqXG4gICAqIHZhciBpbmplY3RvciA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW0VuZ2luZV0pO1xuICAgKlxuICAgKiB2YXIgY2FyID0gaW5qZWN0b3IucmVzb2x2ZUFuZEluc3RhbnRpYXRlKENhcik7XG4gICAqIGV4cGVjdChjYXIuZW5naW5lKS50b0JlKGluamVjdG9yLmdldChFbmdpbmUpKTtcbiAgICogZXhwZWN0KGNhcikubm90LnRvQmUoaW5qZWN0b3IucmVzb2x2ZUFuZEluc3RhbnRpYXRlKENhcikpO1xuICAgKiBgYGBcbiAgICovXG4gIHJlc29sdmVBbmRJbnN0YW50aWF0ZShwcm92aWRlcjogVHlwZSB8IFByb3ZpZGVyKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW50aWF0ZVJlc29sdmVkKEluamVjdG9yLnJlc29sdmUoW3Byb3ZpZGVyXSlbMF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbnRpYXRlcyBhbiBvYmplY3QgdXNpbmcgYSByZXNvbHZlZCBwcm92aWRlciBpbiB0aGUgY29udGV4dCBvZiB0aGUgaW5qZWN0b3IuXG4gICAqXG4gICAqIFRoZSBjcmVhdGVkIG9iamVjdCBkb2VzIG5vdCBnZXQgY2FjaGVkIGJ5IHRoZSBpbmplY3Rvci5cbiAgICpcbiAgICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L3B0Q0ltUT9wPXByZXZpZXcpKVxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIEBJbmplY3RhYmxlKClcbiAgICogY2xhc3MgRW5naW5lIHtcbiAgICogfVxuICAgKlxuICAgKiBASW5qZWN0YWJsZSgpXG4gICAqIGNsYXNzIENhciB7XG4gICAqICAgY29uc3RydWN0b3IocHVibGljIGVuZ2luZTpFbmdpbmUpIHt9XG4gICAqIH1cbiAgICpcbiAgICogdmFyIGluamVjdG9yID0gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbRW5naW5lXSk7XG4gICAqIHZhciBjYXJQcm92aWRlciA9IEluamVjdG9yLnJlc29sdmUoW0Nhcl0pWzBdO1xuICAgKiB2YXIgY2FyID0gaW5qZWN0b3IuaW5zdGFudGlhdGVSZXNvbHZlZChjYXJQcm92aWRlcik7XG4gICAqIGV4cGVjdChjYXIuZW5naW5lKS50b0JlKGluamVjdG9yLmdldChFbmdpbmUpKTtcbiAgICogZXhwZWN0KGNhcikubm90LnRvQmUoaW5qZWN0b3IuaW5zdGFudGlhdGVSZXNvbHZlZChjYXJQcm92aWRlcikpO1xuICAgKiBgYGBcbiAgICovXG4gIGluc3RhbnRpYXRlUmVzb2x2ZWQocHJvdmlkZXI6IFJlc29sdmVkUHJvdmlkZXIpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9pbnN0YW50aWF0ZVByb3ZpZGVyKHByb3ZpZGVyLCBWaXNpYmlsaXR5LlB1YmxpY0FuZFByaXZhdGUpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfbmV3KHByb3ZpZGVyOiBSZXNvbHZlZFByb3ZpZGVyLCB2aXNpYmlsaXR5OiBWaXNpYmlsaXR5KTogYW55IHtcbiAgICBpZiAodGhpcy5fY29uc3RydWN0aW9uQ291bnRlcisrID4gdGhpcy5fc3RyYXRlZ3kuZ2V0TWF4TnVtYmVyT2ZPYmplY3RzKCkpIHtcbiAgICAgIHRocm93IG5ldyBDeWNsaWNEZXBlbmRlbmN5RXJyb3IodGhpcywgcHJvdmlkZXIua2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2luc3RhbnRpYXRlUHJvdmlkZXIocHJvdmlkZXIsIHZpc2liaWxpdHkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5zdGFudGlhdGVQcm92aWRlcihwcm92aWRlcjogUmVzb2x2ZWRQcm92aWRlciwgdmlzaWJpbGl0eTogVmlzaWJpbGl0eSk6IGFueSB7XG4gICAgaWYgKHByb3ZpZGVyLm11bHRpUHJvdmlkZXIpIHtcbiAgICAgIHZhciByZXMgPSBMaXN0V3JhcHBlci5jcmVhdGVGaXhlZFNpemUocHJvdmlkZXIucmVzb2x2ZWRGYWN0b3JpZXMubGVuZ3RoKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvdmlkZXIucmVzb2x2ZWRGYWN0b3JpZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgcmVzW2ldID0gdGhpcy5faW5zdGFudGlhdGUocHJvdmlkZXIsIHByb3ZpZGVyLnJlc29sdmVkRmFjdG9yaWVzW2ldLCB2aXNpYmlsaXR5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl9pbnN0YW50aWF0ZShwcm92aWRlciwgcHJvdmlkZXIucmVzb2x2ZWRGYWN0b3JpZXNbMF0sIHZpc2liaWxpdHkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2luc3RhbnRpYXRlKHByb3ZpZGVyOiBSZXNvbHZlZFByb3ZpZGVyLCByZXNvbHZlZEZhY3Rvcnk6IFJlc29sdmVkRmFjdG9yeSxcbiAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJpbGl0eTogVmlzaWJpbGl0eSk6IGFueSB7XG4gICAgdmFyIGZhY3RvcnkgPSByZXNvbHZlZEZhY3RvcnkuZmFjdG9yeTtcbiAgICB2YXIgZGVwcyA9IHJlc29sdmVkRmFjdG9yeS5kZXBlbmRlbmNpZXM7XG4gICAgdmFyIGxlbmd0aCA9IGRlcHMubGVuZ3RoO1xuXG4gICAgdmFyIGQwLCBkMSwgZDIsIGQzLCBkNCwgZDUsIGQ2LCBkNywgZDgsIGQ5LCBkMTAsIGQxMSwgZDEyLCBkMTMsIGQxNCwgZDE1LCBkMTYsIGQxNywgZDE4LCBkMTk7XG4gICAgdHJ5IHtcbiAgICAgIGQwID0gbGVuZ3RoID4gMCA/IHRoaXMuX2dldEJ5RGVwZW5kZW5jeShwcm92aWRlciwgZGVwc1swXSwgdmlzaWJpbGl0eSkgOiBudWxsO1xuICAgICAgZDEgPSBsZW5ndGggPiAxID8gdGhpcy5fZ2V0QnlEZXBlbmRlbmN5KHByb3ZpZGVyLCBkZXBzWzFdLCB2aXNpYmlsaXR5KSA6IG51bGw7XG4gICAgICBkMiA9IGxlbmd0aCA+IDIgPyB0aGlzLl9nZXRCeURlcGVuZGVuY3kocHJvdmlkZXIsIGRlcHNbMl0sIHZpc2liaWxpdHkpIDogbnVsbDtcbiAgICAgIGQzID0gbGVuZ3RoID4gMyA/IHRoaXMuX2dldEJ5RGVwZW5kZW5jeShwcm92aWRlciwgZGVwc1szXSwgdmlzaWJpbGl0eSkgOiBudWxsO1xuICAgICAgZDQgPSBsZW5ndGggPiA0ID8gdGhpcy5fZ2V0QnlEZXBlbmRlbmN5KHByb3ZpZGVyLCBkZXBzWzRdLCB2aXNpYmlsaXR5KSA6IG51bGw7XG4gICAgICBkNSA9IGxlbmd0aCA+IDUgPyB0aGlzLl9nZXRCeURlcGVuZGVuY3kocHJvdmlkZXIsIGRlcHNbNV0sIHZpc2liaWxpdHkpIDogbnVsbDtcbiAgICAgIGQ2ID0gbGVuZ3RoID4gNiA/IHRoaXMuX2dldEJ5RGVwZW5kZW5jeShwcm92aWRlciwgZGVwc1s2XSwgdmlzaWJpbGl0eSkgOiBudWxsO1xuICAgICAgZDcgPSBsZW5ndGggPiA3ID8gdGhpcy5fZ2V0QnlEZXBlbmRlbmN5KHByb3ZpZGVyLCBkZXBzWzddLCB2aXNpYmlsaXR5KSA6IG51bGw7XG4gICAgICBkOCA9IGxlbmd0aCA+IDggPyB0aGlzLl9nZXRCeURlcGVuZGVuY3kocHJvdmlkZXIsIGRlcHNbOF0sIHZpc2liaWxpdHkpIDogbnVsbDtcbiAgICAgIGQ5ID0gbGVuZ3RoID4gOSA/IHRoaXMuX2dldEJ5RGVwZW5kZW5jeShwcm92aWRlciwgZGVwc1s5XSwgdmlzaWJpbGl0eSkgOiBudWxsO1xuICAgICAgZDEwID0gbGVuZ3RoID4gMTAgPyB0aGlzLl9nZXRCeURlcGVuZGVuY3kocHJvdmlkZXIsIGRlcHNbMTBdLCB2aXNpYmlsaXR5KSA6IG51bGw7XG4gICAgICBkMTEgPSBsZW5ndGggPiAxMSA/IHRoaXMuX2dldEJ5RGVwZW5kZW5jeShwcm92aWRlciwgZGVwc1sxMV0sIHZpc2liaWxpdHkpIDogbnVsbDtcbiAgICAgIGQxMiA9IGxlbmd0aCA+IDEyID8gdGhpcy5fZ2V0QnlEZXBlbmRlbmN5KHByb3ZpZGVyLCBkZXBzWzEyXSwgdmlzaWJpbGl0eSkgOiBudWxsO1xuICAgICAgZDEzID0gbGVuZ3RoID4gMTMgPyB0aGlzLl9nZXRCeURlcGVuZGVuY3kocHJvdmlkZXIsIGRlcHNbMTNdLCB2aXNpYmlsaXR5KSA6IG51bGw7XG4gICAgICBkMTQgPSBsZW5ndGggPiAxNCA/IHRoaXMuX2dldEJ5RGVwZW5kZW5jeShwcm92aWRlciwgZGVwc1sxNF0sIHZpc2liaWxpdHkpIDogbnVsbDtcbiAgICAgIGQxNSA9IGxlbmd0aCA+IDE1ID8gdGhpcy5fZ2V0QnlEZXBlbmRlbmN5KHByb3ZpZGVyLCBkZXBzWzE1XSwgdmlzaWJpbGl0eSkgOiBudWxsO1xuICAgICAgZDE2ID0gbGVuZ3RoID4gMTYgPyB0aGlzLl9nZXRCeURlcGVuZGVuY3kocHJvdmlkZXIsIGRlcHNbMTZdLCB2aXNpYmlsaXR5KSA6IG51bGw7XG4gICAgICBkMTcgPSBsZW5ndGggPiAxNyA/IHRoaXMuX2dldEJ5RGVwZW5kZW5jeShwcm92aWRlciwgZGVwc1sxN10sIHZpc2liaWxpdHkpIDogbnVsbDtcbiAgICAgIGQxOCA9IGxlbmd0aCA+IDE4ID8gdGhpcy5fZ2V0QnlEZXBlbmRlbmN5KHByb3ZpZGVyLCBkZXBzWzE4XSwgdmlzaWJpbGl0eSkgOiBudWxsO1xuICAgICAgZDE5ID0gbGVuZ3RoID4gMTkgPyB0aGlzLl9nZXRCeURlcGVuZGVuY3kocHJvdmlkZXIsIGRlcHNbMTldLCB2aXNpYmlsaXR5KSA6IG51bGw7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBBYnN0cmFjdFByb3ZpZGVyRXJyb3IgfHwgZSBpbnN0YW5jZW9mIEluc3RhbnRpYXRpb25FcnJvcikge1xuICAgICAgICBlLmFkZEtleSh0aGlzLCBwcm92aWRlci5rZXkpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbiAgICB2YXIgb2JqO1xuICAgIHRyeSB7XG4gICAgICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgb2JqID0gZmFjdG9yeSgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgb2JqID0gZmFjdG9yeShkMCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBvYmogPSBmYWN0b3J5KGQwLCBkMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBvYmogPSBmYWN0b3J5KGQwLCBkMSwgZDIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgb2JqID0gZmFjdG9yeShkMCwgZDEsIGQyLCBkMyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICBvYmogPSBmYWN0b3J5KGQwLCBkMSwgZDIsIGQzLCBkNCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNjpcbiAgICAgICAgICBvYmogPSBmYWN0b3J5KGQwLCBkMSwgZDIsIGQzLCBkNCwgZDUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgb2JqID0gZmFjdG9yeShkMCwgZDEsIGQyLCBkMywgZDQsIGQ1LCBkNik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICBvYmogPSBmYWN0b3J5KGQwLCBkMSwgZDIsIGQzLCBkNCwgZDUsIGQ2LCBkNyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgOTpcbiAgICAgICAgICBvYmogPSBmYWN0b3J5KGQwLCBkMSwgZDIsIGQzLCBkNCwgZDUsIGQ2LCBkNywgZDgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgIG9iaiA9IGZhY3RvcnkoZDAsIGQxLCBkMiwgZDMsIGQ0LCBkNSwgZDYsIGQ3LCBkOCwgZDkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDExOlxuICAgICAgICAgIG9iaiA9IGZhY3RvcnkoZDAsIGQxLCBkMiwgZDMsIGQ0LCBkNSwgZDYsIGQ3LCBkOCwgZDksIGQxMCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgb2JqID0gZmFjdG9yeShkMCwgZDEsIGQyLCBkMywgZDQsIGQ1LCBkNiwgZDcsIGQ4LCBkOSwgZDEwLCBkMTEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgIG9iaiA9IGZhY3RvcnkoZDAsIGQxLCBkMiwgZDMsIGQ0LCBkNSwgZDYsIGQ3LCBkOCwgZDksIGQxMCwgZDExLCBkMTIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgIG9iaiA9IGZhY3RvcnkoZDAsIGQxLCBkMiwgZDMsIGQ0LCBkNSwgZDYsIGQ3LCBkOCwgZDksIGQxMCwgZDExLCBkMTIsIGQxMyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgb2JqID0gZmFjdG9yeShkMCwgZDEsIGQyLCBkMywgZDQsIGQ1LCBkNiwgZDcsIGQ4LCBkOSwgZDEwLCBkMTEsIGQxMiwgZDEzLCBkMTQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgIG9iaiA9IGZhY3RvcnkoZDAsIGQxLCBkMiwgZDMsIGQ0LCBkNSwgZDYsIGQ3LCBkOCwgZDksIGQxMCwgZDExLCBkMTIsIGQxMywgZDE0LCBkMTUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE3OlxuICAgICAgICAgIG9iaiA9IGZhY3RvcnkoZDAsIGQxLCBkMiwgZDMsIGQ0LCBkNSwgZDYsIGQ3LCBkOCwgZDksIGQxMCwgZDExLCBkMTIsIGQxMywgZDE0LCBkMTUsIGQxNik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgb2JqID0gZmFjdG9yeShkMCwgZDEsIGQyLCBkMywgZDQsIGQ1LCBkNiwgZDcsIGQ4LCBkOSwgZDEwLCBkMTEsIGQxMiwgZDEzLCBkMTQsIGQxNSwgZDE2LFxuICAgICAgICAgICAgICAgICAgICAgICAgZDE3KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgICBvYmogPSBmYWN0b3J5KGQwLCBkMSwgZDIsIGQzLCBkNCwgZDUsIGQ2LCBkNywgZDgsIGQ5LCBkMTAsIGQxMSwgZDEyLCBkMTMsIGQxNCwgZDE1LCBkMTYsXG4gICAgICAgICAgICAgICAgICAgICAgICBkMTcsIGQxOCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjA6XG4gICAgICAgICAgb2JqID0gZmFjdG9yeShkMCwgZDEsIGQyLCBkMywgZDQsIGQ1LCBkNiwgZDcsIGQ4LCBkOSwgZDEwLCBkMTEsIGQxMiwgZDEzLCBkMTQsIGQxNSwgZDE2LFxuICAgICAgICAgICAgICAgICAgICAgICAgZDE3LCBkMTgsIGQxOSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FcnJvcih0aGlzLCBlLCBlLnN0YWNrLCBwcm92aWRlci5rZXkpO1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0QnlEZXBlbmRlbmN5KHByb3ZpZGVyOiBSZXNvbHZlZFByb3ZpZGVyLCBkZXA6IERlcGVuZGVuY3ksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlclZpc2liaWxpdHk6IFZpc2liaWxpdHkpOiBhbnkge1xuICAgIHZhciBzcGVjaWFsID0gaXNQcmVzZW50KHRoaXMuX2RlcFByb3ZpZGVyKSA/XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVwUHJvdmlkZXIuZ2V0RGVwZW5kZW5jeSh0aGlzLCBwcm92aWRlciwgZGVwKSA6XG4gICAgICAgICAgICAgICAgICAgICAgVU5ERUZJTkVEO1xuICAgIGlmIChzcGVjaWFsICE9PSBVTkRFRklORUQpIHtcbiAgICAgIHJldHVybiBzcGVjaWFsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0QnlLZXkoZGVwLmtleSwgZGVwLmxvd2VyQm91bmRWaXNpYmlsaXR5LCBkZXAudXBwZXJCb3VuZFZpc2liaWxpdHksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwLm9wdGlvbmFsLCBwcm92aWRlclZpc2liaWxpdHkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2dldEJ5S2V5KGtleTogS2V5LCBsb3dlckJvdW5kVmlzaWJpbGl0eTogT2JqZWN0LCB1cHBlckJvdW5kVmlzaWJpbGl0eTogT2JqZWN0LFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25hbDogYm9vbGVhbiwgcHJvdmlkZXJWaXNpYmlsaXR5OiBWaXNpYmlsaXR5KTogYW55IHtcbiAgICBpZiAoa2V5ID09PSBJTkpFQ1RPUl9LRVkpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGlmICh1cHBlckJvdW5kVmlzaWJpbGl0eSBpbnN0YW5jZW9mIFNlbGZNZXRhZGF0YSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldEJ5S2V5U2VsZihrZXksIG9wdGlvbmFsLCBwcm92aWRlclZpc2liaWxpdHkpO1xuXG4gICAgfSBlbHNlIGlmICh1cHBlckJvdW5kVmlzaWJpbGl0eSBpbnN0YW5jZW9mIEhvc3RNZXRhZGF0YSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldEJ5S2V5SG9zdChrZXksIG9wdGlvbmFsLCBwcm92aWRlclZpc2liaWxpdHksIGxvd2VyQm91bmRWaXNpYmlsaXR5KTtcblxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0QnlLZXlEZWZhdWx0KGtleSwgb3B0aW9uYWwsIHByb3ZpZGVyVmlzaWJpbGl0eSwgbG93ZXJCb3VuZFZpc2liaWxpdHkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3Rocm93T3JOdWxsKGtleTogS2V5LCBvcHRpb25hbDogYm9vbGVhbik6IGFueSB7XG4gICAgaWYgKG9wdGlvbmFsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IE5vUHJvdmlkZXJFcnJvcih0aGlzLCBrZXkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2dldEJ5S2V5U2VsZihrZXk6IEtleSwgb3B0aW9uYWw6IGJvb2xlYW4sIHByb3ZpZGVyVmlzaWJpbGl0eTogVmlzaWJpbGl0eSk6IGFueSB7XG4gICAgdmFyIG9iaiA9IHRoaXMuX3N0cmF0ZWd5LmdldE9iakJ5S2V5SWQoa2V5LmlkLCBwcm92aWRlclZpc2liaWxpdHkpO1xuICAgIHJldHVybiAob2JqICE9PSBVTkRFRklORUQpID8gb2JqIDogdGhpcy5fdGhyb3dPck51bGwoa2V5LCBvcHRpb25hbCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9nZXRCeUtleUhvc3Qoa2V5OiBLZXksIG9wdGlvbmFsOiBib29sZWFuLCBwcm92aWRlclZpc2liaWxpdHk6IFZpc2liaWxpdHksXG4gICAgICAgICAgICAgICAgbG93ZXJCb3VuZFZpc2liaWxpdHk6IE9iamVjdCk6IGFueSB7XG4gICAgdmFyIGluajogSW5qZWN0b3IgPSB0aGlzO1xuXG4gICAgaWYgKGxvd2VyQm91bmRWaXNpYmlsaXR5IGluc3RhbmNlb2YgU2tpcFNlbGZNZXRhZGF0YSkge1xuICAgICAgaWYgKGluai5faXNIb3N0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRQcml2YXRlRGVwZW5kZW5jeShrZXksIG9wdGlvbmFsLCBpbmopO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5qID0gaW5qLl9wYXJlbnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd2hpbGUgKGluaiAhPSBudWxsKSB7XG4gICAgICB2YXIgb2JqID0gaW5qLl9zdHJhdGVneS5nZXRPYmpCeUtleUlkKGtleS5pZCwgcHJvdmlkZXJWaXNpYmlsaXR5KTtcbiAgICAgIGlmIChvYmogIT09IFVOREVGSU5FRCkgcmV0dXJuIG9iajtcblxuICAgICAgaWYgKGlzUHJlc2VudChpbmouX3BhcmVudCkgJiYgaW5qLl9pc0hvc3QpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldFByaXZhdGVEZXBlbmRlbmN5KGtleSwgb3B0aW9uYWwsIGluaik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmogPSBpbmouX3BhcmVudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fdGhyb3dPck51bGwoa2V5LCBvcHRpb25hbCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9nZXRQcml2YXRlRGVwZW5kZW5jeShrZXk6IEtleSwgb3B0aW9uYWw6IGJvb2xlYW4sIGluajogSW5qZWN0b3IpOiBhbnkge1xuICAgIHZhciBvYmogPSBpbmouX3BhcmVudC5fc3RyYXRlZ3kuZ2V0T2JqQnlLZXlJZChrZXkuaWQsIFZpc2liaWxpdHkuUHJpdmF0ZSk7XG4gICAgcmV0dXJuIChvYmogIT09IFVOREVGSU5FRCkgPyBvYmogOiB0aGlzLl90aHJvd09yTnVsbChrZXksIG9wdGlvbmFsKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2dldEJ5S2V5RGVmYXVsdChrZXk6IEtleSwgb3B0aW9uYWw6IGJvb2xlYW4sIHByb3ZpZGVyVmlzaWJpbGl0eTogVmlzaWJpbGl0eSxcbiAgICAgICAgICAgICAgICAgICBsb3dlckJvdW5kVmlzaWJpbGl0eTogT2JqZWN0KTogYW55IHtcbiAgICB2YXIgaW5qOiBJbmplY3RvciA9IHRoaXM7XG5cbiAgICBpZiAobG93ZXJCb3VuZFZpc2liaWxpdHkgaW5zdGFuY2VvZiBTa2lwU2VsZk1ldGFkYXRhKSB7XG4gICAgICBwcm92aWRlclZpc2liaWxpdHkgPSBpbmouX2lzSG9zdCA/IFZpc2liaWxpdHkuUHVibGljQW5kUHJpdmF0ZSA6IFZpc2liaWxpdHkuUHVibGljO1xuICAgICAgaW5qID0gaW5qLl9wYXJlbnQ7XG4gICAgfVxuXG4gICAgd2hpbGUgKGluaiAhPSBudWxsKSB7XG4gICAgICB2YXIgb2JqID0gaW5qLl9zdHJhdGVneS5nZXRPYmpCeUtleUlkKGtleS5pZCwgcHJvdmlkZXJWaXNpYmlsaXR5KTtcbiAgICAgIGlmIChvYmogIT09IFVOREVGSU5FRCkgcmV0dXJuIG9iajtcblxuICAgICAgcHJvdmlkZXJWaXNpYmlsaXR5ID0gaW5qLl9pc0hvc3QgPyBWaXNpYmlsaXR5LlB1YmxpY0FuZFByaXZhdGUgOiBWaXNpYmlsaXR5LlB1YmxpYztcbiAgICAgIGluaiA9IGluai5fcGFyZW50O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl90aHJvd09yTnVsbChrZXksIG9wdGlvbmFsKTtcbiAgfVxuXG4gIGdldCBkaXNwbGF5TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgSW5qZWN0b3IocHJvdmlkZXJzOiBbJHtfbWFwUHJvdmlkZXJzKHRoaXMsIGIgPT4gYCBcIiR7Yi5rZXkuZGlzcGxheU5hbWV9XCIgYCkuam9pbihcIiwgXCIpfV0pYDtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmRpc3BsYXlOYW1lOyB9XG59XG5cbnZhciBJTkpFQ1RPUl9LRVkgPSBLZXkuZ2V0KEluamVjdG9yKTtcblxuXG5mdW5jdGlvbiBfbWFwUHJvdmlkZXJzKGluamVjdG9yOiBJbmplY3RvciwgZm46IEZ1bmN0aW9uKTogYW55W10ge1xuICB2YXIgcmVzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaW5qZWN0b3IuX3Byb3RvLm51bWJlck9mUHJvdmlkZXJzOyArK2kpIHtcbiAgICByZXMucHVzaChmbihpbmplY3Rvci5fcHJvdG8uZ2V0UHJvdmlkZXJBdEluZGV4KGkpKSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2RpL2luamVjdG9yLnRzXG4gKiovIiwiaW1wb3J0IHtcbiAgaXNKc09iamVjdCxcbiAgZ2xvYmFsLFxuICBpc1ByZXNlbnQsXG4gIGlzQmxhbmssXG4gIGlzQXJyYXksXG4gIGdldFN5bWJvbEl0ZXJhdG9yXG59IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5cbmV4cG9ydCB2YXIgTWFwID0gZ2xvYmFsLk1hcDtcbmV4cG9ydCB2YXIgU2V0ID0gZ2xvYmFsLlNldDtcblxuLy8gU2FmYXJpIGFuZCBJbnRlcm5ldCBFeHBsb3JlciBkbyBub3Qgc3VwcG9ydCB0aGUgaXRlcmFibGUgcGFyYW1ldGVyIHRvIHRoZVxuLy8gTWFwIGNvbnN0cnVjdG9yLiAgV2Ugd29yayBhcm91bmQgdGhhdCBieSBtYW51YWxseSBhZGRpbmcgdGhlIGl0ZW1zLlxudmFyIGNyZWF0ZU1hcEZyb21QYWlyczogeyhwYWlyczogYW55W10pOiBNYXA8YW55LCBhbnk+fSA9IChmdW5jdGlvbigpIHtcbiAgdHJ5IHtcbiAgICBpZiAobmV3IE1hcCg8YW55PltbMSwgMl1dKS5zaXplID09PSAxKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gY3JlYXRlTWFwRnJvbVBhaXJzKHBhaXJzOiBhbnlbXSk6IE1hcDxhbnksIGFueT4geyByZXR1cm4gbmV3IE1hcChwYWlycyk7IH07XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uIGNyZWF0ZU1hcEFuZFBvcHVsYXRlRnJvbVBhaXJzKHBhaXJzOiBhbnlbXSk6IE1hcDxhbnksIGFueT4ge1xuICAgIHZhciBtYXAgPSBuZXcgTWFwKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYWlycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBhaXIgPSBwYWlyc1tpXTtcbiAgICAgIG1hcC5zZXQocGFpclswXSwgcGFpclsxXSk7XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG4gIH07XG59KSgpO1xudmFyIGNyZWF0ZU1hcEZyb21NYXA6IHsobTogTWFwPGFueSwgYW55Pik6IE1hcDxhbnksIGFueT59ID0gKGZ1bmN0aW9uKCkge1xuICB0cnkge1xuICAgIGlmIChuZXcgTWFwKDxhbnk+bmV3IE1hcCgpKSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNyZWF0ZU1hcEZyb21NYXAobTogTWFwPGFueSwgYW55Pik6IE1hcDxhbnksIGFueT4geyByZXR1cm4gbmV3IE1hcCg8YW55Pm0pOyB9O1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiBjcmVhdGVNYXBBbmRQb3B1bGF0ZUZyb21NYXAobTogTWFwPGFueSwgYW55Pik6IE1hcDxhbnksIGFueT4ge1xuICAgIHZhciBtYXAgPSBuZXcgTWFwKCk7XG4gICAgbS5mb3JFYWNoKCh2LCBrKSA9PiB7IG1hcC5zZXQoaywgdik7IH0pO1xuICAgIHJldHVybiBtYXA7XG4gIH07XG59KSgpO1xudmFyIF9jbGVhclZhbHVlczogeyhtOiBNYXA8YW55LCBhbnk+KX0gPSAoZnVuY3Rpb24oKSB7XG4gIGlmICgoPGFueT4obmV3IE1hcCgpKS5rZXlzKCkpLm5leHQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gX2NsZWFyVmFsdWVzKG06IE1hcDxhbnksIGFueT4pIHtcbiAgICAgIHZhciBrZXlJdGVyYXRvciA9IG0ua2V5cygpO1xuICAgICAgdmFyIGs7XG4gICAgICB3aGlsZSAoISgoayA9ICg8YW55PmtleUl0ZXJhdG9yKS5uZXh0KCkpLmRvbmUpKSB7XG4gICAgICAgIG0uc2V0KGsudmFsdWUsIG51bGwpO1xuICAgICAgfVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIF9jbGVhclZhbHVlc1dpdGhGb3JlRWFjaChtOiBNYXA8YW55LCBhbnk+KSB7XG4gICAgICBtLmZvckVhY2goKHYsIGspID0+IHsgbS5zZXQoaywgbnVsbCk7IH0pO1xuICAgIH07XG4gIH1cbn0pKCk7XG4vLyBTYWZhcmkgZG9lc24ndCBpbXBsZW1lbnQgTWFwSXRlcmF0b3IubmV4dCgpLCB3aGljaCBpcyB1c2VkIGlzIFRyYWNldXIncyBwb2x5ZmlsbCBvZiBBcnJheS5mcm9tXG4vLyBUT0RPKG1sYXZhbCk6IHJlbW92ZSB0aGUgd29yayBhcm91bmQgb25jZSB3ZSBoYXZlIGEgd29ya2luZyBwb2x5ZmlsbCBvZiBBcnJheS5mcm9tXG52YXIgX2FycmF5RnJvbU1hcDogeyhtOiBNYXA8YW55LCBhbnk+LCBnZXRWYWx1ZXM6IGJvb2xlYW4pOiBhbnlbXX0gPSAoZnVuY3Rpb24oKSB7XG4gIHRyeSB7XG4gICAgaWYgKCg8YW55PihuZXcgTWFwKCkpLnZhbHVlcygpKS5uZXh0KSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gY3JlYXRlQXJyYXlGcm9tTWFwKG06IE1hcDxhbnksIGFueT4sIGdldFZhbHVlczogYm9vbGVhbik6IGFueVtdIHtcbiAgICAgICAgcmV0dXJuIGdldFZhbHVlcyA/ICg8YW55PkFycmF5KS5mcm9tKG0udmFsdWVzKCkpIDogKDxhbnk+QXJyYXkpLmZyb20obS5rZXlzKCkpO1xuICAgICAgfTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gY3JlYXRlQXJyYXlGcm9tTWFwV2l0aEZvcmVhY2gobTogTWFwPGFueSwgYW55PiwgZ2V0VmFsdWVzOiBib29sZWFuKTogYW55W10ge1xuICAgIHZhciByZXMgPSBMaXN0V3JhcHBlci5jcmVhdGVGaXhlZFNpemUobS5zaXplKSwgaSA9IDA7XG4gICAgbS5mb3JFYWNoKCh2LCBrKSA9PiB7XG4gICAgICByZXNbaV0gPSBnZXRWYWx1ZXMgPyB2IDogaztcbiAgICAgIGkrKztcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzO1xuICB9O1xufSkoKTtcblxuZXhwb3J0IGNsYXNzIE1hcFdyYXBwZXIge1xuICBzdGF0aWMgY2xvbmU8SywgVj4obTogTWFwPEssIFY+KTogTWFwPEssIFY+IHsgcmV0dXJuIGNyZWF0ZU1hcEZyb21NYXAobSk7IH1cbiAgc3RhdGljIGNyZWF0ZUZyb21TdHJpbmdNYXA8VD4oc3RyaW5nTWFwOiB7W2tleTogc3RyaW5nXTogVH0pOiBNYXA8c3RyaW5nLCBUPiB7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBNYXA8c3RyaW5nLCBUPigpO1xuICAgIGZvciAodmFyIHByb3AgaW4gc3RyaW5nTWFwKSB7XG4gICAgICByZXN1bHQuc2V0KHByb3AsIHN0cmluZ01hcFtwcm9wXSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgc3RhdGljIHRvU3RyaW5nTWFwPFQ+KG06IE1hcDxzdHJpbmcsIFQ+KToge1trZXk6IHN0cmluZ106IFR9IHtcbiAgICB2YXIgcjoge1trZXk6IHN0cmluZ106IFR9ID0ge307XG4gICAgbS5mb3JFYWNoKCh2LCBrKSA9PiByW2tdID0gdik7XG4gICAgcmV0dXJuIHI7XG4gIH1cbiAgc3RhdGljIGNyZWF0ZUZyb21QYWlycyhwYWlyczogYW55W10pOiBNYXA8YW55LCBhbnk+IHsgcmV0dXJuIGNyZWF0ZU1hcEZyb21QYWlycyhwYWlycyk7IH1cbiAgc3RhdGljIGNsZWFyVmFsdWVzKG06IE1hcDxhbnksIGFueT4pIHsgX2NsZWFyVmFsdWVzKG0pOyB9XG4gIHN0YXRpYyBpdGVyYWJsZTxUPihtOiBUKTogVCB7IHJldHVybiBtOyB9XG4gIHN0YXRpYyBrZXlzPEs+KG06IE1hcDxLLCBhbnk+KTogS1tdIHsgcmV0dXJuIF9hcnJheUZyb21NYXAobSwgZmFsc2UpOyB9XG4gIHN0YXRpYyB2YWx1ZXM8Vj4obTogTWFwPGFueSwgVj4pOiBWW10geyByZXR1cm4gX2FycmF5RnJvbU1hcChtLCB0cnVlKTsgfVxufVxuXG4vKipcbiAqIFdyYXBzIEphdmFzY3JpcHQgT2JqZWN0c1xuICovXG5leHBvcnQgY2xhc3MgU3RyaW5nTWFwV3JhcHBlciB7XG4gIHN0YXRpYyBjcmVhdGUoKToge1trOiAvKmFueSovIHN0cmluZ106IGFueX0ge1xuICAgIC8vIE5vdGU6IFdlIGFyZSBub3QgdXNpbmcgT2JqZWN0LmNyZWF0ZShudWxsKSBoZXJlIGR1ZSB0b1xuICAgIC8vIHBlcmZvcm1hbmNlIVxuICAgIC8vIGh0dHA6Ly9qc3BlcmYuY29tL25nMi1vYmplY3QtY3JlYXRlLW51bGxcbiAgICByZXR1cm4ge307XG4gIH1cbiAgc3RhdGljIGNvbnRhaW5zKG1hcDoge1trZXk6IHN0cmluZ106IGFueX0sIGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG1hcC5oYXNPd25Qcm9wZXJ0eShrZXkpO1xuICB9XG4gIHN0YXRpYyBnZXQ8Vj4obWFwOiB7W2tleTogc3RyaW5nXTogVn0sIGtleTogc3RyaW5nKTogViB7XG4gICAgcmV0dXJuIG1hcC5oYXNPd25Qcm9wZXJ0eShrZXkpID8gbWFwW2tleV0gOiB1bmRlZmluZWQ7XG4gIH1cbiAgc3RhdGljIHNldDxWPihtYXA6IHtba2V5OiBzdHJpbmddOiBWfSwga2V5OiBzdHJpbmcsIHZhbHVlOiBWKSB7IG1hcFtrZXldID0gdmFsdWU7IH1cbiAgc3RhdGljIGtleXMobWFwOiB7W2tleTogc3RyaW5nXTogYW55fSk6IHN0cmluZ1tdIHsgcmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7IH1cbiAgc3RhdGljIGlzRW1wdHkobWFwOiB7W2tleTogc3RyaW5nXTogYW55fSk6IGJvb2xlYW4ge1xuICAgIGZvciAodmFyIHByb3AgaW4gbWFwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHN0YXRpYyBkZWxldGUgKG1hcDoge1trZXk6IHN0cmluZ106IGFueX0sIGtleTogc3RyaW5nKSB7IGRlbGV0ZSBtYXBba2V5XTsgfVxuICBzdGF0aWMgZm9yRWFjaDxLLCBWPihtYXA6IHtba2V5OiBzdHJpbmddOiBWfSwgY2FsbGJhY2s6IC8qKFYsIEspID0+IHZvaWQqLyBGdW5jdGlvbikge1xuICAgIGZvciAodmFyIHByb3AgaW4gbWFwKSB7XG4gICAgICBpZiAobWFwLmhhc093blByb3BlcnR5KHByb3ApKSB7XG4gICAgICAgIGNhbGxiYWNrKG1hcFtwcm9wXSwgcHJvcCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIG1lcmdlPFY+KG0xOiB7W2tleTogc3RyaW5nXTogVn0sIG0yOiB7W2tleTogc3RyaW5nXTogVn0pOiB7W2tleTogc3RyaW5nXTogVn0ge1xuICAgIHZhciBtOiB7W2tleTogc3RyaW5nXTogVn0gPSB7fTtcblxuICAgIGZvciAodmFyIGF0dHIgaW4gbTEpIHtcbiAgICAgIGlmIChtMS5oYXNPd25Qcm9wZXJ0eShhdHRyKSkge1xuICAgICAgICBtW2F0dHJdID0gbTFbYXR0cl07XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIgYXR0ciBpbiBtMikge1xuICAgICAgaWYgKG0yLmhhc093blByb3BlcnR5KGF0dHIpKSB7XG4gICAgICAgIG1bYXR0cl0gPSBtMlthdHRyXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbTtcbiAgfVxuXG4gIHN0YXRpYyBlcXVhbHM8Vj4obTE6IHtba2V5OiBzdHJpbmddOiBWfSwgbTI6IHtba2V5OiBzdHJpbmddOiBWfSk6IGJvb2xlYW4ge1xuICAgIHZhciBrMSA9IE9iamVjdC5rZXlzKG0xKTtcbiAgICB2YXIgazIgPSBPYmplY3Qua2V5cyhtMik7XG4gICAgaWYgKGsxLmxlbmd0aCAhPSBrMi5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIGtleTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGsxLmxlbmd0aDsgaSsrKSB7XG4gICAgICBrZXkgPSBrMVtpXTtcbiAgICAgIGlmIChtMVtrZXldICE9PSBtMltrZXldKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBBIGJvb2xlYW4tdmFsdWVkIGZ1bmN0aW9uIG92ZXIgYSB2YWx1ZSwgcG9zc2libHkgaW5jbHVkaW5nIGNvbnRleHQgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyB0aGF0IHZhbHVlJ3MgcG9zaXRpb24gaW4gYW4gYXJyYXkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJlZGljYXRlPFQ+IHsgKHZhbHVlOiBULCBpbmRleD86IG51bWJlciwgYXJyYXk/OiBUW10pOiBib29sZWFuOyB9XG5cbmV4cG9ydCBjbGFzcyBMaXN0V3JhcHBlciB7XG4gIC8vIEpTIGhhcyBubyB3YXkgdG8gZXhwcmVzcyBhIHN0YXRpY2FsbHkgZml4ZWQgc2l6ZSBsaXN0LCBidXQgZGFydCBkb2VzIHNvIHdlXG4gIC8vIGtlZXAgYm90aCBtZXRob2RzLlxuICBzdGF0aWMgY3JlYXRlRml4ZWRTaXplKHNpemU6IG51bWJlcik6IGFueVtdIHsgcmV0dXJuIG5ldyBBcnJheShzaXplKTsgfVxuICBzdGF0aWMgY3JlYXRlR3Jvd2FibGVTaXplKHNpemU6IG51bWJlcik6IGFueVtdIHsgcmV0dXJuIG5ldyBBcnJheShzaXplKTsgfVxuICBzdGF0aWMgY2xvbmU8VD4oYXJyYXk6IFRbXSk6IFRbXSB7IHJldHVybiBhcnJheS5zbGljZSgwKTsgfVxuICBzdGF0aWMgZm9yRWFjaFdpdGhJbmRleDxUPihhcnJheTogVFtdLCBmbjogKHQ6IFQsIG46IG51bWJlcikgPT4gdm9pZCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZuKGFycmF5W2ldLCBpKTtcbiAgICB9XG4gIH1cbiAgc3RhdGljIGZpcnN0PFQ+KGFycmF5OiBUW10pOiBUIHtcbiAgICBpZiAoIWFycmF5KSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gYXJyYXlbMF07XG4gIH1cbiAgc3RhdGljIGxhc3Q8VD4oYXJyYXk6IFRbXSk6IFQge1xuICAgIGlmICghYXJyYXkgfHwgYXJyYXkubGVuZ3RoID09IDApIHJldHVybiBudWxsO1xuICAgIHJldHVybiBhcnJheVthcnJheS5sZW5ndGggLSAxXTtcbiAgfVxuICBzdGF0aWMgaW5kZXhPZjxUPihhcnJheTogVFtdLCB2YWx1ZTogVCwgc3RhcnRJbmRleDogbnVtYmVyID0gMCk6IG51bWJlciB7XG4gICAgcmV0dXJuIGFycmF5LmluZGV4T2YodmFsdWUsIHN0YXJ0SW5kZXgpO1xuICB9XG4gIHN0YXRpYyBjb250YWluczxUPihsaXN0OiBUW10sIGVsOiBUKTogYm9vbGVhbiB7IHJldHVybiBsaXN0LmluZGV4T2YoZWwpICE9PSAtMTsgfVxuICBzdGF0aWMgcmV2ZXJzZWQ8VD4oYXJyYXk6IFRbXSk6IFRbXSB7XG4gICAgdmFyIGEgPSBMaXN0V3JhcHBlci5jbG9uZShhcnJheSk7XG4gICAgcmV0dXJuIGEucmV2ZXJzZSgpO1xuICB9XG4gIHN0YXRpYyBjb25jYXQoYTogYW55W10sIGI6IGFueVtdKTogYW55W10geyByZXR1cm4gYS5jb25jYXQoYik7IH1cbiAgc3RhdGljIGluc2VydDxUPihsaXN0OiBUW10sIGluZGV4OiBudW1iZXIsIHZhbHVlOiBUKSB7IGxpc3Quc3BsaWNlKGluZGV4LCAwLCB2YWx1ZSk7IH1cbiAgc3RhdGljIHJlbW92ZUF0PFQ+KGxpc3Q6IFRbXSwgaW5kZXg6IG51bWJlcik6IFQge1xuICAgIHZhciByZXMgPSBsaXN0W2luZGV4XTtcbiAgICBsaXN0LnNwbGljZShpbmRleCwgMSk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBzdGF0aWMgcmVtb3ZlQWxsPFQ+KGxpc3Q6IFRbXSwgaXRlbXM6IFRbXSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBpbmRleCA9IGxpc3QuaW5kZXhPZihpdGVtc1tpXSk7XG4gICAgICBsaXN0LnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICB9XG4gIHN0YXRpYyByZW1vdmU8VD4obGlzdDogVFtdLCBlbDogVCk6IGJvb2xlYW4ge1xuICAgIHZhciBpbmRleCA9IGxpc3QuaW5kZXhPZihlbCk7XG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIGxpc3Quc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgc3RhdGljIGNsZWFyKGxpc3Q6IGFueVtdKSB7IGxpc3QubGVuZ3RoID0gMDsgfVxuICBzdGF0aWMgaXNFbXB0eShsaXN0OiBhbnlbXSk6IGJvb2xlYW4geyByZXR1cm4gbGlzdC5sZW5ndGggPT0gMDsgfVxuICBzdGF0aWMgZmlsbChsaXN0OiBhbnlbXSwgdmFsdWU6IGFueSwgc3RhcnQ6IG51bWJlciA9IDAsIGVuZDogbnVtYmVyID0gbnVsbCkge1xuICAgIGxpc3QuZmlsbCh2YWx1ZSwgc3RhcnQsIGVuZCA9PT0gbnVsbCA/IGxpc3QubGVuZ3RoIDogZW5kKTtcbiAgfVxuICBzdGF0aWMgZXF1YWxzKGE6IGFueVtdLCBiOiBhbnlbXSk6IGJvb2xlYW4ge1xuICAgIGlmIChhLmxlbmd0aCAhPSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7ICsraSkge1xuICAgICAgaWYgKGFbaV0gIT09IGJbaV0pIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgc3RhdGljIHNsaWNlPFQ+KGw6IFRbXSwgZnJvbTogbnVtYmVyID0gMCwgdG86IG51bWJlciA9IG51bGwpOiBUW10ge1xuICAgIHJldHVybiBsLnNsaWNlKGZyb20sIHRvID09PSBudWxsID8gdW5kZWZpbmVkIDogdG8pO1xuICB9XG4gIHN0YXRpYyBzcGxpY2U8VD4obDogVFtdLCBmcm9tOiBudW1iZXIsIGxlbmd0aDogbnVtYmVyKTogVFtdIHsgcmV0dXJuIGwuc3BsaWNlKGZyb20sIGxlbmd0aCk7IH1cbiAgc3RhdGljIHNvcnQ8VD4obDogVFtdLCBjb21wYXJlRm4/OiAoYTogVCwgYjogVCkgPT4gbnVtYmVyKSB7XG4gICAgaWYgKGlzUHJlc2VudChjb21wYXJlRm4pKSB7XG4gICAgICBsLnNvcnQoY29tcGFyZUZuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbC5zb3J0KCk7XG4gICAgfVxuICB9XG4gIHN0YXRpYyB0b1N0cmluZzxUPihsOiBUW10pOiBzdHJpbmcgeyByZXR1cm4gbC50b1N0cmluZygpOyB9XG4gIHN0YXRpYyB0b0pTT048VD4obDogVFtdKTogc3RyaW5nIHsgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGwpOyB9XG5cbiAgc3RhdGljIG1heGltdW08VD4obGlzdDogVFtdLCBwcmVkaWNhdGU6ICh0OiBUKSA9PiBudW1iZXIpOiBUIHtcbiAgICBpZiAobGlzdC5sZW5ndGggPT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBzb2x1dGlvbiA9IG51bGw7XG4gICAgdmFyIG1heFZhbHVlID0gLUluZmluaXR5O1xuICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBsaXN0Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgdmFyIGNhbmRpZGF0ZSA9IGxpc3RbaW5kZXhdO1xuICAgICAgaWYgKGlzQmxhbmsoY2FuZGlkYXRlKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBjYW5kaWRhdGVWYWx1ZSA9IHByZWRpY2F0ZShjYW5kaWRhdGUpO1xuICAgICAgaWYgKGNhbmRpZGF0ZVZhbHVlID4gbWF4VmFsdWUpIHtcbiAgICAgICAgc29sdXRpb24gPSBjYW5kaWRhdGU7XG4gICAgICAgIG1heFZhbHVlID0gY2FuZGlkYXRlVmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzb2x1dGlvbjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNMaXN0TGlrZUl0ZXJhYmxlKG9iajogYW55KTogYm9vbGVhbiB7XG4gIGlmICghaXNKc09iamVjdChvYmopKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBpc0FycmF5KG9iaikgfHxcbiAgICAgICAgICghKG9iaiBpbnN0YW5jZW9mIE1hcCkgJiYgICAgICAvLyBKUyBNYXAgYXJlIGl0ZXJhYmxlcyBidXQgcmV0dXJuIGVudHJpZXMgYXMgW2ssIHZdXG4gICAgICAgICAgZ2V0U3ltYm9sSXRlcmF0b3IoKSBpbiBvYmopOyAgLy8gSlMgSXRlcmFibGUgaGF2ZSBhIFN5bWJvbC5pdGVyYXRvciBwcm9wXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpdGVyYXRlTGlzdExpa2Uob2JqOiBhbnksIGZuOiBGdW5jdGlvbikge1xuICBpZiAoaXNBcnJheShvYmopKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZuKG9ialtpXSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBpdGVyYXRvciA9IG9ialtnZXRTeW1ib2xJdGVyYXRvcigpXSgpO1xuICAgIHZhciBpdGVtO1xuICAgIHdoaWxlICghKChpdGVtID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSkge1xuICAgICAgZm4oaXRlbS52YWx1ZSk7XG4gICAgfVxuICB9XG59XG5cbi8vIFNhZmFyaSBhbmQgSW50ZXJuZXQgRXhwbG9yZXIgZG8gbm90IHN1cHBvcnQgdGhlIGl0ZXJhYmxlIHBhcmFtZXRlciB0byB0aGVcbi8vIFNldCBjb25zdHJ1Y3Rvci4gIFdlIHdvcmsgYXJvdW5kIHRoYXQgYnkgbWFudWFsbHkgYWRkaW5nIHRoZSBpdGVtcy5cbnZhciBjcmVhdGVTZXRGcm9tTGlzdDogeyhsc3Q6IGFueVtdKTogU2V0PGFueT59ID0gKGZ1bmN0aW9uKCkge1xuICB2YXIgdGVzdCA9IG5ldyBTZXQoWzEsIDIsIDNdKTtcbiAgaWYgKHRlc3Quc2l6ZSA9PT0gMykge1xuICAgIHJldHVybiBmdW5jdGlvbiBjcmVhdGVTZXRGcm9tTGlzdChsc3Q6IGFueVtdKTogU2V0PGFueT4geyByZXR1cm4gbmV3IFNldChsc3QpOyB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmdW5jdGlvbiBjcmVhdGVTZXRBbmRQb3B1bGF0ZUZyb21MaXN0KGxzdDogYW55W10pOiBTZXQ8YW55PiB7XG4gICAgICB2YXIgcmVzID0gbmV3IFNldChsc3QpO1xuICAgICAgaWYgKHJlcy5zaXplICE9PSBsc3QubGVuZ3RoKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbHN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgcmVzLmFkZChsc3RbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH07XG4gIH1cbn0pKCk7XG5leHBvcnQgY2xhc3MgU2V0V3JhcHBlciB7XG4gIHN0YXRpYyBjcmVhdGVGcm9tTGlzdDxUPihsc3Q6IFRbXSk6IFNldDxUPiB7IHJldHVybiBjcmVhdGVTZXRGcm9tTGlzdChsc3QpOyB9XG4gIHN0YXRpYyBoYXM8VD4oczogU2V0PFQ+LCBrZXk6IFQpOiBib29sZWFuIHsgcmV0dXJuIHMuaGFzKGtleSk7IH1cbiAgc3RhdGljIGRlbGV0ZTxLPihtOiBTZXQ8Sz4sIGs6IEspIHsgbS5kZWxldGUoayk7IH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbi50c1xuICoqLyIsImltcG9ydCB7XG4gIFR5cGUsXG4gIGlzQmxhbmssXG4gIGlzUHJlc2VudCxcbiAgQ09OU1QsXG4gIENPTlNUX0VYUFIsXG4gIHN0cmluZ2lmeSxcbiAgaXNBcnJheSxcbiAgaXNUeXBlLFxuICBpc0Z1bmN0aW9uLFxuICBub3JtYWxpemVCb29sXG59IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge0Jhc2VFeGNlcHRpb24sIFdyYXBwZWRFeGNlcHRpb259IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9ucyc7XG5pbXBvcnQge01hcFdyYXBwZXIsIExpc3RXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtyZWZsZWN0b3J9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL3JlZmxlY3Rpb24vcmVmbGVjdGlvbic7XG5pbXBvcnQge0tleX0gZnJvbSAnLi9rZXknO1xuaW1wb3J0IHtcbiAgSW5qZWN0TWV0YWRhdGEsXG4gIEluamVjdGFibGVNZXRhZGF0YSxcbiAgT3B0aW9uYWxNZXRhZGF0YSxcbiAgU2VsZk1ldGFkYXRhLFxuICBIb3N0TWV0YWRhdGEsXG4gIFNraXBTZWxmTWV0YWRhdGEsXG4gIERlcGVuZGVuY3lNZXRhZGF0YVxufSBmcm9tICcuL21ldGFkYXRhJztcbmltcG9ydCB7XG4gIE5vQW5ub3RhdGlvbkVycm9yLFxuICBNaXhpbmdNdWx0aVByb3ZpZGVyc1dpdGhSZWd1bGFyUHJvdmlkZXJzRXJyb3IsXG4gIEludmFsaWRQcm92aWRlckVycm9yXG59IGZyb20gJy4vZXhjZXB0aW9ucyc7XG5pbXBvcnQge3Jlc29sdmVGb3J3YXJkUmVmfSBmcm9tICcuL2ZvcndhcmRfcmVmJztcblxuLyoqXG4gKiBgRGVwZW5kZW5jeWAgaXMgdXNlZCBieSB0aGUgZnJhbWV3b3JrIHRvIGV4dGVuZCBESS5cbiAqIFRoaXMgaXMgaW50ZXJuYWwgdG8gQW5ndWxhciBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5LlxuICovXG5leHBvcnQgY2xhc3MgRGVwZW5kZW5jeSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBrZXk6IEtleSwgcHVibGljIG9wdGlvbmFsOiBib29sZWFuLCBwdWJsaWMgbG93ZXJCb3VuZFZpc2liaWxpdHk6IGFueSxcbiAgICAgICAgICAgICAgcHVibGljIHVwcGVyQm91bmRWaXNpYmlsaXR5OiBhbnksIHB1YmxpYyBwcm9wZXJ0aWVzOiBhbnlbXSkge31cblxuICBzdGF0aWMgZnJvbUtleShrZXk6IEtleSk6IERlcGVuZGVuY3kgeyByZXR1cm4gbmV3IERlcGVuZGVuY3koa2V5LCBmYWxzZSwgbnVsbCwgbnVsbCwgW10pOyB9XG59XG5cbmNvbnN0IF9FTVBUWV9MSVNUID0gQ09OU1RfRVhQUihbXSk7XG5cbi8qKlxuICogRGVzY3JpYmVzIGhvdyB0aGUge0BsaW5rIEluamVjdG9yfSBzaG91bGQgaW5zdGFudGlhdGUgYSBnaXZlbiB0b2tlbi5cbiAqXG4gKiBTZWUge0BsaW5rIHByb3ZpZGV9LlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9HTkF5ajZLNlBmWWcyTkJ6Z3daNT9wJTNEcHJldmlldyZwPXByZXZpZXcpKVxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBpbmplY3RvciA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW1xuICogICBuZXcgUHJvdmlkZXIoXCJtZXNzYWdlXCIsIHsgdXNlVmFsdWU6ICdIZWxsbycgfSlcbiAqIF0pO1xuICpcbiAqIGV4cGVjdChpbmplY3Rvci5nZXQoXCJtZXNzYWdlXCIpKS50b0VxdWFsKCdIZWxsbycpO1xuICogYGBgXG4gKi9cbkBDT05TVCgpXG5leHBvcnQgY2xhc3MgUHJvdmlkZXIge1xuICAvKipcbiAgICogVG9rZW4gdXNlZCB3aGVuIHJldHJpZXZpbmcgdGhpcyBwcm92aWRlci4gVXN1YWxseSwgaXQgaXMgYSB0eXBlIHtAbGluayBUeXBlfS5cbiAgICovXG4gIHRva2VuO1xuXG4gIC8qKlxuICAgKiBCaW5kcyBhIERJIHRva2VuIHRvIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzLlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvUlNURzg2cWdtb3hDeWo5U1dQd1k/cD1wcmV2aWV3KSlcbiAgICpcbiAgICogQmVjYXVzZSBgdXNlRXhpc3RpbmdgIGFuZCBgdXNlQ2xhc3NgIGFyZSBvZnRlbiBjb25mdXNlZCwgdGhlIGV4YW1wbGUgY29udGFpbnNcbiAgICogYm90aCB1c2UgY2FzZXMgZm9yIGVhc3kgY29tcGFyaXNvbi5cbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjbGFzcyBWZWhpY2xlIHt9XG4gICAqXG4gICAqIGNsYXNzIENhciBleHRlbmRzIFZlaGljbGUge31cbiAgICpcbiAgICogdmFyIGluamVjdG9yQ2xhc3MgPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtcbiAgICogICBDYXIsXG4gICAqICAgbmV3IFByb3ZpZGVyKFZlaGljbGUsIHsgdXNlQ2xhc3M6IENhciB9KVxuICAgKiBdKTtcbiAgICogdmFyIGluamVjdG9yQWxpYXMgPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtcbiAgICogICBDYXIsXG4gICAqICAgbmV3IFByb3ZpZGVyKFZlaGljbGUsIHsgdXNlRXhpc3Rpbmc6IENhciB9KVxuICAgKiBdKTtcbiAgICpcbiAgICogZXhwZWN0KGluamVjdG9yQ2xhc3MuZ2V0KFZlaGljbGUpKS5ub3QudG9CZShpbmplY3RvckNsYXNzLmdldChDYXIpKTtcbiAgICogZXhwZWN0KGluamVjdG9yQ2xhc3MuZ2V0KFZlaGljbGUpIGluc3RhbmNlb2YgQ2FyKS50b0JlKHRydWUpO1xuICAgKlxuICAgKiBleHBlY3QoaW5qZWN0b3JBbGlhcy5nZXQoVmVoaWNsZSkpLnRvQmUoaW5qZWN0b3JBbGlhcy5nZXQoQ2FyKSk7XG4gICAqIGV4cGVjdChpbmplY3RvckFsaWFzLmdldChWZWhpY2xlKSBpbnN0YW5jZW9mIENhcikudG9CZSh0cnVlKTtcbiAgICogYGBgXG4gICAqL1xuICB1c2VDbGFzczogVHlwZTtcblxuICAvKipcbiAgICogQmluZHMgYSBESSB0b2tlbiB0byBhIHZhbHVlLlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvVUZWc01WUUlEZTdsNHdhV3ppRVM/cD1wcmV2aWV3KSlcbiAgICpcbiAgICogYGBgamF2YXNjcmlwdFxuICAgKiB2YXIgaW5qZWN0b3IgPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtcbiAgICogICBuZXcgUHJvdmlkZXIoXCJtZXNzYWdlXCIsIHsgdXNlVmFsdWU6ICdIZWxsbycgfSlcbiAgICogXSk7XG4gICAqXG4gICAqIGV4cGVjdChpbmplY3Rvci5nZXQoXCJtZXNzYWdlXCIpKS50b0VxdWFsKCdIZWxsbycpO1xuICAgKiBgYGBcbiAgICovXG4gIHVzZVZhbHVlO1xuXG4gIC8qKlxuICAgKiBCaW5kcyBhIERJIHRva2VuIHRvIGFuIGV4aXN0aW5nIHRva2VuLlxuICAgKlxuICAgKiB7QGxpbmsgSW5qZWN0b3J9IHJldHVybnMgdGhlIHNhbWUgaW5zdGFuY2UgYXMgaWYgdGhlIHByb3ZpZGVkIHRva2VuIHdhcyB1c2VkLlxuICAgKiBUaGlzIGlzIGluIGNvbnRyYXN0IHRvIGB1c2VDbGFzc2Agd2hlcmUgYSBzZXBhcmF0ZSBpbnN0YW5jZSBvZiBgdXNlQ2xhc3NgIGlzIHJldHVybmVkLlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvUXNhdHNPSko2UDhUMmZNZTlncjg/cD1wcmV2aWV3KSlcbiAgICpcbiAgICogQmVjYXVzZSBgdXNlRXhpc3RpbmdgIGFuZCBgdXNlQ2xhc3NgIGFyZSBvZnRlbiBjb25mdXNlZCB0aGUgZXhhbXBsZSBjb250YWluc1xuICAgKiBib3RoIHVzZSBjYXNlcyBmb3IgZWFzeSBjb21wYXJpc29uLlxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNsYXNzIFZlaGljbGUge31cbiAgICpcbiAgICogY2xhc3MgQ2FyIGV4dGVuZHMgVmVoaWNsZSB7fVxuICAgKlxuICAgKiB2YXIgaW5qZWN0b3JBbGlhcyA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW1xuICAgKiAgIENhcixcbiAgICogICBuZXcgUHJvdmlkZXIoVmVoaWNsZSwgeyB1c2VFeGlzdGluZzogQ2FyIH0pXG4gICAqIF0pO1xuICAgKiB2YXIgaW5qZWN0b3JDbGFzcyA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW1xuICAgKiAgIENhcixcbiAgICogICBuZXcgUHJvdmlkZXIoVmVoaWNsZSwgeyB1c2VDbGFzczogQ2FyIH0pXG4gICAqIF0pO1xuICAgKlxuICAgKiBleHBlY3QoaW5qZWN0b3JBbGlhcy5nZXQoVmVoaWNsZSkpLnRvQmUoaW5qZWN0b3JBbGlhcy5nZXQoQ2FyKSk7XG4gICAqIGV4cGVjdChpbmplY3RvckFsaWFzLmdldChWZWhpY2xlKSBpbnN0YW5jZW9mIENhcikudG9CZSh0cnVlKTtcbiAgICpcbiAgICogZXhwZWN0KGluamVjdG9yQ2xhc3MuZ2V0KFZlaGljbGUpKS5ub3QudG9CZShpbmplY3RvckNsYXNzLmdldChDYXIpKTtcbiAgICogZXhwZWN0KGluamVjdG9yQ2xhc3MuZ2V0KFZlaGljbGUpIGluc3RhbmNlb2YgQ2FyKS50b0JlKHRydWUpO1xuICAgKiBgYGBcbiAgICovXG4gIHVzZUV4aXN0aW5nO1xuXG4gIC8qKlxuICAgKiBCaW5kcyBhIERJIHRva2VuIHRvIGEgZnVuY3Rpb24gd2hpY2ggY29tcHV0ZXMgdGhlIHZhbHVlLlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvU2NveHkwcEpOcUtHQVBaWTFWVkM/cD1wcmV2aWV3KSlcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiB2YXIgaW5qZWN0b3IgPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtcbiAgICogICBuZXcgUHJvdmlkZXIoTnVtYmVyLCB7IHVzZUZhY3Rvcnk6ICgpID0+IHsgcmV0dXJuIDErMjsgfX0pLFxuICAgKiAgIG5ldyBQcm92aWRlcihTdHJpbmcsIHsgdXNlRmFjdG9yeTogKHZhbHVlKSA9PiB7IHJldHVybiBcIlZhbHVlOiBcIiArIHZhbHVlOyB9LFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgZGVwczogW051bWJlcl0gfSlcbiAgICogXSk7XG4gICAqXG4gICAqIGV4cGVjdChpbmplY3Rvci5nZXQoTnVtYmVyKSkudG9FcXVhbCgzKTtcbiAgICogZXhwZWN0KGluamVjdG9yLmdldChTdHJpbmcpKS50b0VxdWFsKCdWYWx1ZTogMycpO1xuICAgKiBgYGBcbiAgICpcbiAgICogVXNlZCBpbiBjb25qdWN0aW9uIHdpdGggZGVwZW5kZW5jaWVzLlxuICAgKi9cbiAgdXNlRmFjdG9yeTogRnVuY3Rpb247XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhIHNldCBvZiBkZXBlbmRlbmNpZXNcbiAgICogKGFzIGB0b2tlbmBzKSB3aGljaCBzaG91bGQgYmUgaW5qZWN0ZWQgaW50byB0aGUgZmFjdG9yeSBmdW5jdGlvbi5cbiAgICpcbiAgICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L1Njb3h5MHBKTnFLR0FQWlkxVlZDP3A9cHJldmlldykpXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogdmFyIGluamVjdG9yID0gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbXG4gICAqICAgbmV3IFByb3ZpZGVyKE51bWJlciwgeyB1c2VGYWN0b3J5OiAoKSA9PiB7IHJldHVybiAxKzI7IH19KSxcbiAgICogICBuZXcgUHJvdmlkZXIoU3RyaW5nLCB7IHVzZUZhY3Rvcnk6ICh2YWx1ZSkgPT4geyByZXR1cm4gXCJWYWx1ZTogXCIgKyB2YWx1ZTsgfSxcbiAgICogICAgICAgICAgICAgICAgICAgICAgIGRlcHM6IFtOdW1iZXJdIH0pXG4gICAqIF0pO1xuICAgKlxuICAgKiBleHBlY3QoaW5qZWN0b3IuZ2V0KE51bWJlcikpLnRvRXF1YWwoMyk7XG4gICAqIGV4cGVjdChpbmplY3Rvci5nZXQoU3RyaW5nKSkudG9FcXVhbCgnVmFsdWU6IDMnKTtcbiAgICogYGBgXG4gICAqXG4gICAqIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBgdXNlRmFjdG9yeWAuXG4gICAqL1xuICBkZXBlbmRlbmNpZXM6IE9iamVjdFtdO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX211bHRpOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKHRva2VuLCB7dXNlQ2xhc3MsIHVzZVZhbHVlLCB1c2VFeGlzdGluZywgdXNlRmFjdG9yeSwgZGVwcywgbXVsdGl9OiB7XG4gICAgdXNlQ2xhc3M/OiBUeXBlLFxuICAgIHVzZVZhbHVlPzogYW55LFxuICAgIHVzZUV4aXN0aW5nPzogYW55LFxuICAgIHVzZUZhY3Rvcnk/OiBGdW5jdGlvbixcbiAgICBkZXBzPzogT2JqZWN0W10sXG4gICAgbXVsdGk/OiBib29sZWFuXG4gIH0pIHtcbiAgICB0aGlzLnRva2VuID0gdG9rZW47XG4gICAgdGhpcy51c2VDbGFzcyA9IHVzZUNsYXNzO1xuICAgIHRoaXMudXNlVmFsdWUgPSB1c2VWYWx1ZTtcbiAgICB0aGlzLnVzZUV4aXN0aW5nID0gdXNlRXhpc3Rpbmc7XG4gICAgdGhpcy51c2VGYWN0b3J5ID0gdXNlRmFjdG9yeTtcbiAgICB0aGlzLmRlcGVuZGVuY2llcyA9IGRlcHM7XG4gICAgdGhpcy5fbXVsdGkgPSBtdWx0aTtcbiAgfVxuXG4gIC8vIFRPRE86IFByb3ZpZGUgYSBmdWxsIHdvcmtpbmcgZXhhbXBsZSBhZnRlciBhbHBoYTM4IGlzIHJlbGVhc2VkLlxuICAvKipcbiAgICogQ3JlYXRlcyBtdWx0aXBsZSBwcm92aWRlcnMgbWF0Y2hpbmcgdGhlIHNhbWUgdG9rZW4gKGEgbXVsdGktcHJvdmlkZXIpLlxuICAgKlxuICAgKiBNdWx0aS1wcm92aWRlcnMgYXJlIHVzZWQgZm9yIGNyZWF0aW5nIHBsdWdnYWJsZSBzZXJ2aWNlLCB3aGVyZSB0aGUgc3lzdGVtIGNvbWVzXG4gICAqIHdpdGggc29tZSBkZWZhdWx0IHByb3ZpZGVycywgYW5kIHRoZSB1c2VyIGNhbiByZWdpc3RlciBhZGRpdG9uYWwgcHJvdmlkZXJzLlxuICAgKiBUaGUgY29tYmluYXRpb24gb2YgdGhlIGRlZmF1bHQgcHJvdmlkZXJzIGFuZCB0aGUgYWRkaXRpb25hbCBwcm92aWRlcnMgd2lsbCBiZVxuICAgKiB1c2VkIHRvIGRyaXZlIHRoZSBiZWhhdmlvciBvZiB0aGUgc3lzdGVtLlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZVxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHZhciBpbmplY3RvciA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW1xuICAgKiAgIG5ldyBQcm92aWRlcihcIlN0cmluZ3NcIiwgeyB1c2VWYWx1ZTogXCJTdHJpbmcxXCIsIG11bHRpOiB0cnVlfSksXG4gICAqICAgbmV3IFByb3ZpZGVyKFwiU3RyaW5nc1wiLCB7IHVzZVZhbHVlOiBcIlN0cmluZzJcIiwgbXVsdGk6IHRydWV9KVxuICAgKiBdKTtcbiAgICpcbiAgICogZXhwZWN0KGluamVjdG9yLmdldChcIlN0cmluZ3NcIikpLnRvRXF1YWwoW1wiU3RyaW5nMVwiLCBcIlN0cmluZzJcIl0pO1xuICAgKiBgYGBcbiAgICpcbiAgICogTXVsdGktcHJvdmlkZXJzIGFuZCByZWd1bGFyIHByb3ZpZGVycyBjYW5ub3QgYmUgbWl4ZWQuIFRoZSBmb2xsb3dpbmdcbiAgICogd2lsbCB0aHJvdyBhbiBleGNlcHRpb246XG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogdmFyIGluamVjdG9yID0gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbXG4gICAqICAgbmV3IFByb3ZpZGVyKFwiU3RyaW5nc1wiLCB7IHVzZVZhbHVlOiBcIlN0cmluZzFcIiwgbXVsdGk6IHRydWUgfSksXG4gICAqICAgbmV3IFByb3ZpZGVyKFwiU3RyaW5nc1wiLCB7IHVzZVZhbHVlOiBcIlN0cmluZzJcIn0pXG4gICAqIF0pO1xuICAgKiBgYGBcbiAgICovXG4gIGdldCBtdWx0aSgpOiBib29sZWFuIHsgcmV0dXJuIG5vcm1hbGl6ZUJvb2wodGhpcy5fbXVsdGkpOyB9XG59XG5cbi8qKlxuICogU2VlIHtAbGluayBQcm92aWRlcn0gaW5zdGVhZC5cbiAqXG4gKiBAZGVwcmVjYXRlZFxuICovXG5AQ09OU1QoKVxuZXhwb3J0IGNsYXNzIEJpbmRpbmcgZXh0ZW5kcyBQcm92aWRlciB7XG4gIGNvbnN0cnVjdG9yKHRva2VuLCB7dG9DbGFzcywgdG9WYWx1ZSwgdG9BbGlhcywgdG9GYWN0b3J5LCBkZXBzLCBtdWx0aX06IHtcbiAgICB0b0NsYXNzPzogVHlwZSxcbiAgICB0b1ZhbHVlPzogYW55LFxuICAgIHRvQWxpYXM/OiBhbnksXG4gICAgdG9GYWN0b3J5OiBGdW5jdGlvbiwgZGVwcz86IE9iamVjdFtdLCBtdWx0aT86IGJvb2xlYW5cbiAgfSkge1xuICAgIHN1cGVyKHRva2VuLCB7XG4gICAgICB1c2VDbGFzczogdG9DbGFzcyxcbiAgICAgIHVzZVZhbHVlOiB0b1ZhbHVlLFxuICAgICAgdXNlRXhpc3Rpbmc6IHRvQWxpYXMsXG4gICAgICB1c2VGYWN0b3J5OiB0b0ZhY3RvcnksXG4gICAgICBkZXBzOiBkZXBzLFxuICAgICAgbXVsdGk6IG11bHRpXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGdldCB0b0NsYXNzKCkgeyByZXR1cm4gdGhpcy51c2VDbGFzczsgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgZ2V0IHRvQWxpYXMoKSB7IHJldHVybiB0aGlzLnVzZUV4aXN0aW5nOyB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBnZXQgdG9GYWN0b3J5KCkgeyByZXR1cm4gdGhpcy51c2VGYWN0b3J5OyB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBnZXQgdG9WYWx1ZSgpIHsgcmV0dXJuIHRoaXMudXNlVmFsdWU7IH1cbn1cblxuLyoqXG4gKiBBbiBpbnRlcm5hbCByZXNvbHZlZCByZXByZXNlbnRhdGlvbiBvZiBhIHtAbGluayBQcm92aWRlcn0gdXNlZCBieSB0aGUge0BsaW5rIEluamVjdG9yfS5cbiAqXG4gKiBJdCBpcyB1c3VhbGx5IGNyZWF0ZWQgYXV0b21hdGljYWxseSBieSBgSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZWAuXG4gKlxuICogSXQgY2FuIGJlIGNyZWF0ZWQgbWFudWFsbHksIGFzIGZvbGxvd3M6XG4gKlxuICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L1JmRW5oaDhrVUVJMEczcXNuSWVUP3AlM0RwcmV2aWV3JnA9cHJldmlldykpXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogdmFyIHJlc29sdmVkUHJvdmlkZXJzID0gSW5qZWN0b3IucmVzb2x2ZShbbmV3IFByb3ZpZGVyKCdtZXNzYWdlJywge3VzZVZhbHVlOiAnSGVsbG8nfSldKTtcbiAqIHZhciBpbmplY3RvciA9IEluamVjdG9yLmZyb21SZXNvbHZlZFByb3ZpZGVycyhyZXNvbHZlZFByb3ZpZGVycyk7XG4gKlxuICogZXhwZWN0KGluamVjdG9yLmdldCgnbWVzc2FnZScpKS50b0VxdWFsKCdIZWxsbycpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRQcm92aWRlciB7XG4gIC8qKlxuICAgKiBBIGtleSwgdXN1YWxseSBhIGBUeXBlYC5cbiAgICovXG4gIGtleTogS2V5O1xuXG4gIC8qKlxuICAgKiBGYWN0b3J5IGZ1bmN0aW9uIHdoaWNoIGNhbiByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgYW4gb2JqZWN0IHJlcHJlc2VudGVkIGJ5IGEga2V5LlxuICAgKi9cbiAgcmVzb2x2ZWRGYWN0b3JpZXM6IFJlc29sdmVkRmFjdG9yeVtdO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIHByb3ZpZGVyIGlzIGEgbXVsdGktcHJvdmlkZXIgb3IgYSByZWd1bGFyIHByb3ZpZGVyLlxuICAgKi9cbiAgbXVsdGlQcm92aWRlcjogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBTZWUge0BsaW5rIFJlc29sdmVkUHJvdmlkZXJ9IGluc3RlYWQuXG4gKlxuICogQGRlcHJlY2F0ZWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZEJpbmRpbmcgZXh0ZW5kcyBSZXNvbHZlZFByb3ZpZGVyIHt9XG5cbmV4cG9ydCBjbGFzcyBSZXNvbHZlZFByb3ZpZGVyXyBpbXBsZW1lbnRzIFJlc29sdmVkQmluZGluZyB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBrZXk6IEtleSwgcHVibGljIHJlc29sdmVkRmFjdG9yaWVzOiBSZXNvbHZlZEZhY3RvcnlbXSxcbiAgICAgICAgICAgICAgcHVibGljIG11bHRpUHJvdmlkZXI6IGJvb2xlYW4pIHt9XG5cbiAgZ2V0IHJlc29sdmVkRmFjdG9yeSgpOiBSZXNvbHZlZEZhY3RvcnkgeyByZXR1cm4gdGhpcy5yZXNvbHZlZEZhY3Rvcmllc1swXTsgfVxufVxuXG4vKipcbiAqIEFuIGludGVybmFsIHJlc29sdmVkIHJlcHJlc2VudGF0aW9uIG9mIGEgZmFjdG9yeSBmdW5jdGlvbiBjcmVhdGVkIGJ5IHJlc29sdmluZyB7QGxpbmsgUHJvdmlkZXJ9LlxuICovXG5leHBvcnQgY2xhc3MgUmVzb2x2ZWRGYWN0b3J5IHtcbiAgY29uc3RydWN0b3IoXG4gICAgICAvKipcbiAgICAgICAqIEZhY3RvcnkgZnVuY3Rpb24gd2hpY2ggY2FuIHJldHVybiBhbiBpbnN0YW5jZSBvZiBhbiBvYmplY3QgcmVwcmVzZW50ZWQgYnkgYSBrZXkuXG4gICAgICAgKi9cbiAgICAgIHB1YmxpYyBmYWN0b3J5OiBGdW5jdGlvbixcblxuICAgICAgLyoqXG4gICAgICAgKiBBcmd1bWVudHMgKGRlcGVuZGVuY2llcykgdG8gdGhlIGBmYWN0b3J5YCBmdW5jdGlvbi5cbiAgICAgICAqL1xuICAgICAgcHVibGljIGRlcGVuZGVuY2llczogRGVwZW5kZW5jeVtdKSB7fVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB7QGxpbmsgUHJvdmlkZXJ9LlxuICpcbiAqIFRvIGNvbnN0cnVjdCBhIHtAbGluayBQcm92aWRlcn0sIGJpbmQgYSBgdG9rZW5gIHRvIGVpdGhlciBhIGNsYXNzLCBhIHZhbHVlLCBhIGZhY3RvcnkgZnVuY3Rpb24sXG4gKiBvclxuICogdG8gYW4gZXhpc3RpbmcgYHRva2VuYC5cbiAqIFNlZSB7QGxpbmsgUHJvdmlkZXJCdWlsZGVyfSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFRoZSBgdG9rZW5gIGlzIG1vc3QgY29tbW9ubHkgYSBjbGFzcyBvciB7QGxpbmsgYW5ndWxhcjIvZGkvT3BhcXVlVG9rZW59LlxuICpcbiAqIEBkZXByZWNhdGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiaW5kKHRva2VuKTogUHJvdmlkZXJCdWlsZGVyIHtcbiAgcmV0dXJuIG5ldyBQcm92aWRlckJ1aWxkZXIodG9rZW4pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB7QGxpbmsgUHJvdmlkZXJ9LlxuICpcbiAqIFNlZSB7QGxpbmsgUHJvdmlkZXJ9IGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogPCEtLSBUT0RPOiBpbXByb3ZlIHRoZSBkb2NzIC0tPlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZSh0b2tlbiwge3VzZUNsYXNzLCB1c2VWYWx1ZSwgdXNlRXhpc3RpbmcsIHVzZUZhY3RvcnksIGRlcHMsIG11bHRpfToge1xuICB1c2VDbGFzcz86IFR5cGUsXG4gIHVzZVZhbHVlPzogYW55LFxuICB1c2VFeGlzdGluZz86IGFueSxcbiAgdXNlRmFjdG9yeT86IEZ1bmN0aW9uLFxuICBkZXBzPzogT2JqZWN0W10sXG4gIG11bHRpPzogYm9vbGVhblxufSk6IFByb3ZpZGVyIHtcbiAgcmV0dXJuIG5ldyBQcm92aWRlcih0b2tlbiwge1xuICAgIHVzZUNsYXNzOiB1c2VDbGFzcyxcbiAgICB1c2VWYWx1ZTogdXNlVmFsdWUsXG4gICAgdXNlRXhpc3Rpbmc6IHVzZUV4aXN0aW5nLFxuICAgIHVzZUZhY3Rvcnk6IHVzZUZhY3RvcnksXG4gICAgZGVwczogZGVwcyxcbiAgICBtdWx0aTogbXVsdGlcbiAgfSk7XG59XG5cbi8qKlxuICogSGVscGVyIGNsYXNzIGZvciB0aGUge0BsaW5rIGJpbmR9IGZ1bmN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUHJvdmlkZXJCdWlsZGVyIHtcbiAgY29uc3RydWN0b3IocHVibGljIHRva2VuKSB7fVxuXG4gIC8qKlxuICAgKiBCaW5kcyBhIERJIHRva2VuIHRvIGEgY2xhc3MuXG4gICAqXG4gICAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9acEJDU1lxdjZlMnVkNUtYTGR4UT9wPXByZXZpZXcpKVxuICAgKlxuICAgKiBCZWNhdXNlIGB0b0FsaWFzYCBhbmQgYHRvQ2xhc3NgIGFyZSBvZnRlbiBjb25mdXNlZCwgdGhlIGV4YW1wbGUgY29udGFpbnNcbiAgICogYm90aCB1c2UgY2FzZXMgZm9yIGVhc3kgY29tcGFyaXNvbi5cbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjbGFzcyBWZWhpY2xlIHt9XG4gICAqXG4gICAqIGNsYXNzIENhciBleHRlbmRzIFZlaGljbGUge31cbiAgICpcbiAgICogdmFyIGluamVjdG9yQ2xhc3MgPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtcbiAgICogICBDYXIsXG4gICAqICAgcHJvdmlkZShWZWhpY2xlLCB7dXNlQ2xhc3M6IENhcn0pXG4gICAqIF0pO1xuICAgKiB2YXIgaW5qZWN0b3JBbGlhcyA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW1xuICAgKiAgIENhcixcbiAgICogICBwcm92aWRlKFZlaGljbGUsIHt1c2VFeGlzdGluZzogQ2FyfSlcbiAgICogXSk7XG4gICAqXG4gICAqIGV4cGVjdChpbmplY3RvckNsYXNzLmdldChWZWhpY2xlKSkubm90LnRvQmUoaW5qZWN0b3JDbGFzcy5nZXQoQ2FyKSk7XG4gICAqIGV4cGVjdChpbmplY3RvckNsYXNzLmdldChWZWhpY2xlKSBpbnN0YW5jZW9mIENhcikudG9CZSh0cnVlKTtcbiAgICpcbiAgICogZXhwZWN0KGluamVjdG9yQWxpYXMuZ2V0KFZlaGljbGUpKS50b0JlKGluamVjdG9yQWxpYXMuZ2V0KENhcikpO1xuICAgKiBleHBlY3QoaW5qZWN0b3JBbGlhcy5nZXQoVmVoaWNsZSkgaW5zdGFuY2VvZiBDYXIpLnRvQmUodHJ1ZSk7XG4gICAqIGBgYFxuICAgKi9cbiAgdG9DbGFzcyh0eXBlOiBUeXBlKTogUHJvdmlkZXIge1xuICAgIGlmICghaXNUeXBlKHR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihcbiAgICAgICAgICBgVHJ5aW5nIHRvIGNyZWF0ZSBhIGNsYXNzIHByb3ZpZGVyIGJ1dCBcIiR7c3RyaW5naWZ5KHR5cGUpfVwiIGlzIG5vdCBhIGNsYXNzIWApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFByb3ZpZGVyKHRoaXMudG9rZW4sIHt1c2VDbGFzczogdHlwZX0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEJpbmRzIGEgREkgdG9rZW4gdG8gYSB2YWx1ZS5cbiAgICpcbiAgICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L0cwMjRQRkhtREwwY0pGZ2ZaSzhPP3A9cHJldmlldykpXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogdmFyIGluamVjdG9yID0gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbXG4gICAqICAgcHJvdmlkZSgnbWVzc2FnZScsIHt1c2VWYWx1ZTogJ0hlbGxvJ30pXG4gICAqIF0pO1xuICAgKlxuICAgKiBleHBlY3QoaW5qZWN0b3IuZ2V0KCdtZXNzYWdlJykpLnRvRXF1YWwoJ0hlbGxvJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgdG9WYWx1ZSh2YWx1ZTogYW55KTogUHJvdmlkZXIgeyByZXR1cm4gbmV3IFByb3ZpZGVyKHRoaXMudG9rZW4sIHt1c2VWYWx1ZTogdmFsdWV9KTsgfVxuXG4gIC8qKlxuICAgKiBCaW5kcyBhIERJIHRva2VuIHRvIGFuIGV4aXN0aW5nIHRva2VuLlxuICAgKlxuICAgKiBBbmd1bGFyIHdpbGwgcmV0dXJuIHRoZSBzYW1lIGluc3RhbmNlIGFzIGlmIHRoZSBwcm92aWRlZCB0b2tlbiB3YXMgdXNlZC4gKFRoaXMgaXNcbiAgICogaW4gY29udHJhc3QgdG8gYHVzZUNsYXNzYCB3aGVyZSBhIHNlcGFyYXRlIGluc3RhbmNlIG9mIGB1c2VDbGFzc2Agd2lsbCBiZSByZXR1cm5lZC4pXG4gICAqXG4gICAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC91QmFvRjJwTjVjZmM1QWZaYXBOdz9wPXByZXZpZXcpKVxuICAgKlxuICAgKiBCZWNhdXNlIGB0b0FsaWFzYCBhbmQgYHRvQ2xhc3NgIGFyZSBvZnRlbiBjb25mdXNlZCwgdGhlIGV4YW1wbGUgY29udGFpbnNcbiAgICogYm90aCB1c2UgY2FzZXMgZm9yIGVhc3kgY29tcGFyaXNvbi5cbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjbGFzcyBWZWhpY2xlIHt9XG4gICAqXG4gICAqIGNsYXNzIENhciBleHRlbmRzIFZlaGljbGUge31cbiAgICpcbiAgICogdmFyIGluamVjdG9yQWxpYXMgPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtcbiAgICogICBDYXIsXG4gICAqICAgcHJvdmlkZShWZWhpY2xlLCB7dXNlRXhpc3Rpbmc6IENhcn0pXG4gICAqIF0pO1xuICAgKiB2YXIgaW5qZWN0b3JDbGFzcyA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW1xuICAgKiAgIENhcixcbiAgICogICBwcm92aWRlKFZlaGljbGUsIHt1c2VDbGFzczogQ2FyfSlcbiAgICogXSk7XG4gICAqXG4gICAqIGV4cGVjdChpbmplY3RvckFsaWFzLmdldChWZWhpY2xlKSkudG9CZShpbmplY3RvckFsaWFzLmdldChDYXIpKTtcbiAgICogZXhwZWN0KGluamVjdG9yQWxpYXMuZ2V0KFZlaGljbGUpIGluc3RhbmNlb2YgQ2FyKS50b0JlKHRydWUpO1xuICAgKlxuICAgKiBleHBlY3QoaW5qZWN0b3JDbGFzcy5nZXQoVmVoaWNsZSkpLm5vdC50b0JlKGluamVjdG9yQ2xhc3MuZ2V0KENhcikpO1xuICAgKiBleHBlY3QoaW5qZWN0b3JDbGFzcy5nZXQoVmVoaWNsZSkgaW5zdGFuY2VvZiBDYXIpLnRvQmUodHJ1ZSk7XG4gICAqIGBgYFxuICAgKi9cbiAgdG9BbGlhcyhhbGlhc1Rva2VuOiAvKlR5cGUqLyBhbnkpOiBQcm92aWRlciB7XG4gICAgaWYgKGlzQmxhbmsoYWxpYXNUb2tlbikpIHtcbiAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBDYW4gbm90IGFsaWFzICR7c3RyaW5naWZ5KHRoaXMudG9rZW4pfSB0byBhIGJsYW5rIHZhbHVlIWApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFByb3ZpZGVyKHRoaXMudG9rZW4sIHt1c2VFeGlzdGluZzogYWxpYXNUb2tlbn0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEJpbmRzIGEgREkgdG9rZW4gdG8gYSBmdW5jdGlvbiB3aGljaCBjb21wdXRlcyB0aGUgdmFsdWUuXG4gICAqXG4gICAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9PZWpOSWZUVDN6YjFpQnhhSVlPYj9wPXByZXZpZXcpKVxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHZhciBpbmplY3RvciA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW1xuICAgKiAgIHByb3ZpZGUoTnVtYmVyLCB7dXNlRmFjdG9yeTogKCkgPT4geyByZXR1cm4gMSsyOyB9fSksXG4gICAqICAgcHJvdmlkZShTdHJpbmcsIHt1c2VGYWN0b3J5OiAodikgPT4geyByZXR1cm4gXCJWYWx1ZTogXCIgKyB2OyB9LCBkZXBzOiBbTnVtYmVyXX0pXG4gICAqIF0pO1xuICAgKlxuICAgKiBleHBlY3QoaW5qZWN0b3IuZ2V0KE51bWJlcikpLnRvRXF1YWwoMyk7XG4gICAqIGV4cGVjdChpbmplY3Rvci5nZXQoU3RyaW5nKSkudG9FcXVhbCgnVmFsdWU6IDMnKTtcbiAgICogYGBgXG4gICAqL1xuICB0b0ZhY3RvcnkoZmFjdG9yeTogRnVuY3Rpb24sIGRlcGVuZGVuY2llcz86IGFueVtdKTogUHJvdmlkZXIge1xuICAgIGlmICghaXNGdW5jdGlvbihmYWN0b3J5KSkge1xuICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oXG4gICAgICAgICAgYFRyeWluZyB0byBjcmVhdGUgYSBmYWN0b3J5IHByb3ZpZGVyIGJ1dCBcIiR7c3RyaW5naWZ5KGZhY3RvcnkpfVwiIGlzIG5vdCBhIGZ1bmN0aW9uIWApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFByb3ZpZGVyKHRoaXMudG9rZW4sIHt1c2VGYWN0b3J5OiBmYWN0b3J5LCBkZXBzOiBkZXBlbmRlbmNpZXN9KTtcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmUgYSBzaW5nbGUgcHJvdmlkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRmFjdG9yeShwcm92aWRlcjogUHJvdmlkZXIpOiBSZXNvbHZlZEZhY3Rvcnkge1xuICB2YXIgZmFjdG9yeUZuOiBGdW5jdGlvbjtcbiAgdmFyIHJlc29sdmVkRGVwcztcbiAgaWYgKGlzUHJlc2VudChwcm92aWRlci51c2VDbGFzcykpIHtcbiAgICB2YXIgdXNlQ2xhc3MgPSByZXNvbHZlRm9yd2FyZFJlZihwcm92aWRlci51c2VDbGFzcyk7XG4gICAgZmFjdG9yeUZuID0gcmVmbGVjdG9yLmZhY3RvcnkodXNlQ2xhc3MpO1xuICAgIHJlc29sdmVkRGVwcyA9IF9kZXBlbmRlbmNpZXNGb3IodXNlQ2xhc3MpO1xuICB9IGVsc2UgaWYgKGlzUHJlc2VudChwcm92aWRlci51c2VFeGlzdGluZykpIHtcbiAgICBmYWN0b3J5Rm4gPSAoYWxpYXNJbnN0YW5jZSkgPT4gYWxpYXNJbnN0YW5jZTtcbiAgICByZXNvbHZlZERlcHMgPSBbRGVwZW5kZW5jeS5mcm9tS2V5KEtleS5nZXQocHJvdmlkZXIudXNlRXhpc3RpbmcpKV07XG4gIH0gZWxzZSBpZiAoaXNQcmVzZW50KHByb3ZpZGVyLnVzZUZhY3RvcnkpKSB7XG4gICAgZmFjdG9yeUZuID0gcHJvdmlkZXIudXNlRmFjdG9yeTtcbiAgICByZXNvbHZlZERlcHMgPSBfY29uc3RydWN0RGVwZW5kZW5jaWVzKHByb3ZpZGVyLnVzZUZhY3RvcnksIHByb3ZpZGVyLmRlcGVuZGVuY2llcyk7XG4gIH0gZWxzZSB7XG4gICAgZmFjdG9yeUZuID0gKCkgPT4gcHJvdmlkZXIudXNlVmFsdWU7XG4gICAgcmVzb2x2ZWREZXBzID0gX0VNUFRZX0xJU1Q7XG4gIH1cbiAgcmV0dXJuIG5ldyBSZXNvbHZlZEZhY3RvcnkoZmFjdG9yeUZuLCByZXNvbHZlZERlcHMpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIHRoZSB7QGxpbmsgUHJvdmlkZXJ9IGludG8ge0BsaW5rIFJlc29sdmVkUHJvdmlkZXJ9LlxuICpcbiAqIHtAbGluayBJbmplY3Rvcn0gaW50ZXJuYWxseSBvbmx5IHVzZXMge0BsaW5rIFJlc29sdmVkUHJvdmlkZXJ9LCB7QGxpbmsgUHJvdmlkZXJ9IGNvbnRhaW5zXG4gKiBjb252ZW5pZW5jZSBwcm92aWRlciBzeW50YXguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUHJvdmlkZXIocHJvdmlkZXI6IFByb3ZpZGVyKTogUmVzb2x2ZWRQcm92aWRlciB7XG4gIHJldHVybiBuZXcgUmVzb2x2ZWRQcm92aWRlcl8oS2V5LmdldChwcm92aWRlci50b2tlbiksIFtyZXNvbHZlRmFjdG9yeShwcm92aWRlcildLCBmYWxzZSk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGxpc3Qgb2YgUHJvdmlkZXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVByb3ZpZGVycyhwcm92aWRlcnM6IEFycmF5PFR5cGUgfCBQcm92aWRlciB8IGFueVtdPik6IFJlc29sdmVkUHJvdmlkZXJbXSB7XG4gIHZhciBub3JtYWxpemVkID0gX2NyZWF0ZUxpc3RPZlByb3ZpZGVycyhfbm9ybWFsaXplUHJvdmlkZXJzKFxuICAgICAgcHJvdmlkZXJzLCBuZXcgTWFwPG51bWJlciwgX05vcm1hbGl6ZWRQcm92aWRlciB8IF9Ob3JtYWxpemVkUHJvdmlkZXJbXT4oKSkpO1xuICByZXR1cm4gbm9ybWFsaXplZC5tYXAoYiA9PiB7XG4gICAgaWYgKGIgaW5zdGFuY2VvZiBfTm9ybWFsaXplZFByb3ZpZGVyKSB7XG4gICAgICByZXR1cm4gbmV3IFJlc29sdmVkUHJvdmlkZXJfKGIua2V5LCBbYi5yZXNvbHZlZEZhY3RvcnldLCBmYWxzZSk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGFyciA9IDxfTm9ybWFsaXplZFByb3ZpZGVyW10+YjtcbiAgICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQcm92aWRlcl8oYXJyWzBdLmtleSwgYXJyLm1hcChfID0+IF8ucmVzb2x2ZWRGYWN0b3J5KSwgdHJ1ZSk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBUaGUgYWxnb3JpdGhtIHdvcmtzIGFzIGZvbGxvd3M6XG4gKlxuICogW1Byb3ZpZGVyXSAtPiBbX05vcm1hbGl6ZWRQcm92aWRlcnxbX05vcm1hbGl6ZWRQcm92aWRlcl1dIC0+IFtSZXNvbHZlZFByb3ZpZGVyXVxuICpcbiAqIF9Ob3JtYWxpemVkUHJvdmlkZXIgaXMgZXNzZW50aWFsbHkgYSByZXNvbHZlZCBwcm92aWRlciBiZWZvcmUgaXQgd2FzIGdyb3VwZWQgYnkga2V5LlxuICovXG5jbGFzcyBfTm9ybWFsaXplZFByb3ZpZGVyIHtcbiAgY29uc3RydWN0b3IocHVibGljIGtleTogS2V5LCBwdWJsaWMgcmVzb2x2ZWRGYWN0b3J5OiBSZXNvbHZlZEZhY3RvcnkpIHt9XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVMaXN0T2ZQcm92aWRlcnMoZmxhdHRlbmVkUHJvdmlkZXJzOiBNYXA8bnVtYmVyLCBhbnk+KTogYW55W10ge1xuICByZXR1cm4gTWFwV3JhcHBlci52YWx1ZXMoZmxhdHRlbmVkUHJvdmlkZXJzKTtcbn1cblxuZnVuY3Rpb24gX25vcm1hbGl6ZVByb3ZpZGVycyhwcm92aWRlcnM6IEFycmF5PFR5cGUgfCBQcm92aWRlciB8IFByb3ZpZGVyQnVpbGRlciB8IGFueVtdPixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzOiBNYXA8bnVtYmVyLCBfTm9ybWFsaXplZFByb3ZpZGVyIHwgX05vcm1hbGl6ZWRQcm92aWRlcltdPik6XG4gICAgTWFwPG51bWJlciwgX05vcm1hbGl6ZWRQcm92aWRlciB8IF9Ob3JtYWxpemVkUHJvdmlkZXJbXT4ge1xuICBwcm92aWRlcnMuZm9yRWFjaChiID0+IHtcbiAgICBpZiAoYiBpbnN0YW5jZW9mIFR5cGUpIHtcbiAgICAgIF9ub3JtYWxpemVQcm92aWRlcihwcm92aWRlKGIsIHt1c2VDbGFzczogYn0pLCByZXMpO1xuXG4gICAgfSBlbHNlIGlmIChiIGluc3RhbmNlb2YgUHJvdmlkZXIpIHtcbiAgICAgIF9ub3JtYWxpemVQcm92aWRlcihiLCByZXMpO1xuXG4gICAgfSBlbHNlIGlmIChiIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIF9ub3JtYWxpemVQcm92aWRlcnMoYiwgcmVzKTtcblxuICAgIH0gZWxzZSBpZiAoYiBpbnN0YW5jZW9mIFByb3ZpZGVyQnVpbGRlcikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRQcm92aWRlckVycm9yKGIudG9rZW4pO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdmlkZXJFcnJvcihiKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIF9ub3JtYWxpemVQcm92aWRlcihiOiBQcm92aWRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXM6IE1hcDxudW1iZXIsIF9Ob3JtYWxpemVkUHJvdmlkZXIgfCBfTm9ybWFsaXplZFByb3ZpZGVyW10+KTogdm9pZCB7XG4gIHZhciBrZXkgPSBLZXkuZ2V0KGIudG9rZW4pO1xuICB2YXIgZmFjdG9yeSA9IHJlc29sdmVGYWN0b3J5KGIpO1xuICB2YXIgbm9ybWFsaXplZCA9IG5ldyBfTm9ybWFsaXplZFByb3ZpZGVyKGtleSwgZmFjdG9yeSk7XG5cbiAgaWYgKGIubXVsdGkpIHtcbiAgICB2YXIgZXhpc3RpbmdQcm92aWRlciA9IHJlcy5nZXQoa2V5LmlkKTtcblxuICAgIGlmIChleGlzdGluZ1Byb3ZpZGVyIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIGV4aXN0aW5nUHJvdmlkZXIucHVzaChub3JtYWxpemVkKTtcblxuICAgIH0gZWxzZSBpZiAoaXNCbGFuayhleGlzdGluZ1Byb3ZpZGVyKSkge1xuICAgICAgcmVzLnNldChrZXkuaWQsIFtub3JtYWxpemVkXSk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IE1peGluZ011bHRpUHJvdmlkZXJzV2l0aFJlZ3VsYXJQcm92aWRlcnNFcnJvcihleGlzdGluZ1Byb3ZpZGVyLCBiKTtcbiAgICB9XG5cbiAgfSBlbHNlIHtcbiAgICB2YXIgZXhpc3RpbmdQcm92aWRlciA9IHJlcy5nZXQoa2V5LmlkKTtcblxuICAgIGlmIChleGlzdGluZ1Byb3ZpZGVyIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIHRocm93IG5ldyBNaXhpbmdNdWx0aVByb3ZpZGVyc1dpdGhSZWd1bGFyUHJvdmlkZXJzRXJyb3IoZXhpc3RpbmdQcm92aWRlciwgYik7XG4gICAgfVxuXG4gICAgcmVzLnNldChrZXkuaWQsIG5vcm1hbGl6ZWQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jb25zdHJ1Y3REZXBlbmRlbmNpZXMoZmFjdG9yeUZ1bmN0aW9uOiBGdW5jdGlvbiwgZGVwZW5kZW5jaWVzOiBhbnlbXSk6IERlcGVuZGVuY3lbXSB7XG4gIGlmIChpc0JsYW5rKGRlcGVuZGVuY2llcykpIHtcbiAgICByZXR1cm4gX2RlcGVuZGVuY2llc0ZvcihmYWN0b3J5RnVuY3Rpb24pO1xuICB9IGVsc2Uge1xuICAgIHZhciBwYXJhbXM6IGFueVtdW10gPSBkZXBlbmRlbmNpZXMubWFwKHQgPT4gW3RdKTtcbiAgICByZXR1cm4gZGVwZW5kZW5jaWVzLm1hcCh0ID0+IF9leHRyYWN0VG9rZW4oZmFjdG9yeUZ1bmN0aW9uLCB0LCBwYXJhbXMpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfZGVwZW5kZW5jaWVzRm9yKHR5cGVPckZ1bmMpOiBEZXBlbmRlbmN5W10ge1xuICB2YXIgcGFyYW1zID0gcmVmbGVjdG9yLnBhcmFtZXRlcnModHlwZU9yRnVuYyk7XG4gIGlmIChpc0JsYW5rKHBhcmFtcykpIHJldHVybiBbXTtcbiAgaWYgKHBhcmFtcy5zb21lKGlzQmxhbmspKSB7XG4gICAgdGhyb3cgbmV3IE5vQW5ub3RhdGlvbkVycm9yKHR5cGVPckZ1bmMsIHBhcmFtcyk7XG4gIH1cbiAgcmV0dXJuIHBhcmFtcy5tYXAoKHA6IGFueVtdKSA9PiBfZXh0cmFjdFRva2VuKHR5cGVPckZ1bmMsIHAsIHBhcmFtcykpO1xufVxuXG5mdW5jdGlvbiBfZXh0cmFjdFRva2VuKHR5cGVPckZ1bmMsIG1ldGFkYXRhIC8qYW55W10gfCBhbnkqLywgcGFyYW1zOiBhbnlbXVtdKTogRGVwZW5kZW5jeSB7XG4gIHZhciBkZXBQcm9wcyA9IFtdO1xuICB2YXIgdG9rZW4gPSBudWxsO1xuICB2YXIgb3B0aW9uYWwgPSBmYWxzZTtcblxuICBpZiAoIWlzQXJyYXkobWV0YWRhdGEpKSB7XG4gICAgaWYgKG1ldGFkYXRhIGluc3RhbmNlb2YgSW5qZWN0TWV0YWRhdGEpIHtcbiAgICAgIHJldHVybiBfY3JlYXRlRGVwZW5kZW5jeShtZXRhZGF0YS50b2tlbiwgb3B0aW9uYWwsIG51bGwsIG51bGwsIGRlcFByb3BzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIF9jcmVhdGVEZXBlbmRlbmN5KG1ldGFkYXRhLCBvcHRpb25hbCwgbnVsbCwgbnVsbCwgZGVwUHJvcHMpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBsb3dlckJvdW5kVmlzaWJpbGl0eSA9IG51bGw7XG4gIHZhciB1cHBlckJvdW5kVmlzaWJpbGl0eSA9IG51bGw7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtZXRhZGF0YS5sZW5ndGg7ICsraSkge1xuICAgIHZhciBwYXJhbU1ldGFkYXRhID0gbWV0YWRhdGFbaV07XG5cbiAgICBpZiAocGFyYW1NZXRhZGF0YSBpbnN0YW5jZW9mIFR5cGUpIHtcbiAgICAgIHRva2VuID0gcGFyYW1NZXRhZGF0YTtcblxuICAgIH0gZWxzZSBpZiAocGFyYW1NZXRhZGF0YSBpbnN0YW5jZW9mIEluamVjdE1ldGFkYXRhKSB7XG4gICAgICB0b2tlbiA9IHBhcmFtTWV0YWRhdGEudG9rZW47XG5cbiAgICB9IGVsc2UgaWYgKHBhcmFtTWV0YWRhdGEgaW5zdGFuY2VvZiBPcHRpb25hbE1ldGFkYXRhKSB7XG4gICAgICBvcHRpb25hbCA9IHRydWU7XG5cbiAgICB9IGVsc2UgaWYgKHBhcmFtTWV0YWRhdGEgaW5zdGFuY2VvZiBTZWxmTWV0YWRhdGEpIHtcbiAgICAgIHVwcGVyQm91bmRWaXNpYmlsaXR5ID0gcGFyYW1NZXRhZGF0YTtcblxuICAgIH0gZWxzZSBpZiAocGFyYW1NZXRhZGF0YSBpbnN0YW5jZW9mIEhvc3RNZXRhZGF0YSkge1xuICAgICAgdXBwZXJCb3VuZFZpc2liaWxpdHkgPSBwYXJhbU1ldGFkYXRhO1xuXG4gICAgfSBlbHNlIGlmIChwYXJhbU1ldGFkYXRhIGluc3RhbmNlb2YgU2tpcFNlbGZNZXRhZGF0YSkge1xuICAgICAgbG93ZXJCb3VuZFZpc2liaWxpdHkgPSBwYXJhbU1ldGFkYXRhO1xuXG4gICAgfSBlbHNlIGlmIChwYXJhbU1ldGFkYXRhIGluc3RhbmNlb2YgRGVwZW5kZW5jeU1ldGFkYXRhKSB7XG4gICAgICBpZiAoaXNQcmVzZW50KHBhcmFtTWV0YWRhdGEudG9rZW4pKSB7XG4gICAgICAgIHRva2VuID0gcGFyYW1NZXRhZGF0YS50b2tlbjtcbiAgICAgIH1cbiAgICAgIGRlcFByb3BzLnB1c2gocGFyYW1NZXRhZGF0YSk7XG4gICAgfVxuICB9XG5cbiAgdG9rZW4gPSByZXNvbHZlRm9yd2FyZFJlZih0b2tlbik7XG5cbiAgaWYgKGlzUHJlc2VudCh0b2tlbikpIHtcbiAgICByZXR1cm4gX2NyZWF0ZURlcGVuZGVuY3kodG9rZW4sIG9wdGlvbmFsLCBsb3dlckJvdW5kVmlzaWJpbGl0eSwgdXBwZXJCb3VuZFZpc2liaWxpdHksIGRlcFByb3BzKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgTm9Bbm5vdGF0aW9uRXJyb3IodHlwZU9yRnVuYywgcGFyYW1zKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY3JlYXRlRGVwZW5kZW5jeSh0b2tlbiwgb3B0aW9uYWwsIGxvd2VyQm91bmRWaXNpYmlsaXR5LCB1cHBlckJvdW5kVmlzaWJpbGl0eSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcFByb3BzKTogRGVwZW5kZW5jeSB7XG4gIHJldHVybiBuZXcgRGVwZW5kZW5jeShLZXkuZ2V0KHRva2VuKSwgb3B0aW9uYWwsIGxvd2VyQm91bmRWaXNpYmlsaXR5LCB1cHBlckJvdW5kVmlzaWJpbGl0eSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcFByb3BzKTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2RpL3Byb3ZpZGVyLnRzXG4gKiovIiwiaW1wb3J0IHtFeGNlcHRpb25IYW5kbGVyfSBmcm9tICcuL2V4Y2VwdGlvbl9oYW5kbGVyJztcblxuZXhwb3J0IHtFeGNlcHRpb25IYW5kbGVyfSBmcm9tICcuL2V4Y2VwdGlvbl9oYW5kbGVyJztcblxuZXhwb3J0IGNsYXNzIEJhc2VFeGNlcHRpb24gZXh0ZW5kcyBFcnJvciB7XG4gIHB1YmxpYyBzdGFjazogYW55O1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbWVzc2FnZTogc3RyaW5nID0gXCItLVwiKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5zdGFjayA9ICg8YW55Pm5ldyBFcnJvcihtZXNzYWdlKSkuc3RhY2s7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5tZXNzYWdlOyB9XG59XG5cbi8qKlxuICogV3JhcHMgYW4gZXhjZXB0aW9uIGFuZCBwcm92aWRlcyBhZGRpdGlvbmFsIGNvbnRleHQgb3IgaW5mb3JtYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBXcmFwcGVkRXhjZXB0aW9uIGV4dGVuZHMgRXJyb3Ige1xuICBwcml2YXRlIF93cmFwcGVyU3RhY2s6IGFueTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF93cmFwcGVyTWVzc2FnZTogc3RyaW5nLCBwcml2YXRlIF9vcmlnaW5hbEV4Y2VwdGlvbiwgcHJpdmF0ZSBfb3JpZ2luYWxTdGFjaz8sXG4gICAgICAgICAgICAgIHByaXZhdGUgX2NvbnRleHQ/KSB7XG4gICAgc3VwZXIoX3dyYXBwZXJNZXNzYWdlKTtcbiAgICB0aGlzLl93cmFwcGVyU3RhY2sgPSAoPGFueT5uZXcgRXJyb3IoX3dyYXBwZXJNZXNzYWdlKSkuc3RhY2s7XG4gIH1cblxuICBnZXQgd3JhcHBlck1lc3NhZ2UoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX3dyYXBwZXJNZXNzYWdlOyB9XG5cbiAgZ2V0IHdyYXBwZXJTdGFjaygpOiBhbnkgeyByZXR1cm4gdGhpcy5fd3JhcHBlclN0YWNrOyB9XG5cblxuICBnZXQgb3JpZ2luYWxFeGNlcHRpb24oKTogYW55IHsgcmV0dXJuIHRoaXMuX29yaWdpbmFsRXhjZXB0aW9uOyB9XG5cbiAgZ2V0IG9yaWdpbmFsU3RhY2soKTogYW55IHsgcmV0dXJuIHRoaXMuX29yaWdpbmFsU3RhY2s7IH1cblxuXG4gIGdldCBjb250ZXh0KCk6IGFueSB7IHJldHVybiB0aGlzLl9jb250ZXh0OyB9XG5cbiAgZ2V0IG1lc3NhZ2UoKTogc3RyaW5nIHsgcmV0dXJuIEV4Y2VwdGlvbkhhbmRsZXIuZXhjZXB0aW9uVG9TdHJpbmcodGhpcyk7IH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5tZXNzYWdlOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlVHlwZUVycm9yKG1lc3NhZ2U/OiBzdHJpbmcpOiBFcnJvciB7XG4gIHJldHVybiBuZXcgVHlwZUVycm9yKG1lc3NhZ2UpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5pbXBsZW1lbnRlZCgpOiBhbnkge1xuICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbigndW5pbXBsZW1lbnRlZCcpO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zLnRzXG4gKiovIiwiaW1wb3J0IHtpc1ByZXNlbnQsIGlzQmxhbmssIHByaW50fSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9uLCBXcmFwcGVkRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtMaXN0V3JhcHBlciwgaXNMaXN0TGlrZUl0ZXJhYmxlfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuXG5jbGFzcyBfQXJyYXlMb2dnZXIge1xuICByZXM6IGFueVtdID0gW107XG4gIGxvZyhzOiBhbnkpOiB2b2lkIHsgdGhpcy5yZXMucHVzaChzKTsgfVxuICBsb2dFcnJvcihzOiBhbnkpOiB2b2lkIHsgdGhpcy5yZXMucHVzaChzKTsgfVxuICBsb2dHcm91cChzOiBhbnkpOiB2b2lkIHsgdGhpcy5yZXMucHVzaChzKTsgfVxuICBsb2dHcm91cEVuZCgpe307XG59XG5cbi8qKlxuICogUHJvdmlkZXMgYSBob29rIGZvciBjZW50cmFsaXplZCBleGNlcHRpb24gaGFuZGxpbmcuXG4gKlxuICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgYEV4Y2VwdGlvbkhhbmRsZXJgIHByaW50cyBlcnJvciBtZXNzYWdlcyB0byB0aGUgYENvbnNvbGVgLiBUb1xuICogaW50ZXJjZXB0IGVycm9yIGhhbmRsaW5nLFxuICogd3JpdGUgYSBjdXN0b20gZXhjZXB0aW9uIGhhbmRsZXIgdGhhdCByZXBsYWNlcyB0aGlzIGRlZmF1bHQgYXMgYXBwcm9wcmlhdGUgZm9yIHlvdXIgYXBwLlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICpcbiAqIGNsYXNzIE15RXhjZXB0aW9uSGFuZGxlciBpbXBsZW1lbnRzIEV4Y2VwdGlvbkhhbmRsZXIge1xuICogICBjYWxsKGVycm9yLCBzdGFja1RyYWNlID0gbnVsbCwgcmVhc29uID0gbnVsbCkge1xuICogICAgIC8vIGRvIHNvbWV0aGluZyB3aXRoIHRoZSBleGNlcHRpb25cbiAqICAgfVxuICogfVxuICpcbiAqIGJvb3RzdHJhcChNeUFwcCwgW3Byb3ZpZGUoRXhjZXB0aW9uSGFuZGxlciwge3VzZUNsYXNzOiBNeUV4Y2VwdGlvbkhhbmRsZXJ9KV0pXG4gKlxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBFeGNlcHRpb25IYW5kbGVyIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfbG9nZ2VyOiBhbnksIHByaXZhdGUgX3JldGhyb3dFeGNlcHRpb246IGJvb2xlYW4gPSB0cnVlKSB7fVxuXG4gIHN0YXRpYyBleGNlcHRpb25Ub1N0cmluZyhleGNlcHRpb246IGFueSwgc3RhY2tUcmFjZTogYW55ID0gbnVsbCwgcmVhc29uOiBzdHJpbmcgPSBudWxsKTogc3RyaW5nIHtcbiAgICB2YXIgbCA9IG5ldyBfQXJyYXlMb2dnZXIoKTtcbiAgICB2YXIgZSA9IG5ldyBFeGNlcHRpb25IYW5kbGVyKGwsIGZhbHNlKTtcbiAgICBlLmNhbGwoZXhjZXB0aW9uLCBzdGFja1RyYWNlLCByZWFzb24pO1xuICAgIHJldHVybiBsLnJlcy5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgY2FsbChleGNlcHRpb246IGFueSwgc3RhY2tUcmFjZTogYW55ID0gbnVsbCwgcmVhc29uOiBzdHJpbmcgPSBudWxsKTogdm9pZCB7XG4gICAgdmFyIG9yaWdpbmFsRXhjZXB0aW9uID0gdGhpcy5fZmluZE9yaWdpbmFsRXhjZXB0aW9uKGV4Y2VwdGlvbik7XG4gICAgdmFyIG9yaWdpbmFsU3RhY2sgPSB0aGlzLl9maW5kT3JpZ2luYWxTdGFjayhleGNlcHRpb24pO1xuICAgIHZhciBjb250ZXh0ID0gdGhpcy5fZmluZENvbnRleHQoZXhjZXB0aW9uKTtcblxuICAgIHRoaXMuX2xvZ2dlci5sb2dHcm91cChgRVhDRVBUSU9OOiAke3RoaXMuX2V4dHJhY3RNZXNzYWdlKGV4Y2VwdGlvbil9YCk7XG5cbiAgICBpZiAoaXNQcmVzZW50KHN0YWNrVHJhY2UpICYmIGlzQmxhbmsob3JpZ2luYWxTdGFjaykpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5sb2dFcnJvcihcIlNUQUNLVFJBQ0U6XCIpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmxvZ0Vycm9yKHRoaXMuX2xvbmdTdGFja1RyYWNlKHN0YWNrVHJhY2UpKTtcbiAgICB9XG5cbiAgICBpZiAoaXNQcmVzZW50KHJlYXNvbikpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5sb2dFcnJvcihgUkVBU09OOiAke3JlYXNvbn1gKTtcbiAgICB9XG5cbiAgICBpZiAoaXNQcmVzZW50KG9yaWdpbmFsRXhjZXB0aW9uKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmxvZ0Vycm9yKGBPUklHSU5BTCBFWENFUFRJT046ICR7dGhpcy5fZXh0cmFjdE1lc3NhZ2Uob3JpZ2luYWxFeGNlcHRpb24pfWApO1xuICAgIH1cblxuICAgIGlmIChpc1ByZXNlbnQob3JpZ2luYWxTdGFjaykpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5sb2dFcnJvcihcIk9SSUdJTkFMIFNUQUNLVFJBQ0U6XCIpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmxvZ0Vycm9yKHRoaXMuX2xvbmdTdGFja1RyYWNlKG9yaWdpbmFsU3RhY2spKTtcbiAgICB9XG5cbiAgICBpZiAoaXNQcmVzZW50KGNvbnRleHQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIubG9nRXJyb3IoXCJFUlJPUiBDT05URVhUOlwiKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5sb2dFcnJvcihjb250ZXh0KTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIubG9nR3JvdXBFbmQoKTtcblxuICAgIC8vIFdlIHJldGhyb3cgZXhjZXB0aW9ucywgc28gb3BlcmF0aW9ucyBsaWtlICdib290c3RyYXAnIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yXG4gICAgLy8gd2hlbiBhbiBleGNlcHRpb24gaGFwcGVucy4gSWYgd2UgZG8gbm90IHJldGhyb3csIGJvb3RzdHJhcCB3aWxsIGFsd2F5cyBzdWNjZWVkLlxuICAgIGlmICh0aGlzLl9yZXRocm93RXhjZXB0aW9uKSB0aHJvdyBleGNlcHRpb247XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9leHRyYWN0TWVzc2FnZShleGNlcHRpb246IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGV4Y2VwdGlvbiBpbnN0YW5jZW9mIFdyYXBwZWRFeGNlcHRpb24gPyBleGNlcHRpb24ud3JhcHBlck1lc3NhZ2UgOiBleGNlcHRpb24udG9TdHJpbmcoKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2xvbmdTdGFja1RyYWNlKHN0YWNrVHJhY2U6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIGlzTGlzdExpa2VJdGVyYWJsZShzdGFja1RyYWNlKSA/ICg8YW55W10+c3RhY2tUcmFjZSkuam9pbihcIlxcblxcbi0tLS0tYXN5bmMgZ2FwLS0tLS1cXG5cIikgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja1RyYWNlLnRvU3RyaW5nKCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9maW5kQ29udGV4dChleGNlcHRpb246IGFueSk6IGFueSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIFdyYXBwZWRFeGNlcHRpb24pKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiBpc1ByZXNlbnQoZXhjZXB0aW9uLmNvbnRleHQpID8gZXhjZXB0aW9uLmNvbnRleHQgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9maW5kQ29udGV4dChleGNlcHRpb24ub3JpZ2luYWxFeGNlcHRpb24pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGV4Y2VwdGlvbi5jb250ZXh0IGNhbiB0aHJvdyBhbiBleGNlcHRpb24uIGlmIGl0IGhhcHBlbnMsIHdlIGlnbm9yZSB0aGUgY29udGV4dC5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2ZpbmRPcmlnaW5hbEV4Y2VwdGlvbihleGNlcHRpb246IGFueSk6IGFueSB7XG4gICAgaWYgKCEoZXhjZXB0aW9uIGluc3RhbmNlb2YgV3JhcHBlZEV4Y2VwdGlvbikpIHJldHVybiBudWxsO1xuXG4gICAgdmFyIGUgPSBleGNlcHRpb24ub3JpZ2luYWxFeGNlcHRpb247XG4gICAgd2hpbGUgKGUgaW5zdGFuY2VvZiBXcmFwcGVkRXhjZXB0aW9uICYmIGlzUHJlc2VudChlLm9yaWdpbmFsRXhjZXB0aW9uKSkge1xuICAgICAgZSA9IGUub3JpZ2luYWxFeGNlcHRpb247XG4gICAgfVxuXG4gICAgcmV0dXJuIGU7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9maW5kT3JpZ2luYWxTdGFjayhleGNlcHRpb246IGFueSk6IGFueSB7XG4gICAgaWYgKCEoZXhjZXB0aW9uIGluc3RhbmNlb2YgV3JhcHBlZEV4Y2VwdGlvbikpIHJldHVybiBudWxsO1xuXG4gICAgdmFyIGUgPSBleGNlcHRpb247XG4gICAgdmFyIHN0YWNrID0gZXhjZXB0aW9uLm9yaWdpbmFsU3RhY2s7XG4gICAgd2hpbGUgKGUgaW5zdGFuY2VvZiBXcmFwcGVkRXhjZXB0aW9uICYmIGlzUHJlc2VudChlLm9yaWdpbmFsRXhjZXB0aW9uKSkge1xuICAgICAgZSA9IGUub3JpZ2luYWxFeGNlcHRpb247XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIFdyYXBwZWRFeGNlcHRpb24gJiYgaXNQcmVzZW50KGUub3JpZ2luYWxFeGNlcHRpb24pKSB7XG4gICAgICAgIHN0YWNrID0gZS5vcmlnaW5hbFN0YWNrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzdGFjaztcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25faGFuZGxlci50c1xuICoqLyIsImltcG9ydCB7VHlwZSwgaXNQcmVzZW50fSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtMaXN0V3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcbmltcG9ydCB7UmVmbGVjdG9yfSBmcm9tICcuL3JlZmxlY3Rvcic7XG5leHBvcnQge1JlZmxlY3RvciwgUmVmbGVjdGlvbkluZm99IGZyb20gJy4vcmVmbGVjdG9yJztcbmltcG9ydCB7UmVmbGVjdGlvbkNhcGFiaWxpdGllc30gZnJvbSAnLi9yZWZsZWN0aW9uX2NhcGFiaWxpdGllcyc7XG5cbi8qKlxuICogVGhlIHtAbGluayBSZWZsZWN0b3J9IHVzZWQgaW50ZXJuYWxseSBpbiBBbmd1bGFyIHRvIGFjY2VzcyBtZXRhZGF0YVxuICogYWJvdXQgc3ltYm9scy5cbiAqL1xuZXhwb3J0IHZhciByZWZsZWN0b3IgPSBuZXcgUmVmbGVjdG9yKG5ldyBSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzKCkpO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvcmVmbGVjdGlvbi9yZWZsZWN0aW9uLnRzXG4gKiovIiwiaW1wb3J0IHtUeXBlLCBpc1ByZXNlbnQsIHN0cmluZ2lmeX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbiwgV3JhcHBlZEV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7XG4gIExpc3RXcmFwcGVyLFxuICBNYXAsXG4gIE1hcFdyYXBwZXIsXG4gIFNldCxcbiAgU2V0V3JhcHBlcixcbiAgU3RyaW5nTWFwV3JhcHBlclxufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtTZXR0ZXJGbiwgR2V0dGVyRm4sIE1ldGhvZEZufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7UGxhdGZvcm1SZWZsZWN0aW9uQ2FwYWJpbGl0aWVzfSBmcm9tICcuL3BsYXRmb3JtX3JlZmxlY3Rpb25fY2FwYWJpbGl0aWVzJztcbmV4cG9ydCB7U2V0dGVyRm4sIEdldHRlckZuLCBNZXRob2RGbn0gZnJvbSAnLi90eXBlcyc7XG5leHBvcnQge1BsYXRmb3JtUmVmbGVjdGlvbkNhcGFiaWxpdGllc30gZnJvbSAnLi9wbGF0Zm9ybV9yZWZsZWN0aW9uX2NhcGFiaWxpdGllcyc7XG5cbi8qKlxuICogUmVmbGVjdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCBhIHN5bWJvbCwgaW5jbHVkaW5nIGFubm90YXRpb25zLCBpbnRlcmZhY2VzLCBhbmQgb3RoZXIgbWV0YWRhdGEuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWZsZWN0aW9uSW5mbyB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBhbm5vdGF0aW9ucz86IGFueVtdLCBwdWJsaWMgcGFyYW1ldGVycz86IGFueVtdW10sIHB1YmxpYyBmYWN0b3J5PzogRnVuY3Rpb24sXG4gICAgICAgICAgICAgIHB1YmxpYyBpbnRlcmZhY2VzPzogYW55W10sIHB1YmxpYyBwcm9wTWV0YWRhdGE/OiB7W2tleTogc3RyaW5nXTogYW55W119KSB7fVxufVxuXG4vKipcbiAqIFByb3ZpZGVzIGFjY2VzcyB0byByZWZsZWN0aW9uIGRhdGEgYWJvdXQgc3ltYm9scy4gVXNlZCBpbnRlcm5hbGx5IGJ5IEFuZ3VsYXJcbiAqIHRvIHBvd2VyIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGFuZCBjb21waWxhdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlZmxlY3RvciB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2luamVjdGFibGVJbmZvID0gbmV3IE1hcDxhbnksIFJlZmxlY3Rpb25JbmZvPigpO1xuICAvKiogQGludGVybmFsICovXG4gIF9nZXR0ZXJzID0gbmV3IE1hcDxzdHJpbmcsIEdldHRlckZuPigpO1xuICAvKiogQGludGVybmFsICovXG4gIF9zZXR0ZXJzID0gbmV3IE1hcDxzdHJpbmcsIFNldHRlckZuPigpO1xuICAvKiogQGludGVybmFsICovXG4gIF9tZXRob2RzID0gbmV3IE1hcDxzdHJpbmcsIE1ldGhvZEZuPigpO1xuICAvKiogQGludGVybmFsICovXG4gIF91c2VkS2V5czogU2V0PGFueT47XG4gIHJlZmxlY3Rpb25DYXBhYmlsaXRpZXM6IFBsYXRmb3JtUmVmbGVjdGlvbkNhcGFiaWxpdGllcztcblxuICBjb25zdHJ1Y3RvcihyZWZsZWN0aW9uQ2FwYWJpbGl0aWVzOiBQbGF0Zm9ybVJlZmxlY3Rpb25DYXBhYmlsaXRpZXMpIHtcbiAgICB0aGlzLl91c2VkS2V5cyA9IG51bGw7XG4gICAgdGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzID0gcmVmbGVjdGlvbkNhcGFiaWxpdGllcztcbiAgfVxuXG4gIGlzUmVmbGVjdGlvbkVuYWJsZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMuaXNSZWZsZWN0aW9uRW5hYmxlZCgpOyB9XG5cbiAgLyoqXG4gICAqIENhdXNlcyBgdGhpc2AgcmVmbGVjdG9yIHRvIHRyYWNrIGtleXMgdXNlZCB0byBhY2Nlc3NcbiAgICoge0BsaW5rIFJlZmxlY3Rpb25JbmZvfSBvYmplY3RzLlxuICAgKi9cbiAgdHJhY2tVc2FnZSgpOiB2b2lkIHsgdGhpcy5fdXNlZEtleXMgPSBuZXcgU2V0KCk7IH1cblxuICAvKipcbiAgICogTGlzdHMgdHlwZXMgZm9yIHdoaWNoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24gd2FzIG5vdCByZXF1ZXN0ZWQgc2luY2VcbiAgICoge0BsaW5rICN0cmFja1VzYWdlfSB3YXMgY2FsbGVkLiBUaGlzIGxpc3QgY291bGQgbGF0ZXIgYmUgYXVkaXRlZCBhc1xuICAgKiBwb3RlbnRpYWwgZGVhZCBjb2RlLlxuICAgKi9cbiAgbGlzdFVudXNlZEtleXMoKTogYW55W10ge1xuICAgIGlmICh0aGlzLl91c2VkS2V5cyA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignVXNhZ2UgdHJhY2tpbmcgaXMgZGlzYWJsZWQnKTtcbiAgICB9XG4gICAgdmFyIGFsbFR5cGVzID0gTWFwV3JhcHBlci5rZXlzKHRoaXMuX2luamVjdGFibGVJbmZvKTtcbiAgICByZXR1cm4gYWxsVHlwZXMuZmlsdGVyKGtleSA9PiAhU2V0V3JhcHBlci5oYXModGhpcy5fdXNlZEtleXMsIGtleSkpO1xuICB9XG5cbiAgcmVnaXN0ZXJGdW5jdGlvbihmdW5jOiBGdW5jdGlvbiwgZnVuY0luZm86IFJlZmxlY3Rpb25JbmZvKTogdm9pZCB7XG4gICAgdGhpcy5faW5qZWN0YWJsZUluZm8uc2V0KGZ1bmMsIGZ1bmNJbmZvKTtcbiAgfVxuXG4gIHJlZ2lzdGVyVHlwZSh0eXBlOiBUeXBlLCB0eXBlSW5mbzogUmVmbGVjdGlvbkluZm8pOiB2b2lkIHtcbiAgICB0aGlzLl9pbmplY3RhYmxlSW5mby5zZXQodHlwZSwgdHlwZUluZm8pO1xuICB9XG5cbiAgcmVnaXN0ZXJHZXR0ZXJzKGdldHRlcnM6IHtba2V5OiBzdHJpbmddOiBHZXR0ZXJGbn0pOiB2b2lkIHsgX21lcmdlTWFwcyh0aGlzLl9nZXR0ZXJzLCBnZXR0ZXJzKTsgfVxuXG4gIHJlZ2lzdGVyU2V0dGVycyhzZXR0ZXJzOiB7W2tleTogc3RyaW5nXTogU2V0dGVyRm59KTogdm9pZCB7IF9tZXJnZU1hcHModGhpcy5fc2V0dGVycywgc2V0dGVycyk7IH1cblxuICByZWdpc3Rlck1ldGhvZHMobWV0aG9kczoge1trZXk6IHN0cmluZ106IE1ldGhvZEZufSk6IHZvaWQgeyBfbWVyZ2VNYXBzKHRoaXMuX21ldGhvZHMsIG1ldGhvZHMpOyB9XG5cbiAgZmFjdG9yeSh0eXBlOiBUeXBlKTogRnVuY3Rpb24ge1xuICAgIGlmICh0aGlzLl9jb250YWluc1JlZmxlY3Rpb25JbmZvKHR5cGUpKSB7XG4gICAgICB2YXIgcmVzID0gdGhpcy5fZ2V0UmVmbGVjdGlvbkluZm8odHlwZSkuZmFjdG9yeTtcbiAgICAgIHJldHVybiBpc1ByZXNlbnQocmVzKSA/IHJlcyA6IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMuZmFjdG9yeSh0eXBlKTtcbiAgICB9XG4gIH1cblxuICBwYXJhbWV0ZXJzKHR5cGVPckZ1bmM6IC8qVHlwZSovIGFueSk6IGFueVtdIHtcbiAgICBpZiAodGhpcy5faW5qZWN0YWJsZUluZm8uaGFzKHR5cGVPckZ1bmMpKSB7XG4gICAgICB2YXIgcmVzID0gdGhpcy5fZ2V0UmVmbGVjdGlvbkluZm8odHlwZU9yRnVuYykucGFyYW1ldGVycztcbiAgICAgIHJldHVybiBpc1ByZXNlbnQocmVzKSA/IHJlcyA6IFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLnBhcmFtZXRlcnModHlwZU9yRnVuYyk7XG4gICAgfVxuICB9XG5cbiAgYW5ub3RhdGlvbnModHlwZU9yRnVuYzogLypUeXBlKi8gYW55KTogYW55W10ge1xuICAgIGlmICh0aGlzLl9pbmplY3RhYmxlSW5mby5oYXModHlwZU9yRnVuYykpIHtcbiAgICAgIHZhciByZXMgPSB0aGlzLl9nZXRSZWZsZWN0aW9uSW5mbyh0eXBlT3JGdW5jKS5hbm5vdGF0aW9ucztcbiAgICAgIHJldHVybiBpc1ByZXNlbnQocmVzKSA/IHJlcyA6IFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLmFubm90YXRpb25zKHR5cGVPckZ1bmMpO1xuICAgIH1cbiAgfVxuXG4gIHByb3BNZXRhZGF0YSh0eXBlT3JGdW5jOiAvKlR5cGUqLyBhbnkpOiB7W2tleTogc3RyaW5nXTogYW55W119IHtcbiAgICBpZiAodGhpcy5faW5qZWN0YWJsZUluZm8uaGFzKHR5cGVPckZ1bmMpKSB7XG4gICAgICB2YXIgcmVzID0gdGhpcy5fZ2V0UmVmbGVjdGlvbkluZm8odHlwZU9yRnVuYykucHJvcE1ldGFkYXRhO1xuICAgICAgcmV0dXJuIGlzUHJlc2VudChyZXMpID8gcmVzIDoge307XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMucHJvcE1ldGFkYXRhKHR5cGVPckZ1bmMpO1xuICAgIH1cbiAgfVxuXG4gIGludGVyZmFjZXModHlwZTogVHlwZSk6IGFueVtdIHtcbiAgICBpZiAodGhpcy5faW5qZWN0YWJsZUluZm8uaGFzKHR5cGUpKSB7XG4gICAgICB2YXIgcmVzID0gdGhpcy5fZ2V0UmVmbGVjdGlvbkluZm8odHlwZSkuaW50ZXJmYWNlcztcbiAgICAgIHJldHVybiBpc1ByZXNlbnQocmVzKSA/IHJlcyA6IFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLmludGVyZmFjZXModHlwZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0dGVyKG5hbWU6IHN0cmluZyk6IEdldHRlckZuIHtcbiAgICBpZiAodGhpcy5fZ2V0dGVycy5oYXMobmFtZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZXR0ZXJzLmdldChuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcy5nZXR0ZXIobmFtZSk7XG4gICAgfVxuICB9XG5cbiAgc2V0dGVyKG5hbWU6IHN0cmluZyk6IFNldHRlckZuIHtcbiAgICBpZiAodGhpcy5fc2V0dGVycy5oYXMobmFtZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zZXR0ZXJzLmdldChuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcy5zZXR0ZXIobmFtZSk7XG4gICAgfVxuICB9XG5cbiAgbWV0aG9kKG5hbWU6IHN0cmluZyk6IE1ldGhvZEZuIHtcbiAgICBpZiAodGhpcy5fbWV0aG9kcy5oYXMobmFtZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9tZXRob2RzLmdldChuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcy5tZXRob2QobmFtZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZ2V0UmVmbGVjdGlvbkluZm8odHlwZU9yRnVuYykge1xuICAgIGlmIChpc1ByZXNlbnQodGhpcy5fdXNlZEtleXMpKSB7XG4gICAgICB0aGlzLl91c2VkS2V5cy5hZGQodHlwZU9yRnVuYyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9pbmplY3RhYmxlSW5mby5nZXQodHlwZU9yRnVuYyk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9jb250YWluc1JlZmxlY3Rpb25JbmZvKHR5cGVPckZ1bmMpIHsgcmV0dXJuIHRoaXMuX2luamVjdGFibGVJbmZvLmhhcyh0eXBlT3JGdW5jKTsgfVxuXG4gIGltcG9ydFVyaSh0eXBlOiBUeXBlKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcy5pbXBvcnRVcmkodHlwZSk7IH1cbn1cblxuZnVuY3Rpb24gX21lcmdlTWFwcyh0YXJnZXQ6IE1hcDxhbnksIGFueT4sIGNvbmZpZzoge1trZXk6IHN0cmluZ106IEZ1bmN0aW9ufSk6IHZvaWQge1xuICBTdHJpbmdNYXBXcmFwcGVyLmZvckVhY2goY29uZmlnLCAodiwgaykgPT4gdGFyZ2V0LnNldChrLCB2KSk7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9yZWZsZWN0aW9uL3JlZmxlY3Rvci50c1xuICoqLyIsImltcG9ydCB7XG4gIFR5cGUsXG4gIGlzUHJlc2VudCxcbiAgaXNGdW5jdGlvbixcbiAgZ2xvYmFsLFxuICBzdHJpbmdpZnksXG4gIENvbmNyZXRlVHlwZVxufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtHZXR0ZXJGbiwgU2V0dGVyRm4sIE1ldGhvZEZufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7UGxhdGZvcm1SZWZsZWN0aW9uQ2FwYWJpbGl0aWVzfSBmcm9tICcuL3BsYXRmb3JtX3JlZmxlY3Rpb25fY2FwYWJpbGl0aWVzJztcblxuZXhwb3J0IGNsYXNzIFJlZmxlY3Rpb25DYXBhYmlsaXRpZXMgaW1wbGVtZW50cyBQbGF0Zm9ybVJlZmxlY3Rpb25DYXBhYmlsaXRpZXMge1xuICBwcml2YXRlIF9yZWZsZWN0OiBhbnk7XG5cbiAgY29uc3RydWN0b3IocmVmbGVjdD86IGFueSkgeyB0aGlzLl9yZWZsZWN0ID0gaXNQcmVzZW50KHJlZmxlY3QpID8gcmVmbGVjdCA6IGdsb2JhbC5SZWZsZWN0OyB9XG5cbiAgaXNSZWZsZWN0aW9uRW5hYmxlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRydWU7IH1cblxuICBmYWN0b3J5KHQ6IENvbmNyZXRlVHlwZSk6IEZ1bmN0aW9uIHtcbiAgICBzd2l0Y2ggKHQubGVuZ3RoKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHJldHVybiAoKSA9PiBuZXcgdCgpO1xuICAgICAgY2FzZSAxOlxuICAgICAgICByZXR1cm4gKGExKSA9PiBuZXcgdChhMSk7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHJldHVybiAoYTEsIGEyKSA9PiBuZXcgdChhMSwgYTIpO1xuICAgICAgY2FzZSAzOlxuICAgICAgICByZXR1cm4gKGExLCBhMiwgYTMpID0+IG5ldyB0KGExLCBhMiwgYTMpO1xuICAgICAgY2FzZSA0OlxuICAgICAgICByZXR1cm4gKGExLCBhMiwgYTMsIGE0KSA9PiBuZXcgdChhMSwgYTIsIGEzLCBhNCk7XG4gICAgICBjYXNlIDU6XG4gICAgICAgIHJldHVybiAoYTEsIGEyLCBhMywgYTQsIGE1KSA9PiBuZXcgdChhMSwgYTIsIGEzLCBhNCwgYTUpO1xuICAgICAgY2FzZSA2OlxuICAgICAgICByZXR1cm4gKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpID0+IG5ldyB0KGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpO1xuICAgICAgY2FzZSA3OlxuICAgICAgICByZXR1cm4gKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KSA9PiBuZXcgdChhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNyk7XG4gICAgICBjYXNlIDg6XG4gICAgICAgIHJldHVybiAoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KSA9PiBuZXcgdChhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpO1xuICAgICAgY2FzZSA5OlxuICAgICAgICByZXR1cm4gKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpID0+IG5ldyB0KGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpO1xuICAgICAgY2FzZSAxMDpcbiAgICAgICAgcmV0dXJuIChhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTApID0+XG4gICAgICAgICAgICAgICAgICAgbmV3IHQoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwKTtcbiAgICAgIGNhc2UgMTE6XG4gICAgICAgIHJldHVybiAoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEpID0+XG4gICAgICAgICAgICAgICAgICAgbmV3IHQoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEpO1xuICAgICAgY2FzZSAxMjpcbiAgICAgICAgcmV0dXJuIChhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyKSA9PlxuICAgICAgICAgICAgICAgICAgIG5ldyB0KGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIpO1xuICAgICAgY2FzZSAxMzpcbiAgICAgICAgcmV0dXJuIChhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMpID0+XG4gICAgICAgICAgICAgICAgICAgbmV3IHQoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMiwgYTEzKTtcbiAgICAgIGNhc2UgMTQ6XG4gICAgICAgIHJldHVybiAoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMiwgYTEzLCBhMTQpID0+XG4gICAgICAgICAgICAgICAgICAgbmV3IHQoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMiwgYTEzLCBhMTQpO1xuICAgICAgY2FzZSAxNTpcbiAgICAgICAgcmV0dXJuIChhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1KSA9PlxuICAgICAgICAgICAgICAgICAgIG5ldyB0KGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0LCBhMTUpO1xuICAgICAgY2FzZSAxNjpcbiAgICAgICAgcmV0dXJuIChhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1LCBhMTYpID0+XG4gICAgICAgICAgICAgICAgICAgbmV3IHQoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMiwgYTEzLCBhMTQsIGExNSwgYTE2KTtcbiAgICAgIGNhc2UgMTc6XG4gICAgICAgIHJldHVybiAoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMiwgYTEzLCBhMTQsIGExNSwgYTE2LCBhMTcpID0+XG4gICAgICAgICAgICAgICAgICAgbmV3IHQoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMiwgYTEzLCBhMTQsIGExNSwgYTE2LFxuICAgICAgICAgICAgICAgICAgICAgICAgIGExNyk7XG4gICAgICBjYXNlIDE4OlxuICAgICAgICByZXR1cm4gKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgpID0+XG4gICAgICAgICAgICAgICAgICAgbmV3IHQoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMiwgYTEzLCBhMTQsIGExNSwgYTE2LCBhMTcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgYTE4KTtcbiAgICAgIGNhc2UgMTk6XG4gICAgICAgIHJldHVybiAoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMiwgYTEzLCBhMTQsIGExNSwgYTE2LCBhMTcsIGExOCxcbiAgICAgICAgICAgICAgICBhMTkpID0+IG5ldyB0KGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGExNywgYTE4LCBhMTkpO1xuICAgICAgY2FzZSAyMDpcbiAgICAgICAgcmV0dXJuIChhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1LCBhMTYsIGExNywgYTE4LFxuICAgICAgICAgICAgICAgIGExOSwgYTIwKSA9PiBuZXcgdChhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhMTYsIGExNywgYTE4LCBhMTksIGEyMCk7XG4gICAgfTtcblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCBjcmVhdGUgYSBmYWN0b3J5IGZvciAnJHtzdHJpbmdpZnkodCl9JyBiZWNhdXNlIGl0cyBjb25zdHJ1Y3RvciBoYXMgbW9yZSB0aGFuIDIwIGFyZ3VtZW50c2ApO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfemlwVHlwZXNBbmRBbm5vdGFpb25zKHBhcmFtVHlwZXMsIHBhcmFtQW5ub3RhdGlvbnMpOiBhbnlbXVtdIHtcbiAgICB2YXIgcmVzdWx0O1xuXG4gICAgaWYgKHR5cGVvZiBwYXJhbVR5cGVzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmVzdWx0ID0gbmV3IEFycmF5KHBhcmFtQW5ub3RhdGlvbnMubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gbmV3IEFycmF5KHBhcmFtVHlwZXMubGVuZ3RoKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gVFMgb3V0cHV0cyBPYmplY3QgZm9yIHBhcmFtZXRlcnMgd2l0aG91dCB0eXBlcywgd2hpbGUgVHJhY2V1ciBvbWl0c1xuICAgICAgLy8gdGhlIGFubm90YXRpb25zLiBGb3Igbm93IHdlIHByZXNlcnZlIHRoZSBUcmFjZXVyIGJlaGF2aW9yIHRvIGFpZFxuICAgICAgLy8gbWlncmF0aW9uLCBidXQgdGhpcyBjYW4gYmUgcmV2aXNpdGVkLlxuICAgICAgaWYgKHR5cGVvZiBwYXJhbVR5cGVzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXN1bHRbaV0gPSBbXTtcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1UeXBlc1tpXSAhPSBPYmplY3QpIHtcbiAgICAgICAgcmVzdWx0W2ldID0gW3BhcmFtVHlwZXNbaV1dO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W2ldID0gW107XG4gICAgICB9XG4gICAgICBpZiAoaXNQcmVzZW50KHBhcmFtQW5ub3RhdGlvbnMpICYmIGlzUHJlc2VudChwYXJhbUFubm90YXRpb25zW2ldKSkge1xuICAgICAgICByZXN1bHRbaV0gPSByZXN1bHRbaV0uY29uY2F0KHBhcmFtQW5ub3RhdGlvbnNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcGFyYW1ldGVycyh0eXBlT3JGdW5jOiBUeXBlKTogYW55W11bXSB7XG4gICAgLy8gUHJlZmVyIHRoZSBkaXJlY3QgQVBJLlxuICAgIGlmIChpc1ByZXNlbnQoKDxhbnk+dHlwZU9yRnVuYykucGFyYW1ldGVycykpIHtcbiAgICAgIHJldHVybiAoPGFueT50eXBlT3JGdW5jKS5wYXJhbWV0ZXJzO1xuICAgIH1cbiAgICBpZiAoaXNQcmVzZW50KHRoaXMuX3JlZmxlY3QpICYmIGlzUHJlc2VudCh0aGlzLl9yZWZsZWN0LmdldE1ldGFkYXRhKSkge1xuICAgICAgdmFyIHBhcmFtQW5ub3RhdGlvbnMgPSB0aGlzLl9yZWZsZWN0LmdldE1ldGFkYXRhKCdwYXJhbWV0ZXJzJywgdHlwZU9yRnVuYyk7XG4gICAgICB2YXIgcGFyYW1UeXBlcyA9IHRoaXMuX3JlZmxlY3QuZ2V0TWV0YWRhdGEoJ2Rlc2lnbjpwYXJhbXR5cGVzJywgdHlwZU9yRnVuYyk7XG4gICAgICBpZiAoaXNQcmVzZW50KHBhcmFtVHlwZXMpIHx8IGlzUHJlc2VudChwYXJhbUFubm90YXRpb25zKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5femlwVHlwZXNBbmRBbm5vdGFpb25zKHBhcmFtVHlwZXMsIHBhcmFtQW5ub3RhdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBUaGUgYXJyYXkgaGFzIHRvIGJlIGZpbGxlZCB3aXRoIGB1bmRlZmluZWRgIGJlY2F1c2UgaG9sZXMgd291bGQgYmUgc2tpcHBlZCBieSBgc29tZWBcbiAgICBsZXQgcGFyYW1ldGVycyA9IG5ldyBBcnJheSgoPGFueT50eXBlT3JGdW5jLmxlbmd0aCkpO1xuICAgIHBhcmFtZXRlcnMuZmlsbCh1bmRlZmluZWQpO1xuICAgIHJldHVybiBwYXJhbWV0ZXJzO1xuICB9XG5cbiAgYW5ub3RhdGlvbnModHlwZU9yRnVuYzogVHlwZSk6IGFueVtdIHtcbiAgICAvLyBQcmVmZXIgdGhlIGRpcmVjdCBBUEkuXG4gICAgaWYgKGlzUHJlc2VudCgoPGFueT50eXBlT3JGdW5jKS5hbm5vdGF0aW9ucykpIHtcbiAgICAgIHZhciBhbm5vdGF0aW9ucyA9ICg8YW55PnR5cGVPckZ1bmMpLmFubm90YXRpb25zO1xuICAgICAgaWYgKGlzRnVuY3Rpb24oYW5ub3RhdGlvbnMpICYmIGFubm90YXRpb25zLmFubm90YXRpb25zKSB7XG4gICAgICAgIGFubm90YXRpb25zID0gYW5ub3RhdGlvbnMuYW5ub3RhdGlvbnM7XG4gICAgICB9XG4gICAgICByZXR1cm4gYW5ub3RhdGlvbnM7XG4gICAgfVxuICAgIGlmIChpc1ByZXNlbnQodGhpcy5fcmVmbGVjdCkgJiYgaXNQcmVzZW50KHRoaXMuX3JlZmxlY3QuZ2V0TWV0YWRhdGEpKSB7XG4gICAgICB2YXIgYW5ub3RhdGlvbnMgPSB0aGlzLl9yZWZsZWN0LmdldE1ldGFkYXRhKCdhbm5vdGF0aW9ucycsIHR5cGVPckZ1bmMpO1xuICAgICAgaWYgKGlzUHJlc2VudChhbm5vdGF0aW9ucykpIHJldHVybiBhbm5vdGF0aW9ucztcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcHJvcE1ldGFkYXRhKHR5cGVPckZ1bmM6IGFueSk6IHtba2V5OiBzdHJpbmddOiBhbnlbXX0ge1xuICAgIC8vIFByZWZlciB0aGUgZGlyZWN0IEFQSS5cbiAgICBpZiAoaXNQcmVzZW50KCg8YW55PnR5cGVPckZ1bmMpLnByb3BNZXRhZGF0YSkpIHtcbiAgICAgIHZhciBwcm9wTWV0YWRhdGEgPSAoPGFueT50eXBlT3JGdW5jKS5wcm9wTWV0YWRhdGE7XG4gICAgICBpZiAoaXNGdW5jdGlvbihwcm9wTWV0YWRhdGEpICYmIHByb3BNZXRhZGF0YS5wcm9wTWV0YWRhdGEpIHtcbiAgICAgICAgcHJvcE1ldGFkYXRhID0gcHJvcE1ldGFkYXRhLnByb3BNZXRhZGF0YTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9wTWV0YWRhdGE7XG4gICAgfVxuICAgIGlmIChpc1ByZXNlbnQodGhpcy5fcmVmbGVjdCkgJiYgaXNQcmVzZW50KHRoaXMuX3JlZmxlY3QuZ2V0TWV0YWRhdGEpKSB7XG4gICAgICB2YXIgcHJvcE1ldGFkYXRhID0gdGhpcy5fcmVmbGVjdC5nZXRNZXRhZGF0YSgncHJvcE1ldGFkYXRhJywgdHlwZU9yRnVuYyk7XG4gICAgICBpZiAoaXNQcmVzZW50KHByb3BNZXRhZGF0YSkpIHJldHVybiBwcm9wTWV0YWRhdGE7XG4gICAgfVxuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGludGVyZmFjZXModHlwZTogVHlwZSk6IGFueVtdIHtcbiAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihcIkphdmFTY3JpcHQgZG9lcyBub3Qgc3VwcG9ydCBpbnRlcmZhY2VzXCIpO1xuICB9XG5cbiAgZ2V0dGVyKG5hbWU6IHN0cmluZyk6IEdldHRlckZuIHsgcmV0dXJuIDxHZXR0ZXJGbj5uZXcgRnVuY3Rpb24oJ28nLCAncmV0dXJuIG8uJyArIG5hbWUgKyAnOycpOyB9XG5cbiAgc2V0dGVyKG5hbWU6IHN0cmluZyk6IFNldHRlckZuIHtcbiAgICByZXR1cm4gPFNldHRlckZuPm5ldyBGdW5jdGlvbignbycsICd2JywgJ3JldHVybiBvLicgKyBuYW1lICsgJyA9IHY7Jyk7XG4gIH1cblxuICBtZXRob2QobmFtZTogc3RyaW5nKTogTWV0aG9kRm4ge1xuICAgIGxldCBmdW5jdGlvbkJvZHkgPSBgaWYgKCFvLiR7bmFtZX0pIHRocm93IG5ldyBFcnJvcignXCIke25hbWV9XCIgaXMgdW5kZWZpbmVkJyk7XG4gICAgICAgIHJldHVybiBvLiR7bmFtZX0uYXBwbHkobywgYXJncyk7YDtcbiAgICByZXR1cm4gPE1ldGhvZEZuPm5ldyBGdW5jdGlvbignbycsICdhcmdzJywgZnVuY3Rpb25Cb2R5KTtcbiAgfVxuXG4gIC8vIFRoZXJlIGlzIG5vdCBhIGNvbmNlcHQgb2YgaW1wb3J0IHVyaSBpbiBKcywgYnV0IHRoaXMgaXMgdXNlZnVsIGluIGRldmVsb3BpbmcgRGFydCBhcHBsaWNhdGlvbnMuXG4gIGltcG9ydFVyaSh0eXBlOiBUeXBlKTogc3RyaW5nIHsgcmV0dXJuICcuLyc7IH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL3JlZmxlY3Rpb24vcmVmbGVjdGlvbl9jYXBhYmlsaXRpZXMudHNcbiAqKi8iLCJpbXBvcnQge3N0cmluZ2lmeSwgQ09OU1QsIFR5cGUsIGlzQmxhbmt9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge0Jhc2VFeGNlcHRpb24sIFdyYXBwZWRFeGNlcHRpb259IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9ucyc7XG5pbXBvcnQge1R5cGVMaXRlcmFsfSBmcm9tICcuL3R5cGVfbGl0ZXJhbCc7XG5pbXBvcnQge3Jlc29sdmVGb3J3YXJkUmVmfSBmcm9tICcuL2ZvcndhcmRfcmVmJztcblxuZXhwb3J0IHtUeXBlTGl0ZXJhbH0gZnJvbSAnLi90eXBlX2xpdGVyYWwnO1xuXG4vKipcbiAqIEEgdW5pcXVlIG9iamVjdCB1c2VkIGZvciByZXRyaWV2aW5nIGl0ZW1zIGZyb20gdGhlIHtAbGluayBJbmplY3Rvcn0uXG4gKlxuICogS2V5cyBoYXZlOlxuICogLSBhIHN5c3RlbS13aWRlIHVuaXF1ZSBgaWRgLlxuICogLSBhIGB0b2tlbmAuXG4gKlxuICogYEtleWAgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHtAbGluayBJbmplY3Rvcn0gYmVjYXVzZSBpdHMgc3lzdGVtLXdpZGUgdW5pcXVlIGBpZGAgYWxsb3dzIHRoZVxuICogaW5qZWN0b3IgdG8gc3RvcmUgY3JlYXRlZCBvYmplY3RzIGluIGEgbW9yZSBlZmZpY2llbnQgd2F5LlxuICpcbiAqIGBLZXlgIHNob3VsZCBub3QgYmUgY3JlYXRlZCBkaXJlY3RseS4ge0BsaW5rIEluamVjdG9yfSBjcmVhdGVzIGtleXMgYXV0b21hdGljYWxseSB3aGVuIHJlc29sdmluZ1xuICogcHJvdmlkZXJzLlxuICovXG5leHBvcnQgY2xhc3MgS2V5IHtcbiAgLyoqXG4gICAqIFByaXZhdGVcbiAgICovXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0b2tlbjogT2JqZWN0LCBwdWJsaWMgaWQ6IG51bWJlcikge1xuICAgIGlmIChpc0JsYW5rKHRva2VuKSkge1xuICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ1Rva2VuIG11c3QgYmUgZGVmaW5lZCEnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHN0cmluZ2lmaWVkIHRva2VuLlxuICAgKi9cbiAgZ2V0IGRpc3BsYXlOYW1lKCk6IHN0cmluZyB7IHJldHVybiBzdHJpbmdpZnkodGhpcy50b2tlbik7IH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIGEgYEtleWAgZm9yIGEgdG9rZW4uXG4gICAqL1xuICBzdGF0aWMgZ2V0KHRva2VuOiBPYmplY3QpOiBLZXkgeyByZXR1cm4gX2dsb2JhbEtleVJlZ2lzdHJ5LmdldChyZXNvbHZlRm9yd2FyZFJlZih0b2tlbikpOyB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHRoZSBudW1iZXIgb2Yga2V5cyByZWdpc3RlcmVkIGluIHRoZSBzeXN0ZW0uXG4gICAqL1xuICBzdGF0aWMgZ2V0IG51bWJlck9mS2V5cygpOiBudW1iZXIgeyByZXR1cm4gX2dsb2JhbEtleVJlZ2lzdHJ5Lm51bWJlck9mS2V5czsgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgS2V5UmVnaXN0cnkge1xuICBwcml2YXRlIF9hbGxLZXlzID0gbmV3IE1hcDxPYmplY3QsIEtleT4oKTtcblxuICBnZXQodG9rZW46IE9iamVjdCk6IEtleSB7XG4gICAgaWYgKHRva2VuIGluc3RhbmNlb2YgS2V5KSByZXR1cm4gdG9rZW47XG5cbiAgICAvLyBUT0RPOiB3b3JrYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzMxMjNcbiAgICB2YXIgdGhlVG9rZW4gPSB0b2tlbjtcbiAgICBpZiAodG9rZW4gaW5zdGFuY2VvZiBUeXBlTGl0ZXJhbCkge1xuICAgICAgdGhlVG9rZW4gPSB0b2tlbi50eXBlO1xuICAgIH1cbiAgICB0b2tlbiA9IHRoZVRva2VuO1xuXG4gICAgaWYgKHRoaXMuX2FsbEtleXMuaGFzKHRva2VuKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2FsbEtleXMuZ2V0KHRva2VuKTtcbiAgICB9XG5cbiAgICB2YXIgbmV3S2V5ID0gbmV3IEtleSh0b2tlbiwgS2V5Lm51bWJlck9mS2V5cyk7XG4gICAgdGhpcy5fYWxsS2V5cy5zZXQodG9rZW4sIG5ld0tleSk7XG4gICAgcmV0dXJuIG5ld0tleTtcbiAgfVxuXG4gIGdldCBudW1iZXJPZktleXMoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX2FsbEtleXMuc2l6ZTsgfVxufVxuXG52YXIgX2dsb2JhbEtleVJlZ2lzdHJ5ID0gbmV3IEtleVJlZ2lzdHJ5KCk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9kaS9rZXkudHNcbiAqKi8iLCIvKipcbiAqIFR5cGUgbGl0ZXJhbHMgaXMgYSBEYXJ0LW9ubHkgZmVhdHVyZS4gVGhpcyBpcyBoZXJlIG9ubHkgc28gd2UgY2FuIHgtY29tcGlsZVxuICogdG8gbXVsdGlwbGUgbGFuZ3VhZ2VzLlxuICovXG5leHBvcnQgY2xhc3MgVHlwZUxpdGVyYWwge1xuICBnZXQgdHlwZSgpOiBhbnkgeyB0aHJvdyBuZXcgRXJyb3IoXCJUeXBlIGxpdGVyYWxzIGFyZSBvbmx5IHN1cHBvcnRlZCBpbiBEYXJ0XCIpOyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9kaS90eXBlX2xpdGVyYWwudHNcbiAqKi8iLCJpbXBvcnQge0xpc3RXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtzdHJpbmdpZnksIGlzQmxhbmt9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge0Jhc2VFeGNlcHRpb24sIFdyYXBwZWRFeGNlcHRpb24sIHVuaW1wbGVtZW50ZWR9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9ucyc7XG5pbXBvcnQge0tleX0gZnJvbSAnLi9rZXknO1xuaW1wb3J0IHtJbmplY3Rvcn0gZnJvbSAnLi9pbmplY3Rvcic7XG5cbmZ1bmN0aW9uIGZpbmRGaXJzdENsb3NlZEN5Y2xlKGtleXM6IGFueVtdKTogYW55W10ge1xuICB2YXIgcmVzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgIGlmIChMaXN0V3JhcHBlci5jb250YWlucyhyZXMsIGtleXNbaV0pKSB7XG4gICAgICByZXMucHVzaChrZXlzW2ldKTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcy5wdXNoKGtleXNbaV0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RSZXNvbHZpbmdQYXRoKGtleXM6IGFueVtdKTogc3RyaW5nIHtcbiAgaWYgKGtleXMubGVuZ3RoID4gMSkge1xuICAgIHZhciByZXZlcnNlZCA9IGZpbmRGaXJzdENsb3NlZEN5Y2xlKExpc3RXcmFwcGVyLnJldmVyc2VkKGtleXMpKTtcbiAgICB2YXIgdG9rZW5TdHJzID0gcmV2ZXJzZWQubWFwKGsgPT4gc3RyaW5naWZ5KGsudG9rZW4pKTtcbiAgICByZXR1cm4gXCIgKFwiICsgdG9rZW5TdHJzLmpvaW4oJyAtPiAnKSArIFwiKVwiO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG59XG5cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBhbGwgZXJyb3JzIGFyaXNpbmcgZnJvbSBtaXNjb25maWd1cmVkIHByb3ZpZGVycy5cbiAqL1xuZXhwb3J0IGNsYXNzIEFic3RyYWN0UHJvdmlkZXJFcnJvciBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICAvKiogQGludGVybmFsICovXG4gIG1lc3NhZ2U6IHN0cmluZztcblxuICAvKiogQGludGVybmFsICovXG4gIGtleXM6IEtleVtdO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgaW5qZWN0b3JzOiBJbmplY3RvcltdO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY29uc3RydWN0UmVzb2x2aW5nTWVzc2FnZTogRnVuY3Rpb247XG5cbiAgY29uc3RydWN0b3IoaW5qZWN0b3I6IEluamVjdG9yLCBrZXk6IEtleSwgY29uc3RydWN0UmVzb2x2aW5nTWVzc2FnZTogRnVuY3Rpb24pIHtcbiAgICBzdXBlcihcIkRJIEV4Y2VwdGlvblwiKTtcbiAgICB0aGlzLmtleXMgPSBba2V5XTtcbiAgICB0aGlzLmluamVjdG9ycyA9IFtpbmplY3Rvcl07XG4gICAgdGhpcy5jb25zdHJ1Y3RSZXNvbHZpbmdNZXNzYWdlID0gY29uc3RydWN0UmVzb2x2aW5nTWVzc2FnZTtcbiAgICB0aGlzLm1lc3NhZ2UgPSB0aGlzLmNvbnN0cnVjdFJlc29sdmluZ01lc3NhZ2UodGhpcy5rZXlzKTtcbiAgfVxuXG4gIGFkZEtleShpbmplY3RvcjogSW5qZWN0b3IsIGtleTogS2V5KTogdm9pZCB7XG4gICAgdGhpcy5pbmplY3RvcnMucHVzaChpbmplY3Rvcik7XG4gICAgdGhpcy5rZXlzLnB1c2goa2V5KTtcbiAgICB0aGlzLm1lc3NhZ2UgPSB0aGlzLmNvbnN0cnVjdFJlc29sdmluZ01lc3NhZ2UodGhpcy5rZXlzKTtcbiAgfVxuXG4gIGdldCBjb250ZXh0KCkgeyByZXR1cm4gdGhpcy5pbmplY3RvcnNbdGhpcy5pbmplY3RvcnMubGVuZ3RoIC0gMV0uZGVidWdDb250ZXh0KCk7IH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiB0cnlpbmcgdG8gcmV0cmlldmUgYSBkZXBlbmRlbmN5IGJ5IGBLZXlgIGZyb20ge0BsaW5rIEluamVjdG9yfSwgYnV0IHRoZVxuICoge0BsaW5rIEluamVjdG9yfSBkb2VzIG5vdCBoYXZlIGEge0BsaW5rIFByb3ZpZGVyfSBmb3Ige0BsaW5rIEtleX0uXG4gKlxuICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L3ZxOEQzRlJCOWFHYm5XSnF0RVBFP3A9cHJldmlldykpXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgQSB7XG4gKiAgIGNvbnN0cnVjdG9yKGI6Qikge31cbiAqIH1cbiAqXG4gKiBleHBlY3QoKCkgPT4gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbQV0pKS50b1Rocm93RXJyb3IoKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgTm9Qcm92aWRlckVycm9yIGV4dGVuZHMgQWJzdHJhY3RQcm92aWRlckVycm9yIHtcbiAgY29uc3RydWN0b3IoaW5qZWN0b3I6IEluamVjdG9yLCBrZXk6IEtleSkge1xuICAgIHN1cGVyKGluamVjdG9yLCBrZXksIGZ1bmN0aW9uKGtleXM6IGFueVtdKSB7XG4gICAgICB2YXIgZmlyc3QgPSBzdHJpbmdpZnkoTGlzdFdyYXBwZXIuZmlyc3Qoa2V5cykudG9rZW4pO1xuICAgICAgcmV0dXJuIGBObyBwcm92aWRlciBmb3IgJHtmaXJzdH0hJHtjb25zdHJ1Y3RSZXNvbHZpbmdQYXRoKGtleXMpfWA7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBkZXBlbmRlbmNpZXMgZm9ybSBhIGN5Y2xlLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC93WVFkTm9zMFR6cWwzZWkxRVY5aj9wPWluZm8pKVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHZhciBpbmplY3RvciA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW1xuICogICBwcm92aWRlKFwib25lXCIsIHt1c2VGYWN0b3J5OiAodHdvKSA9PiBcInR3b1wiLCBkZXBzOiBbW25ldyBJbmplY3QoXCJ0d29cIildXX0pLFxuICogICBwcm92aWRlKFwidHdvXCIsIHt1c2VGYWN0b3J5OiAob25lKSA9PiBcIm9uZVwiLCBkZXBzOiBbW25ldyBJbmplY3QoXCJvbmVcIildXX0pXG4gKiBdKTtcbiAqXG4gKiBleHBlY3QoKCkgPT4gaW5qZWN0b3IuZ2V0KFwib25lXCIpKS50b1Rocm93RXJyb3IoKTtcbiAqIGBgYFxuICpcbiAqIFJldHJpZXZpbmcgYEFgIG9yIGBCYCB0aHJvd3MgYSBgQ3ljbGljRGVwZW5kZW5jeUVycm9yYCBhcyB0aGUgZ3JhcGggYWJvdmUgY2Fubm90IGJlIGNvbnN0cnVjdGVkLlxuICovXG5leHBvcnQgY2xhc3MgQ3ljbGljRGVwZW5kZW5jeUVycm9yIGV4dGVuZHMgQWJzdHJhY3RQcm92aWRlckVycm9yIHtcbiAgY29uc3RydWN0b3IoaW5qZWN0b3I6IEluamVjdG9yLCBrZXk6IEtleSkge1xuICAgIHN1cGVyKGluamVjdG9yLCBrZXksIGZ1bmN0aW9uKGtleXM6IGFueVtdKSB7XG4gICAgICByZXR1cm4gYENhbm5vdCBpbnN0YW50aWF0ZSBjeWNsaWMgZGVwZW5kZW5jeSEke2NvbnN0cnVjdFJlc29sdmluZ1BhdGgoa2V5cyl9YDtcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgY29uc3RydWN0aW5nIHR5cGUgcmV0dXJucyB3aXRoIGFuIEVycm9yLlxuICpcbiAqIFRoZSBgSW5zdGFudGlhdGlvbkVycm9yYCBjbGFzcyBjb250YWlucyB0aGUgb3JpZ2luYWwgZXJyb3IgcGx1cyB0aGUgZGVwZW5kZW5jeSBncmFwaCB3aGljaCBjYXVzZWRcbiAqIHRoaXMgb2JqZWN0IHRvIGJlIGluc3RhbnRpYXRlZC5cbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvN2FXWWRjcVRRc1AwZU5xRWRVQWY/cD1wcmV2aWV3KSlcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBBIHtcbiAqICAgY29uc3RydWN0b3IoKSB7XG4gKiAgICAgdGhyb3cgbmV3IEVycm9yKCdtZXNzYWdlJyk7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiB2YXIgaW5qZWN0b3IgPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtBXSk7XG5cbiAqIHRyeSB7XG4gKiAgIGluamVjdG9yLmdldChBKTtcbiAqIH0gY2F0Y2ggKGUpIHtcbiAqICAgZXhwZWN0KGUgaW5zdGFuY2VvZiBJbnN0YW50aWF0aW9uRXJyb3IpLnRvQmUodHJ1ZSk7XG4gKiAgIGV4cGVjdChlLm9yaWdpbmFsRXhjZXB0aW9uLm1lc3NhZ2UpLnRvRXF1YWwoXCJtZXNzYWdlXCIpO1xuICogICBleHBlY3QoZS5vcmlnaW5hbFN0YWNrKS50b0JlRGVmaW5lZCgpO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnN0YW50aWF0aW9uRXJyb3IgZXh0ZW5kcyBXcmFwcGVkRXhjZXB0aW9uIHtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBrZXlzOiBLZXlbXTtcblxuICAvKiogQGludGVybmFsICovXG4gIGluamVjdG9yczogSW5qZWN0b3JbXTtcblxuICBjb25zdHJ1Y3RvcihpbmplY3RvcjogSW5qZWN0b3IsIG9yaWdpbmFsRXhjZXB0aW9uLCBvcmlnaW5hbFN0YWNrLCBrZXk6IEtleSkge1xuICAgIHN1cGVyKFwiREkgRXhjZXB0aW9uXCIsIG9yaWdpbmFsRXhjZXB0aW9uLCBvcmlnaW5hbFN0YWNrLCBudWxsKTtcbiAgICB0aGlzLmtleXMgPSBba2V5XTtcbiAgICB0aGlzLmluamVjdG9ycyA9IFtpbmplY3Rvcl07XG4gIH1cblxuICBhZGRLZXkoaW5qZWN0b3I6IEluamVjdG9yLCBrZXk6IEtleSk6IHZvaWQge1xuICAgIHRoaXMuaW5qZWN0b3JzLnB1c2goaW5qZWN0b3IpO1xuICAgIHRoaXMua2V5cy5wdXNoKGtleSk7XG4gIH1cblxuICBnZXQgd3JhcHBlck1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICB2YXIgZmlyc3QgPSBzdHJpbmdpZnkoTGlzdFdyYXBwZXIuZmlyc3QodGhpcy5rZXlzKS50b2tlbik7XG4gICAgcmV0dXJuIGBFcnJvciBkdXJpbmcgaW5zdGFudGlhdGlvbiBvZiAke2ZpcnN0fSEke2NvbnN0cnVjdFJlc29sdmluZ1BhdGgodGhpcy5rZXlzKX0uYDtcbiAgfVxuXG4gIGdldCBjYXVzZUtleSgpOiBLZXkgeyByZXR1cm4gdGhpcy5rZXlzWzBdOyB9XG5cbiAgZ2V0IGNvbnRleHQoKSB7IHJldHVybiB0aGlzLmluamVjdG9yc1t0aGlzLmluamVjdG9ycy5sZW5ndGggLSAxXS5kZWJ1Z0NvbnRleHQoKTsgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGFuIG9iamVjdCBvdGhlciB0aGVuIHtAbGluayBQcm92aWRlcn0gKG9yIGBUeXBlYCkgaXMgcGFzc2VkIHRvIHtAbGluayBJbmplY3Rvcn1cbiAqIGNyZWF0aW9uLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9ZYXRDRmJQQU1DTDBKU1NRNG12SD9wPXByZXZpZXcpKVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGV4cGVjdCgoKSA9PiBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtcIm5vdCBhIHR5cGVcIl0pKS50b1Rocm93RXJyb3IoKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgSW52YWxpZFByb3ZpZGVyRXJyb3IgZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IocHJvdmlkZXIpIHtcbiAgICBzdXBlcihcIkludmFsaWQgcHJvdmlkZXIgLSBvbmx5IGluc3RhbmNlcyBvZiBQcm92aWRlciBhbmQgVHlwZSBhcmUgYWxsb3dlZCwgZ290OiBcIiArXG4gICAgICAgICAgcHJvdmlkZXIudG9TdHJpbmcoKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiB0aGUgY2xhc3MgaGFzIG5vIGFubm90YXRpb24gaW5mb3JtYXRpb24uXG4gKlxuICogTGFjayBvZiBhbm5vdGF0aW9uIGluZm9ybWF0aW9uIHByZXZlbnRzIHRoZSB7QGxpbmsgSW5qZWN0b3J9IGZyb20gZGV0ZXJtaW5pbmcgd2hpY2ggZGVwZW5kZW5jaWVzXG4gKiBuZWVkIHRvIGJlIGluamVjdGVkIGludG8gdGhlIGNvbnN0cnVjdG9yLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9ySG5adGxOUzd2Sk9QUTZwY1ZrbT9wPXByZXZpZXcpKVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIEEge1xuICogICBjb25zdHJ1Y3RvcihiKSB7fVxuICogfVxuICpcbiAqIGV4cGVjdCgoKSA9PiBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtBXSkpLnRvVGhyb3dFcnJvcigpO1xuICogYGBgXG4gKlxuICogVGhpcyBlcnJvciBpcyBhbHNvIHRocm93biB3aGVuIHRoZSBjbGFzcyBub3QgbWFya2VkIHdpdGgge0BsaW5rIEluamVjdGFibGV9IGhhcyBwYXJhbWV0ZXIgdHlwZXMuXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgQiB7fVxuICpcbiAqIGNsYXNzIEEge1xuICogICBjb25zdHJ1Y3RvcihiOkIpIHt9IC8vIG5vIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwYXJhbWV0ZXIgdHlwZXMgb2YgQSBpcyBhdmFpbGFibGUgYXQgcnVudGltZS5cbiAqIH1cbiAqXG4gKiBleHBlY3QoKCkgPT4gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbQSxCXSkpLnRvVGhyb3dFcnJvcigpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBOb0Fubm90YXRpb25FcnJvciBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3Rvcih0eXBlT3JGdW5jLCBwYXJhbXM6IGFueVtdW10pIHtcbiAgICBzdXBlcihOb0Fubm90YXRpb25FcnJvci5fZ2VuTWVzc2FnZSh0eXBlT3JGdW5jLCBwYXJhbXMpKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9nZW5NZXNzYWdlKHR5cGVPckZ1bmMsIHBhcmFtczogYW55W11bXSkge1xuICAgIHZhciBzaWduYXR1cmUgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBwYXJhbXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgdmFyIHBhcmFtZXRlciA9IHBhcmFtc1tpXTtcbiAgICAgIGlmIChpc0JsYW5rKHBhcmFtZXRlcikgfHwgcGFyYW1ldGVyLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIHNpZ25hdHVyZS5wdXNoKCc/Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaWduYXR1cmUucHVzaChwYXJhbWV0ZXIubWFwKHN0cmluZ2lmeSkuam9pbignICcpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFwiQ2Fubm90IHJlc29sdmUgYWxsIHBhcmFtZXRlcnMgZm9yIFwiICsgc3RyaW5naWZ5KHR5cGVPckZ1bmMpICsgXCIoXCIgK1xuICAgICAgICAgICBzaWduYXR1cmUuam9pbignLCAnKSArIFwiKS4gXCIgKyAnTWFrZSBzdXJlIHRoZXkgYWxsIGhhdmUgdmFsaWQgdHlwZSBvciBhbm5vdGF0aW9ucy4nO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gZ2V0dGluZyBhbiBvYmplY3QgYnkgaW5kZXguXG4gKlxuICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L2JSczBTWDJPVFFpSnpxdmpnbDhQP3A9cHJldmlldykpXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgQSB7fVxuICpcbiAqIHZhciBpbmplY3RvciA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW0FdKTtcbiAqXG4gKiBleHBlY3QoKCkgPT4gaW5qZWN0b3IuZ2V0QXQoMTAwKSkudG9UaHJvd0Vycm9yKCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIE91dE9mQm91bmRzRXJyb3IgZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IoaW5kZXgpIHsgc3VwZXIoYEluZGV4ICR7aW5kZXh9IGlzIG91dC1vZi1ib3VuZHMuYCk7IH1cbn1cblxuLy8gVE9ETzogYWRkIGEgd29ya2luZyBleGFtcGxlIGFmdGVyIGFscGhhMzggaXMgcmVsZWFzZWRcbi8qKlxuICogVGhyb3duIHdoZW4gYSBtdWx0aSBwcm92aWRlciBhbmQgYSByZWd1bGFyIHByb3ZpZGVyIGFyZSBib3VuZCB0byB0aGUgc2FtZSB0b2tlbi5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGV4cGVjdCgoKSA9PiBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtcbiAqICAgbmV3IFByb3ZpZGVyKFwiU3RyaW5nc1wiLCB7dXNlVmFsdWU6IFwic3RyaW5nMVwiLCBtdWx0aTogdHJ1ZX0pLFxuICogICBuZXcgUHJvdmlkZXIoXCJTdHJpbmdzXCIsIHt1c2VWYWx1ZTogXCJzdHJpbmcyXCIsIG11bHRpOiBmYWxzZX0pXG4gKiBdKSkudG9UaHJvd0Vycm9yKCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIE1peGluZ011bHRpUHJvdmlkZXJzV2l0aFJlZ3VsYXJQcm92aWRlcnNFcnJvciBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3Rvcihwcm92aWRlcjEsIHByb3ZpZGVyMikge1xuICAgIHN1cGVyKFwiQ2Fubm90IG1peCBtdWx0aSBwcm92aWRlcnMgYW5kIHJlZ3VsYXIgcHJvdmlkZXJzLCBnb3Q6IFwiICsgcHJvdmlkZXIxLnRvU3RyaW5nKCkgKyBcIiBcIiArXG4gICAgICAgICAgcHJvdmlkZXIyLnRvU3RyaW5nKCkpO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9kaS9leGNlcHRpb25zLnRzXG4gKiovIiwiaW1wb3J0IHtDT05TVH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgdG9rZW4gdGhhdCBjYW4gYmUgdXNlZCBpbiBhIERJIFByb3ZpZGVyLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9ZczllelhwajJNbm95M1VjOEtCcD9wPXByZXZpZXcpKVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHZhciB0ID0gbmV3IE9wYXF1ZVRva2VuKFwidmFsdWVcIik7XG4gKlxuICogdmFyIGluamVjdG9yID0gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbXG4gKiAgIHByb3ZpZGUodCwge3VzZVZhbHVlOiBcInByb3ZpZGVkVmFsdWVcIn0pXG4gKiBdKTtcbiAqXG4gKiBleHBlY3QoaW5qZWN0b3IuZ2V0KHQpKS50b0VxdWFsKFwiYmluZGluZ1ZhbHVlXCIpO1xuICogYGBgXG4gKlxuICogVXNpbmcgYW4gYE9wYXF1ZVRva2VuYCBpcyBwcmVmZXJhYmxlIHRvIHVzaW5nIHN0cmluZ3MgYXMgdG9rZW5zIGJlY2F1c2Ugb2YgcG9zc2libGUgY29sbGlzaW9uc1xuICogY2F1c2VkIGJ5IG11bHRpcGxlIHByb3ZpZGVycyB1c2luZyB0aGUgc2FtZSBzdHJpbmcgYXMgdHdvIGRpZmZlcmVudCB0b2tlbnMuXG4gKlxuICogVXNpbmcgYW4gYE9wYXF1ZVRva2VuYCBpcyBwcmVmZXJhYmxlIHRvIHVzaW5nIGFuIGBPYmplY3RgIGFzIHRva2VucyBiZWNhdXNlIGl0IHByb3ZpZGVzIGJldHRlclxuICogZXJyb3IgbWVzc2FnZXMuXG4gKi9cbkBDT05TVCgpXG5leHBvcnQgY2xhc3MgT3BhcXVlVG9rZW4ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kZXNjOiBzdHJpbmcpIHt9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHsgcmV0dXJuIGBUb2tlbiAke3RoaXMuX2Rlc2N9YDsgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvZGkvb3BhcXVlX3Rva2VuLnRzXG4gKiovIiwiaW1wb3J0IHtpc1ByZXNlbnQsIENPTlNULCBDT05TVF9FWFBSLCBUeXBlfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtJbmplY3RhYmxlTWV0YWRhdGF9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpL21ldGFkYXRhJztcbmltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3l9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24nO1xuaW1wb3J0IHtWaWV3RW5jYXBzdWxhdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvbWV0YWRhdGEvdmlldyc7XG5cbi8qKlxuICogRGlyZWN0aXZlcyBhbGxvdyB5b3UgdG8gYXR0YWNoIGJlaGF2aW9yIHRvIGVsZW1lbnRzIGluIHRoZSBET00uXG4gKlxuICoge0BsaW5rIERpcmVjdGl2ZU1ldGFkYXRhfXMgd2l0aCBhbiBlbWJlZGRlZCB2aWV3IGFyZSBjYWxsZWQge0BsaW5rIENvbXBvbmVudE1ldGFkYXRhfXMuXG4gKlxuICogQSBkaXJlY3RpdmUgY29uc2lzdHMgb2YgYSBzaW5nbGUgZGlyZWN0aXZlIGFubm90YXRpb24gYW5kIGEgY29udHJvbGxlciBjbGFzcy4gV2hlbiB0aGVcbiAqIGRpcmVjdGl2ZSdzIGBzZWxlY3RvcmAgbWF0Y2hlc1xuICogZWxlbWVudHMgaW4gdGhlIERPTSwgdGhlIGZvbGxvd2luZyBzdGVwcyBvY2N1cjpcbiAqXG4gKiAxLiBGb3IgZWFjaCBkaXJlY3RpdmUsIHRoZSBgRWxlbWVudEluamVjdG9yYCBhdHRlbXB0cyB0byByZXNvbHZlIHRoZSBkaXJlY3RpdmUncyBjb25zdHJ1Y3RvclxuICogYXJndW1lbnRzLlxuICogMi4gQW5ndWxhciBpbnN0YW50aWF0ZXMgZGlyZWN0aXZlcyBmb3IgZWFjaCBtYXRjaGVkIGVsZW1lbnQgdXNpbmcgYEVsZW1lbnRJbmplY3RvcmAgaW4gYVxuICogZGVwdGgtZmlyc3Qgb3JkZXIsXG4gKiAgICBhcyBkZWNsYXJlZCBpbiB0aGUgSFRNTC5cbiAqXG4gKiAjIyBVbmRlcnN0YW5kaW5nIEhvdyBJbmplY3Rpb24gV29ya3NcbiAqXG4gKiBUaGVyZSBhcmUgdGhyZWUgc3RhZ2VzIG9mIGluamVjdGlvbiByZXNvbHV0aW9uLlxuICogLSAqUHJlLWV4aXN0aW5nIEluamVjdG9ycyo6XG4gKiAgIC0gVGhlIHRlcm1pbmFsIHtAbGluayBJbmplY3Rvcn0gY2Fubm90IHJlc29sdmUgZGVwZW5kZW5jaWVzLiBJdCBlaXRoZXIgdGhyb3dzIGFuIGVycm9yIG9yLCBpZlxuICogdGhlIGRlcGVuZGVuY3kgd2FzXG4gKiAgICAgc3BlY2lmaWVkIGFzIGBAT3B0aW9uYWxgLCByZXR1cm5zIGBudWxsYC5cbiAqICAgLSBUaGUgcGxhdGZvcm0gaW5qZWN0b3IgcmVzb2x2ZXMgYnJvd3NlciBzaW5nbGV0b24gcmVzb3VyY2VzLCBzdWNoIGFzOiBjb29raWVzLCB0aXRsZSxcbiAqIGxvY2F0aW9uLCBhbmQgb3RoZXJzLlxuICogLSAqQ29tcG9uZW50IEluamVjdG9ycyo6IEVhY2ggY29tcG9uZW50IGluc3RhbmNlIGhhcyBpdHMgb3duIHtAbGluayBJbmplY3Rvcn0sIGFuZCB0aGV5IGZvbGxvd1xuICogdGhlIHNhbWUgcGFyZW50LWNoaWxkIGhpZXJhcmNoeVxuICogICAgIGFzIHRoZSBjb21wb25lbnQgaW5zdGFuY2VzIGluIHRoZSBET00uXG4gKiAtICpFbGVtZW50IEluamVjdG9ycyo6IEVhY2ggY29tcG9uZW50IGluc3RhbmNlIGhhcyBhIFNoYWRvdyBET00uIFdpdGhpbiB0aGUgU2hhZG93IERPTSBlYWNoXG4gKiBlbGVtZW50IGhhcyBhbiBgRWxlbWVudEluamVjdG9yYFxuICogICAgIHdoaWNoIGZvbGxvdyB0aGUgc2FtZSBwYXJlbnQtY2hpbGQgaGllcmFyY2h5IGFzIHRoZSBET00gZWxlbWVudHMgdGhlbXNlbHZlcy5cbiAqXG4gKiBXaGVuIGEgdGVtcGxhdGUgaXMgaW5zdGFudGlhdGVkLCBpdCBhbHNvIG11c3QgaW5zdGFudGlhdGUgdGhlIGNvcnJlc3BvbmRpbmcgZGlyZWN0aXZlcyBpbiBhXG4gKiBkZXB0aC1maXJzdCBvcmRlci4gVGhlXG4gKiBjdXJyZW50IGBFbGVtZW50SW5qZWN0b3JgIHJlc29sdmVzIHRoZSBjb25zdHJ1Y3RvciBkZXBlbmRlbmNpZXMgZm9yIGVhY2ggZGlyZWN0aXZlLlxuICpcbiAqIEFuZ3VsYXIgdGhlbiByZXNvbHZlcyBkZXBlbmRlbmNpZXMgYXMgZm9sbG93cywgYWNjb3JkaW5nIHRvIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFwcGVhciBpbiB0aGVcbiAqIHtAbGluayBWaWV3TWV0YWRhdGF9OlxuICpcbiAqIDEuIERlcGVuZGVuY2llcyBvbiB0aGUgY3VycmVudCBlbGVtZW50XG4gKiAyLiBEZXBlbmRlbmNpZXMgb24gZWxlbWVudCBpbmplY3RvcnMgYW5kIHRoZWlyIHBhcmVudHMgdW50aWwgaXQgZW5jb3VudGVycyBhIFNoYWRvdyBET00gYm91bmRhcnlcbiAqIDMuIERlcGVuZGVuY2llcyBvbiBjb21wb25lbnQgaW5qZWN0b3JzIGFuZCB0aGVpciBwYXJlbnRzIHVudGlsIGl0IGVuY291bnRlcnMgdGhlIHJvb3QgY29tcG9uZW50XG4gKiA0LiBEZXBlbmRlbmNpZXMgb24gcHJlLWV4aXN0aW5nIGluamVjdG9yc1xuICpcbiAqXG4gKiBUaGUgYEVsZW1lbnRJbmplY3RvcmAgY2FuIGluamVjdCBvdGhlciBkaXJlY3RpdmVzLCBlbGVtZW50LXNwZWNpZmljIHNwZWNpYWwgb2JqZWN0cywgb3IgaXQgY2FuXG4gKiBkZWxlZ2F0ZSB0byB0aGUgcGFyZW50XG4gKiBpbmplY3Rvci5cbiAqXG4gKiBUbyBpbmplY3Qgb3RoZXIgZGlyZWN0aXZlcywgZGVjbGFyZSB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIGFzOlxuICogLSBgZGlyZWN0aXZlOkRpcmVjdGl2ZVR5cGVgOiBhIGRpcmVjdGl2ZSBvbiB0aGUgY3VycmVudCBlbGVtZW50IG9ubHlcbiAqIC0gYEBIb3N0KCkgZGlyZWN0aXZlOkRpcmVjdGl2ZVR5cGVgOiBhbnkgZGlyZWN0aXZlIHRoYXQgbWF0Y2hlcyB0aGUgdHlwZSBiZXR3ZWVuIHRoZSBjdXJyZW50XG4gKiBlbGVtZW50IGFuZCB0aGVcbiAqICAgIFNoYWRvdyBET00gcm9vdC5cbiAqIC0gYEBRdWVyeShEaXJlY3RpdmVUeXBlKSBxdWVyeTpRdWVyeUxpc3Q8RGlyZWN0aXZlVHlwZT5gOiBBIGxpdmUgY29sbGVjdGlvbiBvZiBkaXJlY3QgY2hpbGRcbiAqIGRpcmVjdGl2ZXMuXG4gKiAtIGBAUXVlcnlEZXNjZW5kYW50cyhEaXJlY3RpdmVUeXBlKSBxdWVyeTpRdWVyeUxpc3Q8RGlyZWN0aXZlVHlwZT5gOiBBIGxpdmUgY29sbGVjdGlvbiBvZiBhbnlcbiAqIGNoaWxkIGRpcmVjdGl2ZXMuXG4gKlxuICogVG8gaW5qZWN0IGVsZW1lbnQtc3BlY2lmaWMgc3BlY2lhbCBvYmplY3RzLCBkZWNsYXJlIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgYXM6XG4gKiAtIGBlbGVtZW50OiBFbGVtZW50UmVmYCB0byBvYnRhaW4gYSByZWZlcmVuY2UgdG8gbG9naWNhbCBlbGVtZW50IGluIHRoZSB2aWV3LlxuICogLSBgdmlld0NvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZmAgdG8gY29udHJvbCBjaGlsZCB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uLCBmb3JcbiAqIHtAbGluayBEaXJlY3RpdmVNZXRhZGF0YX0gZGlyZWN0aXZlcyBvbmx5XG4gKiAtIGBiaW5kaW5nUHJvcGFnYXRpb246IEJpbmRpbmdQcm9wYWdhdGlvbmAgdG8gY29udHJvbCBjaGFuZ2UgZGV0ZWN0aW9uIGluIGEgbW9yZSBncmFudWxhciB3YXkuXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyBkZXBlbmRlbmN5IGluamVjdGlvbiByZXNvbHZlcyBjb25zdHJ1Y3RvciBhcmd1bWVudHMgaW5cbiAqIHByYWN0aWNlLlxuICpcbiAqXG4gKiBBc3N1bWUgdGhpcyBIVE1MIHRlbXBsYXRlOlxuICpcbiAqIGBgYFxuICogPGRpdiBkZXBlbmRlbmN5PVwiMVwiPlxuICogICA8ZGl2IGRlcGVuZGVuY3k9XCIyXCI+XG4gKiAgICAgPGRpdiBkZXBlbmRlbmN5PVwiM1wiIG15LWRpcmVjdGl2ZT5cbiAqICAgICAgIDxkaXYgZGVwZW5kZW5jeT1cIjRcIj5cbiAqICAgICAgICAgPGRpdiBkZXBlbmRlbmN5PVwiNVwiPjwvZGl2PlxuICogICAgICAgPC9kaXY+XG4gKiAgICAgICA8ZGl2IGRlcGVuZGVuY3k9XCI2XCI+PC9kaXY+XG4gKiAgICAgPC9kaXY+XG4gKiAgIDwvZGl2PlxuICogPC9kaXY+XG4gKiBgYGBcbiAqXG4gKiBXaXRoIHRoZSBmb2xsb3dpbmcgYGRlcGVuZGVuY3lgIGRlY29yYXRvciBhbmQgYFNvbWVTZXJ2aWNlYCBpbmplY3RhYmxlIGNsYXNzLlxuICpcbiAqIGBgYFxuICogQEluamVjdGFibGUoKVxuICogY2xhc3MgU29tZVNlcnZpY2Uge1xuICogfVxuICpcbiAqIEBEaXJlY3RpdmUoe1xuICogICBzZWxlY3RvcjogJ1tkZXBlbmRlbmN5XScsXG4gKiAgIGlucHV0czogW1xuICogICAgICdpZDogZGVwZW5kZW5jeSdcbiAqICAgXVxuICogfSlcbiAqIGNsYXNzIERlcGVuZGVuY3kge1xuICogICBpZDpzdHJpbmc7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBMZXQncyBzdGVwIHRocm91Z2ggdGhlIGRpZmZlcmVudCB3YXlzIGluIHdoaWNoIGBNeURpcmVjdGl2ZWAgY291bGQgYmUgZGVjbGFyZWQuLi5cbiAqXG4gKlxuICogIyMjIE5vIGluamVjdGlvblxuICpcbiAqIEhlcmUgdGhlIGNvbnN0cnVjdG9yIGlzIGRlY2xhcmVkIHdpdGggbm8gYXJndW1lbnRzLCB0aGVyZWZvcmUgbm90aGluZyBpcyBpbmplY3RlZCBpbnRvXG4gKiBgTXlEaXJlY3RpdmVgLlxuICpcbiAqIGBgYFxuICogQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW215LWRpcmVjdGl2ZV0nIH0pXG4gKiBjbGFzcyBNeURpcmVjdGl2ZSB7XG4gKiAgIGNvbnN0cnVjdG9yKCkge1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBUaGlzIGRpcmVjdGl2ZSB3b3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBubyBkZXBlbmRlbmNpZXMuXG4gKlxuICpcbiAqICMjIyBDb21wb25lbnQtbGV2ZWwgaW5qZWN0aW9uXG4gKlxuICogRGlyZWN0aXZlcyBjYW4gaW5qZWN0IGFueSBpbmplY3RhYmxlIGluc3RhbmNlIGZyb20gdGhlIGNsb3Nlc3QgY29tcG9uZW50IGluamVjdG9yIG9yIGFueSBvZiBpdHNcbiAqIHBhcmVudHMuXG4gKlxuICogSGVyZSwgdGhlIGNvbnN0cnVjdG9yIGRlY2xhcmVzIGEgcGFyYW1ldGVyLCBgc29tZVNlcnZpY2VgLCBhbmQgaW5qZWN0cyB0aGUgYFNvbWVTZXJ2aWNlYCB0eXBlXG4gKiBmcm9tIHRoZSBwYXJlbnRcbiAqIGNvbXBvbmVudCdzIGluamVjdG9yLlxuICogYGBgXG4gKiBARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbbXktZGlyZWN0aXZlXScgfSlcbiAqIGNsYXNzIE15RGlyZWN0aXZlIHtcbiAqICAgY29uc3RydWN0b3Ioc29tZVNlcnZpY2U6IFNvbWVTZXJ2aWNlKSB7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqIFRoaXMgZGlyZWN0aXZlIHdvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGEgZGVwZW5kZW5jeSBvbiBgU29tZVNlcnZpY2VgLlxuICpcbiAqXG4gKiAjIyMgSW5qZWN0aW5nIGEgZGlyZWN0aXZlIGZyb20gdGhlIGN1cnJlbnQgZWxlbWVudFxuICpcbiAqIERpcmVjdGl2ZXMgY2FuIGluamVjdCBvdGhlciBkaXJlY3RpdmVzIGRlY2xhcmVkIG9uIHRoZSBjdXJyZW50IGVsZW1lbnQuXG4gKlxuICogYGBgXG4gKiBARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbbXktZGlyZWN0aXZlXScgfSlcbiAqIGNsYXNzIE15RGlyZWN0aXZlIHtcbiAqICAgY29uc3RydWN0b3IoZGVwZW5kZW5jeTogRGVwZW5kZW5jeSkge1xuICogICAgIGV4cGVjdChkZXBlbmRlbmN5LmlkKS50b0VxdWFsKDMpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqIFRoaXMgZGlyZWN0aXZlIHdvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGBEZXBlbmRlbmN5YCBkZWNsYXJlZCBhdCB0aGUgc2FtZSBlbGVtZW50LCBpbiB0aGlzIGNhc2VcbiAqIGBkZXBlbmRlbmN5PVwiM1wiYC5cbiAqXG4gKiAjIyMgSW5qZWN0aW5nIGEgZGlyZWN0aXZlIGZyb20gYW55IGFuY2VzdG9yIGVsZW1lbnRzXG4gKlxuICogRGlyZWN0aXZlcyBjYW4gaW5qZWN0IG90aGVyIGRpcmVjdGl2ZXMgZGVjbGFyZWQgb24gYW55IGFuY2VzdG9yIGVsZW1lbnQgKGluIHRoZSBjdXJyZW50IFNoYWRvd1xuICogRE9NKSwgaS5lLiBvbiB0aGUgY3VycmVudCBlbGVtZW50LCB0aGVcbiAqIHBhcmVudCBlbGVtZW50LCBvciBpdHMgcGFyZW50cy5cbiAqIGBgYFxuICogQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW215LWRpcmVjdGl2ZV0nIH0pXG4gKiBjbGFzcyBNeURpcmVjdGl2ZSB7XG4gKiAgIGNvbnN0cnVjdG9yKEBIb3N0KCkgZGVwZW5kZW5jeTogRGVwZW5kZW5jeSkge1xuICogICAgIGV4cGVjdChkZXBlbmRlbmN5LmlkKS50b0VxdWFsKDIpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBgQEhvc3RgIGNoZWNrcyB0aGUgY3VycmVudCBlbGVtZW50LCB0aGUgcGFyZW50LCBhcyB3ZWxsIGFzIGl0cyBwYXJlbnRzIHJlY3Vyc2l2ZWx5LiBJZlxuICogYGRlcGVuZGVuY3k9XCIyXCJgIGRpZG4ndFxuICogZXhpc3Qgb24gdGhlIGRpcmVjdCBwYXJlbnQsIHRoaXMgaW5qZWN0aW9uIHdvdWxkXG4gKiBoYXZlIHJldHVybmVkXG4gKiBgZGVwZW5kZW5jeT1cIjFcImAuXG4gKlxuICpcbiAqICMjIyBJbmplY3RpbmcgYSBsaXZlIGNvbGxlY3Rpb24gb2YgZGlyZWN0IGNoaWxkIGRpcmVjdGl2ZXNcbiAqXG4gKlxuICogQSBkaXJlY3RpdmUgY2FuIGFsc28gcXVlcnkgZm9yIG90aGVyIGNoaWxkIGRpcmVjdGl2ZXMuIFNpbmNlIHBhcmVudCBkaXJlY3RpdmVzIGFyZSBpbnN0YW50aWF0ZWRcbiAqIGJlZm9yZSBjaGlsZCBkaXJlY3RpdmVzLCBhIGRpcmVjdGl2ZSBjYW4ndCBzaW1wbHkgaW5qZWN0IHRoZSBsaXN0IG9mIGNoaWxkIGRpcmVjdGl2ZXMuIEluc3RlYWQsXG4gKiB0aGUgZGlyZWN0aXZlIGluamVjdHMgYSB7QGxpbmsgUXVlcnlMaXN0fSwgd2hpY2ggdXBkYXRlcyBpdHMgY29udGVudHMgYXMgY2hpbGRyZW4gYXJlIGFkZGVkLFxuICogcmVtb3ZlZCwgb3IgbW92ZWQgYnkgYSBkaXJlY3RpdmUgdGhhdCB1c2VzIGEge0BsaW5rIFZpZXdDb250YWluZXJSZWZ9IHN1Y2ggYXMgYSBgbmdGb3JgLCBhblxuICogYG5nSWZgLCBvciBhbiBgbmdTd2l0Y2hgLlxuICpcbiAqIGBgYFxuICogQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW215LWRpcmVjdGl2ZV0nIH0pXG4gKiBjbGFzcyBNeURpcmVjdGl2ZSB7XG4gKiAgIGNvbnN0cnVjdG9yKEBRdWVyeShEZXBlbmRlbmN5KSBkZXBlbmRlbmNpZXM6UXVlcnlMaXN0PERlcGVuZGVuY3k+KSB7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqIFRoaXMgZGlyZWN0aXZlIHdvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGEge0BsaW5rIFF1ZXJ5TGlzdH0gd2hpY2ggY29udGFpbnMgYERlcGVuZGVuY3lgIDQgYW5kXG4gKiBgRGVwZW5kZW5jeWAgNi4gSGVyZSwgYERlcGVuZGVuY3lgIDUgd291bGQgbm90IGJlIGluY2x1ZGVkLCBiZWNhdXNlIGl0IGlzIG5vdCBhIGRpcmVjdCBjaGlsZC5cbiAqXG4gKiAjIyMgSW5qZWN0aW5nIGEgbGl2ZSBjb2xsZWN0aW9uIG9mIGRlc2NlbmRhbnQgZGlyZWN0aXZlc1xuICpcbiAqIEJ5IHBhc3NpbmcgdGhlIGRlc2NlbmRhbnQgZmxhZyB0byBgQFF1ZXJ5YCBhYm92ZSwgd2UgY2FuIGluY2x1ZGUgdGhlIGNoaWxkcmVuIG9mIHRoZSBjaGlsZFxuICogZWxlbWVudHMuXG4gKlxuICogYGBgXG4gKiBARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbbXktZGlyZWN0aXZlXScgfSlcbiAqIGNsYXNzIE15RGlyZWN0aXZlIHtcbiAqICAgY29uc3RydWN0b3IoQFF1ZXJ5KERlcGVuZGVuY3ksIHtkZXNjZW5kYW50czogdHJ1ZX0pIGRlcGVuZGVuY2llczpRdWVyeUxpc3Q8RGVwZW5kZW5jeT4pIHtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogVGhpcyBkaXJlY3RpdmUgd291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggYSBRdWVyeSB3aGljaCB3b3VsZCBjb250YWluIGBEZXBlbmRlbmN5YCA0LCA1IGFuZCA2LlxuICpcbiAqICMjIyBPcHRpb25hbCBpbmplY3Rpb25cbiAqXG4gKiBUaGUgbm9ybWFsIGJlaGF2aW9yIG9mIGRpcmVjdGl2ZXMgaXMgdG8gcmV0dXJuIGFuIGVycm9yIHdoZW4gYSBzcGVjaWZpZWQgZGVwZW5kZW5jeSBjYW5ub3QgYmVcbiAqIHJlc29sdmVkLiBJZiB5b3VcbiAqIHdvdWxkIGxpa2UgdG8gaW5qZWN0IGBudWxsYCBvbiB1bnJlc29sdmVkIGRlcGVuZGVuY3kgaW5zdGVhZCwgeW91IGNhbiBhbm5vdGF0ZSB0aGF0IGRlcGVuZGVuY3lcbiAqIHdpdGggYEBPcHRpb25hbCgpYC5cbiAqIFRoaXMgZXhwbGljaXRseSBwZXJtaXRzIHRoZSBhdXRob3Igb2YgYSB0ZW1wbGF0ZSB0byB0cmVhdCBzb21lIG9mIHRoZSBzdXJyb3VuZGluZyBkaXJlY3RpdmVzIGFzXG4gKiBvcHRpb25hbC5cbiAqXG4gKiBgYGBcbiAqIEBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tteS1kaXJlY3RpdmVdJyB9KVxuICogY2xhc3MgTXlEaXJlY3RpdmUge1xuICogICBjb25zdHJ1Y3RvcihAT3B0aW9uYWwoKSBkZXBlbmRlbmN5OkRlcGVuZGVuY3kpIHtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogVGhpcyBkaXJlY3RpdmUgd291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggYSBgRGVwZW5kZW5jeWAgZGlyZWN0aXZlIGZvdW5kIG9uIHRoZSBjdXJyZW50IGVsZW1lbnQuXG4gKiBJZiBub25lIGNhbiBiZVxuICogZm91bmQsIHRoZSBpbmplY3RvciBzdXBwbGllcyBgbnVsbGAgaW5zdGVhZCBvZiB0aHJvd2luZyBhbiBlcnJvci5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIEhlcmUgd2UgdXNlIGEgZGVjb3JhdG9yIGRpcmVjdGl2ZSB0byBzaW1wbHkgZGVmaW5lIGJhc2ljIHRvb2wtdGlwIGJlaGF2aW9yLlxuICpcbiAqIGBgYFxuICogQERpcmVjdGl2ZSh7XG4gKiAgIHNlbGVjdG9yOiAnW3Rvb2x0aXBdJyxcbiAqICAgaW5wdXRzOiBbXG4gKiAgICAgJ3RleHQ6IHRvb2x0aXAnXG4gKiAgIF0sXG4gKiAgIGhvc3Q6IHtcbiAqICAgICAnKG1vdXNlZW50ZXIpJzogJ29uTW91c2VFbnRlcigpJyxcbiAqICAgICAnKG1vdXNlbGVhdmUpJzogJ29uTW91c2VMZWF2ZSgpJ1xuICogICB9XG4gKiB9KVxuICogY2xhc3MgVG9vbHRpcHtcbiAqICAgdGV4dDpzdHJpbmc7XG4gKiAgIG92ZXJsYXk6T3ZlcmxheTsgLy8gTk9UIFlFVCBJTVBMRU1FTlRFRFxuICogICBvdmVybGF5TWFuYWdlcjpPdmVybGF5TWFuYWdlcjsgLy8gTk9UIFlFVCBJTVBMRU1FTlRFRFxuICpcbiAqICAgY29uc3RydWN0b3Iob3ZlcmxheU1hbmFnZXI6T3ZlcmxheU1hbmFnZXIpIHtcbiAqICAgICB0aGlzLm92ZXJsYXkgPSBvdmVybGF5O1xuICogICB9XG4gKlxuICogICBvbk1vdXNlRW50ZXIoKSB7XG4gKiAgICAgLy8gZXhhY3Qgc2lnbmF0dXJlIHRvIGJlIGRldGVybWluZWRcbiAqICAgICB0aGlzLm92ZXJsYXkgPSB0aGlzLm92ZXJsYXlNYW5hZ2VyLm9wZW4odGV4dCwgLi4uKTtcbiAqICAgfVxuICpcbiAqICAgb25Nb3VzZUxlYXZlKCkge1xuICogICAgIHRoaXMub3ZlcmxheS5jbG9zZSgpO1xuICogICAgIHRoaXMub3ZlcmxheSA9IG51bGw7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICogSW4gb3VyIEhUTUwgdGVtcGxhdGUsIHdlIGNhbiB0aGVuIGFkZCB0aGlzIGJlaGF2aW9yIHRvIGEgYDxkaXY+YCBvciBhbnkgb3RoZXIgZWxlbWVudCB3aXRoIHRoZVxuICogYHRvb2x0aXBgIHNlbGVjdG9yLFxuICogbGlrZSBzbzpcbiAqXG4gKiBgYGBcbiAqIDxkaXYgdG9vbHRpcD1cInNvbWUgdGV4dCBoZXJlXCI+PC9kaXY+XG4gKiBgYGBcbiAqXG4gKiBEaXJlY3RpdmVzIGNhbiBhbHNvIGNvbnRyb2wgdGhlIGluc3RhbnRpYXRpb24sIGRlc3RydWN0aW9uLCBhbmQgcG9zaXRpb25pbmcgb2YgaW5saW5lIHRlbXBsYXRlXG4gKiBlbGVtZW50czpcbiAqXG4gKiBBIGRpcmVjdGl2ZSB1c2VzIGEge0BsaW5rIFZpZXdDb250YWluZXJSZWZ9IHRvIGluc3RhbnRpYXRlLCBpbnNlcnQsIG1vdmUsIGFuZCBkZXN0cm95IHZpZXdzIGF0XG4gKiBydW50aW1lLlxuICogVGhlIHtAbGluayBWaWV3Q29udGFpbmVyUmVmfSBpcyBjcmVhdGVkIGFzIGEgcmVzdWx0IG9mIGA8dGVtcGxhdGU+YCBlbGVtZW50LCBhbmQgcmVwcmVzZW50cyBhXG4gKiBsb2NhdGlvbiBpbiB0aGUgY3VycmVudCB2aWV3XG4gKiB3aGVyZSB0aGVzZSBhY3Rpb25zIGFyZSBwZXJmb3JtZWQuXG4gKlxuICogVmlld3MgYXJlIGFsd2F5cyBjcmVhdGVkIGFzIGNoaWxkcmVuIG9mIHRoZSBjdXJyZW50IHtAbGluayBWaWV3TWV0YWRhdGF9LCBhbmQgYXMgc2libGluZ3Mgb2YgdGhlXG4gKiBgPHRlbXBsYXRlPmAgZWxlbWVudC4gVGh1cyBhXG4gKiBkaXJlY3RpdmUgaW4gYSBjaGlsZCB2aWV3IGNhbm5vdCBpbmplY3QgdGhlIGRpcmVjdGl2ZSB0aGF0IGNyZWF0ZWQgaXQuXG4gKlxuICogU2luY2UgZGlyZWN0aXZlcyB0aGF0IGNyZWF0ZSB2aWV3cyB2aWEgVmlld0NvbnRhaW5lcnMgYXJlIGNvbW1vbiBpbiBBbmd1bGFyLCBhbmQgdXNpbmcgdGhlIGZ1bGxcbiAqIGA8dGVtcGxhdGU+YCBlbGVtZW50IHN5bnRheCBpcyB3b3JkeSwgQW5ndWxhclxuICogYWxzbyBzdXBwb3J0cyBhIHNob3J0aGFuZCBub3RhdGlvbjogYDxsaSAqZm9vPVwiYmFyXCI+YCBhbmQgYDxsaSB0ZW1wbGF0ZT1cImZvbzogYmFyXCI+YCBhcmVcbiAqIGVxdWl2YWxlbnQuXG4gKlxuICogVGh1cyxcbiAqXG4gKiBgYGBcbiAqIDx1bD5cbiAqICAgPGxpICpmb289XCJiYXJcIiB0aXRsZT1cInRleHRcIj48L2xpPlxuICogPC91bD5cbiAqIGBgYFxuICpcbiAqIEV4cGFuZHMgaW4gdXNlIHRvOlxuICpcbiAqIGBgYFxuICogPHVsPlxuICogICA8dGVtcGxhdGUgW2Zvb109XCJiYXJcIj5cbiAqICAgICA8bGkgdGl0bGU9XCJ0ZXh0XCI+PC9saT5cbiAqICAgPC90ZW1wbGF0ZT5cbiAqIDwvdWw+XG4gKiBgYGBcbiAqXG4gKiBOb3RpY2UgdGhhdCBhbHRob3VnaCB0aGUgc2hvcnRoYW5kIHBsYWNlcyBgKmZvbz1cImJhclwiYCB3aXRoaW4gdGhlIGA8bGk+YCBlbGVtZW50LCB0aGUgYmluZGluZyBmb3JcbiAqIHRoZSBkaXJlY3RpdmVcbiAqIGNvbnRyb2xsZXIgaXMgY29ycmVjdGx5IGluc3RhbnRpYXRlZCBvbiB0aGUgYDx0ZW1wbGF0ZT5gIGVsZW1lbnQgcmF0aGVyIHRoYW4gdGhlIGA8bGk+YCBlbGVtZW50LlxuICpcbiAqICMjIExpZmVjeWNsZSBob29rc1xuICpcbiAqIFdoZW4gdGhlIGRpcmVjdGl2ZSBjbGFzcyBpbXBsZW1lbnRzIHNvbWUge0BsaW5rIGFuZ3VsYXIyL2xpZmVjeWNsZV9ob29rc30gdGhlIGNhbGxiYWNrcyBhcmVcbiAqIGNhbGxlZCBieSB0aGUgY2hhbmdlIGRldGVjdGlvbiBhdCBkZWZpbmVkIHBvaW50cyBpbiB0aW1lIGR1cmluZyB0aGUgbGlmZSBvZiB0aGUgZGlyZWN0aXZlLlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogTGV0J3Mgc3VwcG9zZSB3ZSB3YW50IHRvIGltcGxlbWVudCB0aGUgYHVubGVzc2AgYmVoYXZpb3IsIHRvIGNvbmRpdGlvbmFsbHkgaW5jbHVkZSBhIHRlbXBsYXRlLlxuICpcbiAqIEhlcmUgaXMgYSBzaW1wbGUgZGlyZWN0aXZlIHRoYXQgdHJpZ2dlcnMgb24gYW4gYHVubGVzc2Agc2VsZWN0b3I6XG4gKlxuICogYGBgXG4gKiBARGlyZWN0aXZlKHtcbiAqICAgc2VsZWN0b3I6ICdbdW5sZXNzXScsXG4gKiAgIGlucHV0czogWyd1bmxlc3MnXVxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBVbmxlc3Mge1xuICogICB2aWV3Q29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmO1xuICogICB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY7XG4gKiAgIHByZXZDb25kaXRpb246IGJvb2xlYW47XG4gKlxuICogICBjb25zdHJ1Y3Rvcih2aWV3Q29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmLCB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWYpIHtcbiAqICAgICB0aGlzLnZpZXdDb250YWluZXIgPSB2aWV3Q29udGFpbmVyO1xuICogICAgIHRoaXMudGVtcGxhdGVSZWYgPSB0ZW1wbGF0ZVJlZjtcbiAqICAgICB0aGlzLnByZXZDb25kaXRpb24gPSBudWxsO1xuICogICB9XG4gKlxuICogICBzZXQgdW5sZXNzKG5ld0NvbmRpdGlvbikge1xuICogICAgIGlmIChuZXdDb25kaXRpb24gJiYgKGlzQmxhbmsodGhpcy5wcmV2Q29uZGl0aW9uKSB8fCAhdGhpcy5wcmV2Q29uZGl0aW9uKSkge1xuICogICAgICAgdGhpcy5wcmV2Q29uZGl0aW9uID0gdHJ1ZTtcbiAqICAgICAgIHRoaXMudmlld0NvbnRhaW5lci5jbGVhcigpO1xuICogICAgIH0gZWxzZSBpZiAoIW5ld0NvbmRpdGlvbiAmJiAoaXNCbGFuayh0aGlzLnByZXZDb25kaXRpb24pIHx8IHRoaXMucHJldkNvbmRpdGlvbikpIHtcbiAqICAgICAgIHRoaXMucHJldkNvbmRpdGlvbiA9IGZhbHNlO1xuICogICAgICAgdGhpcy52aWV3Q29udGFpbmVyLmNyZWF0ZSh0aGlzLnRlbXBsYXRlUmVmKTtcbiAqICAgICB9XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqIFdlIGNhbiB0aGVuIHVzZSB0aGlzIGB1bmxlc3NgIHNlbGVjdG9yIGluIGEgdGVtcGxhdGU6XG4gKiBgYGBcbiAqIDx1bD5cbiAqICAgPGxpICp1bmxlc3M9XCJleHByXCI+PC9saT5cbiAqIDwvdWw+XG4gKiBgYGBcbiAqXG4gKiBPbmNlIHRoZSBkaXJlY3RpdmUgaW5zdGFudGlhdGVzIHRoZSBjaGlsZCB2aWV3LCB0aGUgc2hvcnRoYW5kIG5vdGF0aW9uIGZvciB0aGUgdGVtcGxhdGUgZXhwYW5kc1xuICogYW5kIHRoZSByZXN1bHQgaXM6XG4gKlxuICogYGBgXG4gKiA8dWw+XG4gKiAgIDx0ZW1wbGF0ZSBbdW5sZXNzXT1cImV4cFwiPlxuICogICAgIDxsaT48L2xpPlxuICogICA8L3RlbXBsYXRlPlxuICogICA8bGk+PC9saT5cbiAqIDwvdWw+XG4gKiBgYGBcbiAqXG4gKiBOb3RlIGFsc28gdGhhdCBhbHRob3VnaCB0aGUgYDxsaT48L2xpPmAgdGVtcGxhdGUgc3RpbGwgZXhpc3RzIGluc2lkZSB0aGUgYDx0ZW1wbGF0ZT48L3RlbXBsYXRlPmAsXG4gKiB0aGUgaW5zdGFudGlhdGVkXG4gKiB2aWV3IG9jY3VycyBvbiB0aGUgc2Vjb25kIGA8bGk+PC9saT5gIHdoaWNoIGlzIGEgc2libGluZyB0byB0aGUgYDx0ZW1wbGF0ZT5gIGVsZW1lbnQuXG4gKi9cbkBDT05TVCgpXG5leHBvcnQgY2xhc3MgRGlyZWN0aXZlTWV0YWRhdGEgZXh0ZW5kcyBJbmplY3RhYmxlTWV0YWRhdGEge1xuICAvKipcbiAgICogVGhlIENTUyBzZWxlY3RvciB0aGF0IHRyaWdnZXJzIHRoZSBpbnN0YW50aWF0aW9uIG9mIGEgZGlyZWN0aXZlLlxuICAgKlxuICAgKiBBbmd1bGFyIG9ubHkgYWxsb3dzIGRpcmVjdGl2ZXMgdG8gdHJpZ2dlciBvbiBDU1Mgc2VsZWN0b3JzIHRoYXQgZG8gbm90IGNyb3NzIGVsZW1lbnRcbiAgICogYm91bmRhcmllcy5cbiAgICpcbiAgICogYHNlbGVjdG9yYCBtYXkgYmUgZGVjbGFyZWQgYXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6XG4gICAqXG4gICAqIC0gYGVsZW1lbnQtbmFtZWA6IHNlbGVjdCBieSBlbGVtZW50IG5hbWUuXG4gICAqIC0gYC5jbGFzc2A6IHNlbGVjdCBieSBjbGFzcyBuYW1lLlxuICAgKiAtIGBbYXR0cmlidXRlXWA6IHNlbGVjdCBieSBhdHRyaWJ1dGUgbmFtZS5cbiAgICogLSBgW2F0dHJpYnV0ZT12YWx1ZV1gOiBzZWxlY3QgYnkgYXR0cmlidXRlIG5hbWUgYW5kIHZhbHVlLlxuICAgKiAtIGA6bm90KHN1Yl9zZWxlY3RvcilgOiBzZWxlY3Qgb25seSBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBtYXRjaCB0aGUgYHN1Yl9zZWxlY3RvcmAuXG4gICAqIC0gYHNlbGVjdG9yMSwgc2VsZWN0b3IyYDogc2VsZWN0IGlmIGVpdGhlciBgc2VsZWN0b3IxYCBvciBgc2VsZWN0b3IyYCBtYXRjaGVzLlxuICAgKlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZVxuICAgKlxuICAgKiBTdXBwb3NlIHdlIGhhdmUgYSBkaXJlY3RpdmUgd2l0aCBhbiBgaW5wdXRbdHlwZT10ZXh0XWAgc2VsZWN0b3IuXG4gICAqXG4gICAqIEFuZCB0aGUgZm9sbG93aW5nIEhUTUw6XG4gICAqXG4gICAqIGBgYGh0bWxcbiAgICogPGZvcm0+XG4gICAqICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCI+XG4gICAqICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiPlxuICAgKiA8Zm9ybT5cbiAgICogYGBgXG4gICAqXG4gICAqIFRoZSBkaXJlY3RpdmUgd291bGQgb25seSBiZSBpbnN0YW50aWF0ZWQgb24gdGhlIGA8aW5wdXQgdHlwZT1cInRleHRcIj5gIGVsZW1lbnQuXG4gICAqXG4gICAqL1xuICBzZWxlY3Rvcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBFbnVtZXJhdGVzIHRoZSBzZXQgb2YgZGF0YS1ib3VuZCBpbnB1dCBwcm9wZXJ0aWVzIGZvciBhIGRpcmVjdGl2ZVxuICAgKlxuICAgKiBBbmd1bGFyIGF1dG9tYXRpY2FsbHkgdXBkYXRlcyBpbnB1dCBwcm9wZXJ0aWVzIGR1cmluZyBjaGFuZ2UgZGV0ZWN0aW9uLlxuICAgKlxuICAgKiBUaGUgYGlucHV0c2AgcHJvcGVydHkgZGVmaW5lcyBhIHNldCBvZiBgZGlyZWN0aXZlUHJvcGVydHlgIHRvIGBiaW5kaW5nUHJvcGVydHlgXG4gICAqIGNvbmZpZ3VyYXRpb246XG4gICAqXG4gICAqIC0gYGRpcmVjdGl2ZVByb3BlcnR5YCBzcGVjaWZpZXMgdGhlIGNvbXBvbmVudCBwcm9wZXJ0eSB3aGVyZSB0aGUgdmFsdWUgaXMgd3JpdHRlbi5cbiAgICogLSBgYmluZGluZ1Byb3BlcnR5YCBzcGVjaWZpZXMgdGhlIERPTSBwcm9wZXJ0eSB3aGVyZSB0aGUgdmFsdWUgaXMgcmVhZCBmcm9tLlxuICAgKlxuICAgKiBXaGVuIGBiaW5kaW5nUHJvcGVydHlgIGlzIG5vdCBwcm92aWRlZCwgaXQgaXMgYXNzdW1lZCB0byBiZSBlcXVhbCB0byBgZGlyZWN0aXZlUHJvcGVydHlgLlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvaXZoZlhZP3A9cHJldmlldykpXG4gICAqXG4gICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBjcmVhdGVzIGEgY29tcG9uZW50IHdpdGggdHdvIGRhdGEtYm91bmQgcHJvcGVydGllcy5cbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBAQ29tcG9uZW50KHtcbiAgICogICBzZWxlY3RvcjogJ2JhbmstYWNjb3VudCcsXG4gICAqICAgaW5wdXRzOiBbJ2JhbmtOYW1lJywgJ2lkOiBhY2NvdW50LWlkJ10sXG4gICAqICAgdGVtcGxhdGU6IGBcbiAgICogICAgIEJhbmsgTmFtZToge3tiYW5rTmFtZX19XG4gICAqICAgICBBY2NvdW50IElkOiB7e2lkfX1cbiAgICogICBgXG4gICAqIH0pXG4gICAqIGNsYXNzIEJhbmtBY2NvdW50IHtcbiAgICogICBiYW5rTmFtZTogc3RyaW5nO1xuICAgKiAgIGlkOiBzdHJpbmc7XG4gICAqXG4gICAqICAgLy8gdGhpcyBwcm9wZXJ0eSBpcyBub3QgYm91bmQsIGFuZCB3b24ndCBiZSBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgYnkgQW5ndWxhclxuICAgKiAgIG5vcm1hbGl6ZWRCYW5rTmFtZTogc3RyaW5nO1xuICAgKiB9XG4gICAqXG4gICAqIEBDb21wb25lbnQoe1xuICAgKiAgIHNlbGVjdG9yOiAnYXBwJyxcbiAgICogICB0ZW1wbGF0ZTogYFxuICAgKiAgICAgPGJhbmstYWNjb3VudCBiYW5rLW5hbWU9XCJSQkNcIiBhY2NvdW50LWlkPVwiNDc0N1wiPjwvYmFuay1hY2NvdW50PlxuICAgKiAgIGAsXG4gICAqICAgZGlyZWN0aXZlczogW0JhbmtBY2NvdW50XVxuICAgKiB9KVxuICAgKiBjbGFzcyBBcHAge31cbiAgICpcbiAgICogYm9vdHN0cmFwKEFwcCk7XG4gICAqIGBgYFxuICAgKlxuICAgKi9cbiAgZ2V0IGlucHV0cygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIGlzUHJlc2VudCh0aGlzLl9wcm9wZXJ0aWVzKSAmJiB0aGlzLl9wcm9wZXJ0aWVzLmxlbmd0aCA+IDAgPyB0aGlzLl9wcm9wZXJ0aWVzIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0cztcbiAgfVxuICBnZXQgcHJvcGVydGllcygpOiBzdHJpbmdbXSB7IHJldHVybiB0aGlzLmlucHV0czsgfVxuICBwcml2YXRlIF9pbnB1dHM6IHN0cmluZ1tdO1xuICBwcml2YXRlIF9wcm9wZXJ0aWVzOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogRW51bWVyYXRlcyB0aGUgc2V0IG9mIGV2ZW50LWJvdW5kIG91dHB1dCBwcm9wZXJ0aWVzLlxuICAgKlxuICAgKiBXaGVuIGFuIG91dHB1dCBwcm9wZXJ0eSBlbWl0cyBhbiBldmVudCwgYW4gZXZlbnQgaGFuZGxlciBhdHRhY2hlZCB0byB0aGF0IGV2ZW50XG4gICAqIHRoZSB0ZW1wbGF0ZSBpcyBpbnZva2VkLlxuICAgKlxuICAgKiBUaGUgYG91dHB1dHNgIHByb3BlcnR5IGRlZmluZXMgYSBzZXQgb2YgYGRpcmVjdGl2ZVByb3BlcnR5YCB0byBgYmluZGluZ1Byb3BlcnR5YFxuICAgKiBjb25maWd1cmF0aW9uOlxuICAgKlxuICAgKiAtIGBkaXJlY3RpdmVQcm9wZXJ0eWAgc3BlY2lmaWVzIHRoZSBjb21wb25lbnQgcHJvcGVydHkgdGhhdCBlbWl0cyBldmVudHMuXG4gICAqIC0gYGJpbmRpbmdQcm9wZXJ0eWAgc3BlY2lmaWVzIHRoZSBET00gcHJvcGVydHkgdGhlIGV2ZW50IGhhbmRsZXIgaXMgYXR0YWNoZWQgdG8uXG4gICAqXG4gICAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9kNUNOcTc/cD1wcmV2aWV3KSlcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBARGlyZWN0aXZlKHtcbiAgICogICBzZWxlY3RvcjogJ2ludGVydmFsLWRpcicsXG4gICAqICAgb3V0cHV0czogWydldmVyeVNlY29uZCcsICdmaXZlNVNlY3M6IGV2ZXJ5Rml2ZVNlY29uZHMnXVxuICAgKiB9KVxuICAgKiBjbGFzcyBJbnRlcnZhbERpciB7XG4gICAqICAgZXZlcnlTZWNvbmQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAqICAgZml2ZTVTZWNzID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgKlxuICAgKiAgIGNvbnN0cnVjdG9yKCkge1xuICAgKiAgICAgc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy5ldmVyeVNlY29uZC5lbWl0KFwiZXZlbnRcIiksIDEwMDApO1xuICAgKiAgICAgc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy5maXZlNVNlY3MuZW1pdChcImV2ZW50XCIpLCA1MDAwKTtcbiAgICogICB9XG4gICAqIH1cbiAgICpcbiAgICogQENvbXBvbmVudCh7XG4gICAqICAgc2VsZWN0b3I6ICdhcHAnLFxuICAgKiAgIHRlbXBsYXRlOiBgXG4gICAqICAgICA8aW50ZXJ2YWwtZGlyIChldmVyeS1zZWNvbmQpPVwiZXZlcnlTZWNvbmQoKVwiIChldmVyeS1maXZlLXNlY29uZHMpPVwiZXZlcnlGaXZlU2Vjb25kcygpXCI+XG4gICAqICAgICA8L2ludGVydmFsLWRpcj5cbiAgICogICBgLFxuICAgKiAgIGRpcmVjdGl2ZXM6IFtJbnRlcnZhbERpcl1cbiAgICogfSlcbiAgICogY2xhc3MgQXBwIHtcbiAgICogICBldmVyeVNlY29uZCgpIHsgY29uc29sZS5sb2coJ3NlY29uZCcpOyB9XG4gICAqICAgZXZlcnlGaXZlU2Vjb25kcygpIHsgY29uc29sZS5sb2coJ2ZpdmUgc2Vjb25kcycpOyB9XG4gICAqIH1cbiAgICogYm9vdHN0cmFwKEFwcCk7XG4gICAqIGBgYFxuICAgKlxuICAgKi9cbiAgZ2V0IG91dHB1dHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBpc1ByZXNlbnQodGhpcy5fZXZlbnRzKSAmJiB0aGlzLl9ldmVudHMubGVuZ3RoID4gMCA/IHRoaXMuX2V2ZW50cyA6IHRoaXMuX291dHB1dHM7XG4gIH1cbiAgZ2V0IGV2ZW50cygpOiBzdHJpbmdbXSB7IHJldHVybiB0aGlzLm91dHB1dHM7IH1cbiAgcHJpdmF0ZSBfb3V0cHV0czogc3RyaW5nW107XG4gIHByaXZhdGUgX2V2ZW50czogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgdGhlIGV2ZW50cywgYWN0aW9ucywgcHJvcGVydGllcyBhbmQgYXR0cmlidXRlcyByZWxhdGVkIHRvIHRoZSBob3N0IGVsZW1lbnQuXG4gICAqXG4gICAqICMjIEhvc3QgTGlzdGVuZXJzXG4gICAqXG4gICAqIFNwZWNpZmllcyB3aGljaCBET00gZXZlbnRzIGEgZGlyZWN0aXZlIGxpc3RlbnMgdG8gdmlhIGEgc2V0IG9mIGAoZXZlbnQpYCB0byBgbWV0aG9kYFxuICAgKiBrZXktdmFsdWUgcGFpcnM6XG4gICAqXG4gICAqIC0gYGV2ZW50YDogdGhlIERPTSBldmVudCB0aGF0IHRoZSBkaXJlY3RpdmUgbGlzdGVucyB0by5cbiAgICogLSBgc3RhdGVtZW50YDogdGhlIHN0YXRlbWVudCB0byBleGVjdXRlIHdoZW4gdGhlIGV2ZW50IG9jY3Vycy5cbiAgICogSWYgdGhlIGV2YWx1YXRpb24gb2YgdGhlIHN0YXRlbWVudCByZXR1cm5zIGBmYWxzZWAsIHRoZW4gYHByZXZlbnREZWZhdWx0YGlzIGFwcGxpZWQgb24gdGhlIERPTVxuICAgKiBldmVudC5cbiAgICpcbiAgICogVG8gbGlzdGVuIHRvIGdsb2JhbCBldmVudHMsIGEgdGFyZ2V0IG11c3QgYmUgYWRkZWQgdG8gdGhlIGV2ZW50IG5hbWUuXG4gICAqIFRoZSB0YXJnZXQgY2FuIGJlIGB3aW5kb3dgLCBgZG9jdW1lbnRgIG9yIGBib2R5YC5cbiAgICpcbiAgICogV2hlbiB3cml0aW5nIGEgZGlyZWN0aXZlIGV2ZW50IGJpbmRpbmcsIHlvdSBjYW4gYWxzbyByZWZlciB0byB0aGUgJGV2ZW50IGxvY2FsIHZhcmlhYmxlLlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvRGxBNUtVP3A9cHJldmlldykpXG4gICAqXG4gICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZWNsYXJlcyBhIGRpcmVjdGl2ZSB0aGF0IGF0dGFjaGVzIGEgY2xpY2sgbGlzdGVuZXIgdG8gdGhlIGJ1dHRvbiBhbmRcbiAgICogY291bnRzIGNsaWNrcy5cbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBARGlyZWN0aXZlKHtcbiAgICogICBzZWxlY3RvcjogJ2J1dHRvbltjb3VudGluZ10nLFxuICAgKiAgIGhvc3Q6IHtcbiAgICogICAgICcoY2xpY2spJzogJ29uQ2xpY2soJGV2ZW50LnRhcmdldCknXG4gICAqICAgfVxuICAgKiB9KVxuICAgKiBjbGFzcyBDb3VudENsaWNrcyB7XG4gICAqICAgbnVtYmVyT2ZDbGlja3MgPSAwO1xuICAgKlxuICAgKiAgIG9uQ2xpY2soYnRuKSB7XG4gICAqICAgICBjb25zb2xlLmxvZyhcImJ1dHRvblwiLCBidG4sIFwibnVtYmVyIG9mIGNsaWNrczpcIiwgdGhpcy5udW1iZXJPZkNsaWNrcysrKTtcbiAgICogICB9XG4gICAqIH1cbiAgICpcbiAgICogQENvbXBvbmVudCh7XG4gICAqICAgc2VsZWN0b3I6ICdhcHAnLFxuICAgKiAgIHRlbXBsYXRlOiBgPGJ1dHRvbiBjb3VudGluZz5JbmNyZW1lbnQ8L2J1dHRvbj5gLFxuICAgKiAgIGRpcmVjdGl2ZXM6IFtDb3VudENsaWNrc11cbiAgICogfSlcbiAgICogY2xhc3MgQXBwIHt9XG4gICAqXG4gICAqIGJvb3RzdHJhcChBcHApO1xuICAgKiBgYGBcbiAgICpcbiAgICogIyMgSG9zdCBQcm9wZXJ0eSBCaW5kaW5nc1xuICAgKlxuICAgKiBTcGVjaWZpZXMgd2hpY2ggRE9NIHByb3BlcnRpZXMgYSBkaXJlY3RpdmUgdXBkYXRlcy5cbiAgICpcbiAgICogQW5ndWxhciBhdXRvbWF0aWNhbGx5IGNoZWNrcyBob3N0IHByb3BlcnR5IGJpbmRpbmdzIGR1cmluZyBjaGFuZ2UgZGV0ZWN0aW9uLlxuICAgKiBJZiBhIGJpbmRpbmcgY2hhbmdlcywgaXQgd2lsbCB1cGRhdGUgdGhlIGhvc3QgZWxlbWVudCBvZiB0aGUgZGlyZWN0aXZlLlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvZ05nMEVEP3A9cHJldmlldykpXG4gICAqXG4gICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBjcmVhdGVzIGEgZGlyZWN0aXZlIHRoYXQgc2V0cyB0aGUgYHZhbGlkYCBhbmQgYGludmFsaWRgIGNsYXNzZXNcbiAgICogb24gdGhlIERPTSBlbGVtZW50IHRoYXQgaGFzIG5nTW9kZWwgZGlyZWN0aXZlIG9uIGl0LlxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIEBEaXJlY3RpdmUoe1xuICAgKiAgIHNlbGVjdG9yOiAnW25nTW9kZWxdJyxcbiAgICogICBob3N0OiB7XG4gICAqICAgICAnW2NsYXNzLnZhbGlkXSc6ICd2YWxpZCcsXG4gICAqICAgICAnW2NsYXNzLmludmFsaWRdJzogJ2ludmFsaWQnXG4gICAqICAgfVxuICAgKiB9KVxuICAgKiBjbGFzcyBOZ01vZGVsU3RhdHVzIHtcbiAgICogICBjb25zdHJ1Y3RvcihwdWJsaWMgY29udHJvbDpOZ01vZGVsKSB7fVxuICAgKiAgIGdldCB2YWxpZCB7IHJldHVybiB0aGlzLmNvbnRyb2wudmFsaWQ7IH1cbiAgICogICBnZXQgaW52YWxpZCB7IHJldHVybiB0aGlzLmNvbnRyb2wuaW52YWxpZDsgfVxuICAgKiB9XG4gICAqXG4gICAqIEBDb21wb25lbnQoe1xuICAgKiAgIHNlbGVjdG9yOiAnYXBwJyxcbiAgICogICB0ZW1wbGF0ZTogYDxpbnB1dCBbKG5nTW9kZWwpXT1cInByb3BcIj5gLFxuICAgKiAgIGRpcmVjdGl2ZXM6IFtGT1JNX0RJUkVDVElWRVMsIE5nTW9kZWxTdGF0dXNdXG4gICAqIH0pXG4gICAqIGNsYXNzIEFwcCB7XG4gICAqICAgcHJvcDtcbiAgICogfVxuICAgKlxuICAgKiBib290c3RyYXAoQXBwKTtcbiAgICogYGBgXG4gICAqXG4gICAqICMjIEF0dHJpYnV0ZXNcbiAgICpcbiAgICogU3BlY2lmaWVzIHN0YXRpYyBhdHRyaWJ1dGVzIHRoYXQgc2hvdWxkIGJlIHByb3BhZ2F0ZWQgdG8gYSBob3N0IGVsZW1lbnQuXG4gICAqXG4gICAqICMjIyBFeGFtcGxlXG4gICAqXG4gICAqIEluIHRoaXMgZXhhbXBsZSB1c2luZyBgbXktYnV0dG9uYCBkaXJlY3RpdmUgKGV4LjogYDxkaXYgbXktYnV0dG9uPjwvZGl2PmApIG9uIGEgaG9zdCBlbGVtZW50XG4gICAqIChoZXJlOiBgPGRpdj5gICkgd2lsbCBlbnN1cmUgdGhhdCB0aGlzIGVsZW1lbnQgd2lsbCBnZXQgdGhlIFwiYnV0dG9uXCIgcm9sZS5cbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBARGlyZWN0aXZlKHtcbiAgICogICBzZWxlY3RvcjogJ1tteS1idXR0b25dJyxcbiAgICogICBob3N0OiB7XG4gICAqICAgICAncm9sZSc6ICdidXR0b24nXG4gICAqICAgfVxuICAgKiB9KVxuICAgKiBjbGFzcyBNeUJ1dHRvbiB7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBob3N0OiB7W2tleTogc3RyaW5nXTogc3RyaW5nfTtcblxuICAvKipcbiAgICogRGVmaW5lcyB0aGUgc2V0IG9mIGluamVjdGFibGUgb2JqZWN0cyB0aGF0IGFyZSB2aXNpYmxlIHRvIGEgRGlyZWN0aXZlIGFuZCBpdHMgbGlnaHQgRE9NXG4gICAqIGNoaWxkcmVuLlxuICAgKlxuICAgKiAjIyBTaW1wbGUgRXhhbXBsZVxuICAgKlxuICAgKiBIZXJlIGlzIGFuIGV4YW1wbGUgb2YgYSBjbGFzcyB0aGF0IGNhbiBiZSBpbmplY3RlZDpcbiAgICpcbiAgICogYGBgXG4gICAqIGNsYXNzIEdyZWV0ZXIge1xuICAgKiAgICBncmVldChuYW1lOnN0cmluZykge1xuICAgKiAgICAgIHJldHVybiAnSGVsbG8gJyArIG5hbWUgKyAnISc7XG4gICAqICAgIH1cbiAgICogfVxuICAgKlxuICAgKiBARGlyZWN0aXZlKHtcbiAgICogICBzZWxlY3RvcjogJ2dyZWV0JyxcbiAgICogICBiaW5kaW5nczogW1xuICAgKiAgICAgR3JlZXRlclxuICAgKiAgIF1cbiAgICogfSlcbiAgICogY2xhc3MgSGVsbG9Xb3JsZCB7XG4gICAqICAgZ3JlZXRlcjpHcmVldGVyO1xuICAgKlxuICAgKiAgIGNvbnN0cnVjdG9yKGdyZWV0ZXI6R3JlZXRlcikge1xuICAgKiAgICAgdGhpcy5ncmVldGVyID0gZ3JlZXRlcjtcbiAgICogICB9XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBnZXQgcHJvdmlkZXJzKCk6IGFueVtdIHtcbiAgICByZXR1cm4gaXNQcmVzZW50KHRoaXMuX2JpbmRpbmdzKSAmJiB0aGlzLl9iaW5kaW5ncy5sZW5ndGggPiAwID8gdGhpcy5fYmluZGluZ3MgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wcm92aWRlcnM7XG4gIH1cbiAgLyoqIEBkZXByZWNhdGVkICovXG4gIGdldCBiaW5kaW5ncygpOiBhbnlbXSB7IHJldHVybiB0aGlzLnByb3ZpZGVyczsgfVxuICBwcml2YXRlIF9wcm92aWRlcnM6IGFueVtdO1xuICBwcml2YXRlIF9iaW5kaW5nczogYW55W107XG5cbiAgLyoqXG4gICAqIERlZmluZXMgdGhlIG5hbWUgdGhhdCBjYW4gYmUgdXNlZCBpbiB0aGUgdGVtcGxhdGUgdG8gYXNzaWduIHRoaXMgZGlyZWN0aXZlIHRvIGEgdmFyaWFibGUuXG4gICAqXG4gICAqICMjIFNpbXBsZSBFeGFtcGxlXG4gICAqXG4gICAqIGBgYFxuICAgKiBARGlyZWN0aXZlKHtcbiAgICogICBzZWxlY3RvcjogJ2NoaWxkLWRpcicsXG4gICAqICAgZXhwb3J0QXM6ICdjaGlsZCdcbiAgICogfSlcbiAgICogY2xhc3MgQ2hpbGREaXIge1xuICAgKiB9XG4gICAqXG4gICAqIEBDb21wb25lbnQoe1xuICAgKiAgIHNlbGVjdG9yOiAnbWFpbicsXG4gICAqICAgdGVtcGxhdGU6IGA8Y2hpbGQtZGlyICNjPVwiY2hpbGRcIj48L2NoaWxkLWRpcj5gLFxuICAgKiAgIGRpcmVjdGl2ZXM6IFtDaGlsZERpcl1cbiAgICogfSlcbiAgICogY2xhc3MgTWFpbkNvbXBvbmVudCB7XG4gICAqIH1cbiAgICpcbiAgICogYGBgXG4gICAqL1xuICBleHBvcnRBczogc3RyaW5nO1xuXG4gIC8vIFRPRE86IGFkZCBhbiBleGFtcGxlIGFmdGVyIENvbnRlbnRDaGlsZHJlbiBhbmQgVmlld0NoaWxkcmVuIGFyZSBpbiBtYXN0ZXJcbiAgLyoqXG4gICAqIENvbmZpZ3VyZXMgdGhlIHF1ZXJpZXMgdGhhdCB3aWxsIGJlIGluamVjdGVkIGludG8gdGhlIGRpcmVjdGl2ZS5cbiAgICpcbiAgICogQ29udGVudCBxdWVyaWVzIGFyZSBzZXQgYmVmb3JlIHRoZSBgbmdBZnRlckNvbnRlbnRJbml0YCBjYWxsYmFjayBpcyBjYWxsZWQuXG4gICAqIFZpZXcgcXVlcmllcyBhcmUgc2V0IGJlZm9yZSB0aGUgYG5nQWZ0ZXJWaWV3SW5pdGAgY2FsbGJhY2sgaXMgY2FsbGVkLlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZVxuICAgKlxuICAgKiBgYGBcbiAgICogQENvbXBvbmVudCh7XG4gICAqICAgc2VsZWN0b3I6ICdzb21lRGlyJyxcbiAgICogICBxdWVyaWVzOiB7XG4gICAqICAgICBjb250ZW50Q2hpbGRyZW46IG5ldyBDb250ZW50Q2hpbGRyZW4oQ2hpbGREaXJlY3RpdmUpLFxuICAgKiAgICAgdmlld0NoaWxkcmVuOiBuZXcgVmlld0NoaWxkcmVuKENoaWxkRGlyZWN0aXZlKVxuICAgKiAgIH0sXG4gICAqICAgdGVtcGxhdGU6ICc8Y2hpbGQtZGlyZWN0aXZlPjwvY2hpbGQtZGlyZWN0aXZlPicsXG4gICAqICAgZGlyZWN0aXZlczogW0NoaWxkRGlyZWN0aXZlXVxuICAgKiB9KVxuICAgKiBjbGFzcyBTb21lRGlyIHtcbiAgICogICBjb250ZW50Q2hpbGRyZW46IFF1ZXJ5TGlzdDxDaGlsZERpcmVjdGl2ZT4sXG4gICAqICAgdmlld0NoaWxkcmVuOiBRdWVyeUxpc3Q8Q2hpbGREaXJlY3RpdmU+XG4gICAqXG4gICAqICAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgKiAgICAgLy8gY29udGVudENoaWxkcmVuIGlzIHNldFxuICAgKiAgIH1cbiAgICpcbiAgICogICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAqICAgICAvLyB2aWV3Q2hpbGRyZW4gaXMgc2V0XG4gICAqICAgfVxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgcXVlcmllczoge1trZXk6IHN0cmluZ106IGFueX07XG5cbiAgY29uc3RydWN0b3Ioe3NlbGVjdG9yLCBpbnB1dHMsIG91dHB1dHMsIHByb3BlcnRpZXMsIGV2ZW50cywgaG9zdCwgYmluZGluZ3MsIHByb3ZpZGVycywgZXhwb3J0QXMsXG4gICAgICAgICAgICAgICBxdWVyaWVzfToge1xuICAgIHNlbGVjdG9yPzogc3RyaW5nLFxuICAgIGlucHV0cz86IHN0cmluZ1tdLFxuICAgIG91dHB1dHM/OiBzdHJpbmdbXSxcbiAgICBwcm9wZXJ0aWVzPzogc3RyaW5nW10sXG4gICAgZXZlbnRzPzogc3RyaW5nW10sXG4gICAgaG9zdD86IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9LFxuICAgIHByb3ZpZGVycz86IGFueVtdLFxuICAgIC8qKiBAZGVwcmVjYXRlZCAqLyBiaW5kaW5ncz86IGFueVtdLFxuICAgIGV4cG9ydEFzPzogc3RyaW5nLFxuICAgIHF1ZXJpZXM/OiB7W2tleTogc3RyaW5nXTogYW55fVxuICB9ID0ge30pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICB0aGlzLl9pbnB1dHMgPSBpbnB1dHM7XG4gICAgdGhpcy5fcHJvcGVydGllcyA9IHByb3BlcnRpZXM7XG4gICAgdGhpcy5fb3V0cHV0cyA9IG91dHB1dHM7XG4gICAgdGhpcy5fZXZlbnRzID0gZXZlbnRzO1xuICAgIHRoaXMuaG9zdCA9IGhvc3Q7XG4gICAgdGhpcy5leHBvcnRBcyA9IGV4cG9ydEFzO1xuICAgIHRoaXMucXVlcmllcyA9IHF1ZXJpZXM7XG4gICAgdGhpcy5fcHJvdmlkZXJzID0gcHJvdmlkZXJzO1xuICAgIHRoaXMuX2JpbmRpbmdzID0gYmluZGluZ3M7XG4gIH1cbn1cblxuLyoqXG4gKiBEZWNsYXJlIHJldXNhYmxlIFVJIGJ1aWxkaW5nIGJsb2NrcyBmb3IgYW4gYXBwbGljYXRpb24uXG4gKlxuICogRWFjaCBBbmd1bGFyIGNvbXBvbmVudCByZXF1aXJlcyBhIHNpbmdsZSBgQENvbXBvbmVudGAgYW5ub3RhdGlvbi4gVGhlXG4gKiBgQENvbXBvbmVudGBcbiAqIGFubm90YXRpb24gc3BlY2lmaWVzIHdoZW4gYSBjb21wb25lbnQgaXMgaW5zdGFudGlhdGVkLCBhbmQgd2hpY2ggcHJvcGVydGllcyBhbmQgaG9zdExpc3RlbmVycyBpdFxuICogYmluZHMgdG8uXG4gKlxuICogV2hlbiBhIGNvbXBvbmVudCBpcyBpbnN0YW50aWF0ZWQsIEFuZ3VsYXJcbiAqIC0gY3JlYXRlcyBhIHNoYWRvdyBET00gZm9yIHRoZSBjb21wb25lbnQuXG4gKiAtIGxvYWRzIHRoZSBzZWxlY3RlZCB0ZW1wbGF0ZSBpbnRvIHRoZSBzaGFkb3cgRE9NLlxuICogLSBjcmVhdGVzIGFsbCB0aGUgaW5qZWN0YWJsZSBvYmplY3RzIGNvbmZpZ3VyZWQgd2l0aCBgcHJvdmlkZXJzYCBhbmQgYHZpZXdQcm92aWRlcnNgLlxuICpcbiAqIEFsbCB0ZW1wbGF0ZSBleHByZXNzaW9ucyBhbmQgc3RhdGVtZW50cyBhcmUgdGhlbiBldmFsdWF0ZWQgYWdhaW5zdCB0aGUgY29tcG9uZW50IGluc3RhbmNlLlxuICpcbiAqIEZvciBkZXRhaWxzIG9uIHRoZSBgQFZpZXdgIGFubm90YXRpb24sIHNlZSB7QGxpbmsgVmlld01ldGFkYXRhfS5cbiAqXG4gKiAjIyBMaWZlY3ljbGUgaG9va3NcbiAqXG4gKiBXaGVuIHRoZSBjb21wb25lbnQgY2xhc3MgaW1wbGVtZW50cyBzb21lIHtAbGluayBhbmd1bGFyMi9saWZlY3ljbGVfaG9va3N9IHRoZSBjYWxsYmFja3MgYXJlXG4gKiBjYWxsZWQgYnkgdGhlIGNoYW5nZSBkZXRlY3Rpb24gYXQgZGVmaW5lZCBwb2ludHMgaW4gdGltZSBkdXJpbmcgdGhlIGxpZmUgb2YgdGhlIGNvbXBvbmVudC5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIHtAZXhhbXBsZSBjb3JlL3RzL21ldGFkYXRhL21ldGFkYXRhLnRzIHJlZ2lvbj0nY29tcG9uZW50J31cbiAqL1xuQENPTlNUKClcbmV4cG9ydCBjbGFzcyBDb21wb25lbnRNZXRhZGF0YSBleHRlbmRzIERpcmVjdGl2ZU1ldGFkYXRhIHtcbiAgLyoqXG4gICAqIERlZmluZXMgdGhlIHVzZWQgY2hhbmdlIGRldGVjdGlvbiBzdHJhdGVneS5cbiAgICpcbiAgICogV2hlbiBhIGNvbXBvbmVudCBpcyBpbnN0YW50aWF0ZWQsIEFuZ3VsYXIgY3JlYXRlcyBhIGNoYW5nZSBkZXRlY3Rvciwgd2hpY2ggaXMgcmVzcG9uc2libGUgZm9yXG4gICAqIHByb3BhZ2F0aW5nIHRoZSBjb21wb25lbnQncyBiaW5kaW5ncy5cbiAgICpcbiAgICogVGhlIGBjaGFuZ2VEZXRlY3Rpb25gIHByb3BlcnR5IGRlZmluZXMsIHdoZXRoZXIgdGhlIGNoYW5nZSBkZXRlY3Rpb24gd2lsbCBiZSBjaGVja2VkIGV2ZXJ5IHRpbWVcbiAgICogb3Igb25seSB3aGVuIHRoZSBjb21wb25lbnQgdGVsbHMgaXQgdG8gZG8gc28uXG4gICAqL1xuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5O1xuXG4gIC8qKlxuICAgKiBEZWZpbmVzIHRoZSBzZXQgb2YgaW5qZWN0YWJsZSBvYmplY3RzIHRoYXQgYXJlIHZpc2libGUgdG8gaXRzIHZpZXcgRE9NIGNoaWxkcmVuLlxuICAgKlxuICAgKiAjIyBTaW1wbGUgRXhhbXBsZVxuICAgKlxuICAgKiBIZXJlIGlzIGFuIGV4YW1wbGUgb2YgYSBjbGFzcyB0aGF0IGNhbiBiZSBpbmplY3RlZDpcbiAgICpcbiAgICogYGBgXG4gICAqIGNsYXNzIEdyZWV0ZXIge1xuICAgKiAgICBncmVldChuYW1lOnN0cmluZykge1xuICAgKiAgICAgIHJldHVybiAnSGVsbG8gJyArIG5hbWUgKyAnISc7XG4gICAqICAgIH1cbiAgICogfVxuICAgKlxuICAgKiBARGlyZWN0aXZlKHtcbiAgICogICBzZWxlY3RvcjogJ25lZWRzLWdyZWV0ZXInXG4gICAqIH0pXG4gICAqIGNsYXNzIE5lZWRzR3JlZXRlciB7XG4gICAqICAgZ3JlZXRlcjpHcmVldGVyO1xuICAgKlxuICAgKiAgIGNvbnN0cnVjdG9yKGdyZWV0ZXI6R3JlZXRlcikge1xuICAgKiAgICAgdGhpcy5ncmVldGVyID0gZ3JlZXRlcjtcbiAgICogICB9XG4gICAqIH1cbiAgICpcbiAgICogQENvbXBvbmVudCh7XG4gICAqICAgc2VsZWN0b3I6ICdncmVldCcsXG4gICAqICAgdmlld1Byb3ZpZGVyczogW1xuICAgKiAgICAgR3JlZXRlclxuICAgKiAgIF0sXG4gICAqICAgdGVtcGxhdGU6IGA8bmVlZHMtZ3JlZXRlcj48L25lZWRzLWdyZWV0ZXI+YCxcbiAgICogICBkaXJlY3RpdmVzOiBbTmVlZHNHcmVldGVyXVxuICAgKiB9KVxuICAgKiBjbGFzcyBIZWxsb1dvcmxkIHtcbiAgICogfVxuICAgKlxuICAgKiBgYGBcbiAgICovXG4gIGdldCB2aWV3UHJvdmlkZXJzKCk6IGFueVtdIHtcbiAgICByZXR1cm4gaXNQcmVzZW50KHRoaXMuX3ZpZXdCaW5kaW5ncykgJiYgdGhpcy5fdmlld0JpbmRpbmdzLmxlbmd0aCA+IDAgPyB0aGlzLl92aWV3QmluZGluZ3MgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdQcm92aWRlcnM7XG4gIH1cbiAgZ2V0IHZpZXdCaW5kaW5ncygpOiBhbnlbXSB7IHJldHVybiB0aGlzLnZpZXdQcm92aWRlcnM7IH1cbiAgcHJpdmF0ZSBfdmlld1Byb3ZpZGVyczogYW55W107XG4gIHByaXZhdGUgX3ZpZXdCaW5kaW5nczogYW55W107XG5cbiAgLyoqXG4gICAqIFRoZSBtb2R1bGUgaWQgb2YgdGhlIG1vZHVsZSB0aGF0IGNvbnRhaW5zIHRoZSBjb21wb25lbnQuXG4gICAqIE5lZWRlZCB0byBiZSBhYmxlIHRvIHJlc29sdmUgcmVsYXRpdmUgdXJscyBmb3IgdGVtcGxhdGVzIGFuZCBzdHlsZXMuXG4gICAqIEluIERhcnQsIHRoaXMgY2FuIGJlIGRldGVybWluZWQgYXV0b21hdGljYWxseSBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSBzZXQuXG4gICAqIEluIENvbW1vbkpTLCB0aGlzIGNhbiBhbHdheXMgYmUgc2V0IHRvIGBtb2R1bGUuaWRgLlxuICAgKlxuICAgKiAjIyBTaW1wbGUgRXhhbXBsZVxuICAgKlxuICAgKiBgYGBcbiAgICogQERpcmVjdGl2ZSh7XG4gICAqICAgc2VsZWN0b3I6ICdzb21lRGlyJyxcbiAgICogICBtb2R1bGVJZDogbW9kdWxlLmlkXG4gICAqIH0pXG4gICAqIGNsYXNzIFNvbWVEaXIge1xuICAgKiB9XG4gICAqXG4gICAqIGBgYFxuICAgKi9cbiAgbW9kdWxlSWQ6IHN0cmluZztcblxuICB0ZW1wbGF0ZVVybDogc3RyaW5nO1xuXG4gIHRlbXBsYXRlOiBzdHJpbmc7XG5cbiAgc3R5bGVVcmxzOiBzdHJpbmdbXTtcblxuICBzdHlsZXM6IHN0cmluZ1tdO1xuXG4gIGRpcmVjdGl2ZXM6IEFycmF5PFR5cGUgfCBhbnlbXT47XG5cbiAgcGlwZXM6IEFycmF5PFR5cGUgfCBhbnlbXT47XG5cbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb247XG5cbiAgY29uc3RydWN0b3Ioe3NlbGVjdG9yLCBpbnB1dHMsIG91dHB1dHMsIHByb3BlcnRpZXMsIGV2ZW50cywgaG9zdCwgZXhwb3J0QXMsIG1vZHVsZUlkLCBiaW5kaW5ncyxcbiAgICAgICAgICAgICAgIHByb3ZpZGVycywgdmlld0JpbmRpbmdzLCB2aWV3UHJvdmlkZXJzLFxuICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uID0gQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuRGVmYXVsdCwgcXVlcmllcywgdGVtcGxhdGVVcmwsIHRlbXBsYXRlLFxuICAgICAgICAgICAgICAgc3R5bGVVcmxzLCBzdHlsZXMsIGRpcmVjdGl2ZXMsIHBpcGVzLCBlbmNhcHN1bGF0aW9ufToge1xuICAgIHNlbGVjdG9yPzogc3RyaW5nLFxuICAgIGlucHV0cz86IHN0cmluZ1tdLFxuICAgIG91dHB1dHM/OiBzdHJpbmdbXSxcbiAgICBwcm9wZXJ0aWVzPzogc3RyaW5nW10sXG4gICAgZXZlbnRzPzogc3RyaW5nW10sXG4gICAgaG9zdD86IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9LFxuICAgIC8qKiBAZGVwcmVjYXRlZCAqLyBiaW5kaW5ncz86IGFueVtdLFxuICAgIHByb3ZpZGVycz86IGFueVtdLFxuICAgIGV4cG9ydEFzPzogc3RyaW5nLFxuICAgIG1vZHVsZUlkPzogc3RyaW5nLFxuICAgIC8qKiBAZGVwcmVjYXRlZCAqLyB2aWV3QmluZGluZ3M/OiBhbnlbXSxcbiAgICB2aWV3UHJvdmlkZXJzPzogYW55W10sXG4gICAgcXVlcmllcz86IHtba2V5OiBzdHJpbmddOiBhbnl9LFxuICAgIGNoYW5nZURldGVjdGlvbj86IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIHRlbXBsYXRlVXJsPzogc3RyaW5nLFxuICAgIHRlbXBsYXRlPzogc3RyaW5nLFxuICAgIHN0eWxlVXJscz86IHN0cmluZ1tdLFxuICAgIHN0eWxlcz86IHN0cmluZ1tdLFxuICAgIGRpcmVjdGl2ZXM/OiBBcnJheTxUeXBlIHwgYW55W10+LFxuICAgIHBpcGVzPzogQXJyYXk8VHlwZSB8IGFueVtdPixcbiAgICBlbmNhcHN1bGF0aW9uPzogVmlld0VuY2Fwc3VsYXRpb25cbiAgfSA9IHt9KSB7XG4gICAgc3VwZXIoe1xuICAgICAgc2VsZWN0b3I6IHNlbGVjdG9yLFxuICAgICAgaW5wdXRzOiBpbnB1dHMsXG4gICAgICBvdXRwdXRzOiBvdXRwdXRzLFxuICAgICAgcHJvcGVydGllczogcHJvcGVydGllcyxcbiAgICAgIGV2ZW50czogZXZlbnRzLFxuICAgICAgaG9zdDogaG9zdCxcbiAgICAgIGV4cG9ydEFzOiBleHBvcnRBcyxcbiAgICAgIGJpbmRpbmdzOiBiaW5kaW5ncyxcbiAgICAgIHByb3ZpZGVyczogcHJvdmlkZXJzLFxuICAgICAgcXVlcmllczogcXVlcmllc1xuICAgIH0pO1xuXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rpb24gPSBjaGFuZ2VEZXRlY3Rpb247XG4gICAgdGhpcy5fdmlld1Byb3ZpZGVycyA9IHZpZXdQcm92aWRlcnM7XG4gICAgdGhpcy5fdmlld0JpbmRpbmdzID0gdmlld0JpbmRpbmdzO1xuICAgIHRoaXMudGVtcGxhdGVVcmwgPSB0ZW1wbGF0ZVVybDtcbiAgICB0aGlzLnRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgdGhpcy5zdHlsZVVybHMgPSBzdHlsZVVybHM7XG4gICAgdGhpcy5zdHlsZXMgPSBzdHlsZXM7XG4gICAgdGhpcy5kaXJlY3RpdmVzID0gZGlyZWN0aXZlcztcbiAgICB0aGlzLnBpcGVzID0gcGlwZXM7XG4gICAgdGhpcy5lbmNhcHN1bGF0aW9uID0gZW5jYXBzdWxhdGlvbjtcbiAgICB0aGlzLm1vZHVsZUlkID0gbW9kdWxlSWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBEZWNsYXJlIHJldXNhYmxlIHBpcGUgZnVuY3Rpb24uXG4gKlxuICogQSBcInB1cmVcIiBwaXBlIGlzIG9ubHkgcmUtZXZhbHVhdGVkIHdoZW4gZWl0aGVyIHRoZSBpbnB1dCBvciBhbnkgb2YgdGhlIGFyZ3VtZW50cyBjaGFuZ2UuXG4gKlxuICogV2hlbiBub3Qgc3BlY2lmaWVkLCBwaXBlcyBkZWZhdWx0IHRvIGJlaW5nIHB1cmUuXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiB7QGV4YW1wbGUgY29yZS90cy9tZXRhZGF0YS9tZXRhZGF0YS50cyByZWdpb249J3BpcGUnfVxuICovXG5AQ09OU1QoKVxuZXhwb3J0IGNsYXNzIFBpcGVNZXRhZGF0YSBleHRlbmRzIEluamVjdGFibGVNZXRhZGF0YSB7XG4gIG5hbWU6IHN0cmluZztcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcHVyZTogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3Rvcih7bmFtZSwgcHVyZX06IHtuYW1lOiBzdHJpbmcsIHB1cmU/OiBib29sZWFufSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLl9wdXJlID0gcHVyZTtcbiAgfVxuXG4gIGdldCBwdXJlKCk6IGJvb2xlYW4geyByZXR1cm4gaXNQcmVzZW50KHRoaXMuX3B1cmUpID8gdGhpcy5fcHVyZSA6IHRydWU7IH1cbn1cblxuLyoqXG4gKiBEZWNsYXJlcyBhIGRhdGEtYm91bmQgaW5wdXQgcHJvcGVydHkuXG4gKlxuICogQW5ndWxhciBhdXRvbWF0aWNhbGx5IHVwZGF0ZXMgZGF0YS1ib3VuZCBwcm9wZXJ0aWVzIGR1cmluZyBjaGFuZ2UgZGV0ZWN0aW9uLlxuICpcbiAqIGBJbnB1dE1ldGFkYXRhYCB0YWtlcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgdGhhdCBzcGVjaWZpZXMgdGhlIG5hbWVcbiAqIHVzZWQgd2hlbiBpbnN0YW50aWF0aW5nIGEgY29tcG9uZW50IGluIHRoZSB0ZW1wbGF0ZS4gV2hlbiBub3QgcHJvdmlkZWQsXG4gKiB0aGUgbmFtZSBvZiB0aGUgZGVjb3JhdGVkIHByb3BlcnR5IGlzIHVzZWQuXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgY3JlYXRlcyBhIGNvbXBvbmVudCB3aXRoIHR3byBpbnB1dCBwcm9wZXJ0aWVzLlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIEBDb21wb25lbnQoe1xuICogICBzZWxlY3RvcjogJ2JhbmstYWNjb3VudCcsXG4gKiAgIHRlbXBsYXRlOiBgXG4gKiAgICAgQmFuayBOYW1lOiB7e2JhbmtOYW1lfX1cbiAqICAgICBBY2NvdW50IElkOiB7e2lkfX1cbiAqICAgYFxuICogfSlcbiAqIGNsYXNzIEJhbmtBY2NvdW50IHtcbiAqICAgQElucHV0KCkgYmFua05hbWU6IHN0cmluZztcbiAqICAgQElucHV0KCdhY2NvdW50LWlkJykgaWQ6IHN0cmluZztcbiAqXG4gKiAgIC8vIHRoaXMgcHJvcGVydHkgaXMgbm90IGJvdW5kLCBhbmQgd29uJ3QgYmUgYXV0b21hdGljYWxseSB1cGRhdGVkIGJ5IEFuZ3VsYXJcbiAqICAgbm9ybWFsaXplZEJhbmtOYW1lOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAnYXBwJyxcbiAqICAgdGVtcGxhdGU6IGBcbiAqICAgICA8YmFuay1hY2NvdW50IGJhbmstbmFtZT1cIlJCQ1wiIGFjY291bnQtaWQ9XCI0NzQ3XCI+PC9iYW5rLWFjY291bnQ+XG4gKiAgIGAsXG4gKiAgIGRpcmVjdGl2ZXM6IFtCYW5rQWNjb3VudF1cbiAqIH0pXG4gKiBjbGFzcyBBcHAge31cbiAqXG4gKiBib290c3RyYXAoQXBwKTtcbiAqIGBgYFxuICovXG5AQ09OU1QoKVxuZXhwb3J0IGNsYXNzIElucHV0TWV0YWRhdGEge1xuICBjb25zdHJ1Y3RvcihcbiAgICAgIC8qKlxuICAgICAgICogTmFtZSB1c2VkIHdoZW4gaW5zdGFudGlhdGluZyBhIGNvbXBvbmVudCBpbiB0aGUgdGVtbGF0ZS5cbiAgICAgICAqL1xuICAgICAgcHVibGljIGJpbmRpbmdQcm9wZXJ0eU5hbWU/OiBzdHJpbmcpIHt9XG59XG5cbi8qKlxuICogRGVjbGFyZXMgYW4gZXZlbnQtYm91bmQgb3V0cHV0IHByb3BlcnR5LlxuICpcbiAqIFdoZW4gYW4gb3V0cHV0IHByb3BlcnR5IGVtaXRzIGFuIGV2ZW50LCBhbiBldmVudCBoYW5kbGVyIGF0dGFjaGVkIHRvIHRoYXQgZXZlbnRcbiAqIHRoZSB0ZW1wbGF0ZSBpcyBpbnZva2VkLlxuICpcbiAqIGBPdXRwdXRNZXRhZGF0YWAgdGFrZXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIHRoYXQgc3BlY2lmaWVzIHRoZSBuYW1lXG4gKiB1c2VkIHdoZW4gaW5zdGFudGlhdGluZyBhIGNvbXBvbmVudCBpbiB0aGUgdGVtcGxhdGUuIFdoZW4gbm90IHByb3ZpZGVkLFxuICogdGhlIG5hbWUgb2YgdGhlIGRlY29yYXRlZCBwcm9wZXJ0eSBpcyB1c2VkLlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogQERpcmVjdGl2ZSh7XG4gKiAgIHNlbGVjdG9yOiAnaW50ZXJ2YWwtZGlyJyxcbiAqIH0pXG4gKiBjbGFzcyBJbnRlcnZhbERpciB7XG4gKiAgIEBPdXRwdXQoKSBldmVyeVNlY29uZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAqICAgQE91dHB1dCgnZXZlcnlGaXZlU2Vjb25kcycpIGZpdmU1U2VjcyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAqXG4gKiAgIGNvbnN0cnVjdG9yKCkge1xuICogICAgIHNldEludGVydmFsKCgpID0+IHRoaXMuZXZlcnlTZWNvbmQuZW1pdChcImV2ZW50XCIpLCAxMDAwKTtcbiAqICAgICBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLmZpdmU1U2Vjcy5lbWl0KFwiZXZlbnRcIiksIDUwMDApO1xuICogICB9XG4gKiB9XG4gKlxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAnYXBwJyxcbiAqICAgdGVtcGxhdGU6IGBcbiAqICAgICA8aW50ZXJ2YWwtZGlyIChldmVyeS1zZWNvbmQpPVwiZXZlcnlTZWNvbmQoKVwiIChldmVyeS1maXZlLXNlY29uZHMpPVwiZXZlcnlGaXZlU2Vjb25kcygpXCI+XG4gKiAgICAgPC9pbnRlcnZhbC1kaXI+XG4gKiAgIGAsXG4gKiAgIGRpcmVjdGl2ZXM6IFtJbnRlcnZhbERpcl1cbiAqIH0pXG4gKiBjbGFzcyBBcHAge1xuICogICBldmVyeVNlY29uZCgpIHsgY29uc29sZS5sb2coJ3NlY29uZCcpOyB9XG4gKiAgIGV2ZXJ5Rml2ZVNlY29uZHMoKSB7IGNvbnNvbGUubG9nKCdmaXZlIHNlY29uZHMnKTsgfVxuICogfVxuICogYm9vdHN0cmFwKEFwcCk7XG4gKiBgYGBcbiAqL1xuQENPTlNUKClcbmV4cG9ydCBjbGFzcyBPdXRwdXRNZXRhZGF0YSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBiaW5kaW5nUHJvcGVydHlOYW1lPzogc3RyaW5nKSB7fVxufVxuXG4vKipcbiAqIERlY2xhcmVzIGEgaG9zdCBwcm9wZXJ0eSBiaW5kaW5nLlxuICpcbiAqIEFuZ3VsYXIgYXV0b21hdGljYWxseSBjaGVja3MgaG9zdCBwcm9wZXJ0eSBiaW5kaW5ncyBkdXJpbmcgY2hhbmdlIGRldGVjdGlvbi5cbiAqIElmIGEgYmluZGluZyBjaGFuZ2VzLCBpdCB3aWxsIHVwZGF0ZSB0aGUgaG9zdCBlbGVtZW50IG9mIHRoZSBkaXJlY3RpdmUuXG4gKlxuICogYEhvc3RCaW5kaW5nTWV0YWRhdGFgIHRha2VzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciB0aGF0IHNwZWNpZmllcyB0aGUgcHJvcGVydHlcbiAqIG5hbWUgb2YgdGhlIGhvc3QgZWxlbWVudCB0aGF0IHdpbGwgYmUgdXBkYXRlZC4gV2hlbiBub3QgcHJvdmlkZWQsXG4gKiB0aGUgY2xhc3MgcHJvcGVydHkgbmFtZSBpcyB1c2VkLlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogVGhlIGZvbGxvd2luZyBleGFtcGxlIGNyZWF0ZXMgYSBkaXJlY3RpdmUgdGhhdCBzZXRzIHRoZSBgdmFsaWRgIGFuZCBgaW52YWxpZGAgY2xhc3Nlc1xuICogb24gdGhlIERPTSBlbGVtZW50IHRoYXQgaGFzIG5nTW9kZWwgZGlyZWN0aXZlIG9uIGl0LlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIEBEaXJlY3RpdmUoe3NlbGVjdG9yOiAnW25nTW9kZWxdJ30pXG4gKiBjbGFzcyBOZ01vZGVsU3RhdHVzIHtcbiAqICAgY29uc3RydWN0b3IocHVibGljIGNvbnRyb2w6TmdNb2RlbCkge31cbiAqICAgQEhvc3RCaW5kaW5nKCdbY2xhc3MudmFsaWRdJykgZ2V0IHZhbGlkIHsgcmV0dXJuIHRoaXMuY29udHJvbC52YWxpZDsgfVxuICogICBASG9zdEJpbmRpbmcoJ1tjbGFzcy5pbnZhbGlkXScpIGdldCBpbnZhbGlkIHsgcmV0dXJuIHRoaXMuY29udHJvbC5pbnZhbGlkOyB9XG4gKiB9XG4gKlxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAnYXBwJyxcbiAqICAgdGVtcGxhdGU6IGA8aW5wdXQgWyhuZ01vZGVsKV09XCJwcm9wXCI+YCxcbiAqICAgZGlyZWN0aXZlczogW0ZPUk1fRElSRUNUSVZFUywgTmdNb2RlbFN0YXR1c11cbiAqIH0pXG4gKiBjbGFzcyBBcHAge1xuICogICBwcm9wO1xuICogfVxuICpcbiAqIGJvb3RzdHJhcChBcHApO1xuICogYGBgXG4gKi9cbkBDT05TVCgpXG5leHBvcnQgY2xhc3MgSG9zdEJpbmRpbmdNZXRhZGF0YSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBob3N0UHJvcGVydHlOYW1lPzogc3RyaW5nKSB7fVxufVxuXG4vKipcbiAqIERlY2xhcmVzIGEgaG9zdCBsaXN0ZW5lci5cbiAqXG4gKiBBbmd1bGFyIHdpbGwgaW52b2tlIHRoZSBkZWNvcmF0ZWQgbWV0aG9kIHdoZW4gdGhlIGhvc3QgZWxlbWVudCBlbWl0cyB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuICpcbiAqIElmIHRoZSBkZWNvcmF0ZWQgbWV0aG9kIHJldHVybnMgYGZhbHNlYCwgdGhlbiBgcHJldmVudERlZmF1bHRgIGlzIGFwcGxpZWQgb24gdGhlIERPTVxuICogZXZlbnQuXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVjbGFyZXMgYSBkaXJlY3RpdmUgdGhhdCBhdHRhY2hlcyBhIGNsaWNrIGxpc3RlbmVyIHRvIHRoZSBidXR0b24gYW5kXG4gKiBjb3VudHMgY2xpY2tzLlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIEBEaXJlY3RpdmUoe3NlbGVjdG9yOiAnYnV0dG9uW2NvdW50aW5nXSd9KVxuICogY2xhc3MgQ291bnRDbGlja3Mge1xuICogICBudW1iZXJPZkNsaWNrcyA9IDA7XG4gKlxuICogICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50LnRhcmdldCddKVxuICogICBvbkNsaWNrKGJ0bikge1xuICogICAgIGNvbnNvbGUubG9nKFwiYnV0dG9uXCIsIGJ0biwgXCJudW1iZXIgb2YgY2xpY2tzOlwiLCB0aGlzLm51bWJlck9mQ2xpY2tzKyspO1xuICogICB9XG4gKiB9XG4gKlxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAnYXBwJyxcbiAqICAgdGVtcGxhdGU6IGA8YnV0dG9uIGNvdW50aW5nPkluY3JlbWVudDwvYnV0dG9uPmAsXG4gKiAgIGRpcmVjdGl2ZXM6IFtDb3VudENsaWNrc11cbiAqIH0pXG4gKiBjbGFzcyBBcHAge31cbiAqXG4gKiBib290c3RyYXAoQXBwKTtcbiAqIGBgYFxuICovXG5AQ09OU1QoKVxuZXhwb3J0IGNsYXNzIEhvc3RMaXN0ZW5lck1ldGFkYXRhIHtcbiAgY29uc3RydWN0b3IocHVibGljIGV2ZW50TmFtZTogc3RyaW5nLCBwdWJsaWMgYXJncz86IHN0cmluZ1tdKSB7fVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvbWV0YWRhdGEvZGlyZWN0aXZlcy50c1xuICoqLyIsIi8qKlxuICogQG1vZHVsZVxuICogQGRlc2NyaXB0aW9uXG4gKiBDaGFuZ2UgZGV0ZWN0aW9uIGVuYWJsZXMgZGF0YSBiaW5kaW5nIGluIEFuZ3VsYXIuXG4gKi9cblxuZXhwb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG5cbiAgRXhwcmVzc2lvbkNoYW5nZWRBZnRlckl0SGFzQmVlbkNoZWNrZWRFeGNlcHRpb24sXG4gIENoYW5nZURldGVjdGlvbkVycm9yLFxuXG4gIENoYW5nZURldGVjdG9yUmVmLFxuXG4gIFdyYXBwZWRWYWx1ZSxcbiAgU2ltcGxlQ2hhbmdlLFxuICBQaXBlVHJhbnNmb3JtLFxuICBJdGVyYWJsZURpZmZlcnMsXG4gIEl0ZXJhYmxlRGlmZmVyLFxuICBJdGVyYWJsZURpZmZlckZhY3RvcnksXG4gIEtleVZhbHVlRGlmZmVycyxcbiAgS2V5VmFsdWVEaWZmZXIsXG4gIEtleVZhbHVlRGlmZmVyRmFjdG9yeVxufSBmcm9tICcuL2NoYW5nZV9kZXRlY3Rpb24vY2hhbmdlX2RldGVjdGlvbic7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uLnRzXG4gKiovIiwiaW1wb3J0IHtJdGVyYWJsZURpZmZlcnMsIEl0ZXJhYmxlRGlmZmVyRmFjdG9yeX0gZnJvbSAnLi9kaWZmZXJzL2l0ZXJhYmxlX2RpZmZlcnMnO1xuaW1wb3J0IHtEZWZhdWx0SXRlcmFibGVEaWZmZXJGYWN0b3J5fSBmcm9tICcuL2RpZmZlcnMvZGVmYXVsdF9pdGVyYWJsZV9kaWZmZXInO1xuaW1wb3J0IHtLZXlWYWx1ZURpZmZlcnMsIEtleVZhbHVlRGlmZmVyRmFjdG9yeX0gZnJvbSAnLi9kaWZmZXJzL2tleXZhbHVlX2RpZmZlcnMnO1xuaW1wb3J0IHtEZWZhdWx0S2V5VmFsdWVEaWZmZXJGYWN0b3J5fSBmcm9tICcuL2RpZmZlcnMvZGVmYXVsdF9rZXl2YWx1ZV9kaWZmZXInO1xuaW1wb3J0IHtDT05TVCwgQ09OU1RfRVhQUiwgaXNQcmVzZW50fSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuXG5leHBvcnQge1xuICBBU1RXaXRoU291cmNlLFxuICBBU1QsXG4gIEFzdFRyYW5zZm9ybWVyLFxuICBQcm9wZXJ0eVJlYWQsXG4gIExpdGVyYWxBcnJheSxcbiAgSW1wbGljaXRSZWNlaXZlclxufSBmcm9tICcuL3BhcnNlci9hc3QnO1xuXG5leHBvcnQge0xleGVyfSBmcm9tICcuL3BhcnNlci9sZXhlcic7XG5leHBvcnQge1BhcnNlcn0gZnJvbSAnLi9wYXJzZXIvcGFyc2VyJztcbmV4cG9ydCB7TG9jYWxzfSBmcm9tICcuL3BhcnNlci9sb2NhbHMnO1xuXG5leHBvcnQge1xuICBEZWh5ZHJhdGVkRXhjZXB0aW9uLFxuICBFeHByZXNzaW9uQ2hhbmdlZEFmdGVySXRIYXNCZWVuQ2hlY2tlZEV4Y2VwdGlvbixcbiAgQ2hhbmdlRGV0ZWN0aW9uRXJyb3Jcbn0gZnJvbSAnLi9leGNlcHRpb25zJztcbmV4cG9ydCB7XG4gIFByb3RvQ2hhbmdlRGV0ZWN0b3IsXG4gIENoYW5nZURldGVjdG9yLFxuICBDaGFuZ2VEaXNwYXRjaGVyLFxuICBDaGFuZ2VEZXRlY3RvckRlZmluaXRpb24sXG4gIERlYnVnQ29udGV4dCxcbiAgQ2hhbmdlRGV0ZWN0b3JHZW5Db25maWdcbn0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmV4cG9ydCB7Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENIQU5HRV9ERVRFQ1RJT05fU1RSQVRFR1lfVkFMVUVTfSBmcm9tICcuL2NvbnN0YW50cyc7XG5leHBvcnQge0R5bmFtaWNQcm90b0NoYW5nZURldGVjdG9yfSBmcm9tICcuL3Byb3RvX2NoYW5nZV9kZXRlY3Rvcic7XG5leHBvcnQge0ppdFByb3RvQ2hhbmdlRGV0ZWN0b3J9IGZyb20gJy4vaml0X3Byb3RvX2NoYW5nZV9kZXRlY3Rvcic7XG5leHBvcnQge0JpbmRpbmdSZWNvcmQsIEJpbmRpbmdUYXJnZXR9IGZyb20gJy4vYmluZGluZ19yZWNvcmQnO1xuZXhwb3J0IHtEaXJlY3RpdmVJbmRleCwgRGlyZWN0aXZlUmVjb3JkfSBmcm9tICcuL2RpcmVjdGl2ZV9yZWNvcmQnO1xuZXhwb3J0IHtEeW5hbWljQ2hhbmdlRGV0ZWN0b3J9IGZyb20gJy4vZHluYW1pY19jaGFuZ2VfZGV0ZWN0b3InO1xuZXhwb3J0IHtDaGFuZ2VEZXRlY3RvclJlZn0gZnJvbSAnLi9jaGFuZ2VfZGV0ZWN0b3JfcmVmJztcbmV4cG9ydCB7SXRlcmFibGVEaWZmZXJzLCBJdGVyYWJsZURpZmZlciwgSXRlcmFibGVEaWZmZXJGYWN0b3J5fSBmcm9tICcuL2RpZmZlcnMvaXRlcmFibGVfZGlmZmVycyc7XG5leHBvcnQge0tleVZhbHVlRGlmZmVycywgS2V5VmFsdWVEaWZmZXIsIEtleVZhbHVlRGlmZmVyRmFjdG9yeX0gZnJvbSAnLi9kaWZmZXJzL2tleXZhbHVlX2RpZmZlcnMnO1xuZXhwb3J0IHtQaXBlVHJhbnNmb3JtfSBmcm9tICcuL3BpcGVfdHJhbnNmb3JtJztcbmV4cG9ydCB7V3JhcHBlZFZhbHVlLCBTaW1wbGVDaGFuZ2V9IGZyb20gJy4vY2hhbmdlX2RldGVjdGlvbl91dGlsJztcblxuLyoqXG4gKiBTdHJ1Y3R1cmFsIGRpZmZpbmcgZm9yIGBPYmplY3RgcyBhbmQgYE1hcGBzLlxuICovXG5leHBvcnQgY29uc3Qga2V5VmFsRGlmZjogS2V5VmFsdWVEaWZmZXJGYWN0b3J5W10gPVxuICAgIENPTlNUX0VYUFIoW0NPTlNUX0VYUFIobmV3IERlZmF1bHRLZXlWYWx1ZURpZmZlckZhY3RvcnkoKSldKTtcblxuLyoqXG4gKiBTdHJ1Y3R1cmFsIGRpZmZpbmcgZm9yIGBJdGVyYWJsZWAgdHlwZXMgc3VjaCBhcyBgQXJyYXlgcy5cbiAqL1xuZXhwb3J0IGNvbnN0IGl0ZXJhYmxlRGlmZjogSXRlcmFibGVEaWZmZXJGYWN0b3J5W10gPVxuICAgIENPTlNUX0VYUFIoW0NPTlNUX0VYUFIobmV3IERlZmF1bHRJdGVyYWJsZURpZmZlckZhY3RvcnkoKSldKTtcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRJdGVyYWJsZURpZmZlcnMgPSBDT05TVF9FWFBSKG5ldyBJdGVyYWJsZURpZmZlcnMoaXRlcmFibGVEaWZmKSk7XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0S2V5VmFsdWVEaWZmZXJzID0gQ09OU1RfRVhQUihuZXcgS2V5VmFsdWVEaWZmZXJzKGtleVZhbERpZmYpKTtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vY2hhbmdlX2RldGVjdGlvbi50c1xuICoqLyIsImltcG9ydCB7aXNCbGFuaywgaXNQcmVzZW50LCBDT05TVH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7TGlzdFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge0NoYW5nZURldGVjdG9yUmVmfSBmcm9tICcuLi9jaGFuZ2VfZGV0ZWN0b3JfcmVmJztcbmltcG9ydCB7UHJvdmlkZXIsIFNraXBTZWxmTWV0YWRhdGEsIE9wdGlvbmFsTWV0YWRhdGEsIEluamVjdGFibGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpJztcblxuLyoqXG4gKiBBIHN0cmF0ZWd5IGZvciB0cmFja2luZyBjaGFuZ2VzIG92ZXIgdGltZSB0byBhbiBpdGVyYWJsZS4gVXNlZCBmb3Ige0BsaW5rIE5nRm9yfSB0b1xuICogcmVzcG9uZCB0byBjaGFuZ2VzIGluIGFuIGl0ZXJhYmxlIGJ5IGVmZmVjdGluZyBlcXVpdmFsZW50IGNoYW5nZXMgaW4gdGhlIERPTS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVyYWJsZURpZmZlciB7XG4gIGRpZmYob2JqZWN0OiBPYmplY3QpOiBhbnk7XG4gIG9uRGVzdHJveSgpO1xufVxuXG4vKipcbiAqIFByb3ZpZGVzIGEgZmFjdG9yeSBmb3Ige0BsaW5rIEl0ZXJhYmxlRGlmZmVyfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVyYWJsZURpZmZlckZhY3Rvcnkge1xuICBzdXBwb3J0cyhvYmplY3RzOiBPYmplY3QpOiBib29sZWFuO1xuICBjcmVhdGUoY2RSZWY6IENoYW5nZURldGVjdG9yUmVmKTogSXRlcmFibGVEaWZmZXI7XG59XG5cbi8qKlxuICogQSByZXBvc2l0b3J5IG9mIGRpZmZlcmVudCBpdGVyYWJsZSBkaWZmaW5nIHN0cmF0ZWdpZXMgdXNlZCBieSBOZ0ZvciwgTmdDbGFzcywgYW5kIG90aGVycy5cbiAqL1xuQEluamVjdGFibGUoKVxuQENPTlNUKClcbmV4cG9ydCBjbGFzcyBJdGVyYWJsZURpZmZlcnMge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZmFjdG9yaWVzOiBJdGVyYWJsZURpZmZlckZhY3RvcnlbXSkge31cblxuICBzdGF0aWMgY3JlYXRlKGZhY3RvcmllczogSXRlcmFibGVEaWZmZXJGYWN0b3J5W10sIHBhcmVudD86IEl0ZXJhYmxlRGlmZmVycyk6IEl0ZXJhYmxlRGlmZmVycyB7XG4gICAgaWYgKGlzUHJlc2VudChwYXJlbnQpKSB7XG4gICAgICB2YXIgY29waWVkID0gTGlzdFdyYXBwZXIuY2xvbmUocGFyZW50LmZhY3Rvcmllcyk7XG4gICAgICBmYWN0b3JpZXMgPSBmYWN0b3JpZXMuY29uY2F0KGNvcGllZCk7XG4gICAgICByZXR1cm4gbmV3IEl0ZXJhYmxlRGlmZmVycyhmYWN0b3JpZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IEl0ZXJhYmxlRGlmZmVycyhmYWN0b3JpZXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlcyBhbiBhcnJheSBvZiB7QGxpbmsgSXRlcmFibGVEaWZmZXJGYWN0b3J5fSBhbmQgcmV0dXJucyBhIHByb3ZpZGVyIHVzZWQgdG8gZXh0ZW5kIHRoZVxuICAgKiBpbmhlcml0ZWQge0BsaW5rIEl0ZXJhYmxlRGlmZmVyc30gaW5zdGFuY2Ugd2l0aCB0aGUgcHJvdmlkZWQgZmFjdG9yaWVzIGFuZCByZXR1cm4gYSBuZXdcbiAgICoge0BsaW5rIEl0ZXJhYmxlRGlmZmVyc30gaW5zdGFuY2UuXG4gICAqXG4gICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gZXh0ZW5kIGFuIGV4aXN0aW5nIGxpc3Qgb2YgZmFjdG9yaWVzLFxuICAgICAgICAgKiB3aGljaCB3aWxsIG9ubHkgYmUgYXBwbGllZCB0byB0aGUgaW5qZWN0b3IgZm9yIHRoaXMgY29tcG9uZW50IGFuZCBpdHMgY2hpbGRyZW4uXG4gICAgICAgICAqIFRoaXMgc3RlcCBpcyBhbGwgdGhhdCdzIHJlcXVpcmVkIHRvIG1ha2UgYSBuZXcge0BsaW5rIEl0ZXJhYmxlRGlmZmVyfSBhdmFpbGFibGUuXG4gICAqXG4gICAqICMjIyBFeGFtcGxlXG4gICAqXG4gICAqIGBgYFxuICAgKiBAQ29tcG9uZW50KHtcbiAgICogICB2aWV3UHJvdmlkZXJzOiBbXG4gICAqICAgICBJdGVyYWJsZURpZmZlcnMuZXh0ZW5kKFtuZXcgSW1tdXRhYmxlTGlzdERpZmZlcigpXSlcbiAgICogICBdXG4gICAqIH0pXG4gICAqIGBgYFxuICAgKi9cbiAgc3RhdGljIGV4dGVuZChmYWN0b3JpZXM6IEl0ZXJhYmxlRGlmZmVyRmFjdG9yeVtdKTogUHJvdmlkZXIge1xuICAgIHJldHVybiBuZXcgUHJvdmlkZXIoSXRlcmFibGVEaWZmZXJzLCB7XG4gICAgICB1c2VGYWN0b3J5OiAocGFyZW50OiBJdGVyYWJsZURpZmZlcnMpID0+IHtcbiAgICAgICAgaWYgKGlzQmxhbmsocGFyZW50KSkge1xuICAgICAgICAgIC8vIFR5cGljYWxseSB3b3VsZCBvY2N1ciB3aGVuIGNhbGxpbmcgSXRlcmFibGVEaWZmZXJzLmV4dGVuZCBpbnNpZGUgb2YgZGVwZW5kZW5jaWVzIHBhc3NlZFxuICAgICAgICAgIC8vIHRvXG4gICAgICAgICAgLy8gYm9vdHN0cmFwKCksIHdoaWNoIHdvdWxkIG92ZXJyaWRlIGRlZmF1bHQgcGlwZXMgaW5zdGVhZCBvZiBleHRlbmRpbmcgdGhlbS5cbiAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignQ2Fubm90IGV4dGVuZCBJdGVyYWJsZURpZmZlcnMgd2l0aG91dCBhIHBhcmVudCBpbmplY3RvcicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBJdGVyYWJsZURpZmZlcnMuY3JlYXRlKGZhY3RvcmllcywgcGFyZW50KTtcbiAgICAgIH0sXG4gICAgICAvLyBEZXBlbmRlbmN5IHRlY2huaWNhbGx5IGlzbid0IG9wdGlvbmFsLCBidXQgd2UgY2FuIHByb3ZpZGUgYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZSB0aGlzIHdheS5cbiAgICAgIGRlcHM6IFtbSXRlcmFibGVEaWZmZXJzLCBuZXcgU2tpcFNlbGZNZXRhZGF0YSgpLCBuZXcgT3B0aW9uYWxNZXRhZGF0YSgpXV1cbiAgICB9KTtcbiAgfVxuXG4gIGZpbmQoaXRlcmFibGU6IE9iamVjdCk6IEl0ZXJhYmxlRGlmZmVyRmFjdG9yeSB7XG4gICAgdmFyIGZhY3RvcnkgPSB0aGlzLmZhY3Rvcmllcy5maW5kKGYgPT4gZi5zdXBwb3J0cyhpdGVyYWJsZSkpO1xuICAgIGlmIChpc1ByZXNlbnQoZmFjdG9yeSkpIHtcbiAgICAgIHJldHVybiBmYWN0b3J5O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgQ2Fubm90IGZpbmQgYSBkaWZmZXIgc3VwcG9ydGluZyBvYmplY3QgJyR7aXRlcmFibGV9J2ApO1xuICAgIH1cbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9kaWZmZXJzL2l0ZXJhYmxlX2RpZmZlcnMudHNcbiAqKi8iLCJpbXBvcnQge0NPTlNUfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtcbiAgaXNMaXN0TGlrZUl0ZXJhYmxlLFxuICBpdGVyYXRlTGlzdExpa2UsXG4gIExpc3RXcmFwcGVyLFxuICBNYXBXcmFwcGVyXG59IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5cbmltcG9ydCB7XG4gIGlzQmxhbmssXG4gIGlzUHJlc2VudCxcbiAgc3RyaW5naWZ5LFxuICBnZXRNYXBLZXksXG4gIGxvb3NlSWRlbnRpY2FsLFxuICBpc0FycmF5XG59IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5cbmltcG9ydCB7Q2hhbmdlRGV0ZWN0b3JSZWZ9IGZyb20gJy4uL2NoYW5nZV9kZXRlY3Rvcl9yZWYnO1xuaW1wb3J0IHtJdGVyYWJsZURpZmZlciwgSXRlcmFibGVEaWZmZXJGYWN0b3J5fSBmcm9tICcuLi9kaWZmZXJzL2l0ZXJhYmxlX2RpZmZlcnMnO1xuXG5AQ09OU1QoKVxuZXhwb3J0IGNsYXNzIERlZmF1bHRJdGVyYWJsZURpZmZlckZhY3RvcnkgaW1wbGVtZW50cyBJdGVyYWJsZURpZmZlckZhY3Rvcnkge1xuICBzdXBwb3J0cyhvYmo6IE9iamVjdCk6IGJvb2xlYW4geyByZXR1cm4gaXNMaXN0TGlrZUl0ZXJhYmxlKG9iaik7IH1cbiAgY3JlYXRlKGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZik6IGFueSB7IHJldHVybiBuZXcgRGVmYXVsdEl0ZXJhYmxlRGlmZmVyKCk7IH1cbn1cblxuZXhwb3J0IGNsYXNzIERlZmF1bHRJdGVyYWJsZURpZmZlciBpbXBsZW1lbnRzIEl0ZXJhYmxlRGlmZmVyIHtcbiAgcHJpdmF0ZSBfY29sbGVjdGlvbiA9IG51bGw7XG4gIHByaXZhdGUgX2xlbmd0aDogbnVtYmVyID0gbnVsbDtcbiAgLy8gS2VlcHMgdHJhY2sgb2YgdGhlIHVzZWQgcmVjb3JkcyBhdCBhbnkgcG9pbnQgaW4gdGltZSAoZHVyaW5nICYgYWNyb3NzIGBfY2hlY2soKWAgY2FsbHMpXG4gIHByaXZhdGUgX2xpbmtlZFJlY29yZHM6IF9EdXBsaWNhdGVNYXAgPSBudWxsO1xuICAvLyBLZWVwcyB0cmFjayBvZiB0aGUgcmVtb3ZlZCByZWNvcmRzIGF0IGFueSBwb2ludCBpbiB0aW1lIGR1cmluZyBgX2NoZWNrKClgIGNhbGxzLlxuICBwcml2YXRlIF91bmxpbmtlZFJlY29yZHM6IF9EdXBsaWNhdGVNYXAgPSBudWxsO1xuICBwcml2YXRlIF9wcmV2aW91c0l0SGVhZDogQ29sbGVjdGlvbkNoYW5nZVJlY29yZCA9IG51bGw7XG4gIHByaXZhdGUgX2l0SGVhZDogQ29sbGVjdGlvbkNoYW5nZVJlY29yZCA9IG51bGw7XG4gIHByaXZhdGUgX2l0VGFpbDogQ29sbGVjdGlvbkNoYW5nZVJlY29yZCA9IG51bGw7XG4gIHByaXZhdGUgX2FkZGl0aW9uc0hlYWQ6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQgPSBudWxsO1xuICBwcml2YXRlIF9hZGRpdGlvbnNUYWlsOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkID0gbnVsbDtcbiAgcHJpdmF0ZSBfbW92ZXNIZWFkOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkID0gbnVsbDtcbiAgcHJpdmF0ZSBfbW92ZXNUYWlsOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkID0gbnVsbDtcbiAgcHJpdmF0ZSBfcmVtb3ZhbHNIZWFkOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkID0gbnVsbDtcbiAgcHJpdmF0ZSBfcmVtb3ZhbHNUYWlsOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkID0gbnVsbDtcblxuICBnZXQgY29sbGVjdGlvbigpIHsgcmV0dXJuIHRoaXMuX2NvbGxlY3Rpb247IH1cblxuICBnZXQgbGVuZ3RoKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9sZW5ndGg7IH1cblxuICBmb3JFYWNoSXRlbShmbjogRnVuY3Rpb24pIHtcbiAgICB2YXIgcmVjb3JkOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkO1xuICAgIGZvciAocmVjb3JkID0gdGhpcy5faXRIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dCkge1xuICAgICAgZm4ocmVjb3JkKTtcbiAgICB9XG4gIH1cblxuICBmb3JFYWNoUHJldmlvdXNJdGVtKGZuOiBGdW5jdGlvbikge1xuICAgIHZhciByZWNvcmQ6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQ7XG4gICAgZm9yIChyZWNvcmQgPSB0aGlzLl9wcmV2aW91c0l0SGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHRQcmV2aW91cykge1xuICAgICAgZm4ocmVjb3JkKTtcbiAgICB9XG4gIH1cblxuICBmb3JFYWNoQWRkZWRJdGVtKGZuOiBGdW5jdGlvbikge1xuICAgIHZhciByZWNvcmQ6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQ7XG4gICAgZm9yIChyZWNvcmQgPSB0aGlzLl9hZGRpdGlvbnNIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dEFkZGVkKSB7XG4gICAgICBmbihyZWNvcmQpO1xuICAgIH1cbiAgfVxuXG4gIGZvckVhY2hNb3ZlZEl0ZW0oZm46IEZ1bmN0aW9uKSB7XG4gICAgdmFyIHJlY29yZDogQ29sbGVjdGlvbkNoYW5nZVJlY29yZDtcbiAgICBmb3IgKHJlY29yZCA9IHRoaXMuX21vdmVzSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHRNb3ZlZCkge1xuICAgICAgZm4ocmVjb3JkKTtcbiAgICB9XG4gIH1cblxuICBmb3JFYWNoUmVtb3ZlZEl0ZW0oZm46IEZ1bmN0aW9uKSB7XG4gICAgdmFyIHJlY29yZDogQ29sbGVjdGlvbkNoYW5nZVJlY29yZDtcbiAgICBmb3IgKHJlY29yZCA9IHRoaXMuX3JlbW92YWxzSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHRSZW1vdmVkKSB7XG4gICAgICBmbihyZWNvcmQpO1xuICAgIH1cbiAgfVxuXG4gIGRpZmYoY29sbGVjdGlvbjogYW55KTogRGVmYXVsdEl0ZXJhYmxlRGlmZmVyIHtcbiAgICBpZiAoaXNCbGFuayhjb2xsZWN0aW9uKSkgY29sbGVjdGlvbiA9IFtdO1xuICAgIGlmICghaXNMaXN0TGlrZUl0ZXJhYmxlKGNvbGxlY3Rpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgRXJyb3IgdHJ5aW5nIHRvIGRpZmYgJyR7Y29sbGVjdGlvbn0nYCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2hlY2soY29sbGVjdGlvbikpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBvbkRlc3Ryb3koKSB7fVxuXG4gIC8vIHRvZG8odmljYik6IG9wdGltIGZvciBVbm1vZGlmaWFibGVMaXN0VmlldyAoZnJvemVuIGFycmF5cylcbiAgY2hlY2soY29sbGVjdGlvbjogYW55KTogYm9vbGVhbiB7XG4gICAgdGhpcy5fcmVzZXQoKTtcblxuICAgIHZhciByZWNvcmQ6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQgPSB0aGlzLl9pdEhlYWQ7XG4gICAgdmFyIG1heUJlRGlydHk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICB2YXIgaW5kZXg6IG51bWJlcjtcbiAgICB2YXIgaXRlbTtcblxuICAgIGlmIChpc0FycmF5KGNvbGxlY3Rpb24pKSB7XG4gICAgICB2YXIgbGlzdCA9IGNvbGxlY3Rpb247XG4gICAgICB0aGlzLl9sZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDtcblxuICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5fbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIGl0ZW0gPSBsaXN0W2luZGV4XTtcbiAgICAgICAgaWYgKHJlY29yZCA9PT0gbnVsbCB8fCAhbG9vc2VJZGVudGljYWwocmVjb3JkLml0ZW0sIGl0ZW0pKSB7XG4gICAgICAgICAgcmVjb3JkID0gdGhpcy5fbWlzbWF0Y2gocmVjb3JkLCBpdGVtLCBpbmRleCk7XG4gICAgICAgICAgbWF5QmVEaXJ0eSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAobWF5QmVEaXJ0eSkge1xuICAgICAgICAgIC8vIFRPRE8obWlza28pOiBjYW4gd2UgbGltaXQgdGhpcyB0byBkdXBsaWNhdGVzIG9ubHk/XG4gICAgICAgICAgcmVjb3JkID0gdGhpcy5fdmVyaWZ5UmVpbnNlcnRpb24ocmVjb3JkLCBpdGVtLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVjb3JkID0gcmVjb3JkLl9uZXh0O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpbmRleCA9IDA7XG4gICAgICBpdGVyYXRlTGlzdExpa2UoY29sbGVjdGlvbiwgKGl0ZW0pID0+IHtcbiAgICAgICAgaWYgKHJlY29yZCA9PT0gbnVsbCB8fCAhbG9vc2VJZGVudGljYWwocmVjb3JkLml0ZW0sIGl0ZW0pKSB7XG4gICAgICAgICAgcmVjb3JkID0gdGhpcy5fbWlzbWF0Y2gocmVjb3JkLCBpdGVtLCBpbmRleCk7XG4gICAgICAgICAgbWF5QmVEaXJ0eSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAobWF5QmVEaXJ0eSkge1xuICAgICAgICAgIC8vIFRPRE8obWlza28pOiBjYW4gd2UgbGltaXQgdGhpcyB0byBkdXBsaWNhdGVzIG9ubHk/XG4gICAgICAgICAgcmVjb3JkID0gdGhpcy5fdmVyaWZ5UmVpbnNlcnRpb24ocmVjb3JkLCBpdGVtLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVjb3JkID0gcmVjb3JkLl9uZXh0O1xuICAgICAgICBpbmRleCsrO1xuICAgICAgfSk7XG4gICAgICB0aGlzLl9sZW5ndGggPSBpbmRleDtcbiAgICB9XG5cbiAgICB0aGlzLl90cnVuY2F0ZShyZWNvcmQpO1xuICAgIHRoaXMuX2NvbGxlY3Rpb24gPSBjb2xsZWN0aW9uO1xuICAgIHJldHVybiB0aGlzLmlzRGlydHk7XG4gIH1cblxuICAvLyBDb2xsZWN0aW9uQ2hhbmdlcyBpcyBjb25zaWRlcmVkIGRpcnR5IGlmIGl0IGhhcyBhbnkgYWRkaXRpb25zLCBtb3ZlcyBvciByZW1vdmFscy5cbiAgZ2V0IGlzRGlydHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZGl0aW9uc0hlYWQgIT09IG51bGwgfHwgdGhpcy5fbW92ZXNIZWFkICE9PSBudWxsIHx8IHRoaXMuX3JlbW92YWxzSGVhZCAhPT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGUgc3RhdGUgb2YgdGhlIGNoYW5nZSBvYmplY3RzIHRvIHNob3cgbm8gY2hhbmdlcy4gVGhpcyBtZWFucyBzZXQgcHJldmlvdXNLZXkgdG9cbiAgICogY3VycmVudEtleSwgYW5kIGNsZWFyIGFsbCBvZiB0aGUgcXVldWVzIChhZGRpdGlvbnMsIG1vdmVzLCByZW1vdmFscykuXG4gICAqIFNldCB0aGUgcHJldmlvdXNJbmRleGVzIG9mIG1vdmVkIGFuZCBhZGRlZCBpdGVtcyB0byB0aGVpciBjdXJyZW50SW5kZXhlc1xuICAgKiBSZXNldCB0aGUgbGlzdCBvZiBhZGRpdGlvbnMsIG1vdmVzIGFuZCByZW1vdmFsc1xuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9yZXNldCgpIHtcbiAgICBpZiAodGhpcy5pc0RpcnR5KSB7XG4gICAgICB2YXIgcmVjb3JkOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkO1xuICAgICAgdmFyIG5leHRSZWNvcmQ6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQ7XG5cbiAgICAgIGZvciAocmVjb3JkID0gdGhpcy5fcHJldmlvdXNJdEhlYWQgPSB0aGlzLl9pdEhlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0KSB7XG4gICAgICAgIHJlY29yZC5fbmV4dFByZXZpb3VzID0gcmVjb3JkLl9uZXh0O1xuICAgICAgfVxuXG4gICAgICBmb3IgKHJlY29yZCA9IHRoaXMuX2FkZGl0aW9uc0hlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0QWRkZWQpIHtcbiAgICAgICAgcmVjb3JkLnByZXZpb3VzSW5kZXggPSByZWNvcmQuY3VycmVudEluZGV4O1xuICAgICAgfVxuICAgICAgdGhpcy5fYWRkaXRpb25zSGVhZCA9IHRoaXMuX2FkZGl0aW9uc1RhaWwgPSBudWxsO1xuXG4gICAgICBmb3IgKHJlY29yZCA9IHRoaXMuX21vdmVzSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSBuZXh0UmVjb3JkKSB7XG4gICAgICAgIHJlY29yZC5wcmV2aW91c0luZGV4ID0gcmVjb3JkLmN1cnJlbnRJbmRleDtcbiAgICAgICAgbmV4dFJlY29yZCA9IHJlY29yZC5fbmV4dE1vdmVkO1xuICAgICAgfVxuICAgICAgdGhpcy5fbW92ZXNIZWFkID0gdGhpcy5fbW92ZXNUYWlsID0gbnVsbDtcbiAgICAgIHRoaXMuX3JlbW92YWxzSGVhZCA9IHRoaXMuX3JlbW92YWxzVGFpbCA9IG51bGw7XG5cbiAgICAgIC8vIHRvZG8odmljYikgd2hlbiBhc3NlcnQgZ2V0cyBzdXBwb3J0ZWRcbiAgICAgIC8vIGFzc2VydCghdGhpcy5pc0RpcnR5KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBpcyB0aGUgY29yZSBmdW5jdGlvbiB3aGljaCBoYW5kbGVzIGRpZmZlcmVuY2VzIGJldHdlZW4gY29sbGVjdGlvbnMuXG4gICAqXG4gICAqIC0gYHJlY29yZGAgaXMgdGhlIHJlY29yZCB3aGljaCB3ZSBzYXcgYXQgdGhpcyBwb3NpdGlvbiBsYXN0IHRpbWUuIElmIG51bGwgdGhlbiBpdCBpcyBhIG5ld1xuICAgKiAgIGl0ZW0uXG4gICAqIC0gYGl0ZW1gIGlzIHRoZSBjdXJyZW50IGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb25cbiAgICogLSBgaW5kZXhgIGlzIHRoZSBwb3NpdGlvbiBvZiB0aGUgaXRlbSBpbiB0aGUgY29sbGVjdGlvblxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9taXNtYXRjaChyZWNvcmQ6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQsIGl0ZW0sIGluZGV4OiBudW1iZXIpOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkIHtcbiAgICAvLyBUaGUgcHJldmlvdXMgcmVjb3JkIGFmdGVyIHdoaWNoIHdlIHdpbGwgYXBwZW5kIHRoZSBjdXJyZW50IG9uZS5cbiAgICB2YXIgcHJldmlvdXNSZWNvcmQ6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQ7XG5cbiAgICBpZiAocmVjb3JkID09PSBudWxsKSB7XG4gICAgICBwcmV2aW91c1JlY29yZCA9IHRoaXMuX2l0VGFpbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJldmlvdXNSZWNvcmQgPSByZWNvcmQuX3ByZXY7XG4gICAgICAvLyBSZW1vdmUgdGhlIHJlY29yZCBmcm9tIHRoZSBjb2xsZWN0aW9uIHNpbmNlIHdlIGtub3cgaXQgZG9lcyBub3QgbWF0Y2ggdGhlIGl0ZW0uXG4gICAgICB0aGlzLl9yZW1vdmUocmVjb3JkKTtcbiAgICB9XG5cbiAgICAvLyBBdHRlbXB0IHRvIHNlZSBpZiB3ZSBoYXZlIHNlZW4gdGhlIGl0ZW0gYmVmb3JlLlxuICAgIHJlY29yZCA9IHRoaXMuX2xpbmtlZFJlY29yZHMgPT09IG51bGwgPyBudWxsIDogdGhpcy5fbGlua2VkUmVjb3Jkcy5nZXQoaXRlbSwgaW5kZXgpO1xuICAgIGlmIChyZWNvcmQgIT09IG51bGwpIHtcbiAgICAgIC8vIFdlIGhhdmUgc2VlbiB0aGlzIGJlZm9yZSwgd2UgbmVlZCB0byBtb3ZlIGl0IGZvcndhcmQgaW4gdGhlIGNvbGxlY3Rpb24uXG4gICAgICB0aGlzLl9tb3ZlQWZ0ZXIocmVjb3JkLCBwcmV2aW91c1JlY29yZCwgaW5kZXgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOZXZlciBzZWVuIGl0LCBjaGVjayBldmljdGVkIGxpc3QuXG4gICAgICByZWNvcmQgPSB0aGlzLl91bmxpbmtlZFJlY29yZHMgPT09IG51bGwgPyBudWxsIDogdGhpcy5fdW5saW5rZWRSZWNvcmRzLmdldChpdGVtKTtcbiAgICAgIGlmIChyZWNvcmQgIT09IG51bGwpIHtcbiAgICAgICAgLy8gSXQgaXMgYW4gaXRlbSB3aGljaCB3ZSBoYXZlIGV2aWN0ZWQgZWFybGllcjogcmVpbnNlcnQgaXQgYmFjayBpbnRvIHRoZSBsaXN0LlxuICAgICAgICB0aGlzLl9yZWluc2VydEFmdGVyKHJlY29yZCwgcHJldmlvdXNSZWNvcmQsIGluZGV4KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEl0IGlzIGEgbmV3IGl0ZW06IGFkZCBpdC5cbiAgICAgICAgcmVjb3JkID0gdGhpcy5fYWRkQWZ0ZXIobmV3IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQoaXRlbSksIHByZXZpb3VzUmVjb3JkLCBpbmRleCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZWNvcmQ7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBjaGVjayBpcyBvbmx5IG5lZWRlZCBpZiBhbiBhcnJheSBjb250YWlucyBkdXBsaWNhdGVzLiAoU2hvcnQgY2lyY3VpdCBvZiBub3RoaW5nIGRpcnR5KVxuICAgKlxuICAgKiBVc2UgY2FzZTogYFthLCBhXWAgPT4gYFtiLCBhLCBhXWBcbiAgICpcbiAgICogSWYgd2UgZGlkIG5vdCBoYXZlIHRoaXMgY2hlY2sgdGhlbiB0aGUgaW5zZXJ0aW9uIG9mIGBiYCB3b3VsZDpcbiAgICogICAxKSBldmljdCBmaXJzdCBgYWBcbiAgICogICAyKSBpbnNlcnQgYGJgIGF0IGAwYCBpbmRleC5cbiAgICogICAzKSBsZWF2ZSBgYWAgYXQgaW5kZXggYDFgIGFzIGlzLiA8LS0gdGhpcyBpcyB3cm9uZyFcbiAgICogICAzKSByZWluc2VydCBgYWAgYXQgaW5kZXggMi4gPC0tIHRoaXMgaXMgd3JvbmchXG4gICAqXG4gICAqIFRoZSBjb3JyZWN0IGJlaGF2aW9yIGlzOlxuICAgKiAgIDEpIGV2aWN0IGZpcnN0IGBhYFxuICAgKiAgIDIpIGluc2VydCBgYmAgYXQgYDBgIGluZGV4LlxuICAgKiAgIDMpIHJlaW5zZXJ0IGBhYCBhdCBpbmRleCAxLlxuICAgKiAgIDMpIG1vdmUgYGFgIGF0IGZyb20gYDFgIHRvIGAyYC5cbiAgICpcbiAgICpcbiAgICogRG91YmxlIGNoZWNrIHRoYXQgd2UgaGF2ZSBub3QgZXZpY3RlZCBhIGR1cGxpY2F0ZSBpdGVtLiBXZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBpdGVtIHR5cGUgbWF5XG4gICAqIGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQ6XG4gICAqIFRoZSBpbnNlcnRpb24gb2YgYiB3aWxsIGV2aWN0IHRoZSBmaXJzdCAnYScuIElmIHdlIGRvbid0IHJlaW5zZXJ0IGl0IG5vdyBpdCB3aWxsIGJlIHJlaW5zZXJ0ZWRcbiAgICogYXQgdGhlIGVuZC4gV2hpY2ggd2lsbCBzaG93IHVwIGFzIHRoZSB0d28gJ2EncyBzd2l0Y2hpbmcgcG9zaXRpb24uIFRoaXMgaXMgaW5jb3JyZWN0LCBzaW5jZSBhXG4gICAqIGJldHRlciB3YXkgdG8gdGhpbmsgb2YgaXQgaXMgYXMgaW5zZXJ0IG9mICdiJyByYXRoZXIgdGhlbiBzd2l0Y2ggJ2EnIHdpdGggJ2InIGFuZCB0aGVuIGFkZCAnYSdcbiAgICogYXQgdGhlIGVuZC5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfdmVyaWZ5UmVpbnNlcnRpb24ocmVjb3JkOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkLCBpdGVtLCBpbmRleDogbnVtYmVyKTogQ29sbGVjdGlvbkNoYW5nZVJlY29yZCB7XG4gICAgdmFyIHJlaW5zZXJ0UmVjb3JkOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkID1cbiAgICAgICAgdGhpcy5fdW5saW5rZWRSZWNvcmRzID09PSBudWxsID8gbnVsbCA6IHRoaXMuX3VubGlua2VkUmVjb3Jkcy5nZXQoaXRlbSk7XG4gICAgaWYgKHJlaW5zZXJ0UmVjb3JkICE9PSBudWxsKSB7XG4gICAgICByZWNvcmQgPSB0aGlzLl9yZWluc2VydEFmdGVyKHJlaW5zZXJ0UmVjb3JkLCByZWNvcmQuX3ByZXYsIGluZGV4KTtcbiAgICB9IGVsc2UgaWYgKHJlY29yZC5jdXJyZW50SW5kZXggIT0gaW5kZXgpIHtcbiAgICAgIHJlY29yZC5jdXJyZW50SW5kZXggPSBpbmRleDtcbiAgICAgIHRoaXMuX2FkZFRvTW92ZXMocmVjb3JkLCBpbmRleCk7XG4gICAgfVxuICAgIHJldHVybiByZWNvcmQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJpZCBvZiBhbnkgZXhjZXNzIHtAbGluayBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkfXMgZnJvbSB0aGUgcHJldmlvdXMgY29sbGVjdGlvblxuICAgKlxuICAgKiAtIGByZWNvcmRgIFRoZSBmaXJzdCBleGNlc3Mge0BsaW5rIENvbGxlY3Rpb25DaGFuZ2VSZWNvcmR9LlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF90cnVuY2F0ZShyZWNvcmQ6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQpIHtcbiAgICAvLyBBbnl0aGluZyBhZnRlciB0aGF0IG5lZWRzIHRvIGJlIHJlbW92ZWQ7XG4gICAgd2hpbGUgKHJlY29yZCAhPT0gbnVsbCkge1xuICAgICAgdmFyIG5leHRSZWNvcmQ6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQgPSByZWNvcmQuX25leHQ7XG4gICAgICB0aGlzLl9hZGRUb1JlbW92YWxzKHRoaXMuX3VubGluayhyZWNvcmQpKTtcbiAgICAgIHJlY29yZCA9IG5leHRSZWNvcmQ7XG4gICAgfVxuICAgIGlmICh0aGlzLl91bmxpbmtlZFJlY29yZHMgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuX3VubGlua2VkUmVjb3Jkcy5jbGVhcigpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9hZGRpdGlvbnNUYWlsICE9PSBudWxsKSB7XG4gICAgICB0aGlzLl9hZGRpdGlvbnNUYWlsLl9uZXh0QWRkZWQgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbW92ZXNUYWlsICE9PSBudWxsKSB7XG4gICAgICB0aGlzLl9tb3Zlc1RhaWwuX25leHRNb3ZlZCA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLl9pdFRhaWwgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuX2l0VGFpbC5fbmV4dCA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLl9yZW1vdmFsc1RhaWwgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuX3JlbW92YWxzVGFpbC5fbmV4dFJlbW92ZWQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3JlaW5zZXJ0QWZ0ZXIocmVjb3JkOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkLCBwcmV2UmVjb3JkOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkLFxuICAgICAgICAgICAgICAgICBpbmRleDogbnVtYmVyKTogQ29sbGVjdGlvbkNoYW5nZVJlY29yZCB7XG4gICAgaWYgKHRoaXMuX3VubGlua2VkUmVjb3JkcyAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5fdW5saW5rZWRSZWNvcmRzLnJlbW92ZShyZWNvcmQpO1xuICAgIH1cbiAgICB2YXIgcHJldiA9IHJlY29yZC5fcHJldlJlbW92ZWQ7XG4gICAgdmFyIG5leHQgPSByZWNvcmQuX25leHRSZW1vdmVkO1xuXG4gICAgaWYgKHByZXYgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuX3JlbW92YWxzSGVhZCA9IG5leHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZXYuX25leHRSZW1vdmVkID0gbmV4dDtcbiAgICB9XG4gICAgaWYgKG5leHQgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuX3JlbW92YWxzVGFpbCA9IHByZXY7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHQuX3ByZXZSZW1vdmVkID0gcHJldjtcbiAgICB9XG5cbiAgICB0aGlzLl9pbnNlcnRBZnRlcihyZWNvcmQsIHByZXZSZWNvcmQsIGluZGV4KTtcbiAgICB0aGlzLl9hZGRUb01vdmVzKHJlY29yZCwgaW5kZXgpO1xuICAgIHJldHVybiByZWNvcmQ7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9tb3ZlQWZ0ZXIocmVjb3JkOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkLCBwcmV2UmVjb3JkOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkLFxuICAgICAgICAgICAgIGluZGV4OiBudW1iZXIpOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkIHtcbiAgICB0aGlzLl91bmxpbmsocmVjb3JkKTtcbiAgICB0aGlzLl9pbnNlcnRBZnRlcihyZWNvcmQsIHByZXZSZWNvcmQsIGluZGV4KTtcbiAgICB0aGlzLl9hZGRUb01vdmVzKHJlY29yZCwgaW5kZXgpO1xuICAgIHJldHVybiByZWNvcmQ7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9hZGRBZnRlcihyZWNvcmQ6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQsIHByZXZSZWNvcmQ6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQsXG4gICAgICAgICAgICBpbmRleDogbnVtYmVyKTogQ29sbGVjdGlvbkNoYW5nZVJlY29yZCB7XG4gICAgdGhpcy5faW5zZXJ0QWZ0ZXIocmVjb3JkLCBwcmV2UmVjb3JkLCBpbmRleCk7XG5cbiAgICBpZiAodGhpcy5fYWRkaXRpb25zVGFpbCA9PT0gbnVsbCkge1xuICAgICAgLy8gdG9kbyh2aWNiKVxuICAgICAgLy8gYXNzZXJ0KHRoaXMuX2FkZGl0aW9uc0hlYWQgPT09IG51bGwpO1xuICAgICAgdGhpcy5fYWRkaXRpb25zVGFpbCA9IHRoaXMuX2FkZGl0aW9uc0hlYWQgPSByZWNvcmQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRvZG8odmljYilcbiAgICAgIC8vIGFzc2VydChfYWRkaXRpb25zVGFpbC5fbmV4dEFkZGVkID09PSBudWxsKTtcbiAgICAgIC8vIGFzc2VydChyZWNvcmQuX25leHRBZGRlZCA9PT0gbnVsbCk7XG4gICAgICB0aGlzLl9hZGRpdGlvbnNUYWlsID0gdGhpcy5fYWRkaXRpb25zVGFpbC5fbmV4dEFkZGVkID0gcmVjb3JkO1xuICAgIH1cbiAgICByZXR1cm4gcmVjb3JkO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfaW5zZXJ0QWZ0ZXIocmVjb3JkOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkLCBwcmV2UmVjb3JkOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkLFxuICAgICAgICAgICAgICAgaW5kZXg6IG51bWJlcik6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQge1xuICAgIC8vIHRvZG8odmljYilcbiAgICAvLyBhc3NlcnQocmVjb3JkICE9IHByZXZSZWNvcmQpO1xuICAgIC8vIGFzc2VydChyZWNvcmQuX25leHQgPT09IG51bGwpO1xuICAgIC8vIGFzc2VydChyZWNvcmQuX3ByZXYgPT09IG51bGwpO1xuXG4gICAgdmFyIG5leHQ6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQgPSBwcmV2UmVjb3JkID09PSBudWxsID8gdGhpcy5faXRIZWFkIDogcHJldlJlY29yZC5fbmV4dDtcbiAgICAvLyB0b2RvKHZpY2IpXG4gICAgLy8gYXNzZXJ0KG5leHQgIT0gcmVjb3JkKTtcbiAgICAvLyBhc3NlcnQocHJldlJlY29yZCAhPSByZWNvcmQpO1xuICAgIHJlY29yZC5fbmV4dCA9IG5leHQ7XG4gICAgcmVjb3JkLl9wcmV2ID0gcHJldlJlY29yZDtcbiAgICBpZiAobmV4dCA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5faXRUYWlsID0gcmVjb3JkO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0Ll9wcmV2ID0gcmVjb3JkO1xuICAgIH1cbiAgICBpZiAocHJldlJlY29yZCA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5faXRIZWFkID0gcmVjb3JkO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcmV2UmVjb3JkLl9uZXh0ID0gcmVjb3JkO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9saW5rZWRSZWNvcmRzID09PSBudWxsKSB7XG4gICAgICB0aGlzLl9saW5rZWRSZWNvcmRzID0gbmV3IF9EdXBsaWNhdGVNYXAoKTtcbiAgICB9XG4gICAgdGhpcy5fbGlua2VkUmVjb3Jkcy5wdXQocmVjb3JkKTtcblxuICAgIHJlY29yZC5jdXJyZW50SW5kZXggPSBpbmRleDtcbiAgICByZXR1cm4gcmVjb3JkO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcmVtb3ZlKHJlY29yZDogQ29sbGVjdGlvbkNoYW5nZVJlY29yZCk6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQge1xuICAgIHJldHVybiB0aGlzLl9hZGRUb1JlbW92YWxzKHRoaXMuX3VubGluayhyZWNvcmQpKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3VubGluayhyZWNvcmQ6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQpOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkIHtcbiAgICBpZiAodGhpcy5fbGlua2VkUmVjb3JkcyAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5fbGlua2VkUmVjb3Jkcy5yZW1vdmUocmVjb3JkKTtcbiAgICB9XG5cbiAgICB2YXIgcHJldiA9IHJlY29yZC5fcHJldjtcbiAgICB2YXIgbmV4dCA9IHJlY29yZC5fbmV4dDtcblxuICAgIC8vIHRvZG8odmljYilcbiAgICAvLyBhc3NlcnQoKHJlY29yZC5fcHJldiA9IG51bGwpID09PSBudWxsKTtcbiAgICAvLyBhc3NlcnQoKHJlY29yZC5fbmV4dCA9IG51bGwpID09PSBudWxsKTtcblxuICAgIGlmIChwcmV2ID09PSBudWxsKSB7XG4gICAgICB0aGlzLl9pdEhlYWQgPSBuZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICBwcmV2Ll9uZXh0ID0gbmV4dDtcbiAgICB9XG4gICAgaWYgKG5leHQgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuX2l0VGFpbCA9IHByZXY7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHQuX3ByZXYgPSBwcmV2O1xuICAgIH1cblxuICAgIHJldHVybiByZWNvcmQ7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9hZGRUb01vdmVzKHJlY29yZDogQ29sbGVjdGlvbkNoYW5nZVJlY29yZCwgdG9JbmRleDogbnVtYmVyKTogQ29sbGVjdGlvbkNoYW5nZVJlY29yZCB7XG4gICAgLy8gdG9kbyh2aWNiKVxuICAgIC8vIGFzc2VydChyZWNvcmQuX25leHRNb3ZlZCA9PT0gbnVsbCk7XG5cbiAgICBpZiAocmVjb3JkLnByZXZpb3VzSW5kZXggPT09IHRvSW5kZXgpIHtcbiAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX21vdmVzVGFpbCA9PT0gbnVsbCkge1xuICAgICAgLy8gdG9kbyh2aWNiKVxuICAgICAgLy8gYXNzZXJ0KF9tb3Zlc0hlYWQgPT09IG51bGwpO1xuICAgICAgdGhpcy5fbW92ZXNUYWlsID0gdGhpcy5fbW92ZXNIZWFkID0gcmVjb3JkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0b2RvKHZpY2IpXG4gICAgICAvLyBhc3NlcnQoX21vdmVzVGFpbC5fbmV4dE1vdmVkID09PSBudWxsKTtcbiAgICAgIHRoaXMuX21vdmVzVGFpbCA9IHRoaXMuX21vdmVzVGFpbC5fbmV4dE1vdmVkID0gcmVjb3JkO1xuICAgIH1cblxuICAgIHJldHVybiByZWNvcmQ7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9hZGRUb1JlbW92YWxzKHJlY29yZDogQ29sbGVjdGlvbkNoYW5nZVJlY29yZCk6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQge1xuICAgIGlmICh0aGlzLl91bmxpbmtlZFJlY29yZHMgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuX3VubGlua2VkUmVjb3JkcyA9IG5ldyBfRHVwbGljYXRlTWFwKCk7XG4gICAgfVxuICAgIHRoaXMuX3VubGlua2VkUmVjb3Jkcy5wdXQocmVjb3JkKTtcbiAgICByZWNvcmQuY3VycmVudEluZGV4ID0gbnVsbDtcbiAgICByZWNvcmQuX25leHRSZW1vdmVkID0gbnVsbDtcblxuICAgIGlmICh0aGlzLl9yZW1vdmFsc1RhaWwgPT09IG51bGwpIHtcbiAgICAgIC8vIHRvZG8odmljYilcbiAgICAgIC8vIGFzc2VydChfcmVtb3ZhbHNIZWFkID09PSBudWxsKTtcbiAgICAgIHRoaXMuX3JlbW92YWxzVGFpbCA9IHRoaXMuX3JlbW92YWxzSGVhZCA9IHJlY29yZDtcbiAgICAgIHJlY29yZC5fcHJldlJlbW92ZWQgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0b2RvKHZpY2IpXG4gICAgICAvLyBhc3NlcnQoX3JlbW92YWxzVGFpbC5fbmV4dFJlbW92ZWQgPT09IG51bGwpO1xuICAgICAgLy8gYXNzZXJ0KHJlY29yZC5fbmV4dFJlbW92ZWQgPT09IG51bGwpO1xuICAgICAgcmVjb3JkLl9wcmV2UmVtb3ZlZCA9IHRoaXMuX3JlbW92YWxzVGFpbDtcbiAgICAgIHRoaXMuX3JlbW92YWxzVGFpbCA9IHRoaXMuX3JlbW92YWxzVGFpbC5fbmV4dFJlbW92ZWQgPSByZWNvcmQ7XG4gICAgfVxuICAgIHJldHVybiByZWNvcmQ7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHZhciByZWNvcmQ6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQ7XG5cbiAgICB2YXIgbGlzdCA9IFtdO1xuICAgIGZvciAocmVjb3JkID0gdGhpcy5faXRIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dCkge1xuICAgICAgbGlzdC5wdXNoKHJlY29yZCk7XG4gICAgfVxuXG4gICAgdmFyIHByZXZpb3VzID0gW107XG4gICAgZm9yIChyZWNvcmQgPSB0aGlzLl9wcmV2aW91c0l0SGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHRQcmV2aW91cykge1xuICAgICAgcHJldmlvdXMucHVzaChyZWNvcmQpO1xuICAgIH1cblxuICAgIHZhciBhZGRpdGlvbnMgPSBbXTtcbiAgICBmb3IgKHJlY29yZCA9IHRoaXMuX2FkZGl0aW9uc0hlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0QWRkZWQpIHtcbiAgICAgIGFkZGl0aW9ucy5wdXNoKHJlY29yZCk7XG4gICAgfVxuICAgIHZhciBtb3ZlcyA9IFtdO1xuICAgIGZvciAocmVjb3JkID0gdGhpcy5fbW92ZXNIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dE1vdmVkKSB7XG4gICAgICBtb3Zlcy5wdXNoKHJlY29yZCk7XG4gICAgfVxuXG4gICAgdmFyIHJlbW92YWxzID0gW107XG4gICAgZm9yIChyZWNvcmQgPSB0aGlzLl9yZW1vdmFsc0hlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0UmVtb3ZlZCkge1xuICAgICAgcmVtb3ZhbHMucHVzaChyZWNvcmQpO1xuICAgIH1cblxuICAgIHJldHVybiBcImNvbGxlY3Rpb246IFwiICsgbGlzdC5qb2luKCcsICcpICsgXCJcXG5cIiArIFwicHJldmlvdXM6IFwiICsgcHJldmlvdXMuam9pbignLCAnKSArIFwiXFxuXCIgK1xuICAgICAgICAgICBcImFkZGl0aW9uczogXCIgKyBhZGRpdGlvbnMuam9pbignLCAnKSArIFwiXFxuXCIgKyBcIm1vdmVzOiBcIiArIG1vdmVzLmpvaW4oJywgJykgKyBcIlxcblwiICtcbiAgICAgICAgICAgXCJyZW1vdmFsczogXCIgKyByZW1vdmFscy5qb2luKCcsICcpICsgXCJcXG5cIjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvbkNoYW5nZVJlY29yZCB7XG4gIGN1cnJlbnRJbmRleDogbnVtYmVyID0gbnVsbDtcbiAgcHJldmlvdXNJbmRleDogbnVtYmVyID0gbnVsbDtcblxuICAvKiogQGludGVybmFsICovXG4gIF9uZXh0UHJldmlvdXM6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQgPSBudWxsO1xuICAvKiogQGludGVybmFsICovXG4gIF9wcmV2OiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkID0gbnVsbDtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfbmV4dDogQ29sbGVjdGlvbkNoYW5nZVJlY29yZCA9IG51bGw7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3ByZXZEdXA6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQgPSBudWxsO1xuICAvKiogQGludGVybmFsICovXG4gIF9uZXh0RHVwOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkID0gbnVsbDtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcHJldlJlbW92ZWQ6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQgPSBudWxsO1xuICAvKiogQGludGVybmFsICovXG4gIF9uZXh0UmVtb3ZlZDogQ29sbGVjdGlvbkNoYW5nZVJlY29yZCA9IG51bGw7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX25leHRBZGRlZDogQ29sbGVjdGlvbkNoYW5nZVJlY29yZCA9IG51bGw7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX25leHRNb3ZlZDogQ29sbGVjdGlvbkNoYW5nZVJlY29yZCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHVibGljIGl0ZW06IGFueSkge31cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnByZXZpb3VzSW5kZXggPT09IHRoaXMuY3VycmVudEluZGV4ID9cbiAgICAgICAgICAgICAgIHN0cmluZ2lmeSh0aGlzLml0ZW0pIDpcbiAgICAgICAgICAgICAgIHN0cmluZ2lmeSh0aGlzLml0ZW0pICsgJ1snICsgc3RyaW5naWZ5KHRoaXMucHJldmlvdXNJbmRleCkgKyAnLT4nICtcbiAgICAgICAgICAgICAgICAgICBzdHJpbmdpZnkodGhpcy5jdXJyZW50SW5kZXgpICsgJ10nO1xuICB9XG59XG5cbi8vIEEgbGlua2VkIGxpc3Qgb2YgQ29sbGVjdGlvbkNoYW5nZVJlY29yZHMgd2l0aCB0aGUgc2FtZSBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkLml0ZW1cbmNsYXNzIF9EdXBsaWNhdGVJdGVtUmVjb3JkTGlzdCB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2hlYWQ6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQgPSBudWxsO1xuICAvKiogQGludGVybmFsICovXG4gIF90YWlsOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkID0gbnVsbDtcblxuICAvKipcbiAgICogQXBwZW5kIHRoZSByZWNvcmQgdG8gdGhlIGxpc3Qgb2YgZHVwbGljYXRlcy5cbiAgICpcbiAgICogTm90ZTogYnkgZGVzaWduIGFsbCByZWNvcmRzIGluIHRoZSBsaXN0IG9mIGR1cGxpY2F0ZXMgaG9sZCB0aGUgc2FtZSB2YWx1ZSBpbiByZWNvcmQuaXRlbS5cbiAgICovXG4gIGFkZChyZWNvcmQ6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5faGVhZCA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5faGVhZCA9IHRoaXMuX3RhaWwgPSByZWNvcmQ7XG4gICAgICByZWNvcmQuX25leHREdXAgPSBudWxsO1xuICAgICAgcmVjb3JkLl9wcmV2RHVwID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdG9kbyh2aWNiKVxuICAgICAgLy8gYXNzZXJ0KHJlY29yZC5pdGVtID09ICBfaGVhZC5pdGVtIHx8XG4gICAgICAvLyAgICAgICByZWNvcmQuaXRlbSBpcyBudW0gJiYgcmVjb3JkLml0ZW0uaXNOYU4gJiYgX2hlYWQuaXRlbSBpcyBudW0gJiYgX2hlYWQuaXRlbS5pc05hTik7XG4gICAgICB0aGlzLl90YWlsLl9uZXh0RHVwID0gcmVjb3JkO1xuICAgICAgcmVjb3JkLl9wcmV2RHVwID0gdGhpcy5fdGFpbDtcbiAgICAgIHJlY29yZC5fbmV4dER1cCA9IG51bGw7XG4gICAgICB0aGlzLl90YWlsID0gcmVjb3JkO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJldHVybnMgYSBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkIGhhdmluZyBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkLml0ZW0gPT0gaXRlbSBhbmRcbiAgLy8gQ29sbGVjdGlvbkNoYW5nZVJlY29yZC5jdXJyZW50SW5kZXggPj0gYWZ0ZXJJbmRleFxuICBnZXQoaXRlbTogYW55LCBhZnRlckluZGV4OiBudW1iZXIpOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkIHtcbiAgICB2YXIgcmVjb3JkOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkO1xuICAgIGZvciAocmVjb3JkID0gdGhpcy5faGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHREdXApIHtcbiAgICAgIGlmICgoYWZ0ZXJJbmRleCA9PT0gbnVsbCB8fCBhZnRlckluZGV4IDwgcmVjb3JkLmN1cnJlbnRJbmRleCkgJiZcbiAgICAgICAgICBsb29zZUlkZW50aWNhbChyZWNvcmQuaXRlbSwgaXRlbSkpIHtcbiAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIG9uZSB7QGxpbmsgQ29sbGVjdGlvbkNoYW5nZVJlY29yZH0gZnJvbSB0aGUgbGlzdCBvZiBkdXBsaWNhdGVzLlxuICAgKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGxpc3Qgb2YgZHVwbGljYXRlcyBpcyBlbXB0eS5cbiAgICovXG4gIHJlbW92ZShyZWNvcmQ6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQpOiBib29sZWFuIHtcbiAgICAvLyB0b2RvKHZpY2IpXG4gICAgLy8gYXNzZXJ0KCgpIHtcbiAgICAvLyAgLy8gdmVyaWZ5IHRoYXQgdGhlIHJlY29yZCBiZWluZyByZW1vdmVkIGlzIGluIHRoZSBsaXN0LlxuICAgIC8vICBmb3IgKENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQgY3Vyc29yID0gX2hlYWQ7IGN1cnNvciAhPSBudWxsOyBjdXJzb3IgPSBjdXJzb3IuX25leHREdXApIHtcbiAgICAvLyAgICBpZiAoaWRlbnRpY2FsKGN1cnNvciwgcmVjb3JkKSkgcmV0dXJuIHRydWU7XG4gICAgLy8gIH1cbiAgICAvLyAgcmV0dXJuIGZhbHNlO1xuICAgIC8vfSk7XG5cbiAgICB2YXIgcHJldjogQ29sbGVjdGlvbkNoYW5nZVJlY29yZCA9IHJlY29yZC5fcHJldkR1cDtcbiAgICB2YXIgbmV4dDogQ29sbGVjdGlvbkNoYW5nZVJlY29yZCA9IHJlY29yZC5fbmV4dER1cDtcbiAgICBpZiAocHJldiA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5faGVhZCA9IG5leHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZXYuX25leHREdXAgPSBuZXh0O1xuICAgIH1cbiAgICBpZiAobmV4dCA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5fdGFpbCA9IHByZXY7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHQuX3ByZXZEdXAgPSBwcmV2O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5faGVhZCA9PT0gbnVsbDtcbiAgfVxufVxuXG5jbGFzcyBfRHVwbGljYXRlTWFwIHtcbiAgbWFwID0gbmV3IE1hcDxhbnksIF9EdXBsaWNhdGVJdGVtUmVjb3JkTGlzdD4oKTtcblxuICBwdXQocmVjb3JkOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkKSB7XG4gICAgLy8gdG9kbyh2aWNiKSBoYW5kbGUgY29ybmVyIGNhc2VzXG4gICAgdmFyIGtleSA9IGdldE1hcEtleShyZWNvcmQuaXRlbSk7XG5cbiAgICB2YXIgZHVwbGljYXRlcyA9IHRoaXMubWFwLmdldChrZXkpO1xuICAgIGlmICghaXNQcmVzZW50KGR1cGxpY2F0ZXMpKSB7XG4gICAgICBkdXBsaWNhdGVzID0gbmV3IF9EdXBsaWNhdGVJdGVtUmVjb3JkTGlzdCgpO1xuICAgICAgdGhpcy5tYXAuc2V0KGtleSwgZHVwbGljYXRlcyk7XG4gICAgfVxuICAgIGR1cGxpY2F0ZXMuYWRkKHJlY29yZCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgdGhlIGB2YWx1ZWAgdXNpbmcga2V5LiBCZWNhdXNlIHRoZSBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkIHZhbHVlIG1heWJlIG9uZSB3aGljaCB3ZVxuICAgKiBoYXZlIGFscmVhZHkgaXRlcmF0ZWQgb3Zlciwgd2UgdXNlIHRoZSBhZnRlckluZGV4IHRvIHByZXRlbmQgaXQgaXMgbm90IHRoZXJlLlxuICAgKlxuICAgKiBVc2UgY2FzZTogYFthLCBiLCBjLCBhLCBhXWAgaWYgd2UgYXJlIGF0IGluZGV4IGAzYCB3aGljaCBpcyB0aGUgc2Vjb25kIGBhYCB0aGVuIGFza2luZyBpZiB3ZVxuICAgKiBoYXZlIGFueSBtb3JlIGBhYHMgbmVlZHMgdG8gcmV0dXJuIHRoZSBsYXN0IGBhYCBub3QgdGhlIGZpcnN0IG9yIHNlY29uZC5cbiAgICovXG4gIGdldCh2YWx1ZTogYW55LCBhZnRlckluZGV4OiBudW1iZXIgPSBudWxsKTogQ29sbGVjdGlvbkNoYW5nZVJlY29yZCB7XG4gICAgdmFyIGtleSA9IGdldE1hcEtleSh2YWx1ZSk7XG5cbiAgICB2YXIgcmVjb3JkTGlzdCA9IHRoaXMubWFwLmdldChrZXkpO1xuICAgIHJldHVybiBpc0JsYW5rKHJlY29yZExpc3QpID8gbnVsbCA6IHJlY29yZExpc3QuZ2V0KHZhbHVlLCBhZnRlckluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEge0BsaW5rIENvbGxlY3Rpb25DaGFuZ2VSZWNvcmR9IGZyb20gdGhlIGxpc3Qgb2YgZHVwbGljYXRlcy5cbiAgICpcbiAgICogVGhlIGxpc3Qgb2YgZHVwbGljYXRlcyBhbHNvIGlzIHJlbW92ZWQgZnJvbSB0aGUgbWFwIGlmIGl0IGdldHMgZW1wdHkuXG4gICAqL1xuICByZW1vdmUocmVjb3JkOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkKTogQ29sbGVjdGlvbkNoYW5nZVJlY29yZCB7XG4gICAgdmFyIGtleSA9IGdldE1hcEtleShyZWNvcmQuaXRlbSk7XG4gICAgLy8gdG9kbyh2aWNiKVxuICAgIC8vIGFzc2VydCh0aGlzLm1hcC5jb250YWluc0tleShrZXkpKTtcbiAgICB2YXIgcmVjb3JkTGlzdDogX0R1cGxpY2F0ZUl0ZW1SZWNvcmRMaXN0ID0gdGhpcy5tYXAuZ2V0KGtleSk7XG4gICAgLy8gUmVtb3ZlIHRoZSBsaXN0IG9mIGR1cGxpY2F0ZXMgd2hlbiBpdCBnZXRzIGVtcHR5XG4gICAgaWYgKHJlY29yZExpc3QucmVtb3ZlKHJlY29yZCkpIHtcbiAgICAgIHRoaXMubWFwLmRlbGV0ZShrZXkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVjb3JkO1xuICB9XG5cbiAgZ2V0IGlzRW1wdHkoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLm1hcC5zaXplID09PSAwOyB9XG5cbiAgY2xlYXIoKSB7IHRoaXMubWFwLmNsZWFyKCk7IH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcgeyByZXR1cm4gJ19EdXBsaWNhdGVNYXAoJyArIHN0cmluZ2lmeSh0aGlzLm1hcCkgKyAnKSc7IH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vZGlmZmVycy9kZWZhdWx0X2l0ZXJhYmxlX2RpZmZlci50c1xuICoqLyIsImltcG9ydCB7aXNCbGFuaywgaXNQcmVzZW50LCBDT05TVH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7TGlzdFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge0NoYW5nZURldGVjdG9yUmVmfSBmcm9tICcuLi9jaGFuZ2VfZGV0ZWN0b3JfcmVmJztcbmltcG9ydCB7UHJvdmlkZXIsIFNraXBTZWxmTWV0YWRhdGEsIE9wdGlvbmFsTWV0YWRhdGEsIEluamVjdGFibGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpJztcblxuLyoqXG4gKiBBIGRpZmZlciB0aGF0IHRyYWNrcyBjaGFuZ2VzIG1hZGUgdG8gYW4gb2JqZWN0IG92ZXIgdGltZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBLZXlWYWx1ZURpZmZlciB7XG4gIGRpZmYob2JqZWN0OiBPYmplY3QpO1xuICBvbkRlc3Ryb3koKTtcbn1cblxuLyoqXG4gKiBQcm92aWRlcyBhIGZhY3RvcnkgZm9yIHtAbGluayBLZXlWYWx1ZURpZmZlcn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS2V5VmFsdWVEaWZmZXJGYWN0b3J5IHtcbiAgc3VwcG9ydHMob2JqZWN0czogT2JqZWN0KTogYm9vbGVhbjtcbiAgY3JlYXRlKGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZik6IEtleVZhbHVlRGlmZmVyO1xufVxuXG4vKipcbiAqIEEgcmVwb3NpdG9yeSBvZiBkaWZmZXJlbnQgTWFwIGRpZmZpbmcgc3RyYXRlZ2llcyB1c2VkIGJ5IE5nQ2xhc3MsIE5nU3R5bGUsIGFuZCBvdGhlcnMuXG4gKi9cbkBJbmplY3RhYmxlKClcbkBDT05TVCgpXG5leHBvcnQgY2xhc3MgS2V5VmFsdWVEaWZmZXJzIHtcbiAgY29uc3RydWN0b3IocHVibGljIGZhY3RvcmllczogS2V5VmFsdWVEaWZmZXJGYWN0b3J5W10pIHt9XG5cbiAgc3RhdGljIGNyZWF0ZShmYWN0b3JpZXM6IEtleVZhbHVlRGlmZmVyRmFjdG9yeVtdLCBwYXJlbnQ/OiBLZXlWYWx1ZURpZmZlcnMpOiBLZXlWYWx1ZURpZmZlcnMge1xuICAgIGlmIChpc1ByZXNlbnQocGFyZW50KSkge1xuICAgICAgdmFyIGNvcGllZCA9IExpc3RXcmFwcGVyLmNsb25lKHBhcmVudC5mYWN0b3JpZXMpO1xuICAgICAgZmFjdG9yaWVzID0gZmFjdG9yaWVzLmNvbmNhdChjb3BpZWQpO1xuICAgICAgcmV0dXJuIG5ldyBLZXlWYWx1ZURpZmZlcnMoZmFjdG9yaWVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBLZXlWYWx1ZURpZmZlcnMoZmFjdG9yaWVzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgYW4gYXJyYXkgb2Yge0BsaW5rIEtleVZhbHVlRGlmZmVyRmFjdG9yeX0gYW5kIHJldHVybnMgYSBwcm92aWRlciB1c2VkIHRvIGV4dGVuZCB0aGVcbiAgICogaW5oZXJpdGVkIHtAbGluayBLZXlWYWx1ZURpZmZlcnN9IGluc3RhbmNlIHdpdGggdGhlIHByb3ZpZGVkIGZhY3RvcmllcyBhbmQgcmV0dXJuIGEgbmV3XG4gICAqIHtAbGluayBLZXlWYWx1ZURpZmZlcnN9IGluc3RhbmNlLlxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHRvIGV4dGVuZCBhbiBleGlzdGluZyBsaXN0IG9mIGZhY3RvcmllcyxcbiAgICAgICAgICogd2hpY2ggd2lsbCBvbmx5IGJlIGFwcGxpZWQgdG8gdGhlIGluamVjdG9yIGZvciB0aGlzIGNvbXBvbmVudCBhbmQgaXRzIGNoaWxkcmVuLlxuICAgICAgICAgKiBUaGlzIHN0ZXAgaXMgYWxsIHRoYXQncyByZXF1aXJlZCB0byBtYWtlIGEgbmV3IHtAbGluayBLZXlWYWx1ZURpZmZlcn0gYXZhaWxhYmxlLlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZVxuICAgKlxuICAgKiBgYGBcbiAgICogQENvbXBvbmVudCh7XG4gICAqICAgdmlld1Byb3ZpZGVyczogW1xuICAgKiAgICAgS2V5VmFsdWVEaWZmZXJzLmV4dGVuZChbbmV3IEltbXV0YWJsZU1hcERpZmZlcigpXSlcbiAgICogICBdXG4gICAqIH0pXG4gICAqIGBgYFxuICAgKi9cbiAgc3RhdGljIGV4dGVuZChmYWN0b3JpZXM6IEtleVZhbHVlRGlmZmVyRmFjdG9yeVtdKTogUHJvdmlkZXIge1xuICAgIHJldHVybiBuZXcgUHJvdmlkZXIoS2V5VmFsdWVEaWZmZXJzLCB7XG4gICAgICB1c2VGYWN0b3J5OiAocGFyZW50OiBLZXlWYWx1ZURpZmZlcnMpID0+IHtcbiAgICAgICAgaWYgKGlzQmxhbmsocGFyZW50KSkge1xuICAgICAgICAgIC8vIFR5cGljYWxseSB3b3VsZCBvY2N1ciB3aGVuIGNhbGxpbmcgS2V5VmFsdWVEaWZmZXJzLmV4dGVuZCBpbnNpZGUgb2YgZGVwZW5kZW5jaWVzIHBhc3NlZFxuICAgICAgICAgIC8vIHRvXG4gICAgICAgICAgLy8gYm9vdHN0cmFwKCksIHdoaWNoIHdvdWxkIG92ZXJyaWRlIGRlZmF1bHQgcGlwZXMgaW5zdGVhZCBvZiBleHRlbmRpbmcgdGhlbS5cbiAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignQ2Fubm90IGV4dGVuZCBLZXlWYWx1ZURpZmZlcnMgd2l0aG91dCBhIHBhcmVudCBpbmplY3RvcicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBLZXlWYWx1ZURpZmZlcnMuY3JlYXRlKGZhY3RvcmllcywgcGFyZW50KTtcbiAgICAgIH0sXG4gICAgICAvLyBEZXBlbmRlbmN5IHRlY2huaWNhbGx5IGlzbid0IG9wdGlvbmFsLCBidXQgd2UgY2FuIHByb3ZpZGUgYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZSB0aGlzIHdheS5cbiAgICAgIGRlcHM6IFtbS2V5VmFsdWVEaWZmZXJzLCBuZXcgU2tpcFNlbGZNZXRhZGF0YSgpLCBuZXcgT3B0aW9uYWxNZXRhZGF0YSgpXV1cbiAgICB9KTtcbiAgfVxuXG4gIGZpbmQoa3Y6IE9iamVjdCk6IEtleVZhbHVlRGlmZmVyRmFjdG9yeSB7XG4gICAgdmFyIGZhY3RvcnkgPSB0aGlzLmZhY3Rvcmllcy5maW5kKGYgPT4gZi5zdXBwb3J0cyhrdikpO1xuICAgIGlmIChpc1ByZXNlbnQoZmFjdG9yeSkpIHtcbiAgICAgIHJldHVybiBmYWN0b3J5O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgQ2Fubm90IGZpbmQgYSBkaWZmZXIgc3VwcG9ydGluZyBvYmplY3QgJyR7a3Z9J2ApO1xuICAgIH1cbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9kaWZmZXJzL2tleXZhbHVlX2RpZmZlcnMudHNcbiAqKi8iLCJpbXBvcnQge01hcFdyYXBwZXIsIFN0cmluZ01hcFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge3N0cmluZ2lmeSwgbG9vc2VJZGVudGljYWwsIGlzSnNPYmplY3QsIENPTlNULCBpc0JsYW5rfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtDaGFuZ2VEZXRlY3RvclJlZn0gZnJvbSAnLi4vY2hhbmdlX2RldGVjdG9yX3JlZic7XG5pbXBvcnQge0tleVZhbHVlRGlmZmVyLCBLZXlWYWx1ZURpZmZlckZhY3Rvcnl9IGZyb20gJy4uL2RpZmZlcnMva2V5dmFsdWVfZGlmZmVycyc7XG5cbkBDT05TVCgpXG5leHBvcnQgY2xhc3MgRGVmYXVsdEtleVZhbHVlRGlmZmVyRmFjdG9yeSBpbXBsZW1lbnRzIEtleVZhbHVlRGlmZmVyRmFjdG9yeSB7XG4gIHN1cHBvcnRzKG9iajogYW55KTogYm9vbGVhbiB7IHJldHVybiBvYmogaW5zdGFuY2VvZiBNYXAgfHwgaXNKc09iamVjdChvYmopOyB9XG5cbiAgY3JlYXRlKGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZik6IEtleVZhbHVlRGlmZmVyIHsgcmV0dXJuIG5ldyBEZWZhdWx0S2V5VmFsdWVEaWZmZXIoKTsgfVxufVxuXG5leHBvcnQgY2xhc3MgRGVmYXVsdEtleVZhbHVlRGlmZmVyIGltcGxlbWVudHMgS2V5VmFsdWVEaWZmZXIge1xuICBwcml2YXRlIF9yZWNvcmRzOiBNYXA8YW55LCBhbnk+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIF9tYXBIZWFkOiBLVkNoYW5nZVJlY29yZCA9IG51bGw7XG4gIHByaXZhdGUgX3ByZXZpb3VzTWFwSGVhZDogS1ZDaGFuZ2VSZWNvcmQgPSBudWxsO1xuICBwcml2YXRlIF9jaGFuZ2VzSGVhZDogS1ZDaGFuZ2VSZWNvcmQgPSBudWxsO1xuICBwcml2YXRlIF9jaGFuZ2VzVGFpbDogS1ZDaGFuZ2VSZWNvcmQgPSBudWxsO1xuICBwcml2YXRlIF9hZGRpdGlvbnNIZWFkOiBLVkNoYW5nZVJlY29yZCA9IG51bGw7XG4gIHByaXZhdGUgX2FkZGl0aW9uc1RhaWw6IEtWQ2hhbmdlUmVjb3JkID0gbnVsbDtcbiAgcHJpdmF0ZSBfcmVtb3ZhbHNIZWFkOiBLVkNoYW5nZVJlY29yZCA9IG51bGw7XG4gIHByaXZhdGUgX3JlbW92YWxzVGFpbDogS1ZDaGFuZ2VSZWNvcmQgPSBudWxsO1xuXG4gIGdldCBpc0RpcnR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9hZGRpdGlvbnNIZWFkICE9PSBudWxsIHx8IHRoaXMuX2NoYW5nZXNIZWFkICE9PSBudWxsIHx8XG4gICAgICAgICAgIHRoaXMuX3JlbW92YWxzSGVhZCAhPT0gbnVsbDtcbiAgfVxuXG4gIGZvckVhY2hJdGVtKGZuOiBGdW5jdGlvbikge1xuICAgIHZhciByZWNvcmQ6IEtWQ2hhbmdlUmVjb3JkO1xuICAgIGZvciAocmVjb3JkID0gdGhpcy5fbWFwSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHQpIHtcbiAgICAgIGZuKHJlY29yZCk7XG4gICAgfVxuICB9XG5cbiAgZm9yRWFjaFByZXZpb3VzSXRlbShmbjogRnVuY3Rpb24pIHtcbiAgICB2YXIgcmVjb3JkOiBLVkNoYW5nZVJlY29yZDtcbiAgICBmb3IgKHJlY29yZCA9IHRoaXMuX3ByZXZpb3VzTWFwSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHRQcmV2aW91cykge1xuICAgICAgZm4ocmVjb3JkKTtcbiAgICB9XG4gIH1cblxuICBmb3JFYWNoQ2hhbmdlZEl0ZW0oZm46IEZ1bmN0aW9uKSB7XG4gICAgdmFyIHJlY29yZDogS1ZDaGFuZ2VSZWNvcmQ7XG4gICAgZm9yIChyZWNvcmQgPSB0aGlzLl9jaGFuZ2VzSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHRDaGFuZ2VkKSB7XG4gICAgICBmbihyZWNvcmQpO1xuICAgIH1cbiAgfVxuXG4gIGZvckVhY2hBZGRlZEl0ZW0oZm46IEZ1bmN0aW9uKSB7XG4gICAgdmFyIHJlY29yZDogS1ZDaGFuZ2VSZWNvcmQ7XG4gICAgZm9yIChyZWNvcmQgPSB0aGlzLl9hZGRpdGlvbnNIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dEFkZGVkKSB7XG4gICAgICBmbihyZWNvcmQpO1xuICAgIH1cbiAgfVxuXG4gIGZvckVhY2hSZW1vdmVkSXRlbShmbjogRnVuY3Rpb24pIHtcbiAgICB2YXIgcmVjb3JkOiBLVkNoYW5nZVJlY29yZDtcbiAgICBmb3IgKHJlY29yZCA9IHRoaXMuX3JlbW92YWxzSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHRSZW1vdmVkKSB7XG4gICAgICBmbihyZWNvcmQpO1xuICAgIH1cbiAgfVxuXG4gIGRpZmYobWFwOiBNYXA8YW55LCBhbnk+KTogYW55IHtcbiAgICBpZiAoaXNCbGFuayhtYXApKSBtYXAgPSBNYXBXcmFwcGVyLmNyZWF0ZUZyb21QYWlycyhbXSk7XG4gICAgaWYgKCEobWFwIGluc3RhbmNlb2YgTWFwIHx8IGlzSnNPYmplY3QobWFwKSkpIHtcbiAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBFcnJvciB0cnlpbmcgdG8gZGlmZiAnJHttYXB9J2ApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNoZWNrKG1hcCkpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBvbkRlc3Ryb3koKSB7fVxuXG4gIGNoZWNrKG1hcDogTWFwPGFueSwgYW55Pik6IGJvb2xlYW4ge1xuICAgIHRoaXMuX3Jlc2V0KCk7XG4gICAgdmFyIHJlY29yZHMgPSB0aGlzLl9yZWNvcmRzO1xuICAgIHZhciBvbGRTZXFSZWNvcmQ6IEtWQ2hhbmdlUmVjb3JkID0gdGhpcy5fbWFwSGVhZDtcbiAgICB2YXIgbGFzdE9sZFNlcVJlY29yZDogS1ZDaGFuZ2VSZWNvcmQgPSBudWxsO1xuICAgIHZhciBsYXN0TmV3U2VxUmVjb3JkOiBLVkNoYW5nZVJlY29yZCA9IG51bGw7XG4gICAgdmFyIHNlcUNoYW5nZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHRoaXMuX2ZvckVhY2gobWFwLCAodmFsdWUsIGtleSkgPT4ge1xuICAgICAgdmFyIG5ld1NlcVJlY29yZDtcbiAgICAgIGlmIChvbGRTZXFSZWNvcmQgIT09IG51bGwgJiYga2V5ID09PSBvbGRTZXFSZWNvcmQua2V5KSB7XG4gICAgICAgIG5ld1NlcVJlY29yZCA9IG9sZFNlcVJlY29yZDtcbiAgICAgICAgaWYgKCFsb29zZUlkZW50aWNhbCh2YWx1ZSwgb2xkU2VxUmVjb3JkLmN1cnJlbnRWYWx1ZSkpIHtcbiAgICAgICAgICBvbGRTZXFSZWNvcmQucHJldmlvdXNWYWx1ZSA9IG9sZFNlcVJlY29yZC5jdXJyZW50VmFsdWU7XG4gICAgICAgICAgb2xkU2VxUmVjb3JkLmN1cnJlbnRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgIHRoaXMuX2FkZFRvQ2hhbmdlcyhvbGRTZXFSZWNvcmQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXFDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgaWYgKG9sZFNlcVJlY29yZCAhPT0gbnVsbCkge1xuICAgICAgICAgIG9sZFNlcVJlY29yZC5fbmV4dCA9IG51bGw7XG4gICAgICAgICAgdGhpcy5fcmVtb3ZlRnJvbVNlcShsYXN0T2xkU2VxUmVjb3JkLCBvbGRTZXFSZWNvcmQpO1xuICAgICAgICAgIHRoaXMuX2FkZFRvUmVtb3ZhbHMob2xkU2VxUmVjb3JkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVjb3Jkcy5oYXMoa2V5KSkge1xuICAgICAgICAgIG5ld1NlcVJlY29yZCA9IHJlY29yZHMuZ2V0KGtleSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3U2VxUmVjb3JkID0gbmV3IEtWQ2hhbmdlUmVjb3JkKGtleSk7XG4gICAgICAgICAgcmVjb3Jkcy5zZXQoa2V5LCBuZXdTZXFSZWNvcmQpO1xuICAgICAgICAgIG5ld1NlcVJlY29yZC5jdXJyZW50VmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICB0aGlzLl9hZGRUb0FkZGl0aW9ucyhuZXdTZXFSZWNvcmQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzZXFDaGFuZ2VkKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc0luUmVtb3ZhbHMobmV3U2VxUmVjb3JkKSkge1xuICAgICAgICAgIHRoaXMuX3JlbW92ZUZyb21SZW1vdmFscyhuZXdTZXFSZWNvcmQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsYXN0TmV3U2VxUmVjb3JkID09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLl9tYXBIZWFkID0gbmV3U2VxUmVjb3JkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxhc3ROZXdTZXFSZWNvcmQuX25leHQgPSBuZXdTZXFSZWNvcmQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxhc3RPbGRTZXFSZWNvcmQgPSBvbGRTZXFSZWNvcmQ7XG4gICAgICBsYXN0TmV3U2VxUmVjb3JkID0gbmV3U2VxUmVjb3JkO1xuICAgICAgb2xkU2VxUmVjb3JkID0gb2xkU2VxUmVjb3JkID09PSBudWxsID8gbnVsbCA6IG9sZFNlcVJlY29yZC5fbmV4dDtcbiAgICB9KTtcbiAgICB0aGlzLl90cnVuY2F0ZShsYXN0T2xkU2VxUmVjb3JkLCBvbGRTZXFSZWNvcmQpO1xuICAgIHJldHVybiB0aGlzLmlzRGlydHk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9yZXNldCgpIHtcbiAgICBpZiAodGhpcy5pc0RpcnR5KSB7XG4gICAgICB2YXIgcmVjb3JkOiBLVkNoYW5nZVJlY29yZDtcbiAgICAgIC8vIFJlY29yZCB0aGUgc3RhdGUgb2YgdGhlIG1hcHBpbmdcbiAgICAgIGZvciAocmVjb3JkID0gdGhpcy5fcHJldmlvdXNNYXBIZWFkID0gdGhpcy5fbWFwSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHQpIHtcbiAgICAgICAgcmVjb3JkLl9uZXh0UHJldmlvdXMgPSByZWNvcmQuX25leHQ7XG4gICAgICB9XG5cbiAgICAgIGZvciAocmVjb3JkID0gdGhpcy5fY2hhbmdlc0hlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0Q2hhbmdlZCkge1xuICAgICAgICByZWNvcmQucHJldmlvdXNWYWx1ZSA9IHJlY29yZC5jdXJyZW50VmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGZvciAocmVjb3JkID0gdGhpcy5fYWRkaXRpb25zSGVhZDsgcmVjb3JkICE9IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dEFkZGVkKSB7XG4gICAgICAgIHJlY29yZC5wcmV2aW91c1ZhbHVlID0gcmVjb3JkLmN1cnJlbnRWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gdG9kbyh2aWNiKSBvbmNlIGFzc2VydCBpcyBzdXBwb3J0ZWRcbiAgICAgIC8vIGFzc2VydCgoKSB7XG4gICAgICAvLyAgdmFyIHIgPSBfY2hhbmdlc0hlYWQ7XG4gICAgICAvLyAgd2hpbGUgKHIgIT0gbnVsbCkge1xuICAgICAgLy8gICAgdmFyIG5leHRSZWNvcmQgPSByLl9uZXh0Q2hhbmdlZDtcbiAgICAgIC8vICAgIHIuX25leHRDaGFuZ2VkID0gbnVsbDtcbiAgICAgIC8vICAgIHIgPSBuZXh0UmVjb3JkO1xuICAgICAgLy8gIH1cbiAgICAgIC8vXG4gICAgICAvLyAgciA9IF9hZGRpdGlvbnNIZWFkO1xuICAgICAgLy8gIHdoaWxlIChyICE9IG51bGwpIHtcbiAgICAgIC8vICAgIHZhciBuZXh0UmVjb3JkID0gci5fbmV4dEFkZGVkO1xuICAgICAgLy8gICAgci5fbmV4dEFkZGVkID0gbnVsbDtcbiAgICAgIC8vICAgIHIgPSBuZXh0UmVjb3JkO1xuICAgICAgLy8gIH1cbiAgICAgIC8vXG4gICAgICAvLyAgciA9IF9yZW1vdmFsc0hlYWQ7XG4gICAgICAvLyAgd2hpbGUgKHIgIT0gbnVsbCkge1xuICAgICAgLy8gICAgdmFyIG5leHRSZWNvcmQgPSByLl9uZXh0UmVtb3ZlZDtcbiAgICAgIC8vICAgIHIuX25leHRSZW1vdmVkID0gbnVsbDtcbiAgICAgIC8vICAgIHIgPSBuZXh0UmVjb3JkO1xuICAgICAgLy8gIH1cbiAgICAgIC8vXG4gICAgICAvLyAgcmV0dXJuIHRydWU7XG4gICAgICAvL30pO1xuICAgICAgdGhpcy5fY2hhbmdlc0hlYWQgPSB0aGlzLl9jaGFuZ2VzVGFpbCA9IG51bGw7XG4gICAgICB0aGlzLl9hZGRpdGlvbnNIZWFkID0gdGhpcy5fYWRkaXRpb25zVGFpbCA9IG51bGw7XG4gICAgICB0aGlzLl9yZW1vdmFsc0hlYWQgPSB0aGlzLl9yZW1vdmFsc1RhaWwgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3RydW5jYXRlKGxhc3RSZWNvcmQ6IEtWQ2hhbmdlUmVjb3JkLCByZWNvcmQ6IEtWQ2hhbmdlUmVjb3JkKSB7XG4gICAgd2hpbGUgKHJlY29yZCAhPT0gbnVsbCkge1xuICAgICAgaWYgKGxhc3RSZWNvcmQgPT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5fbWFwSGVhZCA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsYXN0UmVjb3JkLl9uZXh0ID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHZhciBuZXh0UmVjb3JkID0gcmVjb3JkLl9uZXh0O1xuICAgICAgLy8gdG9kbyh2aWNiKSBhc3NlcnRcbiAgICAgIC8vIGFzc2VydCgoKCkge1xuICAgICAgLy8gIHJlY29yZC5fbmV4dCA9IG51bGw7XG4gICAgICAvLyAgcmV0dXJuIHRydWU7XG4gICAgICAvL30pKTtcbiAgICAgIHRoaXMuX2FkZFRvUmVtb3ZhbHMocmVjb3JkKTtcbiAgICAgIGxhc3RSZWNvcmQgPSByZWNvcmQ7XG4gICAgICByZWNvcmQgPSBuZXh0UmVjb3JkO1xuICAgIH1cblxuICAgIGZvciAodmFyIHJlYzogS1ZDaGFuZ2VSZWNvcmQgPSB0aGlzLl9yZW1vdmFsc0hlYWQ7IHJlYyAhPT0gbnVsbDsgcmVjID0gcmVjLl9uZXh0UmVtb3ZlZCkge1xuICAgICAgcmVjLnByZXZpb3VzVmFsdWUgPSByZWMuY3VycmVudFZhbHVlO1xuICAgICAgcmVjLmN1cnJlbnRWYWx1ZSA9IG51bGw7XG4gICAgICB0aGlzLl9yZWNvcmRzLmRlbGV0ZShyZWMua2V5KTtcbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9pc0luUmVtb3ZhbHMocmVjb3JkOiBLVkNoYW5nZVJlY29yZCkge1xuICAgIHJldHVybiByZWNvcmQgPT09IHRoaXMuX3JlbW92YWxzSGVhZCB8fCByZWNvcmQuX25leHRSZW1vdmVkICE9PSBudWxsIHx8XG4gICAgICAgICAgIHJlY29yZC5fcHJldlJlbW92ZWQgIT09IG51bGw7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9hZGRUb1JlbW92YWxzKHJlY29yZDogS1ZDaGFuZ2VSZWNvcmQpIHtcbiAgICAvLyB0b2RvKHZpY2IpIGFzc2VydFxuICAgIC8vIGFzc2VydChyZWNvcmQuX25leHQgPT0gbnVsbCk7XG4gICAgLy8gYXNzZXJ0KHJlY29yZC5fbmV4dEFkZGVkID09IG51bGwpO1xuICAgIC8vIGFzc2VydChyZWNvcmQuX25leHRDaGFuZ2VkID09IG51bGwpO1xuICAgIC8vIGFzc2VydChyZWNvcmQuX25leHRSZW1vdmVkID09IG51bGwpO1xuICAgIC8vIGFzc2VydChyZWNvcmQuX3ByZXZSZW1vdmVkID09IG51bGwpO1xuICAgIGlmICh0aGlzLl9yZW1vdmFsc0hlYWQgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuX3JlbW92YWxzSGVhZCA9IHRoaXMuX3JlbW92YWxzVGFpbCA9IHJlY29yZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcmVtb3ZhbHNUYWlsLl9uZXh0UmVtb3ZlZCA9IHJlY29yZDtcbiAgICAgIHJlY29yZC5fcHJldlJlbW92ZWQgPSB0aGlzLl9yZW1vdmFsc1RhaWw7XG4gICAgICB0aGlzLl9yZW1vdmFsc1RhaWwgPSByZWNvcmQ7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcmVtb3ZlRnJvbVNlcShwcmV2OiBLVkNoYW5nZVJlY29yZCwgcmVjb3JkOiBLVkNoYW5nZVJlY29yZCkge1xuICAgIHZhciBuZXh0ID0gcmVjb3JkLl9uZXh0O1xuICAgIGlmIChwcmV2ID09PSBudWxsKSB7XG4gICAgICB0aGlzLl9tYXBIZWFkID0gbmV4dDtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJldi5fbmV4dCA9IG5leHQ7XG4gICAgfVxuICAgIC8vIHRvZG8odmljYikgYXNzZXJ0XG4gICAgLy8gYXNzZXJ0KCgoKSB7XG4gICAgLy8gIHJlY29yZC5fbmV4dCA9IG51bGw7XG4gICAgLy8gIHJldHVybiB0cnVlO1xuICAgIC8vfSkoKSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9yZW1vdmVGcm9tUmVtb3ZhbHMocmVjb3JkOiBLVkNoYW5nZVJlY29yZCkge1xuICAgIC8vIHRvZG8odmljYikgYXNzZXJ0XG4gICAgLy8gYXNzZXJ0KHJlY29yZC5fbmV4dCA9PSBudWxsKTtcbiAgICAvLyBhc3NlcnQocmVjb3JkLl9uZXh0QWRkZWQgPT0gbnVsbCk7XG4gICAgLy8gYXNzZXJ0KHJlY29yZC5fbmV4dENoYW5nZWQgPT0gbnVsbCk7XG5cbiAgICB2YXIgcHJldiA9IHJlY29yZC5fcHJldlJlbW92ZWQ7XG4gICAgdmFyIG5leHQgPSByZWNvcmQuX25leHRSZW1vdmVkO1xuICAgIGlmIChwcmV2ID09PSBudWxsKSB7XG4gICAgICB0aGlzLl9yZW1vdmFsc0hlYWQgPSBuZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICBwcmV2Ll9uZXh0UmVtb3ZlZCA9IG5leHQ7XG4gICAgfVxuICAgIGlmIChuZXh0ID09PSBudWxsKSB7XG4gICAgICB0aGlzLl9yZW1vdmFsc1RhaWwgPSBwcmV2O1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0Ll9wcmV2UmVtb3ZlZCA9IHByZXY7XG4gICAgfVxuICAgIHJlY29yZC5fcHJldlJlbW92ZWQgPSByZWNvcmQuX25leHRSZW1vdmVkID0gbnVsbDtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2FkZFRvQWRkaXRpb25zKHJlY29yZDogS1ZDaGFuZ2VSZWNvcmQpIHtcbiAgICAvLyB0b2RvKHZpY2IpOiBhc3NlcnRcbiAgICAvLyBhc3NlcnQocmVjb3JkLl9uZXh0ID09IG51bGwpO1xuICAgIC8vIGFzc2VydChyZWNvcmQuX25leHRBZGRlZCA9PSBudWxsKTtcbiAgICAvLyBhc3NlcnQocmVjb3JkLl9uZXh0Q2hhbmdlZCA9PSBudWxsKTtcbiAgICAvLyBhc3NlcnQocmVjb3JkLl9uZXh0UmVtb3ZlZCA9PSBudWxsKTtcbiAgICAvLyBhc3NlcnQocmVjb3JkLl9wcmV2UmVtb3ZlZCA9PSBudWxsKTtcbiAgICBpZiAodGhpcy5fYWRkaXRpb25zSGVhZCA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5fYWRkaXRpb25zSGVhZCA9IHRoaXMuX2FkZGl0aW9uc1RhaWwgPSByZWNvcmQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2FkZGl0aW9uc1RhaWwuX25leHRBZGRlZCA9IHJlY29yZDtcbiAgICAgIHRoaXMuX2FkZGl0aW9uc1RhaWwgPSByZWNvcmQ7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfYWRkVG9DaGFuZ2VzKHJlY29yZDogS1ZDaGFuZ2VSZWNvcmQpIHtcbiAgICAvLyB0b2RvKHZpY2IpIGFzc2VydFxuICAgIC8vIGFzc2VydChyZWNvcmQuX25leHRBZGRlZCA9PSBudWxsKTtcbiAgICAvLyBhc3NlcnQocmVjb3JkLl9uZXh0Q2hhbmdlZCA9PSBudWxsKTtcbiAgICAvLyBhc3NlcnQocmVjb3JkLl9uZXh0UmVtb3ZlZCA9PSBudWxsKTtcbiAgICAvLyBhc3NlcnQocmVjb3JkLl9wcmV2UmVtb3ZlZCA9PSBudWxsKTtcbiAgICBpZiAodGhpcy5fY2hhbmdlc0hlYWQgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuX2NoYW5nZXNIZWFkID0gdGhpcy5fY2hhbmdlc1RhaWwgPSByZWNvcmQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2NoYW5nZXNUYWlsLl9uZXh0Q2hhbmdlZCA9IHJlY29yZDtcbiAgICAgIHRoaXMuX2NoYW5nZXNUYWlsID0gcmVjb3JkO1xuICAgIH1cbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgdmFyIGl0ZW1zID0gW107XG4gICAgdmFyIHByZXZpb3VzID0gW107XG4gICAgdmFyIGNoYW5nZXMgPSBbXTtcbiAgICB2YXIgYWRkaXRpb25zID0gW107XG4gICAgdmFyIHJlbW92YWxzID0gW107XG4gICAgdmFyIHJlY29yZDogS1ZDaGFuZ2VSZWNvcmQ7XG5cbiAgICBmb3IgKHJlY29yZCA9IHRoaXMuX21hcEhlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0KSB7XG4gICAgICBpdGVtcy5wdXNoKHN0cmluZ2lmeShyZWNvcmQpKTtcbiAgICB9XG4gICAgZm9yIChyZWNvcmQgPSB0aGlzLl9wcmV2aW91c01hcEhlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0UHJldmlvdXMpIHtcbiAgICAgIHByZXZpb3VzLnB1c2goc3RyaW5naWZ5KHJlY29yZCkpO1xuICAgIH1cbiAgICBmb3IgKHJlY29yZCA9IHRoaXMuX2NoYW5nZXNIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dENoYW5nZWQpIHtcbiAgICAgIGNoYW5nZXMucHVzaChzdHJpbmdpZnkocmVjb3JkKSk7XG4gICAgfVxuICAgIGZvciAocmVjb3JkID0gdGhpcy5fYWRkaXRpb25zSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHRBZGRlZCkge1xuICAgICAgYWRkaXRpb25zLnB1c2goc3RyaW5naWZ5KHJlY29yZCkpO1xuICAgIH1cbiAgICBmb3IgKHJlY29yZCA9IHRoaXMuX3JlbW92YWxzSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHRSZW1vdmVkKSB7XG4gICAgICByZW1vdmFscy5wdXNoKHN0cmluZ2lmeShyZWNvcmQpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gXCJtYXA6IFwiICsgaXRlbXMuam9pbignLCAnKSArIFwiXFxuXCIgKyBcInByZXZpb3VzOiBcIiArIHByZXZpb3VzLmpvaW4oJywgJykgKyBcIlxcblwiICtcbiAgICAgICAgICAgXCJhZGRpdGlvbnM6IFwiICsgYWRkaXRpb25zLmpvaW4oJywgJykgKyBcIlxcblwiICsgXCJjaGFuZ2VzOiBcIiArIGNoYW5nZXMuam9pbignLCAnKSArIFwiXFxuXCIgK1xuICAgICAgICAgICBcInJlbW92YWxzOiBcIiArIHJlbW92YWxzLmpvaW4oJywgJykgKyBcIlxcblwiO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZm9yRWFjaChvYmosIGZuOiBGdW5jdGlvbikge1xuICAgIGlmIChvYmogaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICg8TWFwPGFueSwgYW55Pj5vYmopLmZvckVhY2goPGFueT5mbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIFN0cmluZ01hcFdyYXBwZXIuZm9yRWFjaChvYmosIGZuKTtcbiAgICB9XG4gIH1cbn1cblxuXG5leHBvcnQgY2xhc3MgS1ZDaGFuZ2VSZWNvcmQge1xuICBwcmV2aW91c1ZhbHVlOiBhbnkgPSBudWxsO1xuICBjdXJyZW50VmFsdWU6IGFueSA9IG51bGw7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfbmV4dFByZXZpb3VzOiBLVkNoYW5nZVJlY29yZCA9IG51bGw7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX25leHQ6IEtWQ2hhbmdlUmVjb3JkID0gbnVsbDtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfbmV4dEFkZGVkOiBLVkNoYW5nZVJlY29yZCA9IG51bGw7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX25leHRSZW1vdmVkOiBLVkNoYW5nZVJlY29yZCA9IG51bGw7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3ByZXZSZW1vdmVkOiBLVkNoYW5nZVJlY29yZCA9IG51bGw7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX25leHRDaGFuZ2VkOiBLVkNoYW5nZVJlY29yZCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHVibGljIGtleTogYW55KSB7fVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGxvb3NlSWRlbnRpY2FsKHRoaXMucHJldmlvdXNWYWx1ZSwgdGhpcy5jdXJyZW50VmFsdWUpID9cbiAgICAgICAgICAgICAgIHN0cmluZ2lmeSh0aGlzLmtleSkgOlxuICAgICAgICAgICAgICAgKHN0cmluZ2lmeSh0aGlzLmtleSkgKyAnWycgKyBzdHJpbmdpZnkodGhpcy5wcmV2aW91c1ZhbHVlKSArICctPicgK1xuICAgICAgICAgICAgICAgIHN0cmluZ2lmeSh0aGlzLmN1cnJlbnRWYWx1ZSkgKyAnXScpO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2RpZmZlcnMvZGVmYXVsdF9rZXl2YWx1ZV9kaWZmZXIudHNcbiAqKi8iLCJpbXBvcnQge0xpc3RXcmFwcGVyfSBmcm9tIFwiYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBBU1Qge1xuICB2aXNpdCh2aXNpdG9yOiBBc3RWaXNpdG9yKTogYW55IHsgcmV0dXJuIG51bGw7IH1cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHsgcmV0dXJuIFwiQVNUXCI7IH1cbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcXVvdGVkIGV4cHJlc3Npb24gb2YgdGhlIGZvcm06XG4gKlxuICogcXVvdGUgPSBwcmVmaXggYDpgIHVuaW50ZXJwcmV0ZWRFeHByZXNzaW9uXG4gKiBwcmVmaXggPSBpZGVudGlmaWVyXG4gKiB1bmludGVycHJldGVkRXhwcmVzc2lvbiA9IGFyYml0cmFyeSBzdHJpbmdcbiAqXG4gKiBBIHF1b3RlZCBleHByZXNzaW9uIGlzIG1lYW50IHRvIGJlIHByZS1wcm9jZXNzZWQgYnkgYW4gQVNUIHRyYW5zZm9ybWVyIHRoYXRcbiAqIGNvbnZlcnRzIGl0IGludG8gYW5vdGhlciBBU1QgdGhhdCBubyBsb25nZXIgY29udGFpbnMgcXVvdGVkIGV4cHJlc3Npb25zLlxuICogSXQgaXMgbWVhbnQgdG8gYWxsb3cgdGhpcmQtcGFydHkgZGV2ZWxvcGVycyB0byBleHRlbmQgQW5ndWxhciB0ZW1wbGF0ZVxuICogZXhwcmVzc2lvbiBsYW5ndWFnZS4gVGhlIGB1bmludGVycHJldGVkRXhwcmVzc2lvbmAgcGFydCBvZiB0aGUgcXVvdGUgaXNcbiAqIHRoZXJlZm9yZSBub3QgaW50ZXJwcmV0ZWQgYnkgdGhlIEFuZ3VsYXIncyBvd24gZXhwcmVzc2lvbiBwYXJzZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBRdW90ZSBleHRlbmRzIEFTVCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwcmVmaXg6IHN0cmluZywgcHVibGljIHVuaW50ZXJwcmV0ZWRFeHByZXNzaW9uOiBzdHJpbmcsIHB1YmxpYyBsb2NhdGlvbjogYW55KSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICB2aXNpdCh2aXNpdG9yOiBBc3RWaXNpdG9yKTogYW55IHsgcmV0dXJuIHZpc2l0b3IudmlzaXRRdW90ZSh0aGlzKTsgfVxuICB0b1N0cmluZygpOiBzdHJpbmcgeyByZXR1cm4gXCJRdW90ZVwiOyB9XG59XG5cbmV4cG9ydCBjbGFzcyBFbXB0eUV4cHIgZXh0ZW5kcyBBU1Qge1xuICB2aXNpdCh2aXNpdG9yOiBBc3RWaXNpdG9yKSB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbXBsaWNpdFJlY2VpdmVyIGV4dGVuZHMgQVNUIHtcbiAgdmlzaXQodmlzaXRvcjogQXN0VmlzaXRvcik6IGFueSB7IHJldHVybiB2aXNpdG9yLnZpc2l0SW1wbGljaXRSZWNlaXZlcih0aGlzKTsgfVxufVxuXG4vKipcbiAqIE11bHRpcGxlIGV4cHJlc3Npb25zIHNlcGFyYXRlZCBieSBhIHNlbWljb2xvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIENoYWluIGV4dGVuZHMgQVNUIHtcbiAgY29uc3RydWN0b3IocHVibGljIGV4cHJlc3Npb25zOiBhbnlbXSkgeyBzdXBlcigpOyB9XG4gIHZpc2l0KHZpc2l0b3I6IEFzdFZpc2l0b3IpOiBhbnkgeyByZXR1cm4gdmlzaXRvci52aXNpdENoYWluKHRoaXMpOyB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb25kaXRpb25hbCBleHRlbmRzIEFTVCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBjb25kaXRpb246IEFTVCwgcHVibGljIHRydWVFeHA6IEFTVCwgcHVibGljIGZhbHNlRXhwOiBBU1QpIHsgc3VwZXIoKTsgfVxuICB2aXNpdCh2aXNpdG9yOiBBc3RWaXNpdG9yKTogYW55IHsgcmV0dXJuIHZpc2l0b3IudmlzaXRDb25kaXRpb25hbCh0aGlzKTsgfVxufVxuXG5leHBvcnQgY2xhc3MgUHJvcGVydHlSZWFkIGV4dGVuZHMgQVNUIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlY2VpdmVyOiBBU1QsIHB1YmxpYyBuYW1lOiBzdHJpbmcsIHB1YmxpYyBnZXR0ZXI6IEZ1bmN0aW9uKSB7IHN1cGVyKCk7IH1cbiAgdmlzaXQodmlzaXRvcjogQXN0VmlzaXRvcik6IGFueSB7IHJldHVybiB2aXNpdG9yLnZpc2l0UHJvcGVydHlSZWFkKHRoaXMpOyB9XG59XG5cbmV4cG9ydCBjbGFzcyBQcm9wZXJ0eVdyaXRlIGV4dGVuZHMgQVNUIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlY2VpdmVyOiBBU1QsIHB1YmxpYyBuYW1lOiBzdHJpbmcsIHB1YmxpYyBzZXR0ZXI6IEZ1bmN0aW9uLFxuICAgICAgICAgICAgICBwdWJsaWMgdmFsdWU6IEFTVCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgdmlzaXQodmlzaXRvcjogQXN0VmlzaXRvcik6IGFueSB7IHJldHVybiB2aXNpdG9yLnZpc2l0UHJvcGVydHlXcml0ZSh0aGlzKTsgfVxufVxuXG5leHBvcnQgY2xhc3MgU2FmZVByb3BlcnR5UmVhZCBleHRlbmRzIEFTVCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWNlaXZlcjogQVNULCBwdWJsaWMgbmFtZTogc3RyaW5nLCBwdWJsaWMgZ2V0dGVyOiBGdW5jdGlvbikgeyBzdXBlcigpOyB9XG4gIHZpc2l0KHZpc2l0b3I6IEFzdFZpc2l0b3IpOiBhbnkgeyByZXR1cm4gdmlzaXRvci52aXNpdFNhZmVQcm9wZXJ0eVJlYWQodGhpcyk7IH1cbn1cblxuZXhwb3J0IGNsYXNzIEtleWVkUmVhZCBleHRlbmRzIEFTVCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBvYmo6IEFTVCwgcHVibGljIGtleTogQVNUKSB7IHN1cGVyKCk7IH1cbiAgdmlzaXQodmlzaXRvcjogQXN0VmlzaXRvcik6IGFueSB7IHJldHVybiB2aXNpdG9yLnZpc2l0S2V5ZWRSZWFkKHRoaXMpOyB9XG59XG5cbmV4cG9ydCBjbGFzcyBLZXllZFdyaXRlIGV4dGVuZHMgQVNUIHtcbiAgY29uc3RydWN0b3IocHVibGljIG9iajogQVNULCBwdWJsaWMga2V5OiBBU1QsIHB1YmxpYyB2YWx1ZTogQVNUKSB7IHN1cGVyKCk7IH1cbiAgdmlzaXQodmlzaXRvcjogQXN0VmlzaXRvcik6IGFueSB7IHJldHVybiB2aXNpdG9yLnZpc2l0S2V5ZWRXcml0ZSh0aGlzKTsgfVxufVxuXG5leHBvcnQgY2xhc3MgQmluZGluZ1BpcGUgZXh0ZW5kcyBBU1Qge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZXhwOiBBU1QsIHB1YmxpYyBuYW1lOiBzdHJpbmcsIHB1YmxpYyBhcmdzOiBhbnlbXSkgeyBzdXBlcigpOyB9XG4gIHZpc2l0KHZpc2l0b3I6IEFzdFZpc2l0b3IpOiBhbnkgeyByZXR1cm4gdmlzaXRvci52aXNpdFBpcGUodGhpcyk7IH1cbn1cblxuZXhwb3J0IGNsYXNzIExpdGVyYWxQcmltaXRpdmUgZXh0ZW5kcyBBU1Qge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdmFsdWUpIHsgc3VwZXIoKTsgfVxuICB2aXNpdCh2aXNpdG9yOiBBc3RWaXNpdG9yKTogYW55IHsgcmV0dXJuIHZpc2l0b3IudmlzaXRMaXRlcmFsUHJpbWl0aXZlKHRoaXMpOyB9XG59XG5cbmV4cG9ydCBjbGFzcyBMaXRlcmFsQXJyYXkgZXh0ZW5kcyBBU1Qge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZXhwcmVzc2lvbnM6IGFueVtdKSB7IHN1cGVyKCk7IH1cbiAgdmlzaXQodmlzaXRvcjogQXN0VmlzaXRvcik6IGFueSB7IHJldHVybiB2aXNpdG9yLnZpc2l0TGl0ZXJhbEFycmF5KHRoaXMpOyB9XG59XG5cbmV4cG9ydCBjbGFzcyBMaXRlcmFsTWFwIGV4dGVuZHMgQVNUIHtcbiAgY29uc3RydWN0b3IocHVibGljIGtleXM6IGFueVtdLCBwdWJsaWMgdmFsdWVzOiBhbnlbXSkgeyBzdXBlcigpOyB9XG4gIHZpc2l0KHZpc2l0b3I6IEFzdFZpc2l0b3IpOiBhbnkgeyByZXR1cm4gdmlzaXRvci52aXNpdExpdGVyYWxNYXAodGhpcyk7IH1cbn1cblxuZXhwb3J0IGNsYXNzIEludGVycG9sYXRpb24gZXh0ZW5kcyBBU1Qge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgc3RyaW5nczogYW55W10sIHB1YmxpYyBleHByZXNzaW9uczogYW55W10pIHsgc3VwZXIoKTsgfVxuICB2aXNpdCh2aXNpdG9yOiBBc3RWaXNpdG9yKTogYW55IHsgcmV0dXJuIHZpc2l0b3IudmlzaXRJbnRlcnBvbGF0aW9uKHRoaXMpOyB9XG59XG5cbmV4cG9ydCBjbGFzcyBCaW5hcnkgZXh0ZW5kcyBBU1Qge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgb3BlcmF0aW9uOiBzdHJpbmcsIHB1YmxpYyBsZWZ0OiBBU1QsIHB1YmxpYyByaWdodDogQVNUKSB7IHN1cGVyKCk7IH1cbiAgdmlzaXQodmlzaXRvcjogQXN0VmlzaXRvcik6IGFueSB7IHJldHVybiB2aXNpdG9yLnZpc2l0QmluYXJ5KHRoaXMpOyB9XG59XG5cbmV4cG9ydCBjbGFzcyBQcmVmaXhOb3QgZXh0ZW5kcyBBU1Qge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZXhwcmVzc2lvbjogQVNUKSB7IHN1cGVyKCk7IH1cbiAgdmlzaXQodmlzaXRvcjogQXN0VmlzaXRvcik6IGFueSB7IHJldHVybiB2aXNpdG9yLnZpc2l0UHJlZml4Tm90KHRoaXMpOyB9XG59XG5cbmV4cG9ydCBjbGFzcyBNZXRob2RDYWxsIGV4dGVuZHMgQVNUIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlY2VpdmVyOiBBU1QsIHB1YmxpYyBuYW1lOiBzdHJpbmcsIHB1YmxpYyBmbjogRnVuY3Rpb24sIHB1YmxpYyBhcmdzOiBhbnlbXSkge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgdmlzaXQodmlzaXRvcjogQXN0VmlzaXRvcik6IGFueSB7IHJldHVybiB2aXNpdG9yLnZpc2l0TWV0aG9kQ2FsbCh0aGlzKTsgfVxufVxuXG5leHBvcnQgY2xhc3MgU2FmZU1ldGhvZENhbGwgZXh0ZW5kcyBBU1Qge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVjZWl2ZXI6IEFTVCwgcHVibGljIG5hbWU6IHN0cmluZywgcHVibGljIGZuOiBGdW5jdGlvbiwgcHVibGljIGFyZ3M6IGFueVtdKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICB2aXNpdCh2aXNpdG9yOiBBc3RWaXNpdG9yKTogYW55IHsgcmV0dXJuIHZpc2l0b3IudmlzaXRTYWZlTWV0aG9kQ2FsbCh0aGlzKTsgfVxufVxuXG5leHBvcnQgY2xhc3MgRnVuY3Rpb25DYWxsIGV4dGVuZHMgQVNUIHtcbiAgY29uc3RydWN0b3IocHVibGljIHRhcmdldDogQVNULCBwdWJsaWMgYXJnczogYW55W10pIHsgc3VwZXIoKTsgfVxuICB2aXNpdCh2aXNpdG9yOiBBc3RWaXNpdG9yKTogYW55IHsgcmV0dXJuIHZpc2l0b3IudmlzaXRGdW5jdGlvbkNhbGwodGhpcyk7IH1cbn1cblxuZXhwb3J0IGNsYXNzIEFTVFdpdGhTb3VyY2UgZXh0ZW5kcyBBU1Qge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgYXN0OiBBU1QsIHB1YmxpYyBzb3VyY2U6IHN0cmluZywgcHVibGljIGxvY2F0aW9uOiBzdHJpbmcpIHsgc3VwZXIoKTsgfVxuICB2aXNpdCh2aXNpdG9yOiBBc3RWaXNpdG9yKTogYW55IHsgcmV0dXJuIHRoaXMuYXN0LnZpc2l0KHZpc2l0b3IpOyB9XG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7IHJldHVybiBgJHt0aGlzLnNvdXJjZX0gaW4gJHt0aGlzLmxvY2F0aW9ufWA7IH1cbn1cblxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlQmluZGluZyB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBrZXk6IHN0cmluZywgcHVibGljIGtleUlzVmFyOiBib29sZWFuLCBwdWJsaWMgbmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICBwdWJsaWMgZXhwcmVzc2lvbjogQVNUV2l0aFNvdXJjZSkge31cbn1cblxuZXhwb3J0IGludGVyZmFjZSBBc3RWaXNpdG9yIHtcbiAgdmlzaXRCaW5hcnkoYXN0OiBCaW5hcnkpOiBhbnk7XG4gIHZpc2l0Q2hhaW4oYXN0OiBDaGFpbik6IGFueTtcbiAgdmlzaXRDb25kaXRpb25hbChhc3Q6IENvbmRpdGlvbmFsKTogYW55O1xuICB2aXNpdEZ1bmN0aW9uQ2FsbChhc3Q6IEZ1bmN0aW9uQ2FsbCk6IGFueTtcbiAgdmlzaXRJbXBsaWNpdFJlY2VpdmVyKGFzdDogSW1wbGljaXRSZWNlaXZlcik6IGFueTtcbiAgdmlzaXRJbnRlcnBvbGF0aW9uKGFzdDogSW50ZXJwb2xhdGlvbik6IGFueTtcbiAgdmlzaXRLZXllZFJlYWQoYXN0OiBLZXllZFJlYWQpOiBhbnk7XG4gIHZpc2l0S2V5ZWRXcml0ZShhc3Q6IEtleWVkV3JpdGUpOiBhbnk7XG4gIHZpc2l0TGl0ZXJhbEFycmF5KGFzdDogTGl0ZXJhbEFycmF5KTogYW55O1xuICB2aXNpdExpdGVyYWxNYXAoYXN0OiBMaXRlcmFsTWFwKTogYW55O1xuICB2aXNpdExpdGVyYWxQcmltaXRpdmUoYXN0OiBMaXRlcmFsUHJpbWl0aXZlKTogYW55O1xuICB2aXNpdE1ldGhvZENhbGwoYXN0OiBNZXRob2RDYWxsKTogYW55O1xuICB2aXNpdFBpcGUoYXN0OiBCaW5kaW5nUGlwZSk6IGFueTtcbiAgdmlzaXRQcmVmaXhOb3QoYXN0OiBQcmVmaXhOb3QpOiBhbnk7XG4gIHZpc2l0UHJvcGVydHlSZWFkKGFzdDogUHJvcGVydHlSZWFkKTogYW55O1xuICB2aXNpdFByb3BlcnR5V3JpdGUoYXN0OiBQcm9wZXJ0eVdyaXRlKTogYW55O1xuICB2aXNpdFF1b3RlKGFzdDogUXVvdGUpOiBhbnk7XG4gIHZpc2l0U2FmZU1ldGhvZENhbGwoYXN0OiBTYWZlTWV0aG9kQ2FsbCk6IGFueTtcbiAgdmlzaXRTYWZlUHJvcGVydHlSZWFkKGFzdDogU2FmZVByb3BlcnR5UmVhZCk6IGFueTtcbn1cblxuZXhwb3J0IGNsYXNzIFJlY3Vyc2l2ZUFzdFZpc2l0b3IgaW1wbGVtZW50cyBBc3RWaXNpdG9yIHtcbiAgdmlzaXRCaW5hcnkoYXN0OiBCaW5hcnkpOiBhbnkge1xuICAgIGFzdC5sZWZ0LnZpc2l0KHRoaXMpO1xuICAgIGFzdC5yaWdodC52aXNpdCh0aGlzKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2aXNpdENoYWluKGFzdDogQ2hhaW4pOiBhbnkgeyByZXR1cm4gdGhpcy52aXNpdEFsbChhc3QuZXhwcmVzc2lvbnMpOyB9XG4gIHZpc2l0Q29uZGl0aW9uYWwoYXN0OiBDb25kaXRpb25hbCk6IGFueSB7XG4gICAgYXN0LmNvbmRpdGlvbi52aXNpdCh0aGlzKTtcbiAgICBhc3QudHJ1ZUV4cC52aXNpdCh0aGlzKTtcbiAgICBhc3QuZmFsc2VFeHAudmlzaXQodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmlzaXRQaXBlKGFzdDogQmluZGluZ1BpcGUpOiBhbnkge1xuICAgIGFzdC5leHAudmlzaXQodGhpcyk7XG4gICAgdGhpcy52aXNpdEFsbChhc3QuYXJncyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmlzaXRGdW5jdGlvbkNhbGwoYXN0OiBGdW5jdGlvbkNhbGwpOiBhbnkge1xuICAgIGFzdC50YXJnZXQudmlzaXQodGhpcyk7XG4gICAgdGhpcy52aXNpdEFsbChhc3QuYXJncyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmlzaXRJbXBsaWNpdFJlY2VpdmVyKGFzdDogSW1wbGljaXRSZWNlaXZlcik6IGFueSB7IHJldHVybiBudWxsOyB9XG4gIHZpc2l0SW50ZXJwb2xhdGlvbihhc3Q6IEludGVycG9sYXRpb24pOiBhbnkgeyByZXR1cm4gdGhpcy52aXNpdEFsbChhc3QuZXhwcmVzc2lvbnMpOyB9XG4gIHZpc2l0S2V5ZWRSZWFkKGFzdDogS2V5ZWRSZWFkKTogYW55IHtcbiAgICBhc3Qub2JqLnZpc2l0KHRoaXMpO1xuICAgIGFzdC5rZXkudmlzaXQodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmlzaXRLZXllZFdyaXRlKGFzdDogS2V5ZWRXcml0ZSk6IGFueSB7XG4gICAgYXN0Lm9iai52aXNpdCh0aGlzKTtcbiAgICBhc3Qua2V5LnZpc2l0KHRoaXMpO1xuICAgIGFzdC52YWx1ZS52aXNpdCh0aGlzKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2aXNpdExpdGVyYWxBcnJheShhc3Q6IExpdGVyYWxBcnJheSk6IGFueSB7IHJldHVybiB0aGlzLnZpc2l0QWxsKGFzdC5leHByZXNzaW9ucyk7IH1cbiAgdmlzaXRMaXRlcmFsTWFwKGFzdDogTGl0ZXJhbE1hcCk6IGFueSB7IHJldHVybiB0aGlzLnZpc2l0QWxsKGFzdC52YWx1ZXMpOyB9XG4gIHZpc2l0TGl0ZXJhbFByaW1pdGl2ZShhc3Q6IExpdGVyYWxQcmltaXRpdmUpOiBhbnkgeyByZXR1cm4gbnVsbDsgfVxuICB2aXNpdE1ldGhvZENhbGwoYXN0OiBNZXRob2RDYWxsKTogYW55IHtcbiAgICBhc3QucmVjZWl2ZXIudmlzaXQodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMudmlzaXRBbGwoYXN0LmFyZ3MpO1xuICB9XG4gIHZpc2l0UHJlZml4Tm90KGFzdDogUHJlZml4Tm90KTogYW55IHtcbiAgICBhc3QuZXhwcmVzc2lvbi52aXNpdCh0aGlzKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2aXNpdFByb3BlcnR5UmVhZChhc3Q6IFByb3BlcnR5UmVhZCk6IGFueSB7XG4gICAgYXN0LnJlY2VpdmVyLnZpc2l0KHRoaXMpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZpc2l0UHJvcGVydHlXcml0ZShhc3Q6IFByb3BlcnR5V3JpdGUpOiBhbnkge1xuICAgIGFzdC5yZWNlaXZlci52aXNpdCh0aGlzKTtcbiAgICBhc3QudmFsdWUudmlzaXQodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmlzaXRTYWZlUHJvcGVydHlSZWFkKGFzdDogU2FmZVByb3BlcnR5UmVhZCk6IGFueSB7XG4gICAgYXN0LnJlY2VpdmVyLnZpc2l0KHRoaXMpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZpc2l0U2FmZU1ldGhvZENhbGwoYXN0OiBTYWZlTWV0aG9kQ2FsbCk6IGFueSB7XG4gICAgYXN0LnJlY2VpdmVyLnZpc2l0KHRoaXMpO1xuICAgIHJldHVybiB0aGlzLnZpc2l0QWxsKGFzdC5hcmdzKTtcbiAgfVxuICB2aXNpdEFsbChhc3RzOiBBU1RbXSk6IGFueSB7XG4gICAgYXN0cy5mb3JFYWNoKGFzdCA9PiBhc3QudmlzaXQodGhpcykpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZpc2l0UXVvdGUoYXN0OiBRdW90ZSk6IGFueSB7IHJldHVybiBudWxsOyB9XG59XG5cbmV4cG9ydCBjbGFzcyBBc3RUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIEFzdFZpc2l0b3Ige1xuICB2aXNpdEltcGxpY2l0UmVjZWl2ZXIoYXN0OiBJbXBsaWNpdFJlY2VpdmVyKTogQVNUIHsgcmV0dXJuIGFzdDsgfVxuXG4gIHZpc2l0SW50ZXJwb2xhdGlvbihhc3Q6IEludGVycG9sYXRpb24pOiBBU1Qge1xuICAgIHJldHVybiBuZXcgSW50ZXJwb2xhdGlvbihhc3Quc3RyaW5ncywgdGhpcy52aXNpdEFsbChhc3QuZXhwcmVzc2lvbnMpKTtcbiAgfVxuXG4gIHZpc2l0TGl0ZXJhbFByaW1pdGl2ZShhc3Q6IExpdGVyYWxQcmltaXRpdmUpOiBBU1QgeyByZXR1cm4gbmV3IExpdGVyYWxQcmltaXRpdmUoYXN0LnZhbHVlKTsgfVxuXG4gIHZpc2l0UHJvcGVydHlSZWFkKGFzdDogUHJvcGVydHlSZWFkKTogQVNUIHtcbiAgICByZXR1cm4gbmV3IFByb3BlcnR5UmVhZChhc3QucmVjZWl2ZXIudmlzaXQodGhpcyksIGFzdC5uYW1lLCBhc3QuZ2V0dGVyKTtcbiAgfVxuXG4gIHZpc2l0UHJvcGVydHlXcml0ZShhc3Q6IFByb3BlcnR5V3JpdGUpOiBBU1Qge1xuICAgIHJldHVybiBuZXcgUHJvcGVydHlXcml0ZShhc3QucmVjZWl2ZXIudmlzaXQodGhpcyksIGFzdC5uYW1lLCBhc3Quc2V0dGVyLCBhc3QudmFsdWUpO1xuICB9XG5cbiAgdmlzaXRTYWZlUHJvcGVydHlSZWFkKGFzdDogU2FmZVByb3BlcnR5UmVhZCk6IEFTVCB7XG4gICAgcmV0dXJuIG5ldyBTYWZlUHJvcGVydHlSZWFkKGFzdC5yZWNlaXZlci52aXNpdCh0aGlzKSwgYXN0Lm5hbWUsIGFzdC5nZXR0ZXIpO1xuICB9XG5cbiAgdmlzaXRNZXRob2RDYWxsKGFzdDogTWV0aG9kQ2FsbCk6IEFTVCB7XG4gICAgcmV0dXJuIG5ldyBNZXRob2RDYWxsKGFzdC5yZWNlaXZlci52aXNpdCh0aGlzKSwgYXN0Lm5hbWUsIGFzdC5mbiwgdGhpcy52aXNpdEFsbChhc3QuYXJncykpO1xuICB9XG5cbiAgdmlzaXRTYWZlTWV0aG9kQ2FsbChhc3Q6IFNhZmVNZXRob2RDYWxsKTogQVNUIHtcbiAgICByZXR1cm4gbmV3IFNhZmVNZXRob2RDYWxsKGFzdC5yZWNlaXZlci52aXNpdCh0aGlzKSwgYXN0Lm5hbWUsIGFzdC5mbiwgdGhpcy52aXNpdEFsbChhc3QuYXJncykpO1xuICB9XG5cbiAgdmlzaXRGdW5jdGlvbkNhbGwoYXN0OiBGdW5jdGlvbkNhbGwpOiBBU1Qge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb25DYWxsKGFzdC50YXJnZXQudmlzaXQodGhpcyksIHRoaXMudmlzaXRBbGwoYXN0LmFyZ3MpKTtcbiAgfVxuXG4gIHZpc2l0TGl0ZXJhbEFycmF5KGFzdDogTGl0ZXJhbEFycmF5KTogQVNUIHtcbiAgICByZXR1cm4gbmV3IExpdGVyYWxBcnJheSh0aGlzLnZpc2l0QWxsKGFzdC5leHByZXNzaW9ucykpO1xuICB9XG5cbiAgdmlzaXRMaXRlcmFsTWFwKGFzdDogTGl0ZXJhbE1hcCk6IEFTVCB7XG4gICAgcmV0dXJuIG5ldyBMaXRlcmFsTWFwKGFzdC5rZXlzLCB0aGlzLnZpc2l0QWxsKGFzdC52YWx1ZXMpKTtcbiAgfVxuXG4gIHZpc2l0QmluYXJ5KGFzdDogQmluYXJ5KTogQVNUIHtcbiAgICByZXR1cm4gbmV3IEJpbmFyeShhc3Qub3BlcmF0aW9uLCBhc3QubGVmdC52aXNpdCh0aGlzKSwgYXN0LnJpZ2h0LnZpc2l0KHRoaXMpKTtcbiAgfVxuXG4gIHZpc2l0UHJlZml4Tm90KGFzdDogUHJlZml4Tm90KTogQVNUIHsgcmV0dXJuIG5ldyBQcmVmaXhOb3QoYXN0LmV4cHJlc3Npb24udmlzaXQodGhpcykpOyB9XG5cbiAgdmlzaXRDb25kaXRpb25hbChhc3Q6IENvbmRpdGlvbmFsKTogQVNUIHtcbiAgICByZXR1cm4gbmV3IENvbmRpdGlvbmFsKGFzdC5jb25kaXRpb24udmlzaXQodGhpcyksIGFzdC50cnVlRXhwLnZpc2l0KHRoaXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN0LmZhbHNlRXhwLnZpc2l0KHRoaXMpKTtcbiAgfVxuXG4gIHZpc2l0UGlwZShhc3Q6IEJpbmRpbmdQaXBlKTogQVNUIHtcbiAgICByZXR1cm4gbmV3IEJpbmRpbmdQaXBlKGFzdC5leHAudmlzaXQodGhpcyksIGFzdC5uYW1lLCB0aGlzLnZpc2l0QWxsKGFzdC5hcmdzKSk7XG4gIH1cblxuICB2aXNpdEtleWVkUmVhZChhc3Q6IEtleWVkUmVhZCk6IEFTVCB7XG4gICAgcmV0dXJuIG5ldyBLZXllZFJlYWQoYXN0Lm9iai52aXNpdCh0aGlzKSwgYXN0LmtleS52aXNpdCh0aGlzKSk7XG4gIH1cblxuICB2aXNpdEtleWVkV3JpdGUoYXN0OiBLZXllZFdyaXRlKTogQVNUIHtcbiAgICByZXR1cm4gbmV3IEtleWVkV3JpdGUoYXN0Lm9iai52aXNpdCh0aGlzKSwgYXN0LmtleS52aXNpdCh0aGlzKSwgYXN0LnZhbHVlLnZpc2l0KHRoaXMpKTtcbiAgfVxuXG4gIHZpc2l0QWxsKGFzdHM6IGFueVtdKTogYW55W10ge1xuICAgIHZhciByZXMgPSBMaXN0V3JhcHBlci5jcmVhdGVGaXhlZFNpemUoYXN0cy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXN0cy5sZW5ndGg7ICsraSkge1xuICAgICAgcmVzW2ldID0gYXN0c1tpXS52aXNpdCh0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIHZpc2l0Q2hhaW4oYXN0OiBDaGFpbik6IEFTVCB7IHJldHVybiBuZXcgQ2hhaW4odGhpcy52aXNpdEFsbChhc3QuZXhwcmVzc2lvbnMpKTsgfVxuXG4gIHZpc2l0UXVvdGUoYXN0OiBRdW90ZSk6IEFTVCB7XG4gICAgcmV0dXJuIG5ldyBRdW90ZShhc3QucHJlZml4LCBhc3QudW5pbnRlcnByZXRlZEV4cHJlc3Npb24sIGFzdC5sb2NhdGlvbik7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vcGFyc2VyL2FzdC50c1xuICoqLyIsImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvZGkvZGVjb3JhdG9ycyc7XG5pbXBvcnQge0xpc3RXcmFwcGVyLCBTZXRXcmFwcGVyfSBmcm9tIFwiYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uXCI7XG5pbXBvcnQge051bWJlcldyYXBwZXIsIFN0cmluZ0pvaW5lciwgU3RyaW5nV3JhcHBlciwgaXNQcmVzZW50fSBmcm9tIFwiYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nXCI7XG5pbXBvcnQge0Jhc2VFeGNlcHRpb259IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9ucyc7XG5cbmV4cG9ydCBlbnVtIFRva2VuVHlwZSB7XG4gIENoYXJhY3RlcixcbiAgSWRlbnRpZmllcixcbiAgS2V5d29yZCxcbiAgU3RyaW5nLFxuICBPcGVyYXRvcixcbiAgTnVtYmVyXG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBMZXhlciB7XG4gIHRva2VuaXplKHRleHQ6IHN0cmluZyk6IGFueVtdIHtcbiAgICB2YXIgc2Nhbm5lciA9IG5ldyBfU2Nhbm5lcih0ZXh0KTtcbiAgICB2YXIgdG9rZW5zID0gW107XG4gICAgdmFyIHRva2VuID0gc2Nhbm5lci5zY2FuVG9rZW4oKTtcbiAgICB3aGlsZSAodG9rZW4gIT0gbnVsbCkge1xuICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgdG9rZW4gPSBzY2FubmVyLnNjYW5Ub2tlbigpO1xuICAgIH1cbiAgICByZXR1cm4gdG9rZW5zO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUb2tlbiB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBpbmRleDogbnVtYmVyLCBwdWJsaWMgdHlwZTogVG9rZW5UeXBlLCBwdWJsaWMgbnVtVmFsdWU6IG51bWJlcixcbiAgICAgICAgICAgICAgcHVibGljIHN0clZhbHVlOiBzdHJpbmcpIHt9XG5cbiAgaXNDaGFyYWN0ZXIoY29kZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLnR5cGUgPT0gVG9rZW5UeXBlLkNoYXJhY3RlciAmJiB0aGlzLm51bVZhbHVlID09IGNvZGUpO1xuICB9XG5cbiAgaXNOdW1iZXIoKTogYm9vbGVhbiB7IHJldHVybiAodGhpcy50eXBlID09IFRva2VuVHlwZS5OdW1iZXIpOyB9XG5cbiAgaXNTdHJpbmcoKTogYm9vbGVhbiB7IHJldHVybiAodGhpcy50eXBlID09IFRva2VuVHlwZS5TdHJpbmcpOyB9XG5cbiAgaXNPcGVyYXRvcihvcGVyYXRlcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLnR5cGUgPT0gVG9rZW5UeXBlLk9wZXJhdG9yICYmIHRoaXMuc3RyVmFsdWUgPT0gb3BlcmF0ZXIpO1xuICB9XG5cbiAgaXNJZGVudGlmaWVyKCk6IGJvb2xlYW4geyByZXR1cm4gKHRoaXMudHlwZSA9PSBUb2tlblR5cGUuSWRlbnRpZmllcik7IH1cblxuICBpc0tleXdvcmQoKTogYm9vbGVhbiB7IHJldHVybiAodGhpcy50eXBlID09IFRva2VuVHlwZS5LZXl3b3JkKTsgfVxuXG4gIGlzS2V5d29yZFZhcigpOiBib29sZWFuIHsgcmV0dXJuICh0aGlzLnR5cGUgPT0gVG9rZW5UeXBlLktleXdvcmQgJiYgdGhpcy5zdHJWYWx1ZSA9PSBcInZhclwiKTsgfVxuXG4gIGlzS2V5d29yZE51bGwoKTogYm9vbGVhbiB7IHJldHVybiAodGhpcy50eXBlID09IFRva2VuVHlwZS5LZXl3b3JkICYmIHRoaXMuc3RyVmFsdWUgPT0gXCJudWxsXCIpOyB9XG5cbiAgaXNLZXl3b3JkVW5kZWZpbmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy50eXBlID09IFRva2VuVHlwZS5LZXl3b3JkICYmIHRoaXMuc3RyVmFsdWUgPT0gXCJ1bmRlZmluZWRcIik7XG4gIH1cblxuICBpc0tleXdvcmRUcnVlKCk6IGJvb2xlYW4geyByZXR1cm4gKHRoaXMudHlwZSA9PSBUb2tlblR5cGUuS2V5d29yZCAmJiB0aGlzLnN0clZhbHVlID09IFwidHJ1ZVwiKTsgfVxuXG4gIGlzS2V5d29yZEZhbHNlKCk6IGJvb2xlYW4geyByZXR1cm4gKHRoaXMudHlwZSA9PSBUb2tlblR5cGUuS2V5d29yZCAmJiB0aGlzLnN0clZhbHVlID09IFwiZmFsc2VcIik7IH1cblxuICB0b051bWJlcigpOiBudW1iZXIge1xuICAgIC8vIC0xIGluc3RlYWQgb2YgTlVMTCBvaz9cbiAgICByZXR1cm4gKHRoaXMudHlwZSA9PSBUb2tlblR5cGUuTnVtYmVyKSA/IHRoaXMubnVtVmFsdWUgOiAtMTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgIGNhc2UgVG9rZW5UeXBlLkNoYXJhY3RlcjpcbiAgICAgIGNhc2UgVG9rZW5UeXBlLklkZW50aWZpZXI6XG4gICAgICBjYXNlIFRva2VuVHlwZS5LZXl3b3JkOlxuICAgICAgY2FzZSBUb2tlblR5cGUuT3BlcmF0b3I6XG4gICAgICBjYXNlIFRva2VuVHlwZS5TdHJpbmc6XG4gICAgICAgIHJldHVybiB0aGlzLnN0clZhbHVlO1xuICAgICAgY2FzZSBUb2tlblR5cGUuTnVtYmVyOlxuICAgICAgICByZXR1cm4gdGhpcy5udW1WYWx1ZS50b1N0cmluZygpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG5ld0NoYXJhY3RlclRva2VuKGluZGV4OiBudW1iZXIsIGNvZGU6IG51bWJlcik6IFRva2VuIHtcbiAgcmV0dXJuIG5ldyBUb2tlbihpbmRleCwgVG9rZW5UeXBlLkNoYXJhY3RlciwgY29kZSwgU3RyaW5nV3JhcHBlci5mcm9tQ2hhckNvZGUoY29kZSkpO1xufVxuXG5mdW5jdGlvbiBuZXdJZGVudGlmaWVyVG9rZW4oaW5kZXg6IG51bWJlciwgdGV4dDogc3RyaW5nKTogVG9rZW4ge1xuICByZXR1cm4gbmV3IFRva2VuKGluZGV4LCBUb2tlblR5cGUuSWRlbnRpZmllciwgMCwgdGV4dCk7XG59XG5cbmZ1bmN0aW9uIG5ld0tleXdvcmRUb2tlbihpbmRleDogbnVtYmVyLCB0ZXh0OiBzdHJpbmcpOiBUb2tlbiB7XG4gIHJldHVybiBuZXcgVG9rZW4oaW5kZXgsIFRva2VuVHlwZS5LZXl3b3JkLCAwLCB0ZXh0KTtcbn1cblxuZnVuY3Rpb24gbmV3T3BlcmF0b3JUb2tlbihpbmRleDogbnVtYmVyLCB0ZXh0OiBzdHJpbmcpOiBUb2tlbiB7XG4gIHJldHVybiBuZXcgVG9rZW4oaW5kZXgsIFRva2VuVHlwZS5PcGVyYXRvciwgMCwgdGV4dCk7XG59XG5cbmZ1bmN0aW9uIG5ld1N0cmluZ1Rva2VuKGluZGV4OiBudW1iZXIsIHRleHQ6IHN0cmluZyk6IFRva2VuIHtcbiAgcmV0dXJuIG5ldyBUb2tlbihpbmRleCwgVG9rZW5UeXBlLlN0cmluZywgMCwgdGV4dCk7XG59XG5cbmZ1bmN0aW9uIG5ld051bWJlclRva2VuKGluZGV4OiBudW1iZXIsIG46IG51bWJlcik6IFRva2VuIHtcbiAgcmV0dXJuIG5ldyBUb2tlbihpbmRleCwgVG9rZW5UeXBlLk51bWJlciwgbiwgXCJcIik7XG59XG5cblxuZXhwb3J0IHZhciBFT0Y6IFRva2VuID0gbmV3IFRva2VuKC0xLCBUb2tlblR5cGUuQ2hhcmFjdGVyLCAwLCBcIlwiKTtcblxuZXhwb3J0IGNvbnN0ICRFT0YgPSAwO1xuZXhwb3J0IGNvbnN0ICRUQUIgPSA5O1xuZXhwb3J0IGNvbnN0ICRMRiA9IDEwO1xuZXhwb3J0IGNvbnN0ICRWVEFCID0gMTE7XG5leHBvcnQgY29uc3QgJEZGID0gMTI7XG5leHBvcnQgY29uc3QgJENSID0gMTM7XG5leHBvcnQgY29uc3QgJFNQQUNFID0gMzI7XG5leHBvcnQgY29uc3QgJEJBTkcgPSAzMztcbmV4cG9ydCBjb25zdCAkRFEgPSAzNDtcbmV4cG9ydCBjb25zdCAkSEFTSCA9IDM1O1xuZXhwb3J0IGNvbnN0ICQkID0gMzY7XG5leHBvcnQgY29uc3QgJFBFUkNFTlQgPSAzNztcbmV4cG9ydCBjb25zdCAkQU1QRVJTQU5EID0gMzg7XG5leHBvcnQgY29uc3QgJFNRID0gMzk7XG5leHBvcnQgY29uc3QgJExQQVJFTiA9IDQwO1xuZXhwb3J0IGNvbnN0ICRSUEFSRU4gPSA0MTtcbmV4cG9ydCBjb25zdCAkU1RBUiA9IDQyO1xuZXhwb3J0IGNvbnN0ICRQTFVTID0gNDM7XG5leHBvcnQgY29uc3QgJENPTU1BID0gNDQ7XG5leHBvcnQgY29uc3QgJE1JTlVTID0gNDU7XG5leHBvcnQgY29uc3QgJFBFUklPRCA9IDQ2O1xuZXhwb3J0IGNvbnN0ICRTTEFTSCA9IDQ3O1xuZXhwb3J0IGNvbnN0ICRDT0xPTiA9IDU4O1xuZXhwb3J0IGNvbnN0ICRTRU1JQ09MT04gPSA1OTtcbmV4cG9ydCBjb25zdCAkTFQgPSA2MDtcbmV4cG9ydCBjb25zdCAkRVEgPSA2MTtcbmV4cG9ydCBjb25zdCAkR1QgPSA2MjtcbmV4cG9ydCBjb25zdCAkUVVFU1RJT04gPSA2MztcblxuY29uc3QgJDAgPSA0ODtcbmNvbnN0ICQ5ID0gNTc7XG5cbmNvbnN0ICRBID0gNjUsICRFID0gNjksICRaID0gOTA7XG5cbmV4cG9ydCBjb25zdCAkTEJSQUNLRVQgPSA5MTtcbmV4cG9ydCBjb25zdCAkQkFDS1NMQVNIID0gOTI7XG5leHBvcnQgY29uc3QgJFJCUkFDS0VUID0gOTM7XG5jb25zdCAkQ0FSRVQgPSA5NDtcbmNvbnN0ICRfID0gOTU7XG5cbmNvbnN0ICRhID0gOTcsICRlID0gMTAxLCAkZiA9IDEwMiwgJG4gPSAxMTAsICRyID0gMTE0LCAkdCA9IDExNiwgJHUgPSAxMTcsICR2ID0gMTE4LCAkeiA9IDEyMjtcblxuZXhwb3J0IGNvbnN0ICRMQlJBQ0UgPSAxMjM7XG5leHBvcnQgY29uc3QgJEJBUiA9IDEyNDtcbmV4cG9ydCBjb25zdCAkUkJSQUNFID0gMTI1O1xuY29uc3QgJE5CU1AgPSAxNjA7XG5cblxuZXhwb3J0IGNsYXNzIFNjYW5uZXJFcnJvciBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbWVzc2FnZSkgeyBzdXBlcigpOyB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMubWVzc2FnZTsgfVxufVxuXG5jbGFzcyBfU2Nhbm5lciB7XG4gIGxlbmd0aDogbnVtYmVyO1xuICBwZWVrOiBudW1iZXIgPSAwO1xuICBpbmRleDogbnVtYmVyID0gLTE7XG5cbiAgY29uc3RydWN0b3IocHVibGljIGlucHV0OiBzdHJpbmcpIHtcbiAgICB0aGlzLmxlbmd0aCA9IGlucHV0Lmxlbmd0aDtcbiAgICB0aGlzLmFkdmFuY2UoKTtcbiAgfVxuXG4gIGFkdmFuY2UoKSB7XG4gICAgdGhpcy5wZWVrID1cbiAgICAgICAgKyt0aGlzLmluZGV4ID49IHRoaXMubGVuZ3RoID8gJEVPRiA6IFN0cmluZ1dyYXBwZXIuY2hhckNvZGVBdCh0aGlzLmlucHV0LCB0aGlzLmluZGV4KTtcbiAgfVxuXG4gIHNjYW5Ub2tlbigpOiBUb2tlbiB7XG4gICAgdmFyIGlucHV0ID0gdGhpcy5pbnB1dCwgbGVuZ3RoID0gdGhpcy5sZW5ndGgsIHBlZWsgPSB0aGlzLnBlZWssIGluZGV4ID0gdGhpcy5pbmRleDtcblxuICAgIC8vIFNraXAgd2hpdGVzcGFjZS5cbiAgICB3aGlsZSAocGVlayA8PSAkU1BBQ0UpIHtcbiAgICAgIGlmICgrK2luZGV4ID49IGxlbmd0aCkge1xuICAgICAgICBwZWVrID0gJEVPRjtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWVrID0gU3RyaW5nV3JhcHBlci5jaGFyQ29kZUF0KGlucHV0LCBpbmRleCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5wZWVrID0gcGVlaztcbiAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG5cbiAgICBpZiAoaW5kZXggPj0gbGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgaWRlbnRpZmllcnMgYW5kIG51bWJlcnMuXG4gICAgaWYgKGlzSWRlbnRpZmllclN0YXJ0KHBlZWspKSByZXR1cm4gdGhpcy5zY2FuSWRlbnRpZmllcigpO1xuICAgIGlmIChpc0RpZ2l0KHBlZWspKSByZXR1cm4gdGhpcy5zY2FuTnVtYmVyKGluZGV4KTtcblxuICAgIHZhciBzdGFydDogbnVtYmVyID0gaW5kZXg7XG4gICAgc3dpdGNoIChwZWVrKSB7XG4gICAgICBjYXNlICRQRVJJT0Q6XG4gICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICByZXR1cm4gaXNEaWdpdCh0aGlzLnBlZWspID8gdGhpcy5zY2FuTnVtYmVyKHN0YXJ0KSA6IG5ld0NoYXJhY3RlclRva2VuKHN0YXJ0LCAkUEVSSU9EKTtcbiAgICAgIGNhc2UgJExQQVJFTjpcbiAgICAgIGNhc2UgJFJQQVJFTjpcbiAgICAgIGNhc2UgJExCUkFDRTpcbiAgICAgIGNhc2UgJFJCUkFDRTpcbiAgICAgIGNhc2UgJExCUkFDS0VUOlxuICAgICAgY2FzZSAkUkJSQUNLRVQ6XG4gICAgICBjYXNlICRDT01NQTpcbiAgICAgIGNhc2UgJENPTE9OOlxuICAgICAgY2FzZSAkU0VNSUNPTE9OOlxuICAgICAgICByZXR1cm4gdGhpcy5zY2FuQ2hhcmFjdGVyKHN0YXJ0LCBwZWVrKTtcbiAgICAgIGNhc2UgJFNROlxuICAgICAgY2FzZSAkRFE6XG4gICAgICAgIHJldHVybiB0aGlzLnNjYW5TdHJpbmcoKTtcbiAgICAgIGNhc2UgJEhBU0g6XG4gICAgICBjYXNlICRQTFVTOlxuICAgICAgY2FzZSAkTUlOVVM6XG4gICAgICBjYXNlICRTVEFSOlxuICAgICAgY2FzZSAkU0xBU0g6XG4gICAgICBjYXNlICRQRVJDRU5UOlxuICAgICAgY2FzZSAkQ0FSRVQ6XG4gICAgICAgIHJldHVybiB0aGlzLnNjYW5PcGVyYXRvcihzdGFydCwgU3RyaW5nV3JhcHBlci5mcm9tQ2hhckNvZGUocGVlaykpO1xuICAgICAgY2FzZSAkUVVFU1RJT046XG4gICAgICAgIHJldHVybiB0aGlzLnNjYW5Db21wbGV4T3BlcmF0b3Ioc3RhcnQsICc/JywgJFBFUklPRCwgJy4nKTtcbiAgICAgIGNhc2UgJExUOlxuICAgICAgY2FzZSAkR1Q6XG4gICAgICAgIHJldHVybiB0aGlzLnNjYW5Db21wbGV4T3BlcmF0b3Ioc3RhcnQsIFN0cmluZ1dyYXBwZXIuZnJvbUNoYXJDb2RlKHBlZWspLCAkRVEsICc9Jyk7XG4gICAgICBjYXNlICRCQU5HOlxuICAgICAgY2FzZSAkRVE6XG4gICAgICAgIHJldHVybiB0aGlzLnNjYW5Db21wbGV4T3BlcmF0b3Ioc3RhcnQsIFN0cmluZ1dyYXBwZXIuZnJvbUNoYXJDb2RlKHBlZWspLCAkRVEsICc9JywgJEVRLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc9Jyk7XG4gICAgICBjYXNlICRBTVBFUlNBTkQ6XG4gICAgICAgIHJldHVybiB0aGlzLnNjYW5Db21wbGV4T3BlcmF0b3Ioc3RhcnQsICcmJywgJEFNUEVSU0FORCwgJyYnKTtcbiAgICAgIGNhc2UgJEJBUjpcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NhbkNvbXBsZXhPcGVyYXRvcihzdGFydCwgJ3wnLCAkQkFSLCAnfCcpO1xuICAgICAgY2FzZSAkTkJTUDpcbiAgICAgICAgd2hpbGUgKGlzV2hpdGVzcGFjZSh0aGlzLnBlZWspKSB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NhblRva2VuKCk7XG4gICAgfVxuXG4gICAgdGhpcy5lcnJvcihgVW5leHBlY3RlZCBjaGFyYWN0ZXIgWyR7U3RyaW5nV3JhcHBlci5mcm9tQ2hhckNvZGUocGVlayl9XWAsIDApO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc2NhbkNoYXJhY3RlcihzdGFydDogbnVtYmVyLCBjb2RlOiBudW1iZXIpOiBUb2tlbiB7XG4gICAgYXNzZXJ0KHRoaXMucGVlayA9PSBjb2RlKTtcbiAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICByZXR1cm4gbmV3Q2hhcmFjdGVyVG9rZW4oc3RhcnQsIGNvZGUpO1xuICB9XG5cblxuICBzY2FuT3BlcmF0b3Ioc3RhcnQ6IG51bWJlciwgc3RyOiBzdHJpbmcpOiBUb2tlbiB7XG4gICAgYXNzZXJ0KHRoaXMucGVlayA9PSBTdHJpbmdXcmFwcGVyLmNoYXJDb2RlQXQoc3RyLCAwKSk7XG4gICAgYXNzZXJ0KFNldFdyYXBwZXIuaGFzKE9QRVJBVE9SUywgc3RyKSk7XG4gICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgcmV0dXJuIG5ld09wZXJhdG9yVG9rZW4oc3RhcnQsIHN0cik7XG4gIH1cblxuICAvKipcbiAgICogVG9rZW5pemUgYSAyLzMgY2hhciBsb25nIG9wZXJhdG9yXG4gICAqXG4gICAqIEBwYXJhbSBzdGFydCBzdGFydCBpbmRleCBpbiB0aGUgZXhwcmVzc2lvblxuICAgKiBAcGFyYW0gb25lIGZpcnN0IHN5bWJvbCAoYWx3YXlzIHBhcnQgb2YgdGhlIG9wZXJhdG9yKVxuICAgKiBAcGFyYW0gdHdvQ29kZSBjb2RlIHBvaW50IGZvciB0aGUgc2Vjb25kIHN5bWJvbFxuICAgKiBAcGFyYW0gdHdvIHNlY29uZCBzeW1ib2wgKHBhcnQgb2YgdGhlIG9wZXJhdG9yIHdoZW4gdGhlIHNlY29uZCBjb2RlIHBvaW50IG1hdGNoZXMpXG4gICAqIEBwYXJhbSB0aHJlZUNvZGUgY29kZSBwb2ludCBmb3IgdGhlIHRoaXJkIHN5bWJvbFxuICAgKiBAcGFyYW0gdGhyZWUgdGhpcmQgc3ltYm9sIChwYXJ0IG9mIHRoZSBvcGVyYXRvciB3aGVuIHByb3ZpZGVkIGFuZCBtYXRjaGVzIHNvdXJjZSBleHByZXNzaW9uKVxuICAgKiBAcmV0dXJucyB7VG9rZW59XG4gICAqL1xuICBzY2FuQ29tcGxleE9wZXJhdG9yKHN0YXJ0OiBudW1iZXIsIG9uZTogc3RyaW5nLCB0d29Db2RlOiBudW1iZXIsIHR3bzogc3RyaW5nLCB0aHJlZUNvZGU/OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgdGhyZWU/OiBzdHJpbmcpOiBUb2tlbiB7XG4gICAgYXNzZXJ0KHRoaXMucGVlayA9PSBTdHJpbmdXcmFwcGVyLmNoYXJDb2RlQXQob25lLCAwKSk7XG4gICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgdmFyIHN0cjogc3RyaW5nID0gb25lO1xuICAgIGlmICh0aGlzLnBlZWsgPT0gdHdvQ29kZSkge1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICBzdHIgKz0gdHdvO1xuICAgIH1cbiAgICBpZiAoaXNQcmVzZW50KHRocmVlQ29kZSkgJiYgdGhpcy5wZWVrID09IHRocmVlQ29kZSkge1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICBzdHIgKz0gdGhyZWU7XG4gICAgfVxuICAgIGFzc2VydChTZXRXcmFwcGVyLmhhcyhPUEVSQVRPUlMsIHN0cikpO1xuICAgIHJldHVybiBuZXdPcGVyYXRvclRva2VuKHN0YXJ0LCBzdHIpO1xuICB9XG5cbiAgc2NhbklkZW50aWZpZXIoKTogVG9rZW4ge1xuICAgIGFzc2VydChpc0lkZW50aWZpZXJTdGFydCh0aGlzLnBlZWspKTtcbiAgICB2YXIgc3RhcnQ6IG51bWJlciA9IHRoaXMuaW5kZXg7XG4gICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgd2hpbGUgKGlzSWRlbnRpZmllclBhcnQodGhpcy5wZWVrKSkgdGhpcy5hZHZhbmNlKCk7XG4gICAgdmFyIHN0cjogc3RyaW5nID0gdGhpcy5pbnB1dC5zdWJzdHJpbmcoc3RhcnQsIHRoaXMuaW5kZXgpO1xuICAgIGlmIChTZXRXcmFwcGVyLmhhcyhLRVlXT1JEUywgc3RyKSkge1xuICAgICAgcmV0dXJuIG5ld0tleXdvcmRUb2tlbihzdGFydCwgc3RyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ld0lkZW50aWZpZXJUb2tlbihzdGFydCwgc3RyKTtcbiAgICB9XG4gIH1cblxuICBzY2FuTnVtYmVyKHN0YXJ0OiBudW1iZXIpOiBUb2tlbiB7XG4gICAgYXNzZXJ0KGlzRGlnaXQodGhpcy5wZWVrKSk7XG4gICAgdmFyIHNpbXBsZTogYm9vbGVhbiA9ICh0aGlzLmluZGV4ID09PSBzdGFydCk7XG4gICAgdGhpcy5hZHZhbmNlKCk7ICAvLyBTa2lwIGluaXRpYWwgZGlnaXQuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChpc0RpZ2l0KHRoaXMucGVlaykpIHtcbiAgICAgICAgLy8gRG8gbm90aGluZy5cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5wZWVrID09ICRQRVJJT0QpIHtcbiAgICAgICAgc2ltcGxlID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKGlzRXhwb25lbnRTdGFydCh0aGlzLnBlZWspKSB7XG4gICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICBpZiAoaXNFeHBvbmVudFNpZ24odGhpcy5wZWVrKSkgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgIGlmICghaXNEaWdpdCh0aGlzLnBlZWspKSB0aGlzLmVycm9yKCdJbnZhbGlkIGV4cG9uZW50JywgLTEpO1xuICAgICAgICBzaW1wbGUgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgfVxuICAgIHZhciBzdHI6IHN0cmluZyA9IHRoaXMuaW5wdXQuc3Vic3RyaW5nKHN0YXJ0LCB0aGlzLmluZGV4KTtcbiAgICAvLyBUT0RPXG4gICAgdmFyIHZhbHVlOiBudW1iZXIgPVxuICAgICAgICBzaW1wbGUgPyBOdW1iZXJXcmFwcGVyLnBhcnNlSW50QXV0b1JhZGl4KHN0cikgOiBOdW1iZXJXcmFwcGVyLnBhcnNlRmxvYXQoc3RyKTtcbiAgICByZXR1cm4gbmV3TnVtYmVyVG9rZW4oc3RhcnQsIHZhbHVlKTtcbiAgfVxuXG4gIHNjYW5TdHJpbmcoKTogVG9rZW4ge1xuICAgIGFzc2VydCh0aGlzLnBlZWsgPT0gJFNRIHx8IHRoaXMucGVlayA9PSAkRFEpO1xuICAgIHZhciBzdGFydDogbnVtYmVyID0gdGhpcy5pbmRleDtcbiAgICB2YXIgcXVvdGU6IG51bWJlciA9IHRoaXMucGVlaztcbiAgICB0aGlzLmFkdmFuY2UoKTsgIC8vIFNraXAgaW5pdGlhbCBxdW90ZS5cblxuICAgIHZhciBidWZmZXI6IFN0cmluZ0pvaW5lcjtcbiAgICB2YXIgbWFya2VyOiBudW1iZXIgPSB0aGlzLmluZGV4O1xuICAgIHZhciBpbnB1dDogc3RyaW5nID0gdGhpcy5pbnB1dDtcblxuICAgIHdoaWxlICh0aGlzLnBlZWsgIT0gcXVvdGUpIHtcbiAgICAgIGlmICh0aGlzLnBlZWsgPT0gJEJBQ0tTTEFTSCkge1xuICAgICAgICBpZiAoYnVmZmVyID09IG51bGwpIGJ1ZmZlciA9IG5ldyBTdHJpbmdKb2luZXIoKTtcbiAgICAgICAgYnVmZmVyLmFkZChpbnB1dC5zdWJzdHJpbmcobWFya2VyLCB0aGlzLmluZGV4KSk7XG4gICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICB2YXIgdW5lc2NhcGVkQ29kZTogbnVtYmVyO1xuICAgICAgICBpZiAodGhpcy5wZWVrID09ICR1KSB7XG4gICAgICAgICAgLy8gNCBjaGFyYWN0ZXIgaGV4IGNvZGUgZm9yIHVuaWNvZGUgY2hhcmFjdGVyLlxuICAgICAgICAgIHZhciBoZXg6IHN0cmluZyA9IGlucHV0LnN1YnN0cmluZyh0aGlzLmluZGV4ICsgMSwgdGhpcy5pbmRleCArIDUpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB1bmVzY2FwZWRDb2RlID0gTnVtYmVyV3JhcHBlci5wYXJzZUludChoZXgsIDE2KTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmVycm9yKGBJbnZhbGlkIHVuaWNvZGUgZXNjYXBlIFtcXFxcdSR7aGV4fV1gLCAwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IDU7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVuZXNjYXBlZENvZGUgPSB1bmVzY2FwZSh0aGlzLnBlZWspO1xuICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICB9XG4gICAgICAgIGJ1ZmZlci5hZGQoU3RyaW5nV3JhcHBlci5mcm9tQ2hhckNvZGUodW5lc2NhcGVkQ29kZSkpO1xuICAgICAgICBtYXJrZXIgPSB0aGlzLmluZGV4O1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnBlZWsgPT0gJEVPRikge1xuICAgICAgICB0aGlzLmVycm9yKCdVbnRlcm1pbmF0ZWQgcXVvdGUnLCAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBsYXN0OiBzdHJpbmcgPSBpbnB1dC5zdWJzdHJpbmcobWFya2VyLCB0aGlzLmluZGV4KTtcbiAgICB0aGlzLmFkdmFuY2UoKTsgIC8vIFNraXAgdGVybWluYXRpbmcgcXVvdGUuXG5cbiAgICAvLyBDb21wdXRlIHRoZSB1bmVzY2FwZWQgc3RyaW5nIHZhbHVlLlxuICAgIHZhciB1bmVzY2FwZWQ6IHN0cmluZyA9IGxhc3Q7XG4gICAgaWYgKGJ1ZmZlciAhPSBudWxsKSB7XG4gICAgICBidWZmZXIuYWRkKGxhc3QpO1xuICAgICAgdW5lc2NhcGVkID0gYnVmZmVyLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIHJldHVybiBuZXdTdHJpbmdUb2tlbihzdGFydCwgdW5lc2NhcGVkKTtcbiAgfVxuXG4gIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgb2Zmc2V0OiBudW1iZXIpIHtcbiAgICB2YXIgcG9zaXRpb246IG51bWJlciA9IHRoaXMuaW5kZXggKyBvZmZzZXQ7XG4gICAgdGhyb3cgbmV3IFNjYW5uZXJFcnJvcihcbiAgICAgICAgYExleGVyIEVycm9yOiAke21lc3NhZ2V9IGF0IGNvbHVtbiAke3Bvc2l0aW9ufSBpbiBleHByZXNzaW9uIFske3RoaXMuaW5wdXR9XWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzV2hpdGVzcGFjZShjb2RlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIChjb2RlID49ICRUQUIgJiYgY29kZSA8PSAkU1BBQ0UpIHx8IChjb2RlID09ICROQlNQKTtcbn1cblxuZnVuY3Rpb24gaXNJZGVudGlmaWVyU3RhcnQoY29kZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiAoJGEgPD0gY29kZSAmJiBjb2RlIDw9ICR6KSB8fCAoJEEgPD0gY29kZSAmJiBjb2RlIDw9ICRaKSB8fCAoY29kZSA9PSAkXykgfHwgKGNvZGUgPT0gJCQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNJZGVudGlmaWVyKGlucHV0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKGlucHV0Lmxlbmd0aCA9PSAwKSByZXR1cm4gZmFsc2U7XG4gIHZhciBzY2FubmVyID0gbmV3IF9TY2FubmVyKGlucHV0KTtcbiAgaWYgKCFpc0lkZW50aWZpZXJTdGFydChzY2FubmVyLnBlZWspKSByZXR1cm4gZmFsc2U7XG4gIHNjYW5uZXIuYWR2YW5jZSgpO1xuICB3aGlsZSAoc2Nhbm5lci5wZWVrICE9PSAkRU9GKSB7XG4gICAgaWYgKCFpc0lkZW50aWZpZXJQYXJ0KHNjYW5uZXIucGVlaykpIHJldHVybiBmYWxzZTtcbiAgICBzY2FubmVyLmFkdmFuY2UoKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaXNJZGVudGlmaWVyUGFydChjb2RlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuICgkYSA8PSBjb2RlICYmIGNvZGUgPD0gJHopIHx8ICgkQSA8PSBjb2RlICYmIGNvZGUgPD0gJFopIHx8ICgkMCA8PSBjb2RlICYmIGNvZGUgPD0gJDkpIHx8XG4gICAgICAgICAoY29kZSA9PSAkXykgfHwgKGNvZGUgPT0gJCQpO1xufVxuXG5mdW5jdGlvbiBpc0RpZ2l0KGNvZGU6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gJDAgPD0gY29kZSAmJiBjb2RlIDw9ICQ5O1xufVxuXG5mdW5jdGlvbiBpc0V4cG9uZW50U3RhcnQoY29kZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb2RlID09ICRlIHx8IGNvZGUgPT0gJEU7XG59XG5cbmZ1bmN0aW9uIGlzRXhwb25lbnRTaWduKGNvZGU6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gY29kZSA9PSAkTUlOVVMgfHwgY29kZSA9PSAkUExVUztcbn1cblxuZnVuY3Rpb24gdW5lc2NhcGUoY29kZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgc3dpdGNoIChjb2RlKSB7XG4gICAgY2FzZSAkbjpcbiAgICAgIHJldHVybiAkTEY7XG4gICAgY2FzZSAkZjpcbiAgICAgIHJldHVybiAkRkY7XG4gICAgY2FzZSAkcjpcbiAgICAgIHJldHVybiAkQ1I7XG4gICAgY2FzZSAkdDpcbiAgICAgIHJldHVybiAkVEFCO1xuICAgIGNhc2UgJHY6XG4gICAgICByZXR1cm4gJFZUQUI7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBjb2RlO1xuICB9XG59XG5cbnZhciBPUEVSQVRPUlMgPSBTZXRXcmFwcGVyLmNyZWF0ZUZyb21MaXN0KFtcbiAgJysnLFxuICAnLScsXG4gICcqJyxcbiAgJy8nLFxuICAnJScsXG4gICdeJyxcbiAgJz0nLFxuICAnPT0nLFxuICAnIT0nLFxuICAnPT09JyxcbiAgJyE9PScsXG4gICc8JyxcbiAgJz4nLFxuICAnPD0nLFxuICAnPj0nLFxuICAnJiYnLFxuICAnfHwnLFxuICAnJicsXG4gICd8JyxcbiAgJyEnLFxuICAnPycsXG4gICcjJyxcbiAgJz8uJ1xuXSk7XG5cblxudmFyIEtFWVdPUkRTID1cbiAgICBTZXRXcmFwcGVyLmNyZWF0ZUZyb21MaXN0KFsndmFyJywgJ251bGwnLCAndW5kZWZpbmVkJywgJ3RydWUnLCAnZmFsc2UnLCAnaWYnLCAnZWxzZSddKTtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vcGFyc2VyL2xleGVyLnRzXG4gKiovIiwiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaS9kZWNvcmF0b3JzJztcbmltcG9ydCB7aXNCbGFuaywgaXNQcmVzZW50LCBTdHJpbmdXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9uLCBXcmFwcGVkRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtMaXN0V3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcbmltcG9ydCB7XG4gIExleGVyLFxuICBFT0YsXG4gIGlzSWRlbnRpZmllcixcbiAgVG9rZW4sXG4gICRQRVJJT0QsXG4gICRDT0xPTixcbiAgJFNFTUlDT0xPTixcbiAgJExCUkFDS0VULFxuICAkUkJSQUNLRVQsXG4gICRDT01NQSxcbiAgJExCUkFDRSxcbiAgJFJCUkFDRSxcbiAgJExQQVJFTixcbiAgJFJQQVJFTlxufSBmcm9tICcuL2xleGVyJztcbmltcG9ydCB7cmVmbGVjdG9yLCBSZWZsZWN0b3J9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL3JlZmxlY3Rpb24vcmVmbGVjdGlvbic7XG5pbXBvcnQge1xuICBBU1QsXG4gIEVtcHR5RXhwcixcbiAgSW1wbGljaXRSZWNlaXZlcixcbiAgUHJvcGVydHlSZWFkLFxuICBQcm9wZXJ0eVdyaXRlLFxuICBTYWZlUHJvcGVydHlSZWFkLFxuICBMaXRlcmFsUHJpbWl0aXZlLFxuICBCaW5hcnksXG4gIFByZWZpeE5vdCxcbiAgQ29uZGl0aW9uYWwsXG4gIEJpbmRpbmdQaXBlLFxuICBDaGFpbixcbiAgS2V5ZWRSZWFkLFxuICBLZXllZFdyaXRlLFxuICBMaXRlcmFsQXJyYXksXG4gIExpdGVyYWxNYXAsXG4gIEludGVycG9sYXRpb24sXG4gIE1ldGhvZENhbGwsXG4gIFNhZmVNZXRob2RDYWxsLFxuICBGdW5jdGlvbkNhbGwsXG4gIFRlbXBsYXRlQmluZGluZyxcbiAgQVNUV2l0aFNvdXJjZSxcbiAgQXN0VmlzaXRvcixcbiAgUXVvdGVcbn0gZnJvbSAnLi9hc3QnO1xuXG5cbnZhciBfaW1wbGljaXRSZWNlaXZlciA9IG5ldyBJbXBsaWNpdFJlY2VpdmVyKCk7XG4vLyBUT0RPKHRib3NjaCk6IENhbm5vdCBtYWtlIHRoaXMgY29uc3QvZmluYWwgcmlnaHQgbm93IGJlY2F1c2Ugb2YgdGhlIHRyYW5zcGlsZXIuLi5cbnZhciBJTlRFUlBPTEFUSU9OX1JFR0VYUCA9IC9cXHtcXHsoLio/KVxcfVxcfS9nO1xuXG5jbGFzcyBQYXJzZUV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGlucHV0OiBzdHJpbmcsIGVyckxvY2F0aW9uOiBzdHJpbmcsIGN0eExvY2F0aW9uPzogYW55KSB7XG4gICAgc3VwZXIoYFBhcnNlciBFcnJvcjogJHttZXNzYWdlfSAke2VyckxvY2F0aW9ufSBbJHtpbnB1dH1dIGluICR7Y3R4TG9jYXRpb259YCk7XG4gIH1cbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFBhcnNlciB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3JlZmxlY3RvcjogUmVmbGVjdG9yO1xuXG4gIGNvbnN0cnVjdG9yKC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgICAgICAgICAgcHVibGljIF9sZXhlcjogTGV4ZXIsIHByb3ZpZGVkUmVmbGVjdG9yOiBSZWZsZWN0b3IgPSBudWxsKSB7XG4gICAgdGhpcy5fcmVmbGVjdG9yID0gaXNQcmVzZW50KHByb3ZpZGVkUmVmbGVjdG9yKSA/IHByb3ZpZGVkUmVmbGVjdG9yIDogcmVmbGVjdG9yO1xuICB9XG5cbiAgcGFyc2VBY3Rpb24oaW5wdXQ6IHN0cmluZywgbG9jYXRpb246IGFueSk6IEFTVFdpdGhTb3VyY2Uge1xuICAgIHRoaXMuX2NoZWNrTm9JbnRlcnBvbGF0aW9uKGlucHV0LCBsb2NhdGlvbik7XG4gICAgdmFyIHRva2VucyA9IHRoaXMuX2xleGVyLnRva2VuaXplKGlucHV0KTtcbiAgICB2YXIgYXN0ID0gbmV3IF9QYXJzZUFTVChpbnB1dCwgbG9jYXRpb24sIHRva2VucywgdGhpcy5fcmVmbGVjdG9yLCB0cnVlKS5wYXJzZUNoYWluKCk7XG4gICAgcmV0dXJuIG5ldyBBU1RXaXRoU291cmNlKGFzdCwgaW5wdXQsIGxvY2F0aW9uKTtcbiAgfVxuXG4gIHBhcnNlQmluZGluZyhpbnB1dDogc3RyaW5nLCBsb2NhdGlvbjogYW55KTogQVNUV2l0aFNvdXJjZSB7XG4gICAgdmFyIGFzdCA9IHRoaXMuX3BhcnNlQmluZGluZ0FzdChpbnB1dCwgbG9jYXRpb24pO1xuICAgIHJldHVybiBuZXcgQVNUV2l0aFNvdXJjZShhc3QsIGlucHV0LCBsb2NhdGlvbik7XG4gIH1cblxuICBwYXJzZVNpbXBsZUJpbmRpbmcoaW5wdXQ6IHN0cmluZywgbG9jYXRpb246IHN0cmluZyk6IEFTVFdpdGhTb3VyY2Uge1xuICAgIHZhciBhc3QgPSB0aGlzLl9wYXJzZUJpbmRpbmdBc3QoaW5wdXQsIGxvY2F0aW9uKTtcbiAgICBpZiAoIVNpbXBsZUV4cHJlc3Npb25DaGVja2VyLmNoZWNrKGFzdCkpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbihcbiAgICAgICAgICAnSG9zdCBiaW5kaW5nIGV4cHJlc3Npb24gY2FuIG9ubHkgY29udGFpbiBmaWVsZCBhY2Nlc3MgYW5kIGNvbnN0YW50cycsIGlucHV0LCBsb2NhdGlvbik7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQVNUV2l0aFNvdXJjZShhc3QsIGlucHV0LCBsb2NhdGlvbik7XG4gIH1cblxuICBwcml2YXRlIF9wYXJzZUJpbmRpbmdBc3QoaW5wdXQ6IHN0cmluZywgbG9jYXRpb246IHN0cmluZyk6IEFTVCB7XG4gICAgLy8gUXVvdGVzIGV4cHJlc3Npb25zIHVzZSAzcmQtcGFydHkgZXhwcmVzc2lvbiBsYW5ndWFnZS4gV2UgZG9uJ3Qgd2FudCB0byB1c2VcbiAgICAvLyBvdXIgbGV4ZXIgb3IgcGFyc2VyIGZvciB0aGF0LCBzbyB3ZSBjaGVjayBmb3IgdGhhdCBhaGVhZCBvZiB0aW1lLlxuICAgIHZhciBxdW90ZSA9IHRoaXMuX3BhcnNlUXVvdGUoaW5wdXQsIGxvY2F0aW9uKTtcblxuICAgIGlmIChpc1ByZXNlbnQocXVvdGUpKSB7XG4gICAgICByZXR1cm4gcXVvdGU7XG4gICAgfVxuXG4gICAgdGhpcy5fY2hlY2tOb0ludGVycG9sYXRpb24oaW5wdXQsIGxvY2F0aW9uKTtcbiAgICB2YXIgdG9rZW5zID0gdGhpcy5fbGV4ZXIudG9rZW5pemUoaW5wdXQpO1xuICAgIHJldHVybiBuZXcgX1BhcnNlQVNUKGlucHV0LCBsb2NhdGlvbiwgdG9rZW5zLCB0aGlzLl9yZWZsZWN0b3IsIGZhbHNlKS5wYXJzZUNoYWluKCk7XG4gIH1cblxuICBwcml2YXRlIF9wYXJzZVF1b3RlKGlucHV0OiBzdHJpbmcsIGxvY2F0aW9uOiBhbnkpOiBBU1Qge1xuICAgIGlmIChpc0JsYW5rKGlucHV0KSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIHByZWZpeFNlcGFyYXRvckluZGV4ID0gaW5wdXQuaW5kZXhPZignOicpO1xuICAgIGlmIChwcmVmaXhTZXBhcmF0b3JJbmRleCA9PSAtMSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIHByZWZpeCA9IGlucHV0LnN1YnN0cmluZygwLCBwcmVmaXhTZXBhcmF0b3JJbmRleCkudHJpbSgpO1xuICAgIGlmICghaXNJZGVudGlmaWVyKHByZWZpeCkpIHJldHVybiBudWxsO1xuICAgIHZhciB1bmludGVycHJldGVkRXhwcmVzc2lvbiA9IGlucHV0LnN1YnN0cmluZyhwcmVmaXhTZXBhcmF0b3JJbmRleCArIDEpO1xuICAgIHJldHVybiBuZXcgUXVvdGUocHJlZml4LCB1bmludGVycHJldGVkRXhwcmVzc2lvbiwgbG9jYXRpb24pO1xuICB9XG5cbiAgcGFyc2VUZW1wbGF0ZUJpbmRpbmdzKGlucHV0OiBzdHJpbmcsIGxvY2F0aW9uOiBhbnkpOiBUZW1wbGF0ZUJpbmRpbmdbXSB7XG4gICAgdmFyIHRva2VucyA9IHRoaXMuX2xleGVyLnRva2VuaXplKGlucHV0KTtcbiAgICByZXR1cm4gbmV3IF9QYXJzZUFTVChpbnB1dCwgbG9jYXRpb24sIHRva2VucywgdGhpcy5fcmVmbGVjdG9yLCBmYWxzZSkucGFyc2VUZW1wbGF0ZUJpbmRpbmdzKCk7XG4gIH1cblxuICBwYXJzZUludGVycG9sYXRpb24oaW5wdXQ6IHN0cmluZywgbG9jYXRpb246IGFueSk6IEFTVFdpdGhTb3VyY2Uge1xuICAgIHZhciBwYXJ0cyA9IFN0cmluZ1dyYXBwZXIuc3BsaXQoaW5wdXQsIElOVEVSUE9MQVRJT05fUkVHRVhQKTtcbiAgICBpZiAocGFydHMubGVuZ3RoIDw9IDEpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgc3RyaW5ncyA9IFtdO1xuICAgIHZhciBleHByZXNzaW9ucyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBhcnQ6IHN0cmluZyA9IHBhcnRzW2ldO1xuICAgICAgaWYgKGkgJSAyID09PSAwKSB7XG4gICAgICAgIC8vIGZpeGVkIHN0cmluZ1xuICAgICAgICBzdHJpbmdzLnB1c2gocGFydCk7XG4gICAgICB9IGVsc2UgaWYgKHBhcnQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIHRva2VucyA9IHRoaXMuX2xleGVyLnRva2VuaXplKHBhcnQpO1xuICAgICAgICB2YXIgYXN0ID0gbmV3IF9QYXJzZUFTVChpbnB1dCwgbG9jYXRpb24sIHRva2VucywgdGhpcy5fcmVmbGVjdG9yLCBmYWxzZSkucGFyc2VDaGFpbigpO1xuICAgICAgICBleHByZXNzaW9ucy5wdXNoKGFzdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oJ0JsYW5rIGV4cHJlc3Npb25zIGFyZSBub3QgYWxsb3dlZCBpbiBpbnRlcnBvbGF0ZWQgc3RyaW5ncycsIGlucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGF0IGNvbHVtbiAke3RoaXMuX2ZpbmRJbnRlcnBvbGF0aW9uRXJyb3JDb2x1bW4ocGFydHMsIGkpfSBpbmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgQVNUV2l0aFNvdXJjZShuZXcgSW50ZXJwb2xhdGlvbihzdHJpbmdzLCBleHByZXNzaW9ucyksIGlucHV0LCBsb2NhdGlvbik7XG4gIH1cblxuICB3cmFwTGl0ZXJhbFByaW1pdGl2ZShpbnB1dDogc3RyaW5nLCBsb2NhdGlvbjogYW55KTogQVNUV2l0aFNvdXJjZSB7XG4gICAgcmV0dXJuIG5ldyBBU1RXaXRoU291cmNlKG5ldyBMaXRlcmFsUHJpbWl0aXZlKGlucHV0KSwgaW5wdXQsIGxvY2F0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NoZWNrTm9JbnRlcnBvbGF0aW9uKGlucHV0OiBzdHJpbmcsIGxvY2F0aW9uOiBhbnkpOiB2b2lkIHtcbiAgICB2YXIgcGFydHMgPSBTdHJpbmdXcmFwcGVyLnNwbGl0KGlucHV0LCBJTlRFUlBPTEFUSU9OX1JFR0VYUCk7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbignR290IGludGVycG9sYXRpb24gKHt7fX0pIHdoZXJlIGV4cHJlc3Npb24gd2FzIGV4cGVjdGVkJywgaW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGF0IGNvbHVtbiAke3RoaXMuX2ZpbmRJbnRlcnBvbGF0aW9uRXJyb3JDb2x1bW4ocGFydHMsIDEpfSBpbmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2ZpbmRJbnRlcnBvbGF0aW9uRXJyb3JDb2x1bW4ocGFydHM6IHN0cmluZ1tdLCBwYXJ0SW5FcnJJZHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgdmFyIGVyckxvY2F0aW9uID0gJyc7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBwYXJ0SW5FcnJJZHg7IGorKykge1xuICAgICAgZXJyTG9jYXRpb24gKz0gaiAlIDIgPT09IDAgPyBwYXJ0c1tqXSA6IGB7eyR7cGFydHNbal19fX1gO1xuICAgIH1cblxuICAgIHJldHVybiBlcnJMb2NhdGlvbi5sZW5ndGg7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIF9QYXJzZUFTVCB7XG4gIGluZGV4OiBudW1iZXIgPSAwO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgaW5wdXQ6IHN0cmluZywgcHVibGljIGxvY2F0aW9uOiBhbnksIHB1YmxpYyB0b2tlbnM6IGFueVtdLFxuICAgICAgICAgICAgICBwdWJsaWMgcmVmbGVjdG9yOiBSZWZsZWN0b3IsIHB1YmxpYyBwYXJzZUFjdGlvbjogYm9vbGVhbikge31cblxuICBwZWVrKG9mZnNldDogbnVtYmVyKTogVG9rZW4ge1xuICAgIHZhciBpID0gdGhpcy5pbmRleCArIG9mZnNldDtcbiAgICByZXR1cm4gaSA8IHRoaXMudG9rZW5zLmxlbmd0aCA/IHRoaXMudG9rZW5zW2ldIDogRU9GO1xuICB9XG5cbiAgZ2V0IG5leHQoKTogVG9rZW4geyByZXR1cm4gdGhpcy5wZWVrKDApOyB9XG5cbiAgZ2V0IGlucHV0SW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKHRoaXMuaW5kZXggPCB0aGlzLnRva2Vucy5sZW5ndGgpID8gdGhpcy5uZXh0LmluZGV4IDogdGhpcy5pbnB1dC5sZW5ndGg7XG4gIH1cblxuICBhZHZhbmNlKCkgeyB0aGlzLmluZGV4Kys7IH1cblxuICBvcHRpb25hbENoYXJhY3Rlcihjb2RlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5uZXh0LmlzQ2hhcmFjdGVyKGNvZGUpKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgb3B0aW9uYWxLZXl3b3JkVmFyKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnBlZWtLZXl3b3JkVmFyKCkpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwZWVrS2V5d29yZFZhcigpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMubmV4dC5pc0tleXdvcmRWYXIoKSB8fCB0aGlzLm5leHQuaXNPcGVyYXRvcignIycpOyB9XG5cbiAgZXhwZWN0Q2hhcmFjdGVyKGNvZGU6IG51bWJlcikge1xuICAgIGlmICh0aGlzLm9wdGlvbmFsQ2hhcmFjdGVyKGNvZGUpKSByZXR1cm47XG4gICAgdGhpcy5lcnJvcihgTWlzc2luZyBleHBlY3RlZCAke1N0cmluZ1dyYXBwZXIuZnJvbUNoYXJDb2RlKGNvZGUpfWApO1xuICB9XG5cblxuICBvcHRpb25hbE9wZXJhdG9yKG9wOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5uZXh0LmlzT3BlcmF0b3Iob3ApKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZXhwZWN0T3BlcmF0b3Iob3BlcmF0b3I6IHN0cmluZykge1xuICAgIGlmICh0aGlzLm9wdGlvbmFsT3BlcmF0b3Iob3BlcmF0b3IpKSByZXR1cm47XG4gICAgdGhpcy5lcnJvcihgTWlzc2luZyBleHBlY3RlZCBvcGVyYXRvciAke29wZXJhdG9yfWApO1xuICB9XG5cbiAgZXhwZWN0SWRlbnRpZmllck9yS2V5d29yZCgpOiBzdHJpbmcge1xuICAgIHZhciBuID0gdGhpcy5uZXh0O1xuICAgIGlmICghbi5pc0lkZW50aWZpZXIoKSAmJiAhbi5pc0tleXdvcmQoKSkge1xuICAgICAgdGhpcy5lcnJvcihgVW5leHBlY3RlZCB0b2tlbiAke259LCBleHBlY3RlZCBpZGVudGlmaWVyIG9yIGtleXdvcmRgKTtcbiAgICB9XG4gICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgcmV0dXJuIG4udG9TdHJpbmcoKTtcbiAgfVxuXG4gIGV4cGVjdElkZW50aWZpZXJPcktleXdvcmRPclN0cmluZygpOiBzdHJpbmcge1xuICAgIHZhciBuID0gdGhpcy5uZXh0O1xuICAgIGlmICghbi5pc0lkZW50aWZpZXIoKSAmJiAhbi5pc0tleXdvcmQoKSAmJiAhbi5pc1N0cmluZygpKSB7XG4gICAgICB0aGlzLmVycm9yKGBVbmV4cGVjdGVkIHRva2VuICR7bn0sIGV4cGVjdGVkIGlkZW50aWZpZXIsIGtleXdvcmQsIG9yIHN0cmluZ2ApO1xuICAgIH1cbiAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICByZXR1cm4gbi50b1N0cmluZygpO1xuICB9XG5cbiAgcGFyc2VDaGFpbigpOiBBU1Qge1xuICAgIHZhciBleHBycyA9IFtdO1xuICAgIHdoaWxlICh0aGlzLmluZGV4IDwgdGhpcy50b2tlbnMubGVuZ3RoKSB7XG4gICAgICB2YXIgZXhwciA9IHRoaXMucGFyc2VQaXBlKCk7XG4gICAgICBleHBycy5wdXNoKGV4cHIpO1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25hbENoYXJhY3RlcigkU0VNSUNPTE9OKSkge1xuICAgICAgICBpZiAoIXRoaXMucGFyc2VBY3Rpb24pIHtcbiAgICAgICAgICB0aGlzLmVycm9yKFwiQmluZGluZyBleHByZXNzaW9uIGNhbm5vdCBjb250YWluIGNoYWluZWQgZXhwcmVzc2lvblwiKTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAodGhpcy5vcHRpb25hbENoYXJhY3RlcigkU0VNSUNPTE9OKSkge1xuICAgICAgICB9ICAvLyByZWFkIGFsbCBzZW1pY29sb25zXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaW5kZXggPCB0aGlzLnRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5lcnJvcihgVW5leHBlY3RlZCB0b2tlbiAnJHt0aGlzLm5leHR9J2ApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZXhwcnMubGVuZ3RoID09IDApIHJldHVybiBuZXcgRW1wdHlFeHByKCk7XG4gICAgaWYgKGV4cHJzLmxlbmd0aCA9PSAxKSByZXR1cm4gZXhwcnNbMF07XG4gICAgcmV0dXJuIG5ldyBDaGFpbihleHBycyk7XG4gIH1cblxuICBwYXJzZVBpcGUoKTogQVNUIHtcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcbiAgICBpZiAodGhpcy5vcHRpb25hbE9wZXJhdG9yKFwifFwiKSkge1xuICAgICAgaWYgKHRoaXMucGFyc2VBY3Rpb24pIHtcbiAgICAgICAgdGhpcy5lcnJvcihcIkNhbm5vdCBoYXZlIGEgcGlwZSBpbiBhbiBhY3Rpb24gZXhwcmVzc2lvblwiKTtcbiAgICAgIH1cblxuICAgICAgZG8ge1xuICAgICAgICB2YXIgbmFtZSA9IHRoaXMuZXhwZWN0SWRlbnRpZmllck9yS2V5d29yZCgpO1xuICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5vcHRpb25hbENoYXJhY3RlcigkQ09MT04pKSB7XG4gICAgICAgICAgYXJncy5wdXNoKHRoaXMucGFyc2VFeHByZXNzaW9uKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdCA9IG5ldyBCaW5kaW5nUGlwZShyZXN1bHQsIG5hbWUsIGFyZ3MpO1xuICAgICAgfSB3aGlsZSAodGhpcy5vcHRpb25hbE9wZXJhdG9yKFwifFwiKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHBhcnNlRXhwcmVzc2lvbigpOiBBU1QgeyByZXR1cm4gdGhpcy5wYXJzZUNvbmRpdGlvbmFsKCk7IH1cblxuICBwYXJzZUNvbmRpdGlvbmFsKCk6IEFTVCB7XG4gICAgdmFyIHN0YXJ0ID0gdGhpcy5pbnB1dEluZGV4O1xuICAgIHZhciByZXN1bHQgPSB0aGlzLnBhcnNlTG9naWNhbE9yKCk7XG5cbiAgICBpZiAodGhpcy5vcHRpb25hbE9wZXJhdG9yKCc/JykpIHtcbiAgICAgIHZhciB5ZXMgPSB0aGlzLnBhcnNlUGlwZSgpO1xuICAgICAgaWYgKCF0aGlzLm9wdGlvbmFsQ2hhcmFjdGVyKCRDT0xPTikpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMuaW5wdXRJbmRleDtcbiAgICAgICAgdmFyIGV4cHJlc3Npb24gPSB0aGlzLmlucHV0LnN1YnN0cmluZyhzdGFydCwgZW5kKTtcbiAgICAgICAgdGhpcy5lcnJvcihgQ29uZGl0aW9uYWwgZXhwcmVzc2lvbiAke2V4cHJlc3Npb259IHJlcXVpcmVzIGFsbCAzIGV4cHJlc3Npb25zYCk7XG4gICAgICB9XG4gICAgICB2YXIgbm8gPSB0aGlzLnBhcnNlUGlwZSgpO1xuICAgICAgcmV0dXJuIG5ldyBDb25kaXRpb25hbChyZXN1bHQsIHllcywgbm8pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIHBhcnNlTG9naWNhbE9yKCk6IEFTVCB7XG4gICAgLy8gJ3x8J1xuICAgIHZhciByZXN1bHQgPSB0aGlzLnBhcnNlTG9naWNhbEFuZCgpO1xuICAgIHdoaWxlICh0aGlzLm9wdGlvbmFsT3BlcmF0b3IoJ3x8JykpIHtcbiAgICAgIHJlc3VsdCA9IG5ldyBCaW5hcnkoJ3x8JywgcmVzdWx0LCB0aGlzLnBhcnNlTG9naWNhbEFuZCgpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHBhcnNlTG9naWNhbEFuZCgpOiBBU1Qge1xuICAgIC8vICcmJidcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5wYXJzZUVxdWFsaXR5KCk7XG4gICAgd2hpbGUgKHRoaXMub3B0aW9uYWxPcGVyYXRvcignJiYnKSkge1xuICAgICAgcmVzdWx0ID0gbmV3IEJpbmFyeSgnJiYnLCByZXN1bHQsIHRoaXMucGFyc2VFcXVhbGl0eSgpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHBhcnNlRXF1YWxpdHkoKTogQVNUIHtcbiAgICAvLyAnPT0nLCchPScsJz09PScsJyE9PSdcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5wYXJzZVJlbGF0aW9uYWwoKTtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9uYWxPcGVyYXRvcignPT0nKSkge1xuICAgICAgICByZXN1bHQgPSBuZXcgQmluYXJ5KCc9PScsIHJlc3VsdCwgdGhpcy5wYXJzZVJlbGF0aW9uYWwoKSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9uYWxPcGVyYXRvcignPT09JykpIHtcbiAgICAgICAgcmVzdWx0ID0gbmV3IEJpbmFyeSgnPT09JywgcmVzdWx0LCB0aGlzLnBhcnNlUmVsYXRpb25hbCgpKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25hbE9wZXJhdG9yKCchPScpKSB7XG4gICAgICAgIHJlc3VsdCA9IG5ldyBCaW5hcnkoJyE9JywgcmVzdWx0LCB0aGlzLnBhcnNlUmVsYXRpb25hbCgpKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25hbE9wZXJhdG9yKCchPT0nKSkge1xuICAgICAgICByZXN1bHQgPSBuZXcgQmluYXJ5KCchPT0nLCByZXN1bHQsIHRoaXMucGFyc2VSZWxhdGlvbmFsKCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwYXJzZVJlbGF0aW9uYWwoKTogQVNUIHtcbiAgICAvLyAnPCcsICc+JywgJzw9JywgJz49J1xuICAgIHZhciByZXN1bHQgPSB0aGlzLnBhcnNlQWRkaXRpdmUoKTtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9uYWxPcGVyYXRvcignPCcpKSB7XG4gICAgICAgIHJlc3VsdCA9IG5ldyBCaW5hcnkoJzwnLCByZXN1bHQsIHRoaXMucGFyc2VBZGRpdGl2ZSgpKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25hbE9wZXJhdG9yKCc+JykpIHtcbiAgICAgICAgcmVzdWx0ID0gbmV3IEJpbmFyeSgnPicsIHJlc3VsdCwgdGhpcy5wYXJzZUFkZGl0aXZlKCkpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbmFsT3BlcmF0b3IoJzw9JykpIHtcbiAgICAgICAgcmVzdWx0ID0gbmV3IEJpbmFyeSgnPD0nLCByZXN1bHQsIHRoaXMucGFyc2VBZGRpdGl2ZSgpKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25hbE9wZXJhdG9yKCc+PScpKSB7XG4gICAgICAgIHJlc3VsdCA9IG5ldyBCaW5hcnkoJz49JywgcmVzdWx0LCB0aGlzLnBhcnNlQWRkaXRpdmUoKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHBhcnNlQWRkaXRpdmUoKTogQVNUIHtcbiAgICAvLyAnKycsICctJ1xuICAgIHZhciByZXN1bHQgPSB0aGlzLnBhcnNlTXVsdGlwbGljYXRpdmUoKTtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9uYWxPcGVyYXRvcignKycpKSB7XG4gICAgICAgIHJlc3VsdCA9IG5ldyBCaW5hcnkoJysnLCByZXN1bHQsIHRoaXMucGFyc2VNdWx0aXBsaWNhdGl2ZSgpKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25hbE9wZXJhdG9yKCctJykpIHtcbiAgICAgICAgcmVzdWx0ID0gbmV3IEJpbmFyeSgnLScsIHJlc3VsdCwgdGhpcy5wYXJzZU11bHRpcGxpY2F0aXZlKCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwYXJzZU11bHRpcGxpY2F0aXZlKCk6IEFTVCB7XG4gICAgLy8gJyonLCAnJScsICcvJ1xuICAgIHZhciByZXN1bHQgPSB0aGlzLnBhcnNlUHJlZml4KCk7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbmFsT3BlcmF0b3IoJyonKSkge1xuICAgICAgICByZXN1bHQgPSBuZXcgQmluYXJ5KCcqJywgcmVzdWx0LCB0aGlzLnBhcnNlUHJlZml4KCkpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbmFsT3BlcmF0b3IoJyUnKSkge1xuICAgICAgICByZXN1bHQgPSBuZXcgQmluYXJ5KCclJywgcmVzdWx0LCB0aGlzLnBhcnNlUHJlZml4KCkpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbmFsT3BlcmF0b3IoJy8nKSkge1xuICAgICAgICByZXN1bHQgPSBuZXcgQmluYXJ5KCcvJywgcmVzdWx0LCB0aGlzLnBhcnNlUHJlZml4KCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwYXJzZVByZWZpeCgpOiBBU1Qge1xuICAgIGlmICh0aGlzLm9wdGlvbmFsT3BlcmF0b3IoJysnKSkge1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2VQcmVmaXgoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9uYWxPcGVyYXRvcignLScpKSB7XG4gICAgICByZXR1cm4gbmV3IEJpbmFyeSgnLScsIG5ldyBMaXRlcmFsUHJpbWl0aXZlKDApLCB0aGlzLnBhcnNlUHJlZml4KCkpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25hbE9wZXJhdG9yKCchJykpIHtcbiAgICAgIHJldHVybiBuZXcgUHJlZml4Tm90KHRoaXMucGFyc2VQcmVmaXgoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlQ2FsbENoYWluKCk7XG4gICAgfVxuICB9XG5cbiAgcGFyc2VDYWxsQ2hhaW4oKTogQVNUIHtcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5wYXJzZVByaW1hcnkoKTtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9uYWxDaGFyYWN0ZXIoJFBFUklPRCkpIHtcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5wYXJzZUFjY2Vzc01lbWJlck9yTWV0aG9kQ2FsbChyZXN1bHQsIGZhbHNlKTtcblxuICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbmFsT3BlcmF0b3IoJz8uJykpIHtcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5wYXJzZUFjY2Vzc01lbWJlck9yTWV0aG9kQ2FsbChyZXN1bHQsIHRydWUpO1xuXG4gICAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9uYWxDaGFyYWN0ZXIoJExCUkFDS0VUKSkge1xuICAgICAgICB2YXIga2V5ID0gdGhpcy5wYXJzZVBpcGUoKTtcbiAgICAgICAgdGhpcy5leHBlY3RDaGFyYWN0ZXIoJFJCUkFDS0VUKTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9uYWxPcGVyYXRvcihcIj1cIikpIHtcbiAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLnBhcnNlQ29uZGl0aW9uYWwoKTtcbiAgICAgICAgICByZXN1bHQgPSBuZXcgS2V5ZWRXcml0ZShyZXN1bHQsIGtleSwgdmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdCA9IG5ldyBLZXllZFJlYWQocmVzdWx0LCBrZXkpO1xuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25hbENoYXJhY3RlcigkTFBBUkVOKSkge1xuICAgICAgICB2YXIgYXJncyA9IHRoaXMucGFyc2VDYWxsQXJndW1lbnRzKCk7XG4gICAgICAgIHRoaXMuZXhwZWN0Q2hhcmFjdGVyKCRSUEFSRU4pO1xuICAgICAgICByZXN1bHQgPSBuZXcgRnVuY3Rpb25DYWxsKHJlc3VsdCwgYXJncyk7XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcGFyc2VQcmltYXJ5KCk6IEFTVCB7XG4gICAgaWYgKHRoaXMub3B0aW9uYWxDaGFyYWN0ZXIoJExQQVJFTikpIHtcbiAgICAgIGxldCByZXN1bHQgPSB0aGlzLnBhcnNlUGlwZSgpO1xuICAgICAgdGhpcy5leHBlY3RDaGFyYWN0ZXIoJFJQQVJFTik7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZWxzZSBpZiAodGhpcy5uZXh0LmlzS2V5d29yZE51bGwoKSB8fCB0aGlzLm5leHQuaXNLZXl3b3JkVW5kZWZpbmVkKCkpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgcmV0dXJuIG5ldyBMaXRlcmFsUHJpbWl0aXZlKG51bGwpO1xuXG4gICAgfSBlbHNlIGlmICh0aGlzLm5leHQuaXNLZXl3b3JkVHJ1ZSgpKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIHJldHVybiBuZXcgTGl0ZXJhbFByaW1pdGl2ZSh0cnVlKTtcblxuICAgIH0gZWxzZSBpZiAodGhpcy5uZXh0LmlzS2V5d29yZEZhbHNlKCkpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgcmV0dXJuIG5ldyBMaXRlcmFsUHJpbWl0aXZlKGZhbHNlKTtcblxuICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25hbENoYXJhY3RlcigkTEJSQUNLRVQpKSB7XG4gICAgICB2YXIgZWxlbWVudHMgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbkxpc3QoJFJCUkFDS0VUKTtcbiAgICAgIHRoaXMuZXhwZWN0Q2hhcmFjdGVyKCRSQlJBQ0tFVCk7XG4gICAgICByZXR1cm4gbmV3IExpdGVyYWxBcnJheShlbGVtZW50cyk7XG5cbiAgICB9IGVsc2UgaWYgKHRoaXMubmV4dC5pc0NoYXJhY3RlcigkTEJSQUNFKSkge1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2VMaXRlcmFsTWFwKCk7XG5cbiAgICB9IGVsc2UgaWYgKHRoaXMubmV4dC5pc0lkZW50aWZpZXIoKSkge1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2VBY2Nlc3NNZW1iZXJPck1ldGhvZENhbGwoX2ltcGxpY2l0UmVjZWl2ZXIsIGZhbHNlKTtcblxuICAgIH0gZWxzZSBpZiAodGhpcy5uZXh0LmlzTnVtYmVyKCkpIHtcbiAgICAgIHZhciB2YWx1ZSA9IHRoaXMubmV4dC50b051bWJlcigpO1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICByZXR1cm4gbmV3IExpdGVyYWxQcmltaXRpdmUodmFsdWUpO1xuXG4gICAgfSBlbHNlIGlmICh0aGlzLm5leHQuaXNTdHJpbmcoKSkge1xuICAgICAgdmFyIGxpdGVyYWxWYWx1ZSA9IHRoaXMubmV4dC50b1N0cmluZygpO1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICByZXR1cm4gbmV3IExpdGVyYWxQcmltaXRpdmUobGl0ZXJhbFZhbHVlKTtcblxuICAgIH0gZWxzZSBpZiAodGhpcy5pbmRleCA+PSB0aGlzLnRva2Vucy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZXJyb3IoYFVuZXhwZWN0ZWQgZW5kIG9mIGV4cHJlc3Npb246ICR7dGhpcy5pbnB1dH1gKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVycm9yKGBVbmV4cGVjdGVkIHRva2VuICR7dGhpcy5uZXh0fWApO1xuICAgIH1cbiAgICAvLyBlcnJvcigpIHRocm93cywgc28gd2UgZG9uJ3QgcmVhY2ggaGVyZS5cbiAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihcIkZlbGwgdGhyb3VnaCBhbGwgY2FzZXMgaW4gcGFyc2VQcmltYXJ5XCIpO1xuICB9XG5cbiAgcGFyc2VFeHByZXNzaW9uTGlzdCh0ZXJtaW5hdG9yOiBudW1iZXIpOiBhbnlbXSB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIGlmICghdGhpcy5uZXh0LmlzQ2hhcmFjdGVyKHRlcm1pbmF0b3IpKSB7XG4gICAgICBkbyB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHRoaXMucGFyc2VQaXBlKCkpO1xuICAgICAgfSB3aGlsZSAodGhpcy5vcHRpb25hbENoYXJhY3RlcigkQ09NTUEpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHBhcnNlTGl0ZXJhbE1hcCgpOiBMaXRlcmFsTWFwIHtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICB0aGlzLmV4cGVjdENoYXJhY3RlcigkTEJSQUNFKTtcbiAgICBpZiAoIXRoaXMub3B0aW9uYWxDaGFyYWN0ZXIoJFJCUkFDRSkpIHtcbiAgICAgIGRvIHtcbiAgICAgICAgdmFyIGtleSA9IHRoaXMuZXhwZWN0SWRlbnRpZmllck9yS2V5d29yZE9yU3RyaW5nKCk7XG4gICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICB0aGlzLmV4cGVjdENoYXJhY3RlcigkQ09MT04pO1xuICAgICAgICB2YWx1ZXMucHVzaCh0aGlzLnBhcnNlUGlwZSgpKTtcbiAgICAgIH0gd2hpbGUgKHRoaXMub3B0aW9uYWxDaGFyYWN0ZXIoJENPTU1BKSk7XG4gICAgICB0aGlzLmV4cGVjdENoYXJhY3RlcigkUkJSQUNFKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBMaXRlcmFsTWFwKGtleXMsIHZhbHVlcyk7XG4gIH1cblxuICBwYXJzZUFjY2Vzc01lbWJlck9yTWV0aG9kQ2FsbChyZWNlaXZlcjogQVNULCBpc1NhZmU6IGJvb2xlYW4gPSBmYWxzZSk6IEFTVCB7XG4gICAgbGV0IGlkID0gdGhpcy5leHBlY3RJZGVudGlmaWVyT3JLZXl3b3JkKCk7XG5cbiAgICBpZiAodGhpcy5vcHRpb25hbENoYXJhY3RlcigkTFBBUkVOKSkge1xuICAgICAgbGV0IGFyZ3MgPSB0aGlzLnBhcnNlQ2FsbEFyZ3VtZW50cygpO1xuICAgICAgdGhpcy5leHBlY3RDaGFyYWN0ZXIoJFJQQVJFTik7XG4gICAgICBsZXQgZm4gPSB0aGlzLnJlZmxlY3Rvci5tZXRob2QoaWQpO1xuICAgICAgcmV0dXJuIGlzU2FmZSA/IG5ldyBTYWZlTWV0aG9kQ2FsbChyZWNlaXZlciwgaWQsIGZuLCBhcmdzKSA6XG4gICAgICAgICAgICAgICAgICAgICAgbmV3IE1ldGhvZENhbGwocmVjZWl2ZXIsIGlkLCBmbiwgYXJncyk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGlzU2FmZSkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25hbE9wZXJhdG9yKFwiPVwiKSkge1xuICAgICAgICAgIHRoaXMuZXJyb3IoXCJUaGUgJz8uJyBvcGVyYXRvciBjYW5ub3QgYmUgdXNlZCBpbiB0aGUgYXNzaWdubWVudFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFNhZmVQcm9wZXJ0eVJlYWQocmVjZWl2ZXIsIGlkLCB0aGlzLnJlZmxlY3Rvci5nZXR0ZXIoaWQpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9uYWxPcGVyYXRvcihcIj1cIikpIHtcbiAgICAgICAgICBpZiAoIXRoaXMucGFyc2VBY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3IoXCJCaW5kaW5ncyBjYW5ub3QgY29udGFpbiBhc3NpZ25tZW50c1wiKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLnBhcnNlQ29uZGl0aW9uYWwoKTtcbiAgICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5V3JpdGUocmVjZWl2ZXIsIGlkLCB0aGlzLnJlZmxlY3Rvci5zZXR0ZXIoaWQpLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eVJlYWQocmVjZWl2ZXIsIGlkLCB0aGlzLnJlZmxlY3Rvci5nZXR0ZXIoaWQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcGFyc2VDYWxsQXJndW1lbnRzKCk6IEJpbmRpbmdQaXBlW10ge1xuICAgIGlmICh0aGlzLm5leHQuaXNDaGFyYWN0ZXIoJFJQQVJFTikpIHJldHVybiBbXTtcbiAgICB2YXIgcG9zaXRpb25hbHMgPSBbXTtcbiAgICBkbyB7XG4gICAgICBwb3NpdGlvbmFscy5wdXNoKHRoaXMucGFyc2VQaXBlKCkpO1xuICAgIH0gd2hpbGUgKHRoaXMub3B0aW9uYWxDaGFyYWN0ZXIoJENPTU1BKSk7XG4gICAgcmV0dXJuIHBvc2l0aW9uYWxzO1xuICB9XG5cbiAgcGFyc2VCbG9ja0NvbnRlbnQoKTogQVNUIHtcbiAgICBpZiAoIXRoaXMucGFyc2VBY3Rpb24pIHtcbiAgICAgIHRoaXMuZXJyb3IoXCJCaW5kaW5nIGV4cHJlc3Npb24gY2Fubm90IGNvbnRhaW4gY2hhaW5lZCBleHByZXNzaW9uXCIpO1xuICAgIH1cbiAgICB2YXIgZXhwcnMgPSBbXTtcbiAgICB3aGlsZSAodGhpcy5pbmRleCA8IHRoaXMudG9rZW5zLmxlbmd0aCAmJiAhdGhpcy5uZXh0LmlzQ2hhcmFjdGVyKCRSQlJBQ0UpKSB7XG4gICAgICB2YXIgZXhwciA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG4gICAgICBleHBycy5wdXNoKGV4cHIpO1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25hbENoYXJhY3RlcigkU0VNSUNPTE9OKSkge1xuICAgICAgICB3aGlsZSAodGhpcy5vcHRpb25hbENoYXJhY3RlcigkU0VNSUNPTE9OKSkge1xuICAgICAgICB9ICAvLyByZWFkIGFsbCBzZW1pY29sb25zXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChleHBycy5sZW5ndGggPT0gMCkgcmV0dXJuIG5ldyBFbXB0eUV4cHIoKTtcbiAgICBpZiAoZXhwcnMubGVuZ3RoID09IDEpIHJldHVybiBleHByc1swXTtcblxuICAgIHJldHVybiBuZXcgQ2hhaW4oZXhwcnMpO1xuICB9XG5cblxuICAvKipcbiAgICogQW4gaWRlbnRpZmllciwgYSBrZXl3b3JkLCBhIHN0cmluZyB3aXRoIGFuIG9wdGlvbmFsIGAtYCBpbmJldHdlZW4uXG4gICAqL1xuICBleHBlY3RUZW1wbGF0ZUJpbmRpbmdLZXkoKTogc3RyaW5nIHtcbiAgICB2YXIgcmVzdWx0ID0gJyc7XG4gICAgdmFyIG9wZXJhdG9yRm91bmQgPSBmYWxzZTtcbiAgICBkbyB7XG4gICAgICByZXN1bHQgKz0gdGhpcy5leHBlY3RJZGVudGlmaWVyT3JLZXl3b3JkT3JTdHJpbmcoKTtcbiAgICAgIG9wZXJhdG9yRm91bmQgPSB0aGlzLm9wdGlvbmFsT3BlcmF0b3IoJy0nKTtcbiAgICAgIGlmIChvcGVyYXRvckZvdW5kKSB7XG4gICAgICAgIHJlc3VsdCArPSAnLSc7XG4gICAgICB9XG4gICAgfSB3aGlsZSAob3BlcmF0b3JGb3VuZCk7XG5cbiAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7XG4gIH1cblxuICBwYXJzZVRlbXBsYXRlQmluZGluZ3MoKTogYW55W10ge1xuICAgIHZhciBiaW5kaW5ncyA9IFtdO1xuICAgIHZhciBwcmVmaXggPSBudWxsO1xuICAgIHdoaWxlICh0aGlzLmluZGV4IDwgdGhpcy50b2tlbnMubGVuZ3RoKSB7XG4gICAgICB2YXIga2V5SXNWYXI6IGJvb2xlYW4gPSB0aGlzLm9wdGlvbmFsS2V5d29yZFZhcigpO1xuICAgICAgdmFyIGtleSA9IHRoaXMuZXhwZWN0VGVtcGxhdGVCaW5kaW5nS2V5KCk7XG4gICAgICBpZiAoIWtleUlzVmFyKSB7XG4gICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkge1xuICAgICAgICAgIHByZWZpeCA9IGtleTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBrZXkgPSBwcmVmaXggKyBrZXlbMF0udG9VcHBlckNhc2UoKSArIGtleS5zdWJzdHJpbmcoMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMub3B0aW9uYWxDaGFyYWN0ZXIoJENPTE9OKTtcbiAgICAgIHZhciBuYW1lID0gbnVsbDtcbiAgICAgIHZhciBleHByZXNzaW9uID0gbnVsbDtcbiAgICAgIGlmIChrZXlJc1Zhcikge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25hbE9wZXJhdG9yKFwiPVwiKSkge1xuICAgICAgICAgIG5hbWUgPSB0aGlzLmV4cGVjdFRlbXBsYXRlQmluZGluZ0tleSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5hbWUgPSAnXFwkaW1wbGljaXQnO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubmV4dCAhPT0gRU9GICYmICF0aGlzLnBlZWtLZXl3b3JkVmFyKCkpIHtcbiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5pbnB1dEluZGV4O1xuICAgICAgICB2YXIgYXN0ID0gdGhpcy5wYXJzZVBpcGUoKTtcbiAgICAgICAgdmFyIHNvdXJjZSA9IHRoaXMuaW5wdXQuc3Vic3RyaW5nKHN0YXJ0LCB0aGlzLmlucHV0SW5kZXgpO1xuICAgICAgICBleHByZXNzaW9uID0gbmV3IEFTVFdpdGhTb3VyY2UoYXN0LCBzb3VyY2UsIHRoaXMubG9jYXRpb24pO1xuICAgICAgfVxuICAgICAgYmluZGluZ3MucHVzaChuZXcgVGVtcGxhdGVCaW5kaW5nKGtleSwga2V5SXNWYXIsIG5hbWUsIGV4cHJlc3Npb24pKTtcbiAgICAgIGlmICghdGhpcy5vcHRpb25hbENoYXJhY3RlcigkU0VNSUNPTE9OKSkge1xuICAgICAgICB0aGlzLm9wdGlvbmFsQ2hhcmFjdGVyKCRDT01NQSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiaW5kaW5ncztcbiAgfVxuXG4gIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgaW5kZXg6IG51bWJlciA9IG51bGwpIHtcbiAgICBpZiAoaXNCbGFuayhpbmRleCkpIGluZGV4ID0gdGhpcy5pbmRleDtcblxuICAgIHZhciBsb2NhdGlvbiA9IChpbmRleCA8IHRoaXMudG9rZW5zLmxlbmd0aCkgPyBgYXQgY29sdW1uICR7dGhpcy50b2tlbnNbaW5kZXhdLmluZGV4ICsgMX0gaW5gIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGF0IHRoZSBlbmQgb2YgdGhlIGV4cHJlc3Npb25gO1xuXG4gICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKG1lc3NhZ2UsIHRoaXMuaW5wdXQsIGxvY2F0aW9uLCB0aGlzLmxvY2F0aW9uKTtcbiAgfVxufVxuXG5jbGFzcyBTaW1wbGVFeHByZXNzaW9uQ2hlY2tlciBpbXBsZW1lbnRzIEFzdFZpc2l0b3Ige1xuICBzdGF0aWMgY2hlY2soYXN0OiBBU1QpOiBib29sZWFuIHtcbiAgICB2YXIgcyA9IG5ldyBTaW1wbGVFeHByZXNzaW9uQ2hlY2tlcigpO1xuICAgIGFzdC52aXNpdChzKTtcbiAgICByZXR1cm4gcy5zaW1wbGU7XG4gIH1cblxuICBzaW1wbGUgPSB0cnVlO1xuXG4gIHZpc2l0SW1wbGljaXRSZWNlaXZlcihhc3Q6IEltcGxpY2l0UmVjZWl2ZXIpIHt9XG5cbiAgdmlzaXRJbnRlcnBvbGF0aW9uKGFzdDogSW50ZXJwb2xhdGlvbikgeyB0aGlzLnNpbXBsZSA9IGZhbHNlOyB9XG5cbiAgdmlzaXRMaXRlcmFsUHJpbWl0aXZlKGFzdDogTGl0ZXJhbFByaW1pdGl2ZSkge31cblxuICB2aXNpdFByb3BlcnR5UmVhZChhc3Q6IFByb3BlcnR5UmVhZCkge31cblxuICB2aXNpdFByb3BlcnR5V3JpdGUoYXN0OiBQcm9wZXJ0eVdyaXRlKSB7IHRoaXMuc2ltcGxlID0gZmFsc2U7IH1cblxuICB2aXNpdFNhZmVQcm9wZXJ0eVJlYWQoYXN0OiBTYWZlUHJvcGVydHlSZWFkKSB7IHRoaXMuc2ltcGxlID0gZmFsc2U7IH1cblxuICB2aXNpdE1ldGhvZENhbGwoYXN0OiBNZXRob2RDYWxsKSB7IHRoaXMuc2ltcGxlID0gZmFsc2U7IH1cblxuICB2aXNpdFNhZmVNZXRob2RDYWxsKGFzdDogU2FmZU1ldGhvZENhbGwpIHsgdGhpcy5zaW1wbGUgPSBmYWxzZTsgfVxuXG4gIHZpc2l0RnVuY3Rpb25DYWxsKGFzdDogRnVuY3Rpb25DYWxsKSB7IHRoaXMuc2ltcGxlID0gZmFsc2U7IH1cblxuICB2aXNpdExpdGVyYWxBcnJheShhc3Q6IExpdGVyYWxBcnJheSkgeyB0aGlzLnZpc2l0QWxsKGFzdC5leHByZXNzaW9ucyk7IH1cblxuICB2aXNpdExpdGVyYWxNYXAoYXN0OiBMaXRlcmFsTWFwKSB7IHRoaXMudmlzaXRBbGwoYXN0LnZhbHVlcyk7IH1cblxuICB2aXNpdEJpbmFyeShhc3Q6IEJpbmFyeSkgeyB0aGlzLnNpbXBsZSA9IGZhbHNlOyB9XG5cbiAgdmlzaXRQcmVmaXhOb3QoYXN0OiBQcmVmaXhOb3QpIHsgdGhpcy5zaW1wbGUgPSBmYWxzZTsgfVxuXG4gIHZpc2l0Q29uZGl0aW9uYWwoYXN0OiBDb25kaXRpb25hbCkgeyB0aGlzLnNpbXBsZSA9IGZhbHNlOyB9XG5cbiAgdmlzaXRQaXBlKGFzdDogQmluZGluZ1BpcGUpIHsgdGhpcy5zaW1wbGUgPSBmYWxzZTsgfVxuXG4gIHZpc2l0S2V5ZWRSZWFkKGFzdDogS2V5ZWRSZWFkKSB7IHRoaXMuc2ltcGxlID0gZmFsc2U7IH1cblxuICB2aXNpdEtleWVkV3JpdGUoYXN0OiBLZXllZFdyaXRlKSB7IHRoaXMuc2ltcGxlID0gZmFsc2U7IH1cblxuICB2aXNpdEFsbChhc3RzOiBhbnlbXSk6IGFueVtdIHtcbiAgICB2YXIgcmVzID0gTGlzdFdyYXBwZXIuY3JlYXRlRml4ZWRTaXplKGFzdHMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFzdHMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHJlc1tpXSA9IGFzdHNbaV0udmlzaXQodGhpcyk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICB2aXNpdENoYWluKGFzdDogQ2hhaW4pIHsgdGhpcy5zaW1wbGUgPSBmYWxzZTsgfVxuXG4gIHZpc2l0UXVvdGUoYXN0OiBRdW90ZSkgeyB0aGlzLnNpbXBsZSA9IGZhbHNlOyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL3BhcnNlci9wYXJzZXIudHNcbiAqKi8iLCJpbXBvcnQge2lzUHJlc2VudH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7TGlzdFdyYXBwZXIsIE1hcFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5cbmV4cG9ydCBjbGFzcyBMb2NhbHMge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcGFyZW50OiBMb2NhbHMsIHB1YmxpYyBjdXJyZW50OiBNYXA8YW55LCBhbnk+KSB7fVxuXG4gIGNvbnRhaW5zKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmN1cnJlbnQuaGFzKG5hbWUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNQcmVzZW50KHRoaXMucGFyZW50KSkge1xuICAgICAgcmV0dXJuIHRoaXMucGFyZW50LmNvbnRhaW5zKG5hbWUpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldChuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIGlmICh0aGlzLmN1cnJlbnQuaGFzKG5hbWUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jdXJyZW50LmdldChuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoaXNQcmVzZW50KHRoaXMucGFyZW50KSkge1xuICAgICAgcmV0dXJuIHRoaXMucGFyZW50LmdldChuYW1lKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgQ2Fubm90IGZpbmQgJyR7bmFtZX0nYCk7XG4gIH1cblxuICBzZXQobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgLy8gVE9ETyhyYWRvKTogY29uc2lkZXIgcmVtb3ZpbmcgdGhpcyBjaGVjayBpZiB3ZSBjYW4gZ3VhcmFudGVlIHRoaXMgaXMgbm90XG4gICAgLy8gZXhwb3NlZCB0byB0aGUgcHVibGljIEFQSS5cbiAgICAvLyBUT0RPOiB2c2F2a2luIG1heWJlIGl0IHNob3VsZCBjaGVjayBvbmx5IHRoZSBsb2NhbCBtYXBcbiAgICBpZiAodGhpcy5jdXJyZW50LmhhcyhuYW1lKSkge1xuICAgICAgdGhpcy5jdXJyZW50LnNldChuYW1lLCB2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKFxuICAgICAgICAgIGBTZXR0aW5nIG9mIG5ldyBrZXlzIHBvc3QtY29uc3RydWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuIEtleTogJHtuYW1lfS5gKTtcbiAgICB9XG4gIH1cblxuICBjbGVhclZhbHVlcygpOiB2b2lkIHsgTWFwV3JhcHBlci5jbGVhclZhbHVlcyh0aGlzLmN1cnJlbnQpOyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL3BhcnNlci9sb2NhbHMudHNcbiAqKi8iLCJpbXBvcnQge0Jhc2VFeGNlcHRpb24sIFdyYXBwZWRFeGNlcHRpb259IGZyb20gXCJhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnNcIjtcblxuLyoqXG4gKiBBbiBlcnJvciB0aHJvd24gaWYgYXBwbGljYXRpb24gY2hhbmdlcyBtb2RlbCBicmVha2luZyB0aGUgdG9wLWRvd24gZGF0YSBmbG93LlxuICpcbiAqIFRoaXMgZXhjZXB0aW9uIGlzIG9ubHkgdGhyb3duIGluIGRldiBtb2RlLlxuICpcbiAqIDwhLS0gVE9ETzogQWRkIGEgbGluayBvbmNlIHRoZSBkZXYgbW9kZSBvcHRpb24gaXMgY29uZmlndXJhYmxlIC0tPlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAncGFyZW50JyxcbiAqICAgdGVtcGxhdGU6IGBcbiAqICAgICA8Y2hpbGQgW3Byb3BdPVwicGFyZW50UHJvcFwiPjwvY2hpbGQ+XG4gKiAgIGAsXG4gKiAgIGRpcmVjdGl2ZXM6IFtmb3J3YXJkUmVmKCgpID0+IENoaWxkKV1cbiAqIH0pXG4gKiBjbGFzcyBQYXJlbnQge1xuICogICBwYXJlbnRQcm9wID0gXCJpbml0XCI7XG4gKiB9XG4gKlxuICogQERpcmVjdGl2ZSh7c2VsZWN0b3I6ICdjaGlsZCcsIGlucHV0czogWydwcm9wJ119KVxuICogY2xhc3MgQ2hpbGQge1xuICogICBjb25zdHJ1Y3RvcihwdWJsaWMgcGFyZW50OiBQYXJlbnQpIHt9XG4gKlxuICogICBzZXQgcHJvcCh2KSB7XG4gKiAgICAgLy8gdGhpcyB1cGRhdGVzIHRoZSBwYXJlbnQgcHJvcGVydHksIHdoaWNoIGlzIGRpc2FsbG93ZWQgZHVyaW5nIGNoYW5nZSBkZXRlY3Rpb25cbiAqICAgICAvLyB0aGlzIHdpbGwgcmVzdWx0IGluIEV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkRXhjZXB0aW9uXG4gKiAgICAgdGhpcy5wYXJlbnQucGFyZW50UHJvcCA9IFwidXBkYXRlZFwiO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKGV4cDogc3RyaW5nLCBvbGRWYWx1ZTogYW55LCBjdXJyVmFsdWU6IGFueSwgY29udGV4dDogYW55KSB7XG4gICAgc3VwZXIoYEV4cHJlc3Npb24gJyR7ZXhwfScgaGFzIGNoYW5nZWQgYWZ0ZXIgaXQgd2FzIGNoZWNrZWQuIGAgK1xuICAgICAgICAgIGBQcmV2aW91cyB2YWx1ZTogJyR7b2xkVmFsdWV9Jy4gQ3VycmVudCB2YWx1ZTogJyR7Y3VyclZhbHVlfSdgKTtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGFuIGV4cHJlc3Npb24gZXZhbHVhdGlvbiByYWlzZXMgYW4gZXhjZXB0aW9uLlxuICpcbiAqIFRoaXMgZXJyb3Igd3JhcHMgdGhlIG9yaWdpbmFsIGV4Y2VwdGlvbiB0byBhdHRhY2ggYWRkaXRpb25hbCBjb250ZXh0dWFsIGluZm9ybWF0aW9uIHRoYXQgY2FuXG4gKiBiZSB1c2VmdWwgZm9yIGRlYnVnZ2luZy5cbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvMkt5d296P3A9cHJldmlldykpXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogQERpcmVjdGl2ZSh7c2VsZWN0b3I6ICdjaGlsZCcsIGlucHV0czogWydwcm9wJ119KVxuICogY2xhc3MgQ2hpbGQge1xuICogICBwcm9wO1xuICogfVxuICpcbiAqIEBDb21wb25lbnQoe1xuICogICBzZWxlY3RvcjogJ2FwcCcsXG4gKiAgIHRlbXBsYXRlOiBgXG4gKiAgICAgPGNoaWxkIFtwcm9wXT1cImZpZWxkLmZpcnN0XCI+PC9jaGlsZD5cbiAqICAgYCxcbiAqICAgZGlyZWN0aXZlczogW0NoaWxkXVxuICogfSlcbiAqIGNsYXNzIEFwcCB7XG4gKiAgIGZpZWxkID0gbnVsbDtcbiAqIH1cbiAqXG4gKiBib290c3RyYXAoQXBwKTtcbiAqIGBgYFxuICpcbiAqIFlvdSBjYW4gYWNjZXNzIHRoZSBvcmlnaW5hbCBleGNlcHRpb24gYW5kIHN0YWNrIHRocm91Z2ggdGhlIGBvcmlnaW5hbEV4Y2VwdGlvbmAgYW5kXG4gKiBgb3JpZ2luYWxTdGFja2AgcHJvcGVydGllcy5cbiAqL1xuZXhwb3J0IGNsYXNzIENoYW5nZURldGVjdGlvbkVycm9yIGV4dGVuZHMgV3JhcHBlZEV4Y2VwdGlvbiB7XG4gIC8qKlxuICAgKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZXhwcmVzc2lvbiB0aGF0IHRyaWdnZXJlZCB0aGUgZXhjZXB0aW9uLlxuICAgKi9cbiAgbG9jYXRpb246IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihleHA6IHN0cmluZywgb3JpZ2luYWxFeGNlcHRpb246IGFueSwgb3JpZ2luYWxTdGFjazogYW55LCBjb250ZXh0OiBhbnkpIHtcbiAgICBzdXBlcihgJHtvcmlnaW5hbEV4Y2VwdGlvbn0gaW4gWyR7ZXhwfV1gLCBvcmlnaW5hbEV4Y2VwdGlvbiwgb3JpZ2luYWxTdGFjaywgY29udGV4dCk7XG4gICAgdGhpcy5sb2NhdGlvbiA9IGV4cDtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGNoYW5nZSBkZXRlY3RvciBleGVjdXRlcyBvbiBkZWh5ZHJhdGVkIHZpZXcuXG4gKlxuICogVGhpcyBlcnJvciBpbmRpY2F0ZXMgYSBidWcgaW4gdGhlIGZyYW1ld29yay5cbiAqXG4gKiBUaGlzIGlzIGFuIGludGVybmFsIEFuZ3VsYXIgZXJyb3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZWh5ZHJhdGVkRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKCkgeyBzdXBlcignQXR0ZW1wdCB0byBkZXRlY3QgY2hhbmdlcyBvbiBhIGRlaHlkcmF0ZWQgZGV0ZWN0b3IuJyk7IH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vZXhjZXB0aW9ucy50c1xuICoqLyIsImltcG9ydCB7TG9jYWxzfSBmcm9tICcuL3BhcnNlci9sb2NhbHMnO1xuaW1wb3J0IHtCaW5kaW5nVGFyZ2V0LCBCaW5kaW5nUmVjb3JkfSBmcm9tICcuL2JpbmRpbmdfcmVjb3JkJztcbmltcG9ydCB7RGlyZWN0aXZlSW5kZXgsIERpcmVjdGl2ZVJlY29yZH0gZnJvbSAnLi9kaXJlY3RpdmVfcmVjb3JkJztcbmltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3l9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7Q2hhbmdlRGV0ZWN0b3JSZWZ9IGZyb20gJy4vY2hhbmdlX2RldGVjdG9yX3JlZic7XG5cbmV4cG9ydCBjbGFzcyBEZWJ1Z0NvbnRleHQge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZWxlbWVudDogYW55LCBwdWJsaWMgY29tcG9uZW50RWxlbWVudDogYW55LCBwdWJsaWMgZGlyZWN0aXZlOiBhbnksXG4gICAgICAgICAgICAgIHB1YmxpYyBjb250ZXh0OiBhbnksIHB1YmxpYyBsb2NhbHM6IGFueSwgcHVibGljIGluamVjdG9yOiBhbnkpIHt9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhbmdlRGlzcGF0Y2hlciB7XG4gIGdldERlYnVnQ29udGV4dChlbGVtZW50SW5kZXg6IG51bWJlciwgZGlyZWN0aXZlSW5kZXg6IERpcmVjdGl2ZUluZGV4KTogRGVidWdDb250ZXh0O1xuICBub3RpZnlPbkJpbmRpbmcoYmluZGluZ1RhcmdldDogQmluZGluZ1RhcmdldCwgdmFsdWU6IGFueSk6IHZvaWQ7XG4gIGxvZ0JpbmRpbmdVcGRhdGUoYmluZGluZ1RhcmdldDogQmluZGluZ1RhcmdldCwgdmFsdWU6IGFueSk6IHZvaWQ7XG4gIG5vdGlmeUFmdGVyQ29udGVudENoZWNrZWQoKTogdm9pZDtcbiAgbm90aWZ5QWZ0ZXJWaWV3Q2hlY2tlZCgpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENoYW5nZURldGVjdG9yIHtcbiAgcGFyZW50OiBDaGFuZ2VEZXRlY3RvcjtcbiAgbW9kZTogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3k7XG4gIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWY7XG5cbiAgYWRkQ29udGVudENoaWxkKGNkOiBDaGFuZ2VEZXRlY3Rvcik6IHZvaWQ7XG4gIGFkZFZpZXdDaGlsZChjZDogQ2hhbmdlRGV0ZWN0b3IpOiB2b2lkO1xuICByZW1vdmVDb250ZW50Q2hpbGQoY2Q6IENoYW5nZURldGVjdG9yKTogdm9pZDtcbiAgcmVtb3ZlVmlld0NoaWxkKGNkOiBDaGFuZ2VEZXRlY3Rvcik6IHZvaWQ7XG4gIHJlbW92ZSgpOiB2b2lkO1xuICBoeWRyYXRlKGNvbnRleHQ6IGFueSwgbG9jYWxzOiBMb2NhbHMsIGRpcmVjdGl2ZXM6IGFueSwgcGlwZXM6IGFueSk6IHZvaWQ7XG4gIGRlaHlkcmF0ZSgpOiB2b2lkO1xuICBtYXJrUGF0aFRvUm9vdEFzQ2hlY2tPbmNlKCk6IHZvaWQ7XG5cbiAgaGFuZGxlRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIGVsSW5kZXg6IG51bWJlciwgbG9jYWxzOiBMb2NhbHMpO1xuICBkZXRlY3RDaGFuZ2VzKCk6IHZvaWQ7XG4gIGNoZWNrTm9DaGFuZ2VzKCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdG9DaGFuZ2VEZXRlY3RvciB7IGluc3RhbnRpYXRlKGRpc3BhdGNoZXI6IENoYW5nZURpc3BhdGNoZXIpOiBDaGFuZ2VEZXRlY3RvcjsgfVxuXG5leHBvcnQgY2xhc3MgQ2hhbmdlRGV0ZWN0b3JHZW5Db25maWcge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZ2VuRGVidWdJbmZvOiBib29sZWFuLCBwdWJsaWMgbG9nQmluZGluZ1VwZGF0ZTogYm9vbGVhbixcbiAgICAgICAgICAgICAgcHVibGljIHVzZUppdDogYm9vbGVhbikge31cbn1cblxuZXhwb3J0IGNsYXNzIENoYW5nZURldGVjdG9yRGVmaW5pdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBpZDogc3RyaW5nLCBwdWJsaWMgc3RyYXRlZ3k6IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgICAgICAgICAgICBwdWJsaWMgdmFyaWFibGVOYW1lczogc3RyaW5nW10sIHB1YmxpYyBiaW5kaW5nUmVjb3JkczogQmluZGluZ1JlY29yZFtdLFxuICAgICAgICAgICAgICBwdWJsaWMgZXZlbnRSZWNvcmRzOiBCaW5kaW5nUmVjb3JkW10sIHB1YmxpYyBkaXJlY3RpdmVSZWNvcmRzOiBEaXJlY3RpdmVSZWNvcmRbXSxcbiAgICAgICAgICAgICAgcHVibGljIGdlbkNvbmZpZzogQ2hhbmdlRGV0ZWN0b3JHZW5Db25maWcpIHt9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2ludGVyZmFjZXMudHNcbiAqKi8iLCJpbXBvcnQge1N0cmluZ1dyYXBwZXIsIG5vcm1hbGl6ZUJvb2wsIGlzQmxhbmt9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5cbi8qKlxuICogRGVzY3JpYmVzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBjaGFuZ2UgZGV0ZWN0b3IuXG4gKi9cbmV4cG9ydCBlbnVtIENoYW5nZURldGVjdG9yU3RhdGUge1xuICAvKipcbiAgICogYE5ldmVyQ2hlY2tlZGAgbWVhbnMgdGhhdCB0aGUgY2hhbmdlIGRldGVjdG9yIGhhcyBub3QgYmVlbiBjaGVja2VkIHlldCwgYW5kXG4gICAqIGluaXRpYWxpemF0aW9uIG1ldGhvZHMgc2hvdWxkIGJlIGNhbGxlZCBkdXJpbmcgZGV0ZWN0aW9uLlxuICAgKi9cbiAgTmV2ZXJDaGVja2VkLFxuXG4gIC8qKlxuICAgKiBgQ2hlY2tlZEJlZm9yZWAgbWVhbnMgdGhhdCB0aGUgY2hhbmdlIGRldGVjdG9yIGhhcyBzdWNjZXNzZnVsbHkgY29tcGxldGVkIGF0IGxlYXN0XG4gICAqIG9uZSBkZXRlY3Rpb24gcHJldmlvdXNseS5cbiAgICovXG4gIENoZWNrZWRCZWZvcmUsXG5cbiAgLyoqXG4gICAqIGBFcnJvcmVkYCBtZWFucyB0aGF0IHRoZSBjaGFuZ2UgZGV0ZWN0b3IgZW5jb3VudGVyZWQgYW4gZXJyb3IgY2hlY2tpbmcgYSBiaW5kaW5nXG4gICAqIG9yIGNhbGxpbmcgYSBkaXJlY3RpdmUgbGlmZWN5Y2xlIG1ldGhvZCBhbmQgaXMgbm93IGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4gQ2hhbmdlXG4gICAqIGRldGVjdG9ycyBpbiB0aGlzIHN0YXRlIHdpbGwgbm8gbG9uZ2VyIGRldGVjdCBjaGFuZ2VzLlxuICAgKi9cbiAgRXJyb3JlZFxufVxuXG4vKipcbiAqIERlc2NyaWJlcyB3aXRoaW4gdGhlIGNoYW5nZSBkZXRlY3RvciB3aGljaCBzdHJhdGVneSB3aWxsIGJlIHVzZWQgdGhlIG5leHQgdGltZSBjaGFuZ2VcbiAqIGRldGVjdGlvbiBpcyB0cmlnZ2VyZWQuXG4gKi9cbmV4cG9ydCBlbnVtIENoYW5nZURldGVjdGlvblN0cmF0ZWd5IHtcbiAgLyoqXG4gICAqIGBDaGVja2VkT25jZWAgbWVhbnMgdGhhdCBhZnRlciBjYWxsaW5nIGRldGVjdENoYW5nZXMgdGhlIG1vZGUgb2YgdGhlIGNoYW5nZSBkZXRlY3RvclxuICAgKiB3aWxsIGJlY29tZSBgQ2hlY2tlZGAuXG4gICAqL1xuICBDaGVja09uY2UsXG5cbiAgLyoqXG4gICAqIGBDaGVja2VkYCBtZWFucyB0aGF0IHRoZSBjaGFuZ2UgZGV0ZWN0b3Igc2hvdWxkIGJlIHNraXBwZWQgdW50aWwgaXRzIG1vZGUgY2hhbmdlcyB0b1xuICAgKiBgQ2hlY2tPbmNlYC5cbiAgICovXG4gIENoZWNrZWQsXG5cbiAgLyoqXG4gICAqIGBDaGVja0Fsd2F5c2AgbWVhbnMgdGhhdCBhZnRlciBjYWxsaW5nIGRldGVjdENoYW5nZXMgdGhlIG1vZGUgb2YgdGhlIGNoYW5nZSBkZXRlY3RvclxuICAgKiB3aWxsIHJlbWFpbiBgQ2hlY2tBbHdheXNgLlxuICAgKi9cbiAgQ2hlY2tBbHdheXMsXG5cbiAgLyoqXG4gICAqIGBEZXRhY2hlZGAgbWVhbnMgdGhhdCB0aGUgY2hhbmdlIGRldGVjdG9yIHN1YiB0cmVlIGlzIG5vdCBhIHBhcnQgb2YgdGhlIG1haW4gdHJlZSBhbmRcbiAgICogc2hvdWxkIGJlIHNraXBwZWQuXG4gICAqL1xuICBEZXRhY2hlZCxcblxuICAvKipcbiAgICogYE9uUHVzaGAgbWVhbnMgdGhhdCB0aGUgY2hhbmdlIGRldGVjdG9yJ3MgbW9kZSB3aWxsIGJlIHNldCB0byBgQ2hlY2tPbmNlYCBkdXJpbmcgaHlkcmF0aW9uLlxuICAgKi9cbiAgT25QdXNoLFxuXG4gIC8qKlxuICAgKiBgRGVmYXVsdGAgbWVhbnMgdGhhdCB0aGUgY2hhbmdlIGRldGVjdG9yJ3MgbW9kZSB3aWxsIGJlIHNldCB0byBgQ2hlY2tBbHdheXNgIGR1cmluZyBoeWRyYXRpb24uXG4gICAqL1xuICBEZWZhdWx0LFxuXG4gIC8qKlxuICAgKiBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlLiBXb3JrcyBvbmx5IGluIERhcnQuXG4gICAqL1xuICBPblB1c2hPYnNlcnZlXG59XG5cbi8qKlxuICogTGlzdCBvZiBwb3NzaWJsZSB7QGxpbmsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3l9IHZhbHVlcy5cbiAqL1xuZXhwb3J0IHZhciBDSEFOR0VfREVURUNUSU9OX1NUUkFURUdZX1ZBTFVFUyA9IFtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuQ2hlY2tPbmNlLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5DaGVja2VkLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5DaGVja0Fsd2F5cyxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuRGV0YWNoZWQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuRGVmYXVsdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoT2JzZXJ2ZVxuXTtcblxuLyoqXG4gKiBMaXN0IG9mIHBvc3NpYmxlIHtAbGluayBDaGFuZ2VEZXRlY3RvclN0YXRlfSB2YWx1ZXMuXG4gKi9cbmV4cG9ydCB2YXIgQ0hBTkdFX0RFVEVDVE9SX1NUQVRFX1ZBTFVFUyA9IFtcbiAgQ2hhbmdlRGV0ZWN0b3JTdGF0ZS5OZXZlckNoZWNrZWQsXG4gIENoYW5nZURldGVjdG9yU3RhdGUuQ2hlY2tlZEJlZm9yZSxcbiAgQ2hhbmdlRGV0ZWN0b3JTdGF0ZS5FcnJvcmVkXG5dO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNEZWZhdWx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3koXG4gICAgY2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3k6IENoYW5nZURldGVjdGlvblN0cmF0ZWd5KTogYm9vbGVhbiB7XG4gIHJldHVybiBpc0JsYW5rKGNoYW5nZURldGVjdGlvblN0cmF0ZWd5KSB8fFxuICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kgPT09IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LkRlZmF1bHQ7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2NvbnN0YW50cy50c1xuICoqLyIsImltcG9ydCB7VHlwZSwgaXNCbGFuaywgaXNQcmVzZW50LCBpc1N0cmluZ30gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7TGlzdFdyYXBwZXIsIE1hcFdyYXBwZXIsIFN0cmluZ01hcFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5cbmltcG9ydCB7XG4gIFByb3BlcnR5UmVhZCxcbiAgUHJvcGVydHlXcml0ZSxcbiAgS2V5ZWRXcml0ZSxcbiAgQVNULFxuICBBU1RXaXRoU291cmNlLFxuICBBc3RWaXNpdG9yLFxuICBCaW5hcnksXG4gIENoYWluLFxuICBDb25kaXRpb25hbCxcbiAgQmluZGluZ1BpcGUsXG4gIEZ1bmN0aW9uQ2FsbCxcbiAgSW1wbGljaXRSZWNlaXZlcixcbiAgSW50ZXJwb2xhdGlvbixcbiAgS2V5ZWRSZWFkLFxuICBMaXRlcmFsQXJyYXksXG4gIExpdGVyYWxNYXAsXG4gIExpdGVyYWxQcmltaXRpdmUsXG4gIE1ldGhvZENhbGwsXG4gIFByZWZpeE5vdCxcbiAgUXVvdGUsXG4gIFNhZmVQcm9wZXJ0eVJlYWQsXG4gIFNhZmVNZXRob2RDYWxsXG59IGZyb20gJy4vcGFyc2VyL2FzdCc7XG5cbmltcG9ydCB7Q2hhbmdlRGV0ZWN0b3IsIFByb3RvQ2hhbmdlRGV0ZWN0b3IsIENoYW5nZURldGVjdG9yRGVmaW5pdGlvbn0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uVXRpbH0gZnJvbSAnLi9jaGFuZ2VfZGV0ZWN0aW9uX3V0aWwnO1xuaW1wb3J0IHtEeW5hbWljQ2hhbmdlRGV0ZWN0b3J9IGZyb20gJy4vZHluYW1pY19jaGFuZ2VfZGV0ZWN0b3InO1xuaW1wb3J0IHtCaW5kaW5nUmVjb3JkLCBCaW5kaW5nVGFyZ2V0fSBmcm9tICcuL2JpbmRpbmdfcmVjb3JkJztcbmltcG9ydCB7RGlyZWN0aXZlUmVjb3JkLCBEaXJlY3RpdmVJbmRleH0gZnJvbSAnLi9kaXJlY3RpdmVfcmVjb3JkJztcbmltcG9ydCB7RXZlbnRCaW5kaW5nfSBmcm9tICcuL2V2ZW50X2JpbmRpbmcnO1xuXG5pbXBvcnQge2NvYWxlc2NlfSBmcm9tICcuL2NvYWxlc2NlJztcbmltcG9ydCB7UHJvdG9SZWNvcmQsIFJlY29yZFR5cGV9IGZyb20gJy4vcHJvdG9fcmVjb3JkJztcblxuZXhwb3J0IGNsYXNzIER5bmFtaWNQcm90b0NoYW5nZURldGVjdG9yIGltcGxlbWVudHMgUHJvdG9DaGFuZ2VEZXRlY3RvciB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3Byb3BlcnR5QmluZGluZ1JlY29yZHM6IFByb3RvUmVjb3JkW107XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3Byb3BlcnR5QmluZGluZ1RhcmdldHM6IEJpbmRpbmdUYXJnZXRbXTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZXZlbnRCaW5kaW5nUmVjb3JkczogRXZlbnRCaW5kaW5nW107XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2RpcmVjdGl2ZUluZGljZXM6IERpcmVjdGl2ZUluZGV4W107XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZGVmaW5pdGlvbjogQ2hhbmdlRGV0ZWN0b3JEZWZpbml0aW9uKSB7XG4gICAgdGhpcy5fcHJvcGVydHlCaW5kaW5nUmVjb3JkcyA9IGNyZWF0ZVByb3BlcnR5UmVjb3JkcyhfZGVmaW5pdGlvbik7XG4gICAgdGhpcy5fZXZlbnRCaW5kaW5nUmVjb3JkcyA9IGNyZWF0ZUV2ZW50UmVjb3JkcyhfZGVmaW5pdGlvbik7XG4gICAgdGhpcy5fcHJvcGVydHlCaW5kaW5nVGFyZ2V0cyA9IHRoaXMuX2RlZmluaXRpb24uYmluZGluZ1JlY29yZHMubWFwKGIgPT4gYi50YXJnZXQpO1xuICAgIHRoaXMuX2RpcmVjdGl2ZUluZGljZXMgPSB0aGlzLl9kZWZpbml0aW9uLmRpcmVjdGl2ZVJlY29yZHMubWFwKGQgPT4gZC5kaXJlY3RpdmVJbmRleCk7XG4gIH1cblxuICBpbnN0YW50aWF0ZShkaXNwYXRjaGVyOiBhbnkpOiBDaGFuZ2VEZXRlY3RvciB7XG4gICAgcmV0dXJuIG5ldyBEeW5hbWljQ2hhbmdlRGV0ZWN0b3IoXG4gICAgICAgIHRoaXMuX2RlZmluaXRpb24uaWQsIGRpc3BhdGNoZXIsIHRoaXMuX3Byb3BlcnR5QmluZGluZ1JlY29yZHMubGVuZ3RoLFxuICAgICAgICB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdUYXJnZXRzLCB0aGlzLl9kaXJlY3RpdmVJbmRpY2VzLCB0aGlzLl9kZWZpbml0aW9uLnN0cmF0ZWd5LFxuICAgICAgICB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdSZWNvcmRzLCB0aGlzLl9ldmVudEJpbmRpbmdSZWNvcmRzLCB0aGlzLl9kZWZpbml0aW9uLmRpcmVjdGl2ZVJlY29yZHMsXG4gICAgICAgIHRoaXMuX2RlZmluaXRpb24uZ2VuQ29uZmlnKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUHJvcGVydHlSZWNvcmRzKGRlZmluaXRpb246IENoYW5nZURldGVjdG9yRGVmaW5pdGlvbik6IFByb3RvUmVjb3JkW10ge1xuICB2YXIgcmVjb3JkQnVpbGRlciA9IG5ldyBQcm90b1JlY29yZEJ1aWxkZXIoKTtcbiAgTGlzdFdyYXBwZXIuZm9yRWFjaFdpdGhJbmRleChkZWZpbml0aW9uLmJpbmRpbmdSZWNvcmRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiLCBpbmRleCkgPT4gcmVjb3JkQnVpbGRlci5hZGQoYiwgZGVmaW5pdGlvbi52YXJpYWJsZU5hbWVzLCBpbmRleCkpO1xuICByZXR1cm4gY29hbGVzY2UocmVjb3JkQnVpbGRlci5yZWNvcmRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV2ZW50UmVjb3JkcyhkZWZpbml0aW9uOiBDaGFuZ2VEZXRlY3RvckRlZmluaXRpb24pOiBFdmVudEJpbmRpbmdbXSB7XG4gIC8vIFRPRE86IHZzYXZraW46IHJlbW92ZSAkZXZlbnQgd2hlbiB0aGUgY29tcGlsZXIgaGFuZGxlcyByZW5kZXItc2lkZSB2YXJpYWJsZXMgcHJvcGVybHlcbiAgdmFyIHZhck5hbWVzID0gTGlzdFdyYXBwZXIuY29uY2F0KFsnJGV2ZW50J10sIGRlZmluaXRpb24udmFyaWFibGVOYW1lcyk7XG4gIHJldHVybiBkZWZpbml0aW9uLmV2ZW50UmVjb3Jkcy5tYXAoZXIgPT4ge1xuICAgIHZhciByZWNvcmRzID0gX0NvbnZlcnRBc3RJbnRvUHJvdG9SZWNvcmRzLmNyZWF0ZShlciwgdmFyTmFtZXMpO1xuICAgIHZhciBkaXJJbmRleCA9IGVyLmltcGxpY2l0UmVjZWl2ZXIgaW5zdGFuY2VvZiBEaXJlY3RpdmVJbmRleCA/IGVyLmltcGxpY2l0UmVjZWl2ZXIgOiBudWxsO1xuICAgIHJldHVybiBuZXcgRXZlbnRCaW5kaW5nKGVyLnRhcmdldC5uYW1lLCBlci50YXJnZXQuZWxlbWVudEluZGV4LCBkaXJJbmRleCwgcmVjb3Jkcyk7XG4gIH0pO1xufVxuXG5leHBvcnQgY2xhc3MgUHJvdG9SZWNvcmRCdWlsZGVyIHtcbiAgcmVjb3JkczogUHJvdG9SZWNvcmRbXSA9IFtdO1xuXG4gIGFkZChiOiBCaW5kaW5nUmVjb3JkLCB2YXJpYWJsZU5hbWVzOiBzdHJpbmdbXSwgYmluZGluZ0luZGV4OiBudW1iZXIpIHtcbiAgICB2YXIgb2xkTGFzdCA9IExpc3RXcmFwcGVyLmxhc3QodGhpcy5yZWNvcmRzKTtcbiAgICBpZiAoaXNQcmVzZW50KG9sZExhc3QpICYmIG9sZExhc3QuYmluZGluZ1JlY29yZC5kaXJlY3RpdmVSZWNvcmQgPT0gYi5kaXJlY3RpdmVSZWNvcmQpIHtcbiAgICAgIG9sZExhc3QubGFzdEluRGlyZWN0aXZlID0gZmFsc2U7XG4gICAgfVxuICAgIHZhciBudW1iZXJPZlJlY29yZHNCZWZvcmUgPSB0aGlzLnJlY29yZHMubGVuZ3RoO1xuICAgIHRoaXMuX2FwcGVuZFJlY29yZHMoYiwgdmFyaWFibGVOYW1lcywgYmluZGluZ0luZGV4KTtcbiAgICB2YXIgbmV3TGFzdCA9IExpc3RXcmFwcGVyLmxhc3QodGhpcy5yZWNvcmRzKTtcbiAgICBpZiAoaXNQcmVzZW50KG5ld0xhc3QpICYmIG5ld0xhc3QgIT09IG9sZExhc3QpIHtcbiAgICAgIG5ld0xhc3QubGFzdEluQmluZGluZyA9IHRydWU7XG4gICAgICBuZXdMYXN0Lmxhc3RJbkRpcmVjdGl2ZSA9IHRydWU7XG4gICAgICB0aGlzLl9zZXRBcmd1bWVudFRvUHVyZUZ1bmN0aW9uKG51bWJlck9mUmVjb3Jkc0JlZm9yZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfc2V0QXJndW1lbnRUb1B1cmVGdW5jdGlvbihzdGFydEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBmb3IgKHZhciBpID0gc3RhcnRJbmRleDsgaSA8IHRoaXMucmVjb3Jkcy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIHJlYyA9IHRoaXMucmVjb3Jkc1tpXTtcbiAgICAgIGlmIChyZWMuaXNQdXJlRnVuY3Rpb24oKSkge1xuICAgICAgICByZWMuYXJncy5mb3JFYWNoKHJlY29yZEluZGV4ID0+IHRoaXMucmVjb3Jkc1tyZWNvcmRJbmRleCAtIDFdLmFyZ3VtZW50VG9QdXJlRnVuY3Rpb24gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZWMubW9kZSA9PT0gUmVjb3JkVHlwZS5QaXBlKSB7XG4gICAgICAgIHJlYy5hcmdzLmZvckVhY2gocmVjb3JkSW5kZXggPT4gdGhpcy5yZWNvcmRzW3JlY29yZEluZGV4IC0gMV0uYXJndW1lbnRUb1B1cmVGdW5jdGlvbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpO1xuICAgICAgICB0aGlzLnJlY29yZHNbcmVjLmNvbnRleHRJbmRleCAtIDFdLmFyZ3VtZW50VG9QdXJlRnVuY3Rpb24gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2FwcGVuZFJlY29yZHMoYjogQmluZGluZ1JlY29yZCwgdmFyaWFibGVOYW1lczogc3RyaW5nW10sIGJpbmRpbmdJbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKGIuaXNEaXJlY3RpdmVMaWZlY3ljbGUoKSkge1xuICAgICAgdGhpcy5yZWNvcmRzLnB1c2gobmV3IFByb3RvUmVjb3JkKFJlY29yZFR5cGUuRGlyZWN0aXZlTGlmZWN5Y2xlLCBiLmxpZmVjeWNsZUV2ZW50LCBudWxsLCBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSwgLTEsIG51bGwsIHRoaXMucmVjb3Jkcy5sZW5ndGggKyAxLCBiLCBmYWxzZSwgZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCBudWxsKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9Db252ZXJ0QXN0SW50b1Byb3RvUmVjb3Jkcy5hcHBlbmQodGhpcy5yZWNvcmRzLCBiLCB2YXJpYWJsZU5hbWVzLCBiaW5kaW5nSW5kZXgpO1xuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBfQ29udmVydEFzdEludG9Qcm90b1JlY29yZHMgaW1wbGVtZW50cyBBc3RWaXNpdG9yIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfcmVjb3JkczogUHJvdG9SZWNvcmRbXSwgcHJpdmF0ZSBfYmluZGluZ1JlY29yZDogQmluZGluZ1JlY29yZCxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfdmFyaWFibGVOYW1lczogc3RyaW5nW10sIHByaXZhdGUgX2JpbmRpbmdJbmRleDogbnVtYmVyKSB7fVxuXG4gIHN0YXRpYyBhcHBlbmQocmVjb3JkczogUHJvdG9SZWNvcmRbXSwgYjogQmluZGluZ1JlY29yZCwgdmFyaWFibGVOYW1lczogc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgYmluZGluZ0luZGV4OiBudW1iZXIpIHtcbiAgICB2YXIgYyA9IG5ldyBfQ29udmVydEFzdEludG9Qcm90b1JlY29yZHMocmVjb3JkcywgYiwgdmFyaWFibGVOYW1lcywgYmluZGluZ0luZGV4KTtcbiAgICBiLmFzdC52aXNpdChjKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGUoYjogQmluZGluZ1JlY29yZCwgdmFyaWFibGVOYW1lczogYW55W10pOiBQcm90b1JlY29yZFtdIHtcbiAgICB2YXIgcmVjID0gW107XG4gICAgX0NvbnZlcnRBc3RJbnRvUHJvdG9SZWNvcmRzLmFwcGVuZChyZWMsIGIsIHZhcmlhYmxlTmFtZXMsIG51bGwpO1xuICAgIHJlY1tyZWMubGVuZ3RoIC0gMV0ubGFzdEluQmluZGluZyA9IHRydWU7XG4gICAgcmV0dXJuIHJlYztcbiAgfVxuXG4gIHZpc2l0SW1wbGljaXRSZWNlaXZlcihhc3Q6IEltcGxpY2l0UmVjZWl2ZXIpOiBhbnkgeyByZXR1cm4gdGhpcy5fYmluZGluZ1JlY29yZC5pbXBsaWNpdFJlY2VpdmVyOyB9XG5cbiAgdmlzaXRJbnRlcnBvbGF0aW9uKGFzdDogSW50ZXJwb2xhdGlvbik6IG51bWJlciB7XG4gICAgdmFyIGFyZ3MgPSB0aGlzLl92aXNpdEFsbChhc3QuZXhwcmVzc2lvbnMpO1xuICAgIHJldHVybiB0aGlzLl9hZGRSZWNvcmQoUmVjb3JkVHlwZS5JbnRlcnBvbGF0ZSwgXCJpbnRlcnBvbGF0ZVwiLCBfaW50ZXJwb2xhdGlvbkZuKGFzdC5zdHJpbmdzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MsIGFzdC5zdHJpbmdzLCAwKTtcbiAgfVxuXG4gIHZpc2l0TGl0ZXJhbFByaW1pdGl2ZShhc3Q6IExpdGVyYWxQcmltaXRpdmUpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9hZGRSZWNvcmQoUmVjb3JkVHlwZS5Db25zdCwgXCJsaXRlcmFsXCIsIGFzdC52YWx1ZSwgW10sIG51bGwsIDApO1xuICB9XG5cbiAgdmlzaXRQcm9wZXJ0eVJlYWQoYXN0OiBQcm9wZXJ0eVJlYWQpOiBudW1iZXIge1xuICAgIHZhciByZWNlaXZlciA9IGFzdC5yZWNlaXZlci52aXNpdCh0aGlzKTtcbiAgICBpZiAoaXNQcmVzZW50KHRoaXMuX3ZhcmlhYmxlTmFtZXMpICYmIExpc3RXcmFwcGVyLmNvbnRhaW5zKHRoaXMuX3ZhcmlhYmxlTmFtZXMsIGFzdC5uYW1lKSAmJlxuICAgICAgICBhc3QucmVjZWl2ZXIgaW5zdGFuY2VvZiBJbXBsaWNpdFJlY2VpdmVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYWRkUmVjb3JkKFJlY29yZFR5cGUuTG9jYWwsIGFzdC5uYW1lLCBhc3QubmFtZSwgW10sIG51bGwsIHJlY2VpdmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX2FkZFJlY29yZChSZWNvcmRUeXBlLlByb3BlcnR5UmVhZCwgYXN0Lm5hbWUsIGFzdC5nZXR0ZXIsIFtdLCBudWxsLCByZWNlaXZlcik7XG4gICAgfVxuICB9XG5cbiAgdmlzaXRQcm9wZXJ0eVdyaXRlKGFzdDogUHJvcGVydHlXcml0ZSk6IG51bWJlciB7XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLl92YXJpYWJsZU5hbWVzKSAmJiBMaXN0V3JhcHBlci5jb250YWlucyh0aGlzLl92YXJpYWJsZU5hbWVzLCBhc3QubmFtZSkgJiZcbiAgICAgICAgYXN0LnJlY2VpdmVyIGluc3RhbmNlb2YgSW1wbGljaXRSZWNlaXZlcikge1xuICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYENhbm5vdCByZWFzc2lnbiBhIHZhcmlhYmxlIGJpbmRpbmcgJHthc3QubmFtZX1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHJlY2VpdmVyID0gYXN0LnJlY2VpdmVyLnZpc2l0KHRoaXMpO1xuICAgICAgdmFyIHZhbHVlID0gYXN0LnZhbHVlLnZpc2l0KHRoaXMpO1xuICAgICAgcmV0dXJuIHRoaXMuX2FkZFJlY29yZChSZWNvcmRUeXBlLlByb3BlcnR5V3JpdGUsIGFzdC5uYW1lLCBhc3Quc2V0dGVyLCBbdmFsdWVdLCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlcik7XG4gICAgfVxuICB9XG5cbiAgdmlzaXRLZXllZFdyaXRlKGFzdDogS2V5ZWRXcml0ZSk6IG51bWJlciB7XG4gICAgdmFyIG9iaiA9IGFzdC5vYmoudmlzaXQodGhpcyk7XG4gICAgdmFyIGtleSA9IGFzdC5rZXkudmlzaXQodGhpcyk7XG4gICAgdmFyIHZhbHVlID0gYXN0LnZhbHVlLnZpc2l0KHRoaXMpO1xuICAgIHJldHVybiB0aGlzLl9hZGRSZWNvcmQoUmVjb3JkVHlwZS5LZXllZFdyaXRlLCBudWxsLCBudWxsLCBba2V5LCB2YWx1ZV0sIG51bGwsIG9iaik7XG4gIH1cblxuICB2aXNpdFNhZmVQcm9wZXJ0eVJlYWQoYXN0OiBTYWZlUHJvcGVydHlSZWFkKTogbnVtYmVyIHtcbiAgICB2YXIgcmVjZWl2ZXIgPSBhc3QucmVjZWl2ZXIudmlzaXQodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMuX2FkZFJlY29yZChSZWNvcmRUeXBlLlNhZmVQcm9wZXJ0eSwgYXN0Lm5hbWUsIGFzdC5nZXR0ZXIsIFtdLCBudWxsLCByZWNlaXZlcik7XG4gIH1cblxuICB2aXNpdE1ldGhvZENhbGwoYXN0OiBNZXRob2RDYWxsKTogbnVtYmVyIHtcbiAgICB2YXIgcmVjZWl2ZXIgPSBhc3QucmVjZWl2ZXIudmlzaXQodGhpcyk7XG4gICAgdmFyIGFyZ3MgPSB0aGlzLl92aXNpdEFsbChhc3QuYXJncyk7XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLl92YXJpYWJsZU5hbWVzKSAmJiBMaXN0V3JhcHBlci5jb250YWlucyh0aGlzLl92YXJpYWJsZU5hbWVzLCBhc3QubmFtZSkpIHtcbiAgICAgIHZhciB0YXJnZXQgPSB0aGlzLl9hZGRSZWNvcmQoUmVjb3JkVHlwZS5Mb2NhbCwgYXN0Lm5hbWUsIGFzdC5uYW1lLCBbXSwgbnVsbCwgcmVjZWl2ZXIpO1xuICAgICAgcmV0dXJuIHRoaXMuX2FkZFJlY29yZChSZWNvcmRUeXBlLkludm9rZUNsb3N1cmUsIFwiY2xvc3VyZVwiLCBudWxsLCBhcmdzLCBudWxsLCB0YXJnZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fYWRkUmVjb3JkKFJlY29yZFR5cGUuSW52b2tlTWV0aG9kLCBhc3QubmFtZSwgYXN0LmZuLCBhcmdzLCBudWxsLCByZWNlaXZlcik7XG4gICAgfVxuICB9XG5cbiAgdmlzaXRTYWZlTWV0aG9kQ2FsbChhc3Q6IFNhZmVNZXRob2RDYWxsKTogbnVtYmVyIHtcbiAgICB2YXIgcmVjZWl2ZXIgPSBhc3QucmVjZWl2ZXIudmlzaXQodGhpcyk7XG4gICAgdmFyIGFyZ3MgPSB0aGlzLl92aXNpdEFsbChhc3QuYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuX2FkZFJlY29yZChSZWNvcmRUeXBlLlNhZmVNZXRob2RJbnZva2UsIGFzdC5uYW1lLCBhc3QuZm4sIGFyZ3MsIG51bGwsIHJlY2VpdmVyKTtcbiAgfVxuXG4gIHZpc2l0RnVuY3Rpb25DYWxsKGFzdDogRnVuY3Rpb25DYWxsKTogbnVtYmVyIHtcbiAgICB2YXIgdGFyZ2V0ID0gYXN0LnRhcmdldC52aXNpdCh0aGlzKTtcbiAgICB2YXIgYXJncyA9IHRoaXMuX3Zpc2l0QWxsKGFzdC5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy5fYWRkUmVjb3JkKFJlY29yZFR5cGUuSW52b2tlQ2xvc3VyZSwgXCJjbG9zdXJlXCIsIG51bGwsIGFyZ3MsIG51bGwsIHRhcmdldCk7XG4gIH1cblxuICB2aXNpdExpdGVyYWxBcnJheShhc3Q6IExpdGVyYWxBcnJheSk6IG51bWJlciB7XG4gICAgdmFyIHByaW1pdGl2ZU5hbWUgPSBgYXJyYXlGbiR7YXN0LmV4cHJlc3Npb25zLmxlbmd0aH1gO1xuICAgIHJldHVybiB0aGlzLl9hZGRSZWNvcmQoUmVjb3JkVHlwZS5Db2xsZWN0aW9uTGl0ZXJhbCwgcHJpbWl0aXZlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hcnJheUZuKGFzdC5leHByZXNzaW9ucy5sZW5ndGgpLCB0aGlzLl92aXNpdEFsbChhc3QuZXhwcmVzc2lvbnMpLCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7XG4gIH1cblxuICB2aXNpdExpdGVyYWxNYXAoYXN0OiBMaXRlcmFsTWFwKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkUmVjb3JkKFJlY29yZFR5cGUuQ29sbGVjdGlvbkxpdGVyYWwsIF9tYXBQcmltaXRpdmVOYW1lKGFzdC5rZXlzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZURldGVjdGlvblV0aWwubWFwRm4oYXN0LmtleXMpLCB0aGlzLl92aXNpdEFsbChhc3QudmFsdWVzKSwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDApO1xuICB9XG5cbiAgdmlzaXRCaW5hcnkoYXN0OiBCaW5hcnkpOiBudW1iZXIge1xuICAgIHZhciBsZWZ0ID0gYXN0LmxlZnQudmlzaXQodGhpcyk7XG4gICAgc3dpdGNoIChhc3Qub3BlcmF0aW9uKSB7XG4gICAgICBjYXNlICcmJic6XG4gICAgICAgIHZhciBicmFuY2hFbmQgPSBbbnVsbF07XG4gICAgICAgIHRoaXMuX2FkZFJlY29yZChSZWNvcmRUeXBlLlNraXBSZWNvcmRzSWZOb3QsIFwiU2tpcFJlY29yZHNJZk5vdFwiLCBudWxsLCBbXSwgYnJhbmNoRW5kLCBsZWZ0KTtcbiAgICAgICAgdmFyIHJpZ2h0ID0gYXN0LnJpZ2h0LnZpc2l0KHRoaXMpO1xuICAgICAgICBicmFuY2hFbmRbMF0gPSByaWdodDtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZFJlY29yZChSZWNvcmRUeXBlLlByaW1pdGl2ZU9wLCBcImNvbmRcIiwgQ2hhbmdlRGV0ZWN0aW9uVXRpbC5jb25kLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsZWZ0LCByaWdodCwgbGVmdF0sIG51bGwsIDApO1xuXG4gICAgICBjYXNlICd8fCc6XG4gICAgICAgIHZhciBicmFuY2hFbmQgPSBbbnVsbF07XG4gICAgICAgIHRoaXMuX2FkZFJlY29yZChSZWNvcmRUeXBlLlNraXBSZWNvcmRzSWYsIFwiU2tpcFJlY29yZHNJZlwiLCBudWxsLCBbXSwgYnJhbmNoRW5kLCBsZWZ0KTtcbiAgICAgICAgdmFyIHJpZ2h0ID0gYXN0LnJpZ2h0LnZpc2l0KHRoaXMpO1xuICAgICAgICBicmFuY2hFbmRbMF0gPSByaWdodDtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZFJlY29yZChSZWNvcmRUeXBlLlByaW1pdGl2ZU9wLCBcImNvbmRcIiwgQ2hhbmdlRGV0ZWN0aW9uVXRpbC5jb25kLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsZWZ0LCBsZWZ0LCByaWdodF0sIG51bGwsIDApO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB2YXIgcmlnaHQgPSBhc3QucmlnaHQudmlzaXQodGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRSZWNvcmQoUmVjb3JkVHlwZS5QcmltaXRpdmVPcCwgX29wZXJhdGlvblRvUHJpbWl0aXZlTmFtZShhc3Qub3BlcmF0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb3BlcmF0aW9uVG9GdW5jdGlvbihhc3Qub3BlcmF0aW9uKSwgW2xlZnQsIHJpZ2h0XSwgbnVsbCwgMCk7XG4gICAgfVxuICB9XG5cbiAgdmlzaXRQcmVmaXhOb3QoYXN0OiBQcmVmaXhOb3QpOiBudW1iZXIge1xuICAgIHZhciBleHAgPSBhc3QuZXhwcmVzc2lvbi52aXNpdCh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5fYWRkUmVjb3JkKFJlY29yZFR5cGUuUHJpbWl0aXZlT3AsIFwib3BlcmF0aW9uX25lZ2F0ZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlRGV0ZWN0aW9uVXRpbC5vcGVyYXRpb25fbmVnYXRlLCBbZXhwXSwgbnVsbCwgMCk7XG4gIH1cblxuICB2aXNpdENvbmRpdGlvbmFsKGFzdDogQ29uZGl0aW9uYWwpOiBudW1iZXIge1xuICAgIHZhciBjb25kaXRpb24gPSBhc3QuY29uZGl0aW9uLnZpc2l0KHRoaXMpO1xuICAgIHZhciBzdGFydE9mRmFsc2VCcmFuY2ggPSBbbnVsbF07XG4gICAgdmFyIGVuZE9mRmFsc2VCcmFuY2ggPSBbbnVsbF07XG4gICAgdGhpcy5fYWRkUmVjb3JkKFJlY29yZFR5cGUuU2tpcFJlY29yZHNJZk5vdCwgXCJTa2lwUmVjb3Jkc0lmTm90XCIsIG51bGwsIFtdLCBzdGFydE9mRmFsc2VCcmFuY2gsXG4gICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbik7XG4gICAgdmFyIHdoZW5UcnVlID0gYXN0LnRydWVFeHAudmlzaXQodGhpcyk7XG4gICAgdmFyIHNraXAgPVxuICAgICAgICB0aGlzLl9hZGRSZWNvcmQoUmVjb3JkVHlwZS5Ta2lwUmVjb3JkcywgXCJTa2lwUmVjb3Jkc1wiLCBudWxsLCBbXSwgZW5kT2ZGYWxzZUJyYW5jaCwgMCk7XG4gICAgdmFyIHdoZW5GYWxzZSA9IGFzdC5mYWxzZUV4cC52aXNpdCh0aGlzKTtcbiAgICBzdGFydE9mRmFsc2VCcmFuY2hbMF0gPSBza2lwO1xuICAgIGVuZE9mRmFsc2VCcmFuY2hbMF0gPSB3aGVuRmFsc2U7XG5cbiAgICByZXR1cm4gdGhpcy5fYWRkUmVjb3JkKFJlY29yZFR5cGUuUHJpbWl0aXZlT3AsIFwiY29uZFwiLCBDaGFuZ2VEZXRlY3Rpb25VdGlsLmNvbmQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbY29uZGl0aW9uLCB3aGVuVHJ1ZSwgd2hlbkZhbHNlXSwgbnVsbCwgMCk7XG4gIH1cblxuICB2aXNpdFBpcGUoYXN0OiBCaW5kaW5nUGlwZSk6IG51bWJlciB7XG4gICAgdmFyIHZhbHVlID0gYXN0LmV4cC52aXNpdCh0aGlzKTtcbiAgICB2YXIgYXJncyA9IHRoaXMuX3Zpc2l0QWxsKGFzdC5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy5fYWRkUmVjb3JkKFJlY29yZFR5cGUuUGlwZSwgYXN0Lm5hbWUsIGFzdC5uYW1lLCBhcmdzLCBudWxsLCB2YWx1ZSk7XG4gIH1cblxuICB2aXNpdEtleWVkUmVhZChhc3Q6IEtleWVkUmVhZCk6IG51bWJlciB7XG4gICAgdmFyIG9iaiA9IGFzdC5vYmoudmlzaXQodGhpcyk7XG4gICAgdmFyIGtleSA9IGFzdC5rZXkudmlzaXQodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMuX2FkZFJlY29yZChSZWNvcmRUeXBlLktleWVkUmVhZCwgXCJrZXllZEFjY2Vzc1wiLCBDaGFuZ2VEZXRlY3Rpb25VdGlsLmtleWVkQWNjZXNzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgW2tleV0sIG51bGwsIG9iaik7XG4gIH1cblxuICB2aXNpdENoYWluKGFzdDogQ2hhaW4pOiBudW1iZXIge1xuICAgIHZhciBhcmdzID0gYXN0LmV4cHJlc3Npb25zLm1hcChlID0+IGUudmlzaXQodGhpcykpO1xuICAgIHJldHVybiB0aGlzLl9hZGRSZWNvcmQoUmVjb3JkVHlwZS5DaGFpbiwgXCJjaGFpblwiLCBudWxsLCBhcmdzLCBudWxsLCAwKTtcbiAgfVxuXG4gIHZpc2l0UXVvdGUoYXN0OiBRdW90ZSk6IHZvaWQge1xuICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKFxuICAgICAgICBgQ2F1Z2h0IHVuaW50ZXJwcmV0ZWQgZXhwcmVzc2lvbiBhdCAke2FzdC5sb2NhdGlvbn06ICR7YXN0LnVuaW50ZXJwcmV0ZWRFeHByZXNzaW9ufS4gYCArXG4gICAgICAgIGBFeHByZXNzaW9uIHByZWZpeCAke2FzdC5wcmVmaXh9IGRpZCBub3QgbWF0Y2ggYSB0ZW1wbGF0ZSB0cmFuc2Zvcm1lciB0byBpbnRlcnByZXQgdGhlIGV4cHJlc3Npb24uYCk7XG4gIH1cblxuICBwcml2YXRlIF92aXNpdEFsbChhc3RzOiBhbnlbXSkge1xuICAgIHZhciByZXMgPSBMaXN0V3JhcHBlci5jcmVhdGVGaXhlZFNpemUoYXN0cy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXN0cy5sZW5ndGg7ICsraSkge1xuICAgICAgcmVzW2ldID0gYXN0c1tpXS52aXNpdCh0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgYFByb3RvUmVjb3JkYCBhbmQgcmV0dXJucyBpdHMgc2VsZkluZGV4LlxuICAgKi9cbiAgcHJpdmF0ZSBfYWRkUmVjb3JkKHR5cGUsIG5hbWUsIGZ1bmNPclZhbHVlLCBhcmdzLCBmaXhlZEFyZ3MsIGNvbnRleHQpOiBudW1iZXIge1xuICAgIHZhciBzZWxmSW5kZXggPSB0aGlzLl9yZWNvcmRzLmxlbmd0aCArIDE7XG4gICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBEaXJlY3RpdmVJbmRleCkge1xuICAgICAgdGhpcy5fcmVjb3Jkcy5wdXNoKG5ldyBQcm90b1JlY29yZCh0eXBlLCBuYW1lLCBmdW5jT3JWYWx1ZSwgYXJncywgZml4ZWRBcmdzLCAtMSwgY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZkluZGV4LCB0aGlzLl9iaW5kaW5nUmVjb3JkLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYmluZGluZ0luZGV4KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3JlY29yZHMucHVzaChuZXcgUHJvdG9SZWNvcmQodHlwZSwgbmFtZSwgZnVuY09yVmFsdWUsIGFyZ3MsIGZpeGVkQXJncywgY29udGV4dCwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZkluZGV4LCB0aGlzLl9iaW5kaW5nUmVjb3JkLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYmluZGluZ0luZGV4KSk7XG4gICAgfVxuICAgIHJldHVybiBzZWxmSW5kZXg7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBfYXJyYXlGbihsZW5ndGg6IG51bWJlcik6IEZ1bmN0aW9uIHtcbiAgc3dpdGNoIChsZW5ndGgpIHtcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4gQ2hhbmdlRGV0ZWN0aW9uVXRpbC5hcnJheUZuMDtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gQ2hhbmdlRGV0ZWN0aW9uVXRpbC5hcnJheUZuMTtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gQ2hhbmdlRGV0ZWN0aW9uVXRpbC5hcnJheUZuMjtcbiAgICBjYXNlIDM6XG4gICAgICByZXR1cm4gQ2hhbmdlRGV0ZWN0aW9uVXRpbC5hcnJheUZuMztcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gQ2hhbmdlRGV0ZWN0aW9uVXRpbC5hcnJheUZuNDtcbiAgICBjYXNlIDU6XG4gICAgICByZXR1cm4gQ2hhbmdlRGV0ZWN0aW9uVXRpbC5hcnJheUZuNTtcbiAgICBjYXNlIDY6XG4gICAgICByZXR1cm4gQ2hhbmdlRGV0ZWN0aW9uVXRpbC5hcnJheUZuNjtcbiAgICBjYXNlIDc6XG4gICAgICByZXR1cm4gQ2hhbmdlRGV0ZWN0aW9uVXRpbC5hcnJheUZuNztcbiAgICBjYXNlIDg6XG4gICAgICByZXR1cm4gQ2hhbmdlRGV0ZWN0aW9uVXRpbC5hcnJheUZuODtcbiAgICBjYXNlIDk6XG4gICAgICByZXR1cm4gQ2hhbmdlRGV0ZWN0aW9uVXRpbC5hcnJheUZuOTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYERvZXMgbm90IHN1cHBvcnQgbGl0ZXJhbCBtYXBzIHdpdGggbW9yZSB0aGFuIDkgZWxlbWVudHNgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfbWFwUHJpbWl0aXZlTmFtZShrZXlzOiBhbnlbXSkge1xuICB2YXIgc3RyaW5naWZpZWRLZXlzID0ga2V5cy5tYXAoayA9PiBpc1N0cmluZyhrKSA/IGBcIiR7a31cImAgOiBgJHtrfWApLmpvaW4oJywgJyk7XG4gIHJldHVybiBgbWFwRm4oWyR7c3RyaW5naWZpZWRLZXlzfV0pYDtcbn1cblxuZnVuY3Rpb24gX29wZXJhdGlvblRvUHJpbWl0aXZlTmFtZShvcGVyYXRpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIHN3aXRjaCAob3BlcmF0aW9uKSB7XG4gICAgY2FzZSAnKyc6XG4gICAgICByZXR1cm4gXCJvcGVyYXRpb25fYWRkXCI7XG4gICAgY2FzZSAnLSc6XG4gICAgICByZXR1cm4gXCJvcGVyYXRpb25fc3VidHJhY3RcIjtcbiAgICBjYXNlICcqJzpcbiAgICAgIHJldHVybiBcIm9wZXJhdGlvbl9tdWx0aXBseVwiO1xuICAgIGNhc2UgJy8nOlxuICAgICAgcmV0dXJuIFwib3BlcmF0aW9uX2RpdmlkZVwiO1xuICAgIGNhc2UgJyUnOlxuICAgICAgcmV0dXJuIFwib3BlcmF0aW9uX3JlbWFpbmRlclwiO1xuICAgIGNhc2UgJz09JzpcbiAgICAgIHJldHVybiBcIm9wZXJhdGlvbl9lcXVhbHNcIjtcbiAgICBjYXNlICchPSc6XG4gICAgICByZXR1cm4gXCJvcGVyYXRpb25fbm90X2VxdWFsc1wiO1xuICAgIGNhc2UgJz09PSc6XG4gICAgICByZXR1cm4gXCJvcGVyYXRpb25faWRlbnRpY2FsXCI7XG4gICAgY2FzZSAnIT09JzpcbiAgICAgIHJldHVybiBcIm9wZXJhdGlvbl9ub3RfaWRlbnRpY2FsXCI7XG4gICAgY2FzZSAnPCc6XG4gICAgICByZXR1cm4gXCJvcGVyYXRpb25fbGVzc190aGVuXCI7XG4gICAgY2FzZSAnPic6XG4gICAgICByZXR1cm4gXCJvcGVyYXRpb25fZ3JlYXRlcl90aGVuXCI7XG4gICAgY2FzZSAnPD0nOlxuICAgICAgcmV0dXJuIFwib3BlcmF0aW9uX2xlc3Nfb3JfZXF1YWxzX3RoZW5cIjtcbiAgICBjYXNlICc+PSc6XG4gICAgICByZXR1cm4gXCJvcGVyYXRpb25fZ3JlYXRlcl9vcl9lcXVhbHNfdGhlblwiO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgVW5zdXBwb3J0ZWQgb3BlcmF0aW9uICR7b3BlcmF0aW9ufWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9vcGVyYXRpb25Ub0Z1bmN0aW9uKG9wZXJhdGlvbjogc3RyaW5nKTogRnVuY3Rpb24ge1xuICBzd2l0Y2ggKG9wZXJhdGlvbikge1xuICAgIGNhc2UgJysnOlxuICAgICAgcmV0dXJuIENoYW5nZURldGVjdGlvblV0aWwub3BlcmF0aW9uX2FkZDtcbiAgICBjYXNlICctJzpcbiAgICAgIHJldHVybiBDaGFuZ2VEZXRlY3Rpb25VdGlsLm9wZXJhdGlvbl9zdWJ0cmFjdDtcbiAgICBjYXNlICcqJzpcbiAgICAgIHJldHVybiBDaGFuZ2VEZXRlY3Rpb25VdGlsLm9wZXJhdGlvbl9tdWx0aXBseTtcbiAgICBjYXNlICcvJzpcbiAgICAgIHJldHVybiBDaGFuZ2VEZXRlY3Rpb25VdGlsLm9wZXJhdGlvbl9kaXZpZGU7XG4gICAgY2FzZSAnJSc6XG4gICAgICByZXR1cm4gQ2hhbmdlRGV0ZWN0aW9uVXRpbC5vcGVyYXRpb25fcmVtYWluZGVyO1xuICAgIGNhc2UgJz09JzpcbiAgICAgIHJldHVybiBDaGFuZ2VEZXRlY3Rpb25VdGlsLm9wZXJhdGlvbl9lcXVhbHM7XG4gICAgY2FzZSAnIT0nOlxuICAgICAgcmV0dXJuIENoYW5nZURldGVjdGlvblV0aWwub3BlcmF0aW9uX25vdF9lcXVhbHM7XG4gICAgY2FzZSAnPT09JzpcbiAgICAgIHJldHVybiBDaGFuZ2VEZXRlY3Rpb25VdGlsLm9wZXJhdGlvbl9pZGVudGljYWw7XG4gICAgY2FzZSAnIT09JzpcbiAgICAgIHJldHVybiBDaGFuZ2VEZXRlY3Rpb25VdGlsLm9wZXJhdGlvbl9ub3RfaWRlbnRpY2FsO1xuICAgIGNhc2UgJzwnOlxuICAgICAgcmV0dXJuIENoYW5nZURldGVjdGlvblV0aWwub3BlcmF0aW9uX2xlc3NfdGhlbjtcbiAgICBjYXNlICc+JzpcbiAgICAgIHJldHVybiBDaGFuZ2VEZXRlY3Rpb25VdGlsLm9wZXJhdGlvbl9ncmVhdGVyX3RoZW47XG4gICAgY2FzZSAnPD0nOlxuICAgICAgcmV0dXJuIENoYW5nZURldGVjdGlvblV0aWwub3BlcmF0aW9uX2xlc3Nfb3JfZXF1YWxzX3RoZW47XG4gICAgY2FzZSAnPj0nOlxuICAgICAgcmV0dXJuIENoYW5nZURldGVjdGlvblV0aWwub3BlcmF0aW9uX2dyZWF0ZXJfb3JfZXF1YWxzX3RoZW47XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBVbnN1cHBvcnRlZCBvcGVyYXRpb24gJHtvcGVyYXRpb259YCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcyh2KTogc3RyaW5nIHtcbiAgcmV0dXJuIGlzUHJlc2VudCh2KSA/IGAke3Z9YCA6ICcnO1xufVxuXG5mdW5jdGlvbiBfaW50ZXJwb2xhdGlvbkZuKHN0cmluZ3M6IGFueVtdKSB7XG4gIHZhciBsZW5ndGggPSBzdHJpbmdzLmxlbmd0aDtcbiAgdmFyIGMwID0gbGVuZ3RoID4gMCA/IHN0cmluZ3NbMF0gOiBudWxsO1xuICB2YXIgYzEgPSBsZW5ndGggPiAxID8gc3RyaW5nc1sxXSA6IG51bGw7XG4gIHZhciBjMiA9IGxlbmd0aCA+IDIgPyBzdHJpbmdzWzJdIDogbnVsbDtcbiAgdmFyIGMzID0gbGVuZ3RoID4gMyA/IHN0cmluZ3NbM10gOiBudWxsO1xuICB2YXIgYzQgPSBsZW5ndGggPiA0ID8gc3RyaW5nc1s0XSA6IG51bGw7XG4gIHZhciBjNSA9IGxlbmd0aCA+IDUgPyBzdHJpbmdzWzVdIDogbnVsbDtcbiAgdmFyIGM2ID0gbGVuZ3RoID4gNiA/IHN0cmluZ3NbNl0gOiBudWxsO1xuICB2YXIgYzcgPSBsZW5ndGggPiA3ID8gc3RyaW5nc1s3XSA6IG51bGw7XG4gIHZhciBjOCA9IGxlbmd0aCA+IDggPyBzdHJpbmdzWzhdIDogbnVsbDtcbiAgdmFyIGM5ID0gbGVuZ3RoID4gOSA/IHN0cmluZ3NbOV0gOiBudWxsO1xuICBzd2l0Y2ggKGxlbmd0aCAtIDEpIHtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gKGExKSA9PiBjMCArIHMoYTEpICsgYzE7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIChhMSwgYTIpID0+IGMwICsgcyhhMSkgKyBjMSArIHMoYTIpICsgYzI7XG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuIChhMSwgYTIsIGEzKSA9PiBjMCArIHMoYTEpICsgYzEgKyBzKGEyKSArIGMyICsgcyhhMykgKyBjMztcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gKGExLCBhMiwgYTMsIGE0KSA9PiBjMCArIHMoYTEpICsgYzEgKyBzKGEyKSArIGMyICsgcyhhMykgKyBjMyArIHMoYTQpICsgYzQ7XG4gICAgY2FzZSA1OlxuICAgICAgcmV0dXJuIChhMSwgYTIsIGEzLCBhNCwgYTUpID0+XG4gICAgICAgICAgICAgICAgIGMwICsgcyhhMSkgKyBjMSArIHMoYTIpICsgYzIgKyBzKGEzKSArIGMzICsgcyhhNCkgKyBjNCArIHMoYTUpICsgYzU7XG4gICAgY2FzZSA2OlxuICAgICAgcmV0dXJuIChhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSA9PlxuICAgICAgICAgICAgICAgICBjMCArIHMoYTEpICsgYzEgKyBzKGEyKSArIGMyICsgcyhhMykgKyBjMyArIHMoYTQpICsgYzQgKyBzKGE1KSArIGM1ICsgcyhhNikgKyBjNjtcbiAgICBjYXNlIDc6XG4gICAgICByZXR1cm4gKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KSA9PiBjMCArIHMoYTEpICsgYzEgKyBzKGEyKSArIGMyICsgcyhhMykgKyBjMyArIHMoYTQpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGM0ICsgcyhhNSkgKyBjNSArIHMoYTYpICsgYzYgKyBzKGE3KSArIGM3O1xuICAgIGNhc2UgODpcbiAgICAgIHJldHVybiAoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KSA9PiBjMCArIHMoYTEpICsgYzEgKyBzKGEyKSArIGMyICsgcyhhMykgKyBjMyArIHMoYTQpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjNCArIHMoYTUpICsgYzUgKyBzKGE2KSArIGM2ICsgcyhhNykgKyBjNyArIHMoYTgpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjODtcbiAgICBjYXNlIDk6XG4gICAgICByZXR1cm4gKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpID0+IGMwICsgcyhhMSkgKyBjMSArIHMoYTIpICsgYzIgKyBzKGEzKSArIGMzICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyhhNCkgKyBjNCArIHMoYTUpICsgYzUgKyBzKGE2KSArIGM2ICsgcyhhNykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjNyArIHMoYTgpICsgYzggKyBzKGE5KSArIGM5O1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgRG9lcyBub3Qgc3VwcG9ydCBtb3JlIHRoYW4gOSBleHByZXNzaW9uc2ApO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL3Byb3RvX2NoYW5nZV9kZXRlY3Rvci50c1xuICoqLyIsImltcG9ydCB7XG4gIENPTlNUX0VYUFIsXG4gIGlzUHJlc2VudCxcbiAgaXNCbGFuayxcbiAgVHlwZSxcbiAgU3RyaW5nV3JhcHBlcixcbiAgbG9vc2VJZGVudGljYWxcbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7TGlzdFdyYXBwZXIsIE1hcFdyYXBwZXIsIFN0cmluZ01hcFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge1Byb3RvUmVjb3JkfSBmcm9tICcuL3Byb3RvX3JlY29yZCc7XG5pbXBvcnQge0NoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBpc0RlZmF1bHRDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneX0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHtpbXBsZW1lbnRzT25EZXN0cm95fSBmcm9tICcuL3BpcGVfbGlmZWN5Y2xlX3JlZmxlY3Rvcic7XG5pbXBvcnQge0JpbmRpbmdUYXJnZXR9IGZyb20gJy4vYmluZGluZ19yZWNvcmQnO1xuaW1wb3J0IHtEaXJlY3RpdmVJbmRleH0gZnJvbSAnLi9kaXJlY3RpdmVfcmVjb3JkJztcbmltcG9ydCB7U2VsZWN0ZWRQaXBlfSBmcm9tICcuL3BpcGVzJztcblxuXG4vKipcbiAqIEluZGljYXRlcyB0aGF0IHRoZSByZXN1bHQgb2YgYSB7QGxpbmsgUGlwZU1ldGFkYXRhfSB0cmFuc2Zvcm1hdGlvbiBoYXMgY2hhbmdlZCBldmVuIHRob3VnaCB0aGVcbiAqIHJlZmVyZW5jZVxuICogaGFzIG5vdCBjaGFuZ2VkLlxuICpcbiAqIFRoZSB3cmFwcGVkIHZhbHVlIHdpbGwgYmUgdW53cmFwcGVkIGJ5IGNoYW5nZSBkZXRlY3Rpb24sIGFuZCB0aGUgdW53cmFwcGVkIHZhbHVlIHdpbGwgYmUgc3RvcmVkLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBgXG4gKiBpZiAodGhpcy5fbGF0ZXN0VmFsdWUgPT09IHRoaXMuX2xhdGVzdFJldHVybmVkVmFsdWUpIHtcbiAqICAgIHJldHVybiB0aGlzLl9sYXRlc3RSZXR1cm5lZFZhbHVlO1xuICogIH0gZWxzZSB7XG4gKiAgICB0aGlzLl9sYXRlc3RSZXR1cm5lZFZhbHVlID0gdGhpcy5fbGF0ZXN0VmFsdWU7XG4gKiAgICByZXR1cm4gV3JhcHBlZFZhbHVlLndyYXAodGhpcy5fbGF0ZXN0VmFsdWUpOyAvLyB0aGlzIHdpbGwgZm9yY2UgdXBkYXRlXG4gKiAgfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBXcmFwcGVkVmFsdWUge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgd3JhcHBlZDogYW55KSB7fVxuXG4gIHN0YXRpYyB3cmFwKHZhbHVlOiBhbnkpOiBXcmFwcGVkVmFsdWUge1xuICAgIHZhciB3ID0gX3dyYXBwZWRWYWx1ZXNbX3dyYXBwZWRJbmRleCsrICUgNV07XG4gICAgdy53cmFwcGVkID0gdmFsdWU7XG4gICAgcmV0dXJuIHc7XG4gIH1cbn1cblxudmFyIF93cmFwcGVkVmFsdWVzID0gW1xuICBuZXcgV3JhcHBlZFZhbHVlKG51bGwpLFxuICBuZXcgV3JhcHBlZFZhbHVlKG51bGwpLFxuICBuZXcgV3JhcHBlZFZhbHVlKG51bGwpLFxuICBuZXcgV3JhcHBlZFZhbHVlKG51bGwpLFxuICBuZXcgV3JhcHBlZFZhbHVlKG51bGwpXG5dO1xuXG52YXIgX3dyYXBwZWRJbmRleCA9IDA7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGJhc2ljIGNoYW5nZSBmcm9tIGEgcHJldmlvdXMgdG8gYSBuZXcgdmFsdWUuXG4gKi9cbmV4cG9ydCBjbGFzcyBTaW1wbGVDaGFuZ2Uge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcHJldmlvdXNWYWx1ZTogYW55LCBwdWJsaWMgY3VycmVudFZhbHVlOiBhbnkpIHt9XG5cbiAgLyoqXG4gICAqIENoZWNrIHdoZXRoZXIgdGhlIG5ldyB2YWx1ZSBpcyB0aGUgZmlyc3QgdmFsdWUgYXNzaWduZWQuXG4gICAqL1xuICBpc0ZpcnN0Q2hhbmdlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5wcmV2aW91c1ZhbHVlID09PSBDaGFuZ2VEZXRlY3Rpb25VdGlsLnVuaW5pdGlhbGl6ZWQ7IH1cbn1cblxudmFyIF9zaW1wbGVDaGFuZ2VzSW5kZXggPSAwO1xudmFyIF9zaW1wbGVDaGFuZ2VzID0gW1xuICBuZXcgU2ltcGxlQ2hhbmdlKG51bGwsIG51bGwpLFxuICBuZXcgU2ltcGxlQ2hhbmdlKG51bGwsIG51bGwpLFxuICBuZXcgU2ltcGxlQ2hhbmdlKG51bGwsIG51bGwpLFxuICBuZXcgU2ltcGxlQ2hhbmdlKG51bGwsIG51bGwpLFxuICBuZXcgU2ltcGxlQ2hhbmdlKG51bGwsIG51bGwpLFxuICBuZXcgU2ltcGxlQ2hhbmdlKG51bGwsIG51bGwpLFxuICBuZXcgU2ltcGxlQ2hhbmdlKG51bGwsIG51bGwpLFxuICBuZXcgU2ltcGxlQ2hhbmdlKG51bGwsIG51bGwpLFxuICBuZXcgU2ltcGxlQ2hhbmdlKG51bGwsIG51bGwpLFxuICBuZXcgU2ltcGxlQ2hhbmdlKG51bGwsIG51bGwpLFxuICBuZXcgU2ltcGxlQ2hhbmdlKG51bGwsIG51bGwpLFxuICBuZXcgU2ltcGxlQ2hhbmdlKG51bGwsIG51bGwpLFxuICBuZXcgU2ltcGxlQ2hhbmdlKG51bGwsIG51bGwpLFxuICBuZXcgU2ltcGxlQ2hhbmdlKG51bGwsIG51bGwpLFxuICBuZXcgU2ltcGxlQ2hhbmdlKG51bGwsIG51bGwpLFxuICBuZXcgU2ltcGxlQ2hhbmdlKG51bGwsIG51bGwpLFxuICBuZXcgU2ltcGxlQ2hhbmdlKG51bGwsIG51bGwpLFxuICBuZXcgU2ltcGxlQ2hhbmdlKG51bGwsIG51bGwpLFxuICBuZXcgU2ltcGxlQ2hhbmdlKG51bGwsIG51bGwpLFxuICBuZXcgU2ltcGxlQ2hhbmdlKG51bGwsIG51bGwpXG5dO1xuXG5mdW5jdGlvbiBfc2ltcGxlQ2hhbmdlKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRWYWx1ZSk6IFNpbXBsZUNoYW5nZSB7XG4gIHZhciBpbmRleCA9IF9zaW1wbGVDaGFuZ2VzSW5kZXgrKyAlIDIwO1xuICB2YXIgcyA9IF9zaW1wbGVDaGFuZ2VzW2luZGV4XTtcbiAgcy5wcmV2aW91c1ZhbHVlID0gcHJldmlvdXNWYWx1ZTtcbiAgcy5jdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWU7XG4gIHJldHVybiBzO1xufVxuXG4vKiB0c2xpbnQ6ZGlzYWJsZTpyZXF1aXJlUGFyYW1ldGVyVHlwZSAqL1xuZXhwb3J0IGNsYXNzIENoYW5nZURldGVjdGlvblV0aWwge1xuICBzdGF0aWMgdW5pbml0aWFsaXplZDogT2JqZWN0ID0gQ09OU1RfRVhQUjxPYmplY3Q+KG5ldyBPYmplY3QoKSk7XG5cbiAgc3RhdGljIGFycmF5Rm4wKCk6IGFueVtdIHsgcmV0dXJuIFtdOyB9XG4gIHN0YXRpYyBhcnJheUZuMShhMSk6IGFueVtdIHsgcmV0dXJuIFthMV07IH1cbiAgc3RhdGljIGFycmF5Rm4yKGExLCBhMik6IGFueVtdIHsgcmV0dXJuIFthMSwgYTJdOyB9XG4gIHN0YXRpYyBhcnJheUZuMyhhMSwgYTIsIGEzKTogYW55W10geyByZXR1cm4gW2ExLCBhMiwgYTNdOyB9XG4gIHN0YXRpYyBhcnJheUZuNChhMSwgYTIsIGEzLCBhNCk6IGFueVtdIHsgcmV0dXJuIFthMSwgYTIsIGEzLCBhNF07IH1cbiAgc3RhdGljIGFycmF5Rm41KGExLCBhMiwgYTMsIGE0LCBhNSk6IGFueVtdIHsgcmV0dXJuIFthMSwgYTIsIGEzLCBhNCwgYTVdOyB9XG4gIHN0YXRpYyBhcnJheUZuNihhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KTogYW55W10geyByZXR1cm4gW2ExLCBhMiwgYTMsIGE0LCBhNSwgYTZdOyB9XG4gIHN0YXRpYyBhcnJheUZuNyhhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNyk6IGFueVtdIHsgcmV0dXJuIFthMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhN107IH1cbiAgc3RhdGljIGFycmF5Rm44KGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCk6IGFueVtdIHtcbiAgICByZXR1cm4gW2ExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOF07XG4gIH1cbiAgc3RhdGljIGFycmF5Rm45KGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpOiBhbnlbXSB7XG4gICAgcmV0dXJuIFthMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5XTtcbiAgfVxuXG4gIHN0YXRpYyBvcGVyYXRpb25fbmVnYXRlKHZhbHVlKTogYW55IHsgcmV0dXJuICF2YWx1ZTsgfVxuICBzdGF0aWMgb3BlcmF0aW9uX2FkZChsZWZ0LCByaWdodCk6IGFueSB7IHJldHVybiBsZWZ0ICsgcmlnaHQ7IH1cbiAgc3RhdGljIG9wZXJhdGlvbl9zdWJ0cmFjdChsZWZ0LCByaWdodCk6IGFueSB7IHJldHVybiBsZWZ0IC0gcmlnaHQ7IH1cbiAgc3RhdGljIG9wZXJhdGlvbl9tdWx0aXBseShsZWZ0LCByaWdodCk6IGFueSB7IHJldHVybiBsZWZ0ICogcmlnaHQ7IH1cbiAgc3RhdGljIG9wZXJhdGlvbl9kaXZpZGUobGVmdCwgcmlnaHQpOiBhbnkgeyByZXR1cm4gbGVmdCAvIHJpZ2h0OyB9XG4gIHN0YXRpYyBvcGVyYXRpb25fcmVtYWluZGVyKGxlZnQsIHJpZ2h0KTogYW55IHsgcmV0dXJuIGxlZnQgJSByaWdodDsgfVxuICBzdGF0aWMgb3BlcmF0aW9uX2VxdWFscyhsZWZ0LCByaWdodCk6IGFueSB7IHJldHVybiBsZWZ0ID09IHJpZ2h0OyB9XG4gIHN0YXRpYyBvcGVyYXRpb25fbm90X2VxdWFscyhsZWZ0LCByaWdodCk6IGFueSB7IHJldHVybiBsZWZ0ICE9IHJpZ2h0OyB9XG4gIHN0YXRpYyBvcGVyYXRpb25faWRlbnRpY2FsKGxlZnQsIHJpZ2h0KTogYW55IHsgcmV0dXJuIGxlZnQgPT09IHJpZ2h0OyB9XG4gIHN0YXRpYyBvcGVyYXRpb25fbm90X2lkZW50aWNhbChsZWZ0LCByaWdodCk6IGFueSB7IHJldHVybiBsZWZ0ICE9PSByaWdodDsgfVxuICBzdGF0aWMgb3BlcmF0aW9uX2xlc3NfdGhlbihsZWZ0LCByaWdodCk6IGFueSB7IHJldHVybiBsZWZ0IDwgcmlnaHQ7IH1cbiAgc3RhdGljIG9wZXJhdGlvbl9ncmVhdGVyX3RoZW4obGVmdCwgcmlnaHQpOiBhbnkgeyByZXR1cm4gbGVmdCA+IHJpZ2h0OyB9XG4gIHN0YXRpYyBvcGVyYXRpb25fbGVzc19vcl9lcXVhbHNfdGhlbihsZWZ0LCByaWdodCk6IGFueSB7IHJldHVybiBsZWZ0IDw9IHJpZ2h0OyB9XG4gIHN0YXRpYyBvcGVyYXRpb25fZ3JlYXRlcl9vcl9lcXVhbHNfdGhlbihsZWZ0LCByaWdodCk6IGFueSB7IHJldHVybiBsZWZ0ID49IHJpZ2h0OyB9XG4gIHN0YXRpYyBjb25kKGNvbmQsIHRydWVWYWwsIGZhbHNlVmFsKTogYW55IHsgcmV0dXJuIGNvbmQgPyB0cnVlVmFsIDogZmFsc2VWYWw7IH1cblxuICBzdGF0aWMgbWFwRm4oa2V5czogYW55W10pOiBhbnkge1xuICAgIGZ1bmN0aW9uIGJ1aWxkTWFwKHZhbHVlcyk6IHtbazogLyphbnkqLyBzdHJpbmddOiBhbnl9IHtcbiAgICAgIHZhciByZXMgPSBTdHJpbmdNYXBXcmFwcGVyLmNyZWF0ZSgpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIFN0cmluZ01hcFdyYXBwZXIuc2V0KHJlcywga2V5c1tpXSwgdmFsdWVzW2ldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgc3dpdGNoIChrZXlzLmxlbmd0aCkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICByZXR1cm4gKCkgPT4gW107XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHJldHVybiAoYTEpID0+IGJ1aWxkTWFwKFthMV0pO1xuICAgICAgY2FzZSAyOlxuICAgICAgICByZXR1cm4gKGExLCBhMikgPT4gYnVpbGRNYXAoW2ExLCBhMl0pO1xuICAgICAgY2FzZSAzOlxuICAgICAgICByZXR1cm4gKGExLCBhMiwgYTMpID0+IGJ1aWxkTWFwKFthMSwgYTIsIGEzXSk7XG4gICAgICBjYXNlIDQ6XG4gICAgICAgIHJldHVybiAoYTEsIGEyLCBhMywgYTQpID0+IGJ1aWxkTWFwKFthMSwgYTIsIGEzLCBhNF0pO1xuICAgICAgY2FzZSA1OlxuICAgICAgICByZXR1cm4gKGExLCBhMiwgYTMsIGE0LCBhNSkgPT4gYnVpbGRNYXAoW2ExLCBhMiwgYTMsIGE0LCBhNV0pO1xuICAgICAgY2FzZSA2OlxuICAgICAgICByZXR1cm4gKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpID0+IGJ1aWxkTWFwKFthMSwgYTIsIGEzLCBhNCwgYTUsIGE2XSk7XG4gICAgICBjYXNlIDc6XG4gICAgICAgIHJldHVybiAoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpID0+IGJ1aWxkTWFwKFthMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhN10pO1xuICAgICAgY2FzZSA4OlxuICAgICAgICByZXR1cm4gKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCkgPT4gYnVpbGRNYXAoW2ExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOF0pO1xuICAgICAgY2FzZSA5OlxuICAgICAgICByZXR1cm4gKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpID0+XG4gICAgICAgICAgICAgICAgICAgYnVpbGRNYXAoW2ExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTldKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBEb2VzIG5vdCBzdXBwb3J0IGxpdGVyYWwgbWFwcyB3aXRoIG1vcmUgdGhhbiA5IGVsZW1lbnRzYCk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGtleWVkQWNjZXNzKG9iaiwgYXJncyk6IGFueSB7IHJldHVybiBvYmpbYXJnc1swXV07IH1cblxuICBzdGF0aWMgdW53cmFwVmFsdWUodmFsdWU6IGFueSk6IGFueSB7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgV3JhcHBlZFZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUud3JhcHBlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBjaGFuZ2VEZXRlY3Rpb25Nb2RlKHN0cmF0ZWd5OiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSk6IENoYW5nZURldGVjdGlvblN0cmF0ZWd5IHtcbiAgICByZXR1cm4gaXNEZWZhdWx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3koc3RyYXRlZ3kpID8gQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuQ2hlY2tBbHdheXMgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5DaGVja09uY2U7XG4gIH1cblxuICBzdGF0aWMgc2ltcGxlQ2hhbmdlKHByZXZpb3VzVmFsdWU6IGFueSwgY3VycmVudFZhbHVlOiBhbnkpOiBTaW1wbGVDaGFuZ2Uge1xuICAgIHJldHVybiBfc2ltcGxlQ2hhbmdlKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRWYWx1ZSk7XG4gIH1cblxuICBzdGF0aWMgaXNWYWx1ZUJsYW5rKHZhbHVlOiBhbnkpOiBib29sZWFuIHsgcmV0dXJuIGlzQmxhbmsodmFsdWUpOyB9XG5cbiAgc3RhdGljIHModmFsdWU6IGFueSk6IHN0cmluZyB7IHJldHVybiBpc1ByZXNlbnQodmFsdWUpID8gYCR7dmFsdWV9YCA6ICcnOyB9XG5cbiAgc3RhdGljIHByb3RvQnlJbmRleChwcm90b3M6IFByb3RvUmVjb3JkW10sIHNlbGZJbmRleDogbnVtYmVyKTogUHJvdG9SZWNvcmQge1xuICAgIHJldHVybiBzZWxmSW5kZXggPCAxID9cbiAgICAgICAgICAgICAgIG51bGwgOlxuICAgICAgICAgICAgICAgcHJvdG9zW3NlbGZJbmRleCAtIDFdOyAgLy8gc2VsZiBpbmRleCBpcyBzaGlmdGVkIGJ5IG9uZSBiZWNhdXNlIG9mIGNvbnRleHRcbiAgfVxuXG4gIHN0YXRpYyBjYWxsUGlwZU9uRGVzdHJveShzZWxlY3RlZFBpcGU6IFNlbGVjdGVkUGlwZSk6IHZvaWQge1xuICAgIGlmIChpbXBsZW1lbnRzT25EZXN0cm95KHNlbGVjdGVkUGlwZS5waXBlKSkge1xuICAgICAgKDxhbnk+c2VsZWN0ZWRQaXBlLnBpcGUpLm5nT25EZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGJpbmRpbmdUYXJnZXQobW9kZTogc3RyaW5nLCBlbGVtZW50SW5kZXg6IG51bWJlciwgbmFtZTogc3RyaW5nLCB1bml0OiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgIGRlYnVnOiBzdHJpbmcpOiBCaW5kaW5nVGFyZ2V0IHtcbiAgICByZXR1cm4gbmV3IEJpbmRpbmdUYXJnZXQobW9kZSwgZWxlbWVudEluZGV4LCBuYW1lLCB1bml0LCBkZWJ1Zyk7XG4gIH1cblxuICBzdGF0aWMgZGlyZWN0aXZlSW5kZXgoZWxlbWVudEluZGV4OiBudW1iZXIsIGRpcmVjdGl2ZUluZGV4OiBudW1iZXIpOiBEaXJlY3RpdmVJbmRleCB7XG4gICAgcmV0dXJuIG5ldyBEaXJlY3RpdmVJbmRleChlbGVtZW50SW5kZXgsIGRpcmVjdGl2ZUluZGV4KTtcbiAgfVxuXG4gIHN0YXRpYyBsb29zZU5vdElkZW50aWNhbChhOiBhbnksIGI6IGFueSk6IGJvb2xlYW4geyByZXR1cm4gIWxvb3NlSWRlbnRpY2FsKGEsIGIpOyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2NoYW5nZV9kZXRlY3Rpb25fdXRpbC50c1xuICoqLyIsImV4cG9ydCBmdW5jdGlvbiBpbXBsZW1lbnRzT25EZXN0cm95KHBpcGU6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gcGlwZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUubmdPbkRlc3Ryb3k7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL3BpcGVfbGlmZWN5Y2xlX3JlZmxlY3Rvci50c1xuICoqLyIsImltcG9ydCB7aXNQcmVzZW50LCBpc0JsYW5rfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtTZXR0ZXJGbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvcmVmbGVjdGlvbi90eXBlcyc7XG5pbXBvcnQge0FTVH0gZnJvbSAnLi9wYXJzZXIvYXN0JztcbmltcG9ydCB7RGlyZWN0aXZlSW5kZXgsIERpcmVjdGl2ZVJlY29yZH0gZnJvbSAnLi9kaXJlY3RpdmVfcmVjb3JkJztcblxuY29uc3QgRElSRUNUSVZFX0xJRkVDWUNMRSA9IFwiZGlyZWN0aXZlTGlmZWN5Y2xlXCI7XG5jb25zdCBCSU5ESU5HID0gXCJuYXRpdmVcIjtcblxuY29uc3QgRElSRUNUSVZFID0gXCJkaXJlY3RpdmVcIjtcbmNvbnN0IEVMRU1FTlRfUFJPUEVSVFkgPSBcImVsZW1lbnRQcm9wZXJ0eVwiO1xuY29uc3QgRUxFTUVOVF9BVFRSSUJVVEUgPSBcImVsZW1lbnRBdHRyaWJ1dGVcIjtcbmNvbnN0IEVMRU1FTlRfQ0xBU1MgPSBcImVsZW1lbnRDbGFzc1wiO1xuY29uc3QgRUxFTUVOVF9TVFlMRSA9IFwiZWxlbWVudFN0eWxlXCI7XG5jb25zdCBURVhUX05PREUgPSBcInRleHROb2RlXCI7XG5jb25zdCBFVkVOVCA9IFwiZXZlbnRcIjtcbmNvbnN0IEhPU1RfRVZFTlQgPSBcImhvc3RFdmVudFwiO1xuXG5leHBvcnQgY2xhc3MgQmluZGluZ1RhcmdldCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBtb2RlOiBzdHJpbmcsIHB1YmxpYyBlbGVtZW50SW5kZXg6IG51bWJlciwgcHVibGljIG5hbWU6IHN0cmluZyxcbiAgICAgICAgICAgICAgcHVibGljIHVuaXQ6IHN0cmluZywgcHVibGljIGRlYnVnOiBzdHJpbmcpIHt9XG5cbiAgaXNEaXJlY3RpdmUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLm1vZGUgPT09IERJUkVDVElWRTsgfVxuXG4gIGlzRWxlbWVudFByb3BlcnR5KCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5tb2RlID09PSBFTEVNRU5UX1BST1BFUlRZOyB9XG5cbiAgaXNFbGVtZW50QXR0cmlidXRlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5tb2RlID09PSBFTEVNRU5UX0FUVFJJQlVURTsgfVxuXG4gIGlzRWxlbWVudENsYXNzKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5tb2RlID09PSBFTEVNRU5UX0NMQVNTOyB9XG5cbiAgaXNFbGVtZW50U3R5bGUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLm1vZGUgPT09IEVMRU1FTlRfU1RZTEU7IH1cblxuICBpc1RleHROb2RlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5tb2RlID09PSBURVhUX05PREU7IH1cbn1cblxuZXhwb3J0IGNsYXNzIEJpbmRpbmdSZWNvcmQge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbW9kZTogc3RyaW5nLCBwdWJsaWMgdGFyZ2V0OiBCaW5kaW5nVGFyZ2V0LCBwdWJsaWMgaW1wbGljaXRSZWNlaXZlcjogYW55LFxuICAgICAgICAgICAgICBwdWJsaWMgYXN0OiBBU1QsIHB1YmxpYyBzZXR0ZXI6IFNldHRlckZuLCBwdWJsaWMgbGlmZWN5Y2xlRXZlbnQ6IHN0cmluZyxcbiAgICAgICAgICAgICAgcHVibGljIGRpcmVjdGl2ZVJlY29yZDogRGlyZWN0aXZlUmVjb3JkKSB7fVxuXG4gIGlzRGlyZWN0aXZlTGlmZWN5Y2xlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5tb2RlID09PSBESVJFQ1RJVkVfTElGRUNZQ0xFOyB9XG5cbiAgY2FsbE9uQ2hhbmdlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNQcmVzZW50KHRoaXMuZGlyZWN0aXZlUmVjb3JkKSAmJiB0aGlzLmRpcmVjdGl2ZVJlY29yZC5jYWxsT25DaGFuZ2VzO1xuICB9XG5cbiAgaXNEZWZhdWx0Q2hhbmdlRGV0ZWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc0JsYW5rKHRoaXMuZGlyZWN0aXZlUmVjb3JkKSB8fCB0aGlzLmRpcmVjdGl2ZVJlY29yZC5pc0RlZmF1bHRDaGFuZ2VEZXRlY3Rpb24oKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVEaXJlY3RpdmVEb0NoZWNrKGRpcmVjdGl2ZVJlY29yZDogRGlyZWN0aXZlUmVjb3JkKTogQmluZGluZ1JlY29yZCB7XG4gICAgcmV0dXJuIG5ldyBCaW5kaW5nUmVjb3JkKERJUkVDVElWRV9MSUZFQ1lDTEUsIG51bGwsIDAsIG51bGwsIG51bGwsIFwiRG9DaGVja1wiLCBkaXJlY3RpdmVSZWNvcmQpO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZURpcmVjdGl2ZU9uSW5pdChkaXJlY3RpdmVSZWNvcmQ6IERpcmVjdGl2ZVJlY29yZCk6IEJpbmRpbmdSZWNvcmQge1xuICAgIHJldHVybiBuZXcgQmluZGluZ1JlY29yZChESVJFQ1RJVkVfTElGRUNZQ0xFLCBudWxsLCAwLCBudWxsLCBudWxsLCBcIk9uSW5pdFwiLCBkaXJlY3RpdmVSZWNvcmQpO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZURpcmVjdGl2ZU9uQ2hhbmdlcyhkaXJlY3RpdmVSZWNvcmQ6IERpcmVjdGl2ZVJlY29yZCk6IEJpbmRpbmdSZWNvcmQge1xuICAgIHJldHVybiBuZXcgQmluZGluZ1JlY29yZChESVJFQ1RJVkVfTElGRUNZQ0xFLCBudWxsLCAwLCBudWxsLCBudWxsLCBcIk9uQ2hhbmdlc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RpdmVSZWNvcmQpO1xuICB9XG5cblxuXG4gIHN0YXRpYyBjcmVhdGVGb3JEaXJlY3RpdmUoYXN0OiBBU1QsIHByb3BlcnR5TmFtZTogc3RyaW5nLCBzZXR0ZXI6IFNldHRlckZuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZVJlY29yZDogRGlyZWN0aXZlUmVjb3JkKTogQmluZGluZ1JlY29yZCB7XG4gICAgdmFyIGVsZW1lbnRJbmRleCA9IGRpcmVjdGl2ZVJlY29yZC5kaXJlY3RpdmVJbmRleC5lbGVtZW50SW5kZXg7XG4gICAgdmFyIHQgPSBuZXcgQmluZGluZ1RhcmdldChESVJFQ1RJVkUsIGVsZW1lbnRJbmRleCwgcHJvcGVydHlOYW1lLCBudWxsLCBhc3QudG9TdHJpbmcoKSk7XG4gICAgcmV0dXJuIG5ldyBCaW5kaW5nUmVjb3JkKERJUkVDVElWRSwgdCwgMCwgYXN0LCBzZXR0ZXIsIG51bGwsIGRpcmVjdGl2ZVJlY29yZCk7XG4gIH1cblxuXG5cbiAgc3RhdGljIGNyZWF0ZUZvckVsZW1lbnRQcm9wZXJ0eShhc3Q6IEFTVCwgZWxlbWVudEluZGV4OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBzdHJpbmcpOiBCaW5kaW5nUmVjb3JkIHtcbiAgICB2YXIgdCA9IG5ldyBCaW5kaW5nVGFyZ2V0KEVMRU1FTlRfUFJPUEVSVFksIGVsZW1lbnRJbmRleCwgcHJvcGVydHlOYW1lLCBudWxsLCBhc3QudG9TdHJpbmcoKSk7XG4gICAgcmV0dXJuIG5ldyBCaW5kaW5nUmVjb3JkKEJJTkRJTkcsIHQsIDAsIGFzdCwgbnVsbCwgbnVsbCwgbnVsbCk7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlRm9yRWxlbWVudEF0dHJpYnV0ZShhc3Q6IEFTVCwgZWxlbWVudEluZGV4OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWU6IHN0cmluZyk6IEJpbmRpbmdSZWNvcmQge1xuICAgIHZhciB0ID0gbmV3IEJpbmRpbmdUYXJnZXQoRUxFTUVOVF9BVFRSSUJVVEUsIGVsZW1lbnRJbmRleCwgYXR0cmlidXRlTmFtZSwgbnVsbCwgYXN0LnRvU3RyaW5nKCkpO1xuICAgIHJldHVybiBuZXcgQmluZGluZ1JlY29yZChCSU5ESU5HLCB0LCAwLCBhc3QsIG51bGwsIG51bGwsIG51bGwpO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZUZvckVsZW1lbnRDbGFzcyhhc3Q6IEFTVCwgZWxlbWVudEluZGV4OiBudW1iZXIsIGNsYXNzTmFtZTogc3RyaW5nKTogQmluZGluZ1JlY29yZCB7XG4gICAgdmFyIHQgPSBuZXcgQmluZGluZ1RhcmdldChFTEVNRU5UX0NMQVNTLCBlbGVtZW50SW5kZXgsIGNsYXNzTmFtZSwgbnVsbCwgYXN0LnRvU3RyaW5nKCkpO1xuICAgIHJldHVybiBuZXcgQmluZGluZ1JlY29yZChCSU5ESU5HLCB0LCAwLCBhc3QsIG51bGwsIG51bGwsIG51bGwpO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZUZvckVsZW1lbnRTdHlsZShhc3Q6IEFTVCwgZWxlbWVudEluZGV4OiBudW1iZXIsIHN0eWxlTmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXQ6IHN0cmluZyk6IEJpbmRpbmdSZWNvcmQge1xuICAgIHZhciB0ID0gbmV3IEJpbmRpbmdUYXJnZXQoRUxFTUVOVF9TVFlMRSwgZWxlbWVudEluZGV4LCBzdHlsZU5hbWUsIHVuaXQsIGFzdC50b1N0cmluZygpKTtcbiAgICByZXR1cm4gbmV3IEJpbmRpbmdSZWNvcmQoQklORElORywgdCwgMCwgYXN0LCBudWxsLCBudWxsLCBudWxsKTtcbiAgfVxuXG5cblxuICBzdGF0aWMgY3JlYXRlRm9ySG9zdFByb3BlcnR5KGRpcmVjdGl2ZUluZGV4OiBEaXJlY3RpdmVJbmRleCwgYXN0OiBBU1QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBzdHJpbmcpOiBCaW5kaW5nUmVjb3JkIHtcbiAgICB2YXIgdCA9IG5ldyBCaW5kaW5nVGFyZ2V0KEVMRU1FTlRfUFJPUEVSVFksIGRpcmVjdGl2ZUluZGV4LmVsZW1lbnRJbmRleCwgcHJvcGVydHlOYW1lLCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN0LnRvU3RyaW5nKCkpO1xuICAgIHJldHVybiBuZXcgQmluZGluZ1JlY29yZChCSU5ESU5HLCB0LCBkaXJlY3RpdmVJbmRleCwgYXN0LCBudWxsLCBudWxsLCBudWxsKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVGb3JIb3N0QXR0cmlidXRlKGRpcmVjdGl2ZUluZGV4OiBEaXJlY3RpdmVJbmRleCwgYXN0OiBBU1QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWU6IHN0cmluZyk6IEJpbmRpbmdSZWNvcmQge1xuICAgIHZhciB0ID0gbmV3IEJpbmRpbmdUYXJnZXQoRUxFTUVOVF9BVFRSSUJVVEUsIGRpcmVjdGl2ZUluZGV4LmVsZW1lbnRJbmRleCwgYXR0cmlidXRlTmFtZSwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzdC50b1N0cmluZygpKTtcbiAgICByZXR1cm4gbmV3IEJpbmRpbmdSZWNvcmQoQklORElORywgdCwgZGlyZWN0aXZlSW5kZXgsIGFzdCwgbnVsbCwgbnVsbCwgbnVsbCk7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlRm9ySG9zdENsYXNzKGRpcmVjdGl2ZUluZGV4OiBEaXJlY3RpdmVJbmRleCwgYXN0OiBBU1QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBzdHJpbmcpOiBCaW5kaW5nUmVjb3JkIHtcbiAgICB2YXIgdCA9IG5ldyBCaW5kaW5nVGFyZ2V0KEVMRU1FTlRfQ0xBU1MsIGRpcmVjdGl2ZUluZGV4LmVsZW1lbnRJbmRleCwgY2xhc3NOYW1lLCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN0LnRvU3RyaW5nKCkpO1xuICAgIHJldHVybiBuZXcgQmluZGluZ1JlY29yZChCSU5ESU5HLCB0LCBkaXJlY3RpdmVJbmRleCwgYXN0LCBudWxsLCBudWxsLCBudWxsKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVGb3JIb3N0U3R5bGUoZGlyZWN0aXZlSW5kZXg6IERpcmVjdGl2ZUluZGV4LCBhc3Q6IEFTVCwgc3R5bGVOYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdDogc3RyaW5nKTogQmluZGluZ1JlY29yZCB7XG4gICAgdmFyIHQgPSBuZXcgQmluZGluZ1RhcmdldChFTEVNRU5UX1NUWUxFLCBkaXJlY3RpdmVJbmRleC5lbGVtZW50SW5kZXgsIHN0eWxlTmFtZSwgdW5pdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzdC50b1N0cmluZygpKTtcbiAgICByZXR1cm4gbmV3IEJpbmRpbmdSZWNvcmQoQklORElORywgdCwgZGlyZWN0aXZlSW5kZXgsIGFzdCwgbnVsbCwgbnVsbCwgbnVsbCk7XG4gIH1cblxuXG5cbiAgc3RhdGljIGNyZWF0ZUZvclRleHROb2RlKGFzdDogQVNULCBlbGVtZW50SW5kZXg6IG51bWJlcik6IEJpbmRpbmdSZWNvcmQge1xuICAgIHZhciB0ID0gbmV3IEJpbmRpbmdUYXJnZXQoVEVYVF9OT0RFLCBlbGVtZW50SW5kZXgsIG51bGwsIG51bGwsIGFzdC50b1N0cmluZygpKTtcbiAgICByZXR1cm4gbmV3IEJpbmRpbmdSZWNvcmQoQklORElORywgdCwgMCwgYXN0LCBudWxsLCBudWxsLCBudWxsKTtcbiAgfVxuXG5cblxuICBzdGF0aWMgY3JlYXRlRm9yRXZlbnQoYXN0OiBBU1QsIGV2ZW50TmFtZTogc3RyaW5nLCBlbGVtZW50SW5kZXg6IG51bWJlcik6IEJpbmRpbmdSZWNvcmQge1xuICAgIHZhciB0ID0gbmV3IEJpbmRpbmdUYXJnZXQoRVZFTlQsIGVsZW1lbnRJbmRleCwgZXZlbnROYW1lLCBudWxsLCBhc3QudG9TdHJpbmcoKSk7XG4gICAgcmV0dXJuIG5ldyBCaW5kaW5nUmVjb3JkKEVWRU5ULCB0LCAwLCBhc3QsIG51bGwsIG51bGwsIG51bGwpO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZUZvckhvc3RFdmVudChhc3Q6IEFTVCwgZXZlbnROYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlUmVjb3JkOiBEaXJlY3RpdmVSZWNvcmQpOiBCaW5kaW5nUmVjb3JkIHtcbiAgICB2YXIgZGlyZWN0aXZlSW5kZXggPSBkaXJlY3RpdmVSZWNvcmQuZGlyZWN0aXZlSW5kZXg7XG4gICAgdmFyIHQgPVxuICAgICAgICBuZXcgQmluZGluZ1RhcmdldChIT1NUX0VWRU5ULCBkaXJlY3RpdmVJbmRleC5lbGVtZW50SW5kZXgsIGV2ZW50TmFtZSwgbnVsbCwgYXN0LnRvU3RyaW5nKCkpO1xuICAgIHJldHVybiBuZXcgQmluZGluZ1JlY29yZChIT1NUX0VWRU5ULCB0LCBkaXJlY3RpdmVJbmRleCwgYXN0LCBudWxsLCBudWxsLCBkaXJlY3RpdmVSZWNvcmQpO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2JpbmRpbmdfcmVjb3JkLnRzXG4gKiovIiwiaW1wb3J0IHtTdHJpbmdXcmFwcGVyLCBub3JtYWxpemVCb29sLCBpc0JsYW5rfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtpc0RlZmF1bHRDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3l9IGZyb20gJy4vY29uc3RhbnRzJztcblxuZXhwb3J0IGNsYXNzIERpcmVjdGl2ZUluZGV4IHtcbiAgY29uc3RydWN0b3IocHVibGljIGVsZW1lbnRJbmRleDogbnVtYmVyLCBwdWJsaWMgZGlyZWN0aXZlSW5kZXg6IG51bWJlcikge31cblxuICBnZXQgbmFtZSgpIHsgcmV0dXJuIGAke3RoaXMuZWxlbWVudEluZGV4fV8ke3RoaXMuZGlyZWN0aXZlSW5kZXh9YDsgfVxufVxuXG5leHBvcnQgY2xhc3MgRGlyZWN0aXZlUmVjb3JkIHtcbiAgZGlyZWN0aXZlSW5kZXg6IERpcmVjdGl2ZUluZGV4O1xuICBjYWxsQWZ0ZXJDb250ZW50SW5pdDogYm9vbGVhbjtcbiAgY2FsbEFmdGVyQ29udGVudENoZWNrZWQ6IGJvb2xlYW47XG4gIGNhbGxBZnRlclZpZXdJbml0OiBib29sZWFuO1xuICBjYWxsQWZ0ZXJWaWV3Q2hlY2tlZDogYm9vbGVhbjtcbiAgY2FsbE9uQ2hhbmdlczogYm9vbGVhbjtcbiAgY2FsbERvQ2hlY2s6IGJvb2xlYW47XG4gIGNhbGxPbkluaXQ6IGJvb2xlYW47XG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3k7XG5cbiAgY29uc3RydWN0b3Ioe2RpcmVjdGl2ZUluZGV4LCBjYWxsQWZ0ZXJDb250ZW50SW5pdCwgY2FsbEFmdGVyQ29udGVudENoZWNrZWQsIGNhbGxBZnRlclZpZXdJbml0LFxuICAgICAgICAgICAgICAgY2FsbEFmdGVyVmlld0NoZWNrZWQsIGNhbGxPbkNoYW5nZXMsIGNhbGxEb0NoZWNrLCBjYWxsT25Jbml0LCBjaGFuZ2VEZXRlY3Rpb259OiB7XG4gICAgZGlyZWN0aXZlSW5kZXg/OiBEaXJlY3RpdmVJbmRleCxcbiAgICBjYWxsQWZ0ZXJDb250ZW50SW5pdD86IGJvb2xlYW4sXG4gICAgY2FsbEFmdGVyQ29udGVudENoZWNrZWQ/OiBib29sZWFuLFxuICAgIGNhbGxBZnRlclZpZXdJbml0PzogYm9vbGVhbixcbiAgICBjYWxsQWZ0ZXJWaWV3Q2hlY2tlZD86IGJvb2xlYW4sXG4gICAgY2FsbE9uQ2hhbmdlcz86IGJvb2xlYW4sXG4gICAgY2FsbERvQ2hlY2s/OiBib29sZWFuLFxuICAgIGNhbGxPbkluaXQ/OiBib29sZWFuLFxuICAgIGNoYW5nZURldGVjdGlvbj86IENoYW5nZURldGVjdGlvblN0cmF0ZWd5XG4gIH0gPSB7fSkge1xuICAgIHRoaXMuZGlyZWN0aXZlSW5kZXggPSBkaXJlY3RpdmVJbmRleDtcbiAgICB0aGlzLmNhbGxBZnRlckNvbnRlbnRJbml0ID0gbm9ybWFsaXplQm9vbChjYWxsQWZ0ZXJDb250ZW50SW5pdCk7XG4gICAgdGhpcy5jYWxsQWZ0ZXJDb250ZW50Q2hlY2tlZCA9IG5vcm1hbGl6ZUJvb2woY2FsbEFmdGVyQ29udGVudENoZWNrZWQpO1xuICAgIHRoaXMuY2FsbE9uQ2hhbmdlcyA9IG5vcm1hbGl6ZUJvb2woY2FsbE9uQ2hhbmdlcyk7XG4gICAgdGhpcy5jYWxsQWZ0ZXJWaWV3SW5pdCA9IG5vcm1hbGl6ZUJvb2woY2FsbEFmdGVyVmlld0luaXQpO1xuICAgIHRoaXMuY2FsbEFmdGVyVmlld0NoZWNrZWQgPSBub3JtYWxpemVCb29sKGNhbGxBZnRlclZpZXdDaGVja2VkKTtcbiAgICB0aGlzLmNhbGxEb0NoZWNrID0gbm9ybWFsaXplQm9vbChjYWxsRG9DaGVjayk7XG4gICAgdGhpcy5jYWxsT25Jbml0ID0gbm9ybWFsaXplQm9vbChjYWxsT25Jbml0KTtcbiAgICB0aGlzLmNoYW5nZURldGVjdGlvbiA9IGNoYW5nZURldGVjdGlvbjtcbiAgfVxuXG4gIGlzRGVmYXVsdENoYW5nZURldGVjdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNEZWZhdWx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kodGhpcy5jaGFuZ2VEZXRlY3Rpb24pO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2RpcmVjdGl2ZV9yZWNvcmQudHNcbiAqKi8iLCJpbXBvcnQge2lzUHJlc2VudCwgaXNCbGFuaywgRnVuY3Rpb25XcmFwcGVyLCBTdHJpbmdXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtMaXN0V3JhcHBlciwgTWFwV3JhcHBlciwgU3RyaW5nTWFwV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcblxuaW1wb3J0IHtBYnN0cmFjdENoYW5nZURldGVjdG9yfSBmcm9tICcuL2Fic3RyYWN0X2NoYW5nZV9kZXRlY3Rvcic7XG5pbXBvcnQge0V2ZW50QmluZGluZ30gZnJvbSAnLi9ldmVudF9iaW5kaW5nJztcbmltcG9ydCB7QmluZGluZ1JlY29yZCwgQmluZGluZ1RhcmdldH0gZnJvbSAnLi9iaW5kaW5nX3JlY29yZCc7XG5pbXBvcnQge0RpcmVjdGl2ZVJlY29yZCwgRGlyZWN0aXZlSW5kZXh9IGZyb20gJy4vZGlyZWN0aXZlX3JlY29yZCc7XG5pbXBvcnQge0xvY2Fsc30gZnJvbSAnLi9wYXJzZXIvbG9jYWxzJztcbmltcG9ydCB7Q2hhbmdlRGlzcGF0Y2hlciwgQ2hhbmdlRGV0ZWN0b3JHZW5Db25maWd9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQge0NoYW5nZURldGVjdGlvblV0aWwsIFNpbXBsZUNoYW5nZX0gZnJvbSAnLi9jaGFuZ2VfZGV0ZWN0aW9uX3V0aWwnO1xuaW1wb3J0IHtDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JTdGF0ZX0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHtQcm90b1JlY29yZCwgUmVjb3JkVHlwZX0gZnJvbSAnLi9wcm90b19yZWNvcmQnO1xuXG5leHBvcnQgY2xhc3MgRHluYW1pY0NoYW5nZURldGVjdG9yIGV4dGVuZHMgQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvcjxhbnk+IHtcbiAgdmFsdWVzOiBhbnlbXTtcbiAgY2hhbmdlczogYW55W107XG4gIGxvY2FsUGlwZXM6IGFueVtdO1xuICBwcmV2Q29udGV4dHM6IGFueVtdO1xuICBkaXJlY3RpdmVzOiBhbnkgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcsIGRpc3BhdGNoZXI6IENoYW5nZURpc3BhdGNoZXIsIG51bWJlck9mUHJvcGVydHlQcm90b1JlY29yZHM6IG51bWJlcixcbiAgICAgICAgICAgICAgcHJvcGVydHlCaW5kaW5nVGFyZ2V0czogQmluZGluZ1RhcmdldFtdLCBkaXJlY3RpdmVJbmRpY2VzOiBEaXJlY3RpdmVJbmRleFtdLFxuICAgICAgICAgICAgICBzdHJhdGVneTogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIHByaXZhdGUgX3JlY29yZHM6IFByb3RvUmVjb3JkW10sXG4gICAgICAgICAgICAgIHByaXZhdGUgX2V2ZW50QmluZGluZ3M6IEV2ZW50QmluZGluZ1tdLCBwcml2YXRlIF9kaXJlY3RpdmVSZWNvcmRzOiBEaXJlY3RpdmVSZWNvcmRbXSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfZ2VuQ29uZmlnOiBDaGFuZ2VEZXRlY3RvckdlbkNvbmZpZykge1xuICAgIHN1cGVyKGlkLCBkaXNwYXRjaGVyLCBudW1iZXJPZlByb3BlcnR5UHJvdG9SZWNvcmRzLCBwcm9wZXJ0eUJpbmRpbmdUYXJnZXRzLCBkaXJlY3RpdmVJbmRpY2VzLFxuICAgICAgICAgIHN0cmF0ZWd5KTtcbiAgICB2YXIgbGVuID0gX3JlY29yZHMubGVuZ3RoICsgMTtcbiAgICB0aGlzLnZhbHVlcyA9IExpc3RXcmFwcGVyLmNyZWF0ZUZpeGVkU2l6ZShsZW4pO1xuICAgIHRoaXMubG9jYWxQaXBlcyA9IExpc3RXcmFwcGVyLmNyZWF0ZUZpeGVkU2l6ZShsZW4pO1xuICAgIHRoaXMucHJldkNvbnRleHRzID0gTGlzdFdyYXBwZXIuY3JlYXRlRml4ZWRTaXplKGxlbik7XG4gICAgdGhpcy5jaGFuZ2VzID0gTGlzdFdyYXBwZXIuY3JlYXRlRml4ZWRTaXplKGxlbik7XG5cbiAgICB0aGlzLmRlaHlkcmF0ZURpcmVjdGl2ZXMoZmFsc2UpO1xuICB9XG5cbiAgaGFuZGxlRXZlbnRJbnRlcm5hbChldmVudE5hbWU6IHN0cmluZywgZWxJbmRleDogbnVtYmVyLCBsb2NhbHM6IExvY2Fscyk6IGJvb2xlYW4ge1xuICAgIHZhciBwcmV2ZW50RGVmYXVsdCA9IGZhbHNlO1xuXG4gICAgdGhpcy5fbWF0Y2hpbmdFdmVudEJpbmRpbmdzKGV2ZW50TmFtZSwgZWxJbmRleClcbiAgICAgICAgLmZvckVhY2gocmVjID0+IHtcbiAgICAgICAgICB2YXIgcmVzID0gdGhpcy5fcHJvY2Vzc0V2ZW50QmluZGluZyhyZWMsIGxvY2Fscyk7XG4gICAgICAgICAgaWYgKHJlcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHByZXZlbnREZWZhdWx0ID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHByZXZlbnREZWZhdWx0O1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcHJvY2Vzc0V2ZW50QmluZGluZyhlYjogRXZlbnRCaW5kaW5nLCBsb2NhbHM6IExvY2Fscyk6IGFueSB7XG4gICAgdmFyIHZhbHVlcyA9IExpc3RXcmFwcGVyLmNyZWF0ZUZpeGVkU2l6ZShlYi5yZWNvcmRzLmxlbmd0aCk7XG4gICAgdmFsdWVzWzBdID0gdGhpcy52YWx1ZXNbMF07XG5cbiAgICBmb3IgKHZhciBwcm90b0lkeCA9IDA7IHByb3RvSWR4IDwgZWIucmVjb3Jkcy5sZW5ndGg7ICsrcHJvdG9JZHgpIHtcbiAgICAgIHZhciBwcm90byA9IGViLnJlY29yZHNbcHJvdG9JZHhdO1xuXG4gICAgICBpZiAocHJvdG8uaXNTa2lwUmVjb3JkKCkpIHtcbiAgICAgICAgcHJvdG9JZHggKz0gdGhpcy5fY29tcHV0ZVNraXBMZW5ndGgocHJvdG9JZHgsIHByb3RvLCB2YWx1ZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJlcyA9IHRoaXMuX2NhbGN1bGF0ZUN1cnJWYWx1ZShwcm90bywgdmFsdWVzLCBsb2NhbHMpO1xuICAgICAgICBpZiAocHJvdG8ubGFzdEluQmluZGluZykge1xuICAgICAgICAgIHRoaXMuX21hcmtQYXRoQXNDaGVja09uY2UocHJvdG8pO1xuICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fd3JpdGVTZWxmKHByb3RvLCByZXMsIHZhbHVlcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihcIkNhbm5vdCBiZSByZWFjaGVkXCIpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29tcHV0ZVNraXBMZW5ndGgocHJvdG9JbmRleDogbnVtYmVyLCBwcm90bzogUHJvdG9SZWNvcmQsIHZhbHVlczogYW55W10pOiBudW1iZXIge1xuICAgIGlmIChwcm90by5tb2RlID09PSBSZWNvcmRUeXBlLlNraXBSZWNvcmRzKSB7XG4gICAgICByZXR1cm4gcHJvdG8uZml4ZWRBcmdzWzBdIC0gcHJvdG9JbmRleCAtIDE7XG4gICAgfVxuXG4gICAgaWYgKHByb3RvLm1vZGUgPT09IFJlY29yZFR5cGUuU2tpcFJlY29yZHNJZikge1xuICAgICAgbGV0IGNvbmRpdGlvbiA9IHRoaXMuX3JlYWRDb250ZXh0KHByb3RvLCB2YWx1ZXMpO1xuICAgICAgcmV0dXJuIGNvbmRpdGlvbiA/IHByb3RvLmZpeGVkQXJnc1swXSAtIHByb3RvSW5kZXggLSAxIDogMDtcbiAgICB9XG5cbiAgICBpZiAocHJvdG8ubW9kZSA9PT0gUmVjb3JkVHlwZS5Ta2lwUmVjb3Jkc0lmTm90KSB7XG4gICAgICBsZXQgY29uZGl0aW9uID0gdGhpcy5fcmVhZENvbnRleHQocHJvdG8sIHZhbHVlcyk7XG4gICAgICByZXR1cm4gY29uZGl0aW9uID8gMCA6IHByb3RvLmZpeGVkQXJnc1swXSAtIHByb3RvSW5kZXggLSAxO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKFwiQ2Fubm90IGJlIHJlYWNoZWRcIik7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9tYXJrUGF0aEFzQ2hlY2tPbmNlKHByb3RvOiBQcm90b1JlY29yZCk6IHZvaWQge1xuICAgIGlmICghcHJvdG8uYmluZGluZ1JlY29yZC5pc0RlZmF1bHRDaGFuZ2VEZXRlY3Rpb24oKSkge1xuICAgICAgdmFyIGRpciA9IHByb3RvLmJpbmRpbmdSZWNvcmQuZGlyZWN0aXZlUmVjb3JkO1xuICAgICAgdGhpcy5fZ2V0RGV0ZWN0b3JGb3IoZGlyLmRpcmVjdGl2ZUluZGV4KS5tYXJrUGF0aFRvUm9vdEFzQ2hlY2tPbmNlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfbWF0Y2hpbmdFdmVudEJpbmRpbmdzKGV2ZW50TmFtZTogc3RyaW5nLCBlbEluZGV4OiBudW1iZXIpOiBFdmVudEJpbmRpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50QmluZGluZ3MuZmlsdGVyKGViID0+IGViLmV2ZW50TmFtZSA9PSBldmVudE5hbWUgJiYgZWIuZWxJbmRleCA9PT0gZWxJbmRleCk7XG4gIH1cblxuICBoeWRyYXRlRGlyZWN0aXZlcyhkaXJlY3RpdmVzOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlc1swXSA9IHRoaXMuY29udGV4dDtcbiAgICB0aGlzLmRpcmVjdGl2ZXMgPSBkaXJlY3RpdmVzO1xuXG4gICAgaWYgKHRoaXMuc3RyYXRlZ3kgPT09IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaE9ic2VydmUpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kaXJlY3RpdmVJbmRpY2VzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMuZGlyZWN0aXZlSW5kaWNlc1tpXTtcbiAgICAgICAgc3VwZXIub2JzZXJ2ZURpcmVjdGl2ZShkaXJlY3RpdmVzLmdldERpcmVjdGl2ZUZvcihpbmRleCksIGkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGRlaHlkcmF0ZURpcmVjdGl2ZXMoZGVzdHJveVBpcGVzOiBib29sZWFuKSB7XG4gICAgaWYgKGRlc3Ryb3lQaXBlcykge1xuICAgICAgdGhpcy5fZGVzdHJveVBpcGVzKCk7XG4gICAgfVxuICAgIHRoaXMudmFsdWVzWzBdID0gbnVsbDtcbiAgICB0aGlzLmRpcmVjdGl2ZXMgPSBudWxsO1xuICAgIExpc3RXcmFwcGVyLmZpbGwodGhpcy52YWx1ZXMsIENoYW5nZURldGVjdGlvblV0aWwudW5pbml0aWFsaXplZCwgMSk7XG4gICAgTGlzdFdyYXBwZXIuZmlsbCh0aGlzLmNoYW5nZXMsIGZhbHNlKTtcbiAgICBMaXN0V3JhcHBlci5maWxsKHRoaXMubG9jYWxQaXBlcywgbnVsbCk7XG4gICAgTGlzdFdyYXBwZXIuZmlsbCh0aGlzLnByZXZDb250ZXh0cywgQ2hhbmdlRGV0ZWN0aW9uVXRpbC51bmluaXRpYWxpemVkKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2Rlc3Ryb3lQaXBlcygpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubG9jYWxQaXBlcy5sZW5ndGg7ICsraSkge1xuICAgICAgaWYgKGlzUHJlc2VudCh0aGlzLmxvY2FsUGlwZXNbaV0pKSB7XG4gICAgICAgIENoYW5nZURldGVjdGlvblV0aWwuY2FsbFBpcGVPbkRlc3Ryb3kodGhpcy5sb2NhbFBpcGVzW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjaGVja05vQ2hhbmdlcygpOiB2b2lkIHsgdGhpcy5ydW5EZXRlY3RDaGFuZ2VzKHRydWUpOyB9XG5cbiAgZGV0ZWN0Q2hhbmdlc0luUmVjb3Jkc0ludGVybmFsKHRocm93T25DaGFuZ2U6IGJvb2xlYW4pIHtcbiAgICB2YXIgcHJvdG9zID0gdGhpcy5fcmVjb3JkcztcblxuICAgIHZhciBjaGFuZ2VzID0gbnVsbDtcbiAgICB2YXIgaXNDaGFuZ2VkID0gZmFsc2U7XG4gICAgZm9yICh2YXIgcHJvdG9JZHggPSAwOyBwcm90b0lkeCA8IHByb3Rvcy5sZW5ndGg7ICsrcHJvdG9JZHgpIHtcbiAgICAgIHZhciBwcm90bzogUHJvdG9SZWNvcmQgPSBwcm90b3NbcHJvdG9JZHhdO1xuICAgICAgdmFyIGJpbmRpbmdSZWNvcmQgPSBwcm90by5iaW5kaW5nUmVjb3JkO1xuICAgICAgdmFyIGRpcmVjdGl2ZVJlY29yZCA9IGJpbmRpbmdSZWNvcmQuZGlyZWN0aXZlUmVjb3JkO1xuXG4gICAgICBpZiAodGhpcy5fZmlyc3RJbkJpbmRpbmcocHJvdG8pKSB7XG4gICAgICAgIHRoaXMucHJvcGVydHlCaW5kaW5nSW5kZXggPSBwcm90by5wcm9wZXJ0eUJpbmRpbmdJbmRleDtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3RvLmlzTGlmZUN5Y2xlUmVjb3JkKCkpIHtcbiAgICAgICAgaWYgKHByb3RvLm5hbWUgPT09IFwiRG9DaGVja1wiICYmICF0aHJvd09uQ2hhbmdlKSB7XG4gICAgICAgICAgdGhpcy5fZ2V0RGlyZWN0aXZlRm9yKGRpcmVjdGl2ZVJlY29yZC5kaXJlY3RpdmVJbmRleCkubmdEb0NoZWNrKCk7XG4gICAgICAgIH0gZWxzZSBpZiAocHJvdG8ubmFtZSA9PT0gXCJPbkluaXRcIiAmJiAhdGhyb3dPbkNoYW5nZSAmJlxuICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPT0gQ2hhbmdlRGV0ZWN0b3JTdGF0ZS5OZXZlckNoZWNrZWQpIHtcbiAgICAgICAgICB0aGlzLl9nZXREaXJlY3RpdmVGb3IoZGlyZWN0aXZlUmVjb3JkLmRpcmVjdGl2ZUluZGV4KS5uZ09uSW5pdCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHByb3RvLm5hbWUgPT09IFwiT25DaGFuZ2VzXCIgJiYgaXNQcmVzZW50KGNoYW5nZXMpICYmICF0aHJvd09uQ2hhbmdlKSB7XG4gICAgICAgICAgdGhpcy5fZ2V0RGlyZWN0aXZlRm9yKGRpcmVjdGl2ZVJlY29yZC5kaXJlY3RpdmVJbmRleCkubmdPbkNoYW5nZXMoY2hhbmdlcyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocHJvdG8uaXNTa2lwUmVjb3JkKCkpIHtcbiAgICAgICAgcHJvdG9JZHggKz0gdGhpcy5fY29tcHV0ZVNraXBMZW5ndGgocHJvdG9JZHgsIHByb3RvLCB0aGlzLnZhbHVlcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgY2hhbmdlID0gdGhpcy5fY2hlY2socHJvdG8sIHRocm93T25DaGFuZ2UsIHRoaXMudmFsdWVzLCB0aGlzLmxvY2Fscyk7XG4gICAgICAgIGlmIChpc1ByZXNlbnQoY2hhbmdlKSkge1xuICAgICAgICAgIHRoaXMuX3VwZGF0ZURpcmVjdGl2ZU9yRWxlbWVudChjaGFuZ2UsIGJpbmRpbmdSZWNvcmQpO1xuICAgICAgICAgIGlzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgY2hhbmdlcyA9IHRoaXMuX2FkZENoYW5nZShiaW5kaW5nUmVjb3JkLCBjaGFuZ2UsIGNoYW5nZXMpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm90by5sYXN0SW5EaXJlY3RpdmUpIHtcbiAgICAgICAgY2hhbmdlcyA9IG51bGw7XG4gICAgICAgIGlmIChpc0NoYW5nZWQgJiYgIWJpbmRpbmdSZWNvcmQuaXNEZWZhdWx0Q2hhbmdlRGV0ZWN0aW9uKCkpIHtcbiAgICAgICAgICB0aGlzLl9nZXREZXRlY3RvckZvcihkaXJlY3RpdmVSZWNvcmQuZGlyZWN0aXZlSW5kZXgpLm1hcmtBc0NoZWNrT25jZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaXNDaGFuZ2VkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZmlyc3RJbkJpbmRpbmcocjogUHJvdG9SZWNvcmQpOiBib29sZWFuIHtcbiAgICB2YXIgcHJldiA9IENoYW5nZURldGVjdGlvblV0aWwucHJvdG9CeUluZGV4KHRoaXMuX3JlY29yZHMsIHIuc2VsZkluZGV4IC0gMSk7XG4gICAgcmV0dXJuIGlzQmxhbmsocHJldikgfHwgcHJldi5iaW5kaW5nUmVjb3JkICE9PSByLmJpbmRpbmdSZWNvcmQ7XG4gIH1cblxuICBhZnRlckNvbnRlbnRMaWZlY3ljbGVDYWxsYmFja3NJbnRlcm5hbCgpIHtcbiAgICB2YXIgZGlycyA9IHRoaXMuX2RpcmVjdGl2ZVJlY29yZHM7XG4gICAgZm9yICh2YXIgaSA9IGRpcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIHZhciBkaXIgPSBkaXJzW2ldO1xuICAgICAgaWYgKGRpci5jYWxsQWZ0ZXJDb250ZW50SW5pdCAmJiB0aGlzLnN0YXRlID09IENoYW5nZURldGVjdG9yU3RhdGUuTmV2ZXJDaGVja2VkKSB7XG4gICAgICAgIHRoaXMuX2dldERpcmVjdGl2ZUZvcihkaXIuZGlyZWN0aXZlSW5kZXgpLm5nQWZ0ZXJDb250ZW50SW5pdCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlyLmNhbGxBZnRlckNvbnRlbnRDaGVja2VkKSB7XG4gICAgICAgIHRoaXMuX2dldERpcmVjdGl2ZUZvcihkaXIuZGlyZWN0aXZlSW5kZXgpLm5nQWZ0ZXJDb250ZW50Q2hlY2tlZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFmdGVyVmlld0xpZmVjeWNsZUNhbGxiYWNrc0ludGVybmFsKCkge1xuICAgIHZhciBkaXJzID0gdGhpcy5fZGlyZWN0aXZlUmVjb3JkcztcbiAgICBmb3IgKHZhciBpID0gZGlycy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgdmFyIGRpciA9IGRpcnNbaV07XG4gICAgICBpZiAoZGlyLmNhbGxBZnRlclZpZXdJbml0ICYmIHRoaXMuc3RhdGUgPT0gQ2hhbmdlRGV0ZWN0b3JTdGF0ZS5OZXZlckNoZWNrZWQpIHtcbiAgICAgICAgdGhpcy5fZ2V0RGlyZWN0aXZlRm9yKGRpci5kaXJlY3RpdmVJbmRleCkubmdBZnRlclZpZXdJbml0KCk7XG4gICAgICB9XG4gICAgICBpZiAoZGlyLmNhbGxBZnRlclZpZXdDaGVja2VkKSB7XG4gICAgICAgIHRoaXMuX2dldERpcmVjdGl2ZUZvcihkaXIuZGlyZWN0aXZlSW5kZXgpLm5nQWZ0ZXJWaWV3Q2hlY2tlZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSBfdXBkYXRlRGlyZWN0aXZlT3JFbGVtZW50KGNoYW5nZSwgYmluZGluZ1JlY29yZCkge1xuICAgIGlmIChpc0JsYW5rKGJpbmRpbmdSZWNvcmQuZGlyZWN0aXZlUmVjb3JkKSkge1xuICAgICAgc3VwZXIubm90aWZ5RGlzcGF0Y2hlcihjaGFuZ2UuY3VycmVudFZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGRpcmVjdGl2ZUluZGV4ID0gYmluZGluZ1JlY29yZC5kaXJlY3RpdmVSZWNvcmQuZGlyZWN0aXZlSW5kZXg7XG4gICAgICBiaW5kaW5nUmVjb3JkLnNldHRlcih0aGlzLl9nZXREaXJlY3RpdmVGb3IoZGlyZWN0aXZlSW5kZXgpLCBjaGFuZ2UuY3VycmVudFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZ2VuQ29uZmlnLmxvZ0JpbmRpbmdVcGRhdGUpIHtcbiAgICAgIHN1cGVyLmxvZ0JpbmRpbmdVcGRhdGUoY2hhbmdlLmN1cnJlbnRWYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcml2YXRlIF9hZGRDaGFuZ2UoYmluZGluZ1JlY29yZDogQmluZGluZ1JlY29yZCwgY2hhbmdlLCBjaGFuZ2VzKSB7XG4gICAgaWYgKGJpbmRpbmdSZWNvcmQuY2FsbE9uQ2hhbmdlcygpKSB7XG4gICAgICByZXR1cm4gc3VwZXIuYWRkQ2hhbmdlKGNoYW5nZXMsIGNoYW5nZS5wcmV2aW91c1ZhbHVlLCBjaGFuZ2UuY3VycmVudFZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGNoYW5nZXM7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcml2YXRlIF9nZXREaXJlY3RpdmVGb3IoZGlyZWN0aXZlSW5kZXgpIHtcbiAgICByZXR1cm4gdGhpcy5kaXJlY3RpdmVzLmdldERpcmVjdGl2ZUZvcihkaXJlY3RpdmVJbmRleCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgX2dldERldGVjdG9yRm9yKGRpcmVjdGl2ZUluZGV4KSB7IHJldHVybiB0aGlzLmRpcmVjdGl2ZXMuZ2V0RGV0ZWN0b3JGb3IoZGlyZWN0aXZlSW5kZXgpOyB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcml2YXRlIF9jaGVjayhwcm90bzogUHJvdG9SZWNvcmQsIHRocm93T25DaGFuZ2U6IGJvb2xlYW4sIHZhbHVlczogYW55W10sXG4gICAgICAgICAgICAgICAgIGxvY2FsczogTG9jYWxzKTogU2ltcGxlQ2hhbmdlIHtcbiAgICBpZiAocHJvdG8uaXNQaXBlUmVjb3JkKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9waXBlQ2hlY2socHJvdG8sIHRocm93T25DaGFuZ2UsIHZhbHVlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZWZlcmVuY2VDaGVjayhwcm90bywgdGhyb3dPbkNoYW5nZSwgdmFsdWVzLCBsb2NhbHMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSBfcmVmZXJlbmNlQ2hlY2socHJvdG86IFByb3RvUmVjb3JkLCB0aHJvd09uQ2hhbmdlOiBib29sZWFuLCB2YWx1ZXM6IGFueVtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbHM6IExvY2Fscykge1xuICAgIGlmICh0aGlzLl9wdXJlRnVuY0FuZEFyZ3NEaWROb3RDaGFuZ2UocHJvdG8pKSB7XG4gICAgICB0aGlzLl9zZXRDaGFuZ2VkKHByb3RvLCBmYWxzZSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgY3VyclZhbHVlID0gdGhpcy5fY2FsY3VsYXRlQ3VyclZhbHVlKHByb3RvLCB2YWx1ZXMsIGxvY2Fscyk7XG4gICAgaWYgKHRoaXMuc3RyYXRlZ3kgPT09IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaE9ic2VydmUpIHtcbiAgICAgIHN1cGVyLm9ic2VydmVWYWx1ZShjdXJyVmFsdWUsIHByb3RvLnNlbGZJbmRleCk7XG4gICAgfVxuXG4gICAgaWYgKHByb3RvLnNob3VsZEJlQ2hlY2tlZCgpKSB7XG4gICAgICB2YXIgcHJldlZhbHVlID0gdGhpcy5fcmVhZFNlbGYocHJvdG8sIHZhbHVlcyk7XG4gICAgICBpZiAoQ2hhbmdlRGV0ZWN0aW9uVXRpbC5sb29zZU5vdElkZW50aWNhbChwcmV2VmFsdWUsIGN1cnJWYWx1ZSkpIHtcbiAgICAgICAgaWYgKHByb3RvLmxhc3RJbkJpbmRpbmcpIHtcbiAgICAgICAgICB2YXIgY2hhbmdlID0gQ2hhbmdlRGV0ZWN0aW9uVXRpbC5zaW1wbGVDaGFuZ2UocHJldlZhbHVlLCBjdXJyVmFsdWUpO1xuICAgICAgICAgIGlmICh0aHJvd09uQ2hhbmdlKSB0aGlzLnRocm93T25DaGFuZ2VFcnJvcihwcmV2VmFsdWUsIGN1cnJWYWx1ZSk7XG5cbiAgICAgICAgICB0aGlzLl93cml0ZVNlbGYocHJvdG8sIGN1cnJWYWx1ZSwgdmFsdWVzKTtcbiAgICAgICAgICB0aGlzLl9zZXRDaGFuZ2VkKHByb3RvLCB0cnVlKTtcbiAgICAgICAgICByZXR1cm4gY2hhbmdlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3dyaXRlU2VsZihwcm90bywgY3VyclZhbHVlLCB2YWx1ZXMpO1xuICAgICAgICAgIHRoaXMuX3NldENoYW5nZWQocHJvdG8sIHRydWUpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9zZXRDaGFuZ2VkKHByb3RvLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3dyaXRlU2VsZihwcm90bywgY3VyclZhbHVlLCB2YWx1ZXMpO1xuICAgICAgdGhpcy5fc2V0Q2hhbmdlZChwcm90bywgdHJ1ZSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jYWxjdWxhdGVDdXJyVmFsdWUocHJvdG86IFByb3RvUmVjb3JkLCB2YWx1ZXM6IGFueVtdLCBsb2NhbHM6IExvY2Fscykge1xuICAgIHN3aXRjaCAocHJvdG8ubW9kZSkge1xuICAgICAgY2FzZSBSZWNvcmRUeXBlLlNlbGY6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkQ29udGV4dChwcm90bywgdmFsdWVzKTtcblxuICAgICAgY2FzZSBSZWNvcmRUeXBlLkNvbnN0OlxuICAgICAgICByZXR1cm4gcHJvdG8uZnVuY09yVmFsdWU7XG5cbiAgICAgIGNhc2UgUmVjb3JkVHlwZS5Qcm9wZXJ0eVJlYWQ6XG4gICAgICAgIHZhciBjb250ZXh0ID0gdGhpcy5fcmVhZENvbnRleHQocHJvdG8sIHZhbHVlcyk7XG4gICAgICAgIHJldHVybiBwcm90by5mdW5jT3JWYWx1ZShjb250ZXh0KTtcblxuICAgICAgY2FzZSBSZWNvcmRUeXBlLlNhZmVQcm9wZXJ0eTpcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLl9yZWFkQ29udGV4dChwcm90bywgdmFsdWVzKTtcbiAgICAgICAgcmV0dXJuIGlzQmxhbmsoY29udGV4dCkgPyBudWxsIDogcHJvdG8uZnVuY09yVmFsdWUoY29udGV4dCk7XG5cbiAgICAgIGNhc2UgUmVjb3JkVHlwZS5Qcm9wZXJ0eVdyaXRlOlxuICAgICAgICB2YXIgY29udGV4dCA9IHRoaXMuX3JlYWRDb250ZXh0KHByb3RvLCB2YWx1ZXMpO1xuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLl9yZWFkQXJncyhwcm90bywgdmFsdWVzKVswXTtcbiAgICAgICAgcHJvdG8uZnVuY09yVmFsdWUoY29udGV4dCwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG5cbiAgICAgIGNhc2UgUmVjb3JkVHlwZS5LZXllZFdyaXRlOlxuICAgICAgICB2YXIgY29udGV4dCA9IHRoaXMuX3JlYWRDb250ZXh0KHByb3RvLCB2YWx1ZXMpO1xuICAgICAgICB2YXIga2V5ID0gdGhpcy5fcmVhZEFyZ3MocHJvdG8sIHZhbHVlcylbMF07XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuX3JlYWRBcmdzKHByb3RvLCB2YWx1ZXMpWzFdO1xuICAgICAgICBjb250ZXh0W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgICBjYXNlIFJlY29yZFR5cGUuTG9jYWw6XG4gICAgICAgIHJldHVybiBsb2NhbHMuZ2V0KHByb3RvLm5hbWUpO1xuXG4gICAgICBjYXNlIFJlY29yZFR5cGUuSW52b2tlTWV0aG9kOlxuICAgICAgICB2YXIgY29udGV4dCA9IHRoaXMuX3JlYWRDb250ZXh0KHByb3RvLCB2YWx1ZXMpO1xuICAgICAgICB2YXIgYXJncyA9IHRoaXMuX3JlYWRBcmdzKHByb3RvLCB2YWx1ZXMpO1xuICAgICAgICByZXR1cm4gcHJvdG8uZnVuY09yVmFsdWUoY29udGV4dCwgYXJncyk7XG5cbiAgICAgIGNhc2UgUmVjb3JkVHlwZS5TYWZlTWV0aG9kSW52b2tlOlxuICAgICAgICB2YXIgY29udGV4dCA9IHRoaXMuX3JlYWRDb250ZXh0KHByb3RvLCB2YWx1ZXMpO1xuICAgICAgICBpZiAoaXNCbGFuayhjb250ZXh0KSkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciBhcmdzID0gdGhpcy5fcmVhZEFyZ3MocHJvdG8sIHZhbHVlcyk7XG4gICAgICAgIHJldHVybiBwcm90by5mdW5jT3JWYWx1ZShjb250ZXh0LCBhcmdzKTtcblxuICAgICAgY2FzZSBSZWNvcmRUeXBlLktleWVkUmVhZDpcbiAgICAgICAgdmFyIGFyZyA9IHRoaXMuX3JlYWRBcmdzKHByb3RvLCB2YWx1ZXMpWzBdO1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZENvbnRleHQocHJvdG8sIHZhbHVlcylbYXJnXTtcblxuICAgICAgY2FzZSBSZWNvcmRUeXBlLkNoYWluOlxuICAgICAgICB2YXIgYXJncyA9IHRoaXMuX3JlYWRBcmdzKHByb3RvLCB2YWx1ZXMpO1xuICAgICAgICByZXR1cm4gYXJnc1thcmdzLmxlbmd0aCAtIDFdO1xuXG4gICAgICBjYXNlIFJlY29yZFR5cGUuSW52b2tlQ2xvc3VyZTpcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uV3JhcHBlci5hcHBseSh0aGlzLl9yZWFkQ29udGV4dChwcm90bywgdmFsdWVzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkQXJncyhwcm90bywgdmFsdWVzKSk7XG5cbiAgICAgIGNhc2UgUmVjb3JkVHlwZS5JbnRlcnBvbGF0ZTpcbiAgICAgIGNhc2UgUmVjb3JkVHlwZS5QcmltaXRpdmVPcDpcbiAgICAgIGNhc2UgUmVjb3JkVHlwZS5Db2xsZWN0aW9uTGl0ZXJhbDpcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uV3JhcHBlci5hcHBseShwcm90by5mdW5jT3JWYWx1ZSwgdGhpcy5fcmVhZEFyZ3MocHJvdG8sIHZhbHVlcykpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgVW5rbm93biBvcGVyYXRpb24gJHtwcm90by5tb2RlfWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3BpcGVDaGVjayhwcm90bzogUHJvdG9SZWNvcmQsIHRocm93T25DaGFuZ2U6IGJvb2xlYW4sIHZhbHVlczogYW55W10pIHtcbiAgICB2YXIgY29udGV4dCA9IHRoaXMuX3JlYWRDb250ZXh0KHByb3RvLCB2YWx1ZXMpO1xuICAgIHZhciBzZWxlY3RlZFBpcGUgPSB0aGlzLl9waXBlRm9yKHByb3RvLCBjb250ZXh0KTtcbiAgICBpZiAoIXNlbGVjdGVkUGlwZS5wdXJlIHx8IHRoaXMuX2FyZ3NPckNvbnRleHRDaGFuZ2VkKHByb3RvKSkge1xuICAgICAgdmFyIGFyZ3MgPSB0aGlzLl9yZWFkQXJncyhwcm90bywgdmFsdWVzKTtcbiAgICAgIHZhciBjdXJyVmFsdWUgPSBzZWxlY3RlZFBpcGUucGlwZS50cmFuc2Zvcm0oY29udGV4dCwgYXJncyk7XG5cbiAgICAgIGlmIChwcm90by5zaG91bGRCZUNoZWNrZWQoKSkge1xuICAgICAgICB2YXIgcHJldlZhbHVlID0gdGhpcy5fcmVhZFNlbGYocHJvdG8sIHZhbHVlcyk7XG4gICAgICAgIGlmIChDaGFuZ2VEZXRlY3Rpb25VdGlsLmxvb3NlTm90SWRlbnRpY2FsKHByZXZWYWx1ZSwgY3VyclZhbHVlKSkge1xuICAgICAgICAgIGN1cnJWYWx1ZSA9IENoYW5nZURldGVjdGlvblV0aWwudW53cmFwVmFsdWUoY3VyclZhbHVlKTtcblxuICAgICAgICAgIGlmIChwcm90by5sYXN0SW5CaW5kaW5nKSB7XG4gICAgICAgICAgICB2YXIgY2hhbmdlID0gQ2hhbmdlRGV0ZWN0aW9uVXRpbC5zaW1wbGVDaGFuZ2UocHJldlZhbHVlLCBjdXJyVmFsdWUpO1xuICAgICAgICAgICAgaWYgKHRocm93T25DaGFuZ2UpIHRoaXMudGhyb3dPbkNoYW5nZUVycm9yKHByZXZWYWx1ZSwgY3VyclZhbHVlKTtcblxuICAgICAgICAgICAgdGhpcy5fd3JpdGVTZWxmKHByb3RvLCBjdXJyVmFsdWUsIHZhbHVlcyk7XG4gICAgICAgICAgICB0aGlzLl9zZXRDaGFuZ2VkKHByb3RvLCB0cnVlKTtcblxuICAgICAgICAgICAgcmV0dXJuIGNoYW5nZTtcblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl93cml0ZVNlbGYocHJvdG8sIGN1cnJWYWx1ZSwgdmFsdWVzKTtcbiAgICAgICAgICAgIHRoaXMuX3NldENoYW5nZWQocHJvdG8sIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3NldENoYW5nZWQocHJvdG8sIGZhbHNlKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fd3JpdGVTZWxmKHByb3RvLCBjdXJyVmFsdWUsIHZhbHVlcyk7XG4gICAgICAgIHRoaXMuX3NldENoYW5nZWQocHJvdG8sIHRydWUpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9waXBlRm9yKHByb3RvOiBQcm90b1JlY29yZCwgY29udGV4dCkge1xuICAgIHZhciBzdG9yZWRQaXBlID0gdGhpcy5fcmVhZFBpcGUocHJvdG8pO1xuICAgIGlmIChpc1ByZXNlbnQoc3RvcmVkUGlwZSkpIHJldHVybiBzdG9yZWRQaXBlO1xuXG4gICAgdmFyIHBpcGUgPSB0aGlzLnBpcGVzLmdldChwcm90by5uYW1lKTtcbiAgICB0aGlzLl93cml0ZVBpcGUocHJvdG8sIHBpcGUpO1xuICAgIHJldHVybiBwaXBlO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVhZENvbnRleHQocHJvdG86IFByb3RvUmVjb3JkLCB2YWx1ZXM6IGFueVtdKSB7XG4gICAgaWYgKHByb3RvLmNvbnRleHRJbmRleCA9PSAtMSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldERpcmVjdGl2ZUZvcihwcm90by5kaXJlY3RpdmVJbmRleCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZXNbcHJvdG8uY29udGV4dEluZGV4XTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlYWRTZWxmKHByb3RvOiBQcm90b1JlY29yZCwgdmFsdWVzOiBhbnlbXSkgeyByZXR1cm4gdmFsdWVzW3Byb3RvLnNlbGZJbmRleF07IH1cblxuICBwcml2YXRlIF93cml0ZVNlbGYocHJvdG86IFByb3RvUmVjb3JkLCB2YWx1ZSwgdmFsdWVzOiBhbnlbXSkgeyB2YWx1ZXNbcHJvdG8uc2VsZkluZGV4XSA9IHZhbHVlOyB9XG5cbiAgcHJpdmF0ZSBfcmVhZFBpcGUocHJvdG86IFByb3RvUmVjb3JkKSB7IHJldHVybiB0aGlzLmxvY2FsUGlwZXNbcHJvdG8uc2VsZkluZGV4XTsgfVxuXG4gIHByaXZhdGUgX3dyaXRlUGlwZShwcm90bzogUHJvdG9SZWNvcmQsIHZhbHVlKSB7IHRoaXMubG9jYWxQaXBlc1twcm90by5zZWxmSW5kZXhdID0gdmFsdWU7IH1cblxuICBwcml2YXRlIF9zZXRDaGFuZ2VkKHByb3RvOiBQcm90b1JlY29yZCwgdmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAocHJvdG8uYXJndW1lbnRUb1B1cmVGdW5jdGlvbikgdGhpcy5jaGFuZ2VzW3Byb3RvLnNlbGZJbmRleF0gPSB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgX3B1cmVGdW5jQW5kQXJnc0RpZE5vdENoYW5nZShwcm90bzogUHJvdG9SZWNvcmQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gcHJvdG8uaXNQdXJlRnVuY3Rpb24oKSAmJiAhdGhpcy5fYXJnc0NoYW5nZWQocHJvdG8pO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXJnc0NoYW5nZWQocHJvdG86IFByb3RvUmVjb3JkKTogYm9vbGVhbiB7XG4gICAgdmFyIGFyZ3MgPSBwcm90by5hcmdzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7ICsraSkge1xuICAgICAgaWYgKHRoaXMuY2hhbmdlc1thcmdzW2ldXSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXJnc09yQ29udGV4dENoYW5nZWQocHJvdG86IFByb3RvUmVjb3JkKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2FyZ3NDaGFuZ2VkKHByb3RvKSB8fCB0aGlzLmNoYW5nZXNbcHJvdG8uY29udGV4dEluZGV4XTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlYWRBcmdzKHByb3RvOiBQcm90b1JlY29yZCwgdmFsdWVzOiBhbnlbXSkge1xuICAgIHZhciByZXMgPSBMaXN0V3JhcHBlci5jcmVhdGVGaXhlZFNpemUocHJvdG8uYXJncy5sZW5ndGgpO1xuICAgIHZhciBhcmdzID0gcHJvdG8uYXJncztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyArK2kpIHtcbiAgICAgIHJlc1tpXSA9IHZhbHVlc1thcmdzW2ldXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9keW5hbWljX2NoYW5nZV9kZXRlY3Rvci50c1xuICoqLyIsImltcG9ydCB7YXNzZXJ0aW9uc0VuYWJsZWQsIGlzUHJlc2VudCwgaXNCbGFuaywgU3RyaW5nV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7TGlzdFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge0NoYW5nZURldGVjdGlvblV0aWx9IGZyb20gJy4vY2hhbmdlX2RldGVjdGlvbl91dGlsJztcbmltcG9ydCB7Q2hhbmdlRGV0ZWN0b3JSZWYsIENoYW5nZURldGVjdG9yUmVmX30gZnJvbSAnLi9jaGFuZ2VfZGV0ZWN0b3JfcmVmJztcbmltcG9ydCB7RGlyZWN0aXZlSW5kZXh9IGZyb20gJy4vZGlyZWN0aXZlX3JlY29yZCc7XG5pbXBvcnQge0NoYW5nZURldGVjdG9yLCBDaGFuZ2VEaXNwYXRjaGVyfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHtQaXBlc30gZnJvbSAnLi9waXBlcyc7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25FcnJvcixcbiAgRXhwcmVzc2lvbkNoYW5nZWRBZnRlckl0SGFzQmVlbkNoZWNrZWRFeGNlcHRpb24sXG4gIERlaHlkcmF0ZWRFeGNlcHRpb25cbn0gZnJvbSAnLi9leGNlcHRpb25zJztcbmltcG9ydCB7QmluZGluZ1RhcmdldH0gZnJvbSAnLi9iaW5kaW5nX3JlY29yZCc7XG5pbXBvcnQge0xvY2Fsc30gZnJvbSAnLi9wYXJzZXIvbG9jYWxzJztcbmltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yU3RhdGV9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7d3RmQ3JlYXRlU2NvcGUsIHd0ZkxlYXZlLCBXdGZTY29wZUZufSBmcm9tICcuLi9wcm9maWxlL3Byb2ZpbGUnO1xuaW1wb3J0IHtpc09ic2VydmFibGV9IGZyb20gJy4vb2JzZXJ2YWJsZV9mYWNhZGUnO1xuXG5cbnZhciBfc2NvcGVfY2hlY2s6IFd0ZlNjb3BlRm4gPSB3dGZDcmVhdGVTY29wZShgQ2hhbmdlRGV0ZWN0b3IjY2hlY2soYXNjaWkgaWQsIGJvb2wgdGhyb3dPbkNoYW5nZSlgKTtcblxuY2xhc3MgX0NvbnRleHQge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZWxlbWVudDogYW55LCBwdWJsaWMgY29tcG9uZW50RWxlbWVudDogYW55LCBwdWJsaWMgY29udGV4dDogYW55LFxuICAgICAgICAgICAgICBwdWJsaWMgbG9jYWxzOiBhbnksIHB1YmxpYyBpbmplY3RvcjogYW55LCBwdWJsaWMgZXhwcmVzc2lvbjogYW55KSB7fVxufVxuXG5leHBvcnQgY2xhc3MgQWJzdHJhY3RDaGFuZ2VEZXRlY3RvcjxUPiBpbXBsZW1lbnRzIENoYW5nZURldGVjdG9yIHtcbiAgY29udGVudENoaWxkcmVuOiBhbnlbXSA9IFtdO1xuICB2aWV3Q2hpbGRyZW46IGFueVtdID0gW107XG4gIHBhcmVudDogQ2hhbmdlRGV0ZWN0b3I7XG4gIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWY7XG5cbiAgLy8gVGhlIG5hbWVzIG9mIHRoZSBiZWxvdyBmaWVsZHMgbXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCBjb2RlZ2VuX25hbWVfdXRpbC50cyBvclxuICAvLyBjaGFuZ2UgZGV0ZWN0aW9uIHdpbGwgZmFpbC5cbiAgc3RhdGU6IENoYW5nZURldGVjdG9yU3RhdGUgPSBDaGFuZ2VEZXRlY3RvclN0YXRlLk5ldmVyQ2hlY2tlZDtcbiAgY29udGV4dDogVDtcbiAgbG9jYWxzOiBMb2NhbHMgPSBudWxsO1xuICBtb2RlOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSA9IG51bGw7XG4gIHBpcGVzOiBQaXBlcyA9IG51bGw7XG4gIHByb3BlcnR5QmluZGluZ0luZGV4OiBudW1iZXI7XG5cbiAgLy8gVGhpcyBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZS4gV29ya3Mgb25seSBpbiBEYXJ0LlxuICBzdWJzY3JpcHRpb25zOiBhbnlbXTtcbiAgc3RyZWFtczogYW55W107XG5cbiAgY29uc3RydWN0b3IocHVibGljIGlkOiBzdHJpbmcsIHB1YmxpYyBkaXNwYXRjaGVyOiBDaGFuZ2VEaXNwYXRjaGVyLFxuICAgICAgICAgICAgICBwdWJsaWMgbnVtYmVyT2ZQcm9wZXJ0eVByb3RvUmVjb3JkczogbnVtYmVyLCBwdWJsaWMgYmluZGluZ1RhcmdldHM6IEJpbmRpbmdUYXJnZXRbXSxcbiAgICAgICAgICAgICAgcHVibGljIGRpcmVjdGl2ZUluZGljZXM6IERpcmVjdGl2ZUluZGV4W10sIHB1YmxpYyBzdHJhdGVneTogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kpIHtcbiAgICB0aGlzLnJlZiA9IG5ldyBDaGFuZ2VEZXRlY3RvclJlZl8odGhpcyk7XG4gIH1cblxuICBhZGRDb250ZW50Q2hpbGQoY2Q6IENoYW5nZURldGVjdG9yKTogdm9pZCB7XG4gICAgdGhpcy5jb250ZW50Q2hpbGRyZW4ucHVzaChjZCk7XG4gICAgY2QucGFyZW50ID0gdGhpcztcbiAgfVxuXG4gIHJlbW92ZUNvbnRlbnRDaGlsZChjZDogQ2hhbmdlRGV0ZWN0b3IpOiB2b2lkIHsgTGlzdFdyYXBwZXIucmVtb3ZlKHRoaXMuY29udGVudENoaWxkcmVuLCBjZCk7IH1cblxuICBhZGRWaWV3Q2hpbGQoY2Q6IENoYW5nZURldGVjdG9yKTogdm9pZCB7XG4gICAgdGhpcy52aWV3Q2hpbGRyZW4ucHVzaChjZCk7XG4gICAgY2QucGFyZW50ID0gdGhpcztcbiAgfVxuXG4gIHJlbW92ZVZpZXdDaGlsZChjZDogQ2hhbmdlRGV0ZWN0b3IpOiB2b2lkIHsgTGlzdFdyYXBwZXIucmVtb3ZlKHRoaXMudmlld0NoaWxkcmVuLCBjZCk7IH1cblxuICByZW1vdmUoKTogdm9pZCB7IHRoaXMucGFyZW50LnJlbW92ZUNvbnRlbnRDaGlsZCh0aGlzKTsgfVxuXG4gIGhhbmRsZUV2ZW50KGV2ZW50TmFtZTogc3RyaW5nLCBlbEluZGV4OiBudW1iZXIsIGxvY2FsczogTG9jYWxzKTogYm9vbGVhbiB7XG4gICAgdmFyIHJlcyA9IHRoaXMuaGFuZGxlRXZlbnRJbnRlcm5hbChldmVudE5hbWUsIGVsSW5kZXgsIGxvY2Fscyk7XG4gICAgdGhpcy5tYXJrUGF0aFRvUm9vdEFzQ2hlY2tPbmNlKCk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIGhhbmRsZUV2ZW50SW50ZXJuYWwoZXZlbnROYW1lOiBzdHJpbmcsIGVsSW5kZXg6IG51bWJlciwgbG9jYWxzOiBMb2NhbHMpOiBib29sZWFuIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgZGV0ZWN0Q2hhbmdlcygpOiB2b2lkIHsgdGhpcy5ydW5EZXRlY3RDaGFuZ2VzKGZhbHNlKTsgfVxuXG4gIGNoZWNrTm9DaGFuZ2VzKCk6IHZvaWQge1xuICAgIGlmIChhc3NlcnRpb25zRW5hYmxlZCgpKSB7XG4gICAgICB0aGlzLnJ1bkRldGVjdENoYW5nZXModHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgcnVuRGV0ZWN0Q2hhbmdlcyh0aHJvd09uQ2hhbmdlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuRGV0YWNoZWQgfHxcbiAgICAgICAgdGhpcy5tb2RlID09PSBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5DaGVja2VkIHx8IHRoaXMuc3RhdGUgPT09IENoYW5nZURldGVjdG9yU3RhdGUuRXJyb3JlZClcbiAgICAgIHJldHVybjtcbiAgICB2YXIgcyA9IF9zY29wZV9jaGVjayh0aGlzLmlkLCB0aHJvd09uQ2hhbmdlKTtcblxuICAgIHRoaXMuZGV0ZWN0Q2hhbmdlc0luUmVjb3Jkcyh0aHJvd09uQ2hhbmdlKTtcblxuICAgIHRoaXMuX2RldGVjdENoYW5nZXNDb250ZW50Q2hpbGRyZW4odGhyb3dPbkNoYW5nZSk7XG4gICAgaWYgKCF0aHJvd09uQ2hhbmdlKSB0aGlzLmFmdGVyQ29udGVudExpZmVjeWNsZUNhbGxiYWNrcygpO1xuXG4gICAgdGhpcy5fZGV0ZWN0Q2hhbmdlc0luVmlld0NoaWxkcmVuKHRocm93T25DaGFuZ2UpO1xuICAgIGlmICghdGhyb3dPbkNoYW5nZSkgdGhpcy5hZnRlclZpZXdMaWZlY3ljbGVDYWxsYmFja3MoKTtcblxuICAgIGlmICh0aGlzLm1vZGUgPT09IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LkNoZWNrT25jZSlcbiAgICAgIHRoaXMubW9kZSA9IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LkNoZWNrZWQ7XG5cbiAgICB0aGlzLnN0YXRlID0gQ2hhbmdlRGV0ZWN0b3JTdGF0ZS5DaGVja2VkQmVmb3JlO1xuICAgIHd0ZkxlYXZlKHMpO1xuICB9XG5cbiAgLy8gVGhpcyBtZXRob2QgaXMgbm90IGludGVuZGVkIHRvIGJlIG92ZXJyaWRkZW4uIFN1YmNsYXNzZXMgc2hvdWxkIGluc3RlYWQgcHJvdmlkZSBhblxuICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBgZGV0ZWN0Q2hhbmdlc0luUmVjb3Jkc0ludGVybmFsYCB3aGljaCBkb2VzIHRoZSB3b3JrIG9mIGRldGVjdGluZyBjaGFuZ2VzXG4gIC8vIGFuZCB3aGljaCB0aGlzIG1ldGhvZCB3aWxsIGNhbGwuXG4gIC8vIFRoaXMgbWV0aG9kIGV4cGVjdHMgdGhhdCBgZGV0ZWN0Q2hhbmdlc0luUmVjb3Jkc0ludGVybmFsYCB3aWxsIHNldCB0aGUgcHJvcGVydHlcbiAgLy8gYHRoaXMucHJvcGVydHlCaW5kaW5nSW5kZXhgIHRvIHRoZSBwcm9wZXJ0eUJpbmRpbmdJbmRleCBvZiB0aGUgZmlyc3QgcHJvdG8gcmVjb3JkLiBUaGlzIGlzIHRvXG4gIC8vIGZhY2lsaXRhdGUgZXJyb3IgcmVwb3J0aW5nLlxuICBkZXRlY3RDaGFuZ2VzSW5SZWNvcmRzKHRocm93T25DaGFuZ2U6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaHlkcmF0ZWQoKSkge1xuICAgICAgdGhpcy50aHJvd0RlaHlkcmF0ZWRFcnJvcigpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgdGhpcy5kZXRlY3RDaGFuZ2VzSW5SZWNvcmRzSW50ZXJuYWwodGhyb3dPbkNoYW5nZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gdGhyb3dPbkNoYW5nZSBlcnJvcnMgYXJlbid0IGNvdW50ZWQgYXMgZmF0YWwgZXJyb3JzLlxuICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIEV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkRXhjZXB0aW9uKSkge1xuICAgICAgICB0aGlzLnN0YXRlID0gQ2hhbmdlRGV0ZWN0b3JTdGF0ZS5FcnJvcmVkO1xuICAgICAgfVxuICAgICAgdGhpcy5fdGhyb3dFcnJvcihlLCBlLnN0YWNrKTtcbiAgICB9XG4gIH1cblxuICAvLyBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwZXJmb3JtIGFueSB3b3JrIG5lY2Vzc2FyeSB0byBkZXRlY3QgYW5kIHJlcG9ydFxuICAvLyBjaGFuZ2VzLiBGb3IgZXhhbXBsZSwgY2hhbmdlcyBzaG91bGQgYmUgcmVwb3J0ZWQgdmlhIGBDaGFuZ2VEZXRlY3Rpb25VdGlsLmFkZENoYW5nZWAsIGxpZmVjeWNsZVxuICAvLyBtZXRob2RzIHNob3VsZCBiZSBjYWxsZWQsIGV0Yy5cbiAgLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYWxzbyBzZXQgYHRoaXMucHJvcGVydHlCaW5kaW5nSW5kZXhgIHRvIHRoZSBwcm9wZXJ0eUJpbmRpbmdJbmRleCBvZlxuICAvLyB0aGVcbiAgLy8gZmlyc3QgcHJvdG8gcmVjb3JkIHRvIGZhY2lsaXRhdGUgZXJyb3IgcmVwb3J0aW5nLiBTZWUge0BsaW5rICNkZXRlY3RDaGFuZ2VzSW5SZWNvcmRzfS5cbiAgZGV0ZWN0Q2hhbmdlc0luUmVjb3Jkc0ludGVybmFsKHRocm93T25DaGFuZ2U6IGJvb2xlYW4pOiB2b2lkIHt9XG5cbiAgLy8gVGhpcyBtZXRob2QgaXMgbm90IGludGVuZGVkIHRvIGJlIG92ZXJyaWRkZW4uIFN1YmNsYXNzZXMgc2hvdWxkIGluc3RlYWQgcHJvdmlkZSBhblxuICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBgaHlkcmF0ZURpcmVjdGl2ZXNgLlxuICBoeWRyYXRlKGNvbnRleHQ6IFQsIGxvY2FsczogTG9jYWxzLCBkaXJlY3RpdmVzOiBhbnksIHBpcGVzOiBQaXBlcyk6IHZvaWQge1xuICAgIHRoaXMubW9kZSA9IENoYW5nZURldGVjdGlvblV0aWwuY2hhbmdlRGV0ZWN0aW9uTW9kZSh0aGlzLnN0cmF0ZWd5KTtcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuXG4gICAgaWYgKHRoaXMuc3RyYXRlZ3kgPT09IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaE9ic2VydmUpIHtcbiAgICAgIHRoaXMub2JzZXJ2ZUNvbXBvbmVudChjb250ZXh0KTtcbiAgICB9XG5cbiAgICB0aGlzLmxvY2FscyA9IGxvY2FscztcbiAgICB0aGlzLnBpcGVzID0gcGlwZXM7XG4gICAgdGhpcy5oeWRyYXRlRGlyZWN0aXZlcyhkaXJlY3RpdmVzKTtcbiAgICB0aGlzLnN0YXRlID0gQ2hhbmdlRGV0ZWN0b3JTdGF0ZS5OZXZlckNoZWNrZWQ7XG4gIH1cblxuICAvLyBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBoeWRyYXRlIGFueSBkaXJlY3RpdmVzLlxuICBoeWRyYXRlRGlyZWN0aXZlcyhkaXJlY3RpdmVzOiBhbnkpOiB2b2lkIHt9XG5cbiAgLy8gVGhpcyBtZXRob2QgaXMgbm90IGludGVuZGVkIHRvIGJlIG92ZXJyaWRkZW4uIFN1YmNsYXNzZXMgc2hvdWxkIGluc3RlYWQgcHJvdmlkZSBhblxuICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBgZGVoeWRyYXRlRGlyZWN0aXZlc2AuXG4gIGRlaHlkcmF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlaHlkcmF0ZURpcmVjdGl2ZXModHJ1ZSk7XG5cbiAgICAvLyBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlLiBXb3JrcyBvbmx5IGluIERhcnQuXG4gICAgaWYgKHRoaXMuc3RyYXRlZ3kgPT09IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaE9ic2VydmUpIHtcbiAgICAgIHRoaXMuX3Vuc3Vic3JpYmVGcm9tT2JzZXJ2YWJsZXMoKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbnRleHQgPSBudWxsO1xuICAgIHRoaXMubG9jYWxzID0gbnVsbDtcbiAgICB0aGlzLnBpcGVzID0gbnVsbDtcbiAgfVxuXG4gIC8vIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGRlaHlkcmF0ZSBhbnkgZGlyZWN0aXZlcy4gVGhpcyBtZXRob2Qgc2hvdWxkIHJldmVyc2VcbiAgLy8gYW55IHdvcmsgZG9uZSBpbiBgaHlkcmF0ZURpcmVjdGl2ZXNgLlxuICBkZWh5ZHJhdGVEaXJlY3RpdmVzKGRlc3Ryb3lQaXBlczogYm9vbGVhbik6IHZvaWQge31cblxuICBoeWRyYXRlZCgpOiBib29sZWFuIHsgcmV0dXJuIGlzUHJlc2VudCh0aGlzLmNvbnRleHQpOyB9XG5cbiAgYWZ0ZXJDb250ZW50TGlmZWN5Y2xlQ2FsbGJhY2tzKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGF0Y2hlci5ub3RpZnlBZnRlckNvbnRlbnRDaGVja2VkKCk7XG4gICAgdGhpcy5hZnRlckNvbnRlbnRMaWZlY3ljbGVDYWxsYmFja3NJbnRlcm5hbCgpO1xuICB9XG5cbiAgYWZ0ZXJDb250ZW50TGlmZWN5Y2xlQ2FsbGJhY2tzSW50ZXJuYWwoKTogdm9pZCB7fVxuXG4gIGFmdGVyVmlld0xpZmVjeWNsZUNhbGxiYWNrcygpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BhdGNoZXIubm90aWZ5QWZ0ZXJWaWV3Q2hlY2tlZCgpO1xuICAgIHRoaXMuYWZ0ZXJWaWV3TGlmZWN5Y2xlQ2FsbGJhY2tzSW50ZXJuYWwoKTtcbiAgfVxuXG4gIGFmdGVyVmlld0xpZmVjeWNsZUNhbGxiYWNrc0ludGVybmFsKCk6IHZvaWQge31cblxuICAvKiogQGludGVybmFsICovXG4gIF9kZXRlY3RDaGFuZ2VzQ29udGVudENoaWxkcmVuKHRocm93T25DaGFuZ2U6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB2YXIgYyA9IHRoaXMuY29udGVudENoaWxkcmVuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYy5sZW5ndGg7ICsraSkge1xuICAgICAgY1tpXS5ydW5EZXRlY3RDaGFuZ2VzKHRocm93T25DaGFuZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2RldGVjdENoYW5nZXNJblZpZXdDaGlsZHJlbih0aHJvd09uQ2hhbmdlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdmFyIGMgPSB0aGlzLnZpZXdDaGlsZHJlbjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGMubGVuZ3RoOyArK2kpIHtcbiAgICAgIGNbaV0ucnVuRGV0ZWN0Q2hhbmdlcyh0aHJvd09uQ2hhbmdlKTtcbiAgICB9XG4gIH1cblxuICBtYXJrQXNDaGVja09uY2UoKTogdm9pZCB7IHRoaXMubW9kZSA9IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LkNoZWNrT25jZTsgfVxuXG4gIG1hcmtQYXRoVG9Sb290QXNDaGVja09uY2UoKTogdm9pZCB7XG4gICAgdmFyIGM6IENoYW5nZURldGVjdG9yID0gdGhpcztcbiAgICB3aGlsZSAoaXNQcmVzZW50KGMpICYmIGMubW9kZSAhPT0gQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuRGV0YWNoZWQpIHtcbiAgICAgIGlmIChjLm1vZGUgPT09IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LkNoZWNrZWQpIGMubW9kZSA9IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LkNoZWNrT25jZTtcbiAgICAgIGMgPSBjLnBhcmVudDtcbiAgICB9XG4gIH1cblxuICAvLyBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlLiBXb3JrcyBvbmx5IGluIERhcnQuXG4gIHByaXZhdGUgX3Vuc3Vic3JpYmVGcm9tT2JzZXJ2YWJsZXMoKTogdm9pZCB7XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLnN1YnNjcmlwdGlvbnMpKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3Vic2NyaXB0aW9ucy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgcyA9IHRoaXMuc3Vic2NyaXB0aW9uc1tpXTtcbiAgICAgICAgaWYgKGlzUHJlc2VudCh0aGlzLnN1YnNjcmlwdGlvbnNbaV0pKSB7XG4gICAgICAgICAgcy5jYW5jZWwoKTtcbiAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnNbaV0gPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gVGhpcyBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZS4gV29ya3Mgb25seSBpbiBEYXJ0LlxuICBvYnNlcnZlVmFsdWUodmFsdWU6IGFueSwgaW5kZXg6IG51bWJlcik6IGFueSB7XG4gICAgaWYgKGlzT2JzZXJ2YWJsZSh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZUFycmF5VG9TdG9yZU9ic2VydmFibGVzKCk7XG4gICAgICBpZiAoaXNCbGFuayh0aGlzLnN1YnNjcmlwdGlvbnNbaW5kZXhdKSkge1xuICAgICAgICB0aGlzLnN0cmVhbXNbaW5kZXhdID0gdmFsdWUuY2hhbmdlcztcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zW2luZGV4XSA9IHZhbHVlLmNoYW5nZXMubGlzdGVuKChfKSA9PiB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc3RyZWFtc1tpbmRleF0gIT09IHZhbHVlLmNoYW5nZXMpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zW2luZGV4XS5jYW5jZWwoKTtcbiAgICAgICAgdGhpcy5zdHJlYW1zW2luZGV4XSA9IHZhbHVlLmNoYW5nZXM7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uc1tpbmRleF0gPSB2YWx1ZS5jaGFuZ2VzLmxpc3RlbigoXykgPT4gdGhpcy5yZWYubWFya0ZvckNoZWNrKCkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvLyBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlLiBXb3JrcyBvbmx5IGluIERhcnQuXG4gIG9ic2VydmVEaXJlY3RpdmUodmFsdWU6IGFueSwgaW5kZXg6IG51bWJlcik6IGFueSB7XG4gICAgaWYgKGlzT2JzZXJ2YWJsZSh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZUFycmF5VG9TdG9yZU9ic2VydmFibGVzKCk7XG4gICAgICB2YXIgYXJyYXlJbmRleCA9IHRoaXMubnVtYmVyT2ZQcm9wZXJ0eVByb3RvUmVjb3JkcyArIGluZGV4ICsgMjsgIC8vICsxIGlzIGNvbXBvbmVudFxuICAgICAgdGhpcy5zdHJlYW1zW2FycmF5SW5kZXhdID0gdmFsdWUuY2hhbmdlcztcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uc1thcnJheUluZGV4XSA9IHZhbHVlLmNoYW5nZXMubGlzdGVuKChfKSA9PiB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8vIFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUuIFdvcmtzIG9ubHkgaW4gRGFydC5cbiAgb2JzZXJ2ZUNvbXBvbmVudCh2YWx1ZTogYW55KTogYW55IHtcbiAgICBpZiAoaXNPYnNlcnZhYmxlKHZhbHVlKSkge1xuICAgICAgdGhpcy5fY3JlYXRlQXJyYXlUb1N0b3JlT2JzZXJ2YWJsZXMoKTtcbiAgICAgIHZhciBpbmRleCA9IHRoaXMubnVtYmVyT2ZQcm9wZXJ0eVByb3RvUmVjb3JkcyArIDE7XG4gICAgICB0aGlzLnN0cmVhbXNbaW5kZXhdID0gdmFsdWUuY2hhbmdlcztcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uc1tpbmRleF0gPSB2YWx1ZS5jaGFuZ2VzLmxpc3RlbigoXykgPT4gdGhpcy5yZWYubWFya0ZvckNoZWNrKCkpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVBcnJheVRvU3RvcmVPYnNlcnZhYmxlcygpOiB2b2lkIHtcbiAgICBpZiAoaXNCbGFuayh0aGlzLnN1YnNjcmlwdGlvbnMpKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSBMaXN0V3JhcHBlci5jcmVhdGVGaXhlZFNpemUodGhpcy5udW1iZXJPZlByb3BlcnR5UHJvdG9SZWNvcmRzICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZUluZGljZXMubGVuZ3RoICsgMik7XG4gICAgICB0aGlzLnN0cmVhbXMgPSBMaXN0V3JhcHBlci5jcmVhdGVGaXhlZFNpemUodGhpcy5udW1iZXJPZlByb3BlcnR5UHJvdG9SZWNvcmRzICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZUluZGljZXMubGVuZ3RoICsgMik7XG4gICAgfVxuICB9XG5cbiAgZ2V0RGlyZWN0aXZlRm9yKGRpcmVjdGl2ZXM6IGFueSwgaW5kZXg6IG51bWJlcik6IGFueSB7XG4gICAgcmV0dXJuIGRpcmVjdGl2ZXMuZ2V0RGlyZWN0aXZlRm9yKHRoaXMuZGlyZWN0aXZlSW5kaWNlc1tpbmRleF0pO1xuICB9XG5cbiAgZ2V0RGV0ZWN0b3JGb3IoZGlyZWN0aXZlczogYW55LCBpbmRleDogbnVtYmVyKTogQ2hhbmdlRGV0ZWN0b3Ige1xuICAgIHJldHVybiBkaXJlY3RpdmVzLmdldERldGVjdG9yRm9yKHRoaXMuZGlyZWN0aXZlSW5kaWNlc1tpbmRleF0pO1xuICB9XG5cbiAgbm90aWZ5RGlzcGF0Y2hlcih2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5kaXNwYXRjaGVyLm5vdGlmeU9uQmluZGluZyh0aGlzLl9jdXJyZW50QmluZGluZygpLCB2YWx1ZSk7XG4gIH1cblxuICBsb2dCaW5kaW5nVXBkYXRlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BhdGNoZXIubG9nQmluZGluZ1VwZGF0ZSh0aGlzLl9jdXJyZW50QmluZGluZygpLCB2YWx1ZSk7XG4gIH1cblxuICBhZGRDaGFuZ2UoY2hhbmdlczoge1trZXk6IHN0cmluZ106IGFueX0sIG9sZFZhbHVlOiBhbnksIG5ld1ZhbHVlOiBhbnkpOiB7W2tleTogc3RyaW5nXTogYW55fSB7XG4gICAgaWYgKGlzQmxhbmsoY2hhbmdlcykpIHtcbiAgICAgIGNoYW5nZXMgPSB7fTtcbiAgICB9XG4gICAgY2hhbmdlc1t0aGlzLl9jdXJyZW50QmluZGluZygpLm5hbWVdID0gQ2hhbmdlRGV0ZWN0aW9uVXRpbC5zaW1wbGVDaGFuZ2Uob2xkVmFsdWUsIG5ld1ZhbHVlKTtcbiAgICByZXR1cm4gY2hhbmdlcztcbiAgfVxuXG4gIHByaXZhdGUgX3Rocm93RXJyb3IoZXhjZXB0aW9uOiBhbnksIHN0YWNrOiBhbnkpOiB2b2lkIHtcbiAgICB2YXIgZXJyb3I7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBjID0gdGhpcy5kaXNwYXRjaGVyLmdldERlYnVnQ29udGV4dCh0aGlzLl9jdXJyZW50QmluZGluZygpLmVsZW1lbnRJbmRleCwgbnVsbCk7XG4gICAgICB2YXIgY29udGV4dCA9IGlzUHJlc2VudChjKSA/IG5ldyBfQ29udGV4dChjLmVsZW1lbnQsIGMuY29tcG9uZW50RWxlbWVudCwgYy5jb250ZXh0LCBjLmxvY2FscyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuaW5qZWN0b3IsIHRoaXMuX2N1cnJlbnRCaW5kaW5nKCkuZGVidWcpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbDtcbiAgICAgIGVycm9yID0gbmV3IENoYW5nZURldGVjdGlvbkVycm9yKHRoaXMuX2N1cnJlbnRCaW5kaW5nKCkuZGVidWcsIGV4Y2VwdGlvbiwgc3RhY2ssIGNvbnRleHQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGlmIGFuIGVycm9yIGhhcHBlbnMgZHVyaW5nIGdldHRpbmcgdGhlIGRlYnVnIGNvbnRleHQsIHdlIHRocm93IGEgQ2hhbmdlRGV0ZWN0aW9uRXJyb3JcbiAgICAgIC8vIHdpdGhvdXQgdGhlIGV4dHJhIGluZm9ybWF0aW9uLlxuICAgICAgZXJyb3IgPSBuZXcgQ2hhbmdlRGV0ZWN0aW9uRXJyb3IobnVsbCwgZXhjZXB0aW9uLCBzdGFjaywgbnVsbCk7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgdGhyb3dPbkNoYW5nZUVycm9yKG9sZFZhbHVlOiBhbnksIG5ld1ZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aHJvdyBuZXcgRXhwcmVzc2lvbkNoYW5nZWRBZnRlckl0SGFzQmVlbkNoZWNrZWRFeGNlcHRpb24odGhpcy5fY3VycmVudEJpbmRpbmcoKS5kZWJ1ZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkVmFsdWUsIG5ld1ZhbHVlLCBudWxsKTtcbiAgfVxuXG4gIHRocm93RGVoeWRyYXRlZEVycm9yKCk6IHZvaWQgeyB0aHJvdyBuZXcgRGVoeWRyYXRlZEV4Y2VwdGlvbigpOyB9XG5cbiAgcHJpdmF0ZSBfY3VycmVudEJpbmRpbmcoKTogQmluZGluZ1RhcmdldCB7XG4gICAgcmV0dXJuIHRoaXMuYmluZGluZ1RhcmdldHNbdGhpcy5wcm9wZXJ0eUJpbmRpbmdJbmRleF07XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vYWJzdHJhY3RfY2hhbmdlX2RldGVjdG9yLnRzXG4gKiovIiwiaW1wb3J0IHtDaGFuZ2VEZXRlY3Rvcn0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3l9IGZyb20gJy4vY29uc3RhbnRzJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENoYW5nZURldGVjdG9yUmVmIHtcbiAgLyoqXG4gICAqIE1hcmtzIGFsbCB7QGxpbmsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kjT25QdXNofSBhbmNlc3RvcnMgYXMgdG8gYmUgY2hlY2tlZC5cbiAgICpcbiAgICogPCEtLSBUT0RPOiBBZGQgYSBsaW5rIHRvIGEgY2hhcHRlciBvbiBPblB1c2ggY29tcG9uZW50cyAtLT5cbiAgICpcbiAgICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L0dDNTEyYj9wPXByZXZpZXcpKVxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIEBDb21wb25lbnQoe1xuICAgKiAgIHNlbGVjdG9yOiAnY21wJyxcbiAgICogICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICogICB0ZW1wbGF0ZTogYE51bWJlciBvZiB0aWNrczoge3tudW1iZXJPZlRpY2tzfX1gXG4gICAqIH0pXG4gICAqIGNsYXNzIENtcCB7XG4gICAqICAgbnVtYmVyT2ZUaWNrcyA9IDA7XG4gICAqXG4gICAqICAgY29uc3RydWN0b3IocmVmOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICAgKiAgICAgc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgKiAgICAgICB0aGlzLm51bWJlck9mVGlja3MgKytcbiAgICogICAgICAgLy8gdGhlIGZvbGxvd2luZyBpcyByZXF1aXJlZCwgb3RoZXJ3aXNlIHRoZSB2aWV3IHdpbGwgbm90IGJlIHVwZGF0ZWRcbiAgICogICAgICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XG4gICAqICAgICB9LCAxMDAwKTtcbiAgICogICB9XG4gICAqIH1cbiAgICpcbiAgICogQENvbXBvbmVudCh7XG4gICAqICAgc2VsZWN0b3I6ICdhcHAnLFxuICAgKiAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgKiAgIHRlbXBsYXRlOiBgXG4gICAqICAgICA8Y21wPjxjbXA+XG4gICAqICAgYCxcbiAgICogICBkaXJlY3RpdmVzOiBbQ21wXVxuICAgKiB9KVxuICAgKiBjbGFzcyBBcHAge1xuICAgKiB9XG4gICAqXG4gICAqIGJvb3RzdHJhcChBcHApO1xuICAgKiBgYGBcbiAgICovXG4gIGFic3RyYWN0IG1hcmtGb3JDaGVjaygpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBEZXRhY2hlcyB0aGUgY2hhbmdlIGRldGVjdG9yIGZyb20gdGhlIGNoYW5nZSBkZXRlY3RvciB0cmVlLlxuICAgKlxuICAgKiBUaGUgZGV0YWNoZWQgY2hhbmdlIGRldGVjdG9yIHdpbGwgbm90IGJlIGNoZWNrZWQgdW50aWwgaXQgaXMgcmVhdHRhY2hlZC5cbiAgICpcbiAgICogVGhpcyBjYW4gYWxzbyBiZSB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGgge0BsaW5rIENoYW5nZURldGVjdG9yUmVmI2RldGVjdENoYW5nZXN9IHRvIGltcGxlbWVudFxuICAgKiBsb2NhbCBjaGFuZ2VcbiAgICogZGV0ZWN0aW9uIGNoZWNrcy5cbiAgICpcbiAgICogPCEtLSBUT0RPOiBBZGQgYSBsaW5rIHRvIGEgY2hhcHRlciBvbiBkZXRhY2gvcmVhdHRhY2gvbG9jYWwgZGlnZXN0IC0tPlxuICAgKiA8IS0tIFRPRE86IEFkZCBhIGxpdmUgZGVtbyBvbmNlIHJlZi5kZXRlY3RDaGFuZ2VzIGlzIG1lcmdlZCBpbnRvIG1hc3RlciAtLT5cbiAgICpcbiAgICogIyMjIEV4YW1wbGVcbiAgICpcbiAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlIGRlZmluZXMgYSBjb21wb25lbnQgd2l0aCBhIGxhcmdlIGxpc3Qgb2YgcmVhZG9ubHkgZGF0YS5cbiAgICogSW1hZ2luZSB0aGUgZGF0YSBjaGFuZ2VzIGNvbnN0YW50bHksIG1hbnkgdGltZXMgcGVyIHNlY29uZC4gRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsXG4gICAqIHdlIHdhbnQgdG8gY2hlY2sgYW5kIHVwZGF0ZSB0aGUgbGlzdCBldmVyeSBmaXZlIHNlY29uZHMuIFdlIGNhbiBkbyB0aGF0IGJ5IGRldGFjaGluZ1xuICAgKiB0aGUgY29tcG9uZW50J3MgY2hhbmdlIGRldGVjdG9yIGFuZCBkb2luZyBhIGxvY2FsIGNoZWNrIGV2ZXJ5IGZpdmUgc2Vjb25kcy5cbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjbGFzcyBEYXRhUHJvdmlkZXIge1xuICAgKiAgIC8vIGluIGEgcmVhbCBhcHBsaWNhdGlvbiB0aGUgcmV0dXJuZWQgZGF0YSB3aWxsIGJlIGRpZmZlcmVudCBldmVyeSB0aW1lXG4gICAqICAgZ2V0IGRhdGEoKSB7XG4gICAqICAgICByZXR1cm4gWzEsMiwzLDQsNV07XG4gICAqICAgfVxuICAgKiB9XG4gICAqXG4gICAqIEBDb21wb25lbnQoe1xuICAgKiAgIHNlbGVjdG9yOiAnZ2lhbnQtbGlzdCcsXG4gICAqICAgdGVtcGxhdGU6IGBcbiAgICogICAgIDxsaSAqbmdGb3I9XCIjZCBvZiBkYXRhUHJvdmlkZXIuZGF0YVwiPkRhdGEge3tkfX08L2xpZz5cbiAgICogICBgLFxuICAgKiAgIGRpcmVjdGl2ZXM6IFtOZ0Zvcl1cbiAgICogfSlcbiAgICogY2xhc3MgR2lhbnRMaXN0IHtcbiAgICogICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgZGF0YVByb3ZpZGVyOkRhdGFQcm92aWRlcikge1xuICAgKiAgICAgcmVmLmRldGFjaCgpO1xuICAgKiAgICAgc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgKiAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAqICAgICB9LCA1MDAwKTtcbiAgICogICB9XG4gICAqIH1cbiAgICpcbiAgICogQENvbXBvbmVudCh7XG4gICAqICAgc2VsZWN0b3I6ICdhcHAnLFxuICAgKiAgIHByb3ZpZGVyczogW0RhdGFQcm92aWRlcl0sXG4gICAqICAgdGVtcGxhdGU6IGBcbiAgICogICAgIDxnaWFudC1saXN0PjxnaWFudC1saXN0PlxuICAgKiAgIGAsXG4gICAqICAgZGlyZWN0aXZlczogW0dpYW50TGlzdF1cbiAgICogfSlcbiAgICogY2xhc3MgQXBwIHtcbiAgICogfVxuICAgKlxuICAgKiBib290c3RyYXAoQXBwKTtcbiAgICogYGBgXG4gICAqL1xuICBhYnN0cmFjdCBkZXRhY2goKTogdm9pZDtcblxuICAvKipcbiAgICogQ2hlY2tzIHRoZSBjaGFuZ2UgZGV0ZWN0b3IgYW5kIGl0cyBjaGlsZHJlbi5cbiAgICpcbiAgICogVGhpcyBjYW4gYWxzbyBiZSB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGgge0BsaW5rIENoYW5nZURldGVjdG9yUmVmI2RldGFjaH0gdG8gaW1wbGVtZW50IGxvY2FsXG4gICAqIGNoYW5nZSBkZXRlY3Rpb25cbiAgICogY2hlY2tzLlxuICAgKlxuICAgKiA8IS0tIFRPRE86IEFkZCBhIGxpbmsgdG8gYSBjaGFwdGVyIG9uIGRldGFjaC9yZWF0dGFjaC9sb2NhbCBkaWdlc3QgLS0+XG4gICAqIDwhLS0gVE9ETzogQWRkIGEgbGl2ZSBkZW1vIG9uY2UgcmVmLmRldGVjdENoYW5nZXMgaXMgbWVyZ2VkIGludG8gbWFzdGVyIC0tPlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZVxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVmaW5lcyBhIGNvbXBvbmVudCB3aXRoIGEgbGFyZ2UgbGlzdCBvZiByZWFkb25seSBkYXRhLlxuICAgKiBJbWFnaW5lLCB0aGUgZGF0YSBjaGFuZ2VzIGNvbnN0YW50bHksIG1hbnkgdGltZXMgcGVyIHNlY29uZC4gRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsXG4gICAqIHdlIHdhbnQgdG8gY2hlY2sgYW5kIHVwZGF0ZSB0aGUgbGlzdCBldmVyeSBmaXZlIHNlY29uZHMuXG4gICAqXG4gICAqIFdlIGNhbiBkbyB0aGF0IGJ5IGRldGFjaGluZyB0aGUgY29tcG9uZW50J3MgY2hhbmdlIGRldGVjdG9yIGFuZCBkb2luZyBhIGxvY2FsIGNoYW5nZSBkZXRlY3Rpb25cbiAgICogY2hlY2tcbiAgICogZXZlcnkgZml2ZSBzZWNvbmRzLlxuICAgKlxuICAgKiBTZWUge0BsaW5rIENoYW5nZURldGVjdG9yUmVmI2RldGFjaH0gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAqL1xuICBhYnN0cmFjdCBkZXRlY3RDaGFuZ2VzKCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENoZWNrcyB0aGUgY2hhbmdlIGRldGVjdG9yIGFuZCBpdHMgY2hpbGRyZW4sIGFuZCB0aHJvd3MgaWYgYW55IGNoYW5nZXMgYXJlIGRldGVjdGVkLlxuICAgKlxuICAgKiBUaGlzIGlzIHVzZWQgaW4gZGV2ZWxvcG1lbnQgbW9kZSB0byB2ZXJpZnkgdGhhdCBydW5uaW5nIGNoYW5nZSBkZXRlY3Rpb24gZG9lc24ndCBpbnRyb2R1Y2VcbiAgICogb3RoZXIgY2hhbmdlcy5cbiAgICovXG4gIGFic3RyYWN0IGNoZWNrTm9DaGFuZ2VzKCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJlYXR0YWNoIHRoZSBjaGFuZ2UgZGV0ZWN0b3IgdG8gdGhlIGNoYW5nZSBkZXRlY3RvciB0cmVlLlxuICAgKlxuICAgKiBUaGlzIGFsc28gbWFya3MgT25QdXNoIGFuY2VzdG9ycyBhcyB0byBiZSBjaGVja2VkLiBUaGlzIHJlYXR0YWNoZWQgY2hhbmdlIGRldGVjdG9yIHdpbGwgYmVcbiAgICogY2hlY2tlZCBkdXJpbmcgdGhlIG5leHQgY2hhbmdlIGRldGVjdGlvbiBydW4uXG4gICAqXG4gICAqIDwhLS0gVE9ETzogQWRkIGEgbGluayB0byBhIGNoYXB0ZXIgb24gZGV0YWNoL3JlYXR0YWNoL2xvY2FsIGRpZ2VzdCAtLT5cbiAgICpcbiAgICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L2FVaFpoYT9wPXByZXZpZXcpKVxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgY3JlYXRlcyBhIGNvbXBvbmVudCBkaXNwbGF5aW5nIGBsaXZlYCBkYXRhLiBUaGUgY29tcG9uZW50IHdpbGwgZGV0YWNoXG4gICAqIGl0cyBjaGFuZ2UgZGV0ZWN0b3IgZnJvbSB0aGUgbWFpbiBjaGFuZ2UgZGV0ZWN0b3IgdHJlZSB3aGVuIHRoZSBjb21wb25lbnQncyBsaXZlIHByb3BlcnR5XG4gICAqIGlzIHNldCB0byBmYWxzZS5cbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjbGFzcyBEYXRhUHJvdmlkZXIge1xuICAgKiAgIGRhdGEgPSAxO1xuICAgKlxuICAgKiAgIGNvbnN0cnVjdG9yKCkge1xuICAgKiAgICAgc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgKiAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmRhdGEgKiAyO1xuICAgKiAgICAgfSwgNTAwKTtcbiAgICogICB9XG4gICAqIH1cbiAgICpcbiAgICogQENvbXBvbmVudCh7XG4gICAqICAgc2VsZWN0b3I6ICdsaXZlLWRhdGEnLFxuICAgKiAgIGlucHV0czogWydsaXZlJ10sXG4gICAqICAgdGVtcGxhdGU6IGBEYXRhOiB7e2RhdGFQcm92aWRlci5kYXRhfX1gXG4gICAqIH0pXG4gICAqIGNsYXNzIExpdmVEYXRhIHtcbiAgICogICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgZGF0YVByb3ZpZGVyOkRhdGFQcm92aWRlcikge31cbiAgICpcbiAgICogICBzZXQgbGl2ZSh2YWx1ZSkge1xuICAgKiAgICAgaWYgKHZhbHVlKVxuICAgKiAgICAgICB0aGlzLnJlZi5yZWF0dGFjaCgpO1xuICAgKiAgICAgZWxzZVxuICAgKiAgICAgICB0aGlzLnJlZi5kZXRhY2goKTtcbiAgICogICB9XG4gICAqIH1cbiAgICpcbiAgICogQENvbXBvbmVudCh7XG4gICAqICAgc2VsZWN0b3I6ICdhcHAnLFxuICAgKiAgIHByb3ZpZGVyczogW0RhdGFQcm92aWRlcl0sXG4gICAqICAgdGVtcGxhdGU6IGBcbiAgICogICAgIExpdmUgVXBkYXRlOiA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgWyhuZ01vZGVsKV09XCJsaXZlXCI+XG4gICAqICAgICA8bGl2ZS1kYXRhIFtsaXZlXT1cImxpdmVcIj48bGl2ZS1kYXRhPlxuICAgKiAgIGAsXG4gICAqICAgZGlyZWN0aXZlczogW0xpdmVEYXRhLCBGT1JNX0RJUkVDVElWRVNdXG4gICAqIH0pXG4gICAqIGNsYXNzIEFwcCB7XG4gICAqICAgbGl2ZSA9IHRydWU7XG4gICAqIH1cbiAgICpcbiAgICogYm9vdHN0cmFwKEFwcCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYWJzdHJhY3QgcmVhdHRhY2goKTogdm9pZDtcbn1cblxuZXhwb3J0IGNsYXNzIENoYW5nZURldGVjdG9yUmVmXyBleHRlbmRzIENoYW5nZURldGVjdG9yUmVmIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfY2Q6IENoYW5nZURldGVjdG9yKSB7IHN1cGVyKCk7IH1cblxuICBtYXJrRm9yQ2hlY2soKTogdm9pZCB7IHRoaXMuX2NkLm1hcmtQYXRoVG9Sb290QXNDaGVja09uY2UoKTsgfVxuICBkZXRhY2goKTogdm9pZCB7IHRoaXMuX2NkLm1vZGUgPSBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5EZXRhY2hlZDsgfVxuICBkZXRlY3RDaGFuZ2VzKCk6IHZvaWQgeyB0aGlzLl9jZC5kZXRlY3RDaGFuZ2VzKCk7IH1cbiAgY2hlY2tOb0NoYW5nZXMoKTogdm9pZCB7IHRoaXMuX2NkLmNoZWNrTm9DaGFuZ2VzKCk7IH1cbiAgcmVhdHRhY2goKTogdm9pZCB7XG4gICAgdGhpcy5fY2QubW9kZSA9IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LkNoZWNrQWx3YXlzO1xuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vY2hhbmdlX2RldGVjdG9yX3JlZi50c1xuICoqLyIsImV4cG9ydCB7V3RmU2NvcGVGbn0gZnJvbSAnLi93dGZfaW1wbCc7XG5cbmltcG9ydCAqIGFzIGltcGwgZnJvbSBcIi4vd3RmX2ltcGxcIjtcblxuLy8gQ2hhbmdlIGV4cG9ydHMgdG8gY29uc3Qgb25jZSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci90czJkYXJ0L2lzc3Vlcy8xNTBcblxuLyoqXG4gKiBUcnVlIGlmIFdURiBpcyBlbmFibGVkLlxuICovXG5leHBvcnQgdmFyIHd0ZkVuYWJsZWQgPSBpbXBsLmRldGVjdFdURigpO1xuXG5mdW5jdGlvbiBub29wU2NvcGUoYXJnMD86IGFueSwgYXJnMT86IGFueSk6IGFueSB7XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIENyZWF0ZSB0cmFjZSBzY29wZS5cbiAqXG4gKiBTY29wZXMgbXVzdCBiZSBzdHJpY3RseSBuZXN0ZWQgYW5kIGFyZSBhbmFsb2dvdXMgdG8gc3RhY2sgZnJhbWVzLCBidXRcbiAqIGRvIG5vdCBoYXZlIHRvIGZvbGxvdyB0aGUgc3RhY2sgZnJhbWVzLiBJbnN0ZWFkIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhleSBmb2xsb3cgbG9naWNhbFxuICogbmVzdGluZy4gWW91IG1heSB3YW50IHRvIHVzZVxuICogW0V2ZW50XG4gKiBTaWduYXR1cmVzXShodHRwOi8vZ29vZ2xlLmdpdGh1Yi5pby90cmFjaW5nLWZyYW1ld29yay9pbnN0cnVtZW50aW5nLWNvZGUuaHRtbCNjdXN0b20tZXZlbnRzKVxuICogYXMgdGhleSBhcmUgZGVmaW5lZCBpbiBXVEYuXG4gKlxuICogVXNlZCB0byBtYXJrIHNjb3BlIGVudHJ5LiBUaGUgcmV0dXJuIHZhbHVlIGlzIHVzZWQgdG8gbGVhdmUgdGhlIHNjb3BlLlxuICpcbiAqICAgICB2YXIgbXlTY29wZSA9IHd0ZkNyZWF0ZVNjb3BlKCdNeUNsYXNzI215TWV0aG9kKGFzY2lpIHNvbWVWYWwpJyk7XG4gKlxuICogICAgIHNvbWVNZXRob2QoKSB7XG4gKiAgICAgICAgdmFyIHMgPSBteVNjb3BlKCdGb28nKTsgLy8gJ0ZvbycgZ2V0cyBzdG9yZWQgaW4gdHJhY2luZyBVSVxuICogICAgICAgIC8vIERPIFNPTUUgV09SSyBIRVJFXG4gKiAgICAgICAgcmV0dXJuIHd0ZkxlYXZlKHMsIDEyMyk7IC8vIFJldHVybiB2YWx1ZSAxMjNcbiAqICAgICB9XG4gKlxuICogTm90ZSwgYWRkaW5nIHRyeS1maW5hbGx5IGJsb2NrIGFyb3VuZCB0aGUgd29yayB0byBlbnN1cmUgdGhhdCBgd3RmTGVhdmVgIGdldHMgY2FsbGVkIGNhblxuICogbmVnYXRpdmVseSBpbXBhY3QgdGhlIHBlcmZvcm1hbmNlIG9mIHlvdXIgYXBwbGljYXRpb24uIEZvciB0aGlzIHJlYXNvbiB3ZSByZWNvbW1lbmQgdGhhdFxuICogeW91IGRvbid0IGFkZCB0aGVtIHRvIGVuc3VyZSB0aGF0IGB3dGZMZWF2ZWAgZ2V0cyBjYWxsZWQuIEluIHByb2R1Y3Rpb24gYHd0ZkxlYXZlYCBpcyBhIG5vb3AgYW5kXG4gKiBzbyB0cnktZmluYWxseSBibG9jayBoYXMgbm8gdmFsdWUuIFdoZW4gZGVidWdnaW5nIHBlcmYgaXNzdWVzLCBza2lwcGluZyBgd3RmTGVhdmVgLCBkbyB0b1xuICogZXhjZXB0aW9uLCB3aWxsIHByb2R1Y2UgaW5jb3JyZWN0IHRyYWNlLCBidXQgcHJlc2VuY2Ugb2YgZXhjZXB0aW9uIHNpZ25pZmllcyBsb2dpYyBlcnJvciB3aGljaFxuICogbmVlZHMgdG8gYmUgZml4ZWQgYmVmb3JlIHRoZSBhcHAgc2hvdWxkIGJlIHByb2ZpbGVkLiBBZGQgdHJ5LWZpbmFsbHkgb25seSB3aGVuIHlvdSBleHBlY3QgdGhhdFxuICogYW4gZXhjZXB0aW9uIGlzIGV4cGVjdGVkIGR1cmluZyBub3JtYWwgZXhlY3V0aW9uIHdoaWxlIHByb2ZpbGluZy5cbiAqXG4gKi9cbmV4cG9ydCB2YXIgd3RmQ3JlYXRlU2NvcGU6IChzaWduYXR1cmU6IHN0cmluZywgZmxhZ3M/OiBhbnkpID0+IGltcGwuV3RmU2NvcGVGbiA9XG4gICAgd3RmRW5hYmxlZCA/IGltcGwuY3JlYXRlU2NvcGUgOiAoc2lnbmF0dXJlOiBzdHJpbmcsIGZsYWdzPzogYW55KSA9PiBub29wU2NvcGU7XG5cbi8qKlxuICogVXNlZCB0byBtYXJrIGVuZCBvZiBTY29wZS5cbiAqXG4gKiAtIGBzY29wZWAgdG8gZW5kLlxuICogLSBgcmV0dXJuVmFsdWVgIChvcHRpb25hbCkgdG8gYmUgcGFzc2VkIHRvIHRoZSBXVEYuXG4gKlxuICogUmV0dXJucyB0aGUgYHJldHVyblZhbHVlIGZvciBlYXN5IGNoYWluaW5nLlxuICovXG5leHBvcnQgdmFyIHd0ZkxlYXZlOjxUPihzY29wZTogYW55LCByZXR1cm5WYWx1ZT86IFQpID0+IFQgPVxuICAgIHd0ZkVuYWJsZWQgPyBpbXBsLmxlYXZlIDogKHM6IGFueSwgcj86IGFueSkgPT4gcjtcblxuLyoqXG4gKiBVc2VkIHRvIG1hcmsgQXN5bmMgc3RhcnQuIEFzeW5jIGFyZSBzaW1pbGFyIHRvIHNjb3BlIGJ1dCB0aGV5IGRvbid0IGhhdmUgdG8gYmUgc3RyaWN0bHkgbmVzdGVkLlxuICogVGhlIHJldHVybiB2YWx1ZSBpcyB1c2VkIGluIHRoZSBjYWxsIHRvIFtlbmRBc3luY10uIEFzeW5jIHJhbmdlcyBvbmx5IHdvcmsgaWYgV1RGIGhhcyBiZWVuXG4gKiBlbmFibGVkLlxuICpcbiAqICAgICBzb21lTWV0aG9kKCkge1xuICogICAgICAgIHZhciBzID0gd3RmU3RhcnRUaW1lUmFuZ2UoJ0hUVFA6R0VUJywgJ3NvbWUudXJsJyk7XG4gKiAgICAgICAgdmFyIGZ1dHVyZSA9IG5ldyBGdXR1cmUuZGVsYXkoNSkudGhlbigoXykge1xuICogICAgICAgICAgd3RmRW5kVGltZVJhbmdlKHMpO1xuICogICAgICAgIH0pO1xuICogICAgIH1cbiAqL1xuZXhwb3J0IHZhciB3dGZTdGFydFRpbWVSYW5nZTogKHJhbmdlVHlwZTogc3RyaW5nLCBhY3Rpb246IHN0cmluZykgPT4gYW55ID1cbiAgICB3dGZFbmFibGVkID8gaW1wbC5zdGFydFRpbWVSYW5nZSA6IChyYW5nZVR5cGU6IHN0cmluZywgYWN0aW9uOiBzdHJpbmcpID0+IG51bGw7XG5cbi8qKlxuICogRW5kcyBhIGFzeW5jIHRpbWUgcmFuZ2Ugb3BlcmF0aW9uLlxuICogW3JhbmdlXSBpcyB0aGUgcmV0dXJuIHZhbHVlIGZyb20gW3d0ZlN0YXJ0VGltZVJhbmdlXSBBc3luYyByYW5nZXMgb25seSB3b3JrIGlmIFdURiBoYXMgYmVlblxuICogZW5hYmxlZC5cbiAqL1xuZXhwb3J0IHZhciB3dGZFbmRUaW1lUmFuZ2U6IChyYW5nZTogYW55KSA9PiB2b2lkID0gd3RmRW5hYmxlZCA/IGltcGwuZW5kVGltZVJhbmdlIDogKHI6IGFueSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvcHJvZmlsZS9wcm9maWxlLnRzXG4gKiovIiwiaW1wb3J0IHtnbG9iYWx9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5cbi8qKlxuICogQSBzY29wZSBmdW5jdGlvbiBmb3IgdGhlIFdlYiBUcmFjaW5nIEZyYW1ld29yayAoV1RGKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXdGZTY29wZUZuIHsgKGFyZzA/OiBhbnksIGFyZzE/OiBhbnkpOiBhbnk7IH1cblxuaW50ZXJmYWNlIFdURiB7XG4gIHRyYWNlOiBUcmFjZTtcbn1cblxuaW50ZXJmYWNlIFRyYWNlIHtcbiAgZXZlbnRzOiBFdmVudHM7XG4gIGxlYXZlU2NvcGUoc2NvcGU6IFNjb3BlLCByZXR1cm5WYWx1ZTogYW55KTtcbiAgYmVnaW5UaW1lUmFuZ2UocmFuZ2VUeXBlOiBzdHJpbmcsIGFjdGlvbjogc3RyaW5nKTogUmFuZ2U7XG4gIGVuZFRpbWVSYW5nZShyYW5nZTogUmFuZ2UpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJhbmdlIHt9XG5cbmludGVyZmFjZSBFdmVudHMge1xuICBjcmVhdGVTY29wZShzaWduYXR1cmU6IHN0cmluZywgZmxhZ3M6IGFueSk6IFNjb3BlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNjb3BlIHsgKC4uLmFyZ3MpOiBhbnk7IH1cblxudmFyIHRyYWNlOiBUcmFjZTtcbnZhciBldmVudHM6IEV2ZW50cztcblxuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdFdURigpOiBib29sZWFuIHtcbiAgdmFyIHd0ZjogV1RGID0gZ2xvYmFsWyd3dGYnXTtcbiAgaWYgKHd0Zikge1xuICAgIHRyYWNlID0gd3RmWyd0cmFjZSddO1xuICAgIGlmICh0cmFjZSkge1xuICAgICAgZXZlbnRzID0gdHJhY2VbJ2V2ZW50cyddO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNjb3BlKHNpZ25hdHVyZTogc3RyaW5nLCBmbGFnczogYW55ID0gbnVsbCk6IGFueSB7XG4gIHJldHVybiBldmVudHMuY3JlYXRlU2NvcGUoc2lnbmF0dXJlLCBmbGFncyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsZWF2ZTxUPihzY29wZTogU2NvcGUsIHJldHVyblZhbHVlPzogVCk6IFQge1xuICB0cmFjZS5sZWF2ZVNjb3BlKHNjb3BlLCByZXR1cm5WYWx1ZSk7XG4gIHJldHVybiByZXR1cm5WYWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0VGltZVJhbmdlKHJhbmdlVHlwZTogc3RyaW5nLCBhY3Rpb246IHN0cmluZyk6IFJhbmdlIHtcbiAgcmV0dXJuIHRyYWNlLmJlZ2luVGltZVJhbmdlKHJhbmdlVHlwZSwgYWN0aW9uKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVuZFRpbWVSYW5nZShyYW5nZTogUmFuZ2UpOiB2b2lkIHtcbiAgdHJhY2UuZW5kVGltZVJhbmdlKHJhbmdlKTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL3Byb2ZpbGUvd3RmX2ltcGwudHNcbiAqKi8iLCJleHBvcnQgZnVuY3Rpb24gaXNPYnNlcnZhYmxlKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vb2JzZXJ2YWJsZV9mYWNhZGUudHNcbiAqKi8iLCJpbXBvcnQge0JpbmRpbmdSZWNvcmR9IGZyb20gJy4vYmluZGluZ19yZWNvcmQnO1xuaW1wb3J0IHtEaXJlY3RpdmVJbmRleH0gZnJvbSAnLi9kaXJlY3RpdmVfcmVjb3JkJztcblxuZXhwb3J0IGVudW0gUmVjb3JkVHlwZSB7XG4gIFNlbGYsXG4gIENvbnN0LFxuICBQcmltaXRpdmVPcCxcbiAgUHJvcGVydHlSZWFkLFxuICBQcm9wZXJ0eVdyaXRlLFxuICBMb2NhbCxcbiAgSW52b2tlTWV0aG9kLFxuICBJbnZva2VDbG9zdXJlLFxuICBLZXllZFJlYWQsXG4gIEtleWVkV3JpdGUsXG4gIFBpcGUsXG4gIEludGVycG9sYXRlLFxuICBTYWZlUHJvcGVydHksXG4gIENvbGxlY3Rpb25MaXRlcmFsLFxuICBTYWZlTWV0aG9kSW52b2tlLFxuICBEaXJlY3RpdmVMaWZlY3ljbGUsXG4gIENoYWluLFxuICBTa2lwUmVjb3Jkc0lmLCAgICAgLy8gU2tpcCByZWNvcmRzIHdoZW4gdGhlIGNvbmRpdGlvbiBpcyB0cnVlXG4gIFNraXBSZWNvcmRzSWZOb3QsICAvLyBTa2lwIHJlY29yZHMgd2hlbiB0aGUgY29uZGl0aW9uIGlzIGZhbHNlXG4gIFNraXBSZWNvcmRzICAgICAgICAvLyBTa2lwIHJlY29yZHMgdW5jb25kaXRpb25hbGx5XG59XG5cbmV4cG9ydCBjbGFzcyBQcm90b1JlY29yZCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBtb2RlOiBSZWNvcmRUeXBlLCBwdWJsaWMgbmFtZTogc3RyaW5nLCBwdWJsaWMgZnVuY09yVmFsdWUsIHB1YmxpYyBhcmdzOiBhbnlbXSxcbiAgICAgICAgICAgICAgcHVibGljIGZpeGVkQXJnczogYW55W10sIHB1YmxpYyBjb250ZXh0SW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgcHVibGljIGRpcmVjdGl2ZUluZGV4OiBEaXJlY3RpdmVJbmRleCwgcHVibGljIHNlbGZJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICBwdWJsaWMgYmluZGluZ1JlY29yZDogQmluZGluZ1JlY29yZCwgcHVibGljIGxhc3RJbkJpbmRpbmc6IGJvb2xlYW4sXG4gICAgICAgICAgICAgIHB1YmxpYyBsYXN0SW5EaXJlY3RpdmU6IGJvb2xlYW4sIHB1YmxpYyBhcmd1bWVudFRvUHVyZUZ1bmN0aW9uOiBib29sZWFuLFxuICAgICAgICAgICAgICBwdWJsaWMgcmVmZXJlbmNlZEJ5U2VsZjogYm9vbGVhbiwgcHVibGljIHByb3BlcnR5QmluZGluZ0luZGV4OiBudW1iZXIpIHt9XG5cbiAgaXNQdXJlRnVuY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubW9kZSA9PT0gUmVjb3JkVHlwZS5JbnRlcnBvbGF0ZSB8fCB0aGlzLm1vZGUgPT09IFJlY29yZFR5cGUuQ29sbGVjdGlvbkxpdGVyYWw7XG4gIH1cblxuICBpc1VzZWRCeU90aGVyUmVjb3JkKCk6IGJvb2xlYW4geyByZXR1cm4gIXRoaXMubGFzdEluQmluZGluZyB8fCB0aGlzLnJlZmVyZW5jZWRCeVNlbGY7IH1cblxuICBzaG91bGRCZUNoZWNrZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYXJndW1lbnRUb1B1cmVGdW5jdGlvbiB8fCB0aGlzLmxhc3RJbkJpbmRpbmcgfHwgdGhpcy5pc1B1cmVGdW5jdGlvbigpIHx8XG4gICAgICAgICAgIHRoaXMuaXNQaXBlUmVjb3JkKCk7XG4gIH1cblxuICBpc1BpcGVSZWNvcmQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLm1vZGUgPT09IFJlY29yZFR5cGUuUGlwZTsgfVxuXG4gIGlzQ29uZGl0aW9uYWxTa2lwUmVjb3JkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1vZGUgPT09IFJlY29yZFR5cGUuU2tpcFJlY29yZHNJZk5vdCB8fCB0aGlzLm1vZGUgPT09IFJlY29yZFR5cGUuU2tpcFJlY29yZHNJZjtcbiAgfVxuXG4gIGlzVW5jb25kaXRpb25hbFNraXBSZWNvcmQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLm1vZGUgPT09IFJlY29yZFR5cGUuU2tpcFJlY29yZHM7IH1cblxuICBpc1NraXBSZWNvcmQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNDb25kaXRpb25hbFNraXBSZWNvcmQoKSB8fCB0aGlzLmlzVW5jb25kaXRpb25hbFNraXBSZWNvcmQoKTtcbiAgfVxuXG4gIGlzTGlmZUN5Y2xlUmVjb3JkKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5tb2RlID09PSBSZWNvcmRUeXBlLkRpcmVjdGl2ZUxpZmVjeWNsZTsgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9wcm90b19yZWNvcmQudHNcbiAqKi8iLCJpbXBvcnQge0RpcmVjdGl2ZUluZGV4fSBmcm9tICcuL2RpcmVjdGl2ZV9yZWNvcmQnO1xuaW1wb3J0IHtQcm90b1JlY29yZH0gZnJvbSAnLi9wcm90b19yZWNvcmQnO1xuXG5leHBvcnQgY2xhc3MgRXZlbnRCaW5kaW5nIHtcbiAgY29uc3RydWN0b3IocHVibGljIGV2ZW50TmFtZTogc3RyaW5nLCBwdWJsaWMgZWxJbmRleDogbnVtYmVyLCBwdWJsaWMgZGlySW5kZXg6IERpcmVjdGl2ZUluZGV4LFxuICAgICAgICAgICAgICBwdWJsaWMgcmVjb3JkczogUHJvdG9SZWNvcmRbXSkge31cbn1cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2V2ZW50X2JpbmRpbmcudHNcbiAqKi8iLCJpbXBvcnQge2lzUHJlc2VudCwgaXNCbGFuaywgbG9vc2VJZGVudGljYWx9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge0xpc3RXcmFwcGVyLCBNYXB9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge1JlY29yZFR5cGUsIFByb3RvUmVjb3JkfSBmcm9tICcuL3Byb3RvX3JlY29yZCc7XG5cbi8qKlxuICogUmVtb3ZlcyBcImR1cGxpY2F0ZVwiIHJlY29yZHMuIEl0IGFzc3VtZXMgdGhhdCByZWNvcmQgZXZhbHVhdGlvbiBkb2VzIG5vdCBoYXZlIHNpZGUtZWZmZWN0cy5cbiAqXG4gKiBSZWNvcmRzIHRoYXQgYXJlIG5vdCBsYXN0IGluIGJpbmRpbmdzIGFyZSByZW1vdmVkIGFuZCBhbGwgdGhlIGluZGljZXMgb2YgdGhlIHJlY29yZHMgdGhhdCBkZXBlbmRcbiAqIG9uIHRoZW0gYXJlIHVwZGF0ZWQuXG4gKlxuICogUmVjb3JkcyB0aGF0IGFyZSBsYXN0IGluIGJpbmRpbmdzIENBTk5PVCBiZSByZW1vdmVkLCBhbmQgaW5zdGVhZCBhcmUgcmVwbGFjZWQgd2l0aCB2ZXJ5IGNoZWFwXG4gKiBTRUxGIHJlY29yZHMuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2FsZXNjZShzcmNSZWNvcmRzOiBQcm90b1JlY29yZFtdKTogUHJvdG9SZWNvcmRbXSB7XG4gIGxldCBkc3RSZWNvcmRzID0gW107XG4gIGxldCBleGNsdWRlZElkeHMgPSBbXTtcbiAgbGV0IGluZGV4TWFwOiBNYXA8bnVtYmVyLCBudW1iZXI+ID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcbiAgbGV0IHNraXBEZXB0aCA9IDA7XG4gIGxldCBza2lwU291cmNlczogUHJvdG9SZWNvcmRbXSA9IExpc3RXcmFwcGVyLmNyZWF0ZUZpeGVkU2l6ZShzcmNSZWNvcmRzLmxlbmd0aCk7XG5cbiAgZm9yIChsZXQgcHJvdG9JbmRleCA9IDA7IHByb3RvSW5kZXggPCBzcmNSZWNvcmRzLmxlbmd0aDsgcHJvdG9JbmRleCsrKSB7XG4gICAgbGV0IHNraXBSZWNvcmQgPSBza2lwU291cmNlc1twcm90b0luZGV4XTtcbiAgICBpZiAoaXNQcmVzZW50KHNraXBSZWNvcmQpKSB7XG4gICAgICBza2lwRGVwdGgtLTtcbiAgICAgIHNraXBSZWNvcmQuZml4ZWRBcmdzWzBdID0gZHN0UmVjb3Jkcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgbGV0IHNyYyA9IHNyY1JlY29yZHNbcHJvdG9JbmRleF07XG4gICAgbGV0IGRzdCA9IF9jbG9uZUFuZFVwZGF0ZUluZGV4ZXMoc3JjLCBkc3RSZWNvcmRzLCBpbmRleE1hcCk7XG5cbiAgICBpZiAoZHN0LmlzU2tpcFJlY29yZCgpKSB7XG4gICAgICBkc3RSZWNvcmRzLnB1c2goZHN0KTtcbiAgICAgIHNraXBEZXB0aCsrO1xuICAgICAgc2tpcFNvdXJjZXNbZHN0LmZpeGVkQXJnc1swXV0gPSBkc3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCByZWNvcmQgPSBfbWF5QmVBZGRSZWNvcmQoZHN0LCBkc3RSZWNvcmRzLCBleGNsdWRlZElkeHMsIHNraXBEZXB0aCA+IDApO1xuICAgICAgaW5kZXhNYXAuc2V0KHNyYy5zZWxmSW5kZXgsIHJlY29yZC5zZWxmSW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBfb3B0aW1pemVTa2lwcyhkc3RSZWNvcmRzKTtcbn1cblxuLyoqXG4gKiAtIENvbmRpdGlvbmFsIHNraXAgb2YgMSByZWNvcmQgZm9sbG93ZWQgYnkgYW4gdW5jb25kaXRpb25hbCBza2lwIG9mIE4gYXJlIHJlcGxhY2VkIGJ5ICBhXG4gKiAgIGNvbmRpdGlvbmFsIHNraXAgb2YgTiB3aXRoIHRoZSBuZWdhdGVkIGNvbmRpdGlvbixcbiAqIC0gU2tpcHMgb2YgMCByZWNvcmRzIGFyZSByZW1vdmVkXG4gKi9cbmZ1bmN0aW9uIF9vcHRpbWl6ZVNraXBzKHNyY1JlY29yZHM6IFByb3RvUmVjb3JkW10pOiBQcm90b1JlY29yZFtdIHtcbiAgbGV0IGRzdFJlY29yZHMgPSBbXTtcbiAgbGV0IHNraXBTb3VyY2VzID0gTGlzdFdyYXBwZXIuY3JlYXRlRml4ZWRTaXplKHNyY1JlY29yZHMubGVuZ3RoKTtcbiAgbGV0IGluZGV4TWFwOiBNYXA8bnVtYmVyLCBudW1iZXI+ID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcblxuICBmb3IgKGxldCBwcm90b0luZGV4ID0gMDsgcHJvdG9JbmRleCA8IHNyY1JlY29yZHMubGVuZ3RoOyBwcm90b0luZGV4KyspIHtcbiAgICBsZXQgc2tpcFJlY29yZCA9IHNraXBTb3VyY2VzW3Byb3RvSW5kZXhdO1xuICAgIGlmIChpc1ByZXNlbnQoc2tpcFJlY29yZCkpIHtcbiAgICAgIHNraXBSZWNvcmQuZml4ZWRBcmdzWzBdID0gZHN0UmVjb3Jkcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgbGV0IHNyYyA9IHNyY1JlY29yZHNbcHJvdG9JbmRleF07XG5cbiAgICBpZiAoc3JjLmlzU2tpcFJlY29yZCgpKSB7XG4gICAgICBpZiAoc3JjLmlzQ29uZGl0aW9uYWxTa2lwUmVjb3JkKCkgJiYgc3JjLmZpeGVkQXJnc1swXSA9PT0gcHJvdG9JbmRleCArIDIgJiZcbiAgICAgICAgICBwcm90b0luZGV4IDwgc3JjUmVjb3Jkcy5sZW5ndGggLSAxICYmXG4gICAgICAgICAgc3JjUmVjb3Jkc1twcm90b0luZGV4ICsgMV0ubW9kZSA9PT0gUmVjb3JkVHlwZS5Ta2lwUmVjb3Jkcykge1xuICAgICAgICBzcmMubW9kZSA9IHNyYy5tb2RlID09PSBSZWNvcmRUeXBlLlNraXBSZWNvcmRzSWYgPyBSZWNvcmRUeXBlLlNraXBSZWNvcmRzSWZOb3QgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNvcmRUeXBlLlNraXBSZWNvcmRzSWY7XG4gICAgICAgIHNyYy5maXhlZEFyZ3NbMF0gPSBzcmNSZWNvcmRzW3Byb3RvSW5kZXggKyAxXS5maXhlZEFyZ3NbMF07XG4gICAgICAgIHByb3RvSW5kZXgrKztcbiAgICAgIH1cblxuICAgICAgaWYgKHNyYy5maXhlZEFyZ3NbMF0gPiBwcm90b0luZGV4ICsgMSkge1xuICAgICAgICBsZXQgZHN0ID0gX2Nsb25lQW5kVXBkYXRlSW5kZXhlcyhzcmMsIGRzdFJlY29yZHMsIGluZGV4TWFwKTtcbiAgICAgICAgZHN0UmVjb3Jkcy5wdXNoKGRzdCk7XG4gICAgICAgIHNraXBTb3VyY2VzW2RzdC5maXhlZEFyZ3NbMF1dID0gZHN0O1xuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBkc3QgPSBfY2xvbmVBbmRVcGRhdGVJbmRleGVzKHNyYywgZHN0UmVjb3JkcywgaW5kZXhNYXApO1xuICAgICAgZHN0UmVjb3Jkcy5wdXNoKGRzdCk7XG4gICAgICBpbmRleE1hcC5zZXQoc3JjLnNlbGZJbmRleCwgZHN0LnNlbGZJbmRleCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRzdFJlY29yZHM7XG59XG5cbi8qKlxuICogQWRkIGEgbmV3IHJlY29yZCBvciByZS11c2Ugb25lIG9mIHRoZSBleGlzdGluZyByZWNvcmRzLlxuICovXG5mdW5jdGlvbiBfbWF5QmVBZGRSZWNvcmQocmVjb3JkOiBQcm90b1JlY29yZCwgZHN0UmVjb3JkczogUHJvdG9SZWNvcmRbXSwgZXhjbHVkZWRJZHhzOiBudW1iZXJbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlZDogYm9vbGVhbik6IFByb3RvUmVjb3JkIHtcbiAgbGV0IG1hdGNoID0gX2ZpbmRGaXJzdE1hdGNoKHJlY29yZCwgZHN0UmVjb3JkcywgZXhjbHVkZWRJZHhzKTtcblxuICBpZiAoaXNQcmVzZW50KG1hdGNoKSkge1xuICAgIGlmIChyZWNvcmQubGFzdEluQmluZGluZykge1xuICAgICAgZHN0UmVjb3Jkcy5wdXNoKF9jcmVhdGVTZWxmUmVjb3JkKHJlY29yZCwgbWF0Y2guc2VsZkluZGV4LCBkc3RSZWNvcmRzLmxlbmd0aCArIDEpKTtcbiAgICAgIG1hdGNoLnJlZmVyZW5jZWRCeVNlbGYgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocmVjb3JkLmFyZ3VtZW50VG9QdXJlRnVuY3Rpb24pIHtcbiAgICAgICAgbWF0Y2guYXJndW1lbnRUb1B1cmVGdW5jdGlvbiA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoO1xuICB9XG5cbiAgaWYgKGV4Y2x1ZGVkKSB7XG4gICAgZXhjbHVkZWRJZHhzLnB1c2gocmVjb3JkLnNlbGZJbmRleCk7XG4gIH1cblxuICBkc3RSZWNvcmRzLnB1c2gocmVjb3JkKTtcbiAgcmV0dXJuIHJlY29yZDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBmaXJzdCBgUHJvdG9SZWNvcmRgIHRoYXQgbWF0Y2hlcyB0aGUgcmVjb3JkLlxuICovXG5mdW5jdGlvbiBfZmluZEZpcnN0TWF0Y2gocmVjb3JkOiBQcm90b1JlY29yZCwgZHN0UmVjb3JkczogUHJvdG9SZWNvcmRbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlZElkeHM6IG51bWJlcltdKTogUHJvdG9SZWNvcmQge1xuICByZXR1cm4gZHN0UmVjb3Jkcy5maW5kKFxuICAgICAgLy8gVE9ETyh2aWNiKTogb3B0aW1pemUgZXhjbHVkZWRJZHhzLmluZGV4T2YgKHNvcnRlZCBhcnJheSlcbiAgICAgIHJyID0+IGV4Y2x1ZGVkSWR4cy5pbmRleE9mKHJyLnNlbGZJbmRleCkgPT0gLTEgJiYgcnIubW9kZSAhPT0gUmVjb3JkVHlwZS5EaXJlY3RpdmVMaWZlY3ljbGUgJiZcbiAgICAgICAgICAgIF9oYXZlU2FtZURpckluZGV4KHJyLCByZWNvcmQpICYmIHJyLm1vZGUgPT09IHJlY29yZC5tb2RlICYmXG4gICAgICAgICAgICBsb29zZUlkZW50aWNhbChyci5mdW5jT3JWYWx1ZSwgcmVjb3JkLmZ1bmNPclZhbHVlKSAmJlxuICAgICAgICAgICAgcnIuY29udGV4dEluZGV4ID09PSByZWNvcmQuY29udGV4dEluZGV4ICYmIGxvb3NlSWRlbnRpY2FsKHJyLm5hbWUsIHJlY29yZC5uYW1lKSAmJlxuICAgICAgICAgICAgTGlzdFdyYXBwZXIuZXF1YWxzKHJyLmFyZ3MsIHJlY29yZC5hcmdzKSk7XG59XG5cbi8qKlxuICogQ2xvbmUgdGhlIGBQcm90b1JlY29yZGAgYW5kIGNoYW5nZXMgdGhlIGluZGV4ZXMgZm9yIHRoZSBvbmVzIGluIHRoZSBkZXN0aW5hdGlvbiBhcnJheSBmb3I6XG4gKiAtIHRoZSBhcmd1bWVudHMsXG4gKiAtIHRoZSBjb250ZXh0LFxuICogLSBzZWxmXG4gKi9cbmZ1bmN0aW9uIF9jbG9uZUFuZFVwZGF0ZUluZGV4ZXMocmVjb3JkOiBQcm90b1JlY29yZCwgZHN0UmVjb3JkczogUHJvdG9SZWNvcmRbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhNYXA6IE1hcDxudW1iZXIsIG51bWJlcj4pOiBQcm90b1JlY29yZCB7XG4gIGxldCBhcmdzID0gcmVjb3JkLmFyZ3MubWFwKHNyYyA9PiBfc3JjVG9Ec3RTZWxmSW5kZXgoaW5kZXhNYXAsIHNyYykpO1xuICBsZXQgY29udGV4dEluZGV4ID0gX3NyY1RvRHN0U2VsZkluZGV4KGluZGV4TWFwLCByZWNvcmQuY29udGV4dEluZGV4KTtcbiAgbGV0IHNlbGZJbmRleCA9IGRzdFJlY29yZHMubGVuZ3RoICsgMTtcblxuICByZXR1cm4gbmV3IFByb3RvUmVjb3JkKHJlY29yZC5tb2RlLCByZWNvcmQubmFtZSwgcmVjb3JkLmZ1bmNPclZhbHVlLCBhcmdzLCByZWNvcmQuZml4ZWRBcmdzLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRJbmRleCwgcmVjb3JkLmRpcmVjdGl2ZUluZGV4LCBzZWxmSW5kZXgsIHJlY29yZC5iaW5kaW5nUmVjb3JkLFxuICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZC5sYXN0SW5CaW5kaW5nLCByZWNvcmQubGFzdEluRGlyZWN0aXZlLFxuICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZC5hcmd1bWVudFRvUHVyZUZ1bmN0aW9uLCByZWNvcmQucmVmZXJlbmNlZEJ5U2VsZixcbiAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmQucHJvcGVydHlCaW5kaW5nSW5kZXgpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGluZGV4IGluIHRoZSBkZXN0aW5hdGlvbiBhcnJheSBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbmRleCBpbiB0aGUgc3JjIGFycmF5LlxuICogV2hlbiB0aGUgZWxlbWVudCBpcyBub3QgcHJlc2VudCBpbiB0aGUgZGVzdGluYXRpb24gYXJyYXksIHJldHVybiB0aGUgc291cmNlIGluZGV4LlxuICovXG5mdW5jdGlvbiBfc3JjVG9Ec3RTZWxmSW5kZXgoaW5kZXhNYXA6IE1hcDxudW1iZXIsIG51bWJlcj4sIHNyY0lkeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgdmFyIGRzdElkeCA9IGluZGV4TWFwLmdldChzcmNJZHgpO1xuICByZXR1cm4gaXNQcmVzZW50KGRzdElkeCkgPyBkc3RJZHggOiBzcmNJZHg7XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVTZWxmUmVjb3JkKHI6IFByb3RvUmVjb3JkLCBjb250ZXh0SW5kZXg6IG51bWJlciwgc2VsZkluZGV4OiBudW1iZXIpOiBQcm90b1JlY29yZCB7XG4gIHJldHVybiBuZXcgUHJvdG9SZWNvcmQoUmVjb3JkVHlwZS5TZWxmLCBcInNlbGZcIiwgbnVsbCwgW10sIHIuZml4ZWRBcmdzLCBjb250ZXh0SW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgci5kaXJlY3RpdmVJbmRleCwgc2VsZkluZGV4LCByLmJpbmRpbmdSZWNvcmQsIHIubGFzdEluQmluZGluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICByLmxhc3RJbkRpcmVjdGl2ZSwgZmFsc2UsIGZhbHNlLCByLnByb3BlcnR5QmluZGluZ0luZGV4KTtcbn1cblxuZnVuY3Rpb24gX2hhdmVTYW1lRGlySW5kZXgoYTogUHJvdG9SZWNvcmQsIGI6IFByb3RvUmVjb3JkKTogYm9vbGVhbiB7XG4gIHZhciBkaTEgPSBpc0JsYW5rKGEuZGlyZWN0aXZlSW5kZXgpID8gbnVsbCA6IGEuZGlyZWN0aXZlSW5kZXguZGlyZWN0aXZlSW5kZXg7XG4gIHZhciBlaTEgPSBpc0JsYW5rKGEuZGlyZWN0aXZlSW5kZXgpID8gbnVsbCA6IGEuZGlyZWN0aXZlSW5kZXguZWxlbWVudEluZGV4O1xuXG4gIHZhciBkaTIgPSBpc0JsYW5rKGIuZGlyZWN0aXZlSW5kZXgpID8gbnVsbCA6IGIuZGlyZWN0aXZlSW5kZXguZGlyZWN0aXZlSW5kZXg7XG4gIHZhciBlaTIgPSBpc0JsYW5rKGIuZGlyZWN0aXZlSW5kZXgpID8gbnVsbCA6IGIuZGlyZWN0aXZlSW5kZXguZWxlbWVudEluZGV4O1xuXG4gIHJldHVybiBkaTEgPT09IGRpMiAmJiBlaTEgPT09IGVpMjtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vY29hbGVzY2UudHNcbiAqKi8iLCJpbXBvcnQge0xpc3RXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtpc1ByZXNlbnR9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5cbmltcG9ydCB7UHJvdG9DaGFuZ2VEZXRlY3RvciwgQ2hhbmdlRGV0ZWN0b3IsIENoYW5nZURldGVjdG9yRGVmaW5pdGlvbn0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7Q2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3J9IGZyb20gJy4vY2hhbmdlX2RldGVjdGlvbl9qaXRfZ2VuZXJhdG9yJztcblxuZXhwb3J0IGNsYXNzIEppdFByb3RvQ2hhbmdlRGV0ZWN0b3IgaW1wbGVtZW50cyBQcm90b0NoYW5nZURldGVjdG9yIHtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZmFjdG9yeTogRnVuY3Rpb247XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkZWZpbml0aW9uOiBDaGFuZ2VEZXRlY3RvckRlZmluaXRpb24pIHtcbiAgICB0aGlzLl9mYWN0b3J5ID0gdGhpcy5fY3JlYXRlRmFjdG9yeShkZWZpbml0aW9uKTtcbiAgfVxuXG4gIHN0YXRpYyBpc1N1cHBvcnRlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRydWU7IH1cblxuICBpbnN0YW50aWF0ZShkaXNwYXRjaGVyOiBhbnkpOiBDaGFuZ2VEZXRlY3RvciB7IHJldHVybiB0aGlzLl9mYWN0b3J5KGRpc3BhdGNoZXIpOyB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfY3JlYXRlRmFjdG9yeShkZWZpbml0aW9uOiBDaGFuZ2VEZXRlY3RvckRlZmluaXRpb24pIHtcbiAgICByZXR1cm4gbmV3IENoYW5nZURldGVjdG9ySklUR2VuZXJhdG9yKGRlZmluaXRpb24sICd1dGlsJywgJ0Fic3RyYWN0Q2hhbmdlRGV0ZWN0b3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NoYW5nZURldGVjdG9yU3RhdHVzJylcbiAgICAgICAgLmdlbmVyYXRlKCk7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vaml0X3Byb3RvX2NoYW5nZV9kZXRlY3Rvci50c1xuICoqLyIsImltcG9ydCB7VHlwZSwgYXNzZXJ0aW9uc0VuYWJsZWQsIGlzQmxhbmssIGlzUHJlc2VudCwgU3RyaW5nV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7TGlzdFdyYXBwZXIsIE1hcFdyYXBwZXIsIFN0cmluZ01hcFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5cbmltcG9ydCB7QWJzdHJhY3RDaGFuZ2VEZXRlY3Rvcn0gZnJvbSAnLi9hYnN0cmFjdF9jaGFuZ2VfZGV0ZWN0b3InO1xuaW1wb3J0IHtDaGFuZ2VEZXRlY3Rpb25VdGlsfSBmcm9tICcuL2NoYW5nZV9kZXRlY3Rpb25fdXRpbCc7XG5pbXBvcnQge0RpcmVjdGl2ZUluZGV4LCBEaXJlY3RpdmVSZWNvcmR9IGZyb20gJy4vZGlyZWN0aXZlX3JlY29yZCc7XG5cbmltcG9ydCB7UHJvdG9SZWNvcmQsIFJlY29yZFR5cGV9IGZyb20gJy4vcHJvdG9fcmVjb3JkJztcbmltcG9ydCB7Q29kZWdlbk5hbWVVdGlsLCBzYW5pdGl6ZU5hbWV9IGZyb20gJy4vY29kZWdlbl9uYW1lX3V0aWwnO1xuaW1wb3J0IHtDb2RlZ2VuTG9naWNVdGlsfSBmcm9tICcuL2NvZGVnZW5fbG9naWNfdXRpbCc7XG5pbXBvcnQge2NvZGlmeX0gZnJvbSAnLi9jb2RlZ2VuX2ZhY2FkZSc7XG5pbXBvcnQge0V2ZW50QmluZGluZ30gZnJvbSAnLi9ldmVudF9iaW5kaW5nJztcbmltcG9ydCB7QmluZGluZ1RhcmdldH0gZnJvbSAnLi9iaW5kaW5nX3JlY29yZCc7XG5pbXBvcnQge0NoYW5nZURldGVjdG9yR2VuQ29uZmlnLCBDaGFuZ2VEZXRlY3RvckRlZmluaXRpb259IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQge0NoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclN0YXRlfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge2NyZWF0ZVByb3BlcnR5UmVjb3JkcywgY3JlYXRlRXZlbnRSZWNvcmRzfSBmcm9tICcuL3Byb3RvX2NoYW5nZV9kZXRlY3Rvcic7XG5cbi8qKlxuICogVGhlIGNvZGUgZ2VuZXJhdG9yIHRha2VzIGEgbGlzdCBvZiBwcm90byByZWNvcmRzIGFuZCBjcmVhdGVzIGEgZnVuY3Rpb24vY2xhc3NcbiAqIHRoYXQgXCJlbXVsYXRlc1wiIHdoYXQgdGhlIGRldmVsb3BlciB3b3VsZCB3cml0ZSBieSBoYW5kIHRvIGltcGxlbWVudCB0aGUgc2FtZVxuICoga2luZCBvZiBiZWhhdmlvdXIuXG4gKlxuICogVGhpcyBjb2RlIHNob3VsZCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgRGFydCB0cmFuc2Zvcm1lcidzXG4gKiBgYW5ndWxhcjIudHJhbnNmb3JtLnRlbXBsYXRlX2NvbXBpbGVyLmNoYW5nZV9kZXRlY3Rvcl9jb2RlZ2VuYCBsaWJyYXJ5LiBJZiB5b3UgbWFrZSB1cGRhdGVzXG4gKiBoZXJlLCBwbGVhc2UgbWFrZSBlcXVpdmFsZW50IGNoYW5nZXMgdGhlcmUuXG4qL1xuY29uc3QgSVNfQ0hBTkdFRF9MT0NBTCA9IFwiaXNDaGFuZ2VkXCI7XG5jb25zdCBDSEFOR0VTX0xPQ0FMID0gXCJjaGFuZ2VzXCI7XG5cbmV4cG9ydCBjbGFzcyBDaGFuZ2VEZXRlY3RvckpJVEdlbmVyYXRvciB7XG4gIHByaXZhdGUgX2xvZ2ljOiBDb2RlZ2VuTG9naWNVdGlsO1xuICBwcml2YXRlIF9uYW1lczogQ29kZWdlbk5hbWVVdGlsO1xuICBwcml2YXRlIF9lbmRPZkJsb2NrSWR4czogbnVtYmVyW107XG4gIHByaXZhdGUgaWQ6IHN0cmluZztcbiAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3Rpb25TdHJhdGVneTogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3k7XG4gIHByaXZhdGUgcmVjb3JkczogUHJvdG9SZWNvcmRbXTtcbiAgcHJpdmF0ZSBwcm9wZXJ0eUJpbmRpbmdUYXJnZXRzOiBCaW5kaW5nVGFyZ2V0W107XG4gIHByaXZhdGUgZXZlbnRCaW5kaW5nczogRXZlbnRCaW5kaW5nW107XG4gIHByaXZhdGUgZGlyZWN0aXZlUmVjb3JkczogYW55W107XG4gIHByaXZhdGUgZ2VuQ29uZmlnOiBDaGFuZ2VEZXRlY3RvckdlbkNvbmZpZztcbiAgdHlwZU5hbWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihkZWZpbml0aW9uOiBDaGFuZ2VEZXRlY3RvckRlZmluaXRpb24sIHByaXZhdGUgY2hhbmdlRGV0ZWN0aW9uVXRpbFZhck5hbWU6IHN0cmluZyxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBhYnN0cmFjdENoYW5nZURldGVjdG9yVmFyTmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yU3RhdGVWYXJOYW1lOiBzdHJpbmcpIHtcbiAgICB2YXIgcHJvcGVydHlCaW5kaW5nUmVjb3JkcyA9IGNyZWF0ZVByb3BlcnR5UmVjb3JkcyhkZWZpbml0aW9uKTtcbiAgICB2YXIgZXZlbnRCaW5kaW5nUmVjb3JkcyA9IGNyZWF0ZUV2ZW50UmVjb3JkcyhkZWZpbml0aW9uKTtcbiAgICB2YXIgcHJvcGVydHlCaW5kaW5nVGFyZ2V0cyA9IGRlZmluaXRpb24uYmluZGluZ1JlY29yZHMubWFwKGIgPT4gYi50YXJnZXQpO1xuICAgIHRoaXMuaWQgPSBkZWZpbml0aW9uLmlkO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kgPSBkZWZpbml0aW9uLnN0cmF0ZWd5O1xuICAgIHRoaXMuZ2VuQ29uZmlnID0gZGVmaW5pdGlvbi5nZW5Db25maWc7XG5cbiAgICB0aGlzLnJlY29yZHMgPSBwcm9wZXJ0eUJpbmRpbmdSZWNvcmRzO1xuICAgIHRoaXMucHJvcGVydHlCaW5kaW5nVGFyZ2V0cyA9IHByb3BlcnR5QmluZGluZ1RhcmdldHM7XG4gICAgdGhpcy5ldmVudEJpbmRpbmdzID0gZXZlbnRCaW5kaW5nUmVjb3JkcztcbiAgICB0aGlzLmRpcmVjdGl2ZVJlY29yZHMgPSBkZWZpbml0aW9uLmRpcmVjdGl2ZVJlY29yZHM7XG4gICAgdGhpcy5fbmFtZXMgPSBuZXcgQ29kZWdlbk5hbWVVdGlsKHRoaXMucmVjb3JkcywgdGhpcy5ldmVudEJpbmRpbmdzLCB0aGlzLmRpcmVjdGl2ZVJlY29yZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0aW9uVXRpbFZhck5hbWUpO1xuICAgIHRoaXMuX2xvZ2ljID1cbiAgICAgICAgbmV3IENvZGVnZW5Mb2dpY1V0aWwodGhpcy5fbmFtZXMsIHRoaXMuY2hhbmdlRGV0ZWN0aW9uVXRpbFZhck5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JTdGF0ZVZhck5hbWUsIHRoaXMuY2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kpO1xuICAgIHRoaXMudHlwZU5hbWUgPSBzYW5pdGl6ZU5hbWUoYENoYW5nZURldGVjdG9yXyR7dGhpcy5pZH1gKTtcbiAgfVxuXG4gIGdlbmVyYXRlKCk6IEZ1bmN0aW9uIHtcbiAgICB2YXIgZmFjdG9yeVNvdXJjZSA9IGBcbiAgICAgICR7dGhpcy5nZW5lcmF0ZVNvdXJjZSgpfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGRpc3BhdGNoZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyAke3RoaXMudHlwZU5hbWV9KGRpc3BhdGNoZXIpO1xuICAgICAgfVxuICAgIGA7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbih0aGlzLmFic3RyYWN0Q2hhbmdlRGV0ZWN0b3JWYXJOYW1lLCB0aGlzLmNoYW5nZURldGVjdGlvblV0aWxWYXJOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclN0YXRlVmFyTmFtZSwgZmFjdG9yeVNvdXJjZSkoXG4gICAgICAgIEFic3RyYWN0Q2hhbmdlRGV0ZWN0b3IsIENoYW5nZURldGVjdGlvblV0aWwsIENoYW5nZURldGVjdG9yU3RhdGUpO1xuICB9XG5cbiAgZ2VuZXJhdGVTb3VyY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFxuICAgICAgdmFyICR7dGhpcy50eXBlTmFtZX0gPSBmdW5jdGlvbiAke3RoaXMudHlwZU5hbWV9KGRpc3BhdGNoZXIpIHtcbiAgICAgICAgJHt0aGlzLmFic3RyYWN0Q2hhbmdlRGV0ZWN0b3JWYXJOYW1lfS5jYWxsKFxuICAgICAgICAgICAgdGhpcywgJHtKU09OLnN0cmluZ2lmeSh0aGlzLmlkKX0sIGRpc3BhdGNoZXIsICR7dGhpcy5yZWNvcmRzLmxlbmd0aH0sXG4gICAgICAgICAgICAke3RoaXMudHlwZU5hbWV9Lmdlbl9wcm9wZXJ0eUJpbmRpbmdUYXJnZXRzLCAke3RoaXMudHlwZU5hbWV9Lmdlbl9kaXJlY3RpdmVJbmRpY2VzLFxuICAgICAgICAgICAgJHtjb2RpZnkodGhpcy5jaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSl9KTtcbiAgICAgICAgdGhpcy5kZWh5ZHJhdGVEaXJlY3RpdmVzKGZhbHNlKTtcbiAgICAgIH1cblxuICAgICAgJHt0aGlzLnR5cGVOYW1lfS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCR7dGhpcy5hYnN0cmFjdENoYW5nZURldGVjdG9yVmFyTmFtZX0ucHJvdG90eXBlKTtcblxuICAgICAgJHt0aGlzLnR5cGVOYW1lfS5wcm90b3R5cGUuZGV0ZWN0Q2hhbmdlc0luUmVjb3Jkc0ludGVybmFsID0gZnVuY3Rpb24odGhyb3dPbkNoYW5nZSkge1xuICAgICAgICAke3RoaXMuX25hbWVzLmdlbkluaXRMb2NhbHMoKX1cbiAgICAgICAgdmFyICR7SVNfQ0hBTkdFRF9MT0NBTH0gPSBmYWxzZTtcbiAgICAgICAgdmFyICR7Q0hBTkdFU19MT0NBTH0gPSBudWxsO1xuXG4gICAgICAgICR7dGhpcy5fZ2VuQWxsUmVjb3Jkcyh0aGlzLnJlY29yZHMpfVxuICAgICAgfVxuXG4gICAgICAke3RoaXMuX21heWJlR2VuSGFuZGxlRXZlbnRJbnRlcm5hbCgpfVxuXG4gICAgICAke3RoaXMuX21heWJlR2VuQWZ0ZXJDb250ZW50TGlmZWN5Y2xlQ2FsbGJhY2tzKCl9XG5cbiAgICAgICR7dGhpcy5fbWF5YmVHZW5BZnRlclZpZXdMaWZlY3ljbGVDYWxsYmFja3MoKX1cblxuICAgICAgJHt0aGlzLl9tYXliZUdlbkh5ZHJhdGVEaXJlY3RpdmVzKCl9XG5cbiAgICAgICR7dGhpcy5fbWF5YmVHZW5EZWh5ZHJhdGVEaXJlY3RpdmVzKCl9XG5cbiAgICAgICR7dGhpcy5fZ2VuUHJvcGVydHlCaW5kaW5nVGFyZ2V0cygpfVxuXG4gICAgICAke3RoaXMuX2dlbkRpcmVjdGl2ZUluZGljZXMoKX1cbiAgICBgO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZ2VuUHJvcGVydHlCaW5kaW5nVGFyZ2V0cygpOiBzdHJpbmcge1xuICAgIHZhciB0YXJnZXRzID0gdGhpcy5fbG9naWMuZ2VuUHJvcGVydHlCaW5kaW5nVGFyZ2V0cyh0aGlzLnByb3BlcnR5QmluZGluZ1RhcmdldHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuQ29uZmlnLmdlbkRlYnVnSW5mbyk7XG4gICAgcmV0dXJuIGAke3RoaXMudHlwZU5hbWV9Lmdlbl9wcm9wZXJ0eUJpbmRpbmdUYXJnZXRzID0gJHt0YXJnZXRzfTtgO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZ2VuRGlyZWN0aXZlSW5kaWNlcygpOiBzdHJpbmcge1xuICAgIHZhciBpbmRpY2VzID0gdGhpcy5fbG9naWMuZ2VuRGlyZWN0aXZlSW5kaWNlcyh0aGlzLmRpcmVjdGl2ZVJlY29yZHMpO1xuICAgIHJldHVybiBgJHt0aGlzLnR5cGVOYW1lfS5nZW5fZGlyZWN0aXZlSW5kaWNlcyA9ICR7aW5kaWNlc307YDtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX21heWJlR2VuSGFuZGxlRXZlbnRJbnRlcm5hbCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmV2ZW50QmluZGluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgdmFyIGhhbmRsZXJzID0gdGhpcy5ldmVudEJpbmRpbmdzLm1hcChlYiA9PiB0aGlzLl9nZW5FdmVudEJpbmRpbmcoZWIpKS5qb2luKFwiXFxuXCIpO1xuICAgICAgcmV0dXJuIGBcbiAgICAgICAgJHt0aGlzLnR5cGVOYW1lfS5wcm90b3R5cGUuaGFuZGxlRXZlbnRJbnRlcm5hbCA9IGZ1bmN0aW9uKGV2ZW50TmFtZSwgZWxJbmRleCwgbG9jYWxzKSB7XG4gICAgICAgICAgdmFyICR7dGhpcy5fbmFtZXMuZ2V0UHJldmVudERlZmF1bHRBY2Nlc29yKCl9ID0gZmFsc2U7XG4gICAgICAgICAgJHt0aGlzLl9uYW1lcy5nZW5Jbml0RXZlbnRMb2NhbHMoKX1cbiAgICAgICAgICAke2hhbmRsZXJzfVxuICAgICAgICAgIHJldHVybiAke3RoaXMuX25hbWVzLmdldFByZXZlbnREZWZhdWx0QWNjZXNvcigpfTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2dlbkV2ZW50QmluZGluZyhlYjogRXZlbnRCaW5kaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgY29kZXM6IFN0cmluZ1tdID0gW107XG4gICAgdGhpcy5fZW5kT2ZCbG9ja0lkeHMgPSBbXTtcblxuICAgIExpc3RXcmFwcGVyLmZvckVhY2hXaXRoSW5kZXgoZWIucmVjb3JkcywgKHIsIGkpID0+IHtcbiAgICAgIGxldCBjb2RlO1xuXG4gICAgICBpZiAoci5pc0NvbmRpdGlvbmFsU2tpcFJlY29yZCgpKSB7XG4gICAgICAgIGNvZGUgPSB0aGlzLl9nZW5Db25kaXRpb25hbFNraXAociwgdGhpcy5fbmFtZXMuZ2V0RXZlbnRMb2NhbE5hbWUoZWIsIGkpKTtcbiAgICAgIH0gZWxzZSBpZiAoci5pc1VuY29uZGl0aW9uYWxTa2lwUmVjb3JkKCkpIHtcbiAgICAgICAgY29kZSA9IHRoaXMuX2dlblVuY29uZGl0aW9uYWxTa2lwKHIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29kZSA9IHRoaXMuX2dlbkV2ZW50QmluZGluZ0V2YWwoZWIsIHIpO1xuICAgICAgfVxuXG4gICAgICBjb2RlICs9IHRoaXMuX2dlbkVuZE9mU2tpcEJsb2NrKGkpO1xuXG4gICAgICBjb2Rlcy5wdXNoKGNvZGUpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGBcbiAgICBpZiAoZXZlbnROYW1lID09PSBcIiR7ZWIuZXZlbnROYW1lfVwiICYmIGVsSW5kZXggPT09ICR7ZWIuZWxJbmRleH0pIHtcbiAgICAgICR7Y29kZXMuam9pbihcIlxcblwiKX1cbiAgICB9YDtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2dlbkV2ZW50QmluZGluZ0V2YWwoZWI6IEV2ZW50QmluZGluZywgcjogUHJvdG9SZWNvcmQpOiBzdHJpbmcge1xuICAgIGlmIChyLmxhc3RJbkJpbmRpbmcpIHtcbiAgICAgIHZhciBldmFsUmVjb3JkID0gdGhpcy5fbG9naWMuZ2VuRXZlbnRCaW5kaW5nRXZhbFZhbHVlKGViLCByKTtcbiAgICAgIHZhciBtYXJrUGF0aCA9IHRoaXMuX2dlbk1hcmtQYXRoVG9Sb290QXNDaGVja09uY2Uocik7XG4gICAgICB2YXIgcHJldkRlZmF1bHQgPSB0aGlzLl9nZW5VcGRhdGVQcmV2ZW50RGVmYXVsdChlYiwgcik7XG4gICAgICByZXR1cm4gYCR7ZXZhbFJlY29yZH1cXG4ke21hcmtQYXRofVxcbiR7cHJldkRlZmF1bHR9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX2xvZ2ljLmdlbkV2ZW50QmluZGluZ0V2YWxWYWx1ZShlYiwgcik7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZ2VuTWFya1BhdGhUb1Jvb3RBc0NoZWNrT25jZShyOiBQcm90b1JlY29yZCk6IHN0cmluZyB7XG4gICAgdmFyIGJyID0gci5iaW5kaW5nUmVjb3JkO1xuICAgIGlmIChici5pc0RlZmF1bHRDaGFuZ2VEZXRlY3Rpb24oKSkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLl9uYW1lcy5nZXREZXRlY3Rvck5hbWUoYnIuZGlyZWN0aXZlUmVjb3JkLmRpcmVjdGl2ZUluZGV4KX0ubWFya1BhdGhUb1Jvb3RBc0NoZWNrT25jZSgpO2A7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZ2VuVXBkYXRlUHJldmVudERlZmF1bHQoZWI6IEV2ZW50QmluZGluZywgcjogUHJvdG9SZWNvcmQpOiBzdHJpbmcge1xuICAgIHZhciBsb2NhbCA9IHRoaXMuX25hbWVzLmdldEV2ZW50TG9jYWxOYW1lKGViLCByLnNlbGZJbmRleCk7XG4gICAgcmV0dXJuIGBpZiAoJHtsb2NhbH0gPT09IGZhbHNlKSB7ICR7dGhpcy5fbmFtZXMuZ2V0UHJldmVudERlZmF1bHRBY2Nlc29yKCl9ID0gdHJ1ZX07YDtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX21heWJlR2VuRGVoeWRyYXRlRGlyZWN0aXZlcygpOiBzdHJpbmcge1xuICAgIHZhciBkZXN0cm95UGlwZXNDb2RlID0gdGhpcy5fbmFtZXMuZ2VuUGlwZU9uRGVzdHJveSgpO1xuICAgIGlmIChkZXN0cm95UGlwZXNDb2RlKSB7XG4gICAgICBkZXN0cm95UGlwZXNDb2RlID0gYGlmIChkZXN0cm95UGlwZXMpIHsgJHtkZXN0cm95UGlwZXNDb2RlfSB9YDtcbiAgICB9XG4gICAgdmFyIGRlaHlkcmF0ZUZpZWxkc0NvZGUgPSB0aGlzLl9uYW1lcy5nZW5EZWh5ZHJhdGVGaWVsZHMoKTtcbiAgICBpZiAoIWRlc3Ryb3lQaXBlc0NvZGUgJiYgIWRlaHlkcmF0ZUZpZWxkc0NvZGUpIHJldHVybiAnJztcbiAgICByZXR1cm4gYCR7dGhpcy50eXBlTmFtZX0ucHJvdG90eXBlLmRlaHlkcmF0ZURpcmVjdGl2ZXMgPSBmdW5jdGlvbihkZXN0cm95UGlwZXMpIHtcbiAgICAgICAgJHtkZXN0cm95UGlwZXNDb2RlfVxuICAgICAgICAke2RlaHlkcmF0ZUZpZWxkc0NvZGV9XG4gICAgfWA7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9tYXliZUdlbkh5ZHJhdGVEaXJlY3RpdmVzKCk6IHN0cmluZyB7XG4gICAgdmFyIGh5ZHJhdGVEaXJlY3RpdmVzQ29kZSA9IHRoaXMuX2xvZ2ljLmdlbkh5ZHJhdGVEaXJlY3RpdmVzKHRoaXMuZGlyZWN0aXZlUmVjb3Jkcyk7XG4gICAgdmFyIGh5ZHJhdGVEZXRlY3RvcnNDb2RlID0gdGhpcy5fbG9naWMuZ2VuSHlkcmF0ZURldGVjdG9ycyh0aGlzLmRpcmVjdGl2ZVJlY29yZHMpO1xuICAgIGlmICghaHlkcmF0ZURpcmVjdGl2ZXNDb2RlICYmICFoeWRyYXRlRGV0ZWN0b3JzQ29kZSkgcmV0dXJuICcnO1xuICAgIHJldHVybiBgJHt0aGlzLnR5cGVOYW1lfS5wcm90b3R5cGUuaHlkcmF0ZURpcmVjdGl2ZXMgPSBmdW5jdGlvbihkaXJlY3RpdmVzKSB7XG4gICAgICAke2h5ZHJhdGVEaXJlY3RpdmVzQ29kZX1cbiAgICAgICR7aHlkcmF0ZURldGVjdG9yc0NvZGV9XG4gICAgfWA7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9tYXliZUdlbkFmdGVyQ29udGVudExpZmVjeWNsZUNhbGxiYWNrcygpOiBzdHJpbmcge1xuICAgIHZhciBub3RpZmljYXRpb25zID0gdGhpcy5fbG9naWMuZ2VuQ29udGVudExpZmVjeWNsZUNhbGxiYWNrcyh0aGlzLmRpcmVjdGl2ZVJlY29yZHMpO1xuICAgIGlmIChub3RpZmljYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBkaXJlY3RpdmVOb3RpZmljYXRpb25zID0gbm90aWZpY2F0aW9ucy5qb2luKFwiXFxuXCIpO1xuICAgICAgcmV0dXJuIGBcbiAgICAgICAgJHt0aGlzLnR5cGVOYW1lfS5wcm90b3R5cGUuYWZ0ZXJDb250ZW50TGlmZWN5Y2xlQ2FsbGJhY2tzSW50ZXJuYWwgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAke2RpcmVjdGl2ZU5vdGlmaWNhdGlvbnN9XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9tYXliZUdlbkFmdGVyVmlld0xpZmVjeWNsZUNhbGxiYWNrcygpOiBzdHJpbmcge1xuICAgIHZhciBub3RpZmljYXRpb25zID0gdGhpcy5fbG9naWMuZ2VuVmlld0xpZmVjeWNsZUNhbGxiYWNrcyh0aGlzLmRpcmVjdGl2ZVJlY29yZHMpO1xuICAgIGlmIChub3RpZmljYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBkaXJlY3RpdmVOb3RpZmljYXRpb25zID0gbm90aWZpY2F0aW9ucy5qb2luKFwiXFxuXCIpO1xuICAgICAgcmV0dXJuIGBcbiAgICAgICAgJHt0aGlzLnR5cGVOYW1lfS5wcm90b3R5cGUuYWZ0ZXJWaWV3TGlmZWN5Y2xlQ2FsbGJhY2tzSW50ZXJuYWwgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAke2RpcmVjdGl2ZU5vdGlmaWNhdGlvbnN9XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9nZW5BbGxSZWNvcmRzKHJzOiBQcm90b1JlY29yZFtdKTogc3RyaW5nIHtcbiAgICB2YXIgY29kZXM6IFN0cmluZ1tdID0gW107XG4gICAgdGhpcy5fZW5kT2ZCbG9ja0lkeHMgPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBjb2RlO1xuICAgICAgbGV0IHIgPSByc1tpXTtcblxuICAgICAgaWYgKHIuaXNMaWZlQ3ljbGVSZWNvcmQoKSkge1xuICAgICAgICBjb2RlID0gdGhpcy5fZ2VuRGlyZWN0aXZlTGlmZWN5Y2xlKHIpO1xuICAgICAgfSBlbHNlIGlmIChyLmlzUGlwZVJlY29yZCgpKSB7XG4gICAgICAgIGNvZGUgPSB0aGlzLl9nZW5QaXBlQ2hlY2socik7XG4gICAgICB9IGVsc2UgaWYgKHIuaXNDb25kaXRpb25hbFNraXBSZWNvcmQoKSkge1xuICAgICAgICBjb2RlID0gdGhpcy5fZ2VuQ29uZGl0aW9uYWxTa2lwKHIsIHRoaXMuX25hbWVzLmdldExvY2FsTmFtZShyLmNvbnRleHRJbmRleCkpO1xuICAgICAgfSBlbHNlIGlmIChyLmlzVW5jb25kaXRpb25hbFNraXBSZWNvcmQoKSkge1xuICAgICAgICBjb2RlID0gdGhpcy5fZ2VuVW5jb25kaXRpb25hbFNraXAocik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2RlID0gdGhpcy5fZ2VuUmVmZXJlbmNlQ2hlY2socik7XG4gICAgICB9XG5cbiAgICAgIGNvZGUgPSBgXG4gICAgICAgICR7dGhpcy5fbWF5YmVGaXJzdEluQmluZGluZyhyKX1cbiAgICAgICAgJHtjb2RlfVxuICAgICAgICAke3RoaXMuX21heWJlR2VuTGFzdEluRGlyZWN0aXZlKHIpfVxuICAgICAgICAke3RoaXMuX2dlbkVuZE9mU2tpcEJsb2NrKGkpfVxuICAgICAgYDtcblxuICAgICAgY29kZXMucHVzaChjb2RlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29kZXMuam9pbihcIlxcblwiKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2dlbkNvbmRpdGlvbmFsU2tpcChyOiBQcm90b1JlY29yZCwgY29uZGl0aW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBtYXliZU5lZ2F0ZSA9IHIubW9kZSA9PT0gUmVjb3JkVHlwZS5Ta2lwUmVjb3Jkc0lmID8gJyEnIDogJyc7XG4gICAgdGhpcy5fZW5kT2ZCbG9ja0lkeHMucHVzaChyLmZpeGVkQXJnc1swXSAtIDEpO1xuXG4gICAgcmV0dXJuIGBpZiAoJHttYXliZU5lZ2F0ZX0ke2NvbmRpdGlvbn0pIHtgO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZ2VuVW5jb25kaXRpb25hbFNraXAocjogUHJvdG9SZWNvcmQpOiBzdHJpbmcge1xuICAgIHRoaXMuX2VuZE9mQmxvY2tJZHhzLnBvcCgpO1xuICAgIHRoaXMuX2VuZE9mQmxvY2tJZHhzLnB1c2goci5maXhlZEFyZ3NbMF0gLSAxKTtcbiAgICByZXR1cm4gYH0gZWxzZSB7YDtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2dlbkVuZE9mU2tpcEJsb2NrKHByb3RvSW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKCFMaXN0V3JhcHBlci5pc0VtcHR5KHRoaXMuX2VuZE9mQmxvY2tJZHhzKSkge1xuICAgICAgbGV0IGVuZE9mQmxvY2sgPSBMaXN0V3JhcHBlci5sYXN0KHRoaXMuX2VuZE9mQmxvY2tJZHhzKTtcbiAgICAgIGlmIChwcm90b0luZGV4ID09PSBlbmRPZkJsb2NrKSB7XG4gICAgICAgIHRoaXMuX2VuZE9mQmxvY2tJZHhzLnBvcCgpO1xuICAgICAgICByZXR1cm4gJ30nO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2dlbkRpcmVjdGl2ZUxpZmVjeWNsZShyOiBQcm90b1JlY29yZCk6IHN0cmluZyB7XG4gICAgaWYgKHIubmFtZSA9PT0gXCJEb0NoZWNrXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZW5PbkNoZWNrKHIpO1xuICAgIH0gZWxzZSBpZiAoci5uYW1lID09PSBcIk9uSW5pdFwiKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2VuT25Jbml0KHIpO1xuICAgIH0gZWxzZSBpZiAoci5uYW1lID09PSBcIk9uQ2hhbmdlc1wiKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2VuT25DaGFuZ2Uocik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBVbmtub3duIGxpZmVjeWNsZSBldmVudCAnJHtyLm5hbWV9J2ApO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2dlblBpcGVDaGVjayhyOiBQcm90b1JlY29yZCk6IHN0cmluZyB7XG4gICAgdmFyIGNvbnRleHQgPSB0aGlzLl9uYW1lcy5nZXRMb2NhbE5hbWUoci5jb250ZXh0SW5kZXgpO1xuICAgIHZhciBhcmdTdHJpbmcgPSByLmFyZ3MubWFwKChhcmcpID0+IHRoaXMuX25hbWVzLmdldExvY2FsTmFtZShhcmcpKS5qb2luKFwiLCBcIik7XG5cbiAgICB2YXIgb2xkVmFsdWUgPSB0aGlzLl9uYW1lcy5nZXRGaWVsZE5hbWUoci5zZWxmSW5kZXgpO1xuICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMuX25hbWVzLmdldExvY2FsTmFtZShyLnNlbGZJbmRleCk7XG5cbiAgICB2YXIgcGlwZSA9IHRoaXMuX25hbWVzLmdldFBpcGVOYW1lKHIuc2VsZkluZGV4KTtcbiAgICB2YXIgcGlwZU5hbWUgPSByLm5hbWU7XG5cbiAgICB2YXIgaW5pdCA9IGBcbiAgICAgIGlmICgke3BpcGV9ID09PSAke3RoaXMuY2hhbmdlRGV0ZWN0aW9uVXRpbFZhck5hbWV9LnVuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgJHtwaXBlfSA9ICR7dGhpcy5fbmFtZXMuZ2V0UGlwZXNBY2Nlc3Nvck5hbWUoKX0uZ2V0KCcke3BpcGVOYW1lfScpO1xuICAgICAgfVxuICAgIGA7XG4gICAgdmFyIHJlYWQgPSBgJHtuZXdWYWx1ZX0gPSAke3BpcGV9LnBpcGUudHJhbnNmb3JtKCR7Y29udGV4dH0sIFske2FyZ1N0cmluZ31dKTtgO1xuXG4gICAgdmFyIGNvbnRleE9yQXJnQ2hlY2sgPSByLmFyZ3MubWFwKChhKSA9PiB0aGlzLl9uYW1lcy5nZXRDaGFuZ2VOYW1lKGEpKTtcbiAgICBjb250ZXhPckFyZ0NoZWNrLnB1c2godGhpcy5fbmFtZXMuZ2V0Q2hhbmdlTmFtZShyLmNvbnRleHRJbmRleCkpO1xuICAgIHZhciBjb25kaXRpb24gPSBgISR7cGlwZX0ucHVyZSB8fCAoJHtjb250ZXhPckFyZ0NoZWNrLmpvaW4oXCIgfHwgXCIpfSlgO1xuXG4gICAgdmFyIGNoZWNrID0gYFxuICAgICAgaWYgKCR7dGhpcy5jaGFuZ2VEZXRlY3Rpb25VdGlsVmFyTmFtZX0ubG9vc2VOb3RJZGVudGljYWwoJHtvbGRWYWx1ZX0sICR7bmV3VmFsdWV9KSkge1xuICAgICAgICAke25ld1ZhbHVlfSA9ICR7dGhpcy5jaGFuZ2VEZXRlY3Rpb25VdGlsVmFyTmFtZX0udW53cmFwVmFsdWUoJHtuZXdWYWx1ZX0pXG4gICAgICAgICR7dGhpcy5fZ2VuQ2hhbmdlTWFya2VyKHIpfVxuICAgICAgICAke3RoaXMuX2dlblVwZGF0ZURpcmVjdGl2ZU9yRWxlbWVudChyKX1cbiAgICAgICAgJHt0aGlzLl9nZW5BZGRUb0NoYW5nZXMocil9XG4gICAgICAgICR7b2xkVmFsdWV9ID0gJHtuZXdWYWx1ZX07XG4gICAgICB9XG4gICAgYDtcblxuICAgIHZhciBnZW5Db2RlID0gci5zaG91bGRCZUNoZWNrZWQoKSA/IGAke3JlYWR9JHtjaGVja31gIDogcmVhZDtcblxuICAgIGlmIChyLmlzVXNlZEJ5T3RoZXJSZWNvcmQoKSkge1xuICAgICAgcmV0dXJuIGAke2luaXR9IGlmICgke2NvbmRpdGlvbn0pIHsgJHtnZW5Db2RlfSB9IGVsc2UgeyAke25ld1ZhbHVlfSA9ICR7b2xkVmFsdWV9OyB9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGAke2luaXR9IGlmICgke2NvbmRpdGlvbn0pIHsgJHtnZW5Db2RlfSB9YDtcbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9nZW5SZWZlcmVuY2VDaGVjayhyOiBQcm90b1JlY29yZCk6IHN0cmluZyB7XG4gICAgdmFyIG9sZFZhbHVlID0gdGhpcy5fbmFtZXMuZ2V0RmllbGROYW1lKHIuc2VsZkluZGV4KTtcbiAgICB2YXIgbmV3VmFsdWUgPSB0aGlzLl9uYW1lcy5nZXRMb2NhbE5hbWUoci5zZWxmSW5kZXgpO1xuICAgIHZhciByZWFkID0gYFxuICAgICAgJHt0aGlzLl9sb2dpYy5nZW5Qcm9wZXJ0eUJpbmRpbmdFdmFsVmFsdWUocil9XG4gICAgYDtcblxuICAgIHZhciBjaGVjayA9IGBcbiAgICAgIGlmICgke3RoaXMuY2hhbmdlRGV0ZWN0aW9uVXRpbFZhck5hbWV9Lmxvb3NlTm90SWRlbnRpY2FsKCR7b2xkVmFsdWV9LCAke25ld1ZhbHVlfSkpIHtcbiAgICAgICAgJHt0aGlzLl9nZW5DaGFuZ2VNYXJrZXIocil9XG4gICAgICAgICR7dGhpcy5fZ2VuVXBkYXRlRGlyZWN0aXZlT3JFbGVtZW50KHIpfVxuICAgICAgICAke3RoaXMuX2dlbkFkZFRvQ2hhbmdlcyhyKX1cbiAgICAgICAgJHtvbGRWYWx1ZX0gPSAke25ld1ZhbHVlfTtcbiAgICAgIH1cbiAgICBgO1xuXG4gICAgdmFyIGdlbkNvZGUgPSByLnNob3VsZEJlQ2hlY2tlZCgpID8gYCR7cmVhZH0ke2NoZWNrfWAgOiByZWFkO1xuXG4gICAgaWYgKHIuaXNQdXJlRnVuY3Rpb24oKSkge1xuICAgICAgdmFyIGNvbmRpdGlvbiA9IHIuYXJncy5tYXAoKGEpID0+IHRoaXMuX25hbWVzLmdldENoYW5nZU5hbWUoYSkpLmpvaW4oXCIgfHwgXCIpO1xuICAgICAgaWYgKHIuaXNVc2VkQnlPdGhlclJlY29yZCgpKSB7XG4gICAgICAgIHJldHVybiBgaWYgKCR7Y29uZGl0aW9ufSkgeyAke2dlbkNvZGV9IH0gZWxzZSB7ICR7bmV3VmFsdWV9ID0gJHtvbGRWYWx1ZX07IH1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGBpZiAoJHtjb25kaXRpb259KSB7ICR7Z2VuQ29kZX0gfWA7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBnZW5Db2RlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2dlbkNoYW5nZU1hcmtlcihyOiBQcm90b1JlY29yZCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHIuYXJndW1lbnRUb1B1cmVGdW5jdGlvbiA/IGAke3RoaXMuX25hbWVzLmdldENoYW5nZU5hbWUoci5zZWxmSW5kZXgpfSA9IHRydWVgIDogYGA7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9nZW5VcGRhdGVEaXJlY3RpdmVPckVsZW1lbnQocjogUHJvdG9SZWNvcmQpOiBzdHJpbmcge1xuICAgIGlmICghci5sYXN0SW5CaW5kaW5nKSByZXR1cm4gXCJcIjtcblxuICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMuX25hbWVzLmdldExvY2FsTmFtZShyLnNlbGZJbmRleCk7XG4gICAgdmFyIG9sZFZhbHVlID0gdGhpcy5fbmFtZXMuZ2V0RmllbGROYW1lKHIuc2VsZkluZGV4KTtcbiAgICB2YXIgbm90aWZ5RGVidWcgPSB0aGlzLmdlbkNvbmZpZy5sb2dCaW5kaW5nVXBkYXRlID8gYHRoaXMubG9nQmluZGluZ1VwZGF0ZSgke25ld1ZhbHVlfSk7YCA6IFwiXCI7XG5cbiAgICB2YXIgYnIgPSByLmJpbmRpbmdSZWNvcmQ7XG4gICAgaWYgKGJyLnRhcmdldC5pc0RpcmVjdGl2ZSgpKSB7XG4gICAgICB2YXIgZGlyZWN0aXZlUHJvcGVydHkgPVxuICAgICAgICAgIGAke3RoaXMuX25hbWVzLmdldERpcmVjdGl2ZU5hbWUoYnIuZGlyZWN0aXZlUmVjb3JkLmRpcmVjdGl2ZUluZGV4KX0uJHtici50YXJnZXQubmFtZX1gO1xuICAgICAgcmV0dXJuIGBcbiAgICAgICAgJHt0aGlzLl9nZW5UaHJvd09uQ2hhbmdlQ2hlY2sob2xkVmFsdWUsIG5ld1ZhbHVlKX1cbiAgICAgICAgJHtkaXJlY3RpdmVQcm9wZXJ0eX0gPSAke25ld1ZhbHVlfTtcbiAgICAgICAgJHtub3RpZnlEZWJ1Z31cbiAgICAgICAgJHtJU19DSEFOR0VEX0xPQ0FMfSA9IHRydWU7XG4gICAgICBgO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYFxuICAgICAgICAke3RoaXMuX2dlblRocm93T25DaGFuZ2VDaGVjayhvbGRWYWx1ZSwgbmV3VmFsdWUpfVxuICAgICAgICB0aGlzLm5vdGlmeURpc3BhdGNoZXIoJHtuZXdWYWx1ZX0pO1xuICAgICAgICAke25vdGlmeURlYnVnfVxuICAgICAgYDtcbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9nZW5UaHJvd09uQ2hhbmdlQ2hlY2sob2xkVmFsdWU6IHN0cmluZywgbmV3VmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGFzc2VydGlvbnNFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybiBgXG4gICAgICAgIGlmKHRocm93T25DaGFuZ2UpIHtcbiAgICAgICAgICB0aGlzLnRocm93T25DaGFuZ2VFcnJvcigke29sZFZhbHVlfSwgJHtuZXdWYWx1ZX0pO1xuICAgICAgICB9XG4gICAgICAgIGA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9nZW5BZGRUb0NoYW5nZXMocjogUHJvdG9SZWNvcmQpOiBzdHJpbmcge1xuICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMuX25hbWVzLmdldExvY2FsTmFtZShyLnNlbGZJbmRleCk7XG4gICAgdmFyIG9sZFZhbHVlID0gdGhpcy5fbmFtZXMuZ2V0RmllbGROYW1lKHIuc2VsZkluZGV4KTtcbiAgICBpZiAoIXIuYmluZGluZ1JlY29yZC5jYWxsT25DaGFuZ2VzKCkpIHJldHVybiBcIlwiO1xuICAgIHJldHVybiBgJHtDSEFOR0VTX0xPQ0FMfSA9IHRoaXMuYWRkQ2hhbmdlKCR7Q0hBTkdFU19MT0NBTH0sICR7b2xkVmFsdWV9LCAke25ld1ZhbHVlfSk7YDtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX21heWJlRmlyc3RJbkJpbmRpbmcocjogUHJvdG9SZWNvcmQpOiBzdHJpbmcge1xuICAgIHZhciBwcmV2ID0gQ2hhbmdlRGV0ZWN0aW9uVXRpbC5wcm90b0J5SW5kZXgodGhpcy5yZWNvcmRzLCByLnNlbGZJbmRleCAtIDEpO1xuICAgIHZhciBmaXJzdEluQmluZGluZyA9IGlzQmxhbmsocHJldikgfHwgcHJldi5iaW5kaW5nUmVjb3JkICE9PSByLmJpbmRpbmdSZWNvcmQ7XG4gICAgcmV0dXJuIGZpcnN0SW5CaW5kaW5nICYmICFyLmJpbmRpbmdSZWNvcmQuaXNEaXJlY3RpdmVMaWZlY3ljbGUoKSA/XG4gICAgICAgICAgICAgICBgJHt0aGlzLl9uYW1lcy5nZXRQcm9wZXJ0eUJpbmRpbmdJbmRleCgpfSA9ICR7ci5wcm9wZXJ0eUJpbmRpbmdJbmRleH07YCA6XG4gICAgICAgICAgICAgICAnJztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX21heWJlR2VuTGFzdEluRGlyZWN0aXZlKHI6IFByb3RvUmVjb3JkKTogc3RyaW5nIHtcbiAgICBpZiAoIXIubGFzdEluRGlyZWN0aXZlKSByZXR1cm4gXCJcIjtcbiAgICByZXR1cm4gYFxuICAgICAgJHtDSEFOR0VTX0xPQ0FMfSA9IG51bGw7XG4gICAgICAke3RoaXMuX2dlbk5vdGlmeU9uUHVzaERldGVjdG9ycyhyKX1cbiAgICAgICR7SVNfQ0hBTkdFRF9MT0NBTH0gPSBmYWxzZTtcbiAgICBgO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZ2VuT25DaGVjayhyOiBQcm90b1JlY29yZCk6IHN0cmluZyB7XG4gICAgdmFyIGJyID0gci5iaW5kaW5nUmVjb3JkO1xuICAgIHJldHVybiBgaWYgKCF0aHJvd09uQ2hhbmdlKSAke3RoaXMuX25hbWVzLmdldERpcmVjdGl2ZU5hbWUoYnIuZGlyZWN0aXZlUmVjb3JkLmRpcmVjdGl2ZUluZGV4KX0ubmdEb0NoZWNrKCk7YDtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2dlbk9uSW5pdChyOiBQcm90b1JlY29yZCk6IHN0cmluZyB7XG4gICAgdmFyIGJyID0gci5iaW5kaW5nUmVjb3JkO1xuICAgIHJldHVybiBgaWYgKCF0aHJvd09uQ2hhbmdlICYmICR7dGhpcy5fbmFtZXMuZ2V0U3RhdGVOYW1lKCl9ID09PSAke3RoaXMuY2hhbmdlRGV0ZWN0b3JTdGF0ZVZhck5hbWV9Lk5ldmVyQ2hlY2tlZCkgJHt0aGlzLl9uYW1lcy5nZXREaXJlY3RpdmVOYW1lKGJyLmRpcmVjdGl2ZVJlY29yZC5kaXJlY3RpdmVJbmRleCl9Lm5nT25Jbml0KCk7YDtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2dlbk9uQ2hhbmdlKHI6IFByb3RvUmVjb3JkKTogc3RyaW5nIHtcbiAgICB2YXIgYnIgPSByLmJpbmRpbmdSZWNvcmQ7XG4gICAgcmV0dXJuIGBpZiAoIXRocm93T25DaGFuZ2UgJiYgJHtDSEFOR0VTX0xPQ0FMfSkgJHt0aGlzLl9uYW1lcy5nZXREaXJlY3RpdmVOYW1lKGJyLmRpcmVjdGl2ZVJlY29yZC5kaXJlY3RpdmVJbmRleCl9Lm5nT25DaGFuZ2VzKCR7Q0hBTkdFU19MT0NBTH0pO2A7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9nZW5Ob3RpZnlPblB1c2hEZXRlY3RvcnMocjogUHJvdG9SZWNvcmQpOiBzdHJpbmcge1xuICAgIHZhciBiciA9IHIuYmluZGluZ1JlY29yZDtcbiAgICBpZiAoIXIubGFzdEluRGlyZWN0aXZlIHx8IGJyLmlzRGVmYXVsdENoYW5nZURldGVjdGlvbigpKSByZXR1cm4gXCJcIjtcbiAgICB2YXIgcmV0VmFsID0gYFxuICAgICAgaWYoJHtJU19DSEFOR0VEX0xPQ0FMfSkge1xuICAgICAgICAke3RoaXMuX25hbWVzLmdldERldGVjdG9yTmFtZShici5kaXJlY3RpdmVSZWNvcmQuZGlyZWN0aXZlSW5kZXgpfS5tYXJrQXNDaGVja09uY2UoKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIHJldHVybiByZXRWYWw7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vY2hhbmdlX2RldGVjdGlvbl9qaXRfZ2VuZXJhdG9yLnRzXG4gKiovIiwiaW1wb3J0IHtSZWdFeHBXcmFwcGVyLCBTdHJpbmdXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtMaXN0V3JhcHBlciwgTWFwV3JhcHBlciwgTWFwfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuXG5pbXBvcnQge0RpcmVjdGl2ZUluZGV4fSBmcm9tICcuL2RpcmVjdGl2ZV9yZWNvcmQnO1xuXG5pbXBvcnQge1Byb3RvUmVjb3JkfSBmcm9tICcuL3Byb3RvX3JlY29yZCc7XG5pbXBvcnQge0V2ZW50QmluZGluZ30gZnJvbSAnLi9ldmVudF9iaW5kaW5nJztcblxuLy8gVGhlIG5hbWVzIG9mIHRoZXNlIGZpZWxkcyBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIGFic3RyYWN0X2NoYW5nZV9kZXRlY3Rvci50cyBvciBjaGFuZ2Vcbi8vIGRldGVjdGlvbiB3aWxsIGZhaWwuXG5jb25zdCBfU1RBVEVfQUNDRVNTT1IgPSBcInN0YXRlXCI7XG5jb25zdCBfQ09OVEVYVF9BQ0NFU1NPUiA9IFwiY29udGV4dFwiO1xuY29uc3QgX1BST1BfQklORElOR19JTkRFWCA9IFwicHJvcGVydHlCaW5kaW5nSW5kZXhcIjtcbmNvbnN0IF9ESVJFQ1RJVkVTX0FDQ0VTU09SID0gXCJkaXJlY3RpdmVJbmRpY2VzXCI7XG5jb25zdCBfRElTUEFUQ0hFUl9BQ0NFU1NPUiA9IFwiZGlzcGF0Y2hlclwiO1xuY29uc3QgX0xPQ0FMU19BQ0NFU1NPUiA9IFwibG9jYWxzXCI7XG5jb25zdCBfTU9ERV9BQ0NFU1NPUiA9IFwibW9kZVwiO1xuY29uc3QgX1BJUEVTX0FDQ0VTU09SID0gXCJwaXBlc1wiO1xuY29uc3QgX1BST1RPU19BQ0NFU1NPUiA9IFwicHJvdG9zXCI7XG5leHBvcnQgY29uc3QgQ09OVEVYVF9BQ0NFU1NPUiA9IFwiY29udGV4dFwiO1xuXG4vLyBgY29udGV4dGAgaXMgYWx3YXlzIGZpcnN0LlxuZXhwb3J0IGNvbnN0IENPTlRFWFRfSU5ERVggPSAwO1xuY29uc3QgX0ZJRUxEX1BSRUZJWCA9ICd0aGlzLic7XG5cbnZhciBfd2hpdGVTcGFjZVJlZ0V4cCA9IC9cXFcvZztcblxuLyoqXG4gKiBSZXR1cm5zIGBzYCB3aXRoIGFsbCBub24taWRlbnRpZmllciBjaGFyYWN0ZXJzIHJlbW92ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZU5hbWUoczogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIFN0cmluZ1dyYXBwZXIucmVwbGFjZUFsbChzLCBfd2hpdGVTcGFjZVJlZ0V4cCwgJycpO1xufVxuXG4vKipcbiAqIENsYXNzIHJlc3BvbnNpYmxlIGZvciBwcm92aWRpbmcgZmllbGQgYW5kIGxvY2FsIHZhcmlhYmxlIG5hbWVzIGZvciBjaGFuZ2UgZGV0ZWN0b3IgY2xhc3Nlcy5cbiAqIEFsc28gcHJvdmlkZXMgc29tZSBjb252ZW5pZW5jZSBmdW5jdGlvbnMsIGZvciBleGFtcGxlLCBkZWNsYXJpbmcgdmFyaWFibGVzLCBkZXN0cm95aW5nIHBpcGVzLFxuICogYW5kIGRlaHlkcmF0aW5nIHRoZSBkZXRlY3Rvci5cbiAqL1xuZXhwb3J0IGNsYXNzIENvZGVnZW5OYW1lVXRpbCB7XG4gIC8qKlxuICAgKiBSZWNvcmQgbmFtZXMgc2FuaXRpemVkIGZvciB1c2UgYXMgZmllbGRzLlxuICAgKiBTZWUgW3Nhbml0aXplTmFtZV0gZm9yIGRldGFpbHMuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX3Nhbml0aXplZE5hbWVzOiBzdHJpbmdbXTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfc2FuaXRpemVkRXZlbnROYW1lcyA9IG5ldyBNYXA8RXZlbnRCaW5kaW5nLCBzdHJpbmdbXT4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9yZWNvcmRzOiBQcm90b1JlY29yZFtdLCBwcml2YXRlIF9ldmVudEJpbmRpbmdzOiBFdmVudEJpbmRpbmdbXSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfZGlyZWN0aXZlUmVjb3JkczogYW55W10sIHByaXZhdGUgX3V0aWxOYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9zYW5pdGl6ZWROYW1lcyA9IExpc3RXcmFwcGVyLmNyZWF0ZUZpeGVkU2l6ZSh0aGlzLl9yZWNvcmRzLmxlbmd0aCArIDEpO1xuICAgIHRoaXMuX3Nhbml0aXplZE5hbWVzW0NPTlRFWFRfSU5ERVhdID0gQ09OVEVYVF9BQ0NFU1NPUjtcbiAgICBmb3IgKHZhciBpID0gMCwgaUxlbiA9IHRoaXMuX3JlY29yZHMubGVuZ3RoOyBpIDwgaUxlbjsgKytpKSB7XG4gICAgICB0aGlzLl9zYW5pdGl6ZWROYW1lc1tpICsgMV0gPSBzYW5pdGl6ZU5hbWUoYCR7dGhpcy5fcmVjb3Jkc1tpXS5uYW1lfSR7aX1gKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBlYkluZGV4ID0gMDsgZWJJbmRleCA8IF9ldmVudEJpbmRpbmdzLmxlbmd0aDsgKytlYkluZGV4KSB7XG4gICAgICB2YXIgZWIgPSBfZXZlbnRCaW5kaW5nc1tlYkluZGV4XTtcbiAgICAgIHZhciBuYW1lcyA9IFtDT05URVhUX0FDQ0VTU09SXTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBpTGVuID0gZWIucmVjb3Jkcy5sZW5ndGg7IGkgPCBpTGVuOyArK2kpIHtcbiAgICAgICAgbmFtZXMucHVzaChzYW5pdGl6ZU5hbWUoYCR7ZWIucmVjb3Jkc1tpXS5uYW1lfSR7aX1fJHtlYkluZGV4fWApKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3Nhbml0aXplZEV2ZW50TmFtZXMuc2V0KGViLCBuYW1lcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfYWRkRmllbGRQcmVmaXgobmFtZTogc3RyaW5nKTogc3RyaW5nIHsgcmV0dXJuIGAke19GSUVMRF9QUkVGSVh9JHtuYW1lfWA7IH1cblxuICBnZXREaXNwYXRjaGVyTmFtZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fYWRkRmllbGRQcmVmaXgoX0RJU1BBVENIRVJfQUNDRVNTT1IpOyB9XG5cbiAgZ2V0UGlwZXNBY2Nlc3Nvck5hbWUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX2FkZEZpZWxkUHJlZml4KF9QSVBFU19BQ0NFU1NPUik7IH1cblxuICBnZXRQcm90b3NOYW1lKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9hZGRGaWVsZFByZWZpeChfUFJPVE9TX0FDQ0VTU09SKTsgfVxuXG4gIGdldERpcmVjdGl2ZXNBY2Nlc3Nvck5hbWUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX2FkZEZpZWxkUHJlZml4KF9ESVJFQ1RJVkVTX0FDQ0VTU09SKTsgfVxuXG4gIGdldExvY2Fsc0FjY2Vzc29yTmFtZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fYWRkRmllbGRQcmVmaXgoX0xPQ0FMU19BQ0NFU1NPUik7IH1cblxuICBnZXRTdGF0ZU5hbWUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX2FkZEZpZWxkUHJlZml4KF9TVEFURV9BQ0NFU1NPUik7IH1cblxuICBnZXRNb2RlTmFtZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fYWRkRmllbGRQcmVmaXgoX01PREVfQUNDRVNTT1IpOyB9XG5cbiAgZ2V0UHJvcGVydHlCaW5kaW5nSW5kZXgoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX2FkZEZpZWxkUHJlZml4KF9QUk9QX0JJTkRJTkdfSU5ERVgpOyB9XG5cbiAgZ2V0TG9jYWxOYW1lKGlkeDogbnVtYmVyKTogc3RyaW5nIHsgcmV0dXJuIGBsXyR7dGhpcy5fc2FuaXRpemVkTmFtZXNbaWR4XX1gOyB9XG5cbiAgZ2V0RXZlbnRMb2NhbE5hbWUoZWI6IEV2ZW50QmluZGluZywgaWR4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBgbF8ke3RoaXMuX3Nhbml0aXplZEV2ZW50TmFtZXMuZ2V0KGViKVtpZHhdfWA7XG4gIH1cblxuICBnZXRDaGFuZ2VOYW1lKGlkeDogbnVtYmVyKTogc3RyaW5nIHsgcmV0dXJuIGBjXyR7dGhpcy5fc2FuaXRpemVkTmFtZXNbaWR4XX1gOyB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEgc3RhdGVtZW50IGluaXRpYWxpemluZyBsb2NhbCB2YXJpYWJsZXMgdXNlZCB3aGVuIGRldGVjdGluZyBjaGFuZ2VzLlxuICAgKi9cbiAgZ2VuSW5pdExvY2FscygpOiBzdHJpbmcge1xuICAgIHZhciBkZWNsYXJhdGlvbnMgPSBbXTtcbiAgICB2YXIgYXNzaWdubWVudHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMCwgaUxlbiA9IHRoaXMuZ2V0RmllbGRDb3VudCgpOyBpIDwgaUxlbjsgKytpKSB7XG4gICAgICBpZiAoaSA9PSBDT05URVhUX0lOREVYKSB7XG4gICAgICAgIGRlY2xhcmF0aW9ucy5wdXNoKGAke3RoaXMuZ2V0TG9jYWxOYW1lKGkpfSA9ICR7dGhpcy5nZXRGaWVsZE5hbWUoaSl9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcmVjID0gdGhpcy5fcmVjb3Jkc1tpIC0gMV07XG4gICAgICAgIGlmIChyZWMuYXJndW1lbnRUb1B1cmVGdW5jdGlvbikge1xuICAgICAgICAgIHZhciBjaGFuZ2VOYW1lID0gdGhpcy5nZXRDaGFuZ2VOYW1lKGkpO1xuICAgICAgICAgIGRlY2xhcmF0aW9ucy5wdXNoKGAke3RoaXMuZ2V0TG9jYWxOYW1lKGkpfSwke2NoYW5nZU5hbWV9YCk7XG4gICAgICAgICAgYXNzaWdubWVudHMucHVzaChjaGFuZ2VOYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWNsYXJhdGlvbnMucHVzaChgJHt0aGlzLmdldExvY2FsTmFtZShpKX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB2YXIgYXNzaWdubWVudHNDb2RlID1cbiAgICAgICAgTGlzdFdyYXBwZXIuaXNFbXB0eShhc3NpZ25tZW50cykgPyAnJyA6IGAke2Fzc2lnbm1lbnRzLmpvaW4oJz0nKX0gPSBmYWxzZTtgO1xuICAgIHJldHVybiBgdmFyICR7ZGVjbGFyYXRpb25zLmpvaW4oJywnKX07JHthc3NpZ25tZW50c0NvZGV9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIHN0YXRlbWVudCBpbml0aWFsaXppbmcgbG9jYWwgdmFyaWFibGVzIGZvciBldmVudCBoYW5kbGVycy5cbiAgICovXG4gIGdlbkluaXRFdmVudExvY2FscygpOiBzdHJpbmcge1xuICAgIHZhciByZXMgPSBbYCR7dGhpcy5nZXRMb2NhbE5hbWUoQ09OVEVYVF9JTkRFWCl9ID0gJHt0aGlzLmdldEZpZWxkTmFtZShDT05URVhUX0lOREVYKX1gXTtcbiAgICB0aGlzLl9zYW5pdGl6ZWRFdmVudE5hbWVzLmZvckVhY2goKG5hbWVzLCBlYikgPT4ge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAoaSAhPT0gQ09OVEVYVF9JTkRFWCkge1xuICAgICAgICAgIHJlcy5wdXNoKGAke3RoaXMuZ2V0RXZlbnRMb2NhbE5hbWUoZWIsIGkpfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlcy5sZW5ndGggPiAxID8gYHZhciAke3Jlcy5qb2luKCcsJyl9O2AgOiAnJztcbiAgfVxuXG4gIGdldFByZXZlbnREZWZhdWx0QWNjZXNvcigpOiBzdHJpbmcgeyByZXR1cm4gXCJwcmV2ZW50RGVmYXVsdFwiOyB9XG5cbiAgZ2V0RmllbGRDb3VudCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fc2FuaXRpemVkTmFtZXMubGVuZ3RoOyB9XG5cbiAgZ2V0RmllbGROYW1lKGlkeDogbnVtYmVyKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX2FkZEZpZWxkUHJlZml4KHRoaXMuX3Nhbml0aXplZE5hbWVzW2lkeF0pOyB9XG5cbiAgZ2V0QWxsRmllbGROYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgdmFyIGZpZWxkTGlzdCA9IFtdO1xuICAgIGZvciAodmFyIGsgPSAwLCBrTGVuID0gdGhpcy5nZXRGaWVsZENvdW50KCk7IGsgPCBrTGVuOyArK2spIHtcbiAgICAgIGlmIChrID09PSAwIHx8IHRoaXMuX3JlY29yZHNbayAtIDFdLnNob3VsZEJlQ2hlY2tlZCgpKSB7XG4gICAgICAgIGZpZWxkTGlzdC5wdXNoKHRoaXMuZ2V0RmllbGROYW1lKGspKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMCwgaUxlbiA9IHRoaXMuX3JlY29yZHMubGVuZ3RoOyBpIDwgaUxlbjsgKytpKSB7XG4gICAgICB2YXIgcmVjID0gdGhpcy5fcmVjb3Jkc1tpXTtcbiAgICAgIGlmIChyZWMuaXNQaXBlUmVjb3JkKCkpIHtcbiAgICAgICAgZmllbGRMaXN0LnB1c2godGhpcy5nZXRQaXBlTmFtZShyZWMuc2VsZkluZGV4KSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaiA9IDAsIGpMZW4gPSB0aGlzLl9kaXJlY3RpdmVSZWNvcmRzLmxlbmd0aDsgaiA8IGpMZW47ICsraikge1xuICAgICAgdmFyIGRSZWMgPSB0aGlzLl9kaXJlY3RpdmVSZWNvcmRzW2pdO1xuICAgICAgZmllbGRMaXN0LnB1c2godGhpcy5nZXREaXJlY3RpdmVOYW1lKGRSZWMuZGlyZWN0aXZlSW5kZXgpKTtcbiAgICAgIGlmICghZFJlYy5pc0RlZmF1bHRDaGFuZ2VEZXRlY3Rpb24oKSkge1xuICAgICAgICBmaWVsZExpc3QucHVzaCh0aGlzLmdldERldGVjdG9yTmFtZShkUmVjLmRpcmVjdGl2ZUluZGV4KSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmaWVsZExpc3Q7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIHN0YXRlbWVudHMgd2hpY2ggY2xlYXIgYWxsIGZpZWxkcyBzbyB0aGF0IHRoZSBjaGFuZ2UgZGV0ZWN0b3IgaXMgZGVoeWRyYXRlZC5cbiAgICovXG4gIGdlbkRlaHlkcmF0ZUZpZWxkcygpOiBzdHJpbmcge1xuICAgIHZhciBmaWVsZHMgPSB0aGlzLmdldEFsbEZpZWxkTmFtZXMoKTtcbiAgICBMaXN0V3JhcHBlci5yZW1vdmVBdChmaWVsZHMsIENPTlRFWFRfSU5ERVgpO1xuICAgIGlmIChMaXN0V3JhcHBlci5pc0VtcHR5KGZpZWxkcykpIHJldHVybiAnJztcblxuICAgIC8vIEF0IGxlYXN0IG9uZSBhc3NpZ25tZW50LlxuICAgIGZpZWxkcy5wdXNoKGAke3RoaXMuX3V0aWxOYW1lfS51bmluaXRpYWxpemVkO2ApO1xuICAgIHJldHVybiBmaWVsZHMuam9pbignID0gJyk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIHN0YXRlbWVudHMgZGVzdHJveWluZyBhbGwgcGlwZSB2YXJpYWJsZXMuXG4gICAqL1xuICBnZW5QaXBlT25EZXN0cm95KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3JlY29yZHMuZmlsdGVyKHIgPT4gci5pc1BpcGVSZWNvcmQoKSlcbiAgICAgICAgLm1hcChyID0+IGAke3RoaXMuX3V0aWxOYW1lfS5jYWxsUGlwZU9uRGVzdHJveSgke3RoaXMuZ2V0UGlwZU5hbWUoci5zZWxmSW5kZXgpfSk7YClcbiAgICAgICAgLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgZ2V0UGlwZU5hbWUoaWR4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9hZGRGaWVsZFByZWZpeChgJHt0aGlzLl9zYW5pdGl6ZWROYW1lc1tpZHhdfV9waXBlYCk7XG4gIH1cblxuICBnZXREaXJlY3RpdmVOYW1lKGQ6IERpcmVjdGl2ZUluZGV4KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkRmllbGRQcmVmaXgoYGRpcmVjdGl2ZV8ke2QubmFtZX1gKTtcbiAgfVxuXG4gIGdldERldGVjdG9yTmFtZShkOiBEaXJlY3RpdmVJbmRleCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9hZGRGaWVsZFByZWZpeChgZGV0ZWN0b3JfJHtkLm5hbWV9YCk7IH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vY29kZWdlbl9uYW1lX3V0aWwudHNcbiAqKi8iLCJpbXBvcnQge0lTX0RBUlQsIEpzb24sIFN0cmluZ1dyYXBwZXIsIGlzUHJlc2VudCwgaXNCbGFua30gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7Q29kZWdlbk5hbWVVdGlsfSBmcm9tICcuL2NvZGVnZW5fbmFtZV91dGlsJztcbmltcG9ydCB7Y29kaWZ5LCBjb21iaW5lR2VuZXJhdGVkU3RyaW5ncywgcmF3U3RyaW5nfSBmcm9tICcuL2NvZGVnZW5fZmFjYWRlJztcbmltcG9ydCB7UHJvdG9SZWNvcmQsIFJlY29yZFR5cGV9IGZyb20gJy4vcHJvdG9fcmVjb3JkJztcbmltcG9ydCB7QmluZGluZ1RhcmdldH0gZnJvbSAnLi9iaW5kaW5nX3JlY29yZCc7XG5pbXBvcnQge0RpcmVjdGl2ZVJlY29yZH0gZnJvbSAnLi9kaXJlY3RpdmVfcmVjb3JkJztcbmltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3l9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcblxuLyoqXG4gKiBDbGFzcyByZXNwb25zaWJsZSBmb3IgcHJvdmlkaW5nIGNoYW5nZSBkZXRlY3Rpb24gbG9naWMgZm9yIGNoYW5nZSBkZXRlY3RvciBjbGFzc2VzLlxuICovXG5leHBvcnQgY2xhc3MgQ29kZWdlbkxvZ2ljVXRpbCB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX25hbWVzOiBDb2RlZ2VuTmFtZVV0aWwsIHByaXZhdGUgX3V0aWxOYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2NoYW5nZURldGVjdG9yU3RhdGVOYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2NoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kpIHt9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIHN0YXRlbWVudCB3aGljaCB1cGRhdGVzIHRoZSBsb2NhbCB2YXJpYWJsZSByZXByZXNlbnRpbmcgYHByb3RvUmVjYCB3aXRoIHRoZSBjdXJyZW50XG4gICAqIHZhbHVlIG9mIHRoZSByZWNvcmQuIFVzZWQgYnkgcHJvcGVydHkgYmluZGluZ3MuXG4gICAqL1xuICBnZW5Qcm9wZXJ0eUJpbmRpbmdFdmFsVmFsdWUocHJvdG9SZWM6IFByb3RvUmVjb3JkKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZ2VuRXZhbFZhbHVlKHByb3RvUmVjLCBpZHggPT4gdGhpcy5fbmFtZXMuZ2V0TG9jYWxOYW1lKGlkeCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9uYW1lcy5nZXRMb2NhbHNBY2Nlc3Nvck5hbWUoKSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgc3RhdGVtZW50IHdoaWNoIHVwZGF0ZXMgdGhlIGxvY2FsIHZhcmlhYmxlIHJlcHJlc2VudGluZyBgcHJvdG9SZWNgIHdpdGggdGhlIGN1cnJlbnRcbiAgICogdmFsdWUgb2YgdGhlIHJlY29yZC4gVXNlZCBieSBldmVudCBiaW5kaW5ncy5cbiAgICovXG4gIGdlbkV2ZW50QmluZGluZ0V2YWxWYWx1ZShldmVudFJlY29yZDogYW55LCBwcm90b1JlYzogUHJvdG9SZWNvcmQpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9nZW5FdmFsVmFsdWUocHJvdG9SZWMsIGlkeCA9PiB0aGlzLl9uYW1lcy5nZXRFdmVudExvY2FsTmFtZShldmVudFJlY29yZCwgaWR4KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibG9jYWxzXCIpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2VuRXZhbFZhbHVlKHByb3RvUmVjOiBQcm90b1JlY29yZCwgZ2V0TG9jYWxOYW1lOiBGdW5jdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2Fsc0FjY2Vzc29yOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHZhciBjb250ZXh0ID0gKHByb3RvUmVjLmNvbnRleHRJbmRleCA9PSAtMSkgP1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25hbWVzLmdldERpcmVjdGl2ZU5hbWUocHJvdG9SZWMuZGlyZWN0aXZlSW5kZXgpIDpcbiAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhbE5hbWUocHJvdG9SZWMuY29udGV4dEluZGV4KTtcbiAgICB2YXIgYXJnU3RyaW5nID0gcHJvdG9SZWMuYXJncy5tYXAoYXJnID0+IGdldExvY2FsTmFtZShhcmcpKS5qb2luKFwiLCBcIik7XG5cbiAgICB2YXIgcmhzOiBzdHJpbmc7XG4gICAgc3dpdGNoIChwcm90b1JlYy5tb2RlKSB7XG4gICAgICBjYXNlIFJlY29yZFR5cGUuU2VsZjpcbiAgICAgICAgcmhzID0gY29udGV4dDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgUmVjb3JkVHlwZS5Db25zdDpcbiAgICAgICAgcmhzID0gY29kaWZ5KHByb3RvUmVjLmZ1bmNPclZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgUmVjb3JkVHlwZS5Qcm9wZXJ0eVJlYWQ6XG4gICAgICAgIHJocyA9IHRoaXMuX29ic2VydmUoYCR7Y29udGV4dH0uJHtwcm90b1JlYy5uYW1lfWAsIHByb3RvUmVjKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgUmVjb3JkVHlwZS5TYWZlUHJvcGVydHk6XG4gICAgICAgIHZhciByZWFkID0gdGhpcy5fb2JzZXJ2ZShgJHtjb250ZXh0fS4ke3Byb3RvUmVjLm5hbWV9YCwgcHJvdG9SZWMpO1xuICAgICAgICByaHMgPVxuICAgICAgICAgICAgYCR7dGhpcy5fdXRpbE5hbWV9LmlzVmFsdWVCbGFuaygke2NvbnRleHR9KSA/IG51bGwgOiAke3RoaXMuX29ic2VydmUocmVhZCwgcHJvdG9SZWMpfWA7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFJlY29yZFR5cGUuUHJvcGVydHlXcml0ZTpcbiAgICAgICAgcmhzID0gYCR7Y29udGV4dH0uJHtwcm90b1JlYy5uYW1lfSA9ICR7Z2V0TG9jYWxOYW1lKHByb3RvUmVjLmFyZ3NbMF0pfWA7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFJlY29yZFR5cGUuTG9jYWw6XG4gICAgICAgIHJocyA9IHRoaXMuX29ic2VydmUoYCR7bG9jYWxzQWNjZXNzb3J9LmdldCgke3Jhd1N0cmluZyhwcm90b1JlYy5uYW1lKX0pYCwgcHJvdG9SZWMpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBSZWNvcmRUeXBlLkludm9rZU1ldGhvZDpcbiAgICAgICAgcmhzID0gdGhpcy5fb2JzZXJ2ZShgJHtjb250ZXh0fS4ke3Byb3RvUmVjLm5hbWV9KCR7YXJnU3RyaW5nfSlgLCBwcm90b1JlYyk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFJlY29yZFR5cGUuU2FmZU1ldGhvZEludm9rZTpcbiAgICAgICAgdmFyIGludm9rZSA9IGAke2NvbnRleHR9LiR7cHJvdG9SZWMubmFtZX0oJHthcmdTdHJpbmd9KWA7XG4gICAgICAgIHJocyA9XG4gICAgICAgICAgICBgJHt0aGlzLl91dGlsTmFtZX0uaXNWYWx1ZUJsYW5rKCR7Y29udGV4dH0pID8gbnVsbCA6ICR7dGhpcy5fb2JzZXJ2ZShpbnZva2UsIHByb3RvUmVjKX1gO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBSZWNvcmRUeXBlLkludm9rZUNsb3N1cmU6XG4gICAgICAgIHJocyA9IGAke2NvbnRleHR9KCR7YXJnU3RyaW5nfSlgO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBSZWNvcmRUeXBlLlByaW1pdGl2ZU9wOlxuICAgICAgICByaHMgPSBgJHt0aGlzLl91dGlsTmFtZX0uJHtwcm90b1JlYy5uYW1lfSgke2FyZ1N0cmluZ30pYDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgUmVjb3JkVHlwZS5Db2xsZWN0aW9uTGl0ZXJhbDpcbiAgICAgICAgcmhzID0gYCR7dGhpcy5fdXRpbE5hbWV9LiR7cHJvdG9SZWMubmFtZX0oJHthcmdTdHJpbmd9KWA7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFJlY29yZFR5cGUuSW50ZXJwb2xhdGU6XG4gICAgICAgIHJocyA9IHRoaXMuX2dlbkludGVycG9sYXRpb24ocHJvdG9SZWMpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBSZWNvcmRUeXBlLktleWVkUmVhZDpcbiAgICAgICAgcmhzID0gdGhpcy5fb2JzZXJ2ZShgJHtjb250ZXh0fVske2dldExvY2FsTmFtZShwcm90b1JlYy5hcmdzWzBdKX1dYCwgcHJvdG9SZWMpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBSZWNvcmRUeXBlLktleWVkV3JpdGU6XG4gICAgICAgIHJocyA9IGAke2NvbnRleHR9WyR7Z2V0TG9jYWxOYW1lKHByb3RvUmVjLmFyZ3NbMF0pfV0gPSAke2dldExvY2FsTmFtZShwcm90b1JlYy5hcmdzWzFdKX1gO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBSZWNvcmRUeXBlLkNoYWluOlxuICAgICAgICByaHMgPSAnbnVsbCc7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgVW5rbm93biBvcGVyYXRpb24gJHtwcm90b1JlYy5tb2RlfWApO1xuICAgIH1cbiAgICByZXR1cm4gYCR7Z2V0TG9jYWxOYW1lKHByb3RvUmVjLnNlbGZJbmRleCl9ID0gJHtyaHN9O2A7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9vYnNlcnZlKGV4cDogc3RyaW5nLCByZWM6IFByb3RvUmVjb3JkKTogc3RyaW5nIHtcbiAgICAvLyBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlLiBXb3JrcyBvbmx5IGluIERhcnQuXG4gICAgaWYgKHRoaXMuX2NoYW5nZURldGVjdGlvbiA9PT0gQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoT2JzZXJ2ZSkge1xuICAgICAgcmV0dXJuIGB0aGlzLm9ic2VydmVWYWx1ZSgke2V4cH0sICR7cmVjLnNlbGZJbmRleH0pYDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGV4cDtcbiAgICB9XG4gIH1cblxuICBnZW5Qcm9wZXJ0eUJpbmRpbmdUYXJnZXRzKHByb3BlcnR5QmluZGluZ1RhcmdldHM6IEJpbmRpbmdUYXJnZXRbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5EZWJ1Z0luZm86IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIHZhciBicyA9IHByb3BlcnR5QmluZGluZ1RhcmdldHMubWFwKGIgPT4ge1xuICAgICAgaWYgKGlzQmxhbmsoYikpIHJldHVybiBcIm51bGxcIjtcblxuICAgICAgdmFyIGRlYnVnID0gZ2VuRGVidWdJbmZvID8gY29kaWZ5KGIuZGVidWcpIDogXCJudWxsXCI7XG4gICAgICByZXR1cm4gYCR7dGhpcy5fdXRpbE5hbWV9LmJpbmRpbmdUYXJnZXQoJHtjb2RpZnkoYi5tb2RlKX0sICR7Yi5lbGVtZW50SW5kZXh9LCAke2NvZGlmeShiLm5hbWUpfSwgJHtjb2RpZnkoYi51bml0KX0sICR7ZGVidWd9KWA7XG4gICAgfSk7XG4gICAgcmV0dXJuIGBbJHticy5qb2luKFwiLCBcIil9XWA7XG4gIH1cblxuICBnZW5EaXJlY3RpdmVJbmRpY2VzKGRpcmVjdGl2ZVJlY29yZHM6IERpcmVjdGl2ZVJlY29yZFtdKTogc3RyaW5nIHtcbiAgICB2YXIgYnMgPSBkaXJlY3RpdmVSZWNvcmRzLm1hcChcbiAgICAgICAgYiA9PlxuICAgICAgICAgICAgYCR7dGhpcy5fdXRpbE5hbWV9LmRpcmVjdGl2ZUluZGV4KCR7Yi5kaXJlY3RpdmVJbmRleC5lbGVtZW50SW5kZXh9LCAke2IuZGlyZWN0aXZlSW5kZXguZGlyZWN0aXZlSW5kZXh9KWApO1xuICAgIHJldHVybiBgWyR7YnMuam9pbihcIiwgXCIpfV1gO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZ2VuSW50ZXJwb2xhdGlvbihwcm90b1JlYzogUHJvdG9SZWNvcmQpOiBzdHJpbmcge1xuICAgIHZhciBpVmFscyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvdG9SZWMuYXJncy5sZW5ndGg7ICsraSkge1xuICAgICAgaVZhbHMucHVzaChjb2RpZnkocHJvdG9SZWMuZml4ZWRBcmdzW2ldKSk7XG4gICAgICBpVmFscy5wdXNoKGAke3RoaXMuX3V0aWxOYW1lfS5zKCR7dGhpcy5fbmFtZXMuZ2V0TG9jYWxOYW1lKHByb3RvUmVjLmFyZ3NbaV0pfSlgKTtcbiAgICB9XG4gICAgaVZhbHMucHVzaChjb2RpZnkocHJvdG9SZWMuZml4ZWRBcmdzW3Byb3RvUmVjLmFyZ3MubGVuZ3RoXSkpO1xuICAgIHJldHVybiBjb21iaW5lR2VuZXJhdGVkU3RyaW5ncyhpVmFscyk7XG4gIH1cblxuICBnZW5IeWRyYXRlRGlyZWN0aXZlcyhkaXJlY3RpdmVSZWNvcmRzOiBEaXJlY3RpdmVSZWNvcmRbXSk6IHN0cmluZyB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGlyZWN0aXZlUmVjb3Jkcy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIHIgPSBkaXJlY3RpdmVSZWNvcmRzW2ldO1xuICAgICAgcmVzLnB1c2goYCR7dGhpcy5fbmFtZXMuZ2V0RGlyZWN0aXZlTmFtZShyLmRpcmVjdGl2ZUluZGV4KX0gPSAke3RoaXMuX2dlblJlYWREaXJlY3RpdmUoaSl9O2ApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICBwcml2YXRlIF9nZW5SZWFkRGlyZWN0aXZlKGluZGV4OiBudW1iZXIpIHtcbiAgICAvLyBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlLiBXb3JrcyBvbmx5IGluIERhcnQuXG4gICAgaWYgKHRoaXMuX2NoYW5nZURldGVjdGlvbiA9PT0gQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoT2JzZXJ2ZSkge1xuICAgICAgcmV0dXJuIGB0aGlzLm9ic2VydmVEaXJlY3RpdmUodGhpcy5nZXREaXJlY3RpdmVGb3IoZGlyZWN0aXZlcywgJHtpbmRleH0pLCAke2luZGV4fSlgO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYHRoaXMuZ2V0RGlyZWN0aXZlRm9yKGRpcmVjdGl2ZXMsICR7aW5kZXh9KWA7XG4gICAgfVxuICB9XG5cbiAgZ2VuSHlkcmF0ZURldGVjdG9ycyhkaXJlY3RpdmVSZWNvcmRzOiBEaXJlY3RpdmVSZWNvcmRbXSk6IHN0cmluZyB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGlyZWN0aXZlUmVjb3Jkcy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIHIgPSBkaXJlY3RpdmVSZWNvcmRzW2ldO1xuICAgICAgaWYgKCFyLmlzRGVmYXVsdENoYW5nZURldGVjdGlvbigpKSB7XG4gICAgICAgIHJlcy5wdXNoKFxuICAgICAgICAgICAgYCR7dGhpcy5fbmFtZXMuZ2V0RGV0ZWN0b3JOYW1lKHIuZGlyZWN0aXZlSW5kZXgpfSA9IHRoaXMuZ2V0RGV0ZWN0b3JGb3IoZGlyZWN0aXZlcywgJHtpfSk7YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXMuam9pbihcIlxcblwiKTtcbiAgfVxuXG4gIGdlbkNvbnRlbnRMaWZlY3ljbGVDYWxsYmFja3MoZGlyZWN0aXZlUmVjb3JkczogRGlyZWN0aXZlUmVjb3JkW10pOiBzdHJpbmdbXSB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHZhciBlcSA9IElTX0RBUlQgPyAnPT0nIDogJz09PSc7XG4gICAgLy8gTk9URShrZWdsdW5lcSk6IE9yZGVyIGlzIGltcG9ydGFudCFcbiAgICBmb3IgKHZhciBpID0gZGlyZWN0aXZlUmVjb3Jkcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgdmFyIGRpciA9IGRpcmVjdGl2ZVJlY29yZHNbaV07XG4gICAgICBpZiAoZGlyLmNhbGxBZnRlckNvbnRlbnRJbml0KSB7XG4gICAgICAgIHJlcy5wdXNoKFxuICAgICAgICAgICAgYGlmKCR7dGhpcy5fbmFtZXMuZ2V0U3RhdGVOYW1lKCl9ICR7ZXF9ICR7dGhpcy5fY2hhbmdlRGV0ZWN0b3JTdGF0ZU5hbWV9Lk5ldmVyQ2hlY2tlZCkgJHt0aGlzLl9uYW1lcy5nZXREaXJlY3RpdmVOYW1lKGRpci5kaXJlY3RpdmVJbmRleCl9Lm5nQWZ0ZXJDb250ZW50SW5pdCgpO2ApO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlyLmNhbGxBZnRlckNvbnRlbnRDaGVja2VkKSB7XG4gICAgICAgIHJlcy5wdXNoKGAke3RoaXMuX25hbWVzLmdldERpcmVjdGl2ZU5hbWUoZGlyLmRpcmVjdGl2ZUluZGV4KX0ubmdBZnRlckNvbnRlbnRDaGVja2VkKCk7YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBnZW5WaWV3TGlmZWN5Y2xlQ2FsbGJhY2tzKGRpcmVjdGl2ZVJlY29yZHM6IERpcmVjdGl2ZVJlY29yZFtdKTogc3RyaW5nW10ge1xuICAgIHZhciByZXMgPSBbXTtcbiAgICB2YXIgZXEgPSBJU19EQVJUID8gJz09JyA6ICc9PT0nO1xuICAgIC8vIE5PVEUoa2VnbHVuZXEpOiBPcmRlciBpcyBpbXBvcnRhbnQhXG4gICAgZm9yICh2YXIgaSA9IGRpcmVjdGl2ZVJlY29yZHMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIHZhciBkaXIgPSBkaXJlY3RpdmVSZWNvcmRzW2ldO1xuICAgICAgaWYgKGRpci5jYWxsQWZ0ZXJWaWV3SW5pdCkge1xuICAgICAgICByZXMucHVzaChcbiAgICAgICAgICAgIGBpZigke3RoaXMuX25hbWVzLmdldFN0YXRlTmFtZSgpfSAke2VxfSAke3RoaXMuX2NoYW5nZURldGVjdG9yU3RhdGVOYW1lfS5OZXZlckNoZWNrZWQpICR7dGhpcy5fbmFtZXMuZ2V0RGlyZWN0aXZlTmFtZShkaXIuZGlyZWN0aXZlSW5kZXgpfS5uZ0FmdGVyVmlld0luaXQoKTtgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpci5jYWxsQWZ0ZXJWaWV3Q2hlY2tlZCkge1xuICAgICAgICByZXMucHVzaChgJHt0aGlzLl9uYW1lcy5nZXREaXJlY3RpdmVOYW1lKGRpci5kaXJlY3RpdmVJbmRleCl9Lm5nQWZ0ZXJWaWV3Q2hlY2tlZCgpO2ApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2NvZGVnZW5fbG9naWNfdXRpbC50c1xuICoqLyIsIlxuLyoqXG4gKiBDb252ZXJ0cyBgZnVuY09yVmFsdWVgIHRvIGEgc3RyaW5nIHdoaWNoIGNhbiBiZSB1c2VkIGluIGdlbmVyYXRlZCBjb2RlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29kaWZ5KG9iajogYW55KTogc3RyaW5nIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG9iaik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByYXdTdHJpbmcoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCcke3N0cn0nYDtcbn1cblxuLyoqXG4gKiBDb21iaW5lIHRoZSBzdHJpbmdzIG9mIGdlbmVyYXRlZCBjb2RlIGludG8gYSBzaW5nbGUgaW50ZXJwb2xhdGVkIHN0cmluZy5cbiAqIEVhY2ggZWxlbWVudCBvZiBgdmFsc2AgaXMgZXhwZWN0ZWQgdG8gYmUgYSBzdHJpbmcgbGl0ZXJhbCBvciBhIGNvZGVnZW4nZFxuICogY2FsbCB0byBhIG1ldGhvZCByZXR1cm5pbmcgYSBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21iaW5lR2VuZXJhdGVkU3RyaW5ncyh2YWxzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiB2YWxzLmpvaW4oJyArICcpO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9jb2RlZ2VuX2ZhY2FkZS50c1xuICoqLyIsImltcG9ydCB7Q09OU1QsIFR5cGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5cbi8qKlxuICogRGVmaW5lcyB0ZW1wbGF0ZSBhbmQgc3R5bGUgZW5jYXBzdWxhdGlvbiBvcHRpb25zIGF2YWlsYWJsZSBmb3IgQ29tcG9uZW50J3Mge0BsaW5rIFZpZXd9LlxuICpcbiAqIFNlZSB7QGxpbmsgVmlld01ldGFkYXRhI2VuY2Fwc3VsYXRpb259LlxuICovXG5leHBvcnQgZW51bSBWaWV3RW5jYXBzdWxhdGlvbiB7XG4gIC8qKlxuICAgKiBFbXVsYXRlIGBOYXRpdmVgIHNjb3Bpbmcgb2Ygc3R5bGVzIGJ5IGFkZGluZyBhbiBhdHRyaWJ1dGUgY29udGFpbmluZyBzdXJyb2dhdGUgaWQgdG8gdGhlIEhvc3RcbiAgICogRWxlbWVudCBhbmQgcHJlLXByb2Nlc3NpbmcgdGhlIHN0eWxlIHJ1bGVzIHByb3ZpZGVkIHZpYVxuICAgKiB7QGxpbmsgVmlld01ldGFkYXRhI3N0eWxlc30gb3Ige0BsaW5rIFZpZXdNZXRhZGF0YSNzdHlsZXNVcmxzfSwgYW5kIGFkZGluZyB0aGUgbmV3IEhvc3QgRWxlbWVudFxuICAgKiBhdHRyaWJ1dGUgdG8gYWxsIHNlbGVjdG9ycy5cbiAgICpcbiAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBvcHRpb24uXG4gICAqL1xuICBFbXVsYXRlZCxcbiAgLyoqXG4gICAqIFVzZSB0aGUgbmF0aXZlIGVuY2Fwc3VsYXRpb24gbWVjaGFuaXNtIG9mIHRoZSByZW5kZXJlci5cbiAgICpcbiAgICogRm9yIHRoZSBET00gdGhpcyBtZWFucyB1c2luZyBbU2hhZG93IERPTV0oaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmNvbXBvbmVudHMvc3BlYy9zaGFkb3cvKSBhbmRcbiAgICogY3JlYXRpbmcgYSBTaGFkb3dSb290IGZvciBDb21wb25lbnQncyBIb3N0IEVsZW1lbnQuXG4gICAqL1xuICBOYXRpdmUsXG4gIC8qKlxuICAgKiBEb24ndCBwcm92aWRlIGFueSB0ZW1wbGF0ZSBvciBzdHlsZSBlbmNhcHN1bGF0aW9uLlxuICAgKi9cbiAgTm9uZVxufVxuXG5leHBvcnQgdmFyIFZJRVdfRU5DQVBTVUxBVElPTl9WQUxVRVMgPVxuICAgIFtWaWV3RW5jYXBzdWxhdGlvbi5FbXVsYXRlZCwgVmlld0VuY2Fwc3VsYXRpb24uTmF0aXZlLCBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXTtcblxuXG4vKipcbiAqIE1ldGFkYXRhIHByb3BlcnRpZXMgYXZhaWxhYmxlIGZvciBjb25maWd1cmluZyBWaWV3cy5cbiAqXG4gKiBFYWNoIEFuZ3VsYXIgY29tcG9uZW50IHJlcXVpcmVzIGEgc2luZ2xlIGBAQ29tcG9uZW50YCBhbmQgYXQgbGVhc3Qgb25lIGBAVmlld2AgYW5ub3RhdGlvbi4gVGhlXG4gKiBgQFZpZXdgIGFubm90YXRpb24gc3BlY2lmaWVzIHRoZSBIVE1MIHRlbXBsYXRlIHRvIHVzZSwgYW5kIGxpc3RzIHRoZSBkaXJlY3RpdmVzIHRoYXQgYXJlIGFjdGl2ZVxuICogd2l0aGluIHRoZSB0ZW1wbGF0ZS5cbiAqXG4gKiBXaGVuIGEgY29tcG9uZW50IGlzIGluc3RhbnRpYXRlZCwgdGhlIHRlbXBsYXRlIGlzIGxvYWRlZCBpbnRvIHRoZSBjb21wb25lbnQncyBzaGFkb3cgcm9vdCwgYW5kXG4gKiB0aGUgZXhwcmVzc2lvbnMgYW5kIHN0YXRlbWVudHMgaW4gdGhlIHRlbXBsYXRlIGFyZSBldmFsdWF0ZWQgYWdhaW5zdCB0aGUgY29tcG9uZW50LlxuICpcbiAqIEZvciBkZXRhaWxzIG9uIHRoZSBgQENvbXBvbmVudGAgYW5ub3RhdGlvbiwgc2VlIHtAbGluayBDb21wb25lbnRNZXRhZGF0YX0uXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGBcbiAqIEBDb21wb25lbnQoe1xuICogICBzZWxlY3RvcjogJ2dyZWV0JyxcbiAqICAgdGVtcGxhdGU6ICdIZWxsbyB7e25hbWV9fSEnLFxuICogICBkaXJlY3RpdmVzOiBbR3JlZXRVc2VyLCBCb2xkXVxuICogfSlcbiAqIGNsYXNzIEdyZWV0IHtcbiAqICAgbmFtZTogc3RyaW5nO1xuICpcbiAqICAgY29uc3RydWN0b3IoKSB7XG4gKiAgICAgdGhpcy5uYW1lID0gJ1dvcmxkJztcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbkBDT05TVCgpXG5leHBvcnQgY2xhc3MgVmlld01ldGFkYXRhIHtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhIHRlbXBsYXRlIFVSTCBmb3IgYW4gQW5ndWxhciBjb21wb25lbnQuXG4gICAqXG4gICAqIE5PVEU6IE9ubHkgb25lIG9mIGB0ZW1wbGF0ZVVybGAgb3IgYHRlbXBsYXRlYCBjYW4gYmUgZGVmaW5lZCBwZXIgVmlldy5cbiAgICpcbiAgICogPCEtLSBUT0RPOiB3aGF0J3MgdGhlIHVybCByZWxhdGl2ZSB0bz8gLS0+XG4gICAqL1xuICB0ZW1wbGF0ZVVybDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYW4gaW5saW5lIHRlbXBsYXRlIGZvciBhbiBBbmd1bGFyIGNvbXBvbmVudC5cbiAgICpcbiAgICogTk9URTogT25seSBvbmUgb2YgYHRlbXBsYXRlVXJsYCBvciBgdGVtcGxhdGVgIGNhbiBiZSBkZWZpbmVkIHBlciBWaWV3LlxuICAgKi9cbiAgdGVtcGxhdGU6IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHN0eWxlc2hlZXQgVVJMcyBmb3IgYW4gQW5ndWxhciBjb21wb25lbnQuXG4gICAqXG4gICAqIDwhLS0gVE9ETzogd2hhdCdzIHRoZSB1cmwgcmVsYXRpdmUgdG8/IC0tPlxuICAgKi9cbiAgc3R5bGVVcmxzOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIGFuIGlubGluZSBzdHlsZXNoZWV0IGZvciBhbiBBbmd1bGFyIGNvbXBvbmVudC5cbiAgICovXG4gIHN0eWxlczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhIGxpc3Qgb2YgZGlyZWN0aXZlcyB0aGF0IGNhbiBiZSB1c2VkIHdpdGhpbiBhIHRlbXBsYXRlLlxuICAgKlxuICAgKiBEaXJlY3RpdmVzIG11c3QgYmUgbGlzdGVkIGV4cGxpY2l0bHkgdG8gcHJvdmlkZSBwcm9wZXIgY29tcG9uZW50IGVuY2Fwc3VsYXRpb24uXG4gICAqXG4gICAqICMjIyBFeGFtcGxlXG4gICAqXG4gICAqIGBgYGphdmFzY3JpcHRcbiAgICogQENvbXBvbmVudCh7XG4gICAqICAgc2VsZWN0b3I6ICdteS1jb21wb25lbnQnLFxuICAgKiAgIGRpcmVjdGl2ZXM6IFtOZ0Zvcl1cbiAgICogICB0ZW1wbGF0ZTogJ1xuICAgKiAgIDx1bD5cbiAgICogICAgIDxsaSAqbmdGb3I9XCIjaXRlbSBvZiBpdGVtc1wiPnt7aXRlbX19PC9saT5cbiAgICogICA8L3VsPidcbiAgICogfSlcbiAgICogY2xhc3MgTXlDb21wb25lbnQge1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgZGlyZWN0aXZlczogQXJyYXk8VHlwZSB8IGFueVtdPjtcblxuICBwaXBlczogQXJyYXk8VHlwZSB8IGFueVtdPjtcblxuICAvKipcbiAgICogU3BlY2lmeSBob3cgdGhlIHRlbXBsYXRlIGFuZCB0aGUgc3R5bGVzIHNob3VsZCBiZSBlbmNhcHN1bGF0ZWQuXG4gICAqIFRoZSBkZWZhdWx0IGlzIHtAbGluayBWaWV3RW5jYXBzdWxhdGlvbiNFbXVsYXRlZCBgVmlld0VuY2Fwc3VsYXRpb24uRW11bGF0ZWRgfSBpZiB0aGUgdmlld1xuICAgKiBoYXMgc3R5bGVzLFxuICAgKiBvdGhlcndpc2Uge0BsaW5rIFZpZXdFbmNhcHN1bGF0aW9uI05vbmUgYFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVgfS5cbiAgICovXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHt0ZW1wbGF0ZVVybCwgdGVtcGxhdGUsIGRpcmVjdGl2ZXMsIHBpcGVzLCBlbmNhcHN1bGF0aW9uLCBzdHlsZXMsIHN0eWxlVXJsc306IHtcbiAgICB0ZW1wbGF0ZVVybD86IHN0cmluZyxcbiAgICB0ZW1wbGF0ZT86IHN0cmluZyxcbiAgICBkaXJlY3RpdmVzPzogQXJyYXk8VHlwZSB8IGFueVtdPixcbiAgICBwaXBlcz86IEFycmF5PFR5cGUgfCBhbnlbXT4sXG4gICAgZW5jYXBzdWxhdGlvbj86IFZpZXdFbmNhcHN1bGF0aW9uLFxuICAgIHN0eWxlcz86IHN0cmluZ1tdLFxuICAgIHN0eWxlVXJscz86IHN0cmluZ1tdLFxuICB9ID0ge30pIHtcbiAgICB0aGlzLnRlbXBsYXRlVXJsID0gdGVtcGxhdGVVcmw7XG4gICAgdGhpcy50ZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIHRoaXMuc3R5bGVVcmxzID0gc3R5bGVVcmxzO1xuICAgIHRoaXMuc3R5bGVzID0gc3R5bGVzO1xuICAgIHRoaXMuZGlyZWN0aXZlcyA9IGRpcmVjdGl2ZXM7XG4gICAgdGhpcy5waXBlcyA9IHBpcGVzO1xuICAgIHRoaXMuZW5jYXBzdWxhdGlvbiA9IGVuY2Fwc3VsYXRpb247XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL21ldGFkYXRhL3ZpZXcudHNcbiAqKi8iLCIvLyBQdWJsaWMgQVBJIGZvciB1dGlsXG5leHBvcnQge0NsYXNzLCBDbGFzc0RlZmluaXRpb24sIFR5cGVEZWNvcmF0b3J9IGZyb20gJy4vdXRpbC9kZWNvcmF0b3JzJztcblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS91dGlsLnRzXG4gKiovIiwiZXhwb3J0IHtlbmFibGVQcm9kTW9kZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9wcm9kX21vZGUudHNcbiAqKi8iLCIvLyBQdWJsaWMgQVBJIGZvciBGYWNhZGVcbmV4cG9ydCB7Q29uY3JldGVUeXBlLCBUeXBlfSBmcm9tICcuL2xhbmcnO1xuZXhwb3J0IHtFdmVudEVtaXR0ZXJ9IGZyb20gJy4vYXN5bmMnO1xuZXhwb3J0IHtXcmFwcGVkRXhjZXB0aW9ufSBmcm9tICcuL2V4Y2VwdGlvbnMnO1xuZXhwb3J0IHtFeGNlcHRpb25IYW5kbGVyfSBmcm9tICcuL2V4Y2VwdGlvbl9oYW5kbGVyJztcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9mYWNhZGUvZmFjYWRlLnRzXG4gKiovIiwiaW1wb3J0IHtnbG9iYWwsIGlzUHJlc2VudCwgbm9vcH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbi8vIFdlIG1ha2Ugc3VyZSBwcm9taXNlcyBhcmUgaW4gYSBzZXBhcmF0ZSBmaWxlIHNvIHRoYXQgd2UgY2FuIHVzZSBwcm9taXNlc1xuLy8gd2l0aG91dCBkZXBlbmRpbmcgb24gcnhqcy5cbmltcG9ydCB7UHJvbWlzZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9wcm9taXNlJztcbmV4cG9ydCB7UHJvbWlzZVdyYXBwZXIsIFByb21pc2UsIFByb21pc2VDb21wbGV0ZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvcHJvbWlzZSc7XG5cbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSAncnhqcy9PYnNlcnZhYmxlJztcbmltcG9ydCB7U3ViamVjdH0gZnJvbSAncnhqcy9TdWJqZWN0JztcbmltcG9ydCB7U3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzL1N1YnNjcmlwdGlvbic7XG5pbXBvcnQge09wZXJhdG9yfSBmcm9tICdyeGpzL09wZXJhdG9yJztcblxuaW1wb3J0IHtQcm9taXNlT2JzZXJ2YWJsZX0gZnJvbSAncnhqcy9vYnNlcnZhYmxlL2Zyb21Qcm9taXNlJztcbmltcG9ydCB7dG9Qcm9taXNlfSBmcm9tICdyeGpzL29wZXJhdG9yL3RvUHJvbWlzZSc7XG5cbmV4cG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSAncnhqcy9PYnNlcnZhYmxlJztcbmV4cG9ydCB7U3ViamVjdH0gZnJvbSAncnhqcy9TdWJqZWN0JztcblxuZXhwb3J0IG5hbWVzcGFjZSBOb2RlSlMge1xuICBleHBvcnQgaW50ZXJmYWNlIFRpbWVyIHt9XG59XG5cbmV4cG9ydCBjbGFzcyBUaW1lcldyYXBwZXIge1xuICBzdGF0aWMgc2V0VGltZW91dChmbjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkLCBtaWxsaXM6IG51bWJlcik6IE5vZGVKUy5UaW1lciB7XG4gICAgcmV0dXJuIGdsb2JhbC5zZXRUaW1lb3V0KGZuLCBtaWxsaXMpO1xuICB9XG4gIHN0YXRpYyBjbGVhclRpbWVvdXQoaWQ6IE5vZGVKUy5UaW1lcik6IHZvaWQgeyBnbG9iYWwuY2xlYXJUaW1lb3V0KGlkKTsgfVxuXG4gIHN0YXRpYyBzZXRJbnRlcnZhbChmbjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkLCBtaWxsaXM6IG51bWJlcik6IE5vZGVKUy5UaW1lciB7XG4gICAgcmV0dXJuIGdsb2JhbC5zZXRJbnRlcnZhbChmbiwgbWlsbGlzKTtcbiAgfVxuICBzdGF0aWMgY2xlYXJJbnRlcnZhbChpZDogTm9kZUpTLlRpbWVyKTogdm9pZCB7IGdsb2JhbC5jbGVhckludGVydmFsKGlkKTsgfVxufVxuXG5leHBvcnQgY2xhc3MgT2JzZXJ2YWJsZVdyYXBwZXIge1xuICAvLyBUT0RPKHZzYXZraW4pOiB3aGVuIHdlIHVzZSByeG5leHQsIHRyeSBpbmZlcnJpbmcgdGhlIGdlbmVyaWMgdHlwZSBmcm9tIHRoZSBmaXJzdCBhcmdcbiAgc3RhdGljIHN1YnNjcmliZTxUPihlbWl0dGVyOiBhbnksIG9uTmV4dDogKHZhbHVlOiBUKSA9PiB2b2lkLCBvbkVycm9yPzogKGV4Y2VwdGlvbjogYW55KSA9PiB2b2lkLFxuICAgICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGU6ICgpID0+IHZvaWQgPSAoKSA9PiB7fSk6IE9iamVjdCB7XG4gICAgb25FcnJvciA9ICh0eXBlb2Ygb25FcnJvciA9PT0gXCJmdW5jdGlvblwiKSAmJiBvbkVycm9yIHx8IG5vb3A7XG4gICAgb25Db21wbGV0ZSA9ICh0eXBlb2Ygb25Db21wbGV0ZSA9PT0gXCJmdW5jdGlvblwiKSAmJiBvbkNvbXBsZXRlIHx8IG5vb3A7XG4gICAgcmV0dXJuIGVtaXR0ZXIuc3Vic2NyaWJlKHtuZXh0OiBvbk5leHQsIGVycm9yOiBvbkVycm9yLCBjb21wbGV0ZTogb25Db21wbGV0ZX0pO1xuICB9XG5cbiAgc3RhdGljIGlzT2JzZXJ2YWJsZShvYnM6IGFueSk6IGJvb2xlYW4geyByZXR1cm4gISFvYnMuc3Vic2NyaWJlOyB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBgb2JzYCBoYXMgYW55IHN1YnNjcmliZXJzIGxpc3RlbmluZyB0byBldmVudHMuXG4gICAqL1xuICBzdGF0aWMgaGFzU3Vic2NyaWJlcnMob2JzOiBFdmVudEVtaXR0ZXI8YW55Pik6IGJvb2xlYW4geyByZXR1cm4gb2JzLm9ic2VydmVycy5sZW5ndGggPiAwOyB9XG5cbiAgc3RhdGljIGRpc3Bvc2Uoc3Vic2NyaXB0aW9uOiBhbnkpIHsgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7IH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgLSB1c2UgY2FsbEVtaXQoKSBpbnN0ZWFkXG4gICAqL1xuICBzdGF0aWMgY2FsbE5leHQoZW1pdHRlcjogRXZlbnRFbWl0dGVyPGFueT4sIHZhbHVlOiBhbnkpIHsgZW1pdHRlci5uZXh0KHZhbHVlKTsgfVxuXG4gIHN0YXRpYyBjYWxsRW1pdChlbWl0dGVyOiBFdmVudEVtaXR0ZXI8YW55PiwgdmFsdWU6IGFueSkgeyBlbWl0dGVyLmVtaXQodmFsdWUpOyB9XG5cbiAgc3RhdGljIGNhbGxFcnJvcihlbWl0dGVyOiBFdmVudEVtaXR0ZXI8YW55PiwgZXJyb3I6IGFueSkgeyBlbWl0dGVyLmVycm9yKGVycm9yKTsgfVxuXG4gIHN0YXRpYyBjYWxsQ29tcGxldGUoZW1pdHRlcjogRXZlbnRFbWl0dGVyPGFueT4pIHsgZW1pdHRlci5jb21wbGV0ZSgpOyB9XG5cbiAgc3RhdGljIGZyb21Qcm9taXNlKHByb21pc2U6IFByb21pc2U8YW55Pik6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIFByb21pc2VPYnNlcnZhYmxlLmNyZWF0ZShwcm9taXNlKTtcbiAgfVxuXG4gIHN0YXRpYyB0b1Byb21pc2Uob2JqOiBPYnNlcnZhYmxlPGFueT4pOiBQcm9taXNlPGFueT4geyByZXR1cm4gdG9Qcm9taXNlLmNhbGwob2JqKTsgfVxufVxuXG4vKipcbiAqIFVzZSBieSBkaXJlY3RpdmVzIGFuZCBjb21wb25lbnRzIHRvIGVtaXQgY3VzdG9tIEV2ZW50cy5cbiAqXG4gKiAjIyMgRXhhbXBsZXNcbiAqXG4gKiBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUsIGBaaXBweWAgYWx0ZXJuYXRpdmVseSBlbWl0cyBgb3BlbmAgYW5kIGBjbG9zZWAgZXZlbnRzIHdoZW4gaXRzXG4gKiB0aXRsZSBnZXRzIGNsaWNrZWQ6XG4gKlxuICogYGBgXG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICd6aXBweScsXG4gKiAgIHRlbXBsYXRlOiBgXG4gKiAgIDxkaXYgY2xhc3M9XCJ6aXBweVwiPlxuICogICAgIDxkaXYgKGNsaWNrKT1cInRvZ2dsZSgpXCI+VG9nZ2xlPC9kaXY+XG4gKiAgICAgPGRpdiBbaGlkZGVuXT1cIiF2aXNpYmxlXCI+XG4gKiAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gKiAgICAgPC9kaXY+XG4gKiAgPC9kaXY+YH0pXG4gKiBleHBvcnQgY2xhc3MgWmlwcHkge1xuICogICB2aXNpYmxlOiBib29sZWFuID0gdHJ1ZTtcbiAqICAgQE91dHB1dCgpIG9wZW46IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICogICBAT3V0cHV0KCkgY2xvc2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICpcbiAqICAgdG9nZ2xlKCkge1xuICogICAgIHRoaXMudmlzaWJsZSA9ICF0aGlzLnZpc2libGU7XG4gKiAgICAgaWYgKHRoaXMudmlzaWJsZSkge1xuICogICAgICAgdGhpcy5vcGVuLmVtaXQobnVsbCk7XG4gKiAgICAgfSBlbHNlIHtcbiAqICAgICAgIHRoaXMuY2xvc2UuZW1pdChudWxsKTtcbiAqICAgICB9XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqIFVzZSBSeC5PYnNlcnZhYmxlIGJ1dCBwcm92aWRlcyBhbiBhZGFwdGVyIHRvIG1ha2UgaXQgd29yayBhcyBzcGVjaWZpZWQgaGVyZTpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9qaHVzYWluL29ic2VydmFibGUtc3BlY1xuICpcbiAqIE9uY2UgYSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNwZWMgaXMgYXZhaWxhYmxlLCBzd2l0Y2ggdG8gaXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBFdmVudEVtaXR0ZXI8VD4gZXh0ZW5kcyBTdWJqZWN0PFQ+IHtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfaXNBc3luYzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBbRXZlbnRFbWl0dGVyXSwgd2hpY2ggZGVwZW5kaW5nIG9uIFtpc0FzeW5jXSxcbiAgICogZGVsaXZlcnMgZXZlbnRzIHN5bmNocm9ub3VzbHkgb3IgYXN5bmNocm9ub3VzbHkuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihpc0FzeW5jOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5faXNBc3luYyA9IGlzQXN5bmM7XG4gIH1cblxuICBlbWl0KHZhbHVlOiBUKSB7IHN1cGVyLm5leHQodmFsdWUpOyB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIC0gdXNlIC5lbWl0KHZhbHVlKSBpbnN0ZWFkXG4gICAqL1xuICBuZXh0KHZhbHVlOiBhbnkpIHsgc3VwZXIubmV4dCh2YWx1ZSk7IH1cblxuICBzdWJzY3JpYmUoZ2VuZXJhdG9yT3JOZXh0PzogYW55LCBlcnJvcj86IGFueSwgY29tcGxldGU/OiBhbnkpOiBhbnkge1xuICAgIGxldCBzY2hlZHVsZXJGbjtcbiAgICBsZXQgZXJyb3JGbiA9IChlcnI6IGFueSkgPT4gbnVsbDtcbiAgICBsZXQgY29tcGxldGVGbiA9ICgpID0+IG51bGw7XG5cbiAgICBpZiAoZ2VuZXJhdG9yT3JOZXh0ICYmIHR5cGVvZiBnZW5lcmF0b3JPck5leHQgPT09ICdvYmplY3QnKSB7XG4gICAgICBzY2hlZHVsZXJGbiA9IHRoaXMuX2lzQXN5bmMgPyAodmFsdWUpID0+IHsgc2V0VGltZW91dCgoKSA9PiBnZW5lcmF0b3JPck5leHQubmV4dCh2YWx1ZSkpOyB9IDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSkgPT4geyBnZW5lcmF0b3JPck5leHQubmV4dCh2YWx1ZSk7IH07XG5cbiAgICAgIGlmIChnZW5lcmF0b3JPck5leHQuZXJyb3IpIHtcbiAgICAgICAgZXJyb3JGbiA9IHRoaXMuX2lzQXN5bmMgPyAoZXJyKSA9PiB7IHNldFRpbWVvdXQoKCkgPT4gZ2VuZXJhdG9yT3JOZXh0LmVycm9yKGVycikpOyB9IDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXJyKSA9PiB7IGdlbmVyYXRvck9yTmV4dC5lcnJvcihlcnIpOyB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoZ2VuZXJhdG9yT3JOZXh0LmNvbXBsZXRlKSB7XG4gICAgICAgIGNvbXBsZXRlRm4gPSB0aGlzLl9pc0FzeW5jID8gKCkgPT4geyBzZXRUaW1lb3V0KCgpID0+IGdlbmVyYXRvck9yTmV4dC5jb21wbGV0ZSgpKTsgfSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4geyBnZW5lcmF0b3JPck5leHQuY29tcGxldGUoKTsgfTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc2NoZWR1bGVyRm4gPSB0aGlzLl9pc0FzeW5jID8gKHZhbHVlKSA9PiB7IHNldFRpbWVvdXQoKCkgPT4gZ2VuZXJhdG9yT3JOZXh0KHZhbHVlKSk7IH0gOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlKSA9PiB7IGdlbmVyYXRvck9yTmV4dCh2YWx1ZSk7IH07XG5cbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICBlcnJvckZuID1cbiAgICAgICAgICAgIHRoaXMuX2lzQXN5bmMgPyAoZXJyKSA9PiB7IHNldFRpbWVvdXQoKCkgPT4gZXJyb3IoZXJyKSk7IH0gOiAoZXJyKSA9PiB7IGVycm9yKGVycik7IH07XG4gICAgICB9XG5cbiAgICAgIGlmIChjb21wbGV0ZSkge1xuICAgICAgICBjb21wbGV0ZUZuID1cbiAgICAgICAgICAgIHRoaXMuX2lzQXN5bmMgPyAoKSA9PiB7IHNldFRpbWVvdXQoKCkgPT4gY29tcGxldGUoKSk7IH0gOiAoKSA9PiB7IGNvbXBsZXRlKCk7IH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cGVyLnN1YnNjcmliZShzY2hlZHVsZXJGbiwgZXJyb3JGbiwgY29tcGxldGVGbik7XG4gIH1cbn1cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvZmFjYWRlL2FzeW5jLnRzXG4gKiovIiwiLy8gUHJvbWlzZXMgYXJlIHB1dCBpbnRvIHRoZWlyIG93biBmYWNhZGUgZmlsZSBzbyB0aGF0IHRoZXkgY2FuIGJlIHVzZWQgd2l0aG91dFxuLy8gaW50cm9kdWNpbmcgYSBkZXBlbmRlbmN5IG9uIHJ4anMuIFRoZXkgYXJlIHJlLWV4cG9ydGVkIHRocm91Z2ggZmFjYWRlL2FzeW5jLlxuZXhwb3J0IHtQcm9taXNlfTtcblxuZXhwb3J0IGludGVyZmFjZSBQcm9taXNlQ29tcGxldGVyPFI+IHtcbiAgcHJvbWlzZTogUHJvbWlzZTxSPjtcbiAgcmVzb2x2ZTogKHZhbHVlPzogUiB8IFByb21pc2VMaWtlPFI+KSA9PiB2b2lkO1xuICByZWplY3Q6IChlcnJvcj86IGFueSwgc3RhY2tUcmFjZT86IHN0cmluZykgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGNsYXNzIFByb21pc2VXcmFwcGVyIHtcbiAgc3RhdGljIHJlc29sdmU8VD4ob2JqOiBUKTogUHJvbWlzZTxUPiB7IHJldHVybiBQcm9taXNlLnJlc29sdmUob2JqKTsgfVxuXG4gIHN0YXRpYyByZWplY3Qob2JqOiBhbnksIF8pOiBQcm9taXNlPGFueT4geyByZXR1cm4gUHJvbWlzZS5yZWplY3Qob2JqKTsgfVxuXG4gIC8vIE5vdGU6IFdlIGNhbid0IHJlbmFtZSB0aGlzIG1ldGhvZCBpbnRvIGBjYXRjaGAsIGFzIHRoaXMgaXMgbm90IGEgdmFsaWRcbiAgLy8gbWV0aG9kIG5hbWUgaW4gRGFydC5cbiAgc3RhdGljIGNhdGNoRXJyb3I8VD4ocHJvbWlzZTogUHJvbWlzZTxUPixcbiAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcjogKGVycm9yOiBhbnkpID0+IFQgfCBQcm9taXNlTGlrZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBwcm9taXNlLmNhdGNoKG9uRXJyb3IpO1xuICB9XG5cbiAgc3RhdGljIGFsbChwcm9taXNlczogYW55W10pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmIChwcm9taXNlcy5sZW5ndGggPT0gMCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgfVxuXG4gIHN0YXRpYyB0aGVuPFQsIFU+KHByb21pc2U6IFByb21pc2U8VD4sIHN1Y2Nlc3M6ICh2YWx1ZTogVCkgPT4gVSB8IFByb21pc2VMaWtlPFU+LFxuICAgICAgICAgICAgICAgICAgICByZWplY3Rpb24/OiAoZXJyb3I6IGFueSwgc3RhY2s/OiBhbnkpID0+IFUgfCBQcm9taXNlTGlrZTxVPik6IFByb21pc2U8VT4ge1xuICAgIHJldHVybiBwcm9taXNlLnRoZW4oc3VjY2VzcywgcmVqZWN0aW9uKTtcbiAgfVxuXG4gIHN0YXRpYyB3cmFwPFQ+KGNvbXB1dGF0aW9uOiAoKSA9PiBUKTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXMsIHJlaikgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzKGNvbXB1dGF0aW9uKCkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWooZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgc2NoZWR1bGVNaWNyb3Rhc2soY29tcHV0YXRpb246ICgpID0+IGFueSk6IHZvaWQge1xuICAgIFByb21pc2VXcmFwcGVyLnRoZW4oUHJvbWlzZVdyYXBwZXIucmVzb2x2ZShudWxsKSwgY29tcHV0YXRpb24sIChfKSA9PiB7fSk7XG4gIH1cblxuICBzdGF0aWMgaXNQcm9taXNlKG9iajogYW55KTogYm9vbGVhbiB7IHJldHVybiBvYmogaW5zdGFuY2VvZiBQcm9taXNlOyB9XG5cbiAgc3RhdGljIGNvbXBsZXRlcigpOiBQcm9taXNlQ29tcGxldGVyPGFueT4ge1xuICAgIHZhciByZXNvbHZlO1xuICAgIHZhciByZWplY3Q7XG5cbiAgICB2YXIgcCA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlcywgcmVqKSB7XG4gICAgICByZXNvbHZlID0gcmVzO1xuICAgICAgcmVqZWN0ID0gcmVqO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtwcm9taXNlOiBwLCByZXNvbHZlOiByZXNvbHZlLCByZWplY3Q6IHJlamVjdH07XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9mYWNhZGUvcHJvbWlzZS50c1xuICoqLyIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV82Ml9fO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogZXh0ZXJuYWwgXCJSeFwiXG4gKiogbW9kdWxlIGlkID0gNjJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV82M19fO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogZXh0ZXJuYWwge1wiY29tbW9uanNcIjpcInJ4anMvb2JzZXJ2YWJsZS9mcm9tUHJvbWlzZVwiLFwiY29tbW9uanMyXCI6XCJyeGpzL29ic2VydmFibGUvZnJvbVByb21pc2VcIixcImFtZFwiOlwicnhqcy9vYnNlcnZhYmxlL2Zyb21Qcm9taXNlXCIsXCJyb290XCI6W1wiUnhcIixcIk9ic2VydmFibGVcIl19XG4gKiogbW9kdWxlIGlkID0gNjNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV82NF9fO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogZXh0ZXJuYWwge1wiY29tbW9uanNcIjpcInJ4anMvb3BlcmF0b3IvdG9Qcm9taXNlXCIsXCJjb21tb25qczJcIjpcInJ4anMvb3BlcmF0b3IvdG9Qcm9taXNlXCIsXCJhbWRcIjpcInJ4anMvb3BlcmF0b3IvdG9Qcm9taXNlXCIsXCJyb290XCI6W1wiUnhcIixcIk9ic2VydmFibGVcIixcInByb3RvdHlwZVwiXX1cbiAqKiBtb2R1bGUgaWQgPSA2NFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiaW1wb3J0IHtOZ1pvbmV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL3pvbmUvbmdfem9uZSc7XG5pbXBvcnQge1xuICBUeXBlLFxuICBpc0JsYW5rLFxuICBpc1ByZXNlbnQsXG4gIGFzc2VydGlvbnNFbmFibGVkLFxuICBwcmludCxcbiAgSVNfREFSVFxufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtwcm92aWRlLCBQcm92aWRlciwgSW5qZWN0b3IsIE9wYXF1ZVRva2VufSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5pbXBvcnQge1xuICBBUFBfQ09NUE9ORU5UX1JFRl9QUk9NSVNFLFxuICBBUFBfQ09NUE9ORU5ULFxuICBBUFBfSURfUkFORE9NX1BST1ZJREVSLFxuICBQTEFURk9STV9JTklUSUFMSVpFUixcbiAgQVBQX0lOSVRJQUxJWkVSXG59IGZyb20gJy4vYXBwbGljYXRpb25fdG9rZW5zJztcbmltcG9ydCB7XG4gIFByb21pc2UsXG4gIFByb21pc2VXcmFwcGVyLFxuICBQcm9taXNlQ29tcGxldGVyLFxuICBPYnNlcnZhYmxlV3JhcHBlclxufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2FzeW5jJztcbmltcG9ydCB7TGlzdFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge1Rlc3RhYmlsaXR5UmVnaXN0cnksIFRlc3RhYmlsaXR5fSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS90ZXN0YWJpbGl0eS90ZXN0YWJpbGl0eSc7XG5pbXBvcnQge1xuICBDb21wb25lbnRSZWYsXG4gIER5bmFtaWNDb21wb25lbnRMb2FkZXJcbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL2R5bmFtaWNfY29tcG9uZW50X2xvYWRlcic7XG5pbXBvcnQge1xuICBCYXNlRXhjZXB0aW9uLFxuICBXcmFwcGVkRXhjZXB0aW9uLFxuICBFeGNlcHRpb25IYW5kbGVyLFxuICB1bmltcGxlbWVudGVkXG59IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9ucyc7XG5pbXBvcnQge2ludGVybmFsVmlld30gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL3ZpZXdfcmVmJztcbmltcG9ydCB7Q29uc29sZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvY29uc29sZSc7XG5pbXBvcnQge3d0ZkxlYXZlLCB3dGZDcmVhdGVTY29wZSwgV3RmU2NvcGVGbn0gZnJvbSAnLi9wcm9maWxlL3Byb2ZpbGUnO1xuaW1wb3J0IHtDaGFuZ2VEZXRlY3RvclJlZn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9jaGFuZ2VfZGV0ZWN0b3JfcmVmJztcbmltcG9ydCB7bG9ja01vZGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5cbi8qKlxuICogQ29uc3RydWN0IHByb3ZpZGVycyBzcGVjaWZpYyB0byBhbiBpbmRpdmlkdWFsIHJvb3QgY29tcG9uZW50LlxuICovXG5mdW5jdGlvbiBfY29tcG9uZW50UHJvdmlkZXJzKGFwcENvbXBvbmVudFR5cGU6IFR5cGUpOiBBcnJheTxUeXBlIHwgUHJvdmlkZXIgfCBhbnlbXT4ge1xuICByZXR1cm4gW1xuICAgIHByb3ZpZGUoQVBQX0NPTVBPTkVOVCwge3VzZVZhbHVlOiBhcHBDb21wb25lbnRUeXBlfSksXG4gICAgcHJvdmlkZShBUFBfQ09NUE9ORU5UX1JFRl9QUk9NSVNFLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB1c2VGYWN0b3J5OiAoZHluYW1pY0NvbXBvbmVudExvYWRlcjogRHluYW1pY0NvbXBvbmVudExvYWRlciwgYXBwUmVmOiBBcHBsaWNhdGlvblJlZl8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBpbmplY3RvcjogSW5qZWN0b3IpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBTYXZlIHRoZSBDb21wb25lbnRSZWYgZm9yIGRpc3Bvc2FsIGxhdGVyLlxuICAgICAgICAgICAgICAgIHZhciByZWY6IENvbXBvbmVudFJlZjtcbiAgICAgICAgICAgICAgICAvLyBUT0RPKHJhZG8pOiBpbnZlc3RpZ2F0ZSB3aGV0aGVyIHRvIHN1cHBvcnQgcHJvdmlkZXJzIG9uIHJvb3QgY29tcG9uZW50LlxuICAgICAgICAgICAgICAgIHJldHVybiBkeW5hbWljQ29tcG9uZW50TG9hZGVyLmxvYWRBc1Jvb3QoYXBwQ29tcG9uZW50VHlwZSwgbnVsbCwgaW5qZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7IGFwcFJlZi5fdW5sb2FkQ29tcG9uZW50KHJlZik7IH0pXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKChjb21wb25lbnRSZWYpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICByZWYgPSBjb21wb25lbnRSZWY7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUHJlc2VudChjb21wb25lbnRSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdG9yLmdldChUZXN0YWJpbGl0eVJlZ2lzdHJ5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWdpc3RlckFwcGxpY2F0aW9uKGNvbXBvbmVudFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdG9yLmdldChUZXN0YWJpbGl0eSkpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50UmVmO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZGVwczogW0R5bmFtaWNDb21wb25lbnRMb2FkZXIsIEFwcGxpY2F0aW9uUmVmLCBJbmplY3Rvcl1cbiAgICAgICAgICAgIH0pLFxuICAgIHByb3ZpZGUoYXBwQ29tcG9uZW50VHlwZSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdXNlRmFjdG9yeTogKHA6IFByb21pc2U8YW55PikgPT4gcC50aGVuKHJlZiA9PiByZWYuaW5zdGFuY2UpLFxuICAgICAgICAgICAgICBkZXBzOiBbQVBQX0NPTVBPTkVOVF9SRUZfUFJPTUlTRV1cbiAgICAgICAgICAgIH0pLFxuICBdO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhbiBBbmd1bGFyIHpvbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVOZ1pvbmUoKTogTmdab25lIHtcbiAgcmV0dXJuIG5ldyBOZ1pvbmUoe2VuYWJsZUxvbmdTdGFja1RyYWNlOiBhc3NlcnRpb25zRW5hYmxlZCgpfSk7XG59XG5cbnZhciBfcGxhdGZvcm06IFBsYXRmb3JtUmVmO1xudmFyIF9wbGF0Zm9ybVByb3ZpZGVyczogYW55W107XG5cbi8qKlxuICogSW5pdGlhbGl6ZSB0aGUgQW5ndWxhciAncGxhdGZvcm0nIG9uIHRoZSBwYWdlLlxuICpcbiAqIFNlZSB7QGxpbmsgUGxhdGZvcm1SZWZ9IGZvciBkZXRhaWxzIG9uIHRoZSBBbmd1bGFyIHBsYXRmb3JtLlxuICpcbiAqIEl0IGlzIGFsc28gcG9zc2libGUgdG8gc3BlY2lmeSBwcm92aWRlcnMgdG8gYmUgbWFkZSBpbiB0aGUgbmV3IHBsYXRmb3JtLiBUaGVzZSBwcm92aWRlcnNcbiAqIHdpbGwgYmUgc2hhcmVkIGJldHdlZW4gYWxsIGFwcGxpY2F0aW9ucyBvbiB0aGUgcGFnZS4gRm9yIGV4YW1wbGUsIGFuIGFic3RyYWN0aW9uIGZvclxuICogdGhlIGJyb3dzZXIgY29va2llIGphciBzaG91bGQgYmUgYm91bmQgYXQgdGhlIHBsYXRmb3JtIGxldmVsLCBiZWNhdXNlIHRoZXJlIGlzIG9ubHkgb25lXG4gKiBjb29raWUgamFyIHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkgYXBwbGljYXRpb25zIG9uIHRoZSBwYWdlIHdpbGwgYmUgYWNjZXNzaW5nIGl0LlxuICpcbiAqIFRoZSBwbGF0Zm9ybSBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGFzIGxvbmcgYXMgdGhlIHNhbWUgbGlzdCBvZiBwcm92aWRlcnNcbiAqIGlzIHBhc3NlZCBpbnRvIGVhY2ggY2FsbC4gSWYgdGhlIHBsYXRmb3JtIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIGEgZGlmZmVyZW50IHNldCBvZlxuICogcHJvdmlkZXMsIEFuZ3VsYXIgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwbGF0Zm9ybShwcm92aWRlcnM/OiBBcnJheTxUeXBlIHwgUHJvdmlkZXIgfCBhbnlbXT4pOiBQbGF0Zm9ybVJlZiB7XG4gIGxvY2tNb2RlKCk7XG4gIGlmIChpc1ByZXNlbnQoX3BsYXRmb3JtKSkge1xuICAgIGlmIChMaXN0V3JhcHBlci5lcXVhbHMoX3BsYXRmb3JtUHJvdmlkZXJzLCBwcm92aWRlcnMpKSB7XG4gICAgICByZXR1cm4gX3BsYXRmb3JtO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihcInBsYXRmb3JtIGNhbm5vdCBiZSBpbml0aWFsaXplZCB3aXRoIGRpZmZlcmVudCBzZXRzIG9mIHByb3ZpZGVycy5cIik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBfY3JlYXRlUGxhdGZvcm0ocHJvdmlkZXJzKTtcbiAgfVxufVxuXG4vKipcbiAqIERpc3Bvc2UgdGhlIGV4aXN0aW5nIHBsYXRmb3JtLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzcG9zZVBsYXRmb3JtKCk6IHZvaWQge1xuICBpZiAoaXNQcmVzZW50KF9wbGF0Zm9ybSkpIHtcbiAgICBfcGxhdGZvcm0uZGlzcG9zZSgpO1xuICAgIF9wbGF0Zm9ybSA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NyZWF0ZVBsYXRmb3JtKHByb3ZpZGVycz86IEFycmF5PFR5cGUgfCBQcm92aWRlciB8IGFueVtdPik6IFBsYXRmb3JtUmVmIHtcbiAgX3BsYXRmb3JtUHJvdmlkZXJzID0gcHJvdmlkZXJzO1xuICBsZXQgaW5qZWN0b3IgPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKHByb3ZpZGVycyk7XG4gIF9wbGF0Zm9ybSA9IG5ldyBQbGF0Zm9ybVJlZl8oaW5qZWN0b3IsICgpID0+IHtcbiAgICBfcGxhdGZvcm0gPSBudWxsO1xuICAgIF9wbGF0Zm9ybVByb3ZpZGVycyA9IG51bGw7XG4gIH0pO1xuICBfcnVuUGxhdGZvcm1Jbml0aWFsaXplcnMoaW5qZWN0b3IpO1xuICByZXR1cm4gX3BsYXRmb3JtO1xufVxuXG5mdW5jdGlvbiBfcnVuUGxhdGZvcm1Jbml0aWFsaXplcnMoaW5qZWN0b3I6IEluamVjdG9yKTogdm9pZCB7XG4gIGxldCBpbml0czogRnVuY3Rpb25bXSA9IGluamVjdG9yLmdldE9wdGlvbmFsKFBMQVRGT1JNX0lOSVRJQUxJWkVSKTtcbiAgaWYgKGlzUHJlc2VudChpbml0cykpIGluaXRzLmZvckVhY2goaW5pdCA9PiBpbml0KCkpO1xufVxuXG4vKipcbiAqIFRoZSBBbmd1bGFyIHBsYXRmb3JtIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgQW5ndWxhciBvbiBhIHdlYiBwYWdlLiBFYWNoIHBhZ2VcbiAqIGhhcyBleGFjdGx5IG9uZSBwbGF0Zm9ybSwgYW5kIHNlcnZpY2VzIChzdWNoIGFzIHJlZmxlY3Rpb24pIHdoaWNoIGFyZSBjb21tb25cbiAqIHRvIGV2ZXJ5IEFuZ3VsYXIgYXBwbGljYXRpb24gcnVubmluZyBvbiB0aGUgcGFnZSBhcmUgYm91bmQgaW4gaXRzIHNjb3BlLlxuICpcbiAqIEEgcGFnZSdzIHBsYXRmb3JtIGlzIGluaXRpYWxpemVkIGltcGxpY2l0bHkgd2hlbiB7QGxpbmsgYm9vdHN0cmFwfSgpIGlzIGNhbGxlZCwgb3JcbiAqIGV4cGxpY2l0bHkgYnkgY2FsbGluZyB7QGxpbmsgcGxhdGZvcm19KCkuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBQbGF0Zm9ybVJlZiB7XG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGxpc3RlbmVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBwbGF0Zm9ybSBpcyBkaXNwb3NlZC5cbiAgICovXG4gIGFic3RyYWN0IHJlZ2lzdGVyRGlzcG9zZUxpc3RlbmVyKGRpc3Bvc2U6ICgpID0+IHZvaWQpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgcGxhdGZvcm0ge0BsaW5rIEluamVjdG9yfSwgd2hpY2ggaXMgdGhlIHBhcmVudCBpbmplY3RvciBmb3JcbiAgICogZXZlcnkgQW5ndWxhciBhcHBsaWNhdGlvbiBvbiB0aGUgcGFnZSBhbmQgcHJvdmlkZXMgc2luZ2xldG9uIHByb3ZpZGVycy5cbiAgICovXG4gIGdldCBpbmplY3RvcigpOiBJbmplY3RvciB7IHJldHVybiB1bmltcGxlbWVudGVkKCk7IH07XG5cbiAgLyoqXG4gICAqIEluc3RhbnRpYXRlIGEgbmV3IEFuZ3VsYXIgYXBwbGljYXRpb24gb24gdGhlIHBhZ2UuXG4gICAqXG4gICAqICMjIyBXaGF0IGlzIGFuIGFwcGxpY2F0aW9uP1xuICAgKlxuICAgKiBFYWNoIEFuZ3VsYXIgYXBwbGljYXRpb24gaGFzIGl0cyBvd24gem9uZSwgY2hhbmdlIGRldGVjdGlvbiwgY29tcGlsZXIsXG4gICAqIHJlbmRlcmVyLCBhbmQgb3RoZXIgZnJhbWV3b3JrIGNvbXBvbmVudHMuIEFuIGFwcGxpY2F0aW9uIGhvc3RzIG9uZSBvciBtb3JlXG4gICAqIHJvb3QgY29tcG9uZW50cywgd2hpY2ggY2FuIGJlIGluaXRpYWxpemVkIHZpYSBgQXBwbGljYXRpb25SZWYuYm9vdHN0cmFwKClgLlxuICAgKlxuICAgKiAjIyMgQXBwbGljYXRpb24gUHJvdmlkZXJzXG4gICAqXG4gICAqIEFuZ3VsYXIgYXBwbGljYXRpb25zIHJlcXVpcmUgbnVtZXJvdXMgcHJvdmlkZXJzIHRvIGJlIHByb3Blcmx5IGluc3RhbnRpYXRlZC5cbiAgICogV2hlbiB1c2luZyBgYXBwbGljYXRpb24oKWAgdG8gY3JlYXRlIGEgbmV3IGFwcCBvbiB0aGUgcGFnZSwgdGhlc2UgcHJvdmlkZXJzXG4gICAqIG11c3QgYmUgcHJvdmlkZWQuIEZvcnR1bmF0ZWx5LCB0aGVyZSBhcmUgaGVscGVyIGZ1bmN0aW9ucyB0byBjb25maWd1cmVcbiAgICogdHlwaWNhbCBwcm92aWRlcnMsIGFzIHNob3duIGluIHRoZSBleGFtcGxlIGJlbG93LlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZVxuICAgKlxuICAgKiB7QGV4YW1wbGUgY29yZS90cy9wbGF0Zm9ybS9wbGF0Zm9ybS50cyByZWdpb249J2xvbmdmb3JtJ31cbiAgICogIyMjIFNlZSBBbHNvXG4gICAqXG4gICAqIFNlZSB0aGUge0BsaW5rIGJvb3RzdHJhcH0gZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKi9cbiAgYWJzdHJhY3QgYXBwbGljYXRpb24ocHJvdmlkZXJzOiBBcnJheTxUeXBlIHwgUHJvdmlkZXIgfCBhbnlbXT4pOiBBcHBsaWNhdGlvblJlZjtcblxuICAvKipcbiAgICogSW5zdGFudGlhdGUgYSBuZXcgQW5ndWxhciBhcHBsaWNhdGlvbiBvbiB0aGUgcGFnZSwgdXNpbmcgcHJvdmlkZXJzIHdoaWNoXG4gICAqIGFyZSBvbmx5IGF2YWlsYWJsZSBhc3luY2hyb25vdXNseS4gT25lIHN1Y2ggdXNlIGNhc2UgaXMgdG8gaW5pdGlhbGl6ZSBhblxuICAgKiBhcHBsaWNhdGlvbiBydW5uaW5nIGluIGEgd2ViIHdvcmtlci5cbiAgICpcbiAgICogIyMjIFVzYWdlXG4gICAqXG4gICAqIGBiaW5kaW5nRm5gIGlzIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBpbiB0aGUgbmV3IGFwcGxpY2F0aW9uJ3Mgem9uZS5cbiAgICogSXQgc2hvdWxkIHJldHVybiBhIGBQcm9taXNlYCB0byBhIGxpc3Qgb2YgcHJvdmlkZXJzIHRvIGJlIHVzZWQgZm9yIHRoZVxuICAgKiBuZXcgYXBwbGljYXRpb24uIE9uY2UgdGhpcyBwcm9taXNlIHJlc29sdmVzLCB0aGUgYXBwbGljYXRpb24gd2lsbCBiZVxuICAgKiBjb25zdHJ1Y3RlZCBpbiB0aGUgc2FtZSBtYW5uZXIgYXMgYSBub3JtYWwgYGFwcGxpY2F0aW9uKClgLlxuICAgKi9cbiAgYWJzdHJhY3QgYXN5bmNBcHBsaWNhdGlvbihiaW5kaW5nRm46ICh6b25lOiBOZ1pvbmUpID0+IFByb21pc2U8QXJyYXk8VHlwZSB8IFByb3ZpZGVyIHwgYW55W10+PixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcnM/OiBBcnJheTxUeXBlIHwgUHJvdmlkZXIgfCBhbnlbXT4pOiBQcm9taXNlPEFwcGxpY2F0aW9uUmVmPjtcblxuICAvKipcbiAgICogRGVzdHJveSB0aGUgQW5ndWxhciBwbGF0Zm9ybSBhbmQgYWxsIEFuZ3VsYXIgYXBwbGljYXRpb25zIG9uIHRoZSBwYWdlLlxuICAgKi9cbiAgYWJzdHJhY3QgZGlzcG9zZSgpOiB2b2lkO1xufVxuXG5leHBvcnQgY2xhc3MgUGxhdGZvcm1SZWZfIGV4dGVuZHMgUGxhdGZvcm1SZWYge1xuICAvKiogQGludGVybmFsICovXG4gIF9hcHBsaWNhdGlvbnM6IEFwcGxpY2F0aW9uUmVmW10gPSBbXTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZGlzcG9zZUxpc3RlbmVyczogRnVuY3Rpb25bXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2luamVjdG9yOiBJbmplY3RvciwgcHJpdmF0ZSBfZGlzcG9zZTogKCkgPT4gdm9pZCkgeyBzdXBlcigpOyB9XG5cbiAgcmVnaXN0ZXJEaXNwb3NlTGlzdGVuZXIoZGlzcG9zZTogKCkgPT4gdm9pZCk6IHZvaWQgeyB0aGlzLl9kaXNwb3NlTGlzdGVuZXJzLnB1c2goZGlzcG9zZSk7IH1cblxuICBnZXQgaW5qZWN0b3IoKTogSW5qZWN0b3IgeyByZXR1cm4gdGhpcy5faW5qZWN0b3I7IH1cblxuICBhcHBsaWNhdGlvbihwcm92aWRlcnM6IEFycmF5PFR5cGUgfCBQcm92aWRlciB8IGFueVtdPik6IEFwcGxpY2F0aW9uUmVmIHtcbiAgICB2YXIgYXBwID0gdGhpcy5faW5pdEFwcChjcmVhdGVOZ1pvbmUoKSwgcHJvdmlkZXJzKTtcbiAgICByZXR1cm4gYXBwO1xuICB9XG5cbiAgYXN5bmNBcHBsaWNhdGlvbihiaW5kaW5nRm46ICh6b25lOiBOZ1pvbmUpID0+IFByb21pc2U8QXJyYXk8VHlwZSB8IFByb3ZpZGVyIHwgYW55W10+PixcbiAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsUHJvdmlkZXJzPzogQXJyYXk8VHlwZSB8IFByb3ZpZGVyIHwgYW55W10+KTogUHJvbWlzZTxBcHBsaWNhdGlvblJlZj4ge1xuICAgIHZhciB6b25lID0gY3JlYXRlTmdab25lKCk7XG4gICAgdmFyIGNvbXBsZXRlciA9IFByb21pc2VXcmFwcGVyLmNvbXBsZXRlcigpO1xuICAgIHpvbmUucnVuKCgpID0+IHtcbiAgICAgIFByb21pc2VXcmFwcGVyLnRoZW4oYmluZGluZ0ZuKHpvbmUpLCAocHJvdmlkZXJzOiBBcnJheTxUeXBlIHwgUHJvdmlkZXIgfCBhbnlbXT4pID0+IHtcbiAgICAgICAgaWYgKGlzUHJlc2VudChhZGRpdGlvbmFsUHJvdmlkZXJzKSkge1xuICAgICAgICAgIHByb3ZpZGVycyA9IExpc3RXcmFwcGVyLmNvbmNhdChwcm92aWRlcnMsIGFkZGl0aW9uYWxQcm92aWRlcnMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbXBsZXRlci5yZXNvbHZlKHRoaXMuX2luaXRBcHAoem9uZSwgcHJvdmlkZXJzKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gY29tcGxldGVyLnByb21pc2U7XG4gIH1cblxuICBwcml2YXRlIF9pbml0QXBwKHpvbmU6IE5nWm9uZSwgcHJvdmlkZXJzOiBBcnJheTxUeXBlIHwgUHJvdmlkZXIgfCBhbnlbXT4pOiBBcHBsaWNhdGlvblJlZiB7XG4gICAgdmFyIGluamVjdG9yOiBJbmplY3RvcjtcbiAgICB2YXIgYXBwOiBBcHBsaWNhdGlvblJlZjtcbiAgICB6b25lLnJ1bigoKSA9PiB7XG4gICAgICBwcm92aWRlcnMgPSBMaXN0V3JhcHBlci5jb25jYXQocHJvdmlkZXJzLCBbXG4gICAgICAgIHByb3ZpZGUoTmdab25lLCB7dXNlVmFsdWU6IHpvbmV9KSxcbiAgICAgICAgcHJvdmlkZShBcHBsaWNhdGlvblJlZiwge3VzZUZhY3Rvcnk6ICgpOiBBcHBsaWNhdGlvblJlZiA9PiBhcHAsIGRlcHM6IFtdfSlcbiAgICAgIF0pO1xuXG4gICAgICB2YXIgZXhjZXB0aW9uSGFuZGxlcjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGluamVjdG9yID0gdGhpcy5pbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlQ2hpbGQocHJvdmlkZXJzKTtcbiAgICAgICAgZXhjZXB0aW9uSGFuZGxlciA9IGluamVjdG9yLmdldChFeGNlcHRpb25IYW5kbGVyKTtcbiAgICAgICAgem9uZS5vdmVycmlkZU9uRXJyb3JIYW5kbGVyKChlLCBzKSA9PiBleGNlcHRpb25IYW5kbGVyLmNhbGwoZSwgcykpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoaXNQcmVzZW50KGV4Y2VwdGlvbkhhbmRsZXIpKSB7XG4gICAgICAgICAgZXhjZXB0aW9uSGFuZGxlci5jYWxsKGUsIGUuc3RhY2spO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByaW50KGUudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBhcHAgPSBuZXcgQXBwbGljYXRpb25SZWZfKHRoaXMsIHpvbmUsIGluamVjdG9yKTtcbiAgICB0aGlzLl9hcHBsaWNhdGlvbnMucHVzaChhcHApO1xuICAgIF9ydW5BcHBJbml0aWFsaXplcnMoaW5qZWN0b3IpO1xuICAgIHJldHVybiBhcHA7XG4gIH1cblxuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIExpc3RXcmFwcGVyLmNsb25lKHRoaXMuX2FwcGxpY2F0aW9ucykuZm9yRWFjaCgoYXBwKSA9PiBhcHAuZGlzcG9zZSgpKTtcbiAgICB0aGlzLl9kaXNwb3NlTGlzdGVuZXJzLmZvckVhY2goKGRpc3Bvc2UpID0+IGRpc3Bvc2UoKSk7XG4gICAgdGhpcy5fZGlzcG9zZSgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfYXBwbGljYXRpb25EaXNwb3NlZChhcHA6IEFwcGxpY2F0aW9uUmVmKTogdm9pZCB7IExpc3RXcmFwcGVyLnJlbW92ZSh0aGlzLl9hcHBsaWNhdGlvbnMsIGFwcCk7IH1cbn1cblxuZnVuY3Rpb24gX3J1bkFwcEluaXRpYWxpemVycyhpbmplY3RvcjogSW5qZWN0b3IpOiB2b2lkIHtcbiAgbGV0IGluaXRzOiBGdW5jdGlvbltdID0gaW5qZWN0b3IuZ2V0T3B0aW9uYWwoQVBQX0lOSVRJQUxJWkVSKTtcbiAgaWYgKGlzUHJlc2VudChpbml0cykpIGluaXRzLmZvckVhY2goaW5pdCA9PiBpbml0KCkpO1xufVxuXG4vKipcbiAqIEEgcmVmZXJlbmNlIHRvIGFuIEFuZ3VsYXIgYXBwbGljYXRpb24gcnVubmluZyBvbiBhIHBhZ2UuXG4gKlxuICogRm9yIG1vcmUgYWJvdXQgQW5ndWxhciBhcHBsaWNhdGlvbnMsIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3Ige0BsaW5rIGJvb3RzdHJhcH0uXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBcHBsaWNhdGlvblJlZiB7XG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGxpc3RlbmVyIHRvIGJlIGNhbGxlZCBlYWNoIHRpbWUgYGJvb3RzdHJhcCgpYCBpcyBjYWxsZWQgdG8gYm9vdHN0cmFwXG4gICAqIGEgbmV3IHJvb3QgY29tcG9uZW50LlxuICAgKi9cbiAgYWJzdHJhY3QgcmVnaXN0ZXJCb290c3RyYXBMaXN0ZW5lcihsaXN0ZW5lcjogKHJlZjogQ29tcG9uZW50UmVmKSA9PiB2b2lkKTogdm9pZDtcblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBsaXN0ZW5lciB0byBiZSBjYWxsZWQgd2hlbiB0aGUgYXBwbGljYXRpb24gaXMgZGlzcG9zZWQuXG4gICAqL1xuICBhYnN0cmFjdCByZWdpc3RlckRpc3Bvc2VMaXN0ZW5lcihkaXNwb3NlOiAoKSA9PiB2b2lkKTogdm9pZDtcblxuICAvKipcbiAgICogQm9vdHN0cmFwIGEgbmV3IGNvbXBvbmVudCBhdCB0aGUgcm9vdCBsZXZlbCBvZiB0aGUgYXBwbGljYXRpb24uXG4gICAqXG4gICAqICMjIyBCb290c3RyYXAgcHJvY2Vzc1xuICAgKlxuICAgKiBXaGVuIGJvb3RzdHJhcHBpbmcgYSBuZXcgcm9vdCBjb21wb25lbnQgaW50byBhbiBhcHBsaWNhdGlvbiwgQW5ndWxhciBtb3VudHMgdGhlXG4gICAqIHNwZWNpZmllZCBhcHBsaWNhdGlvbiBjb21wb25lbnQgb250byBET00gZWxlbWVudHMgaWRlbnRpZmllZCBieSB0aGUgW2NvbXBvbmVudFR5cGVdJ3NcbiAgICogc2VsZWN0b3IgYW5kIGtpY2tzIG9mZiBhdXRvbWF0aWMgY2hhbmdlIGRldGVjdGlvbiB0byBmaW5pc2ggaW5pdGlhbGl6aW5nIHRoZSBjb21wb25lbnQuXG4gICAqXG4gICAqICMjIyBPcHRpb25hbCBQcm92aWRlcnNcbiAgICpcbiAgICogUHJvdmlkZXJzIGZvciB0aGUgZ2l2ZW4gY29tcG9uZW50IGNhbiBvcHRpb25hbGx5IGJlIG92ZXJyaWRkZW4gdmlhIHRoZSBgcHJvdmlkZXJzYFxuICAgKiBwYXJhbWV0ZXIuIFRoZXNlIHByb3ZpZGVycyB3aWxsIG9ubHkgYXBwbHkgZm9yIHRoZSByb290IGNvbXBvbmVudCBiZWluZyBhZGRlZCBhbmQgYW55XG4gICAqIGNoaWxkIGNvbXBvbmVudHMgdW5kZXIgaXQuXG4gICAqXG4gICAqICMjIyBFeGFtcGxlXG4gICAqIHtAZXhhbXBsZSBjb3JlL3RzL3BsYXRmb3JtL3BsYXRmb3JtLnRzIHJlZ2lvbj0nbG9uZ2Zvcm0nfVxuICAgKi9cbiAgYWJzdHJhY3QgYm9vdHN0cmFwKGNvbXBvbmVudFR5cGU6IFR5cGUsXG4gICAgICAgICAgICAgICAgICAgICBwcm92aWRlcnM/OiBBcnJheTxUeXBlIHwgUHJvdmlkZXIgfCBhbnlbXT4pOiBQcm9taXNlPENvbXBvbmVudFJlZj47XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHRoZSBhcHBsaWNhdGlvbiB7QGxpbmsgSW5qZWN0b3J9LlxuICAgKi9cbiAgZ2V0IGluamVjdG9yKCk6IEluamVjdG9yIHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfTtcblxuICAvKipcbiAgICogUmV0cmlldmUgdGhlIGFwcGxpY2F0aW9uIHtAbGluayBOZ1pvbmV9LlxuICAgKi9cbiAgZ2V0IHpvbmUoKTogTmdab25lIHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfTtcblxuICAvKipcbiAgICogRGlzcG9zZSBvZiB0aGlzIGFwcGxpY2F0aW9uIGFuZCBhbGwgb2YgaXRzIGNvbXBvbmVudHMuXG4gICAqL1xuICBhYnN0cmFjdCBkaXNwb3NlKCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEludm9rZSB0aGlzIG1ldGhvZCB0byBleHBsaWNpdGx5IHByb2Nlc3MgY2hhbmdlIGRldGVjdGlvbiBhbmQgaXRzIHNpZGUtZWZmZWN0cy5cbiAgICpcbiAgICogSW4gZGV2ZWxvcG1lbnQgbW9kZSwgYHRpY2soKWAgYWxzbyBwZXJmb3JtcyBhIHNlY29uZCBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlIHRvIGVuc3VyZSB0aGF0IG5vXG4gICAqIGZ1cnRoZXIgY2hhbmdlcyBhcmUgZGV0ZWN0ZWQuIElmIGFkZGl0aW9uYWwgY2hhbmdlcyBhcmUgcGlja2VkIHVwIGR1cmluZyB0aGlzIHNlY29uZCBjeWNsZSxcbiAgICogYmluZGluZ3MgaW4gdGhlIGFwcCBoYXZlIHNpZGUtZWZmZWN0cyB0aGF0IGNhbm5vdCBiZSByZXNvbHZlZCBpbiBhIHNpbmdsZSBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAqIHBhc3MuXG4gICAqIEluIHRoaXMgY2FzZSwgQW5ndWxhciB0aHJvd3MgYW4gZXJyb3IsIHNpbmNlIGFuIEFuZ3VsYXIgYXBwbGljYXRpb24gY2FuIG9ubHkgaGF2ZSBvbmUgY2hhbmdlXG4gICAqIGRldGVjdGlvbiBwYXNzIGR1cmluZyB3aGljaCBhbGwgY2hhbmdlIGRldGVjdGlvbiBtdXN0IGNvbXBsZXRlLlxuICAgKi9cbiAgYWJzdHJhY3QgdGljaygpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBHZXQgYSBsaXN0IG9mIGNvbXBvbmVudCB0eXBlcyByZWdpc3RlcmVkIHRvIHRoaXMgYXBwbGljYXRpb24uXG4gICAqL1xuICBnZXQgY29tcG9uZW50VHlwZXMoKTogVHlwZVtdIHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfTtcbn1cblxuZXhwb3J0IGNsYXNzIEFwcGxpY2F0aW9uUmVmXyBleHRlbmRzIEFwcGxpY2F0aW9uUmVmIHtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzdGF0aWMgX3RpY2tTY29wZTogV3RmU2NvcGVGbiA9IHd0ZkNyZWF0ZVNjb3BlKCdBcHBsaWNhdGlvblJlZiN0aWNrKCknKTtcblxuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgX2Jvb3RzdHJhcExpc3RlbmVyczogRnVuY3Rpb25bXSA9IFtdO1xuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgX2Rpc3Bvc2VMaXN0ZW5lcnM6IEZ1bmN0aW9uW10gPSBbXTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcml2YXRlIF9yb290Q29tcG9uZW50czogQ29tcG9uZW50UmVmW10gPSBbXTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcml2YXRlIF9yb290Q29tcG9uZW50VHlwZXM6IFR5cGVbXSA9IFtdO1xuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgX2NoYW5nZURldGVjdG9yUmVmczogQ2hhbmdlRGV0ZWN0b3JSZWZbXSA9IFtdO1xuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgX3J1bm5pbmdUaWNrOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSBfZW5mb3JjZU5vTmV3Q2hhbmdlczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3BsYXRmb3JtOiBQbGF0Zm9ybVJlZl8sIHByaXZhdGUgX3pvbmU6IE5nWm9uZSwgcHJpdmF0ZSBfaW5qZWN0b3I6IEluamVjdG9yKSB7XG4gICAgc3VwZXIoKTtcbiAgICBpZiAoaXNQcmVzZW50KHRoaXMuX3pvbmUpKSB7XG4gICAgICBPYnNlcnZhYmxlV3JhcHBlci5zdWJzY3JpYmUodGhpcy5fem9uZS5vblR1cm5Eb25lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfKSA9PiB7IHRoaXMuX3pvbmUucnVuKCgpID0+IHsgdGhpcy50aWNrKCk7IH0pOyB9KTtcbiAgICB9XG4gICAgdGhpcy5fZW5mb3JjZU5vTmV3Q2hhbmdlcyA9IGFzc2VydGlvbnNFbmFibGVkKCk7XG4gIH1cblxuICByZWdpc3RlckJvb3RzdHJhcExpc3RlbmVyKGxpc3RlbmVyOiAocmVmOiBDb21wb25lbnRSZWYpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl9ib290c3RyYXBMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gIH1cblxuICByZWdpc3RlckRpc3Bvc2VMaXN0ZW5lcihkaXNwb3NlOiAoKSA9PiB2b2lkKTogdm9pZCB7IHRoaXMuX2Rpc3Bvc2VMaXN0ZW5lcnMucHVzaChkaXNwb3NlKTsgfVxuXG4gIHJlZ2lzdGVyQ2hhbmdlRGV0ZWN0b3IoY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmKTogdm9pZCB7XG4gICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWZzLnB1c2goY2hhbmdlRGV0ZWN0b3IpO1xuICB9XG5cbiAgdW5yZWdpc3RlckNoYW5nZURldGVjdG9yKGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZik6IHZvaWQge1xuICAgIExpc3RXcmFwcGVyLnJlbW92ZSh0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZnMsIGNoYW5nZURldGVjdG9yKTtcbiAgfVxuXG4gIGJvb3RzdHJhcChjb21wb25lbnRUeXBlOiBUeXBlLFxuICAgICAgICAgICAgcHJvdmlkZXJzPzogQXJyYXk8VHlwZSB8IFByb3ZpZGVyIHwgYW55W10+KTogUHJvbWlzZTxDb21wb25lbnRSZWY+IHtcbiAgICB2YXIgY29tcGxldGVyID0gUHJvbWlzZVdyYXBwZXIuY29tcGxldGVyKCk7XG4gICAgdGhpcy5fem9uZS5ydW4oKCkgPT4ge1xuICAgICAgdmFyIGNvbXBvbmVudFByb3ZpZGVycyA9IF9jb21wb25lbnRQcm92aWRlcnMoY29tcG9uZW50VHlwZSk7XG4gICAgICBpZiAoaXNQcmVzZW50KHByb3ZpZGVycykpIHtcbiAgICAgICAgY29tcG9uZW50UHJvdmlkZXJzLnB1c2gocHJvdmlkZXJzKTtcbiAgICAgIH1cbiAgICAgIHZhciBleGNlcHRpb25IYW5kbGVyID0gdGhpcy5faW5qZWN0b3IuZ2V0KEV4Y2VwdGlvbkhhbmRsZXIpO1xuICAgICAgdGhpcy5fcm9vdENvbXBvbmVudFR5cGVzLnB1c2goY29tcG9uZW50VHlwZSk7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgaW5qZWN0b3I6IEluamVjdG9yID0gdGhpcy5faW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZUNoaWxkKGNvbXBvbmVudFByb3ZpZGVycyk7XG4gICAgICAgIHZhciBjb21wUmVmVG9rZW46IFByb21pc2U8Q29tcG9uZW50UmVmPiA9IGluamVjdG9yLmdldChBUFBfQ09NUE9ORU5UX1JFRl9QUk9NSVNFKTtcbiAgICAgICAgdmFyIHRpY2sgPSAoY29tcG9uZW50UmVmKSA9PiB7XG4gICAgICAgICAgdGhpcy5fbG9hZENvbXBvbmVudChjb21wb25lbnRSZWYpO1xuICAgICAgICAgIGNvbXBsZXRlci5yZXNvbHZlKGNvbXBvbmVudFJlZik7XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIHRpY2tSZXN1bHQgPSBQcm9taXNlV3JhcHBlci50aGVuKGNvbXBSZWZUb2tlbiwgdGljayk7XG5cbiAgICAgICAgLy8gVEhJUyBNVVNUIE9OTFkgUlVOIElOIERBUlQuXG4gICAgICAgIC8vIFRoaXMgaXMgcmVxdWlyZWQgdG8gcmVwb3J0IGFuIGVycm9yIHdoZW4gbm8gY29tcG9uZW50cyB3aXRoIGEgbWF0Y2hpbmcgc2VsZWN0b3IgZm91bmQuXG4gICAgICAgIC8vIE90aGVyd2lzZSB0aGUgcHJvbWlzZSB3aWxsIG5ldmVyIGJlIGNvbXBsZXRlZC5cbiAgICAgICAgLy8gRG9pbmcgdGhpcyBpbiBKUyBjYXVzZXMgYW4gZXh0cmEgZXJyb3IgbWVzc2FnZSB0byBhcHBlYXIuXG4gICAgICAgIGlmIChJU19EQVJUKSB7XG4gICAgICAgICAgUHJvbWlzZVdyYXBwZXIudGhlbih0aWNrUmVzdWx0LCAoXykgPT4ge30pO1xuICAgICAgICB9XG5cbiAgICAgICAgUHJvbWlzZVdyYXBwZXIudGhlbih0aWNrUmVzdWx0LCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnIsIHN0YWNrVHJhY2UpID0+IGNvbXBsZXRlci5yZWplY3QoZXJyLCBzdGFja1RyYWNlKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGV4Y2VwdGlvbkhhbmRsZXIuY2FsbChlLCBlLnN0YWNrKTtcbiAgICAgICAgY29tcGxldGVyLnJlamVjdChlLCBlLnN0YWNrKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY29tcGxldGVyLnByb21pc2UudGhlbihfID0+IHtcbiAgICAgIGxldCBjID0gdGhpcy5faW5qZWN0b3IuZ2V0KENvbnNvbGUpO1xuICAgICAgbGV0IG1vZGVEZXNjcmlwdGlvbiA9XG4gICAgICAgICAgYXNzZXJ0aW9uc0VuYWJsZWQoKSA/XG4gICAgICAgICAgICAgIFwiaW4gdGhlIGRldmVsb3BtZW50IG1vZGUuIENhbGwgZW5hYmxlUHJvZE1vZGUoKSB0byBlbmFibGUgdGhlIHByb2R1Y3Rpb24gbW9kZS5cIiA6XG4gICAgICAgICAgICAgIFwiaW4gdGhlIHByb2R1Y3Rpb24gbW9kZS4gQ2FsbCBlbmFibGVEZXZNb2RlKCkgdG8gZW5hYmxlIHRoZSBkZXZlbG9wbWVudCBtb2RlLlwiO1xuICAgICAgYy5sb2coYEFuZ3VsYXIgMiBpcyBydW5uaW5nICR7bW9kZURlc2NyaXB0aW9ufWApO1xuICAgICAgcmV0dXJuIF87XG4gICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9sb2FkQ29tcG9uZW50KHJlZik6IHZvaWQge1xuICAgIHZhciBhcHBDaGFuZ2VEZXRlY3RvciA9IGludGVybmFsVmlldyhyZWYuaG9zdFZpZXcpLmNoYW5nZURldGVjdG9yO1xuICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmcy5wdXNoKGFwcENoYW5nZURldGVjdG9yLnJlZik7XG4gICAgdGhpcy50aWNrKCk7XG4gICAgdGhpcy5fcm9vdENvbXBvbmVudHMucHVzaChyZWYpO1xuICAgIHRoaXMuX2Jvb3RzdHJhcExpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT4gbGlzdGVuZXIocmVmKSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF91bmxvYWRDb21wb25lbnQocmVmKTogdm9pZCB7XG4gICAgaWYgKCFMaXN0V3JhcHBlci5jb250YWlucyh0aGlzLl9yb290Q29tcG9uZW50cywgcmVmKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnVucmVnaXN0ZXJDaGFuZ2VEZXRlY3RvcihpbnRlcm5hbFZpZXcocmVmLmhvc3RWaWV3KS5jaGFuZ2VEZXRlY3Rvci5yZWYpO1xuICAgIExpc3RXcmFwcGVyLnJlbW92ZSh0aGlzLl9yb290Q29tcG9uZW50cywgcmVmKTtcbiAgfVxuXG4gIGdldCBpbmplY3RvcigpOiBJbmplY3RvciB7IHJldHVybiB0aGlzLl9pbmplY3RvcjsgfVxuXG4gIGdldCB6b25lKCk6IE5nWm9uZSB7IHJldHVybiB0aGlzLl96b25lOyB9XG5cbiAgdGljaygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcnVubmluZ1RpY2spIHtcbiAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKFwiQXBwbGljYXRpb25SZWYudGljayBpcyBjYWxsZWQgcmVjdXJzaXZlbHlcIik7XG4gICAgfVxuXG4gICAgdmFyIHMgPSBBcHBsaWNhdGlvblJlZl8uX3RpY2tTY29wZSgpO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLl9ydW5uaW5nVGljayA9IHRydWU7XG4gICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZnMuZm9yRWFjaCgoZGV0ZWN0b3IpID0+IGRldGVjdG9yLmRldGVjdENoYW5nZXMoKSk7XG4gICAgICBpZiAodGhpcy5fZW5mb3JjZU5vTmV3Q2hhbmdlcykge1xuICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZnMuZm9yRWFjaCgoZGV0ZWN0b3IpID0+IGRldGVjdG9yLmNoZWNrTm9DaGFuZ2VzKCkpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9ydW5uaW5nVGljayA9IGZhbHNlO1xuICAgICAgd3RmTGVhdmUocyk7XG4gICAgfVxuICB9XG5cbiAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICAvLyBUT0RPKGFseGh1Yik6IERpc3Bvc2Ugb2YgdGhlIE5nWm9uZS5cbiAgICBMaXN0V3JhcHBlci5jbG9uZSh0aGlzLl9yb290Q29tcG9uZW50cykuZm9yRWFjaCgocmVmKSA9PiByZWYuZGlzcG9zZSgpKTtcbiAgICB0aGlzLl9kaXNwb3NlTGlzdGVuZXJzLmZvckVhY2goKGRpc3Bvc2UpID0+IGRpc3Bvc2UoKSk7XG4gICAgdGhpcy5fcGxhdGZvcm0uX2FwcGxpY2F0aW9uRGlzcG9zZWQodGhpcyk7XG4gIH1cblxuICBnZXQgY29tcG9uZW50VHlwZXMoKTogYW55W10geyByZXR1cm4gdGhpcy5fcm9vdENvbXBvbmVudFR5cGVzOyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9hcHBsaWNhdGlvbl9yZWYudHNcbiAqKi8iLCJpbXBvcnQge0xpc3RXcmFwcGVyLCBTdHJpbmdNYXBXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtub3JtYWxpemVCbGFuaywgaXNQcmVzZW50LCBnbG9iYWx9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge09ic2VydmFibGVXcmFwcGVyLCBFdmVudEVtaXR0ZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvYXN5bmMnO1xuaW1wb3J0IHt3dGZMZWF2ZSwgd3RmQ3JlYXRlU2NvcGUsIFd0ZlNjb3BlRm59IGZyb20gJy4uL3Byb2ZpbGUvcHJvZmlsZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmdab25lWm9uZSBleHRlbmRzIFpvbmUge1xuICAvKiogQGludGVybmFsICovXG4gIF9pbm5lclpvbmU6IGJvb2xlYW47XG59XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBhIGZ1bmN0aW9uIHdpdGggemVybyBhcmd1bWVudHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgWmVyb0FyZ0Z1bmN0aW9uIHsgKCk6IHZvaWQ7IH1cblxuLyoqXG4gKiBGdW5jdGlvbiB0eXBlIGZvciBhbiBlcnJvciBoYW5kbGVyLCB3aGljaCB0YWtlcyBhbiBlcnJvciBhbmQgYSBzdGFjayB0cmFjZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFcnJvckhhbmRsaW5nRm4geyAoZXJyb3I6IGFueSwgc3RhY2tUcmFjZTogYW55KTogdm9pZDsgfVxuXG4vKipcbiAqIFN0b3JlcyBlcnJvciBpbmZvcm1hdGlvbjsgZGVsaXZlcmVkIHZpYSBbTmdab25lLm9uRXJyb3JdIHN0cmVhbS5cbiAqL1xuZXhwb3J0IGNsYXNzIE5nWm9uZUVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIGVycm9yOiBhbnksIHB1YmxpYyBzdGFja1RyYWNlOiBhbnkpIHt9XG59XG5cbi8qKlxuICogQW4gaW5qZWN0YWJsZSBzZXJ2aWNlIGZvciBleGVjdXRpbmcgd29yayBpbnNpZGUgb3Igb3V0c2lkZSBvZiB0aGUgQW5ndWxhciB6b25lLlxuICpcbiAqIFRoZSBtb3N0IGNvbW1vbiB1c2Ugb2YgdGhpcyBzZXJ2aWNlIGlzIHRvIG9wdGltaXplIHBlcmZvcm1hbmNlIHdoZW4gc3RhcnRpbmcgYSB3b3JrIGNvbnNpc3Rpbmcgb2ZcbiAqIG9uZSBvciBtb3JlIGFzeW5jaHJvbm91cyB0YXNrcyB0aGF0IGRvbid0IHJlcXVpcmUgVUkgdXBkYXRlcyBvciBlcnJvciBoYW5kbGluZyB0byBiZSBoYW5kbGVkIGJ5XG4gKiBBbmd1bGFyLiBTdWNoIHRhc2tzIGNhbiBiZSBraWNrZWQgb2ZmIHZpYSB7QGxpbmsgI3J1bk91dHNpZGVBbmd1bGFyfSBhbmQgaWYgbmVlZGVkLCB0aGVzZSB0YXNrc1xuICogY2FuIHJlZW50ZXIgdGhlIEFuZ3VsYXIgem9uZSB2aWEge0BsaW5rICNydW59LlxuICpcbiAqIDwhLS0gVE9ETzogYWRkL2ZpeCBsaW5rcyB0bzpcbiAqICAgLSBkb2NzIGV4cGxhaW5pbmcgem9uZXMgYW5kIHRoZSB1c2Ugb2Ygem9uZXMgaW4gQW5ndWxhciBhbmQgY2hhbmdlLWRldGVjdGlvblxuICogICAtIGxpbmsgdG8gcnVuT3V0c2lkZUFuZ3VsYXIvcnVuICh0aHJvdWdob3V0IHRoaXMgZmlsZSEpXG4gKiAgIC0tPlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9sWTltOEhMeTd6MDZ2RG9VYVNOMj9wPXByZXZpZXcpKVxuICogYGBgXG4gKiBpbXBvcnQge0NvbXBvbmVudCwgVmlldywgTmdab25lfSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbiAqIGltcG9ydCB7TmdJZn0gZnJvbSAnYW5ndWxhcjIvY29tbW9uJztcbiAqXG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICduZy16b25lLWRlbW8nLlxuICogICB0ZW1wbGF0ZTogYFxuICogICAgIDxoMj5EZW1vOiBOZ1pvbmU8L2gyPlxuICpcbiAqICAgICA8cD5Qcm9ncmVzczoge3twcm9ncmVzc319JTwvcD5cbiAqICAgICA8cCAqbmdJZj1cInByb2dyZXNzID49IDEwMFwiPkRvbmUgcHJvY2Vzc2luZyB7e2xhYmVsfX0gb2YgQW5ndWxhciB6b25lITwvcD5cbiAqXG4gKiAgICAgPGJ1dHRvbiAoY2xpY2spPVwicHJvY2Vzc1dpdGhpbkFuZ3VsYXJab25lKClcIj5Qcm9jZXNzIHdpdGhpbiBBbmd1bGFyIHpvbmU8L2J1dHRvbj5cbiAqICAgICA8YnV0dG9uIChjbGljayk9XCJwcm9jZXNzT3V0c2lkZU9mQW5ndWxhclpvbmUoKVwiPlByb2Nlc3Mgb3V0c2lkZSBvZiBBbmd1bGFyIHpvbmU8L2J1dHRvbj5cbiAqICAgYCxcbiAqICAgZGlyZWN0aXZlczogW05nSWZdXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIE5nWm9uZURlbW8ge1xuICogICBwcm9ncmVzczogbnVtYmVyID0gMDtcbiAqICAgbGFiZWw6IHN0cmluZztcbiAqXG4gKiAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX25nWm9uZTogTmdab25lKSB7fVxuICpcbiAqICAgLy8gTG9vcCBpbnNpZGUgdGhlIEFuZ3VsYXIgem9uZVxuICogICAvLyBzbyB0aGUgVUkgRE9FUyByZWZyZXNoIGFmdGVyIGVhY2ggc2V0VGltZW91dCBjeWNsZVxuICogICBwcm9jZXNzV2l0aGluQW5ndWxhclpvbmUoKSB7XG4gKiAgICAgdGhpcy5sYWJlbCA9ICdpbnNpZGUnO1xuICogICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xuICogICAgIHRoaXMuX2luY3JlYXNlUHJvZ3Jlc3MoKCkgPT4gY29uc29sZS5sb2coJ0luc2lkZSBEb25lIScpKTtcbiAqICAgfVxuICpcbiAqICAgLy8gTG9vcCBvdXRzaWRlIG9mIHRoZSBBbmd1bGFyIHpvbmVcbiAqICAgLy8gc28gdGhlIFVJIERPRVMgTk9UIHJlZnJlc2ggYWZ0ZXIgZWFjaCBzZXRUaW1lb3V0IGN5Y2xlXG4gKiAgIHByb2Nlc3NPdXRzaWRlT2ZBbmd1bGFyWm9uZSgpIHtcbiAqICAgICB0aGlzLmxhYmVsID0gJ291dHNpZGUnO1xuICogICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xuICogICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gKiAgICAgICB0aGlzLl9pbmNyZWFzZVByb2dyZXNzKCgpID0+IHtcbiAqICAgICAgIC8vIHJlZW50ZXIgdGhlIEFuZ3VsYXIgem9uZSBhbmQgZGlzcGxheSBkb25lXG4gKiAgICAgICB0aGlzLl9uZ1pvbmUucnVuKCgpID0+IHtjb25zb2xlLmxvZygnT3V0c2lkZSBEb25lIScpIH0pO1xuICogICAgIH19KSk7XG4gKiAgIH1cbiAqXG4gKlxuICogICBfaW5jcmVhc2VQcm9ncmVzcyhkb25lQ2FsbGJhY2s6ICgpID0+IHZvaWQpIHtcbiAqICAgICB0aGlzLnByb2dyZXNzICs9IDE7XG4gKiAgICAgY29uc29sZS5sb2coYEN1cnJlbnQgcHJvZ3Jlc3M6ICR7dGhpcy5wcm9ncmVzc30lYCk7XG4gKlxuICogICAgIGlmICh0aGlzLnByb2dyZXNzIDwgMTAwKSB7XG4gKiAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB0aGlzLl9pbmNyZWFzZVByb2dyZXNzKGRvbmVDYWxsYmFjaykpLCAxMClcbiAqICAgICB9IGVsc2Uge1xuICogICAgICAgZG9uZUNhbGxiYWNrKCk7XG4gKiAgICAgfVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIE5nWm9uZSB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3J1blNjb3BlOiBXdGZTY29wZUZuID0gd3RmQ3JlYXRlU2NvcGUoYE5nWm9uZSNydW4oKWApO1xuICAvKiogQGludGVybmFsICovXG4gIF9taWNyb3Rhc2tTY29wZTogV3RmU2NvcGVGbiA9IHd0ZkNyZWF0ZVNjb3BlKGBOZ1pvbmUjbWljcm90YXNrKClgKTtcblxuICAvLyBDb2RlIGV4ZWN1dGVkIGluIF9tb3VudFpvbmUgZG9lcyBub3QgdHJpZ2dlciB0aGUgb25UdXJuRG9uZS5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfbW91bnRab25lO1xuICAvLyBfaW5uZXJab25lIGlzIHRoZSBjaGlsZCBvZiBfbW91bnRab25lLiBBbnkgY29kZSBleGVjdXRlZCBpbiB0aGlzIHpvbmUgd2lsbCB0cmlnZ2VyIHRoZVxuICAvLyBvblR1cm5Eb25lIGhvb2sgYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBWTSB0dXJuLlxuICAvKiogQGludGVybmFsICovXG4gIF9pbm5lclpvbmU7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfb25UdXJuU3RhcnQ6IFplcm9BcmdGdW5jdGlvbjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfb25UdXJuRG9uZTogWmVyb0FyZ0Z1bmN0aW9uO1xuICAvKiogQGludGVybmFsICovXG4gIF9vbkV2ZW50RG9uZTogWmVyb0FyZ0Z1bmN0aW9uO1xuICAvKiogQGludGVybmFsICovXG4gIF9vbkVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGluZ0ZuO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX29uVHVyblN0YXJ0RXZlbnRzOiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfb25UdXJuRG9uZUV2ZW50czogRXZlbnRFbWl0dGVyPGFueT47XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX29uRXZlbnREb25lRXZlbnRzOiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfb25FcnJvckV2ZW50czogRXZlbnRFbWl0dGVyPGFueT47XG5cbiAgLy8gTnVtYmVyIG9mIG1pY3JvdGFza3MgcGVuZGluZyBmcm9tIF9pbm5lclpvbmUgKCYgZGVzY2VuZGFudHMpXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3BlbmRpbmdNaWNyb3Rhc2tzOiBudW1iZXIgPSAwO1xuICAvLyBXaGV0aGVyIHNvbWUgY29kZSBoYXMgYmVlbiBleGVjdXRlZCBpbiB0aGUgX2lubmVyWm9uZSAoJiBkZXNjZW5kYW50cykgaW4gdGhlIGN1cnJlbnQgdHVyblxuICAvKiogQGludGVybmFsICovXG4gIF9oYXNFeGVjdXRlZENvZGVJbklubmVyWm9uZTogYm9vbGVhbiA9IGZhbHNlO1xuICAvLyBydW4oKSBjYWxsIGRlcHRoIGluIF9tb3VudFpvbmUuIDAgYXQgdGhlIGVuZCBvZiBhIG1hY3JvdGFza1xuICAvLyB6b25lLnJ1bigoKSA9PiB7ICAgICAgICAgLy8gdG9wLWxldmVsIGNhbGxcbiAgLy8gICB6b25lLnJ1bigoKSA9PiB7fSk7ICAgIC8vIG5lc3RlZCBjYWxsIC0+IGluLXR1cm5cbiAgLy8gfSk7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX25lc3RlZFJ1bjogbnVtYmVyID0gMDtcblxuICAvLyBUT0RPKHZpY2IpOiBpbXBsZW1lbnQgdGhpcyBjbGFzcyBwcm9wZXJseSBmb3Igbm9kZS5qcyBlbnZpcm9ubWVudFxuICAvLyBUaGlzIGRpc2FibGVkIGZsYWcgaXMgb25seSBoZXJlIHRvIHBsZWFzZSBjanMgdGVzdHNcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZGlzYWJsZWQ6IGJvb2xlYW47XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfaW5WbVR1cm5Eb25lOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcGVuZGluZ1RpbWVvdXRzOiBudW1iZXJbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2Jvb2x9IGVuYWJsZUxvbmdTdGFja1RyYWNlIHdoZXRoZXIgdG8gZW5hYmxlIGxvbmcgc3RhY2sgdHJhY2UuIFRoZXkgc2hvdWxkIG9ubHkgYmVcbiAgICogICAgICAgICAgICAgICBlbmFibGVkIGluIGRldmVsb3BtZW50IG1vZGUgYXMgdGhleSBzaWduaWZpY2FudGx5IGltcGFjdCBwZXJmLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2VuYWJsZUxvbmdTdGFja1RyYWNlfSkge1xuICAgIGlmIChnbG9iYWwuem9uZSkge1xuICAgICAgdGhpcy5fZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuX21vdW50Wm9uZSA9IGdsb2JhbC56b25lO1xuICAgICAgdGhpcy5faW5uZXJab25lID0gdGhpcy5fY3JlYXRlSW5uZXJab25lKHRoaXMuX21vdW50Wm9uZSwgZW5hYmxlTG9uZ1N0YWNrVHJhY2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9kaXNhYmxlZCA9IHRydWU7XG4gICAgICB0aGlzLl9tb3VudFpvbmUgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLl9vblR1cm5TdGFydEV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXIoZmFsc2UpO1xuICAgIHRoaXMuX29uVHVybkRvbmVFdmVudHMgPSBuZXcgRXZlbnRFbWl0dGVyKGZhbHNlKTtcbiAgICB0aGlzLl9vbkV2ZW50RG9uZUV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXIoZmFsc2UpO1xuICAgIHRoaXMuX29uRXJyb3JFdmVudHMgPSBuZXcgRXZlbnRFbWl0dGVyKGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB6b25lIGhvb2sgdGhhdCBpcyBjYWxsZWQganVzdCBiZWZvcmUgYSBicm93c2VyIHRhc2sgdGhhdCBpcyBoYW5kbGVkIGJ5IEFuZ3VsYXJcbiAgICogZXhlY3V0ZXMuXG4gICAqXG4gICAqIFRoZSBob29rIGlzIGNhbGxlZCBvbmNlIHBlciBicm93c2VyIHRhc2sgdGhhdCBpcyBoYW5kbGVkIGJ5IEFuZ3VsYXIuXG4gICAqXG4gICAqIFNldHRpbmcgdGhlIGhvb2sgb3ZlcnJpZGVzIGFueSBwcmV2aW91c2x5IHNldCBob29rLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCB0aGlzIEFQSSB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4gVXNlIGBvblR1cm5TdGFydGAgaW5zdGVhZC5cbiAgICovXG4gIG92ZXJyaWRlT25UdXJuU3RhcnQob25UdXJuU3RhcnRIb29rOiBaZXJvQXJnRnVuY3Rpb24pOiB2b2lkIHtcbiAgICB0aGlzLl9vblR1cm5TdGFydCA9IG5vcm1hbGl6ZUJsYW5rKG9uVHVyblN0YXJ0SG9vayk7XG4gIH1cblxuICAvKipcbiAgICogTm90aWZpZXMgc3Vic2NyaWJlcnMganVzdCBiZWZvcmUgQW5ndWxhciBldmVudCB0dXJuIHN0YXJ0cy5cbiAgICpcbiAgICogRW1pdHMgYW4gZXZlbnQgb25jZSBwZXIgYnJvd3NlciB0YXNrIHRoYXQgaXMgaGFuZGxlZCBieSBBbmd1bGFyLlxuICAgKi9cbiAgZ2V0IG9uVHVyblN0YXJ0KCk6IC8qIFN1YmplY3QgKi8gYW55IHsgcmV0dXJuIHRoaXMuX29uVHVyblN0YXJ0RXZlbnRzOyB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfbm90aWZ5T25UdXJuU3RhcnQocGFyZW50UnVuKTogdm9pZCB7XG4gICAgcGFyZW50UnVuLmNhbGwodGhpcy5faW5uZXJab25lLCAoKSA9PiB7IHRoaXMuX29uVHVyblN0YXJ0RXZlbnRzLmVtaXQobnVsbCk7IH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHpvbmUgaG9vayB0aGF0IGlzIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBBbmd1bGFyIHpvbmUgaXMgZG9uZSBwcm9jZXNzaW5nIHRoZSBjdXJyZW50XG4gICAqIHRhc2sgYW5kIGFueSBtaWNyb3Rhc2tzIHNjaGVkdWxlZCBmcm9tIHRoYXQgdGFzay5cbiAgICpcbiAgICogVGhpcyBpcyB3aGVyZSB3ZSB0eXBpY2FsbHkgZG8gY2hhbmdlLWRldGVjdGlvbi5cbiAgICpcbiAgICogVGhlIGhvb2sgaXMgY2FsbGVkIG9uY2UgcGVyIGJyb3dzZXIgdGFzayB0aGF0IGlzIGhhbmRsZWQgYnkgQW5ndWxhci5cbiAgICpcbiAgICogU2V0dGluZyB0aGUgaG9vayBvdmVycmlkZXMgYW55IHByZXZpb3VzbHkgc2V0IGhvb2suXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIHRoaXMgQVBJIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLiBVc2UgYG9uVHVybkRvbmVgIGluc3RlYWQuXG4gICAqL1xuICBvdmVycmlkZU9uVHVybkRvbmUob25UdXJuRG9uZUhvb2s6IFplcm9BcmdGdW5jdGlvbik6IHZvaWQge1xuICAgIHRoaXMuX29uVHVybkRvbmUgPSBub3JtYWxpemVCbGFuayhvblR1cm5Eb25lSG9vayk7XG4gIH1cblxuICAvKipcbiAgICogTm90aWZpZXMgc3Vic2NyaWJlcnMgaW1tZWRpYXRlbHkgYWZ0ZXIgQW5ndWxhciB6b25lIGlzIGRvbmUgcHJvY2Vzc2luZ1xuICAgKiB0aGUgY3VycmVudCB0dXJuIGFuZCBhbnkgbWljcm90YXNrcyBzY2hlZHVsZWQgZnJvbSB0aGF0IHR1cm4uXG4gICAqXG4gICAqIFVzZWQgYnkgQW5ndWxhciBhcyBhIHNpZ25hbCB0byBraWNrIG9mZiBjaGFuZ2UtZGV0ZWN0aW9uLlxuICAgKi9cbiAgZ2V0IG9uVHVybkRvbmUoKSB7IHJldHVybiB0aGlzLl9vblR1cm5Eb25lRXZlbnRzOyB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfbm90aWZ5T25UdXJuRG9uZShwYXJlbnRSdW4pOiB2b2lkIHtcbiAgICBwYXJlbnRSdW4uY2FsbCh0aGlzLl9pbm5lclpvbmUsICgpID0+IHsgdGhpcy5fb25UdXJuRG9uZUV2ZW50cy5lbWl0KG51bGwpOyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB6b25lIGhvb2sgdGhhdCBpcyBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGBvblR1cm5Eb25lYCBjYWxsYmFjayBpcyBjYWxsZWQgYW5kIGFueVxuICAgKiBtaWNyb3N0YXNrcyBzY2hlZHVsZWQgZnJvbSB3aXRoaW4gdGhhdCBjYWxsYmFjayBhcmUgZHJhaW5lZC5cbiAgICpcbiAgICogYG9uRXZlbnREb25lRm5gIGlzIGV4ZWN1dGVkIG91dHNpZGUgQW5ndWxhciB6b25lLCB3aGljaCBtZWFucyB0aGF0IHdlIHdpbGwgbm8gbG9uZ2VyIGF0dGVtcHQgdG9cbiAgICogc3luYyB0aGUgVUkgd2l0aCBhbnkgbW9kZWwgY2hhbmdlcyB0aGF0IG9jY3VyIHdpdGhpbiB0aGlzIGNhbGxiYWNrLlxuICAgKlxuICAgKiBUaGlzIGhvb2sgaXMgdXNlZnVsIGZvciB2YWxpZGF0aW5nIGFwcGxpY2F0aW9uIHN0YXRlIChlLmcuIGluIGEgdGVzdCkuXG4gICAqXG4gICAqIFNldHRpbmcgdGhlIGhvb2sgb3ZlcnJpZGVzIGFueSBwcmV2aW91c2x5IHNldCBob29rLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCB0aGlzIEFQSSB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4gVXNlIGBvbkV2ZW50RG9uZWAgaW5zdGVhZC5cbiAgICovXG4gIG92ZXJyaWRlT25FdmVudERvbmUob25FdmVudERvbmVGbjogWmVyb0FyZ0Z1bmN0aW9uLCBvcHRfd2FpdEZvckFzeW5jOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICB2YXIgbm9ybWFsaXplZE9uRXZlbnREb25lID0gbm9ybWFsaXplQmxhbmsob25FdmVudERvbmVGbik7XG4gICAgaWYgKG9wdF93YWl0Rm9yQXN5bmMpIHtcbiAgICAgIHRoaXMuX29uRXZlbnREb25lID0gKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuX3BlbmRpbmdUaW1lb3V0cy5sZW5ndGgpIHtcbiAgICAgICAgICBub3JtYWxpemVkT25FdmVudERvbmUoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fb25FdmVudERvbmUgPSBub3JtYWxpemVkT25FdmVudERvbmU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE5vdGlmaWVzIHN1YnNjcmliZXJzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBmaW5hbCBgb25UdXJuRG9uZWAgY2FsbGJhY2tcbiAgICogYmVmb3JlIGVuZGluZyBWTSBldmVudC5cbiAgICpcbiAgICogVGhpcyBldmVudCBpcyB1c2VmdWwgZm9yIHZhbGlkYXRpbmcgYXBwbGljYXRpb24gc3RhdGUgKGUuZy4gaW4gYSB0ZXN0KS5cbiAgICovXG4gIGdldCBvbkV2ZW50RG9uZSgpIHsgcmV0dXJuIHRoaXMuX29uRXZlbnREb25lRXZlbnRzOyB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfbm90aWZ5T25FdmVudERvbmUoKTogdm9pZCB7XG4gICAgdGhpcy5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7IHRoaXMuX29uRXZlbnREb25lRXZlbnRzLmVtaXQobnVsbCk7IH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlcmUgYXJlIGFueSBvdXRzdGFuZGluZyBtaWNyb3Rhc2tzLlxuICAgKi9cbiAgZ2V0IGhhc1BlbmRpbmdNaWNyb3Rhc2tzKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fcGVuZGluZ01pY3JvdGFza3MgPiAwOyB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlcmUgYXJlIGFueSBvdXRzdGFuZGluZyB0aW1lcnMuXG4gICAqL1xuICBnZXQgaGFzUGVuZGluZ1RpbWVycygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX3BlbmRpbmdUaW1lb3V0cy5sZW5ndGggPiAwOyB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlcmUgYXJlIGFueSBvdXRzdGFuZGluZyBhc3ljaG5yb25vdXMgdGFza3Mgb2YgYW55IGtpbmQgdGhhdCBhcmVcbiAgICogc2NoZWR1bGVkIHRvIHJ1biB3aXRoaW4gQW5ndWxhciB6b25lLlxuICAgKlxuICAgKiBVc2VmdWwgYXMgYSBzaWduYWwgb2YgVUkgc3RhYmlsaXR5LiBGb3IgZXhhbXBsZSwgd2hlbiBhIHRlc3QgcmVhY2hlcyBhXG4gICAqIHBvaW50IHdoZW4gW2hhc1BlbmRpbmdBc3luY1Rhc2tzXSBpcyBgZmFsc2VgIGl0IG1pZ2h0IGJlIGEgZ29vZCB0aW1lIHRvIHJ1blxuICAgKiB0ZXN0IGV4cGVjdGF0aW9ucy5cbiAgICovXG4gIGdldCBoYXNQZW5kaW5nQXN5bmNUYXNrcygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuaGFzUGVuZGluZ01pY3JvdGFza3MgfHwgdGhpcy5oYXNQZW5kaW5nVGltZXJzOyB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHpvbmUgaG9vayB0aGF0IGlzIGNhbGxlZCB3aGVuIGFuIGVycm9yIGlzIHRocm93biBpbiB0aGUgQW5ndWxhciB6b25lLlxuICAgKlxuICAgKiBTZXR0aW5nIHRoZSBob29rIG92ZXJyaWRlcyBhbnkgcHJldmlvdXNseSBzZXQgaG9vay5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgdGhpcyBBUEkgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuIFVzZSBgb25FcnJvcmAgaW5zdGVhZC5cbiAgICovXG4gIG92ZXJyaWRlT25FcnJvckhhbmRsZXIoZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsaW5nRm4pIHtcbiAgICB0aGlzLl9vbkVycm9ySGFuZGxlciA9IG5vcm1hbGl6ZUJsYW5rKGVycm9ySGFuZGxlcik7XG4gIH1cblxuICBnZXQgb25FcnJvcigpIHsgcmV0dXJuIHRoaXMuX29uRXJyb3JFdmVudHM7IH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgdGhlIGBmbmAgZnVuY3Rpb24gc3luY2hyb25vdXNseSB3aXRoaW4gdGhlIEFuZ3VsYXIgem9uZSBhbmQgcmV0dXJucyB2YWx1ZSByZXR1cm5lZCBieVxuICAgKiB0aGUgZnVuY3Rpb24uXG4gICAqXG4gICAqIFJ1bm5pbmcgZnVuY3Rpb25zIHZpYSBgcnVuYCBhbGxvd3MgeW91IHRvIHJlZW50ZXIgQW5ndWxhciB6b25lIGZyb20gYSB0YXNrIHRoYXQgd2FzIGV4ZWN1dGVkXG4gICAqIG91dHNpZGUgb2YgdGhlIEFuZ3VsYXIgem9uZSAodHlwaWNhbGx5IHN0YXJ0ZWQgdmlhIHtAbGluayAjcnVuT3V0c2lkZUFuZ3VsYXJ9KS5cbiAgICpcbiAgICogQW55IGZ1dHVyZSB0YXNrcyBvciBtaWNyb3Rhc2tzIHNjaGVkdWxlZCBmcm9tIHdpdGhpbiB0aGlzIGZ1bmN0aW9uIHdpbGwgY29udGludWUgZXhlY3V0aW5nIGZyb21cbiAgICogd2l0aGluIHRoZSBBbmd1bGFyIHpvbmUuXG4gICAqL1xuICBydW4oZm46ICgpID0+IGFueSk6IGFueSB7XG4gICAgaWYgKHRoaXMuX2Rpc2FibGVkKSB7XG4gICAgICByZXR1cm4gZm4oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHMgPSB0aGlzLl9ydW5TY29wZSgpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lubmVyWm9uZS5ydW4oZm4pO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgd3RmTGVhdmUocyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIHRoZSBgZm5gIGZ1bmN0aW9uIHN5bmNocm9ub3VzbHkgaW4gQW5ndWxhcidzIHBhcmVudCB6b25lIGFuZCByZXR1cm5zIHZhbHVlIHJldHVybmVkIGJ5XG4gICAqIHRoZSBmdW5jdGlvbi5cbiAgICpcbiAgICogUnVubmluZyBmdW5jdGlvbnMgdmlhIGBydW5PdXRzaWRlQW5ndWxhcmAgYWxsb3dzIHlvdSB0byBlc2NhcGUgQW5ndWxhcidzIHpvbmUgYW5kIGRvIHdvcmsgdGhhdFxuICAgKiBkb2Vzbid0IHRyaWdnZXIgQW5ndWxhciBjaGFuZ2UtZGV0ZWN0aW9uIG9yIGlzIHN1YmplY3QgdG8gQW5ndWxhcidzIGVycm9yIGhhbmRsaW5nLlxuICAgKlxuICAgKiBBbnkgZnV0dXJlIHRhc2tzIG9yIG1pY3JvdGFza3Mgc2NoZWR1bGVkIGZyb20gd2l0aGluIHRoaXMgZnVuY3Rpb24gd2lsbCBjb250aW51ZSBleGVjdXRpbmcgZnJvbVxuICAgKiBvdXRzaWRlIG9mIHRoZSBBbmd1bGFyIHpvbmUuXG4gICAqXG4gICAqIFVzZSB7QGxpbmsgI3J1bn0gdG8gcmVlbnRlciB0aGUgQW5ndWxhciB6b25lIGFuZCBkbyB3b3JrIHRoYXQgdXBkYXRlcyB0aGUgYXBwbGljYXRpb24gbW9kZWwuXG4gICAqL1xuICBydW5PdXRzaWRlQW5ndWxhcihmbjogKCkgPT4gYW55KTogYW55IHtcbiAgICBpZiAodGhpcy5fZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiBmbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fbW91bnRab25lLnJ1bihmbik7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfY3JlYXRlSW5uZXJab25lKHpvbmUsIGVuYWJsZUxvbmdTdGFja1RyYWNlKSB7XG4gICAgdmFyIG1pY3JvdGFza1Njb3BlID0gdGhpcy5fbWljcm90YXNrU2NvcGU7XG4gICAgdmFyIG5nWm9uZSA9IHRoaXM7XG4gICAgdmFyIGVycm9ySGFuZGxpbmc7XG5cbiAgICBpZiAoZW5hYmxlTG9uZ1N0YWNrVHJhY2UpIHtcbiAgICAgIGVycm9ySGFuZGxpbmcgPSBTdHJpbmdNYXBXcmFwcGVyLm1lcmdlKFxuICAgICAgICAgIFpvbmUubG9uZ1N0YWNrVHJhY2Vab25lLCB7b25FcnJvcjogZnVuY3Rpb24oZSkgeyBuZ1pvbmUuX25vdGlmeU9uRXJyb3IodGhpcywgZSk7IH19KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXJyb3JIYW5kbGluZyA9IHtvbkVycm9yOiBmdW5jdGlvbihlKSB7IG5nWm9uZS5fbm90aWZ5T25FcnJvcih0aGlzLCBlKTsgfX07XG4gICAgfVxuXG4gICAgcmV0dXJuIHpvbmUuZm9yayhlcnJvckhhbmRsaW5nKVxuICAgICAgICAuZm9yayh7XG4gICAgICAgICAgJyRydW4nOiBmdW5jdGlvbihwYXJlbnRSdW4pIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBuZ1pvbmUuX25lc3RlZFJ1bisrO1xuICAgICAgICAgICAgICAgIGlmICghbmdab25lLl9oYXNFeGVjdXRlZENvZGVJbklubmVyWm9uZSkge1xuICAgICAgICAgICAgICAgICAgbmdab25lLl9oYXNFeGVjdXRlZENvZGVJbklubmVyWm9uZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICBuZ1pvbmUuX25vdGlmeU9uVHVyblN0YXJ0KHBhcmVudFJ1bik7XG4gICAgICAgICAgICAgICAgICBpZiAobmdab25lLl9vblR1cm5TdGFydCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRSdW4uY2FsbChuZ1pvbmUuX2lubmVyWm9uZSwgbmdab25lLl9vblR1cm5TdGFydCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnRSdW4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBuZ1pvbmUuX25lc3RlZFJ1bi0tO1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBtb3JlIHBlbmRpbmcgbWljcm90YXNrcywgd2UgYXJlIGF0IHRoZSBlbmQgb2YgYSBWTSB0dXJuIChvciBpblxuICAgICAgICAgICAgICAgIC8vIG9uVHVyblN0YXJ0KVxuICAgICAgICAgICAgICAgIC8vIF9uZXN0ZWRSdW4gd2lsbCBiZSAwIGF0IHRoZSBlbmQgb2YgYSBtYWNyb3Rhc2tzIChpdCBjb3VsZCBiZSA+IDAgd2hlbiB0aGVyZSBhcmVcbiAgICAgICAgICAgICAgICAvLyBuZXN0ZWQgY2FsbHNcbiAgICAgICAgICAgICAgICAvLyB0byBydW4oKSkuXG4gICAgICAgICAgICAgICAgaWYgKG5nWm9uZS5fcGVuZGluZ01pY3JvdGFza3MgPT0gMCAmJiBuZ1pvbmUuX25lc3RlZFJ1biA9PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICF0aGlzLl9pblZtVHVybkRvbmUpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChuZ1pvbmUuX2hhc0V4ZWN1dGVkQ29kZUluSW5uZXJab25lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5WbVR1cm5Eb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICBuZ1pvbmUuX25vdGlmeU9uVHVybkRvbmUocGFyZW50UnVuKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAobmdab25lLl9vblR1cm5Eb25lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRSdW4uY2FsbChuZ1pvbmUuX2lubmVyWm9uZSwgbmdab25lLl9vblR1cm5Eb25lKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5WbVR1cm5Eb25lID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgbmdab25lLl9oYXNFeGVjdXRlZENvZGVJbklubmVyWm9uZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIGlmIChuZ1pvbmUuX3BlbmRpbmdNaWNyb3Rhc2tzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG5nWm9uZS5fbm90aWZ5T25FdmVudERvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzUHJlc2VudChuZ1pvbmUuX29uRXZlbnREb25lKSkge1xuICAgICAgICAgICAgICAgICAgICAgIG5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcihuZ1pvbmUuX29uRXZlbnREb25lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9LFxuICAgICAgICAgICckc2NoZWR1bGVNaWNyb3Rhc2snOiBmdW5jdGlvbihwYXJlbnRTY2hlZHVsZU1pY3JvdGFzaykge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGZuKSB7XG4gICAgICAgICAgICAgIG5nWm9uZS5fcGVuZGluZ01pY3JvdGFza3MrKztcbiAgICAgICAgICAgICAgdmFyIG1pY3JvdGFzayA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHZhciBzID0gbWljcm90YXNrU2NvcGUoKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgbmdab25lLl9wZW5kaW5nTWljcm90YXNrcy0tO1xuICAgICAgICAgICAgICAgICAgd3RmTGVhdmUocyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBwYXJlbnRTY2hlZHVsZU1pY3JvdGFzay5jYWxsKHRoaXMsIG1pY3JvdGFzayk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0sXG4gICAgICAgICAgJyRzZXRUaW1lb3V0JzogZnVuY3Rpb24ocGFyZW50U2V0VGltZW91dCkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGZuOiBGdW5jdGlvbiwgZGVsYXk6IG51bWJlciwgLi4uYXJncykge1xuICAgICAgICAgICAgICB2YXIgaWQ7XG4gICAgICAgICAgICAgIHZhciBjYiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGZuKCk7XG4gICAgICAgICAgICAgICAgTGlzdFdyYXBwZXIucmVtb3ZlKG5nWm9uZS5fcGVuZGluZ1RpbWVvdXRzLCBpZCk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGlkID0gcGFyZW50U2V0VGltZW91dChjYiwgZGVsYXksIGFyZ3MpO1xuICAgICAgICAgICAgICBuZ1pvbmUuX3BlbmRpbmdUaW1lb3V0cy5wdXNoKGlkKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9LFxuICAgICAgICAgICckY2xlYXJUaW1lb3V0JzogZnVuY3Rpb24ocGFyZW50Q2xlYXJUaW1lb3V0KSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oaWQ6IG51bWJlcikge1xuICAgICAgICAgICAgICBwYXJlbnRDbGVhclRpbWVvdXQoaWQpO1xuICAgICAgICAgICAgICBMaXN0V3JhcHBlci5yZW1vdmUobmdab25lLl9wZW5kaW5nVGltZW91dHMsIGlkKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSxcbiAgICAgICAgICBfaW5uZXJab25lOiB0cnVlXG4gICAgICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfbm90aWZ5T25FcnJvcih6b25lLCBlKTogdm9pZCB7XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLl9vbkVycm9ySGFuZGxlcikgfHwgT2JzZXJ2YWJsZVdyYXBwZXIuaGFzU3Vic2NyaWJlcnModGhpcy5fb25FcnJvckV2ZW50cykpIHtcbiAgICAgIHZhciB0cmFjZSA9IFtub3JtYWxpemVCbGFuayhlLnN0YWNrKV07XG5cbiAgICAgIHdoaWxlICh6b25lICYmIHpvbmUuY29uc3RydWN0ZWRBdEV4Y2VwdGlvbikge1xuICAgICAgICB0cmFjZS5wdXNoKHpvbmUuY29uc3RydWN0ZWRBdEV4Y2VwdGlvbi5nZXQoKSk7XG4gICAgICAgIHpvbmUgPSB6b25lLnBhcmVudDtcbiAgICAgIH1cbiAgICAgIGlmIChPYnNlcnZhYmxlV3JhcHBlci5oYXNTdWJzY3JpYmVycyh0aGlzLl9vbkVycm9yRXZlbnRzKSkge1xuICAgICAgICBPYnNlcnZhYmxlV3JhcHBlci5jYWxsRW1pdCh0aGlzLl9vbkVycm9yRXZlbnRzLCBuZXcgTmdab25lRXJyb3IoZSwgdHJhY2UpKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1ByZXNlbnQodGhpcy5fb25FcnJvckhhbmRsZXIpKSB7XG4gICAgICAgIHRoaXMuX29uRXJyb3JIYW5kbGVyKGUsIHRyYWNlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coJyMjIF9ub3RpZnlPbkVycm9yICMjJyk7XG4gICAgICBjb25zb2xlLmxvZyhlLnN0YWNrKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS96b25lL25nX3pvbmUudHNcbiAqKi8iLCJpbXBvcnQge09wYXF1ZVRva2VuLCBQcm92aWRlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvZGknO1xuaW1wb3J0IHtDT05TVF9FWFBSLCBNYXRoLCBTdHJpbmdXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuXG4vKipcbiAqICBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IEFQUF9DT01QT05FTlRfUkVGX1BST01JU0UgPSBDT05TVF9FWFBSKG5ldyBPcGFxdWVUb2tlbignUHJvbWlzZTxDb21wb25lbnRSZWY+JykpO1xuXG4vKipcbiAqIEFuIHtAbGluayBhbmd1bGFyMi9kaS9PcGFxdWVUb2tlbn0gcmVwcmVzZW50aW5nIHRoZSBhcHBsaWNhdGlvbiByb290IHR5cGUgaW4gdGhlIHtAbGlua1xuICogSW5qZWN0b3J9LlxuICpcbiAqIGBgYFxuICogQENvbXBvbmVudCguLi4pXG4gKiBjbGFzcyBNeUFwcCB7XG4gKiAgIC4uLlxuICogfVxuICpcbiAqIGJvb3RzdHJhcChNeUFwcCkudGhlbigoYXBwUmVmOkFwcGxpY2F0aW9uUmVmKSB7XG4gKiAgIGV4cGVjdChhcHBSZWYuaW5qZWN0b3IuZ2V0KGFwcENvbXBvbmVudFR5cGVUb2tlbikpLnRvRXF1YWwoTXlBcHApO1xuICogfSk7XG4gKlxuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBBUFBfQ09NUE9ORU5UOiBPcGFxdWVUb2tlbiA9IENPTlNUX0VYUFIobmV3IE9wYXF1ZVRva2VuKCdBcHBDb21wb25lbnQnKSk7XG5cbi8qKlxuICogQSBESSBUb2tlbiByZXByZXNlbnRpbmcgYSB1bmlxdWUgc3RyaW5nIGlkIGFzc2lnbmVkIHRvIHRoZSBhcHBsaWNhdGlvbiBieSBBbmd1bGFyIGFuZCB1c2VkXG4gKiBwcmltYXJpbHkgZm9yIHByZWZpeGluZyBhcHBsaWNhdGlvbiBhdHRyaWJ1dGVzIGFuZCBDU1Mgc3R5bGVzIHdoZW5cbiAqIHtAbGluayBWaWV3RW5jYXBzdWxhdGlvbiNFbXVsYXRlZH0gaXMgYmVpbmcgdXNlZC5cbiAqXG4gKiBJZiB5b3UgbmVlZCB0byBhdm9pZCByYW5kb21seSBnZW5lcmF0ZWQgdmFsdWUgdG8gYmUgdXNlZCBhcyBhbiBhcHBsaWNhdGlvbiBpZCwgeW91IGNhbiBwcm92aWRlXG4gKiBhIGN1c3RvbSB2YWx1ZSB2aWEgYSBESSBwcm92aWRlciA8IS0tIFRPRE86IHByb3ZpZGVyIC0tPiBjb25maWd1cmluZyB0aGUgcm9vdCB7QGxpbmsgSW5qZWN0b3J9XG4gKiB1c2luZyB0aGlzIHRva2VuLlxuICovXG5leHBvcnQgY29uc3QgQVBQX0lEOiBPcGFxdWVUb2tlbiA9IENPTlNUX0VYUFIobmV3IE9wYXF1ZVRva2VuKCdBcHBJZCcpKTtcblxuZnVuY3Rpb24gX2FwcElkUmFuZG9tUHJvdmlkZXJGYWN0b3J5KCkge1xuICByZXR1cm4gYCR7X3JhbmRvbUNoYXIoKX0ke19yYW5kb21DaGFyKCl9JHtfcmFuZG9tQ2hhcigpfWA7XG59XG5cbi8qKlxuICogUHJvdmlkZXJzIHRoYXQgd2lsbCBnZW5lcmF0ZSBhIHJhbmRvbSBBUFBfSURfVE9LRU4uXG4gKi9cbmV4cG9ydCBjb25zdCBBUFBfSURfUkFORE9NX1BST1ZJREVSOiBQcm92aWRlciA9XG4gICAgQ09OU1RfRVhQUihuZXcgUHJvdmlkZXIoQVBQX0lELCB7dXNlRmFjdG9yeTogX2FwcElkUmFuZG9tUHJvdmlkZXJGYWN0b3J5LCBkZXBzOiBbXX0pKTtcblxuZnVuY3Rpb24gX3JhbmRvbUNoYXIoKTogc3RyaW5nIHtcbiAgcmV0dXJuIFN0cmluZ1dyYXBwZXIuZnJvbUNoYXJDb2RlKDk3ICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjUpKTtcbn1cblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBleGVjdXRlZCB3aGVuIGEgcGxhdGZvcm0gaXMgaW5pdGlhbGl6ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBQTEFURk9STV9JTklUSUFMSVpFUjogT3BhcXVlVG9rZW4gPVxuICAgIENPTlNUX0VYUFIobmV3IE9wYXF1ZVRva2VuKFwiUGxhdGZvcm0gSW5pdGlhbGl6ZXJcIikpO1xuXG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gYW4gYXBwbGljYXRpb24gaXMgaW5pdGlhbGl6ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBBUFBfSU5JVElBTElaRVI6IE9wYXF1ZVRva2VuID0gQ09OU1RfRVhQUihuZXcgT3BhcXVlVG9rZW4oXCJBcHBsaWNhdGlvbiBJbml0aWFsaXplclwiKSk7XG5cbi8qKlxuICogQSB0b2tlbiB3aGljaCBpbmRpY2F0ZXMgdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoZSBhcHBsaWNhdGlvblxuICovXG5leHBvcnQgY29uc3QgUEFDS0FHRV9ST09UX1VSTDogT3BhcXVlVG9rZW4gPVxuICAgIENPTlNUX0VYUFIobmV3IE9wYXF1ZVRva2VuKFwiQXBwbGljYXRpb24gUGFja2FnZXMgUm9vdCBVUkxcIikpO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvYXBwbGljYXRpb25fdG9rZW5zLnRzXG4gKiovIiwiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5pbXBvcnQge01hcCwgTWFwV3JhcHBlciwgTGlzdFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge0NPTlNULCBDT05TVF9FWFBSfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9uLCBXcmFwcGVkRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtOZ1pvbmV9IGZyb20gJy4uL3pvbmUvbmdfem9uZSc7XG5pbXBvcnQge1Byb21pc2VXcmFwcGVyLCBPYnNlcnZhYmxlV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9hc3luYyc7XG5cblxuLyoqXG4gKiBUaGUgVGVzdGFiaWxpdHkgc2VydmljZSBwcm92aWRlcyB0ZXN0aW5nIGhvb2tzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGZyb21cbiAqIHRoZSBicm93c2VyIGFuZCBieSBzZXJ2aWNlcyBzdWNoIGFzIFByb3RyYWN0b3IuIEVhY2ggYm9vdHN0cmFwcGVkIEFuZ3VsYXJcbiAqIGFwcGxpY2F0aW9uIG9uIHRoZSBwYWdlIHdpbGwgaGF2ZSBhbiBpbnN0YW5jZSBvZiBUZXN0YWJpbGl0eS5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFRlc3RhYmlsaXR5IHtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcGVuZGluZ0NvdW50OiBudW1iZXIgPSAwO1xuICAvKiogQGludGVybmFsICovXG4gIF9jYWxsYmFja3M6IEZ1bmN0aW9uW10gPSBbXTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfaXNBbmd1bGFyRXZlbnRQZW5kaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIGNvbnN0cnVjdG9yKF9uZ1pvbmU6IE5nWm9uZSkgeyB0aGlzLl93YXRjaEFuZ3VsYXJFdmVudHMoX25nWm9uZSk7IH1cblxuICAvKiogQGludGVybmFsICovXG4gIF93YXRjaEFuZ3VsYXJFdmVudHMoX25nWm9uZTogTmdab25lKTogdm9pZCB7XG4gICAgT2JzZXJ2YWJsZVdyYXBwZXIuc3Vic2NyaWJlKF9uZ1pvbmUub25UdXJuU3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfKSA9PiB7IHRoaXMuX2lzQW5ndWxhckV2ZW50UGVuZGluZyA9IHRydWU7IH0pO1xuXG4gICAgX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBPYnNlcnZhYmxlV3JhcHBlci5zdWJzY3JpYmUoX25nWm9uZS5vbkV2ZW50RG9uZSwgKF8pID0+IHtcbiAgICAgICAgaWYgKCFfbmdab25lLmhhc1BlbmRpbmdUaW1lcnMpIHtcbiAgICAgICAgICB0aGlzLl9pc0FuZ3VsYXJFdmVudFBlbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLl9ydW5DYWxsYmFja3NJZlJlYWR5KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgaW5jcmVhc2VQZW5kaW5nUmVxdWVzdENvdW50KCk6IG51bWJlciB7XG4gICAgdGhpcy5fcGVuZGluZ0NvdW50ICs9IDE7XG4gICAgcmV0dXJuIHRoaXMuX3BlbmRpbmdDb3VudDtcbiAgfVxuXG4gIGRlY3JlYXNlUGVuZGluZ1JlcXVlc3RDb3VudCgpOiBudW1iZXIge1xuICAgIHRoaXMuX3BlbmRpbmdDb3VudCAtPSAxO1xuICAgIGlmICh0aGlzLl9wZW5kaW5nQ291bnQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbigncGVuZGluZyBhc3luYyByZXF1ZXN0cyBiZWxvdyB6ZXJvJyk7XG4gICAgfVxuICAgIHRoaXMuX3J1bkNhbGxiYWNrc0lmUmVhZHkoKTtcbiAgICByZXR1cm4gdGhpcy5fcGVuZGluZ0NvdW50O1xuICB9XG5cbiAgaXNTdGFibGUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9wZW5kaW5nQ291bnQgPT0gMCAmJiAhdGhpcy5faXNBbmd1bGFyRXZlbnRQZW5kaW5nOyB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcnVuQ2FsbGJhY2tzSWZSZWFkeSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNTdGFibGUoKSkge1xuICAgICAgcmV0dXJuOyAgLy8gTm90IHJlYWR5XG4gICAgfVxuXG4gICAgLy8gU2NoZWR1bGVzIHRoZSBjYWxsIGJhY2tzIGluIGEgbmV3IGZyYW1lIHNvIHRoYXQgaXQgaXMgYWx3YXlzIGFzeW5jLlxuICAgIFByb21pc2VXcmFwcGVyLnJlc29sdmUobnVsbCkudGhlbigoXykgPT4ge1xuICAgICAgd2hpbGUgKHRoaXMuX2NhbGxiYWNrcy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgKHRoaXMuX2NhbGxiYWNrcy5wb3AoKSkoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHdoZW5TdGFibGUoY2FsbGJhY2s6IEZ1bmN0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5fY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgIHRoaXMuX3J1bkNhbGxiYWNrc0lmUmVhZHkoKTtcbiAgfVxuXG4gIGdldFBlbmRpbmdSZXF1ZXN0Q291bnQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3BlbmRpbmdDb3VudDsgfVxuXG4gIC8vIFRoaXMgb25seSBhY2NvdW50cyBmb3Igbmdab25lLCBhbmQgbm90IHBlbmRpbmcgY291bnRzLiBVc2UgYHdoZW5TdGFibGVgIHRvXG4gIC8vIGNoZWNrIGZvciBzdGFiaWxpdHkuXG4gIGlzQW5ndWxhckV2ZW50UGVuZGluZygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2lzQW5ndWxhckV2ZW50UGVuZGluZzsgfVxuXG4gIGZpbmRCaW5kaW5ncyh1c2luZzogYW55LCBwcm92aWRlcjogc3RyaW5nLCBleGFjdE1hdGNoOiBib29sZWFuKTogYW55W10ge1xuICAgIC8vIFRPRE8oanVsaWVtcik6IGltcGxlbWVudC5cbiAgICByZXR1cm4gW107XG4gIH1cblxuICBmaW5kUHJvdmlkZXJzKHVzaW5nOiBhbnksIHByb3ZpZGVyOiBzdHJpbmcsIGV4YWN0TWF0Y2g6IGJvb2xlYW4pOiBhbnlbXSB7XG4gICAgLy8gVE9ETyhqdWxpZW1yKTogaW1wbGVtZW50LlxuICAgIHJldHVybiBbXTtcbiAgfVxufVxuXG4vKipcbiAqIEEgZ2xvYmFsIHJlZ2lzdHJ5IG9mIHtAbGluayBUZXN0YWJpbGl0eX0gaW5zdGFuY2VzIGZvciBzcGVjaWZpYyBlbGVtZW50cy5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFRlc3RhYmlsaXR5UmVnaXN0cnkge1xuICAvKiogQGludGVybmFsICovXG4gIF9hcHBsaWNhdGlvbnMgPSBuZXcgTWFwPGFueSwgVGVzdGFiaWxpdHk+KCk7XG5cbiAgY29uc3RydWN0b3IoKSB7IF90ZXN0YWJpbGl0eUdldHRlci5hZGRUb1dpbmRvdyh0aGlzKTsgfVxuXG4gIHJlZ2lzdGVyQXBwbGljYXRpb24odG9rZW46IGFueSwgdGVzdGFiaWxpdHk6IFRlc3RhYmlsaXR5KSB7XG4gICAgdGhpcy5fYXBwbGljYXRpb25zLnNldCh0b2tlbiwgdGVzdGFiaWxpdHkpO1xuICB9XG5cbiAgZ2V0VGVzdGFiaWxpdHkoZWxlbTogYW55KTogVGVzdGFiaWxpdHkgeyByZXR1cm4gdGhpcy5fYXBwbGljYXRpb25zLmdldChlbGVtKTsgfVxuXG4gIGdldEFsbFRlc3RhYmlsaXRpZXMoKTogVGVzdGFiaWxpdHlbXSB7IHJldHVybiBNYXBXcmFwcGVyLnZhbHVlcyh0aGlzLl9hcHBsaWNhdGlvbnMpOyB9XG5cbiAgZmluZFRlc3RhYmlsaXR5SW5UcmVlKGVsZW06IE5vZGUsIGZpbmRJbkFuY2VzdG9yczogYm9vbGVhbiA9IHRydWUpOiBUZXN0YWJpbGl0eSB7XG4gICAgcmV0dXJuIF90ZXN0YWJpbGl0eUdldHRlci5maW5kVGVzdGFiaWxpdHlJblRyZWUodGhpcywgZWxlbSwgZmluZEluQW5jZXN0b3JzKTtcbiAgfVxufVxuXG4vKipcbiAqIEFkYXB0ZXIgaW50ZXJmYWNlIGZvciByZXRyaWV2aW5nIHRoZSBgVGVzdGFiaWxpdHlgIHNlcnZpY2UgYXNzb2NpYXRlZCBmb3IgYVxuICogcGFydGljdWxhciBjb250ZXh0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldFRlc3RhYmlsaXR5IHtcbiAgYWRkVG9XaW5kb3cocmVnaXN0cnk6IFRlc3RhYmlsaXR5UmVnaXN0cnkpOiB2b2lkO1xuICBmaW5kVGVzdGFiaWxpdHlJblRyZWUocmVnaXN0cnk6IFRlc3RhYmlsaXR5UmVnaXN0cnksIGVsZW06IGFueSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRJbkFuY2VzdG9yczogYm9vbGVhbik6IFRlc3RhYmlsaXR5O1xufVxuXG5AQ09OU1QoKVxuY2xhc3MgX05vb3BHZXRUZXN0YWJpbGl0eSBpbXBsZW1lbnRzIEdldFRlc3RhYmlsaXR5IHtcbiAgYWRkVG9XaW5kb3cocmVnaXN0cnk6IFRlc3RhYmlsaXR5UmVnaXN0cnkpOiB2b2lkIHt9XG4gIGZpbmRUZXN0YWJpbGl0eUluVHJlZShyZWdpc3RyeTogVGVzdGFiaWxpdHlSZWdpc3RyeSwgZWxlbTogYW55LFxuICAgICAgICAgICAgICAgICAgICAgICAgZmluZEluQW5jZXN0b3JzOiBib29sZWFuKTogVGVzdGFiaWxpdHkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogU2V0IHRoZSB7QGxpbmsgR2V0VGVzdGFiaWxpdHl9IGltcGxlbWVudGF0aW9uIHVzZWQgYnkgdGhlIEFuZ3VsYXIgdGVzdGluZyBmcmFtZXdvcmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRUZXN0YWJpbGl0eUdldHRlcihnZXR0ZXI6IEdldFRlc3RhYmlsaXR5KTogdm9pZCB7XG4gIF90ZXN0YWJpbGl0eUdldHRlciA9IGdldHRlcjtcbn1cblxudmFyIF90ZXN0YWJpbGl0eUdldHRlcjogR2V0VGVzdGFiaWxpdHkgPSBDT05TVF9FWFBSKG5ldyBfTm9vcEdldFRlc3RhYmlsaXR5KCkpO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvdGVzdGFiaWxpdHkvdGVzdGFiaWxpdHkudHNcbiAqKi8iLCJpbXBvcnQge0tleSwgSW5qZWN0b3IsIFJlc29sdmVkUHJvdmlkZXIsIFByb3ZpZGVyLCBwcm92aWRlLCBJbmplY3RhYmxlfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5pbXBvcnQge0NvbXBpbGVyfSBmcm9tICcuL2NvbXBpbGVyJztcbmltcG9ydCB7aXNUeXBlLCBUeXBlLCBzdHJpbmdpZnksIGlzUHJlc2VudH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7UHJvbWlzZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9hc3luYyc7XG5pbXBvcnQge0FwcFZpZXdNYW5hZ2VyfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvdmlld19tYW5hZ2VyJztcbmltcG9ydCB7RWxlbWVudFJlZn0gZnJvbSAnLi9lbGVtZW50X3JlZic7XG5pbXBvcnQge1ZpZXdSZWYsIEhvc3RWaWV3UmVmfSBmcm9tICcuL3ZpZXdfcmVmJztcblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIGluc3RhbmNlIG9mIGEgQ29tcG9uZW50IGNyZWF0ZWQgdmlhIHtAbGluayBEeW5hbWljQ29tcG9uZW50TG9hZGVyfS5cbiAqXG4gKiBgQ29tcG9uZW50UmVmYCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIENvbXBvbmVudCBJbnN0YW5jZSBhcyB3ZWxsIG90aGVyIG9iamVjdHMgcmVsYXRlZCB0byB0aGlzXG4gKiBDb21wb25lbnQgSW5zdGFuY2UgYW5kIGFsbG93cyB5b3UgdG8gZGVzdHJveSB0aGUgQ29tcG9uZW50IEluc3RhbmNlIHZpYSB0aGUge0BsaW5rICNkaXNwb3NlfVxuICogbWV0aG9kLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29tcG9uZW50UmVmIHtcbiAgLyoqXG4gICAqIFRoZSBpbmplY3RvciBwcm92aWRlZCB7QGxpbmsgRHluYW1pY0NvbXBvbmVudExvYWRlciNsb2FkQXNSb290fS5cbiAgICpcbiAgICogVE9ETyhpKTogdGhpcyBhcGkgaXMgdXNlbGVzcyBhbmQgc2hvdWxkIGJlIHJlcGxhY2VkIGJ5IGFuIGluamVjdG9yIHJldHJpZXZlZCBmcm9tXG4gICAqICAgICB0aGUgSG9zdEVsZW1lbnRSZWYsIHdoaWNoIGlzIGN1cnJlbnRseSBub3QgcG9zc2libGUuXG4gICAqL1xuICBpbmplY3RvcjogSW5qZWN0b3I7XG5cbiAgLyoqXG4gICAqIExvY2F0aW9uIG9mIHRoZSBIb3N0IEVsZW1lbnQgb2YgdGhpcyBDb21wb25lbnQgSW5zdGFuY2UuXG4gICAqL1xuICBsb2NhdGlvbjogRWxlbWVudFJlZjtcblxuICAvKipcbiAgICogVGhlIGluc3RhbmNlIG9mIHRoZSBDb21wb25lbnQuXG4gICAqL1xuICBpbnN0YW5jZTogYW55O1xuXG4gIC8qKlxuICAgKiBUaGUgdXNlciBkZWZpbmVkIGNvbXBvbmVudCB0eXBlLCByZXByZXNlbnRlZCB2aWEgdGhlIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLlxuICAgKlxuICAgKiA8IS0tIFRPRE86IGN1c3RvbWl6ZSB3b3JkaW5nIGZvciBEYXJ0IGRvY3MgLS0+XG4gICAqL1xuICBjb21wb25lbnRUeXBlOiBUeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUge0BsaW5rIFZpZXdSZWZ9IG9mIHRoZSBIb3N0IFZpZXcgb2YgdGhpcyBDb21wb25lbnQgaW5zdGFuY2UuXG4gICAqL1xuICBnZXQgaG9zdFZpZXcoKTogSG9zdFZpZXdSZWYgeyByZXR1cm4gdGhpcy5sb2NhdGlvbi5wYXJlbnRWaWV3OyB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKlxuICAgKiBUaGUgaW5zdGFuY2Ugb2YgdGhlIGNvbXBvbmVudC5cbiAgICpcbiAgICogVE9ETyhpKTogdGhpcyBhcGkgc2hvdWxkIGJlIHJlbW92ZWRcbiAgICovXG4gIGdldCBob3N0Q29tcG9uZW50KCk6IGFueSB7IHJldHVybiB0aGlzLmluc3RhbmNlOyB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgYW5kIGFsbCBvZiB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGFzc29jaWF0ZWQgd2l0aCBpdC5cbiAgICpcbiAgICogVE9ETyhpKTogcmVuYW1lIHRvIGRlc3Ryb3kgdG8gYmUgY29uc2lzdGVudCB3aXRoIEFwcFZpZXdNYW5hZ2VyIGFuZCBWaWV3Q29udGFpbmVyUmVmXG4gICAqL1xuICBhYnN0cmFjdCBkaXNwb3NlKCk7XG59XG5cbmV4cG9ydCBjbGFzcyBDb21wb25lbnRSZWZfIGV4dGVuZHMgQ29tcG9uZW50UmVmIHtcbiAgLyoqXG4gICAqIFRPRE8oaSk6IHJlZmFjdG9yIGludG8gcHVibGljL3ByaXZhdGUgZmllbGRzXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihsb2NhdGlvbjogRWxlbWVudFJlZiwgaW5zdGFuY2U6IGFueSwgY29tcG9uZW50VHlwZTogVHlwZSwgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICAgICAgICBwcml2YXRlIF9kaXNwb3NlOiAoKSA9PiB2b2lkKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247XG4gICAgdGhpcy5pbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgIHRoaXMuY29tcG9uZW50VHlwZSA9IGNvbXBvbmVudFR5cGU7XG4gICAgdGhpcy5pbmplY3RvciA9IGluamVjdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKlxuICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoaXMgQ29tcG9uZW50IGluc3RhbmNlLlxuICAgKlxuICAgKiBUT0RPKGkpOiB0aGlzIGFwaSBzaG91bGQgYmUgcmVtb3ZlZFxuICAgKi9cbiAgZ2V0IGhvc3RDb21wb25lbnRUeXBlKCk6IFR5cGUgeyByZXR1cm4gdGhpcy5jb21wb25lbnRUeXBlOyB9XG5cbiAgZGlzcG9zZSgpIHsgdGhpcy5fZGlzcG9zZSgpOyB9XG59XG5cbi8qKlxuICogU2VydmljZSBmb3IgaW5zdGFudGlhdGluZyBhIENvbXBvbmVudCBhbmQgYXR0YWNoaW5nIGl0IHRvIGEgVmlldyBhdCBhIHNwZWNpZmllZCBsb2NhdGlvbi5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIER5bmFtaWNDb21wb25lbnRMb2FkZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhIENvbXBvbmVudCBgdHlwZWAgYW5kIGF0dGFjaGVzIGl0IHRvIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZVxuICAgKiBwbGF0Zm9ybS1zcGVjaWZpYyBnbG9iYWwgdmlldyB0aGF0IG1hdGNoZXMgdGhlIGNvbXBvbmVudCdzIHNlbGVjdG9yLlxuICAgKlxuICAgKiBJbiBhIGJyb3dzZXIgdGhlIHBsYXRmb3JtLXNwZWNpZmljIGdsb2JhbCB2aWV3IGlzIHRoZSBtYWluIERPTSBEb2N1bWVudC5cbiAgICpcbiAgICogSWYgbmVlZGVkLCB0aGUgY29tcG9uZW50J3Mgc2VsZWN0b3IgY2FuIGJlIG92ZXJyaWRkZW4gdmlhIGBvdmVycmlkZVNlbGVjdG9yYC5cbiAgICpcbiAgICogWW91IGNhbiBvcHRpb25hbGx5IHByb3ZpZGUgYGluamVjdG9yYCBhbmQgdGhpcyB7QGxpbmsgSW5qZWN0b3J9IHdpbGwgYmUgdXNlZCB0byBpbnN0YW50aWF0ZSB0aGVcbiAgICogQ29tcG9uZW50LlxuICAgKlxuICAgKiBUbyBiZSBub3RpZmllZCB3aGVuIHRoaXMgQ29tcG9uZW50IGluc3RhbmNlIGlzIGRlc3Ryb3llZCwgeW91IGNhbiBhbHNvIG9wdGlvbmFsbHkgcHJvdmlkZVxuICAgKiBgb25EaXNwb3NlYCBjYWxsYmFjay5cbiAgICpcbiAgICogUmV0dXJucyBhIHByb21pc2UgZm9yIHRoZSB7QGxpbmsgQ29tcG9uZW50UmVmfSByZXByZXNlbnRpbmcgdGhlIG5ld2x5IGNyZWF0ZWQgQ29tcG9uZW50LlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZVxuICAgKlxuICAgKiBgYGBcbiAgICogQENvbXBvbmVudCh7XG4gICAqICAgc2VsZWN0b3I6ICdjaGlsZC1jb21wb25lbnQnLFxuICAgKiAgIHRlbXBsYXRlOiAnQ2hpbGQnXG4gICAqIH0pXG4gICAqIGNsYXNzIENoaWxkQ29tcG9uZW50IHtcbiAgICogfVxuICAgKlxuICAgKiBAQ29tcG9uZW50KHtcbiAgICogICBzZWxlY3RvcjogJ215LWFwcCcsXG4gICAqICAgdGVtcGxhdGU6ICdQYXJlbnQgKDxjaGlsZCBpZD1cImNoaWxkXCI+PC9jaGlsZD4pJ1xuICAgKiB9KVxuICAgKiBjbGFzcyBNeUFwcCB7XG4gICAqICAgY29uc3RydWN0b3IoZGNsOiBEeW5hbWljQ29tcG9uZW50TG9hZGVyLCBpbmplY3RvcjogSW5qZWN0b3IpIHtcbiAgICogICAgIGRjbC5sb2FkQXNSb290KENoaWxkQ29tcG9uZW50LCAnI2NoaWxkJywgaW5qZWN0b3IpO1xuICAgKiAgIH1cbiAgICogfVxuICAgKlxuICAgKiBib290c3RyYXAoTXlBcHApO1xuICAgKiBgYGBcbiAgICpcbiAgICogUmVzdWx0aW5nIERPTTpcbiAgICpcbiAgICogYGBgXG4gICAqIDxteS1hcHA+XG4gICAqICAgUGFyZW50IChcbiAgICogICAgIDxjaGlsZCBpZD1cImNoaWxkXCI+Q2hpbGQ8L2NoaWxkPlxuICAgKiAgIClcbiAgICogPC9teS1hcHA+XG4gICAqIGBgYFxuICAgKi9cbiAgYWJzdHJhY3QgbG9hZEFzUm9vdCh0eXBlOiBUeXBlLCBvdmVycmlkZVNlbGVjdG9yOiBzdHJpbmcsIGluamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgICAgICAgICAgICAgICBvbkRpc3Bvc2U/OiAoKSA9PiB2b2lkKTogUHJvbWlzZTxDb21wb25lbnRSZWY+O1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIGEgQ29tcG9uZW50IGFuZCBhdHRhY2hlcyBpdCB0byBhIFZpZXcgQ29udGFpbmVyIGxvY2F0ZWQgaW5zaWRlIG9mIHRoZVxuICAgKiBDb21wb25lbnQgVmlldyBvZiBhbm90aGVyIENvbXBvbmVudCBpbnN0YW5jZS5cbiAgICpcbiAgICogVGhlIHRhcmdldGVkIENvbXBvbmVudCBJbnN0YW5jZSBpcyBzcGVjaWZpZWQgdmlhIGl0cyBgaG9zdExvY2F0aW9uYCB7QGxpbmsgRWxlbWVudFJlZn0uIFRoZVxuICAgKiBsb2NhdGlvbiB3aXRoaW4gdGhlIENvbXBvbmVudCBWaWV3IG9mIHRoaXMgQ29tcG9uZW50IEluc3RhbmNlIGlzIHNwZWNpZmllZCB2aWEgYGFuY2hvck5hbWVgXG4gICAqIFRlbXBsYXRlIFZhcmlhYmxlIE5hbWUuXG4gICAqXG4gICAqIFlvdSBjYW4gb3B0aW9uYWxseSBwcm92aWRlIGBwcm92aWRlcnNgIHRvIGNvbmZpZ3VyZSB0aGUge0BsaW5rIEluamVjdG9yfSBwcm92aXNpb25lZCBmb3IgdGhpc1xuICAgKiBDb21wb25lbnQgSW5zdGFuY2UuXG4gICAqXG4gICAqIFJldHVybnMgYSBwcm9taXNlIGZvciB0aGUge0BsaW5rIENvbXBvbmVudFJlZn0gcmVwcmVzZW50aW5nIHRoZSBuZXdseSBjcmVhdGVkIENvbXBvbmVudC5cbiAgICpcbiAgICogIyMjIEV4YW1wbGVcbiAgICpcbiAgICogYGBgXG4gICAqIEBDb21wb25lbnQoe1xuICAgKiAgIHNlbGVjdG9yOiAnY2hpbGQtY29tcG9uZW50JyxcbiAgICogICB0ZW1wbGF0ZTogJ0NoaWxkJ1xuICAgKiB9KVxuICAgKiBjbGFzcyBDaGlsZENvbXBvbmVudCB7XG4gICAqIH1cbiAgICpcbiAgICogQENvbXBvbmVudCh7XG4gICAqICAgc2VsZWN0b3I6ICdteS1hcHAnLFxuICAgKiAgIHRlbXBsYXRlOiAnUGFyZW50ICg8ZGl2ICNjaGlsZD48L2Rpdj4pJ1xuICAgKiB9KVxuICAgKiBjbGFzcyBNeUFwcCB7XG4gICAqICAgY29uc3RydWN0b3IoZGNsOiBEeW5hbWljQ29tcG9uZW50TG9hZGVyLCBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7XG4gICAqICAgICBkY2wubG9hZEludG9Mb2NhdGlvbihDaGlsZENvbXBvbmVudCwgZWxlbWVudFJlZiwgJ2NoaWxkJyk7XG4gICAqICAgfVxuICAgKiB9XG4gICAqXG4gICAqIGJvb3RzdHJhcChNeUFwcCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBSZXN1bHRpbmcgRE9NOlxuICAgKlxuICAgKiBgYGBcbiAgICogPG15LWFwcD5cbiAgICogICAgUGFyZW50IChcbiAgICogICAgICA8ZGl2ICNjaGlsZD1cIlwiIGNsYXNzPVwibmctYmluZGluZ1wiPjwvZGl2PlxuICAgKiAgICAgIDxjaGlsZC1jb21wb25lbnQgY2xhc3M9XCJuZy1iaW5kaW5nXCI+Q2hpbGQ8L2NoaWxkLWNvbXBvbmVudD5cbiAgICogICAgKVxuICAgKiA8L215LWFwcD5cbiAgICogYGBgXG4gICAqL1xuICBhYnN0cmFjdCBsb2FkSW50b0xvY2F0aW9uKHR5cGU6IFR5cGUsIGhvc3RMb2NhdGlvbjogRWxlbWVudFJlZiwgYW5jaG9yTmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVycz86IFJlc29sdmVkUHJvdmlkZXJbXSk6IFByb21pc2U8Q29tcG9uZW50UmVmPjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhIENvbXBvbmVudCBhbmQgYXR0YWNoZXMgaXQgdG8gdGhlIFZpZXcgQ29udGFpbmVyIGZvdW5kIGF0IHRoZVxuICAgKiBgbG9jYXRpb25gIHNwZWNpZmllZCBhcyB7QGxpbmsgRWxlbWVudFJlZn0uXG4gICAqXG4gICAqIFlvdSBjYW4gb3B0aW9uYWxseSBwcm92aWRlIGBwcm92aWRlcnNgIHRvIGNvbmZpZ3VyZSB0aGUge0BsaW5rIEluamVjdG9yfSBwcm92aXNpb25lZCBmb3IgdGhpc1xuICAgKiBDb21wb25lbnQgSW5zdGFuY2UuXG4gICAqXG4gICAqIFJldHVybnMgYSBwcm9taXNlIGZvciB0aGUge0BsaW5rIENvbXBvbmVudFJlZn0gcmVwcmVzZW50aW5nIHRoZSBuZXdseSBjcmVhdGVkIENvbXBvbmVudC5cbiAgICpcbiAgICpcbiAgICogIyMjIEV4YW1wbGVcbiAgICpcbiAgICogYGBgXG4gICAqIEBDb21wb25lbnQoe1xuICAgKiAgIHNlbGVjdG9yOiAnY2hpbGQtY29tcG9uZW50JyxcbiAgICogICB0ZW1wbGF0ZTogJ0NoaWxkJ1xuICAgKiB9KVxuICAgKiBjbGFzcyBDaGlsZENvbXBvbmVudCB7XG4gICAqIH1cbiAgICpcbiAgICogQENvbXBvbmVudCh7XG4gICAqICAgc2VsZWN0b3I6ICdteS1hcHAnLFxuICAgKiAgIHRlbXBsYXRlOiAnUGFyZW50J1xuICAgKiB9KVxuICAgKiBjbGFzcyBNeUFwcCB7XG4gICAqICAgY29uc3RydWN0b3IoZGNsOiBEeW5hbWljQ29tcG9uZW50TG9hZGVyLCBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7XG4gICAqICAgICBkY2wubG9hZE5leHRUb0xvY2F0aW9uKENoaWxkQ29tcG9uZW50LCBlbGVtZW50UmVmKTtcbiAgICogICB9XG4gICAqIH1cbiAgICpcbiAgICogYm9vdHN0cmFwKE15QXBwKTtcbiAgICogYGBgXG4gICAqXG4gICAqIFJlc3VsdGluZyBET006XG4gICAqXG4gICAqIGBgYFxuICAgKiA8bXktYXBwPlBhcmVudDwvbXktYXBwPlxuICAgKiA8Y2hpbGQtY29tcG9uZW50PkNoaWxkPC9jaGlsZC1jb21wb25lbnQ+XG4gICAqIGBgYFxuICAgKi9cbiAgYWJzdHJhY3QgbG9hZE5leHRUb0xvY2F0aW9uKHR5cGU6IFR5cGUsIGxvY2F0aW9uOiBFbGVtZW50UmVmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJzPzogUmVzb2x2ZWRQcm92aWRlcltdKTogUHJvbWlzZTxDb21wb25lbnRSZWY+O1xufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRHluYW1pY0NvbXBvbmVudExvYWRlcl8gZXh0ZW5kcyBEeW5hbWljQ29tcG9uZW50TG9hZGVyIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfY29tcGlsZXI6IENvbXBpbGVyLCBwcml2YXRlIF92aWV3TWFuYWdlcjogQXBwVmlld01hbmFnZXIpIHsgc3VwZXIoKTsgfVxuXG4gIGxvYWRBc1Jvb3QodHlwZTogVHlwZSwgb3ZlcnJpZGVTZWxlY3Rvcjogc3RyaW5nLCBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgICAgICAgb25EaXNwb3NlPzogKCkgPT4gdm9pZCk6IFByb21pc2U8Q29tcG9uZW50UmVmPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbXBpbGVyLmNvbXBpbGVJbkhvc3QodHlwZSkudGhlbihob3N0UHJvdG9WaWV3UmVmID0+IHtcbiAgICAgIHZhciBob3N0Vmlld1JlZiA9XG4gICAgICAgICAgdGhpcy5fdmlld01hbmFnZXIuY3JlYXRlUm9vdEhvc3RWaWV3KGhvc3RQcm90b1ZpZXdSZWYsIG92ZXJyaWRlU2VsZWN0b3IsIGluamVjdG9yKTtcbiAgICAgIHZhciBuZXdMb2NhdGlvbiA9IHRoaXMuX3ZpZXdNYW5hZ2VyLmdldEhvc3RFbGVtZW50KGhvc3RWaWV3UmVmKTtcbiAgICAgIHZhciBjb21wb25lbnQgPSB0aGlzLl92aWV3TWFuYWdlci5nZXRDb21wb25lbnQobmV3TG9jYXRpb24pO1xuXG4gICAgICB2YXIgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKGlzUHJlc2VudChvbkRpc3Bvc2UpKSB7XG4gICAgICAgICAgb25EaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdmlld01hbmFnZXIuZGVzdHJveVJvb3RIb3N0Vmlldyhob3N0Vmlld1JlZik7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRSZWZfKG5ld0xvY2F0aW9uLCBjb21wb25lbnQsIHR5cGUsIGluamVjdG9yLCBkaXNwb3NlKTtcbiAgICB9KTtcbiAgfVxuXG4gIGxvYWRJbnRvTG9jYXRpb24odHlwZTogVHlwZSwgaG9zdExvY2F0aW9uOiBFbGVtZW50UmVmLCBhbmNob3JOYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBSZXNvbHZlZFByb3ZpZGVyW10gPSBudWxsKTogUHJvbWlzZTxDb21wb25lbnRSZWY+IHtcbiAgICByZXR1cm4gdGhpcy5sb2FkTmV4dFRvTG9jYXRpb24oXG4gICAgICAgIHR5cGUsIHRoaXMuX3ZpZXdNYW5hZ2VyLmdldE5hbWVkRWxlbWVudEluQ29tcG9uZW50Vmlldyhob3N0TG9jYXRpb24sIGFuY2hvck5hbWUpLFxuICAgICAgICBwcm92aWRlcnMpO1xuICB9XG5cbiAgbG9hZE5leHRUb0xvY2F0aW9uKHR5cGU6IFR5cGUsIGxvY2F0aW9uOiBFbGVtZW50UmVmLFxuICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBSZXNvbHZlZFByb3ZpZGVyW10gPSBudWxsKTogUHJvbWlzZTxDb21wb25lbnRSZWY+IHtcbiAgICByZXR1cm4gdGhpcy5fY29tcGlsZXIuY29tcGlsZUluSG9zdCh0eXBlKS50aGVuKGhvc3RQcm90b1ZpZXdSZWYgPT4ge1xuICAgICAgdmFyIHZpZXdDb250YWluZXIgPSB0aGlzLl92aWV3TWFuYWdlci5nZXRWaWV3Q29udGFpbmVyKGxvY2F0aW9uKTtcbiAgICAgIHZhciBob3N0Vmlld1JlZiA9XG4gICAgICAgICAgdmlld0NvbnRhaW5lci5jcmVhdGVIb3N0Vmlldyhob3N0UHJvdG9WaWV3UmVmLCB2aWV3Q29udGFpbmVyLmxlbmd0aCwgcHJvdmlkZXJzKTtcbiAgICAgIHZhciBuZXdMb2NhdGlvbiA9IHRoaXMuX3ZpZXdNYW5hZ2VyLmdldEhvc3RFbGVtZW50KGhvc3RWaWV3UmVmKTtcbiAgICAgIHZhciBjb21wb25lbnQgPSB0aGlzLl92aWV3TWFuYWdlci5nZXRDb21wb25lbnQobmV3TG9jYXRpb24pO1xuXG4gICAgICB2YXIgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgdmFyIGluZGV4ID0gdmlld0NvbnRhaW5lci5pbmRleE9mKDxWaWV3UmVmPmhvc3RWaWV3UmVmKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgIHZpZXdDb250YWluZXIucmVtb3ZlKGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50UmVmXyhuZXdMb2NhdGlvbiwgY29tcG9uZW50LCB0eXBlLCBudWxsLCBkaXNwb3NlKTtcbiAgICB9KTtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL2R5bmFtaWNfY29tcG9uZW50X2xvYWRlci50c1xuICoqLyIsImltcG9ydCB7UHJvdG9WaWV3UmVmfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvdmlld19yZWYnO1xuaW1wb3J0IHtQcm90b1ZpZXdGYWN0b3J5fSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvcHJvdG9fdmlld19mYWN0b3J5JztcblxuaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5pbXBvcnQge1R5cGUsIGlzQmxhbmssIHN0cmluZ2lmeX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7UHJvbWlzZSwgUHJvbWlzZVdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvYXN5bmMnO1xuaW1wb3J0IHtyZWZsZWN0b3J9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL3JlZmxlY3Rpb24vcmVmbGVjdGlvbic7XG5pbXBvcnQge0NvbXBpbGVkSG9zdFRlbXBsYXRlfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvdGVtcGxhdGVfY29tbWFuZHMnO1xuXG4vKipcbiAqIExvdy1sZXZlbCBzZXJ2aWNlIGZvciBjb21waWxpbmcge0BsaW5rIENvbXBvbmVudH1zIGludG8ge0BsaW5rIFByb3RvVmlld1JlZiBQcm90b1ZpZXdzfXMsIHdoaWNoXG4gKiBjYW4gbGF0ZXIgYmUgdXNlZCB0byBjcmVhdGUgYW5kIHJlbmRlciBhIENvbXBvbmVudCBpbnN0YW5jZS5cbiAqXG4gKiBNb3N0IGFwcGxpY2F0aW9ucyBzaG91bGQgaW5zdGVhZCB1c2UgaGlnaGVyLWxldmVsIHtAbGluayBEeW5hbWljQ29tcG9uZW50TG9hZGVyfSBzZXJ2aWNlLCB3aGljaFxuICogYm90aCBjb21waWxlcyBhbmQgaW5zdGFudGlhdGVzIGEgQ29tcG9uZW50LlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29tcGlsZXIge1xuICBhYnN0cmFjdCBjb21waWxlSW5Ib3N0KGNvbXBvbmVudFR5cGU6IFR5cGUpOiBQcm9taXNlPFByb3RvVmlld1JlZj47XG4gIGFic3RyYWN0IGNsZWFyQ2FjaGUoKTtcbn1cblxuZnVuY3Rpb24gX2lzQ29tcGlsZWRIb3N0VGVtcGxhdGUodHlwZTogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlIGluc3RhbmNlb2YgQ29tcGlsZWRIb3N0VGVtcGxhdGU7XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDb21waWxlcl8gZXh0ZW5kcyBDb21waWxlciB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3Byb3RvVmlld0ZhY3Rvcnk6IFByb3RvVmlld0ZhY3RvcnkpIHsgc3VwZXIoKTsgfVxuXG4gIGNvbXBpbGVJbkhvc3QoY29tcG9uZW50VHlwZTogVHlwZSk6IFByb21pc2U8UHJvdG9WaWV3UmVmPiB7XG4gICAgdmFyIG1ldGFkYXRhcyA9IHJlZmxlY3Rvci5hbm5vdGF0aW9ucyhjb21wb25lbnRUeXBlKTtcbiAgICB2YXIgY29tcGlsZWRIb3N0VGVtcGxhdGUgPSBtZXRhZGF0YXMuZmluZChfaXNDb21waWxlZEhvc3RUZW1wbGF0ZSk7XG5cbiAgICBpZiAoaXNCbGFuayhjb21waWxlZEhvc3RUZW1wbGF0ZSkpIHtcbiAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKFxuICAgICAgICAgIGBObyBwcmVjb21waWxlZCB0ZW1wbGF0ZSBmb3IgY29tcG9uZW50ICR7c3RyaW5naWZ5KGNvbXBvbmVudFR5cGUpfSBmb3VuZGApO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZVdyYXBwZXIucmVzb2x2ZSh0aGlzLl9jcmVhdGVQcm90b1ZpZXcoY29tcGlsZWRIb3N0VGVtcGxhdGUpKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZVByb3RvVmlldyhjb21waWxlZEhvc3RUZW1wbGF0ZTogQ29tcGlsZWRIb3N0VGVtcGxhdGUpOiBQcm90b1ZpZXdSZWYge1xuICAgIHJldHVybiB0aGlzLl9wcm90b1ZpZXdGYWN0b3J5LmNyZWF0ZUhvc3QoY29tcGlsZWRIb3N0VGVtcGxhdGUpLnJlZjtcbiAgfVxuXG4gIGNsZWFyQ2FjaGUoKSB7IHRoaXMuX3Byb3RvVmlld0ZhY3RvcnkuY2xlYXJDYWNoZSgpOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcm5hbENyZWF0ZVByb3RvVmlldyhjb21waWxlcjogQ29tcGlsZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZWRIb3N0VGVtcGxhdGU6IENvbXBpbGVkSG9zdFRlbXBsYXRlKTogUHJvdG9WaWV3UmVmIHtcbiAgcmV0dXJuICg8YW55PmNvbXBpbGVyKS5fY3JlYXRlUHJvdG9WaWV3KGNvbXBpbGVkSG9zdFRlbXBsYXRlKTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9jb21waWxlci50c1xuICoqLyIsImltcG9ydCB7aXNQcmVzZW50LCBpc0JsYW5rLCBUeXBlLCBpc0FycmF5LCBpc051bWJlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxuaW1wb3J0IHtSZW5kZXJQcm90b1ZpZXdSZWYsIFJlbmRlckNvbXBvbmVudFRlbXBsYXRlfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9yZW5kZXIvYXBpJztcblxuaW1wb3J0IHtPcHRpb25hbCwgSW5qZWN0YWJsZSwgUHJvdmlkZXIsIHJlc29sdmVGb3J3YXJkUmVmLCBJbmplY3R9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpJztcblxuaW1wb3J0IHtQaXBlUHJvdmlkZXJ9IGZyb20gJy4uL3BpcGVzL3BpcGVfcHJvdmlkZXInO1xuaW1wb3J0IHtQcm90b1BpcGVzfSBmcm9tICcuLi9waXBlcy9waXBlcyc7XG5cbmltcG9ydCB7QXBwUHJvdG9WaWV3LCBBcHBQcm90b1ZpZXdNZXJnZUluZm8sIFZpZXdUeXBlfSBmcm9tICcuL3ZpZXcnO1xuaW1wb3J0IHtFbGVtZW50QmluZGVyfSBmcm9tICcuL2VsZW1lbnRfYmluZGVyJztcbmltcG9ydCB7UHJvdG9FbGVtZW50SW5qZWN0b3IsIERpcmVjdGl2ZVByb3ZpZGVyfSBmcm9tICcuL2VsZW1lbnRfaW5qZWN0b3InO1xuaW1wb3J0IHtEaXJlY3RpdmVSZXNvbHZlcn0gZnJvbSAnLi9kaXJlY3RpdmVfcmVzb2x2ZXInO1xuaW1wb3J0IHtWaWV3UmVzb2x2ZXJ9IGZyb20gJy4vdmlld19yZXNvbHZlcic7XG5pbXBvcnQge1BpcGVSZXNvbHZlcn0gZnJvbSAnLi9waXBlX3Jlc29sdmVyJztcbmltcG9ydCB7Vmlld01ldGFkYXRhLCBWaWV3RW5jYXBzdWxhdGlvbn0gZnJvbSAnLi4vbWV0YWRhdGEvdmlldyc7XG5pbXBvcnQge1BMQVRGT1JNX1BJUEVTfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9wbGF0Zm9ybV9kaXJlY3RpdmVzX2FuZF9waXBlcyc7XG5cbmltcG9ydCB7XG4gIHZpc2l0QWxsQ29tbWFuZHMsXG4gIENvbXBpbGVkQ29tcG9uZW50VGVtcGxhdGUsXG4gIENvbXBpbGVkSG9zdFRlbXBsYXRlLFxuICBUZW1wbGF0ZUNtZCxcbiAgQ29tbWFuZFZpc2l0b3IsXG4gIEVtYmVkZGVkVGVtcGxhdGVDbWQsXG4gIEJlZ2luQ29tcG9uZW50Q21kLFxuICBCZWdpbkVsZW1lbnRDbWQsXG4gIElCZWdpbkVsZW1lbnRDbWQsXG4gIFRleHRDbWQsXG4gIE5nQ29udGVudENtZFxufSBmcm9tICcuL3RlbXBsYXRlX2NvbW1hbmRzJztcblxuaW1wb3J0IHtSZW5kZXJlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvcmVuZGVyL2FwaSc7XG5pbXBvcnQge0FQUF9JRH0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvYXBwbGljYXRpb25fdG9rZW5zJztcblxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUHJvdG9WaWV3RmFjdG9yeSB7XG4gIHByaXZhdGUgX2NhY2hlOiBNYXA8c3RyaW5nLCBBcHBQcm90b1ZpZXc+ID0gbmV3IE1hcDxzdHJpbmcsIEFwcFByb3RvVmlldz4oKTtcbiAgcHJpdmF0ZSBfbmV4dFRlbXBsYXRlSWQ6IG51bWJlciA9IDA7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfcmVuZGVyZXI6IFJlbmRlcmVyLFxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFBMQVRGT1JNX1BJUEVTKSBwcml2YXRlIF9wbGF0Zm9ybVBpcGVzOiBBcnJheTxUeXBlIHwgYW55W10+LFxuICAgICAgICAgICAgICBwcml2YXRlIF9kaXJlY3RpdmVSZXNvbHZlcjogRGlyZWN0aXZlUmVzb2x2ZXIsIHByaXZhdGUgX3ZpZXdSZXNvbHZlcjogVmlld1Jlc29sdmVyLFxuICAgICAgICAgICAgICBwcml2YXRlIF9waXBlUmVzb2x2ZXI6IFBpcGVSZXNvbHZlciwgQEluamVjdChBUFBfSUQpIHByaXZhdGUgX2FwcElkOiBzdHJpbmcpIHt9XG5cbiAgY2xlYXJDYWNoZSgpIHsgdGhpcy5fY2FjaGUuY2xlYXIoKTsgfVxuXG4gIGNyZWF0ZUhvc3QoY29tcGlsZWRIb3N0VGVtcGxhdGU6IENvbXBpbGVkSG9zdFRlbXBsYXRlKTogQXBwUHJvdG9WaWV3IHtcbiAgICB2YXIgY29tcGlsZWRUZW1wbGF0ZSA9IGNvbXBpbGVkSG9zdFRlbXBsYXRlLnRlbXBsYXRlO1xuICAgIHZhciByZXN1bHQgPSB0aGlzLl9jYWNoZS5nZXQoY29tcGlsZWRUZW1wbGF0ZS5pZCk7XG4gICAgaWYgKGlzQmxhbmsocmVzdWx0KSkge1xuICAgICAgdmFyIGVtcHR5TWFwOiB7W2tleTogc3RyaW5nXTogUGlwZVByb3ZpZGVyfSA9IHt9O1xuICAgICAgdmFyIHNob3J0SWQgPSBgJHt0aGlzLl9hcHBJZH0tJHt0aGlzLl9uZXh0VGVtcGxhdGVJZCsrfWA7XG4gICAgICB0aGlzLl9yZW5kZXJlci5yZWdpc3RlckNvbXBvbmVudFRlbXBsYXRlKG5ldyBSZW5kZXJDb21wb25lbnRUZW1wbGF0ZShcbiAgICAgICAgICBjb21waWxlZFRlbXBsYXRlLmlkLCBzaG9ydElkLCBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLCBjb21waWxlZFRlbXBsYXRlLmNvbW1hbmRzLCBbXSkpO1xuICAgICAgcmVzdWx0ID1cbiAgICAgICAgICBuZXcgQXBwUHJvdG9WaWV3KGNvbXBpbGVkVGVtcGxhdGUuaWQsIGNvbXBpbGVkVGVtcGxhdGUuY29tbWFuZHMsIFZpZXdUeXBlLkhPU1QsIHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlZFRlbXBsYXRlLmNoYW5nZURldGVjdG9yRmFjdG9yeSwgbnVsbCwgbmV3IFByb3RvUGlwZXMoZW1wdHlNYXApKTtcbiAgICAgIHRoaXMuX2NhY2hlLnNldChjb21waWxlZFRlbXBsYXRlLmlkLCByZXN1bHQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlQ29tcG9uZW50KGNtZDogQmVnaW5Db21wb25lbnRDbWQpOiBBcHBQcm90b1ZpZXcge1xuICAgIHZhciBuZXN0ZWRQcm90b1ZpZXcgPSB0aGlzLl9jYWNoZS5nZXQoY21kLnRlbXBsYXRlSWQpO1xuICAgIGlmIChpc0JsYW5rKG5lc3RlZFByb3RvVmlldykpIHtcbiAgICAgIHZhciBjb21wb25lbnQgPSBjbWQuZGlyZWN0aXZlc1swXTtcbiAgICAgIHZhciB2aWV3ID0gdGhpcy5fdmlld1Jlc29sdmVyLnJlc29sdmUoY29tcG9uZW50KTtcbiAgICAgIHZhciBjb21waWxlZFRlbXBsYXRlID0gY21kLnRlbXBsYXRlR2V0dGVyKCk7XG4gICAgICB2YXIgc3R5bGVzID0gX2ZsYXR0ZW5TdHlsZUFycihjb21waWxlZFRlbXBsYXRlLnN0eWxlcywgW10pO1xuICAgICAgdmFyIHNob3J0SWQgPSBgJHt0aGlzLl9hcHBJZH0tJHt0aGlzLl9uZXh0VGVtcGxhdGVJZCsrfWA7XG4gICAgICB0aGlzLl9yZW5kZXJlci5yZWdpc3RlckNvbXBvbmVudFRlbXBsYXRlKG5ldyBSZW5kZXJDb21wb25lbnRUZW1wbGF0ZShcbiAgICAgICAgICBjb21waWxlZFRlbXBsYXRlLmlkLCBzaG9ydElkLCBjbWQuZW5jYXBzdWxhdGlvbiwgY29tcGlsZWRUZW1wbGF0ZS5jb21tYW5kcywgc3R5bGVzKSk7XG4gICAgICB2YXIgYm91bmRQaXBlcyA9IHRoaXMuX2ZsYXR0ZW5QaXBlcyh2aWV3KS5tYXAocGlwZSA9PiB0aGlzLl9iaW5kUGlwZShwaXBlKSk7XG5cbiAgICAgIG5lc3RlZFByb3RvVmlldyA9IG5ldyBBcHBQcm90b1ZpZXcoXG4gICAgICAgICAgY29tcGlsZWRUZW1wbGF0ZS5pZCwgY29tcGlsZWRUZW1wbGF0ZS5jb21tYW5kcywgVmlld1R5cGUuQ09NUE9ORU5ULCB0cnVlLFxuICAgICAgICAgIGNvbXBpbGVkVGVtcGxhdGUuY2hhbmdlRGV0ZWN0b3JGYWN0b3J5LCBudWxsLCBQcm90b1BpcGVzLmZyb21Qcm92aWRlcnMoYm91bmRQaXBlcykpO1xuICAgICAgLy8gTm90ZTogVGhlIGNhY2hlIGlzIHVwZGF0ZWQgYmVmb3JlIHJlY3Vyc2luZ1xuICAgICAgLy8gdG8gYmUgYWJsZSB0byByZXNvbHZlIGN5Y2xlc1xuICAgICAgdGhpcy5fY2FjaGUuc2V0KGNvbXBpbGVkVGVtcGxhdGUuaWQsIG5lc3RlZFByb3RvVmlldyk7XG4gICAgICB0aGlzLl9pbml0aWFsaXplUHJvdG9WaWV3KG5lc3RlZFByb3RvVmlldywgbnVsbCk7XG4gICAgfVxuICAgIHJldHVybiBuZXN0ZWRQcm90b1ZpZXc7XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVFbWJlZGRlZFRlbXBsYXRlKGNtZDogRW1iZWRkZWRUZW1wbGF0ZUNtZCwgcGFyZW50OiBBcHBQcm90b1ZpZXcpOiBBcHBQcm90b1ZpZXcge1xuICAgIHZhciBuZXN0ZWRQcm90b1ZpZXcgPSBuZXcgQXBwUHJvdG9WaWV3KFxuICAgICAgICBwYXJlbnQudGVtcGxhdGVJZCwgY21kLmNoaWxkcmVuLCBWaWV3VHlwZS5FTUJFRERFRCwgY21kLmlzTWVyZ2VkLCBjbWQuY2hhbmdlRGV0ZWN0b3JGYWN0b3J5LFxuICAgICAgICBhcnJheVRvTWFwKGNtZC52YXJpYWJsZU5hbWVBbmRWYWx1ZXMsIHRydWUpLCBuZXcgUHJvdG9QaXBlcyhwYXJlbnQucGlwZXMuY29uZmlnKSk7XG4gICAgaWYgKGNtZC5pc01lcmdlZCkge1xuICAgICAgdGhpcy5pbml0aWFsaXplUHJvdG9WaWV3SWZOZWVkZWQobmVzdGVkUHJvdG9WaWV3KTtcbiAgICB9XG4gICAgcmV0dXJuIG5lc3RlZFByb3RvVmlldztcbiAgfVxuXG4gIGluaXRpYWxpemVQcm90b1ZpZXdJZk5lZWRlZChwcm90b1ZpZXc6IEFwcFByb3RvVmlldykge1xuICAgIGlmICghcHJvdG9WaWV3LmlzSW5pdGlhbGl6ZWQoKSkge1xuICAgICAgdmFyIHJlbmRlciA9IHRoaXMuX3JlbmRlcmVyLmNyZWF0ZVByb3RvVmlldyhwcm90b1ZpZXcudGVtcGxhdGVJZCwgcHJvdG9WaWV3LnRlbXBsYXRlQ21kcyk7XG4gICAgICB0aGlzLl9pbml0aWFsaXplUHJvdG9WaWV3KHByb3RvVmlldywgcmVuZGVyKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9pbml0aWFsaXplUHJvdG9WaWV3KHByb3RvVmlldzogQXBwUHJvdG9WaWV3LCByZW5kZXI6IFJlbmRlclByb3RvVmlld1JlZikge1xuICAgIHZhciBpbml0aWFsaXplciA9IG5ldyBfUHJvdG9WaWV3SW5pdGlhbGl6ZXIocHJvdG9WaWV3LCB0aGlzLl9kaXJlY3RpdmVSZXNvbHZlciwgdGhpcyk7XG4gICAgdmlzaXRBbGxDb21tYW5kcyhpbml0aWFsaXplciwgcHJvdG9WaWV3LnRlbXBsYXRlQ21kcyk7XG4gICAgdmFyIG1lcmdlSW5mbyA9XG4gICAgICAgIG5ldyBBcHBQcm90b1ZpZXdNZXJnZUluZm8oaW5pdGlhbGl6ZXIubWVyZ2VFbWJlZGRlZFZpZXdDb3VudCwgaW5pdGlhbGl6ZXIubWVyZ2VFbGVtZW50Q291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZXIubWVyZ2VWaWV3Q291bnQpO1xuICAgIHByb3RvVmlldy5pbml0KHJlbmRlciwgaW5pdGlhbGl6ZXIuZWxlbWVudEJpbmRlcnMsIGluaXRpYWxpemVyLmJvdW5kVGV4dENvdW50LCBtZXJnZUluZm8sXG4gICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZXIudmFyaWFibGVMb2NhdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBfYmluZFBpcGUodHlwZU9yUHJvdmlkZXIpOiBQaXBlUHJvdmlkZXIge1xuICAgIGxldCBtZXRhID0gdGhpcy5fcGlwZVJlc29sdmVyLnJlc29sdmUodHlwZU9yUHJvdmlkZXIpO1xuICAgIHJldHVybiBQaXBlUHJvdmlkZXIuY3JlYXRlRnJvbVR5cGUodHlwZU9yUHJvdmlkZXIsIG1ldGEpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmxhdHRlblBpcGVzKHZpZXc6IFZpZXdNZXRhZGF0YSk6IGFueVtdIHtcbiAgICBsZXQgcGlwZXMgPSBbXTtcbiAgICBpZiAoaXNQcmVzZW50KHRoaXMuX3BsYXRmb3JtUGlwZXMpKSB7XG4gICAgICBfZmxhdHRlbkFycmF5KHRoaXMuX3BsYXRmb3JtUGlwZXMsIHBpcGVzKTtcbiAgICB9XG4gICAgaWYgKGlzUHJlc2VudCh2aWV3LnBpcGVzKSkge1xuICAgICAgX2ZsYXR0ZW5BcnJheSh2aWV3LnBpcGVzLCBwaXBlcyk7XG4gICAgfVxuICAgIHJldHVybiBwaXBlcztcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudChwcm90b1ZpZXdGYWN0b3J5OiBQcm90b1ZpZXdGYWN0b3J5LCBjbWQ6IEJlZ2luQ29tcG9uZW50Q21kKTogQXBwUHJvdG9WaWV3IHtcbiAgcmV0dXJuICg8YW55PnByb3RvVmlld0ZhY3RvcnkpLl9jcmVhdGVDb21wb25lbnQoY21kKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRW1iZWRkZWRUZW1wbGF0ZShwcm90b1ZpZXdGYWN0b3J5OiBQcm90b1ZpZXdGYWN0b3J5LCBjbWQ6IEVtYmVkZGVkVGVtcGxhdGVDbWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudDogQXBwUHJvdG9WaWV3KTogQXBwUHJvdG9WaWV3IHtcbiAgcmV0dXJuICg8YW55PnByb3RvVmlld0ZhY3RvcnkpLl9jcmVhdGVFbWJlZGRlZFRlbXBsYXRlKGNtZCwgcGFyZW50KTtcbn1cblxuY2xhc3MgX1Byb3RvVmlld0luaXRpYWxpemVyIGltcGxlbWVudHMgQ29tbWFuZFZpc2l0b3Ige1xuICB2YXJpYWJsZUxvY2F0aW9uczogTWFwPHN0cmluZywgbnVtYmVyPiA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIGJvdW5kVGV4dENvdW50OiBudW1iZXIgPSAwO1xuICBib3VuZEVsZW1lbnRJbmRleDogbnVtYmVyID0gMDtcbiAgZWxlbWVudEJpbmRlclN0YWNrOiBFbGVtZW50QmluZGVyW10gPSBbXTtcbiAgZGlzdGFuY2VUb1BhcmVudEVsZW1lbnRCaW5kZXI6IG51bWJlciA9IDA7XG4gIGRpc3RhbmNlVG9QYXJlbnRQcm90b0VsZW1lbnRJbmplY3RvcjogbnVtYmVyID0gMDtcbiAgZWxlbWVudEJpbmRlcnM6IEVsZW1lbnRCaW5kZXJbXSA9IFtdO1xuICBtZXJnZUVtYmVkZGVkVmlld0NvdW50OiBudW1iZXIgPSAwO1xuICBtZXJnZUVsZW1lbnRDb3VudDogbnVtYmVyID0gMDtcbiAgbWVyZ2VWaWV3Q291bnQ6IG51bWJlciA9IDE7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfcHJvdG9WaWV3OiBBcHBQcm90b1ZpZXcsIHByaXZhdGUgX2RpcmVjdGl2ZVJlc29sdmVyOiBEaXJlY3RpdmVSZXNvbHZlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfcHJvdG9WaWV3RmFjdG9yeTogUHJvdG9WaWV3RmFjdG9yeSkge31cblxuICB2aXNpdFRleHQoY21kOiBUZXh0Q21kLCBjb250ZXh0OiBhbnkpOiBhbnkge1xuICAgIGlmIChjbWQuaXNCb3VuZCkge1xuICAgICAgdGhpcy5ib3VuZFRleHRDb3VudCsrO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2aXNpdE5nQ29udGVudChjbWQ6IE5nQ29udGVudENtZCwgY29udGV4dDogYW55KTogYW55IHsgcmV0dXJuIG51bGw7IH1cbiAgdmlzaXRCZWdpbkVsZW1lbnQoY21kOiBCZWdpbkVsZW1lbnRDbWQsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgaWYgKGNtZC5pc0JvdW5kKSB7XG4gICAgICB0aGlzLl92aXNpdEJlZ2luQm91bmRFbGVtZW50KGNtZCwgbnVsbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3Zpc2l0QmVnaW5FbGVtZW50KGNtZCwgbnVsbCwgbnVsbCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZpc2l0RW5kRWxlbWVudChjb250ZXh0OiBhbnkpOiBhbnkgeyByZXR1cm4gdGhpcy5fdmlzaXRFbmRFbGVtZW50KCk7IH1cbiAgdmlzaXRCZWdpbkNvbXBvbmVudChjbWQ6IEJlZ2luQ29tcG9uZW50Q21kLCBjb250ZXh0OiBhbnkpOiBhbnkge1xuICAgIHZhciBuZXN0ZWRQcm90b1ZpZXcgPSBjcmVhdGVDb21wb25lbnQodGhpcy5fcHJvdG9WaWV3RmFjdG9yeSwgY21kKTtcbiAgICByZXR1cm4gdGhpcy5fdmlzaXRCZWdpbkJvdW5kRWxlbWVudChjbWQsIG5lc3RlZFByb3RvVmlldyk7XG4gIH1cbiAgdmlzaXRFbmRDb21wb25lbnQoY29udGV4dDogYW55KTogYW55IHsgcmV0dXJuIHRoaXMuX3Zpc2l0RW5kRWxlbWVudCgpOyB9XG4gIHZpc2l0RW1iZWRkZWRUZW1wbGF0ZShjbWQ6IEVtYmVkZGVkVGVtcGxhdGVDbWQsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgdmFyIG5lc3RlZFByb3RvVmlldyA9IGNyZWF0ZUVtYmVkZGVkVGVtcGxhdGUodGhpcy5fcHJvdG9WaWV3RmFjdG9yeSwgY21kLCB0aGlzLl9wcm90b1ZpZXcpO1xuICAgIGlmIChjbWQuaXNNZXJnZWQpIHtcbiAgICAgIHRoaXMubWVyZ2VFbWJlZGRlZFZpZXdDb3VudCsrO1xuICAgIH1cbiAgICB0aGlzLl92aXNpdEJlZ2luQm91bmRFbGVtZW50KGNtZCwgbmVzdGVkUHJvdG9WaWV3KTtcbiAgICByZXR1cm4gdGhpcy5fdmlzaXRFbmRFbGVtZW50KCk7XG4gIH1cblxuICBwcml2YXRlIF92aXNpdEJlZ2luQm91bmRFbGVtZW50KGNtZDogSUJlZ2luRWxlbWVudENtZCwgbmVzdGVkUHJvdG9WaWV3OiBBcHBQcm90b1ZpZXcpOiBhbnkge1xuICAgIGlmIChpc1ByZXNlbnQobmVzdGVkUHJvdG9WaWV3KSAmJiBuZXN0ZWRQcm90b1ZpZXcuaXNNZXJnYWJsZSkge1xuICAgICAgdGhpcy5tZXJnZUVsZW1lbnRDb3VudCArPSBuZXN0ZWRQcm90b1ZpZXcubWVyZ2VJbmZvLmVsZW1lbnRDb3VudDtcbiAgICAgIHRoaXMubWVyZ2VWaWV3Q291bnQgKz0gbmVzdGVkUHJvdG9WaWV3Lm1lcmdlSW5mby52aWV3Q291bnQ7XG4gICAgICB0aGlzLm1lcmdlRW1iZWRkZWRWaWV3Q291bnQgKz0gbmVzdGVkUHJvdG9WaWV3Lm1lcmdlSW5mby5lbWJlZGRlZFZpZXdDb3VudDtcbiAgICB9XG4gICAgdmFyIGVsZW1lbnRCaW5kZXIgPSBfY3JlYXRlRWxlbWVudEJpbmRlcihcbiAgICAgICAgdGhpcy5fZGlyZWN0aXZlUmVzb2x2ZXIsIG5lc3RlZFByb3RvVmlldywgdGhpcy5lbGVtZW50QmluZGVyU3RhY2ssIHRoaXMuYm91bmRFbGVtZW50SW5kZXgsXG4gICAgICAgIHRoaXMuZGlzdGFuY2VUb1BhcmVudEVsZW1lbnRCaW5kZXIsIHRoaXMuZGlzdGFuY2VUb1BhcmVudFByb3RvRWxlbWVudEluamVjdG9yLCBjbWQpO1xuICAgIHRoaXMuZWxlbWVudEJpbmRlcnMucHVzaChlbGVtZW50QmluZGVyKTtcbiAgICB2YXIgcHJvdG9FbGVtZW50SW5qZWN0b3IgPSBlbGVtZW50QmluZGVyLnByb3RvRWxlbWVudEluamVjdG9yO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY21kLnZhcmlhYmxlTmFtZUFuZFZhbHVlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgdGhpcy52YXJpYWJsZUxvY2F0aW9ucy5zZXQoPHN0cmluZz5jbWQudmFyaWFibGVOYW1lQW5kVmFsdWVzW2ldLCB0aGlzLmJvdW5kRWxlbWVudEluZGV4KTtcbiAgICB9XG4gICAgdGhpcy5ib3VuZEVsZW1lbnRJbmRleCsrO1xuICAgIHRoaXMubWVyZ2VFbGVtZW50Q291bnQrKztcbiAgICByZXR1cm4gdGhpcy5fdmlzaXRCZWdpbkVsZW1lbnQoY21kLCBlbGVtZW50QmluZGVyLCBwcm90b0VsZW1lbnRJbmplY3Rvcik7XG4gIH1cblxuICBwcml2YXRlIF92aXNpdEJlZ2luRWxlbWVudChjbWQ6IElCZWdpbkVsZW1lbnRDbWQsIGVsZW1lbnRCaW5kZXI6IEVsZW1lbnRCaW5kZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvRWxlbWVudEluamVjdG9yOiBQcm90b0VsZW1lbnRJbmplY3Rvcik6IGFueSB7XG4gICAgdGhpcy5kaXN0YW5jZVRvUGFyZW50RWxlbWVudEJpbmRlciA9XG4gICAgICAgIGlzUHJlc2VudChlbGVtZW50QmluZGVyKSA/IDEgOiB0aGlzLmRpc3RhbmNlVG9QYXJlbnRFbGVtZW50QmluZGVyICsgMTtcbiAgICB0aGlzLmRpc3RhbmNlVG9QYXJlbnRQcm90b0VsZW1lbnRJbmplY3RvciA9XG4gICAgICAgIGlzUHJlc2VudChwcm90b0VsZW1lbnRJbmplY3RvcikgPyAxIDogdGhpcy5kaXN0YW5jZVRvUGFyZW50UHJvdG9FbGVtZW50SW5qZWN0b3IgKyAxO1xuICAgIHRoaXMuZWxlbWVudEJpbmRlclN0YWNrLnB1c2goZWxlbWVudEJpbmRlcik7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIF92aXNpdEVuZEVsZW1lbnQoKTogYW55IHtcbiAgICB2YXIgcGFyZW50RWxlbWVudEJpbmRlciA9IHRoaXMuZWxlbWVudEJpbmRlclN0YWNrLnBvcCgpO1xuICAgIHZhciBwYXJlbnRQcm90b0VsZW1lbnRJbmplY3RvciA9XG4gICAgICAgIGlzUHJlc2VudChwYXJlbnRFbGVtZW50QmluZGVyKSA/IHBhcmVudEVsZW1lbnRCaW5kZXIucHJvdG9FbGVtZW50SW5qZWN0b3IgOiBudWxsO1xuICAgIHRoaXMuZGlzdGFuY2VUb1BhcmVudEVsZW1lbnRCaW5kZXIgPSBpc1ByZXNlbnQocGFyZW50RWxlbWVudEJpbmRlcikgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50RWxlbWVudEJpbmRlci5kaXN0YW5jZVRvUGFyZW50IDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzdGFuY2VUb1BhcmVudEVsZW1lbnRCaW5kZXIgLSAxO1xuICAgIHRoaXMuZGlzdGFuY2VUb1BhcmVudFByb3RvRWxlbWVudEluamVjdG9yID0gaXNQcmVzZW50KHBhcmVudFByb3RvRWxlbWVudEluamVjdG9yKSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50UHJvdG9FbGVtZW50SW5qZWN0b3IuZGlzdGFuY2VUb1BhcmVudCA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXN0YW5jZVRvUGFyZW50UHJvdG9FbGVtZW50SW5qZWN0b3IgLSAxO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cblxuZnVuY3Rpb24gX2NyZWF0ZUVsZW1lbnRCaW5kZXIoZGlyZWN0aXZlUmVzb2x2ZXI6IERpcmVjdGl2ZVJlc29sdmVyLCBuZXN0ZWRQcm90b1ZpZXc6IEFwcFByb3RvVmlldyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRCaW5kZXJTdGFjazogRWxlbWVudEJpbmRlcltdLCBib3VuZEVsZW1lbnRJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2VUb1BhcmVudEJpbmRlcjogbnVtYmVyLCBkaXN0YW5jZVRvUGFyZW50UGVpOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbkVsZW1lbnRDbWQ6IElCZWdpbkVsZW1lbnRDbWQpOiBFbGVtZW50QmluZGVyIHtcbiAgdmFyIHBhcmVudEVsZW1lbnRCaW5kZXI6IEVsZW1lbnRCaW5kZXIgPSBudWxsO1xuICB2YXIgcGFyZW50UHJvdG9FbGVtZW50SW5qZWN0b3I6IFByb3RvRWxlbWVudEluamVjdG9yID0gbnVsbDtcbiAgaWYgKGRpc3RhbmNlVG9QYXJlbnRCaW5kZXIgPiAwKSB7XG4gICAgcGFyZW50RWxlbWVudEJpbmRlciA9IGVsZW1lbnRCaW5kZXJTdGFja1tlbGVtZW50QmluZGVyU3RhY2subGVuZ3RoIC0gZGlzdGFuY2VUb1BhcmVudEJpbmRlcl07XG4gIH1cbiAgaWYgKGlzQmxhbmsocGFyZW50RWxlbWVudEJpbmRlcikpIHtcbiAgICBkaXN0YW5jZVRvUGFyZW50QmluZGVyID0gLTE7XG4gIH1cbiAgaWYgKGRpc3RhbmNlVG9QYXJlbnRQZWkgPiAwKSB7XG4gICAgdmFyIHBlaUJpbmRlciA9IGVsZW1lbnRCaW5kZXJTdGFja1tlbGVtZW50QmluZGVyU3RhY2subGVuZ3RoIC0gZGlzdGFuY2VUb1BhcmVudFBlaV07XG4gICAgaWYgKGlzUHJlc2VudChwZWlCaW5kZXIpKSB7XG4gICAgICBwYXJlbnRQcm90b0VsZW1lbnRJbmplY3RvciA9IHBlaUJpbmRlci5wcm90b0VsZW1lbnRJbmplY3RvcjtcbiAgICB9XG4gIH1cbiAgaWYgKGlzQmxhbmsocGFyZW50UHJvdG9FbGVtZW50SW5qZWN0b3IpKSB7XG4gICAgZGlzdGFuY2VUb1BhcmVudFBlaSA9IC0xO1xuICB9XG4gIHZhciBjb21wb25lbnREaXJlY3RpdmVQcm92aWRlcjogRGlyZWN0aXZlUHJvdmlkZXIgPSBudWxsO1xuICB2YXIgaXNFbWJlZGRlZFRlbXBsYXRlID0gZmFsc2U7XG4gIHZhciBkaXJlY3RpdmVQcm92aWRlcnM6IERpcmVjdGl2ZVByb3ZpZGVyW10gPVxuICAgICAgYmVnaW5FbGVtZW50Q21kLmRpcmVjdGl2ZXMubWFwKHR5cGUgPT4gcHJvdmlkZURpcmVjdGl2ZShkaXJlY3RpdmVSZXNvbHZlciwgdHlwZSkpO1xuICBpZiAoYmVnaW5FbGVtZW50Q21kIGluc3RhbmNlb2YgQmVnaW5Db21wb25lbnRDbWQpIHtcbiAgICBjb21wb25lbnREaXJlY3RpdmVQcm92aWRlciA9IGRpcmVjdGl2ZVByb3ZpZGVyc1swXTtcbiAgfSBlbHNlIGlmIChiZWdpbkVsZW1lbnRDbWQgaW5zdGFuY2VvZiBFbWJlZGRlZFRlbXBsYXRlQ21kKSB7XG4gICAgaXNFbWJlZGRlZFRlbXBsYXRlID0gdHJ1ZTtcbiAgfVxuXG4gIHZhciBwcm90b0VsZW1lbnRJbmplY3RvciA9IG51bGw7XG4gIC8vIENyZWF0ZSBhIHByb3RvRWxlbWVudEluamVjdG9yIGZvciBhbnkgZWxlbWVudCB0aGF0IGVpdGhlciBoYXMgYmluZGluZ3MgKm9yKiBoYXMgb25lXG4gIC8vIG9yIG1vcmUgdmFyLSBkZWZpbmVkICpvciogZm9yIDx0ZW1wbGF0ZT4gZWxlbWVudHM6XG4gIC8vIC0gRWxlbWVudHMgd2l0aCBhIHZhci0gZGVmaW5lZCBuZWVkIGEgdGhlaXIgb3duIGVsZW1lbnQgaW5qZWN0b3JcbiAgLy8gICBzbyB0aGF0LCB3aGVuIGh5ZHJhdGluZywgJGltcGxpY2l0IGNhbiBiZSBzZXQgdG8gdGhlIGVsZW1lbnQuXG4gIC8vIC0gPHRlbXBsYXRlPiBlbGVtZW50cyBuZWVkIHRoZWlyIG93biBFbGVtZW50SW5qZWN0b3Igc28gdGhhdCB3ZSBjYW4gcXVlcnkgdGhlaXIgVGVtcGxhdGVSZWZcbiAgdmFyIGhhc1ZhcmlhYmxlcyA9IGJlZ2luRWxlbWVudENtZC52YXJpYWJsZU5hbWVBbmRWYWx1ZXMubGVuZ3RoID4gMDtcbiAgaWYgKGRpcmVjdGl2ZVByb3ZpZGVycy5sZW5ndGggPiAwIHx8IGhhc1ZhcmlhYmxlcyB8fCBpc0VtYmVkZGVkVGVtcGxhdGUpIHtcbiAgICB2YXIgZGlyZWN0aXZlVmFyaWFibGVCaW5kaW5ncyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgaWYgKCFpc0VtYmVkZGVkVGVtcGxhdGUpIHtcbiAgICAgIGRpcmVjdGl2ZVZhcmlhYmxlQmluZGluZ3MgPSBjcmVhdGVEaXJlY3RpdmVWYXJpYWJsZUJpbmRpbmdzKFxuICAgICAgICAgIGJlZ2luRWxlbWVudENtZC52YXJpYWJsZU5hbWVBbmRWYWx1ZXMsIGRpcmVjdGl2ZVByb3ZpZGVycyk7XG4gICAgfVxuICAgIHByb3RvRWxlbWVudEluamVjdG9yID0gUHJvdG9FbGVtZW50SW5qZWN0b3IuY3JlYXRlKFxuICAgICAgICBwYXJlbnRQcm90b0VsZW1lbnRJbmplY3RvciwgYm91bmRFbGVtZW50SW5kZXgsIGRpcmVjdGl2ZVByb3ZpZGVycyxcbiAgICAgICAgaXNQcmVzZW50KGNvbXBvbmVudERpcmVjdGl2ZVByb3ZpZGVyKSwgZGlzdGFuY2VUb1BhcmVudFBlaSwgZGlyZWN0aXZlVmFyaWFibGVCaW5kaW5ncyk7XG4gICAgcHJvdG9FbGVtZW50SW5qZWN0b3IuYXR0cmlidXRlcyA9IGFycmF5VG9NYXAoYmVnaW5FbGVtZW50Q21kLmF0dHJOYW1lQW5kVmFsdWVzLCBmYWxzZSk7XG4gIH1cblxuICByZXR1cm4gbmV3IEVsZW1lbnRCaW5kZXIoYm91bmRFbGVtZW50SW5kZXgsIHBhcmVudEVsZW1lbnRCaW5kZXIsIGRpc3RhbmNlVG9QYXJlbnRCaW5kZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b0VsZW1lbnRJbmplY3RvciwgY29tcG9uZW50RGlyZWN0aXZlUHJvdmlkZXIsIG5lc3RlZFByb3RvVmlldyk7XG59XG5cbmZ1bmN0aW9uIHByb3ZpZGVEaXJlY3RpdmUoZGlyZWN0aXZlUmVzb2x2ZXI6IERpcmVjdGl2ZVJlc29sdmVyLCB0eXBlOiBUeXBlKTogRGlyZWN0aXZlUHJvdmlkZXIge1xuICBsZXQgYW5ub3RhdGlvbiA9IGRpcmVjdGl2ZVJlc29sdmVyLnJlc29sdmUodHlwZSk7XG4gIHJldHVybiBEaXJlY3RpdmVQcm92aWRlci5jcmVhdGVGcm9tVHlwZSh0eXBlLCBhbm5vdGF0aW9uKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURpcmVjdGl2ZVZhcmlhYmxlQmluZGluZ3MoXG4gICAgdmFyaWFibGVOYW1lQW5kVmFsdWVzOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+LFxuICAgIGRpcmVjdGl2ZVByb3ZpZGVyczogRGlyZWN0aXZlUHJvdmlkZXJbXSk6IE1hcDxzdHJpbmcsIG51bWJlcj4ge1xuICB2YXIgZGlyZWN0aXZlVmFyaWFibGVCaW5kaW5ncyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdmFyaWFibGVOYW1lQW5kVmFsdWVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgdmFyIHRlbXBsYXRlTmFtZSA9IDxzdHJpbmc+dmFyaWFibGVOYW1lQW5kVmFsdWVzW2ldO1xuICAgIHZhciBkaXJJbmRleCA9IDxudW1iZXI+dmFyaWFibGVOYW1lQW5kVmFsdWVzW2kgKyAxXTtcbiAgICBpZiAoaXNOdW1iZXIoZGlySW5kZXgpKSB7XG4gICAgICBkaXJlY3RpdmVWYXJpYWJsZUJpbmRpbmdzLnNldCh0ZW1wbGF0ZU5hbWUsIGRpckluZGV4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYSB2YXJpYWJsZSB3aXRob3V0IGEgZGlyZWN0aXZlIGluZGV4IC0+IHJlZmVyZW5jZSB0aGUgZWxlbWVudFxuICAgICAgZGlyZWN0aXZlVmFyaWFibGVCaW5kaW5ncy5zZXQodGVtcGxhdGVOYW1lLCBudWxsKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRpcmVjdGl2ZVZhcmlhYmxlQmluZGluZ3M7XG59XG5cblxuZnVuY3Rpb24gYXJyYXlUb01hcChhcnI6IHN0cmluZ1tdLCBpbnZlcnNlOiBib29sZWFuKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gIHZhciByZXN1bHQgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkgKz0gMikge1xuICAgIGlmIChpbnZlcnNlKSB7XG4gICAgICByZXN1bHQuc2V0KGFycltpICsgMV0sIGFycltpXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5zZXQoYXJyW2ldLCBhcnJbaSArIDFdKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gX2ZsYXR0ZW5BcnJheSh0cmVlOiBhbnlbXSwgb3V0OiBBcnJheTxUeXBlIHwgUHJvdmlkZXIgfCBhbnlbXT4pOiB2b2lkIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmVlLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGl0ZW0gPSByZXNvbHZlRm9yd2FyZFJlZih0cmVlW2ldKTtcbiAgICBpZiAoaXNBcnJheShpdGVtKSkge1xuICAgICAgX2ZsYXR0ZW5BcnJheShpdGVtLCBvdXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gX2ZsYXR0ZW5TdHlsZUFycihhcnI6IEFycmF5PHN0cmluZyB8IGFueVtdPiwgb3V0OiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZW50cnkgPSBhcnJbaV07XG4gICAgaWYgKGlzQXJyYXkoZW50cnkpKSB7XG4gICAgICBfZmxhdHRlblN0eWxlQXJyKDxhbnlbXT5lbnRyeSwgb3V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0LnB1c2goPHN0cmluZz5lbnRyeSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvcHJvdG9fdmlld19mYWN0b3J5LnRzXG4gKiovIiwiaW1wb3J0IHt1bmltcGxlbWVudGVkfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtNYXB9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge1ZpZXdFbmNhcHN1bGF0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9tZXRhZGF0YSc7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBBbmd1bGFyIFByb3RvVmlldyBpbiB0aGUgUmVuZGVyaW5nIENvbnRleHQuXG4gKlxuICogV2hlbiB5b3UgaW1wbGVtZW50IGEgY3VzdG9tIHtAbGluayBSZW5kZXJlcn0sIGBSZW5kZXJQcm90b1ZpZXdSZWZgIHNwZWNpZmllcyB3aGF0IFJlbmRlciBWaWV3XG4gKiB5b3VyIHJlbmRlcmVyIHNob3VsZCBjcmVhdGUuXG4gKlxuICogYFJlbmRlclByb3RvVmlld1JlZmAgaXMgYSBjb3VudGVycGFydCB0byB7QGxpbmsgUHJvdG9WaWV3UmVmfSBhdmFpbGFibGUgaW4gdGhlIEFwcGxpY2F0aW9uXG4gKiBDb250ZXh0LiBCdXQgdW5saWtlIGBQcm90b1ZpZXdSZWZgLCBgUmVuZGVyUHJvdG9WaWV3UmVmYCBjb250YWlucyBhbGwgc3RhdGljIG5lc3RlZCBQcm90byBWaWV3c1xuICogdGhhdCBhcmUgcmVjdXJzaXZlbHkgbWVyZ2VkIGludG8gYSBzaW5nbGUgUmVuZGVyIFByb3RvIFZpZXcuXG5cbiAqXG4gKiA8IS0tIFRPRE86IHRoaXMgaXMgY3JlYXRlZCBieSBSZW5kZXJlciNjcmVhdGVQcm90b1ZpZXcgaW4gdGhlIG5ldyBjb21waWxlciAtLT5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlbmRlclByb3RvVmlld1JlZiB7fVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBsaXN0IG9mIHNpYmxpbmcgTm9kZXMgdGhhdCBjYW4gYmUgbW92ZWQgYnkgdGhlIHtAbGluayBSZW5kZXJlcn0gaW5kZXBlbmRlbnRseSBvZlxuICogb3RoZXIgUmVuZGVyIEZyYWdtZW50cy5cbiAqXG4gKiBBbnkge0BsaW5rIFJlbmRlclZpZXdSZWZ9IGhhcyBvbmUgUmVuZGVyIEZyYWdtZW50LlxuICpcbiAqIEFkZGl0aW9uYWxseSBhbnkgVmlldyB3aXRoIGFuIEVtYmVkZGVkIFZpZXcgdGhhdCBjb250YWlucyBhIHtAbGluayBOZ0NvbnRlbnRBc3QgVmlldyBQcm9qZWN0aW9ufVxuICogcmVzdWx0cyBpbiBhZGRpdGlvbmFsIFJlbmRlciBGcmFnbWVudC5cbiAqL1xuLypcbiAgPGRpdj5mb288L2Rpdj5cbiAge3tiYXJ9fVxuXG5cbiAgPGRpdj5mb288L2Rpdj4gLT4gdmlldyAxIC8gZnJhZ21lbnQgMVxuICA8dWw+XG4gICAgPHRlbXBsYXRlIG5nRm9yPlxuICAgICAgPGxpPnt7Zmd9fTwvbGk+IC0+IHZpZXcgMiAvIGZyYWdtZW50IDFcbiAgICA8L3RlbXBsYXRlPlxuICA8L3VsPlxuICB7e2Jhcn19XG5cblxuICA8ZGl2PmZvbzwvZGl2PiAtPiB2aWV3IDEgLyBmcmFnbWVudCAxXG4gIDx1bD5cbiAgICA8dGVtcGxhdGUgbmdJZj5cbiAgICAgIDxsaT48bmctY29udGVudD48Lz48L2xpPiAtPiB2aWV3IDEgLyBmcmFnbWVudCAyXG4gICAgPC90ZW1wbGF0ZT5cbiAgICA8dGVtcGxhdGUgbmdGb3I+XG4gICAgICA8bGk+PG5nLWNvbnRlbnQ+PC8+PC9saT4gLT5cbiAgICAgIDxsaT48L2xpPiAgICAgICAgICAgICAgICAtPiB2aWV3IDEgLyBmcmFnbWVudCAyICsgdmlldyAyIC8gZnJhZ21lbnQgMS4ubi0xXG4gICAgPC90ZW1wbGF0ZT5cbiAgPC91bD5cbiAge3tiYXJ9fVxuICovXG4vLyBUT0RPKGkpOiByZWZhY3RvciBpbnRvIGFuIGludGVyZmFjZVxuZXhwb3J0IGNsYXNzIFJlbmRlckZyYWdtZW50UmVmIHt9XG5cblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIEFuZ3VsYXIgVmlldyBpbiB0aGUgUmVuZGVyaW5nIENvbnRleHQuXG4gKlxuICogYFJlbmRlclZpZXdSZWZgIHNwZWNpZmllcyB0byB0aGUge0BsaW5rIFJlbmRlcmVyfSB3aGF0IFZpZXcgdG8gdXBkYXRlIG9yIGRlc3Ryb3kuXG4gKlxuICogVW5saWtlIGEge0BsaW5rIFZpZXdSZWZ9IGF2YWlsYWJsZSBpbiB0aGUgQXBwbGljYXRpb24gQ29udGV4dCwgUmVuZGVyIFZpZXcgY29udGFpbnMgYWxsIHRoZVxuICogc3RhdGljIENvbXBvbmVudCBWaWV3cyB0aGF0IGhhdmUgYmVlbiByZWN1cnNpdmVseSBtZXJnZWQgaW50byBhIHNpbmdsZSBSZW5kZXIgVmlldy5cbiAqXG4gKiBFYWNoIGBSZW5kZXJWaWV3UmVmYCBjb250YWlucyBvbmUgb3IgbW9yZSB7QGxpbmsgUmVuZGVyRnJhZ21lbnRSZWYgUmVuZGVyIEZyYWdtZW50c30sIHRoZXNlXG4gKiBGcmFnbWVudHMgYXJlIGNyZWF0ZWQsIGh5ZHJhdGVkLCBkZWh5ZHJhdGVkIGFuZCBkZXN0cm95ZWQgYXMgYSBzaW5nbGUgdW5pdCB0b2dldGhlciB3aXRoIHRoZVxuICogVmlldy5cbiAqL1xuLy8gVE9ETyhpKTogcmVmYWN0b3IgaW50byBhbiBpbnRlcmZhY2VcbmV4cG9ydCBjbGFzcyBSZW5kZXJWaWV3UmVmIHt9XG5cbi8qKlxuICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgY29tbWFuZHMgdG8gdGhlIEFuZ3VsYXIgcmVuZGVyZXIsIHVzaW5nIHRoZSB2aXNpdG9yIHBhdHRlcm4uXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBSZW5kZXJUZW1wbGF0ZUNtZCB7XG4gIGFic3RyYWN0IHZpc2l0KHZpc2l0b3I6IFJlbmRlckNvbW1hbmRWaXNpdG9yLCBjb250ZXh0OiBhbnkpOiBhbnk7XG59XG5cbi8qKlxuICogQ29tbWFuZCB0byBiZWdpbiByZW5kZXJpbmcuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBSZW5kZXJCZWdpbkNtZCBleHRlbmRzIFJlbmRlclRlbXBsYXRlQ21kIHtcbiAgZ2V0IG5nQ29udGVudEluZGV4KCk6IG51bWJlciB7IHJldHVybiB1bmltcGxlbWVudGVkKCk7IH07XG4gIGdldCBpc0JvdW5kKCk6IGJvb2xlYW4geyByZXR1cm4gdW5pbXBsZW1lbnRlZCgpOyB9O1xufVxuXG4vKipcbiAqIENvbW1hbmQgdG8gcmVuZGVyIHRleHQuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBSZW5kZXJUZXh0Q21kIGV4dGVuZHMgUmVuZGVyQmVnaW5DbWQge1xuICBnZXQgdmFsdWUoKTogc3RyaW5nIHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfTtcbn1cblxuLyoqXG4gKiBDb21tYW5kIHRvIHJlbmRlciBwcm9qZWN0ZWQgY29udGVudC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJlbmRlck5nQ29udGVudENtZCBleHRlbmRzIFJlbmRlclRlbXBsYXRlQ21kIHtcbiAgLy8gVGhlIGluZGV4IG9mIHRoaXMgTmdDb250ZW50IGVsZW1lbnRcbiAgZ2V0IGluZGV4KCk6IG51bWJlciB7IHJldHVybiB1bmltcGxlbWVudGVkKCk7IH07XG4gIC8vIFRoZSBpbmRleCBvZiB0aGUgTmdDb250ZW50IGVsZW1lbnQgaW50byB3aGljaCB0aGlzXG4gIC8vIE5nQ29udGVudCBlbGVtZW50IHNob3VsZCBiZSBwcm9qZWN0ZWQgKGlmIGFueSlcbiAgZ2V0IG5nQ29udGVudEluZGV4KCk6IG51bWJlciB7IHJldHVybiB1bmltcGxlbWVudGVkKCk7IH07XG59XG5cbi8qKlxuICogQ29tbWFuZCB0byBiZWdpbiByZW5kZXJpbmcgYW4gZWxlbWVudC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJlbmRlckJlZ2luRWxlbWVudENtZCBleHRlbmRzIFJlbmRlckJlZ2luQ21kIHtcbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfTtcbiAgZ2V0IGF0dHJOYW1lQW5kVmFsdWVzKCk6IHN0cmluZ1tdIHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfTtcbiAgZ2V0IGV2ZW50VGFyZ2V0QW5kTmFtZXMoKTogc3RyaW5nW10geyByZXR1cm4gdW5pbXBsZW1lbnRlZCgpOyB9O1xufVxuXG4vKipcbiAqIENvbW1hbmQgdG8gYmVnaW4gcmVuZGVyaW5nIGEgY29tcG9uZW50LlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUmVuZGVyQmVnaW5Db21wb25lbnRDbWQgZXh0ZW5kcyBSZW5kZXJCZWdpbkVsZW1lbnRDbWQge1xuICBnZXQgdGVtcGxhdGVJZCgpOiBzdHJpbmcgeyByZXR1cm4gdW5pbXBsZW1lbnRlZCgpOyB9O1xufVxuXG4vKipcbiAqIENvbW1hbmQgdG8gcmVuZGVyIGEgY29tcG9uZW50J3MgdGVtcGxhdGUuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBSZW5kZXJFbWJlZGRlZFRlbXBsYXRlQ21kIGV4dGVuZHMgUmVuZGVyQmVnaW5FbGVtZW50Q21kIHtcbiAgZ2V0IGlzTWVyZ2VkKCk6IGJvb2xlYW4geyByZXR1cm4gdW5pbXBsZW1lbnRlZCgpOyB9O1xuICBnZXQgY2hpbGRyZW4oKTogUmVuZGVyVGVtcGxhdGVDbWRbXSB7IHJldHVybiB1bmltcGxlbWVudGVkKCk7IH07XG59XG5cbi8qKlxuICogVmlzaXRvciBmb3IgYSB7QGxpbmsgUmVuZGVyVGVtcGxhdGVDbWR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlckNvbW1hbmRWaXNpdG9yIHtcbiAgdmlzaXRUZXh0KGNtZDogUmVuZGVyVGV4dENtZCwgY29udGV4dDogYW55KTogYW55O1xuICB2aXNpdE5nQ29udGVudChjbWQ6IFJlbmRlck5nQ29udGVudENtZCwgY29udGV4dDogYW55KTogYW55O1xuICB2aXNpdEJlZ2luRWxlbWVudChjbWQ6IFJlbmRlckJlZ2luRWxlbWVudENtZCwgY29udGV4dDogYW55KTogYW55O1xuICB2aXNpdEVuZEVsZW1lbnQoY29udGV4dDogYW55KTogYW55O1xuICB2aXNpdEJlZ2luQ29tcG9uZW50KGNtZDogUmVuZGVyQmVnaW5Db21wb25lbnRDbWQsIGNvbnRleHQ6IGFueSk6IGFueTtcbiAgdmlzaXRFbmRDb21wb25lbnQoY29udGV4dDogYW55KTogYW55O1xuICB2aXNpdEVtYmVkZGVkVGVtcGxhdGUoY21kOiBSZW5kZXJFbWJlZGRlZFRlbXBsYXRlQ21kLCBjb250ZXh0OiBhbnkpOiBhbnk7XG59XG5cblxuLyoqXG4gKiBDb250YWluZXIgY2xhc3MgcHJvZHVjZWQgYnkgYSB7QGxpbmsgUmVuZGVyZXJ9IHdoZW4gY3JlYXRpbmcgYSBSZW5kZXIgVmlldy5cbiAqXG4gKiBBbiBpbnN0YW5jZSBvZiBgUmVuZGVyVmlld1dpdGhGcmFnbWVudHNgIGNvbnRhaW5zIGEge0BsaW5rIFJlbmRlclZpZXdSZWZ9IGFuZCBhbiBhcnJheSBvZlxuICoge0BsaW5rIFJlbmRlckZyYWdtZW50UmVmfXMgYmVsb25naW5nIHRvIHRoaXMgUmVuZGVyIFZpZXcuXG4gKi9cbi8vIFRPRE8oaSk6IHJlZmFjdG9yIHRoaXMgYnkgUmVuZGVyVmlld1dpdGhGcmFnbWVudHMgYW5kIGFkZGluZyBmcmFnbWVudHMgZGlyZWN0bHkgdG8gUmVuZGVyVmlld1JlZlxuZXhwb3J0IGNsYXNzIFJlbmRlclZpZXdXaXRoRnJhZ21lbnRzIHtcbiAgY29uc3RydWN0b3IoXG4gICAgICAvKipcbiAgICAgICAqIFJlZmVyZW5jZSB0byB0aGUge0BsaW5rIFJlbmRlclZpZXdSZWZ9LlxuICAgICAgICovXG4gICAgICBwdWJsaWMgdmlld1JlZjogUmVuZGVyVmlld1JlZixcbiAgICAgIC8qKlxuICAgICAgICogQXJyYXkgb2Yge0BsaW5rIFJlbmRlckZyYWdtZW50UmVmfXMgb3JkZXJlZCBpbiB0aGUgZGVwdGgtZmlyc3Qgb3JkZXIuXG4gICAgICAgKi9cbiAgICAgIHB1YmxpYyBmcmFnbWVudFJlZnM6IFJlbmRlckZyYWdtZW50UmVmW10pIHt9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBFbGVtZW50IHRoYXQgaXMgcGFydCBvZiBhIHtAbGluayBSZW5kZXJWaWV3UmVmIFJlbmRlciBWaWV3fS5cbiAqXG4gKiBgUmVuZGVyRWxlbWVudFJlZmAgaXMgYSBjb3VudGVycGFydCB0byB7QGxpbmsgRWxlbWVudFJlZn0gYXZhaWxhYmxlIGluIHRoZSBBcHBsaWNhdGlvbiBDb250ZXh0LlxuICpcbiAqIFdoZW4gdXNpbmcgYFJlbmRlcmVyYCBmcm9tIHRoZSBBcHBsaWNhdGlvbiBDb250ZXh0LCBgRWxlbWVudFJlZmAgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZlxuICogYFJlbmRlckVsZW1lbnRSZWZgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlckVsZW1lbnRSZWYge1xuICAvKipcbiAgICogUmVmZXJlbmNlIHRvIHRoZSBSZW5kZXIgVmlldyB0aGF0IGNvbnRhaW5zIHRoaXMgRWxlbWVudC5cbiAgICovXG4gIHJlbmRlclZpZXc6IFJlbmRlclZpZXdSZWY7XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKlxuICAgKiBJbmRleCBvZiB0aGUgRWxlbWVudCAoaW4gdGhlIGRlcHRoLWZpcnN0IG9yZGVyKSBpbnNpZGUgdGhlIFJlbmRlciBWaWV3LlxuICAgKlxuICAgKiBUaGlzIGluZGV4IGlzIHVzZWQgaW50ZXJuYWxseSBieSBBbmd1bGFyIHRvIGxvY2F0ZSBlbGVtZW50cy5cbiAgICovXG4gIGJvdW5kRWxlbWVudEluZGV4OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGVtcGxhdGUgZm9yIHJlbmRlcmluZyBhIGNvbXBvbmVudCwgaW5jbHVkaW5nIGNvbW1hbmRzIGFuZCBzdHlsZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZW5kZXJDb21wb25lbnRUZW1wbGF0ZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBpZDogc3RyaW5nLCBwdWJsaWMgc2hvcnRJZDogc3RyaW5nLCBwdWJsaWMgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24sXG4gICAgICAgICAgICAgIHB1YmxpYyBjb21tYW5kczogUmVuZGVyVGVtcGxhdGVDbWRbXSwgcHVibGljIHN0eWxlczogc3RyaW5nW10pIHt9XG59XG5cbi8qKlxuICogSW5qZWN0YWJsZSBzZXJ2aWNlIHRoYXQgcHJvdmlkZXMgYSBsb3ctbGV2ZWwgaW50ZXJmYWNlIGZvciBtb2RpZnlpbmcgdGhlIFVJLlxuICpcbiAqIFVzZSB0aGlzIHNlcnZpY2UgdG8gYnlwYXNzIEFuZ3VsYXIncyB0ZW1wbGF0aW5nIGFuZCBtYWtlIGN1c3RvbSBVSSBjaGFuZ2VzIHRoYXQgY2FuJ3QgYmVcbiAqIGV4cHJlc3NlZCBkZWNsYXJhdGl2ZWx5LiBGb3IgZXhhbXBsZSBpZiB5b3UgbmVlZCB0byBzZXQgYSBwcm9wZXJ0eSBvciBhbiBhdHRyaWJ1dGUgd2hvc2UgbmFtZSBpc1xuICogbm90IHN0YXRpY2FsbHkga25vd24sIHVzZSB7QGxpbmsgI3NldEVsZW1lbnRQcm9wZXJ0eX0gb3Ige0BsaW5rICNzZXRFbGVtZW50QXR0cmlidXRlfVxuICogcmVzcGVjdGl2ZWx5LlxuICpcbiAqIElmIHlvdSBhcmUgaW1wbGVtZW50aW5nIGEgY3VzdG9tIHJlbmRlcmVyLCB5b3UgbXVzdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuXG4gKlxuICogVGhlIGRlZmF1bHQgUmVuZGVyZXIgaW1wbGVtZW50YXRpb24gaXMgYERvbVJlbmRlcmVyYC4gQWxzbyBhdmFpbGFibGUgaXMgYFdlYldvcmtlclJlbmRlcmVyYC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJlbmRlcmVyIHtcbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGNvbXBvbmVudCB0ZW1wbGF0ZSByZXByZXNlbnRlZCBhcyBhcnJheXMgb2Yge0BsaW5rIFJlbmRlclRlbXBsYXRlQ21kfXMgYW5kIHN0eWxlc1xuICAgKiB3aXRoIHRoZSBSZW5kZXJlci5cbiAgICpcbiAgICogT25jZSBhIHRlbXBsYXRlIGlzIHJlZ2lzdGVyZWQgaXQgY2FuIGJlIHJlZmVyZW5jZWQgdmlhIHtAbGluayBSZW5kZXJCZWdpbkNvbXBvbmVudENtZH0gd2hlblxuICAgKiB7QGxpbmsgI2NyZWF0ZVByb3RvVmlldyBjcmVhdGluZyBSZW5kZXIgUHJvdG9WaWV3fS5cbiAgICovXG4gIGFic3RyYWN0IHJlZ2lzdGVyQ29tcG9uZW50VGVtcGxhdGUodGVtcGxhdGU6IFJlbmRlckNvbXBvbmVudFRlbXBsYXRlKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHtAbGluayBSZW5kZXJQcm90b1ZpZXdSZWZ9IGZyb20gYW4gYXJyYXkgb2Yge0BsaW5rIFJlbmRlclRlbXBsYXRlQ21kfWBzLlxuICAgKi9cbiAgYWJzdHJhY3QgY3JlYXRlUHJvdG9WaWV3KGNvbXBvbmVudFRlbXBsYXRlSWQ6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZHM6IFJlbmRlclRlbXBsYXRlQ21kW10pOiBSZW5kZXJQcm90b1ZpZXdSZWY7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBSb290IEhvc3QgVmlldyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgYGhvc3RQcm90b1ZpZXdSZWZgLlxuICAgKlxuICAgKiBgZnJhZ21lbnRDb3VudGAgaXMgdGhlIG51bWJlciBvZiBuZXN0ZWQge0BsaW5rIFJlbmRlckZyYWdtZW50UmVmfXMgaW4gdGhpcyBWaWV3LiBUaGlzIHBhcmFtZXRlclxuICAgKiBpcyBub24tb3B0aW9uYWwgc28gdGhhdCB0aGUgcmVuZGVyZXIgY2FuIGNyZWF0ZSBhIHJlc3VsdCBzeW5jaHJvbm91c2x5IGV2ZW4gd2hlbiBhcHBsaWNhdGlvblxuICAgKiBydW5zIGluIGEgZGlmZmVyZW50IGNvbnRleHQgKGUuZy4gaW4gYSBXZWIgV29ya2VyKS5cbiAgICpcbiAgICogYGhvc3RFbGVtZW50U2VsZWN0b3JgIGlzIGEgKENTUykgc2VsZWN0b3IgZm9yIHF1ZXJ5aW5nIHRoZSBtYWluIGRvY3VtZW50IHRvIGZpbmQgdGhlIEhvc3RcbiAgICogRWxlbWVudC4gVGhlIG5ld2x5IGNyZWF0ZWQgUm9vdCBIb3N0IFZpZXcgc2hvdWxkIGJlIGF0dGFjaGVkIHRvIHRoaXMgZWxlbWVudC5cbiAgICpcbiAgICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgUmVuZGVyVmlld1dpdGhGcmFnbWVudHN9LCByZXByZXNlbnRpbmcgdGhlIFJlbmRlciBWaWV3LlxuICAgKi9cbiAgYWJzdHJhY3QgY3JlYXRlUm9vdEhvc3RWaWV3KGhvc3RQcm90b1ZpZXdSZWY6IFJlbmRlclByb3RvVmlld1JlZiwgZnJhZ21lbnRDb3VudDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdEVsZW1lbnRTZWxlY3Rvcjogc3RyaW5nKTogUmVuZGVyVmlld1dpdGhGcmFnbWVudHM7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBSZW5kZXIgVmlldyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgYHByb3RvVmlld1JlZmAuXG4gICAqXG4gICAqIGBmcmFnbWVudENvdW50YCBpcyB0aGUgbnVtYmVyIG9mIG5lc3RlZCB7QGxpbmsgUmVuZGVyRnJhZ21lbnRSZWZ9cyBpbiB0aGlzIFZpZXcuIFRoaXMgcGFyYW1ldGVyXG4gICAqIGlzIG5vbi1vcHRpb25hbCBzbyB0aGF0IHRoZSByZW5kZXJlciBjYW4gY3JlYXRlIGEgcmVzdWx0IHN5bmNocm9ub3VzbHkgZXZlbiB3aGVuIGFwcGxpY2F0aW9uXG4gICAqIHJ1bnMgaW4gYSBkaWZmZXJlbnQgY29udGV4dCAoZS5nLiBpbiBhIFdlYiBXb3JrZXIpLlxuICAgKlxuICAgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHtAbGluayBSZW5kZXJWaWV3V2l0aEZyYWdtZW50c30sIHJlcHJlc2VudGluZyB0aGUgUmVuZGVyIFZpZXcuXG4gICAqL1xuICBhYnN0cmFjdCBjcmVhdGVWaWV3KHByb3RvVmlld1JlZjogUmVuZGVyUHJvdG9WaWV3UmVmLFxuICAgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50Q291bnQ6IG51bWJlcik6IFJlbmRlclZpZXdXaXRoRnJhZ21lbnRzO1xuXG4gIC8qKlxuICAgKiBEZXN0cm95cyBhIFJlbmRlciBWaWV3IHNwZWNpZmllZCB2aWEgYHZpZXdSZWZgLlxuICAgKlxuICAgKiBUaGlzIG9wZXJhdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkIG9ubHkgb24gYSBWaWV3IHRoYXQgaGFzIGFscmVhZHkgYmVlbiBkZWh5ZHJhdGVkIGFuZFxuICAgKiBhbGwgb2YgaXRzIFJlbmRlciBGcmFnbWVudHMgaGF2ZSBiZWVuIGRldGFjaGVkLlxuICAgKlxuICAgKiBEZXN0cm95aW5nIGEgVmlldyBpbmRpY2F0ZXMgdG8gdGhlIFJlbmRlcmVyIHRoYXQgdGhpcyBWaWV3IGlzIG5vdCBnb2luZyB0byBiZSByZWZlcmVuY2VkIGluIGFueVxuICAgKiBmdXR1cmUgb3BlcmF0aW9ucy4gSWYgdGhlIFJlbmRlcmVyIGNyZWF0ZWQgYW55IHJlbmRlcmVyLXNwZWNpZmljIG9iamVjdHMgZm9yIHRoaXMgVmlldywgdGhlc2VcbiAgICogb2JqZWN0cyBzaG91bGQgbm93IGJlIGRlc3Ryb3llZCB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcy5cbiAgICovXG4gIGFic3RyYWN0IGRlc3Ryb3lWaWV3KHZpZXdSZWY6IFJlbmRlclZpZXdSZWYpO1xuXG4gIC8qKlxuICAgKiBBdHRhY2hlcyB0aGUgTm9kZXMgb2YgYSBSZW5kZXIgRnJhZ21lbnQgYWZ0ZXIgdGhlIGxhc3QgTm9kZSBvZiBgcHJldmlvdXNGcmFnbWVudFJlZmAuXG4gICAqL1xuICBhYnN0cmFjdCBhdHRhY2hGcmFnbWVudEFmdGVyRnJhZ21lbnQocHJldmlvdXNGcmFnbWVudFJlZjogUmVuZGVyRnJhZ21lbnRSZWYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudFJlZjogUmVuZGVyRnJhZ21lbnRSZWYpO1xuXG4gIC8qKlxuICAgKiBBdHRhY2hlcyB0aGUgTm9kZXMgb2YgdGhlIFJlbmRlciBGcmFnbWVudCBhZnRlciBhbiBFbGVtZW50LlxuICAgKi9cbiAgYWJzdHJhY3QgYXR0YWNoRnJhZ21lbnRBZnRlckVsZW1lbnQoZWxlbWVudFJlZjogUmVuZGVyRWxlbWVudFJlZiwgZnJhZ21lbnRSZWY6IFJlbmRlckZyYWdtZW50UmVmKTtcblxuICAvKipcbiAgICogRGV0YWNoZXMgdGhlIE5vZGVzIG9mIGEgUmVuZGVyIEZyYWdtZW50IGZyb20gdGhlaXIgcGFyZW50LlxuICAgKlxuICAgKiBUaGlzIG9wZXJhdGlvbnMgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IG9uIGEgVmlldyB0aGF0IGhhcyBiZWVuIGFscmVhZHlcbiAgICoge0BsaW5rICNkZWh5ZHJhdGVWaWV3IGRlaHlkcmF0ZWR9LlxuICAgKi9cbiAgYWJzdHJhY3QgZGV0YWNoRnJhZ21lbnQoZnJhZ21lbnRSZWY6IFJlbmRlckZyYWdtZW50UmVmKTtcblxuICAvKipcbiAgICogTm90aWZpZXMgYSBjdXN0b20gUmVuZGVyZXIgdG8gaW5pdGlhbGl6ZSBhIFJlbmRlciBWaWV3LlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgQW5ndWxhciBhZnRlciBhIFJlbmRlciBWaWV3IGhhcyBiZWVuIGNyZWF0ZWQsIG9yIHdoZW4gYSBwcmV2aW91c2x5XG4gICAqIGRlaHlkcmF0ZWQgUmVuZGVyIFZpZXcgaXMgYWJvdXQgdG8gYmUgcmV1c2VkLlxuICAgKi9cbiAgYWJzdHJhY3QgaHlkcmF0ZVZpZXcodmlld1JlZjogUmVuZGVyVmlld1JlZik7XG5cbiAgLyoqXG4gICAqIE5vdGlmaWVzIGEgY3VzdG9tIFJlbmRlcmVyIHRoYXQgYSBSZW5kZXIgVmlldyBpcyBubyBsb25nZXIgYWN0aXZlLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgQW5ndWxhciBiZWZvcmUgYSBSZW5kZXIgVmlldyB3aWxsIGJlIGRlc3Ryb3llZCwgb3Igd2hlbiBhIGh5ZHJhdGVkXG4gICAqIFJlbmRlciBWaWV3IGlzIGFib3V0IHRvIGJlIHB1dCBpbnRvIGEgcG9vbCBmb3IgZnV0dXJlIHJldXNlLlxuICAgKi9cbiAgYWJzdHJhY3QgZGVoeWRyYXRlVmlldyh2aWV3UmVmOiBSZW5kZXJWaWV3UmVmKTtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdW5kZXJseWluZyBuYXRpdmUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGBsb2NhdGlvbmAsIG9yIGBudWxsYCBpZiBkaXJlY3QgYWNjZXNzXG4gICAqIHRvIG5hdGl2ZSBlbGVtZW50cyBpcyBub3Qgc3VwcG9ydGVkIChlLmcuIHdoZW4gdGhlIGFwcGxpY2F0aW9uIHJ1bnMgaW4gYSB3ZWIgd29ya2VyKS5cbiAgICpcbiAgICogPGRpdiBjbGFzcz1cImNhbGxvdXQgaXMtY3JpdGljYWxcIj5cbiAgICogICA8aGVhZGVyPlVzZSB3aXRoIGNhdXRpb248L2hlYWRlcj5cbiAgICogICA8cD5cbiAgICogICAgVXNlIHRoaXMgYXBpIGFzIHRoZSBsYXN0IHJlc29ydCB3aGVuIGRpcmVjdCBhY2Nlc3MgdG8gRE9NIGlzIG5lZWRlZC4gVXNlIHRlbXBsYXRpbmcgYW5kXG4gICAqICAgIGRhdGEtYmluZGluZywgb3Igb3RoZXIge0BsaW5rIFJlbmRlcmVyfSBtZXRob2RzIGluc3RlYWQuXG4gICAqICAgPC9wPlxuICAgKiAgIDxwPlxuICAgKiAgICBSZWx5aW5nIG9uIGRpcmVjdCBET00gYWNjZXNzIGNyZWF0ZXMgdGlnaHQgY291cGxpbmcgYmV0d2VlbiB5b3VyIGFwcGxpY2F0aW9uIGFuZCByZW5kZXJpbmdcbiAgICogICAgbGF5ZXJzIHdoaWNoIHdpbGwgbWFrZSBpdCBpbXBvc3NpYmxlIHRvIHNlcGFyYXRlIHRoZSB0d28gYW5kIGRlcGxveSB5b3VyIGFwcGxpY2F0aW9uIGludG8gYVxuICAgKiAgICB3ZWIgd29ya2VyLlxuICAgKiAgIDwvcD5cbiAgICogPC9kaXY+XG4gICAqL1xuICBhYnN0cmFjdCBnZXROYXRpdmVFbGVtZW50U3luYyhsb2NhdGlvbjogUmVuZGVyRWxlbWVudFJlZik6IGFueTtcblxuICAvKipcbiAgICogU2V0cyBhIHByb3BlcnR5IG9uIHRoZSBFbGVtZW50IHNwZWNpZmllZCB2aWEgYGxvY2F0aW9uYC5cbiAgICovXG4gIGFic3RyYWN0IHNldEVsZW1lbnRQcm9wZXJ0eShsb2NhdGlvbjogUmVuZGVyRWxlbWVudFJlZiwgcHJvcGVydHlOYW1lOiBzdHJpbmcsIHByb3BlcnR5VmFsdWU6IGFueSk7XG5cbiAgLyoqXG4gICAqIFNldHMgYW4gYXR0cmlidXRlIG9uIHRoZSBFbGVtZW50IHNwZWNpZmllZCB2aWEgYGxvY2F0aW9uYC5cbiAgICpcbiAgICogSWYgYGF0dHJpYnV0ZVZhbHVlYCBpcyBgbnVsbGAsIHRoZSBhdHRyaWJ1dGUgaXMgcmVtb3ZlZC5cbiAgICovXG4gIGFic3RyYWN0IHNldEVsZW1lbnRBdHRyaWJ1dGUobG9jYXRpb246IFJlbmRlckVsZW1lbnRSZWYsIGF0dHJpYnV0ZU5hbWU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZTogc3RyaW5nKTtcblxuICBhYnN0cmFjdCBzZXRCaW5kaW5nRGVidWdJbmZvKGxvY2F0aW9uOiBSZW5kZXJFbGVtZW50UmVmLCBwcm9wZXJ0eU5hbWU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlOiBzdHJpbmcpO1xuXG4gIC8qKlxuICAgKiBTZXRzIGEgKENTUykgY2xhc3Mgb24gdGhlIEVsZW1lbnQgc3BlY2lmaWVkIHZpYSBgbG9jYXRpb25gLlxuICAgKlxuICAgKiBgaXNBZGRgIHNwZWNpZmllcyBpZiB0aGUgY2xhc3Mgc2hvdWxkIGJlIGFkZGVkIG9yIHJlbW92ZWQuXG4gICAqL1xuICBhYnN0cmFjdCBzZXRFbGVtZW50Q2xhc3MobG9jYXRpb246IFJlbmRlckVsZW1lbnRSZWYsIGNsYXNzTmFtZTogc3RyaW5nLCBpc0FkZDogYm9vbGVhbik7XG5cbiAgLyoqXG4gICAqIFNldHMgYSAoQ1NTKSBpbmxpbmUgc3R5bGUgb24gdGhlIEVsZW1lbnQgc3BlY2lmaWVkIHZpYSBgbG9jYXRpb25gLlxuICAgKlxuICAgKiBJZiBgc3R5bGVWYWx1ZWAgaXMgYG51bGxgLCB0aGUgc3R5bGUgaXMgcmVtb3ZlZC5cbiAgICovXG4gIGFic3RyYWN0IHNldEVsZW1lbnRTdHlsZShsb2NhdGlvbjogUmVuZGVyRWxlbWVudFJlZiwgc3R5bGVOYW1lOiBzdHJpbmcsIHN0eWxlVmFsdWU6IHN0cmluZyk7XG5cbiAgLyoqXG4gICAqIENhbGxzIGEgbWV0aG9kIG9uIHRoZSBFbGVtZW50IHNwZWNpZmllZCB2aWEgYGxvY2F0aW9uYC5cbiAgICovXG4gIGFic3RyYWN0IGludm9rZUVsZW1lbnRNZXRob2QobG9jYXRpb246IFJlbmRlckVsZW1lbnRSZWYsIG1ldGhvZE5hbWU6IHN0cmluZywgYXJnczogYW55W10pO1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhbiBpbnRlcnBvbGF0ZWQgVGV4dE5vZGUgYXQgdGhlIHNwZWNpZmllZCBpbmRleCB0byB0aGUgYHRleHRgIHZhbHVlLlxuICAgKlxuICAgKiBgdGV4dE5vZGVJbmRleGAgaXMgdGhlIGRlcHRoLWZpcnN0IGluZGV4IG9mIHRoZSBOb2RlIGFtb25nIGludGVycG9sYXRlZCBOb2RlcyBpbiB0aGUgUmVuZGVyXG4gICAqIFZpZXcuXG4gICAqL1xuICBhYnN0cmFjdCBzZXRUZXh0KHZpZXdSZWY6IFJlbmRlclZpZXdSZWYsIHRleHROb2RlSW5kZXg6IG51bWJlciwgdGV4dDogc3RyaW5nKTtcblxuICAvKipcbiAgICogU2V0cyBhIGRpc3BhdGNoZXIgdG8gcmVsYXkgYWxsIGV2ZW50cyB0cmlnZ2VyZWQgaW4gdGhlIGdpdmVuIFJlbmRlciBWaWV3LlxuICAgKlxuICAgKiBFYWNoIFJlbmRlciBWaWV3IGNhbiBoYXZlIG9ubHkgb25lIEV2ZW50IERpc3BhdGNoZXIsIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyxcbiAgICogdGhlIGxhc3QgcHJvdmlkZWQgZGlzcGF0Y2hlciB3aWxsIGJlIHVzZWQuXG4gICAqL1xuICBhYnN0cmFjdCBzZXRFdmVudERpc3BhdGNoZXIodmlld1JlZjogUmVuZGVyVmlld1JlZiwgZGlzcGF0Y2hlcjogUmVuZGVyRXZlbnREaXNwYXRjaGVyKTtcbn1cblxuLyoqXG4gKiBBIGRpc3BhdGNoZXIgdGhhdCByZWxheXMgYWxsIGV2ZW50cyB0aGF0IG9jY3VyIGluIGEgUmVuZGVyIFZpZXcuXG4gKlxuICogVXNlIHtAbGluayBSZW5kZXJlciNzZXRFdmVudERpc3BhdGNoZXJ9IHRvIHJlZ2lzdGVyIGEgZGlzcGF0Y2hlciBmb3IgYSBwYXJ0aWN1bGFyIFJlbmRlciBWaWV3LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlckV2ZW50RGlzcGF0Y2hlciB7XG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBFdmVudCBjYWxsZWQgYGV2ZW50TmFtZWAgd2FzIHRyaWdnZXJlZCBvbiBhbiBFbGVtZW50IHdpdGggYW4gRXZlbnQgQmluZGluZyBmb3IgdGhpc1xuICAgKiBFdmVudC5cbiAgICpcbiAgICogYGVsZW1lbnRJbmRleGAgc3BlY2lmaWVzIHRoZSBkZXB0aC1maXJzdCBpbmRleCBvZiB0aGUgRWxlbWVudCBpbiB0aGUgUmVuZGVyIFZpZXcuXG4gICAqXG4gICAqIGBsb2NhbHNgIGlzIGEgbWFwIGZvciBsb2NhbCB2YXJpYWJsZSB0byB2YWx1ZSBtYXBwaW5nIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiBldmFsdWF0aW5nIHRoZVxuICAgKiBFdmVudCBCaW5kaW5nIGV4cHJlc3Npb24uXG4gICAqXG4gICAqIFJldHVybnMgYGZhbHNlYCBpZiBgcHJldmVudERlZmF1bHRgIHNob3VsZCBiZSBjYWxsZWQgdG8gc3RvcCB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGUgRXZlbnRcbiAgICogaW4gdGhlIFJlbmRlcmluZyBDb250ZXh0LlxuICAgKi9cbiAgZGlzcGF0Y2hSZW5kZXJFdmVudChlbGVtZW50SW5kZXg6IG51bWJlciwgZXZlbnROYW1lOiBzdHJpbmcsIGxvY2FsczogTWFwPHN0cmluZywgYW55Pik6IGJvb2xlYW47XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9yZW5kZXIvYXBpLnRzXG4gKiovIiwiaW1wb3J0IHtUeXBlfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtSZXNvbHZlZEZhY3RvcnksIHJlc29sdmVQcm92aWRlciwgUmVzb2x2ZWRQcm92aWRlcl99IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpL3Byb3ZpZGVyJztcbmltcG9ydCB7S2V5LCBSZXNvbHZlZFByb3ZpZGVyLCBQcm92aWRlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvZGknO1xuaW1wb3J0IHtQaXBlTWV0YWRhdGF9IGZyb20gJy4uL21ldGFkYXRhL2RpcmVjdGl2ZXMnO1xuXG5leHBvcnQgY2xhc3MgUGlwZVByb3ZpZGVyIGV4dGVuZHMgUmVzb2x2ZWRQcm92aWRlcl8ge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nLCBwdWJsaWMgcHVyZTogYm9vbGVhbiwga2V5OiBLZXksXG4gICAgICAgICAgICAgIHJlc29sdmVkRmFjdG9yaWVzOiBSZXNvbHZlZEZhY3RvcnlbXSwgbXVsdGlCaW5kaW5nOiBib29sZWFuKSB7XG4gICAgc3VwZXIoa2V5LCByZXNvbHZlZEZhY3RvcmllcywgbXVsdGlCaW5kaW5nKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVGcm9tVHlwZSh0eXBlOiBUeXBlLCBtZXRhZGF0YTogUGlwZU1ldGFkYXRhKTogUGlwZVByb3ZpZGVyIHtcbiAgICB2YXIgcHJvdmlkZXIgPSBuZXcgUHJvdmlkZXIodHlwZSwge3VzZUNsYXNzOiB0eXBlfSk7XG4gICAgdmFyIHJiID0gcmVzb2x2ZVByb3ZpZGVyKHByb3ZpZGVyKTtcbiAgICByZXR1cm4gbmV3IFBpcGVQcm92aWRlcihtZXRhZGF0YS5uYW1lLCBtZXRhZGF0YS5wdXJlLCByYi5rZXksIHJiLnJlc29sdmVkRmFjdG9yaWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJiLm11bHRpUHJvdmlkZXIpO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9waXBlcy9waXBlX3Byb3ZpZGVyLnRzXG4gKiovIiwiaW1wb3J0IHtpc0JsYW5rLCBpc1ByZXNlbnQsIENPTlNULCBUeXBlfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9uLCBXcmFwcGVkRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtTdHJpbmdNYXBXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtcbiAgSW5qZWN0YWJsZSxcbiAgT3B0aW9uYWxNZXRhZGF0YSxcbiAgU2tpcFNlbGZNZXRhZGF0YSxcbiAgUHJvdmlkZXIsXG4gIEluamVjdG9yLFxuICBiaW5kXG59IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpJztcbmltcG9ydCB7UGlwZVByb3ZpZGVyfSBmcm9tICcuL3BpcGVfcHJvdmlkZXInO1xuaW1wb3J0ICogYXMgY2QgZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9waXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBQcm90b1BpcGVzIHtcbiAgc3RhdGljIGZyb21Qcm92aWRlcnMocHJvdmlkZXJzOiBQaXBlUHJvdmlkZXJbXSk6IFByb3RvUGlwZXMge1xuICAgIHZhciBjb25maWc6IHtba2V5OiBzdHJpbmddOiBQaXBlUHJvdmlkZXJ9ID0ge307XG4gICAgcHJvdmlkZXJzLmZvckVhY2goYiA9PiBjb25maWdbYi5uYW1lXSA9IGIpO1xuICAgIHJldHVybiBuZXcgUHJvdG9QaXBlcyhjb25maWcpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICAvKipcbiAgICAgICogTWFwIG9mIHtAbGluayBQaXBlTWV0YWRhdGF9IG5hbWVzIHRvIHtAbGluayBQaXBlTWV0YWRhdGF9IGltcGxlbWVudGF0aW9ucy5cbiAgICAgICovXG4gICAgICBwdWJsaWMgY29uZmlnOiB7W2tleTogc3RyaW5nXTogUGlwZVByb3ZpZGVyfSkge1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICB9XG5cbiAgZ2V0KG5hbWU6IHN0cmluZyk6IFBpcGVQcm92aWRlciB7XG4gICAgdmFyIHByb3ZpZGVyID0gdGhpcy5jb25maWdbbmFtZV07XG4gICAgaWYgKGlzQmxhbmsocHJvdmlkZXIpKSB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgQ2Fubm90IGZpbmQgcGlwZSAnJHtuYW1lfScuYCk7XG4gICAgcmV0dXJuIHByb3ZpZGVyO1xuICB9XG59XG5cblxuXG5leHBvcnQgY2xhc3MgUGlwZXMgaW1wbGVtZW50cyBjZC5QaXBlcyB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2NvbmZpZzoge1trZXk6IHN0cmluZ106IGNkLlNlbGVjdGVkUGlwZX0gPSB7fTtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcHJvdG86IFByb3RvUGlwZXMsIHB1YmxpYyBpbmplY3RvcjogSW5qZWN0b3IpIHt9XG5cbiAgZ2V0KG5hbWU6IHN0cmluZyk6IGNkLlNlbGVjdGVkUGlwZSB7XG4gICAgdmFyIGNhY2hlZCA9IFN0cmluZ01hcFdyYXBwZXIuZ2V0KHRoaXMuX2NvbmZpZywgbmFtZSk7XG4gICAgaWYgKGlzUHJlc2VudChjYWNoZWQpKSByZXR1cm4gY2FjaGVkO1xuXG4gICAgdmFyIHAgPSB0aGlzLnByb3RvLmdldChuYW1lKTtcbiAgICB2YXIgdHJhbnNmb3JtID0gdGhpcy5pbmplY3Rvci5pbnN0YW50aWF0ZVJlc29sdmVkKHApO1xuICAgIHZhciByZXMgPSBuZXcgY2QuU2VsZWN0ZWRQaXBlKHRyYW5zZm9ybSwgcC5wdXJlKTtcblxuICAgIGlmIChwLnB1cmUpIHtcbiAgICAgIFN0cmluZ01hcFdyYXBwZXIuc2V0KHRoaXMuX2NvbmZpZywgbmFtZSwgcmVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9waXBlcy9waXBlcy50c1xuICoqLyIsImltcG9ydCB7UGlwZVRyYW5zZm9ybX0gZnJvbSAnLi9waXBlX3RyYW5zZm9ybSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZXMgeyBnZXQobmFtZTogc3RyaW5nKTogU2VsZWN0ZWRQaXBlOyB9XG5cbmV4cG9ydCBjbGFzcyBTZWxlY3RlZFBpcGUge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcGlwZTogUGlwZVRyYW5zZm9ybSwgcHVibGljIHB1cmU6IGJvb2xlYW4pIHt9XG59XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9waXBlcy50c1xuICoqLyIsImltcG9ydCB7XG4gIExpc3RXcmFwcGVyLFxuICBNYXBXcmFwcGVyLFxuICBNYXAsXG4gIFN0cmluZ01hcFdyYXBwZXIsXG59IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvcixcbiAgQ2hhbmdlRGlzcGF0Y2hlcixcbiAgRGlyZWN0aXZlSW5kZXgsXG4gIEJpbmRpbmdUYXJnZXQsXG4gIExvY2FscyxcbiAgUHJvdG9DaGFuZ2VEZXRlY3RvclxufSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2NoYW5nZV9kZXRlY3Rpb24nO1xuaW1wb3J0IHtEZWJ1Z0NvbnRleHR9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vaW50ZXJmYWNlcyc7XG5cbmltcG9ydCB7XG4gIFByb3RvRWxlbWVudEluamVjdG9yLFxuICBFbGVtZW50SW5qZWN0b3IsXG4gIFByZUJ1aWx0T2JqZWN0cyxcbiAgRGlyZWN0aXZlUHJvdmlkZXJcbn0gZnJvbSAnLi9lbGVtZW50X2luamVjdG9yJztcbmltcG9ydCB7RWxlbWVudEJpbmRlcn0gZnJvbSAnLi9lbGVtZW50X2JpbmRlcic7XG5pbXBvcnQge2lzUHJlc2VudH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbiwgV3JhcHBlZEV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCAqIGFzIHJlbmRlckFwaSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9yZW5kZXIvYXBpJztcbmltcG9ydCB7UmVuZGVyRXZlbnREaXNwYXRjaGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9yZW5kZXIvYXBpJztcbmltcG9ydCB7Vmlld1JlZiwgUHJvdG9WaWV3UmVmLCBpbnRlcm5hbFZpZXd9IGZyb20gJy4vdmlld19yZWYnO1xuaW1wb3J0IHtFbGVtZW50UmVmfSBmcm9tICcuL2VsZW1lbnRfcmVmJztcbmltcG9ydCB7UHJvdG9QaXBlc30gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvcGlwZXMvcGlwZXMnO1xuaW1wb3J0IHtjYW1lbENhc2VUb0Rhc2hDYXNlfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9yZW5kZXIvdXRpbCc7XG5pbXBvcnQge1RlbXBsYXRlQ21kfSBmcm9tICcuL3RlbXBsYXRlX2NvbW1hbmRzJztcbmltcG9ydCB7Vmlld1JlZl8sIFByb3RvVmlld1JlZl99IGZyb20gXCIuL3ZpZXdfcmVmXCI7XG5cbmV4cG9ydCB7RGVidWdDb250ZXh0fSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2ludGVyZmFjZXMnO1xuXG5jb25zdCBSRUZMRUNUX1BSRUZJWDogc3RyaW5nID0gJ25nLXJlZmxlY3QtJztcblxuZXhwb3J0IGVudW0gVmlld1R5cGUge1xuICAvLyBBIHZpZXcgdGhhdCBjb250YWlucyB0aGUgaG9zdCBlbGVtZW50IHdpdGggYm91bmQgY29tcG9uZW50IGRpcmVjdGl2ZS5cbiAgLy8gQ29udGFpbnMgYSBDT01QT05FTlQgdmlld1xuICBIT1NULFxuICAvLyBUaGUgdmlldyBvZiB0aGUgY29tcG9uZW50XG4gIC8vIENhbiBjb250YWluIDAgdG8gbiBFTUJFRERFRCB2aWV3c1xuICBDT01QT05FTlQsXG4gIC8vIEEgdmlldyB0aGF0IGlzIGVtYmVkZGVkIGludG8gYW5vdGhlciBWaWV3IHZpYSBhIDx0ZW1wbGF0ZT4gZWxlbWVudFxuICAvLyBpbnNpZGUgb2YgYSBDT01QT05FTlQgdmlld1xuICBFTUJFRERFRFxufVxuXG5leHBvcnQgY2xhc3MgQXBwVmlld0NvbnRhaW5lciB7XG4gIC8vIFRoZSBvcmRlciBpbiB0aGlzIGxpc3QgbWF0Y2hlcyB0aGUgRE9NIG9yZGVyLlxuICB2aWV3czogQXBwVmlld1tdID0gW107XG59XG5cbi8qKlxuICogQ29zdCBvZiBtYWtpbmcgb2JqZWN0czogaHR0cDovL2pzcGVyZi5jb20vaW5zdGFudGlhdGUtc2l6ZS1vZi1vYmplY3RcbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBBcHBWaWV3IGltcGxlbWVudHMgQ2hhbmdlRGlzcGF0Y2hlciwgUmVuZGVyRXZlbnREaXNwYXRjaGVyIHtcbiAgLy8gQXBwVmlld3MgdGhhdCBoYXZlIGJlZW4gbWVyZ2VkIGluIGRlcHRoIGZpcnN0IG9yZGVyLlxuICAvLyBUaGlzIGxpc3QgaXMgc2hhcmVkIGJldHdlZW4gYWxsIG1lcmdlZCB2aWV3cy4gVXNlIHRoaXMuZWxlbWVudE9mZnNldCB0byBnZXQgdGhlIGxvY2FsXG4gIC8vIGVudHJpZXMuXG4gIHZpZXdzOiBBcHBWaWV3W10gPSBudWxsO1xuICAvLyByb290IGVsZW1lbnRJbmplY3RvcnMgb2YgdGhpcyBBcHBWaWV3XG4gIC8vIFRoaXMgbGlzdCBpcyBsb2NhbCB0byB0aGlzIEFwcFZpZXcgYW5kIG5vdCBzaGFyZWQgd2l0aCBvdGhlciBWaWV3cy5cbiAgcm9vdEVsZW1lbnRJbmplY3RvcnM6IEVsZW1lbnRJbmplY3RvcltdO1xuICAvLyBFbGVtZW50SW5qZWN0b3JzIG9mIGFsbCBBcHBWaWV3cyBpbiB2aWV3cyBncm91cGVkIGJ5IHZpZXcuXG4gIC8vIFRoaXMgbGlzdCBpcyBzaGFyZWQgYmV0d2VlbiBhbGwgbWVyZ2VkIHZpZXdzLiBVc2UgdGhpcy5lbGVtZW50T2Zmc2V0IHRvIGdldCB0aGUgbG9jYWxcbiAgLy8gZW50cmllcy5cbiAgZWxlbWVudEluamVjdG9yczogRWxlbWVudEluamVjdG9yW10gPSBudWxsO1xuICAvLyBWaWV3Q29udGFpbmVycyBvZiBhbGwgQXBwVmlld3MgaW4gdmlld3MgZ3JvdXBlZCBieSB2aWV3LlxuICAvLyBUaGlzIGxpc3QgaXMgc2hhcmVkIGJldHdlZW4gYWxsIG1lcmdlZCB2aWV3cy4gVXNlIHRoaXMuZWxlbWVudE9mZnNldCB0byBnZXQgdGhlIGxvY2FsXG4gIC8vIGVudHJpZXMuXG4gIHZpZXdDb250YWluZXJzOiBBcHBWaWV3Q29udGFpbmVyW10gPSBudWxsO1xuICAvLyBQcmVCdWlsdE9iamVjdHMgb2YgYWxsIEFwcFZpZXdzIGluIHZpZXdzIGdyb3VwZWQgYnkgdmlldy5cbiAgLy8gVGhpcyBsaXN0IGlzIHNoYXJlZCBiZXR3ZWVuIGFsbCBtZXJnZWQgdmlld3MuIFVzZSB0aGlzLmVsZW1lbnRPZmZzZXQgdG8gZ2V0IHRoZSBsb2NhbFxuICAvLyBlbnRyaWVzLlxuICBwcmVCdWlsdE9iamVjdHM6IFByZUJ1aWx0T2JqZWN0c1tdID0gbnVsbDtcbiAgLy8gRWxlbWVudFJlZiBvZiBhbGwgQXBwVmlld3MgaW4gdmlld3MgZ3JvdXBlZCBieSB2aWV3LlxuICAvLyBUaGlzIGxpc3QgaXMgc2hhcmVkIGJldHdlZW4gYWxsIG1lcmdlZCB2aWV3cy4gVXNlIHRoaXMuZWxlbWVudE9mZnNldCB0byBnZXQgdGhlIGxvY2FsXG4gIC8vIGVudHJpZXMuXG4gIGVsZW1lbnRSZWZzOiBFbGVtZW50UmVmW107XG5cbiAgcmVmOiBWaWV3UmVmO1xuICBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3IgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGV4dCBhZ2FpbnN0IHdoaWNoIGRhdGEtYmluZGluZyBleHByZXNzaW9ucyBpbiB0aGlzIHZpZXcgYXJlIGV2YWx1YXRlZCBhZ2FpbnN0LlxuICAgKiBUaGlzIGlzIGFsd2F5cyBhIGNvbXBvbmVudCBpbnN0YW5jZS5cbiAgICovXG5cbiAgY29udGV4dDogYW55ID0gbnVsbDtcblxuICAvKipcbiAgICogVmFyaWFibGVzLCBsb2NhbCB0byB0aGlzIHZpZXcsIHRoYXQgY2FuIGJlIHVzZWQgaW4gYmluZGluZyBleHByZXNzaW9ucyAoaW4gYWRkaXRpb24gdG8gdGhlXG4gICAqIGNvbnRleHQpLiBUaGlzIGlzIHVzZWQgZm9yIHRoaW5nIGxpa2UgYDx2aWRlbyAjcGxheWVyPmAgb3JcbiAgICogYDxsaSB0ZW1wbGF0ZT1cImZvciAjaXRlbSBvZiBpdGVtc1wiPmAsIHdoZXJlIFwicGxheWVyXCIgYW5kIFwiaXRlbVwiIGFyZSBsb2NhbHMsIHJlc3BlY3RpdmVseS5cbiAgICovXG4gIGxvY2FsczogTG9jYWxzO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZW5kZXJlcjogcmVuZGVyQXBpLlJlbmRlcmVyLCBwdWJsaWMgcHJvdG86IEFwcFByb3RvVmlldyxcbiAgICAgICAgICAgICAgcHVibGljIHZpZXdPZmZzZXQ6IG51bWJlciwgcHVibGljIGVsZW1lbnRPZmZzZXQ6IG51bWJlciwgcHVibGljIHRleHRPZmZzZXQ6IG51bWJlcixcbiAgICAgICAgICAgICAgcHJvdG9Mb2NhbHM6IE1hcDxzdHJpbmcsIGFueT4sIHB1YmxpYyByZW5kZXI6IHJlbmRlckFwaS5SZW5kZXJWaWV3UmVmLFxuICAgICAgICAgICAgICBwdWJsaWMgcmVuZGVyRnJhZ21lbnQ6IHJlbmRlckFwaS5SZW5kZXJGcmFnbWVudFJlZixcbiAgICAgICAgICAgICAgcHVibGljIGNvbnRhaW5lckVsZW1lbnRJbmplY3RvcjogRWxlbWVudEluamVjdG9yKSB7XG4gICAgdGhpcy5yZWYgPSBuZXcgVmlld1JlZl8odGhpcyk7XG5cbiAgICB0aGlzLmxvY2FscyA9IG5ldyBMb2NhbHMobnVsbCwgTWFwV3JhcHBlci5jbG9uZShwcm90b0xvY2FscykpOyAgLy8gVE9ETyBvcHRpbWl6ZSB0aGlzXG4gIH1cblxuICBpbml0KGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvciwgZWxlbWVudEluamVjdG9yczogRWxlbWVudEluamVjdG9yW10sXG4gICAgICAgcm9vdEVsZW1lbnRJbmplY3RvcnM6IEVsZW1lbnRJbmplY3RvcltdLCBwcmVCdWlsdE9iamVjdHM6IFByZUJ1aWx0T2JqZWN0c1tdLFxuICAgICAgIHZpZXdzOiBBcHBWaWV3W10sIGVsZW1lbnRSZWZzOiBFbGVtZW50UmVmW10sIHZpZXdDb250YWluZXJzOiBBcHBWaWV3Q29udGFpbmVyW10pIHtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yID0gY2hhbmdlRGV0ZWN0b3I7XG4gICAgdGhpcy5lbGVtZW50SW5qZWN0b3JzID0gZWxlbWVudEluamVjdG9ycztcbiAgICB0aGlzLnJvb3RFbGVtZW50SW5qZWN0b3JzID0gcm9vdEVsZW1lbnRJbmplY3RvcnM7XG4gICAgdGhpcy5wcmVCdWlsdE9iamVjdHMgPSBwcmVCdWlsdE9iamVjdHM7XG4gICAgdGhpcy52aWV3cyA9IHZpZXdzO1xuICAgIHRoaXMuZWxlbWVudFJlZnMgPSBlbGVtZW50UmVmcztcbiAgICB0aGlzLnZpZXdDb250YWluZXJzID0gdmlld0NvbnRhaW5lcnM7XG4gIH1cblxuICBzZXRMb2NhbChjb250ZXh0TmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmh5ZHJhdGVkKCkpIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdDYW5ub3Qgc2V0IGxvY2FscyBvbiBkZWh5ZHJhdGVkIHZpZXcuJyk7XG4gICAgaWYgKCF0aGlzLnByb3RvLnRlbXBsYXRlVmFyaWFibGVCaW5kaW5ncy5oYXMoY29udGV4dE5hbWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0ZW1wbGF0ZU5hbWUgPSB0aGlzLnByb3RvLnRlbXBsYXRlVmFyaWFibGVCaW5kaW5ncy5nZXQoY29udGV4dE5hbWUpO1xuICAgIHRoaXMubG9jYWxzLnNldCh0ZW1wbGF0ZU5hbWUsIHZhbHVlKTtcbiAgfVxuXG4gIGh5ZHJhdGVkKCk6IGJvb2xlYW4geyByZXR1cm4gaXNQcmVzZW50KHRoaXMuY29udGV4dCk7IH1cblxuICAvKipcbiAgICogVHJpZ2dlcnMgdGhlIGV2ZW50IGhhbmRsZXJzIGZvciB0aGUgZWxlbWVudCBhbmQgdGhlIGRpcmVjdGl2ZXMuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIHRvIGJlIGNhbGxlZCBmcm9tIGRpcmVjdGl2ZSBFdmVudEVtaXR0ZXJzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7Kn0gZXZlbnRPYmpcbiAgICogQHBhcmFtIHtudW1iZXJ9IGJvdW5kRWxlbWVudEluZGV4XG4gICAqL1xuICB0cmlnZ2VyRXZlbnRIYW5kbGVycyhldmVudE5hbWU6IHN0cmluZywgZXZlbnRPYmo6IEV2ZW50LCBib3VuZEVsZW1lbnRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdmFyIGxvY2FscyA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gICAgbG9jYWxzLnNldCgnJGV2ZW50JywgZXZlbnRPYmopO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChib3VuZEVsZW1lbnRJbmRleCwgZXZlbnROYW1lLCBsb2NhbHMpO1xuICB9XG5cbiAgLy8gZGlzcGF0Y2ggdG8gZWxlbWVudCBpbmplY3RvciBvciB0ZXh0IG5vZGVzIGJhc2VkIG9uIGNvbnRleHRcbiAgbm90aWZ5T25CaW5kaW5nKGI6IEJpbmRpbmdUYXJnZXQsIGN1cnJlbnRWYWx1ZTogYW55KTogdm9pZCB7XG4gICAgaWYgKGIuaXNUZXh0Tm9kZSgpKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFRleHQodGhpcy5yZW5kZXIsIGIuZWxlbWVudEluZGV4ICsgdGhpcy50ZXh0T2Zmc2V0LCBjdXJyZW50VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZWxlbWVudFJlZiA9IHRoaXMuZWxlbWVudFJlZnNbdGhpcy5lbGVtZW50T2Zmc2V0ICsgYi5lbGVtZW50SW5kZXhdO1xuICAgICAgaWYgKGIuaXNFbGVtZW50UHJvcGVydHkoKSkge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEVsZW1lbnRQcm9wZXJ0eShlbGVtZW50UmVmLCBiLm5hbWUsIGN1cnJlbnRWYWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGIuaXNFbGVtZW50QXR0cmlidXRlKCkpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRFbGVtZW50QXR0cmlidXRlKGVsZW1lbnRSZWYsIGIubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJlc2VudChjdXJyZW50VmFsdWUpID8gYCR7Y3VycmVudFZhbHVlfWAgOiBudWxsKTtcbiAgICAgIH0gZWxzZSBpZiAoYi5pc0VsZW1lbnRDbGFzcygpKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0RWxlbWVudENsYXNzKGVsZW1lbnRSZWYsIGIubmFtZSwgY3VycmVudFZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoYi5pc0VsZW1lbnRTdHlsZSgpKSB7XG4gICAgICAgIHZhciB1bml0ID0gaXNQcmVzZW50KGIudW5pdCkgPyBiLnVuaXQgOiAnJztcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRFbGVtZW50U3R5bGUoZWxlbWVudFJlZiwgYi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ByZXNlbnQoY3VycmVudFZhbHVlKSA/IGAke2N1cnJlbnRWYWx1ZX0ke3VuaXR9YCA6IG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ1Vuc3VwcG9ydGVkIGRpcmVjdGl2ZSByZWNvcmQnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsb2dCaW5kaW5nVXBkYXRlKGI6IEJpbmRpbmdUYXJnZXQsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoYi5pc0RpcmVjdGl2ZSgpIHx8IGIuaXNFbGVtZW50UHJvcGVydHkoKSkge1xuICAgICAgdmFyIGVsZW1lbnRSZWYgPSB0aGlzLmVsZW1lbnRSZWZzW3RoaXMuZWxlbWVudE9mZnNldCArIGIuZWxlbWVudEluZGV4XTtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0QmluZGluZ0RlYnVnSW5mbyhcbiAgICAgICAgICBlbGVtZW50UmVmLCBgJHtSRUZMRUNUX1BSRUZJWH0ke2NhbWVsQ2FzZVRvRGFzaENhc2UoYi5uYW1lKX1gLCBgJHt2YWx1ZX1gKTtcbiAgICB9XG4gIH1cblxuICBub3RpZnlBZnRlckNvbnRlbnRDaGVja2VkKCk6IHZvaWQge1xuICAgIHZhciBlaUNvdW50ID0gdGhpcy5wcm90by5lbGVtZW50QmluZGVycy5sZW5ndGg7XG4gICAgdmFyIGVpID0gdGhpcy5lbGVtZW50SW5qZWN0b3JzO1xuICAgIGZvciAodmFyIGkgPSBlaUNvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGlmIChpc1ByZXNlbnQoZWlbaSArIHRoaXMuZWxlbWVudE9mZnNldF0pKSBlaVtpICsgdGhpcy5lbGVtZW50T2Zmc2V0XS5uZ0FmdGVyQ29udGVudENoZWNrZWQoKTtcbiAgICB9XG4gIH1cblxuICBub3RpZnlBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xuICAgIHZhciBlaUNvdW50ID0gdGhpcy5wcm90by5lbGVtZW50QmluZGVycy5sZW5ndGg7XG4gICAgdmFyIGVpID0gdGhpcy5lbGVtZW50SW5qZWN0b3JzO1xuICAgIGZvciAodmFyIGkgPSBlaUNvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGlmIChpc1ByZXNlbnQoZWlbaSArIHRoaXMuZWxlbWVudE9mZnNldF0pKSBlaVtpICsgdGhpcy5lbGVtZW50T2Zmc2V0XS5uZ0FmdGVyVmlld0NoZWNrZWQoKTtcbiAgICB9XG4gIH1cblxuICBnZXREaXJlY3RpdmVGb3IoZGlyZWN0aXZlOiBEaXJlY3RpdmVJbmRleCk6IGFueSB7XG4gICAgdmFyIGVsZW1lbnRJbmplY3RvciA9IHRoaXMuZWxlbWVudEluamVjdG9yc1t0aGlzLmVsZW1lbnRPZmZzZXQgKyBkaXJlY3RpdmUuZWxlbWVudEluZGV4XTtcbiAgICByZXR1cm4gZWxlbWVudEluamVjdG9yLmdldERpcmVjdGl2ZUF0SW5kZXgoZGlyZWN0aXZlLmRpcmVjdGl2ZUluZGV4KTtcbiAgfVxuXG4gIGdldE5lc3RlZFZpZXcoYm91bmRFbGVtZW50SW5kZXg6IG51bWJlcik6IEFwcFZpZXcge1xuICAgIHZhciBlbGkgPSB0aGlzLmVsZW1lbnRJbmplY3RvcnNbYm91bmRFbGVtZW50SW5kZXhdO1xuICAgIHJldHVybiBpc1ByZXNlbnQoZWxpKSA/IGVsaS5nZXROZXN0ZWRWaWV3KCkgOiBudWxsO1xuICB9XG5cbiAgZ2V0Q29udGFpbmVyRWxlbWVudCgpOiBFbGVtZW50UmVmIHtcbiAgICByZXR1cm4gaXNQcmVzZW50KHRoaXMuY29udGFpbmVyRWxlbWVudEluamVjdG9yKSA/XG4gICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lckVsZW1lbnRJbmplY3Rvci5nZXRFbGVtZW50UmVmKCkgOlxuICAgICAgICAgICAgICAgbnVsbDtcbiAgfVxuXG4gIGdldERlYnVnQ29udGV4dChlbGVtZW50SW5kZXg6IG51bWJlciwgZGlyZWN0aXZlSW5kZXg6IERpcmVjdGl2ZUluZGV4KTogRGVidWdDb250ZXh0IHtcbiAgICB0cnkge1xuICAgICAgdmFyIG9mZnNldHRlZEluZGV4ID0gdGhpcy5lbGVtZW50T2Zmc2V0ICsgZWxlbWVudEluZGV4O1xuICAgICAgdmFyIGhhc1JlZkZvckluZGV4ID0gb2Zmc2V0dGVkSW5kZXggPCB0aGlzLmVsZW1lbnRSZWZzLmxlbmd0aDtcblxuICAgICAgdmFyIGVsZW1lbnRSZWYgPSBoYXNSZWZGb3JJbmRleCA/IHRoaXMuZWxlbWVudFJlZnNbdGhpcy5lbGVtZW50T2Zmc2V0ICsgZWxlbWVudEluZGV4XSA6IG51bGw7XG4gICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5nZXRDb250YWluZXJFbGVtZW50KCk7XG4gICAgICB2YXIgZWkgPSBoYXNSZWZGb3JJbmRleCA/IHRoaXMuZWxlbWVudEluamVjdG9yc1t0aGlzLmVsZW1lbnRPZmZzZXQgKyBlbGVtZW50SW5kZXhdIDogbnVsbDtcblxuICAgICAgdmFyIGVsZW1lbnQgPSBpc1ByZXNlbnQoZWxlbWVudFJlZikgPyBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgOiBudWxsO1xuICAgICAgdmFyIGNvbXBvbmVudEVsZW1lbnQgPSBpc1ByZXNlbnQoY29udGFpbmVyKSA/IGNvbnRhaW5lci5uYXRpdmVFbGVtZW50IDogbnVsbDtcbiAgICAgIHZhciBkaXJlY3RpdmUgPSBpc1ByZXNlbnQoZGlyZWN0aXZlSW5kZXgpID8gdGhpcy5nZXREaXJlY3RpdmVGb3IoZGlyZWN0aXZlSW5kZXgpIDogbnVsbDtcbiAgICAgIHZhciBpbmplY3RvciA9IGlzUHJlc2VudChlaSkgPyBlaS5nZXRJbmplY3RvcigpIDogbnVsbDtcblxuICAgICAgcmV0dXJuIG5ldyBEZWJ1Z0NvbnRleHQoZWxlbWVudCwgY29tcG9uZW50RWxlbWVudCwgZGlyZWN0aXZlLCB0aGlzLmNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbG9jYWxzVG9TdHJpbmdNYXAodGhpcy5sb2NhbHMpLCBpbmplY3Rvcik7XG5cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBUT0RPOiB2c2F2a2luIGxvZyB0aGUgZXhjZXB0aW9uIG9uY2Ugd2UgaGF2ZSBhIGdvb2Qgd2F5IHRvIGxvZyBlcnJvcnMgYW5kIHdhcm5pbmdzXG4gICAgICAvLyBpZiBhbiBlcnJvciBoYXBwZW5zIGR1cmluZyBnZXR0aW5nIHRoZSBkZWJ1ZyBjb250ZXh0LCB3ZSByZXR1cm4gbnVsbC5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGdldERldGVjdG9yRm9yKGRpcmVjdGl2ZTogRGlyZWN0aXZlSW5kZXgpOiBhbnkge1xuICAgIHZhciBjaGlsZFZpZXcgPSB0aGlzLmdldE5lc3RlZFZpZXcodGhpcy5lbGVtZW50T2Zmc2V0ICsgZGlyZWN0aXZlLmVsZW1lbnRJbmRleCk7XG4gICAgcmV0dXJuIGlzUHJlc2VudChjaGlsZFZpZXcpID8gY2hpbGRWaWV3LmNoYW5nZURldGVjdG9yIDogbnVsbDtcbiAgfVxuXG4gIGludm9rZUVsZW1lbnRNZXRob2QoZWxlbWVudEluZGV4OiBudW1iZXIsIG1ldGhvZE5hbWU6IHN0cmluZywgYXJnczogYW55W10pIHtcbiAgICB0aGlzLnJlbmRlcmVyLmludm9rZUVsZW1lbnRNZXRob2QodGhpcy5lbGVtZW50UmVmc1tlbGVtZW50SW5kZXhdLCBtZXRob2ROYW1lLCBhcmdzKTtcbiAgfVxuXG4gIC8vIGltcGxlbWVudGF0aW9uIG9mIFJlbmRlckV2ZW50RGlzcGF0Y2hlciNkaXNwYXRjaFJlbmRlckV2ZW50XG4gIGRpc3BhdGNoUmVuZGVyRXZlbnQoYm91bmRFbGVtZW50SW5kZXg6IG51bWJlciwgZXZlbnROYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgbG9jYWxzOiBNYXA8c3RyaW5nLCBhbnk+KTogYm9vbGVhbiB7XG4gICAgdmFyIGVsZW1lbnRSZWYgPSB0aGlzLmVsZW1lbnRSZWZzW2JvdW5kRWxlbWVudEluZGV4XTtcbiAgICB2YXIgdmlldyA9IGludGVybmFsVmlldyhlbGVtZW50UmVmLnBhcmVudFZpZXcpO1xuICAgIHJldHVybiB2aWV3LmRpc3BhdGNoRXZlbnQoZWxlbWVudFJlZi5ib3VuZEVsZW1lbnRJbmRleCwgZXZlbnROYW1lLCBsb2NhbHMpO1xuICB9XG5cblxuICAvLyByZXR1cm5zIGZhbHNlIGlmIHByZXZlbnREZWZhdWx0IG11c3QgYmUgYXBwbGllZCB0byB0aGUgRE9NIGV2ZW50XG4gIGRpc3BhdGNoRXZlbnQoYm91bmRFbGVtZW50SW5kZXg6IG51bWJlciwgZXZlbnROYW1lOiBzdHJpbmcsIGxvY2FsczogTWFwPHN0cmluZywgYW55Pik6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5oeWRyYXRlZCgpKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5jaGFuZ2VEZXRlY3Rvci5oYW5kbGVFdmVudChldmVudE5hbWUsIGJvdW5kRWxlbWVudEluZGV4IC0gdGhpcy5lbGVtZW50T2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExvY2Fscyh0aGlzLmxvY2FscywgbG9jYWxzKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB2YXIgYyA9IHRoaXMuZ2V0RGVidWdDb250ZXh0KGJvdW5kRWxlbWVudEluZGV4IC0gdGhpcy5lbGVtZW50T2Zmc2V0LCBudWxsKTtcbiAgICAgIHZhciBjb250ZXh0ID0gaXNQcmVzZW50KGMpID8gbmV3IF9Db250ZXh0KGMuZWxlbWVudCwgYy5jb21wb25lbnRFbGVtZW50LCBjLmNvbnRleHQsIGMubG9jYWxzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5pbmplY3RvcikgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsO1xuICAgICAgdGhyb3cgbmV3IEV2ZW50RXZhbHVhdGlvbkVycm9yKGV2ZW50TmFtZSwgZSwgZS5zdGFjaywgY29udGV4dCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IG93bkJpbmRlcnNDb3VudCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5wcm90by5lbGVtZW50QmluZGVycy5sZW5ndGg7IH1cbn1cblxuZnVuY3Rpb24gX2xvY2Fsc1RvU3RyaW5nTWFwKGxvY2FsczogTG9jYWxzKToge1trZXk6IHN0cmluZ106IGFueX0ge1xuICB2YXIgcmVzID0ge307XG4gIHZhciBjID0gbG9jYWxzO1xuICB3aGlsZSAoaXNQcmVzZW50KGMpKSB7XG4gICAgcmVzID0gU3RyaW5nTWFwV3JhcHBlci5tZXJnZShyZXMsIE1hcFdyYXBwZXIudG9TdHJpbmdNYXAoYy5jdXJyZW50KSk7XG4gICAgYyA9IGMucGFyZW50O1xuICB9XG4gIHJldHVybiByZXM7XG59XG5cbi8qKlxuICogRXJyb3IgY29udGV4dCBpbmNsdWRlZCB3aGVuIGFuIGV2ZW50IGhhbmRsZXIgdGhyb3dzIGFuIGV4Y2VwdGlvbi5cbiAqL1xuY2xhc3MgX0NvbnRleHQge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZWxlbWVudDogYW55LCBwdWJsaWMgY29tcG9uZW50RWxlbWVudDogYW55LCBwdWJsaWMgY29udGV4dDogYW55LFxuICAgICAgICAgICAgICBwdWJsaWMgbG9jYWxzOiBhbnksIHB1YmxpYyBpbmplY3RvcjogYW55KSB7fVxufVxuXG4vKipcbiAqIFdyYXBzIGFuIGV4Y2VwdGlvbiB0aHJvd24gYnkgYW4gZXZlbnQgaGFuZGxlci5cbiAqL1xuY2xhc3MgRXZlbnRFdmFsdWF0aW9uRXJyb3IgZXh0ZW5kcyBXcmFwcGVkRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IoZXZlbnROYW1lOiBzdHJpbmcsIG9yaWdpbmFsRXhjZXB0aW9uOiBhbnksIG9yaWdpbmFsU3RhY2s6IGFueSwgY29udGV4dDogYW55KSB7XG4gICAgc3VwZXIoYEVycm9yIGR1cmluZyBldmFsdWF0aW9uIG9mIFwiJHtldmVudE5hbWV9XCJgLCBvcmlnaW5hbEV4Y2VwdGlvbiwgb3JpZ2luYWxTdGFjaywgY29udGV4dCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFwcFByb3RvVmlld01lcmdlSW5mbyB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBlbWJlZGRlZFZpZXdDb3VudDogbnVtYmVyLCBwdWJsaWMgZWxlbWVudENvdW50OiBudW1iZXIsXG4gICAgICAgICAgICAgIHB1YmxpYyB2aWV3Q291bnQ6IG51bWJlcikge31cbn1cblxuLyoqXG4gKlxuICovXG5leHBvcnQgY2xhc3MgQXBwUHJvdG9WaWV3IHtcbiAgcmVmOiBQcm90b1ZpZXdSZWY7XG4gIHByb3RvTG9jYWxzOiBNYXA8c3RyaW5nLCBhbnk+O1xuXG4gIGVsZW1lbnRCaW5kZXJzOiBFbGVtZW50QmluZGVyW10gPSBudWxsO1xuICBtZXJnZUluZm86IEFwcFByb3RvVmlld01lcmdlSW5mbyA9IG51bGw7XG4gIHZhcmlhYmxlTG9jYXRpb25zOiBNYXA8c3RyaW5nLCBudW1iZXI+ID0gbnVsbDtcbiAgdGV4dEJpbmRpbmdDb3VudCA9IG51bGw7XG4gIHJlbmRlcjogcmVuZGVyQXBpLlJlbmRlclByb3RvVmlld1JlZiA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHVibGljIHRlbXBsYXRlSWQ6IHN0cmluZywgcHVibGljIHRlbXBsYXRlQ21kczogVGVtcGxhdGVDbWRbXSwgcHVibGljIHR5cGU6IFZpZXdUeXBlLFxuICAgICAgICAgICAgICBwdWJsaWMgaXNNZXJnYWJsZTogYm9vbGVhbiwgcHVibGljIGNoYW5nZURldGVjdG9yRmFjdG9yeTogRnVuY3Rpb24sXG4gICAgICAgICAgICAgIHB1YmxpYyB0ZW1wbGF0ZVZhcmlhYmxlQmluZGluZ3M6IE1hcDxzdHJpbmcsIHN0cmluZz4sIHB1YmxpYyBwaXBlczogUHJvdG9QaXBlcykge1xuICAgIHRoaXMucmVmID0gbmV3IFByb3RvVmlld1JlZl8odGhpcyk7XG4gIH1cblxuICBpbml0KHJlbmRlcjogcmVuZGVyQXBpLlJlbmRlclByb3RvVmlld1JlZiwgZWxlbWVudEJpbmRlcnM6IEVsZW1lbnRCaW5kZXJbXSxcbiAgICAgICB0ZXh0QmluZGluZ0NvdW50OiBudW1iZXIsIG1lcmdlSW5mbzogQXBwUHJvdG9WaWV3TWVyZ2VJbmZvLFxuICAgICAgIHZhcmlhYmxlTG9jYXRpb25zOiBNYXA8c3RyaW5nLCBudW1iZXI+KSB7XG4gICAgdGhpcy5yZW5kZXIgPSByZW5kZXI7XG4gICAgdGhpcy5lbGVtZW50QmluZGVycyA9IGVsZW1lbnRCaW5kZXJzO1xuICAgIHRoaXMudGV4dEJpbmRpbmdDb3VudCA9IHRleHRCaW5kaW5nQ291bnQ7XG4gICAgdGhpcy5tZXJnZUluZm8gPSBtZXJnZUluZm87XG4gICAgdGhpcy52YXJpYWJsZUxvY2F0aW9ucyA9IHZhcmlhYmxlTG9jYXRpb25zO1xuICAgIHRoaXMucHJvdG9Mb2NhbHMgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICAgIGlmIChpc1ByZXNlbnQodGhpcy50ZW1wbGF0ZVZhcmlhYmxlQmluZGluZ3MpKSB7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVCaW5kaW5ncy5mb3JFYWNoKFxuICAgICAgICAgICh0ZW1wbGF0ZU5hbWUsIF8pID0+IHsgdGhpcy5wcm90b0xvY2Fscy5zZXQodGVtcGxhdGVOYW1lLCBudWxsKTsgfSk7XG4gICAgfVxuICAgIGlmIChpc1ByZXNlbnQodmFyaWFibGVMb2NhdGlvbnMpKSB7XG4gICAgICAvLyBUaGUgdmlldydzIGxvY2FscyBuZWVkcyB0byBoYXZlIGEgZnVsbCBzZXQgb2YgdmFyaWFibGUgbmFtZXMgYXQgY29uc3RydWN0aW9uIHRpbWVcbiAgICAgIC8vIGluIG9yZGVyIHRvIHByZXZlbnQgbmV3IHZhcmlhYmxlcyBmcm9tIGJlaW5nIHNldCBsYXRlciBpbiB0aGUgbGlmZWN5Y2xlLiBTaW5jZSB3ZSBkb24ndFxuICAgICAgLy8gd2FudFxuICAgICAgLy8gdG8gYWN0dWFsbHkgY3JlYXRlIHZhcmlhYmxlIGJpbmRpbmdzIGZvciB0aGUgJGltcGxpY2l0IGJpbmRpbmdzLCBhZGQgdG8gdGhlXG4gICAgICAvLyBwcm90b0xvY2FscyBtYW51YWxseS5cbiAgICAgIHZhcmlhYmxlTG9jYXRpb25zLmZvckVhY2goKF8sIHRlbXBsYXRlTmFtZSkgPT4geyB0aGlzLnByb3RvTG9jYWxzLnNldCh0ZW1wbGF0ZU5hbWUsIG51bGwpOyB9KTtcbiAgICB9XG4gIH1cblxuICBpc0luaXRpYWxpemVkKCk6IGJvb2xlYW4geyByZXR1cm4gaXNQcmVzZW50KHRoaXMuZWxlbWVudEJpbmRlcnMpOyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvdmlldy50c1xuICoqLyIsImltcG9ydCB7aXNQcmVzZW50fSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHt1bmltcGxlbWVudGVkfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0ICogYXMgdmlld01vZHVsZSBmcm9tICcuL3ZpZXcnO1xuaW1wb3J0IHtDaGFuZ2VEZXRlY3RvclJlZn0gZnJvbSAnLi4vY2hhbmdlX2RldGVjdGlvbi9jaGFuZ2VfZGV0ZWN0b3JfcmVmJztcbmltcG9ydCB7UmVuZGVyVmlld1JlZiwgUmVuZGVyRnJhZ21lbnRSZWZ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL3JlbmRlci9hcGknO1xuXG4vLyBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgcHJpdmFjeSBpbiBEYXJ0IGFzIHdlIGRvbid0IGhhdmUgbGlicmFyeSBwYXJ0c1xuZXhwb3J0IGZ1bmN0aW9uIGludGVybmFsVmlldyh2aWV3UmVmOiBWaWV3UmVmKTogdmlld01vZHVsZS5BcHBWaWV3IHtcbiAgcmV0dXJuICg8Vmlld1JlZl8+dmlld1JlZikuX3ZpZXc7XG59XG5cbi8vIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBwcml2YWN5IGluIERhcnQgYXMgd2UgZG9uJ3QgaGF2ZSBsaWJyYXJ5IHBhcnRzXG5leHBvcnQgZnVuY3Rpb24gaW50ZXJuYWxQcm90b1ZpZXcocHJvdG9WaWV3UmVmOiBQcm90b1ZpZXdSZWYpOiB2aWV3TW9kdWxlLkFwcFByb3RvVmlldyB7XG4gIHJldHVybiBpc1ByZXNlbnQocHJvdG9WaWV3UmVmKSA/ICg8UHJvdG9WaWV3UmVmXz5wcm90b1ZpZXdSZWYpLl9wcm90b1ZpZXcgOiBudWxsO1xufVxuXG5cbi8qKlxuICogUmVwcmVzZW50cyBhIFZpZXcgY29udGFpbmluZyBhIHNpbmdsZSBFbGVtZW50IHRoYXQgaXMgdGhlIEhvc3QgRWxlbWVudCBvZiBhIHtAbGluayBDb21wb25lbnR9XG4gKiBpbnN0YW5jZS5cbiAqXG4gKiBBIEhvc3QgVmlldyBpcyBjcmVhdGVkIGZvciBldmVyeSBkeW5hbWljYWxseSBjcmVhdGVkIENvbXBvbmVudCB0aGF0IHdhcyBjb21waWxlZCBvbiBpdHMgb3duIChhc1xuICogb3Bwb3NlZCB0byBhcyBhIHBhcnQgb2YgYW5vdGhlciBDb21wb25lbnQncyBUZW1wbGF0ZSkgdmlhIHtAbGluayBDb21waWxlciNjb21waWxlSW5Ib3N0fSBvciBvbmVcbiAqIG9mIHRoZSBoaWdoZXItbGV2ZWwgQVBJczoge0BsaW5rIEFwcFZpZXdNYW5hZ2VyI2NyZWF0ZVJvb3RIb3N0Vmlld30sXG4gKiB7QGxpbmsgQXBwVmlld01hbmFnZXIjY3JlYXRlSG9zdFZpZXdJbkNvbnRhaW5lcn0sIHtAbGluayBWaWV3Q29udGFpbmVyUmVmI2NyZWF0ZUhvc3RWaWV3fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb3N0Vmlld1JlZiB7XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZjtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIEFuZ3VsYXIgVmlldy5cbiAqXG4gKiA8IS0tIFRPRE86IG1vdmUgdGhlIG5leHQgdHdvIHBhcmFncmFwaHMgdG8gdGhlIGRldiBndWlkZSAtLT5cbiAqIEEgVmlldyBpcyBhIGZ1bmRhbWVudGFsIGJ1aWxkaW5nIGJsb2NrIG9mIHRoZSBhcHBsaWNhdGlvbiBVSS4gSXQgaXMgdGhlIHNtYWxsZXN0IGdyb3VwaW5nIG9mXG4gKiBFbGVtZW50cyB3aGljaCBhcmUgY3JlYXRlZCBhbmQgZGVzdHJveWVkIHRvZ2V0aGVyLlxuICpcbiAqIFByb3BlcnRpZXMgb2YgZWxlbWVudHMgaW4gYSBWaWV3IGNhbiBjaGFuZ2UsIGJ1dCB0aGUgc3RydWN0dXJlIChudW1iZXIgYW5kIG9yZGVyKSBvZiBlbGVtZW50cyBpblxuICogYSBWaWV3IGNhbm5vdC4gQ2hhbmdpbmcgdGhlIHN0cnVjdHVyZSBvZiBFbGVtZW50cyBjYW4gb25seSBiZSBkb25lIGJ5IGluc2VydGluZywgbW92aW5nIG9yXG4gKiByZW1vdmluZyBuZXN0ZWQgVmlld3MgdmlhIGEge0BsaW5rIFZpZXdDb250YWluZXJSZWZ9LiBFYWNoIFZpZXcgY2FuIGNvbnRhaW4gbWFueSBWaWV3IENvbnRhaW5lcnMuXG4gKiA8IS0tIC9UT0RPIC0tPlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogR2l2ZW4gdGhpcyB0ZW1wbGF0ZS4uLlxuICpcbiAqIGBgYFxuICogQ291bnQ6IHt7aXRlbXMubGVuZ3RofX1cbiAqIDx1bD5cbiAqICAgPGxpICpuZ0Zvcj1cInZhciBpdGVtIG9mIGl0ZW1zXCI+e3tpdGVtfX08L2xpPlxuICogPC91bD5cbiAqIGBgYFxuICpcbiAqIC4uLiB3ZSBoYXZlIHR3byB7QGxpbmsgUHJvdG9WaWV3UmVmfXM6XG4gKlxuICogT3V0ZXIge0BsaW5rIFByb3RvVmlld1JlZn06XG4gKiBgYGBcbiAqIENvdW50OiB7e2l0ZW1zLmxlbmd0aH19XG4gKiA8dWw+XG4gKiAgIDx0ZW1wbGF0ZSBuZ0ZvciB2YXItaXRlbSBbbmdGb3JPZl09XCJpdGVtc1wiPjwvdGVtcGxhdGU+XG4gKiA8L3VsPlxuICogYGBgXG4gKlxuICogSW5uZXIge0BsaW5rIFByb3RvVmlld1JlZn06XG4gKiBgYGBcbiAqICAgPGxpPnt7aXRlbX19PC9saT5cbiAqIGBgYFxuICpcbiAqIE5vdGljZSB0aGF0IHRoZSBvcmlnaW5hbCB0ZW1wbGF0ZSBpcyBicm9rZW4gZG93biBpbnRvIHR3byBzZXBhcmF0ZSB7QGxpbmsgUHJvdG9WaWV3UmVmfXMuXG4gKlxuICogVGhlIG91dGVyL2lubmVyIHtAbGluayBQcm90b1ZpZXdSZWZ9cyBhcmUgdGhlbiBhc3NlbWJsZWQgaW50byB2aWV3cyBsaWtlIHNvOlxuICpcbiAqIGBgYFxuICogPCEtLSBWaWV3UmVmOiBvdXRlci0wIC0tPlxuICogQ291bnQ6IDJcbiAqIDx1bD5cbiAqICAgPHRlbXBsYXRlIHZpZXctY29udGFpbmVyLXJlZj48L3RlbXBsYXRlPlxuICogICA8IS0tIFZpZXdSZWY6IGlubmVyLTEgLS0+PGxpPmZpcnN0PC9saT48IS0tIC9WaWV3UmVmOiBpbm5lci0xIC0tPlxuICogICA8IS0tIFZpZXdSZWY6IGlubmVyLTIgLS0+PGxpPnNlY29uZDwvbGk+PCEtLSAvVmlld1JlZjogaW5uZXItMiAtLT5cbiAqIDwvdWw+XG4gKiA8IS0tIC9WaWV3UmVmOiBvdXRlci0wIC0tPlxuICogYGBgXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBWaWV3UmVmIGltcGxlbWVudHMgSG9zdFZpZXdSZWYge1xuICAvKipcbiAgICogU2V0cyBgdmFsdWVgIG9mIGxvY2FsIHZhcmlhYmxlIGNhbGxlZCBgdmFyaWFibGVOYW1lYCBpbiB0aGlzIFZpZXcuXG4gICAqL1xuICBhYnN0cmFjdCBzZXRMb2NhbCh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQ7XG5cbiAgZ2V0IGNoYW5nZURldGVjdG9yUmVmKCk6IENoYW5nZURldGVjdG9yUmVmIHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfVxuICBzZXQgY2hhbmdlRGV0ZWN0b3JSZWYodmFsdWU6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gICAgdW5pbXBsZW1lbnRlZCgpOyAgLy8gVE9ETzogaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xMlxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBWaWV3UmVmXyBleHRlbmRzIFZpZXdSZWYge1xuICBwcml2YXRlIF9jaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYgPSBudWxsO1xuICAvKiogQGludGVybmFsICovXG4gIHB1YmxpYyBfdmlldzogdmlld01vZHVsZS5BcHBWaWV3O1xuICBjb25zdHJ1Y3Rvcihfdmlldzogdmlld01vZHVsZS5BcHBWaWV3KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl92aWV3ID0gX3ZpZXc7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGBSZW5kZXJWaWV3UmVmYFxuICAgKi9cbiAgZ2V0IHJlbmRlcigpOiBSZW5kZXJWaWV3UmVmIHsgcmV0dXJuIHRoaXMuX3ZpZXcucmVuZGVyOyB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBgUmVuZGVyRnJhZ21lbnRSZWZgXG4gICAqL1xuICBnZXQgcmVuZGVyRnJhZ21lbnQoKTogUmVuZGVyRnJhZ21lbnRSZWYgeyByZXR1cm4gdGhpcy5fdmlldy5yZW5kZXJGcmFnbWVudDsgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYENoYW5nZURldGVjdG9yUmVmYFxuICAgKi9cbiAgZ2V0IGNoYW5nZURldGVjdG9yUmVmKCk6IENoYW5nZURldGVjdG9yUmVmIHtcbiAgICBpZiAodGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmID0gdGhpcy5fdmlldy5jaGFuZ2VEZXRlY3Rvci5yZWY7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZjtcbiAgfVxuXG4gIHNldExvY2FsKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7IHRoaXMuX3ZpZXcuc2V0TG9jYWwodmFyaWFibGVOYW1lLCB2YWx1ZSk7IH1cbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIEFuZ3VsYXIgUHJvdG9WaWV3LlxuICpcbiAqIEEgUHJvdG9WaWV3IGlzIGEgcHJvdG90eXBpY2FsIHtAbGluayBWaWV3UmVmIFZpZXd9IHRoYXQgaXMgdGhlIHJlc3VsdCBvZiBUZW1wbGF0ZSBjb21waWxhdGlvbiBhbmRcbiAqIGlzIHVzZWQgYnkgQW5ndWxhciB0byBlZmZpY2llbnRseSBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBWaWV3IGJhc2VkIG9uIHRoZSBjb21waWxlZCBUZW1wbGF0ZS5cbiAqXG4gKiBNb3N0IFByb3RvVmlld3MgYXJlIGNyZWF0ZWQgYW5kIHVzZWQgaW50ZXJuYWxseSBieSBBbmd1bGFyIGFuZCB5b3UgZG9uJ3QgbmVlZCB0byBrbm93IGFib3V0IHRoZW0sXG4gKiBleGNlcHQgaW4gYWR2YW5jZWQgdXNlLWNhc2VzIHdoZXJlIHlvdSBjb21waWxlIGNvbXBvbmVudHMgeW91cnNlbGYgdmlhIHRoZSBsb3ctbGV2ZWxcbiAqIHtAbGluayBDb21waWxlciNjb21waWxlSW5Ib3N0fSBBUEkuXG4gKlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogR2l2ZW4gdGhpcyB0ZW1wbGF0ZTpcbiAqXG4gKiBgYGBcbiAqIENvdW50OiB7e2l0ZW1zLmxlbmd0aH19XG4gKiA8dWw+XG4gKiAgIDxsaSAqbmdGb3I9XCJ2YXIgaXRlbSBvZiBpdGVtc1wiPnt7aXRlbX19PC9saT5cbiAqIDwvdWw+XG4gKiBgYGBcbiAqXG4gKiBBbmd1bGFyIGRlc3VnYXJzIGFuZCBjb21waWxlcyB0aGUgdGVtcGxhdGUgaW50byB0d28gUHJvdG9WaWV3czpcbiAqXG4gKiBPdXRlciBQcm90b1ZpZXc6XG4gKiBgYGBcbiAqIENvdW50OiB7e2l0ZW1zLmxlbmd0aH19XG4gKiA8dWw+XG4gKiAgIDx0ZW1wbGF0ZSBuZ0ZvciB2YXItaXRlbSBbbmdGb3JPZl09XCJpdGVtc1wiPjwvdGVtcGxhdGU+XG4gKiA8L3VsPlxuICogYGBgXG4gKlxuICogSW5uZXIgUHJvdG9WaWV3OlxuICogYGBgXG4gKiAgIDxsaT57e2l0ZW19fTwvbGk+XG4gKiBgYGBcbiAqXG4gKiBOb3RpY2UgdGhhdCB0aGUgb3JpZ2luYWwgdGVtcGxhdGUgaXMgYnJva2VuIGRvd24gaW50byB0d28gc2VwYXJhdGUgUHJvdG9WaWV3cy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFByb3RvVmlld1JlZiB7fVxuXG5leHBvcnQgY2xhc3MgUHJvdG9WaWV3UmVmXyBleHRlbmRzIFByb3RvVmlld1JlZiB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIF9wcm90b1ZpZXc6IHZpZXdNb2R1bGUuQXBwUHJvdG9WaWV3O1xuICBjb25zdHJ1Y3RvcihfcHJvdG9WaWV3OiB2aWV3TW9kdWxlLkFwcFByb3RvVmlldykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fcHJvdG9WaWV3ID0gX3Byb3RvVmlldztcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL3ZpZXdfcmVmLnRzXG4gKiovIiwiaW1wb3J0IHtTdHJpbmdXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuXG52YXIgQ0FNRUxfQ0FTRV9SRUdFWFAgPSAvKFtBLVpdKS9nO1xudmFyIERBU0hfQ0FTRV9SRUdFWFAgPSAvLShbYS16XSkvZztcblxuXG5leHBvcnQgZnVuY3Rpb24gY2FtZWxDYXNlVG9EYXNoQ2FzZShpbnB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIFN0cmluZ1dyYXBwZXIucmVwbGFjZUFsbE1hcHBlZChpbnB1dCwgQ0FNRUxfQ0FTRV9SRUdFWFAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG0pID0+IHsgcmV0dXJuICctJyArIG1bMV0udG9Mb3dlckNhc2UoKTsgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkYXNoQ2FzZVRvQ2FtZWxDYXNlKGlucHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gU3RyaW5nV3JhcHBlci5yZXBsYWNlQWxsTWFwcGVkKGlucHV0LCBEQVNIX0NBU0VfUkVHRVhQLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtKSA9PiB7IHJldHVybiBtWzFdLnRvVXBwZXJDYXNlKCk7IH0pO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvcmVuZGVyL3V0aWwudHNcbiAqKi8iLCJpbXBvcnQge2lzQmxhbmt9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge0Jhc2VFeGNlcHRpb259IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9ucyc7XG5pbXBvcnQgKiBhcyBlaU1vZHVsZSBmcm9tICcuL2VsZW1lbnRfaW5qZWN0b3InO1xuaW1wb3J0IHtEaXJlY3RpdmVQcm92aWRlcn0gZnJvbSAnLi9lbGVtZW50X2luamVjdG9yJztcbmltcG9ydCAqIGFzIHZpZXdNb2R1bGUgZnJvbSAnLi92aWV3JztcblxuZXhwb3J0IGNsYXNzIEVsZW1lbnRCaW5kZXIge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgaW5kZXg6IG51bWJlciwgcHVibGljIHBhcmVudDogRWxlbWVudEJpbmRlciwgcHVibGljIGRpc3RhbmNlVG9QYXJlbnQ6IG51bWJlcixcbiAgICAgICAgICAgICAgcHVibGljIHByb3RvRWxlbWVudEluamVjdG9yOiBlaU1vZHVsZS5Qcm90b0VsZW1lbnRJbmplY3RvcixcbiAgICAgICAgICAgICAgcHVibGljIGNvbXBvbmVudERpcmVjdGl2ZTogRGlyZWN0aXZlUHJvdmlkZXIsXG4gICAgICAgICAgICAgIHB1YmxpYyBuZXN0ZWRQcm90b1ZpZXc6IHZpZXdNb2R1bGUuQXBwUHJvdG9WaWV3KSB7XG4gICAgaWYgKGlzQmxhbmsoaW5kZXgpKSB7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignbnVsbCBpbmRleCBub3QgYWxsb3dlZC4nKTtcbiAgICB9XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9lbGVtZW50X2JpbmRlci50c1xuICoqLyIsImltcG9ydCB7XG4gIGlzUHJlc2VudCxcbiAgaXNCbGFuayxcbiAgVHlwZSxcbiAgc3RyaW5naWZ5LFxuICBDT05TVF9FWFBSLFxuICBTdHJpbmdXcmFwcGVyXG59IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge0Jhc2VFeGNlcHRpb259IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9ucyc7XG5pbXBvcnQge0V2ZW50RW1pdHRlciwgT2JzZXJ2YWJsZVdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvYXN5bmMnO1xuaW1wb3J0IHtMaXN0V3JhcHBlciwgTWFwV3JhcHBlciwgU3RyaW5nTWFwV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcbmltcG9ydCB7XG4gIEluamVjdG9yLFxuICBLZXksXG4gIERlcGVuZGVuY3ksXG4gIHByb3ZpZGUsXG4gIFByb3ZpZGVyLFxuICBSZXNvbHZlZFByb3ZpZGVyLFxuICBOb1Byb3ZpZGVyRXJyb3IsXG4gIEFic3RyYWN0UHJvdmlkZXJFcnJvcixcbiAgQ3ljbGljRGVwZW5kZW5jeUVycm9yLFxuICByZXNvbHZlRm9yd2FyZFJlZlxufSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5pbXBvcnQge1xuICBVTkRFRklORUQsXG4gIFByb3RvSW5qZWN0b3IsXG4gIFZpc2liaWxpdHksXG4gIEluamVjdG9ySW5saW5lU3RyYXRlZ3ksXG4gIEluamVjdG9yRHluYW1pY1N0cmF0ZWd5LFxuICBQcm92aWRlcldpdGhWaXNpYmlsaXR5LFxuICBEZXBlbmRlbmN5UHJvdmlkZXJcbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvZGkvaW5qZWN0b3InO1xuaW1wb3J0IHtyZXNvbHZlUHJvdmlkZXIsIFJlc29sdmVkRmFjdG9yeSwgUmVzb2x2ZWRQcm92aWRlcl99IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpL3Byb3ZpZGVyJztcblxuaW1wb3J0IHtBdHRyaWJ1dGVNZXRhZGF0YSwgUXVlcnlNZXRhZGF0YX0gZnJvbSAnLi4vbWV0YWRhdGEvZGknO1xuXG5pbXBvcnQge0FwcFZpZXdDb250YWluZXIsIEFwcFZpZXd9IGZyb20gJy4vdmlldyc7XG4vKiBjaXJjdWxhciAqLyBpbXBvcnQgKiBhcyBhdm1Nb2R1bGUgZnJvbSAnLi92aWV3X21hbmFnZXInO1xuaW1wb3J0IHtWaWV3Q29udGFpbmVyUmVmfSBmcm9tICcuL3ZpZXdfY29udGFpbmVyX3JlZic7XG5pbXBvcnQge0VsZW1lbnRSZWZ9IGZyb20gJy4vZWxlbWVudF9yZWYnO1xuaW1wb3J0IHtUZW1wbGF0ZVJlZn0gZnJvbSAnLi90ZW1wbGF0ZV9yZWYnO1xuaW1wb3J0IHtEaXJlY3RpdmVNZXRhZGF0YSwgQ29tcG9uZW50TWV0YWRhdGF9IGZyb20gJy4uL21ldGFkYXRhL2RpcmVjdGl2ZXMnO1xuaW1wb3J0IHtoYXNMaWZlY3ljbGVIb29rfSBmcm9tICcuL2RpcmVjdGl2ZV9saWZlY3ljbGVfcmVmbGVjdG9yJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yLFxuICBDaGFuZ2VEZXRlY3RvclJlZlxufSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2NoYW5nZV9kZXRlY3Rpb24nO1xuaW1wb3J0IHtRdWVyeUxpc3R9IGZyb20gJy4vcXVlcnlfbGlzdCc7XG5pbXBvcnQge3JlZmxlY3Rvcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvcmVmbGVjdGlvbi9yZWZsZWN0aW9uJztcbmltcG9ydCB7U2V0dGVyRm59IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL3JlZmxlY3Rpb24vdHlwZXMnO1xuaW1wb3J0IHtFdmVudENvbmZpZ30gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL2V2ZW50X2NvbmZpZyc7XG5pbXBvcnQge0FmdGVyVmlld0NoZWNrZWR9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9pbnRlcmZhY2VzJztcbmltcG9ydCB7UGlwZVByb3ZpZGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9waXBlcy9waXBlX3Byb3ZpZGVyJztcblxuaW1wb3J0IHtMaWZlY3ljbGVIb29rc30gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7Vmlld0NvbnRhaW5lclJlZl99IGZyb20gXCIuL3ZpZXdfY29udGFpbmVyX3JlZlwiO1xuXG52YXIgX3N0YXRpY0tleXM7XG5cbmV4cG9ydCBjbGFzcyBTdGF0aWNLZXlzIHtcbiAgdmlld01hbmFnZXJJZDogbnVtYmVyO1xuICB0ZW1wbGF0ZVJlZklkOiBudW1iZXI7XG4gIHZpZXdDb250YWluZXJJZDogbnVtYmVyO1xuICBjaGFuZ2VEZXRlY3RvclJlZklkOiBudW1iZXI7XG4gIGVsZW1lbnRSZWZJZDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMudmlld01hbmFnZXJJZCA9IEtleS5nZXQoYXZtTW9kdWxlLkFwcFZpZXdNYW5hZ2VyKS5pZDtcbiAgICB0aGlzLnRlbXBsYXRlUmVmSWQgPSBLZXkuZ2V0KFRlbXBsYXRlUmVmKS5pZDtcbiAgICB0aGlzLnZpZXdDb250YWluZXJJZCA9IEtleS5nZXQoVmlld0NvbnRhaW5lclJlZikuaWQ7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZklkID0gS2V5LmdldChDaGFuZ2VEZXRlY3RvclJlZikuaWQ7XG4gICAgdGhpcy5lbGVtZW50UmVmSWQgPSBLZXkuZ2V0KEVsZW1lbnRSZWYpLmlkO1xuICB9XG5cbiAgc3RhdGljIGluc3RhbmNlKCk6IFN0YXRpY0tleXMge1xuICAgIGlmIChpc0JsYW5rKF9zdGF0aWNLZXlzKSkgX3N0YXRpY0tleXMgPSBuZXcgU3RhdGljS2V5cygpO1xuICAgIHJldHVybiBfc3RhdGljS2V5cztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHJlZU5vZGU8VCBleHRlbmRzIFRyZWVOb2RlPGFueT4+IHtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcGFyZW50OiBUO1xuICBjb25zdHJ1Y3RvcihwYXJlbnQ6IFQpIHtcbiAgICBpZiAoaXNQcmVzZW50KHBhcmVudCkpIHtcbiAgICAgIHBhcmVudC5hZGRDaGlsZCh0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcGFyZW50ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBhZGRDaGlsZChjaGlsZDogVCk6IHZvaWQgeyBjaGlsZC5fcGFyZW50ID0gdGhpczsgfVxuXG4gIHJlbW92ZSgpOiB2b2lkIHsgdGhpcy5fcGFyZW50ID0gbnVsbDsgfVxuXG4gIGdldCBwYXJlbnQoKSB7IHJldHVybiB0aGlzLl9wYXJlbnQ7IH1cbn1cblxuZXhwb3J0IGNsYXNzIERpcmVjdGl2ZURlcGVuZGVuY3kgZXh0ZW5kcyBEZXBlbmRlbmN5IHtcbiAgY29uc3RydWN0b3Ioa2V5OiBLZXksIG9wdGlvbmFsOiBib29sZWFuLCBsb3dlckJvdW5kVmlzaWJpbGl0eTogT2JqZWN0LFxuICAgICAgICAgICAgICB1cHBlckJvdW5kVmlzaWJpbGl0eTogT2JqZWN0LCBwcm9wZXJ0aWVzOiBhbnlbXSwgcHVibGljIGF0dHJpYnV0ZU5hbWU6IHN0cmluZyxcbiAgICAgICAgICAgICAgcHVibGljIHF1ZXJ5RGVjb3JhdG9yOiBRdWVyeU1ldGFkYXRhKSB7XG4gICAgc3VwZXIoa2V5LCBvcHRpb25hbCwgbG93ZXJCb3VuZFZpc2liaWxpdHksIHVwcGVyQm91bmRWaXNpYmlsaXR5LCBwcm9wZXJ0aWVzKTtcbiAgICB0aGlzLl92ZXJpZnkoKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3ZlcmlmeSgpOiB2b2lkIHtcbiAgICB2YXIgY291bnQgPSAwO1xuICAgIGlmIChpc1ByZXNlbnQodGhpcy5xdWVyeURlY29yYXRvcikpIGNvdW50Kys7XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLmF0dHJpYnV0ZU5hbWUpKSBjb3VudCsrO1xuICAgIGlmIChjb3VudCA+IDEpXG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihcbiAgICAgICAgICAnQSBkaXJlY3RpdmUgaW5qZWN0YWJsZSBjYW4gY29udGFpbiBvbmx5IG9uZSBvZiB0aGUgZm9sbG93aW5nIEBBdHRyaWJ1dGUgb3IgQFF1ZXJ5LicpO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZUZyb20oZDogRGVwZW5kZW5jeSk6IERlcGVuZGVuY3kge1xuICAgIHJldHVybiBuZXcgRGlyZWN0aXZlRGVwZW5kZW5jeShcbiAgICAgICAgZC5rZXksIGQub3B0aW9uYWwsIGQubG93ZXJCb3VuZFZpc2liaWxpdHksIGQudXBwZXJCb3VuZFZpc2liaWxpdHksIGQucHJvcGVydGllcyxcbiAgICAgICAgRGlyZWN0aXZlRGVwZW5kZW5jeS5fYXR0cmlidXRlTmFtZShkLnByb3BlcnRpZXMpLCBEaXJlY3RpdmVEZXBlbmRlbmN5Ll9xdWVyeShkLnByb3BlcnRpZXMpKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgc3RhdGljIF9hdHRyaWJ1dGVOYW1lKHByb3BlcnRpZXM6IGFueVtdKTogc3RyaW5nIHtcbiAgICB2YXIgcCA9IDxBdHRyaWJ1dGVNZXRhZGF0YT5wcm9wZXJ0aWVzLmZpbmQocCA9PiBwIGluc3RhbmNlb2YgQXR0cmlidXRlTWV0YWRhdGEpO1xuICAgIHJldHVybiBpc1ByZXNlbnQocCkgPyBwLmF0dHJpYnV0ZU5hbWUgOiBudWxsO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzdGF0aWMgX3F1ZXJ5KHByb3BlcnRpZXM6IGFueVtdKTogUXVlcnlNZXRhZGF0YSB7XG4gICAgcmV0dXJuIDxRdWVyeU1ldGFkYXRhPnByb3BlcnRpZXMuZmluZChwID0+IHAgaW5zdGFuY2VvZiBRdWVyeU1ldGFkYXRhKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGlyZWN0aXZlUHJvdmlkZXIgZXh0ZW5kcyBSZXNvbHZlZFByb3ZpZGVyXyB7XG4gIHB1YmxpYyBjYWxsT25EZXN0cm95OiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKGtleTogS2V5LCBmYWN0b3J5OiBGdW5jdGlvbiwgZGVwczogRGVwZW5kZW5jeVtdLCBwdWJsaWMgbWV0YWRhdGE6IERpcmVjdGl2ZU1ldGFkYXRhLFxuICAgICAgICAgICAgICBwdWJsaWMgcHJvdmlkZXJzOiBBcnJheTxUeXBlIHwgUHJvdmlkZXIgfCBhbnlbXT4sXG4gICAgICAgICAgICAgIHB1YmxpYyB2aWV3UHJvdmlkZXJzOiBBcnJheTxUeXBlIHwgUHJvdmlkZXIgfCBhbnlbXT4pIHtcbiAgICBzdXBlcihrZXksIFtuZXcgUmVzb2x2ZWRGYWN0b3J5KGZhY3RvcnksIGRlcHMpXSwgZmFsc2UpO1xuICAgIHRoaXMuY2FsbE9uRGVzdHJveSA9IGhhc0xpZmVjeWNsZUhvb2soTGlmZWN5Y2xlSG9va3MuT25EZXN0cm95LCBrZXkudG9rZW4pO1xuICB9XG5cbiAgZ2V0IGRpc3BsYXlOYW1lKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmtleS5kaXNwbGF5TmFtZTsgfVxuXG4gIGdldCBxdWVyaWVzKCk6IFF1ZXJ5TWV0YWRhdGFXaXRoU2V0dGVyW10ge1xuICAgIGlmIChpc0JsYW5rKHRoaXMubWV0YWRhdGEucXVlcmllcykpIHJldHVybiBbXTtcblxuICAgIHZhciByZXMgPSBbXTtcbiAgICBTdHJpbmdNYXBXcmFwcGVyLmZvckVhY2godGhpcy5tZXRhZGF0YS5xdWVyaWVzLCAobWV0YSwgZmllbGROYW1lKSA9PiB7XG4gICAgICB2YXIgc2V0dGVyID0gcmVmbGVjdG9yLnNldHRlcihmaWVsZE5hbWUpO1xuICAgICAgcmVzLnB1c2gobmV3IFF1ZXJ5TWV0YWRhdGFXaXRoU2V0dGVyKHNldHRlciwgbWV0YSkpO1xuICAgIH0pO1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBnZXQgZXZlbnRFbWl0dGVycygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIGlzUHJlc2VudCh0aGlzLm1ldGFkYXRhKSAmJiBpc1ByZXNlbnQodGhpcy5tZXRhZGF0YS5vdXRwdXRzKSA/IHRoaXMubWV0YWRhdGEub3V0cHV0cyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZUZyb21Qcm92aWRlcihwcm92aWRlcjogUHJvdmlkZXIsIG1ldGE6IERpcmVjdGl2ZU1ldGFkYXRhKTogRGlyZWN0aXZlUHJvdmlkZXIge1xuICAgIGlmIChpc0JsYW5rKG1ldGEpKSB7XG4gICAgICBtZXRhID0gbmV3IERpcmVjdGl2ZU1ldGFkYXRhKCk7XG4gICAgfVxuXG4gICAgdmFyIHJiID0gcmVzb2x2ZVByb3ZpZGVyKHByb3ZpZGVyKTtcbiAgICB2YXIgcmYgPSByYi5yZXNvbHZlZEZhY3Rvcmllc1swXTtcbiAgICB2YXIgZGVwcyA9IHJmLmRlcGVuZGVuY2llcy5tYXAoRGlyZWN0aXZlRGVwZW5kZW5jeS5jcmVhdGVGcm9tKTtcblxuICAgIHZhciBwcm92aWRlcnMgPSBpc1ByZXNlbnQobWV0YS5wcm92aWRlcnMpID8gbWV0YS5wcm92aWRlcnMgOiBbXTtcbiAgICB2YXIgdmlld0JpbmRpZ3MgPSBtZXRhIGluc3RhbmNlb2YgQ29tcG9uZW50TWV0YWRhdGEgJiYgaXNQcmVzZW50KG1ldGEudmlld1Byb3ZpZGVycykgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLnZpZXdQcm92aWRlcnMgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbXTtcbiAgICByZXR1cm4gbmV3IERpcmVjdGl2ZVByb3ZpZGVyKHJiLmtleSwgcmYuZmFjdG9yeSwgZGVwcywgbWV0YSwgcHJvdmlkZXJzLCB2aWV3QmluZGlncyk7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlRnJvbVR5cGUodHlwZTogVHlwZSwgYW5ub3RhdGlvbjogRGlyZWN0aXZlTWV0YWRhdGEpOiBEaXJlY3RpdmVQcm92aWRlciB7XG4gICAgdmFyIHByb3ZpZGVyID0gbmV3IFByb3ZpZGVyKHR5cGUsIHt1c2VDbGFzczogdHlwZX0pO1xuICAgIHJldHVybiBEaXJlY3RpdmVQcm92aWRlci5jcmVhdGVGcm9tUHJvdmlkZXIocHJvdmlkZXIsIGFubm90YXRpb24pO1xuICB9XG59XG5cbi8vIFRPRE8ocmFkbyk6IGJlbmNobWFyayBhbmQgY29uc2lkZXIgcm9sbGluZyBpbiBhcyBFbGVtZW50SW5qZWN0b3IgZmllbGRzLlxuZXhwb3J0IGNsYXNzIFByZUJ1aWx0T2JqZWN0cyB7XG4gIG5lc3RlZFZpZXc6IEFwcFZpZXcgPSBudWxsO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdmlld01hbmFnZXI6IGF2bU1vZHVsZS5BcHBWaWV3TWFuYWdlciwgcHVibGljIHZpZXc6IEFwcFZpZXcsXG4gICAgICAgICAgICAgIHB1YmxpYyBlbGVtZW50UmVmOiBFbGVtZW50UmVmLCBwdWJsaWMgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmKSB7fVxufVxuXG5leHBvcnQgY2xhc3MgUXVlcnlNZXRhZGF0YVdpdGhTZXR0ZXIge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgc2V0dGVyOiBTZXR0ZXJGbiwgcHVibGljIG1ldGFkYXRhOiBRdWVyeU1ldGFkYXRhKSB7fVxufVxuXG5leHBvcnQgY2xhc3MgRXZlbnRFbWl0dGVyQWNjZXNzb3Ige1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZXZlbnROYW1lOiBzdHJpbmcsIHB1YmxpYyBnZXR0ZXI6IEZ1bmN0aW9uKSB7fVxuXG4gIHN1YnNjcmliZSh2aWV3OiBBcHBWaWV3LCBib3VuZEVsZW1lbnRJbmRleDogbnVtYmVyLCBkaXJlY3RpdmU6IE9iamVjdCk6IE9iamVjdCB7XG4gICAgdmFyIGV2ZW50RW1pdHRlciA9IHRoaXMuZ2V0dGVyKGRpcmVjdGl2ZSk7XG4gICAgcmV0dXJuIE9ic2VydmFibGVXcmFwcGVyLnN1YnNjcmliZTxFdmVudD4oXG4gICAgICAgIGV2ZW50RW1pdHRlcixcbiAgICAgICAgZXZlbnRPYmogPT4gdmlldy50cmlnZ2VyRXZlbnRIYW5kbGVycyh0aGlzLmV2ZW50TmFtZSwgZXZlbnRPYmosIGJvdW5kRWxlbWVudEluZGV4KSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NyZWF0ZUV2ZW50RW1pdHRlckFjY2Vzc29ycyhid3Y6IFByb3ZpZGVyV2l0aFZpc2liaWxpdHkpOiBFdmVudEVtaXR0ZXJBY2Nlc3NvcltdIHtcbiAgdmFyIHByb3ZpZGVyID0gYnd2LnByb3ZpZGVyO1xuICBpZiAoIShwcm92aWRlciBpbnN0YW5jZW9mIERpcmVjdGl2ZVByb3ZpZGVyKSkgcmV0dXJuIFtdO1xuICB2YXIgZGIgPSA8RGlyZWN0aXZlUHJvdmlkZXI+cHJvdmlkZXI7XG4gIHJldHVybiBkYi5ldmVudEVtaXR0ZXJzLm1hcChldmVudENvbmZpZyA9PiB7XG4gICAgdmFyIHBhcnNlZEV2ZW50ID0gRXZlbnRDb25maWcucGFyc2UoZXZlbnRDb25maWcpO1xuICAgIHJldHVybiBuZXcgRXZlbnRFbWl0dGVyQWNjZXNzb3IocGFyc2VkRXZlbnQuZXZlbnROYW1lLCByZWZsZWN0b3IuZ2V0dGVyKHBhcnNlZEV2ZW50LmZpZWxkTmFtZSkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gX2NyZWF0ZVByb3RvUXVlcnlSZWZzKHByb3ZpZGVyczogUHJvdmlkZXJXaXRoVmlzaWJpbGl0eVtdKTogUHJvdG9RdWVyeVJlZltdIHtcbiAgdmFyIHJlcyA9IFtdO1xuICBMaXN0V3JhcHBlci5mb3JFYWNoV2l0aEluZGV4KHByb3ZpZGVycywgKGIsIGkpID0+IHtcbiAgICBpZiAoYi5wcm92aWRlciBpbnN0YW5jZW9mIERpcmVjdGl2ZVByb3ZpZGVyKSB7XG4gICAgICB2YXIgZGlyZWN0aXZlUHJvdmlkZXIgPSA8RGlyZWN0aXZlUHJvdmlkZXI+Yi5wcm92aWRlcjtcbiAgICAgIC8vIGZpZWxkIHF1ZXJpZXNcbiAgICAgIHZhciBxdWVyaWVzOiBRdWVyeU1ldGFkYXRhV2l0aFNldHRlcltdID0gZGlyZWN0aXZlUHJvdmlkZXIucXVlcmllcztcbiAgICAgIHF1ZXJpZXMuZm9yRWFjaChxID0+IHJlcy5wdXNoKG5ldyBQcm90b1F1ZXJ5UmVmKGksIHEuc2V0dGVyLCBxLm1ldGFkYXRhKSkpO1xuXG4gICAgICAvLyBxdWVyaWVzIHBhc3NlZCBpbnRvIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzIGFmdGVyIGNvbnN0cnVjdG9yIHF1ZXJpZXMgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWRcbiAgICAgIHZhciBkZXBzOiBEaXJlY3RpdmVEZXBlbmRlbmN5W10gPVxuICAgICAgICAgIDxEaXJlY3RpdmVEZXBlbmRlbmN5W10+ZGlyZWN0aXZlUHJvdmlkZXIucmVzb2x2ZWRGYWN0b3J5LmRlcGVuZGVuY2llcztcbiAgICAgIGRlcHMuZm9yRWFjaChkID0+IHtcbiAgICAgICAgaWYgKGlzUHJlc2VudChkLnF1ZXJ5RGVjb3JhdG9yKSkgcmVzLnB1c2gobmV3IFByb3RvUXVlcnlSZWYoaSwgbnVsbCwgZC5xdWVyeURlY29yYXRvcikpO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlcztcbn1cblxuZXhwb3J0IGNsYXNzIFByb3RvRWxlbWVudEluamVjdG9yIHtcbiAgdmlldzogQXBwVmlldztcbiAgYXR0cmlidXRlczogTWFwPHN0cmluZywgc3RyaW5nPjtcbiAgZXZlbnRFbWl0dGVyQWNjZXNzb3JzOiBFdmVudEVtaXR0ZXJBY2Nlc3NvcltdW107XG4gIHByb3RvUXVlcnlSZWZzOiBQcm90b1F1ZXJ5UmVmW107XG4gIHByb3RvSW5qZWN0b3I6IFByb3RvSW5qZWN0b3I7XG5cbiAgc3RhdGljIGNyZWF0ZShwYXJlbnQ6IFByb3RvRWxlbWVudEluamVjdG9yLCBpbmRleDogbnVtYmVyLCBwcm92aWRlcnM6IERpcmVjdGl2ZVByb3ZpZGVyW10sXG4gICAgICAgICAgICAgICAgZmlyc3RQcm92aWRlcklzQ29tcG9uZW50OiBib29sZWFuLCBkaXN0YW5jZVRvUGFyZW50OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgZGlyZWN0aXZlVmFyaWFibGVCaW5kaW5nczogTWFwPHN0cmluZywgbnVtYmVyPik6IFByb3RvRWxlbWVudEluamVjdG9yIHtcbiAgICB2YXIgYmQgPSBbXTtcblxuICAgIFByb3RvRWxlbWVudEluamVjdG9yLl9jcmVhdGVEaXJlY3RpdmVQcm92aWRlcldpdGhWaXNpYmlsaXR5KHByb3ZpZGVycywgYmQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RQcm92aWRlcklzQ29tcG9uZW50KTtcbiAgICBpZiAoZmlyc3RQcm92aWRlcklzQ29tcG9uZW50KSB7XG4gICAgICBQcm90b0VsZW1lbnRJbmplY3Rvci5fY3JlYXRlVmlld1Byb3ZpZGVyc1dpdGhWaXNpYmlsaXR5KHByb3ZpZGVycywgYmQpO1xuICAgIH1cblxuICAgIFByb3RvRWxlbWVudEluamVjdG9yLl9jcmVhdGVQcm92aWRlcnNXaXRoVmlzaWJpbGl0eShwcm92aWRlcnMsIGJkKTtcbiAgICByZXR1cm4gbmV3IFByb3RvRWxlbWVudEluamVjdG9yKHBhcmVudCwgaW5kZXgsIGJkLCBkaXN0YW5jZVRvUGFyZW50LCBmaXJzdFByb3ZpZGVySXNDb21wb25lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RpdmVWYXJpYWJsZUJpbmRpbmdzKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9jcmVhdGVEaXJlY3RpdmVQcm92aWRlcldpdGhWaXNpYmlsaXR5KGRpclByb3ZpZGVyczogRGlyZWN0aXZlUHJvdmlkZXJbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmQ6IFByb3ZpZGVyV2l0aFZpc2liaWxpdHlbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RQcm92aWRlcklzQ29tcG9uZW50OiBib29sZWFuKSB7XG4gICAgZGlyUHJvdmlkZXJzLmZvckVhY2goZGlyUHJvdmlkZXIgPT4ge1xuICAgICAgYmQucHVzaChQcm90b0VsZW1lbnRJbmplY3Rvci5fY3JlYXRlUHJvdmlkZXJXaXRoVmlzaWJpbGl0eShcbiAgICAgICAgICBmaXJzdFByb3ZpZGVySXNDb21wb25lbnQsIGRpclByb3ZpZGVyLCBkaXJQcm92aWRlcnMsIGRpclByb3ZpZGVyKSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBfY3JlYXRlUHJvdmlkZXJzV2l0aFZpc2liaWxpdHkoZGlyUHJvdmlkZXJzOiBEaXJlY3RpdmVQcm92aWRlcltdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmQ6IFByb3ZpZGVyV2l0aFZpc2liaWxpdHlbXSkge1xuICAgIHZhciBwcm92aWRlcnNGcm9tQWxsRGlyZWN0aXZlcyA9IFtdO1xuICAgIGRpclByb3ZpZGVycy5mb3JFYWNoKGRpclByb3ZpZGVyID0+IHtcbiAgICAgIHByb3ZpZGVyc0Zyb21BbGxEaXJlY3RpdmVzID1cbiAgICAgICAgICBMaXN0V3JhcHBlci5jb25jYXQocHJvdmlkZXJzRnJvbUFsbERpcmVjdGl2ZXMsIGRpclByb3ZpZGVyLnByb3ZpZGVycyk7XG4gICAgfSk7XG5cbiAgICB2YXIgcmVzb2x2ZWQgPSBJbmplY3Rvci5yZXNvbHZlKHByb3ZpZGVyc0Zyb21BbGxEaXJlY3RpdmVzKTtcbiAgICByZXNvbHZlZC5mb3JFYWNoKGIgPT4gYmQucHVzaChuZXcgUHJvdmlkZXJXaXRoVmlzaWJpbGl0eShiLCBWaXNpYmlsaXR5LlB1YmxpYykpKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9jcmVhdGVQcm92aWRlcldpdGhWaXNpYmlsaXR5KGZpcnN0UHJvdmlkZXJJc0NvbXBvbmVudDogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyUHJvdmlkZXI6IERpcmVjdGl2ZVByb3ZpZGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJQcm92aWRlcnM6IERpcmVjdGl2ZVByb3ZpZGVyW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyOiBSZXNvbHZlZFByb3ZpZGVyKSB7XG4gICAgdmFyIGlzQ29tcG9uZW50ID0gZmlyc3RQcm92aWRlcklzQ29tcG9uZW50ICYmIGRpclByb3ZpZGVyc1swXSA9PT0gZGlyUHJvdmlkZXI7XG4gICAgcmV0dXJuIG5ldyBQcm92aWRlcldpdGhWaXNpYmlsaXR5KFxuICAgICAgICBwcm92aWRlciwgaXNDb21wb25lbnQgPyBWaXNpYmlsaXR5LlB1YmxpY0FuZFByaXZhdGUgOiBWaXNpYmlsaXR5LlB1YmxpYyk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBfY3JlYXRlVmlld1Byb3ZpZGVyc1dpdGhWaXNpYmlsaXR5KGRpclByb3ZpZGVyczogRGlyZWN0aXZlUHJvdmlkZXJbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZDogUHJvdmlkZXJXaXRoVmlzaWJpbGl0eVtdKSB7XG4gICAgdmFyIHJlc29sdmVkVmlld1Byb3ZpZGVycyA9IEluamVjdG9yLnJlc29sdmUoZGlyUHJvdmlkZXJzWzBdLnZpZXdQcm92aWRlcnMpO1xuICAgIHJlc29sdmVkVmlld1Byb3ZpZGVycy5mb3JFYWNoKGIgPT4gYmQucHVzaChuZXcgUHJvdmlkZXJXaXRoVmlzaWJpbGl0eShiLCBWaXNpYmlsaXR5LlByaXZhdGUpKSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHB1YmxpYyBfZmlyc3RQcm92aWRlcklzQ29tcG9uZW50OiBib29sZWFuO1xuXG5cbiAgY29uc3RydWN0b3IocHVibGljIHBhcmVudDogUHJvdG9FbGVtZW50SW5qZWN0b3IsIHB1YmxpYyBpbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICBid3Y6IFByb3ZpZGVyV2l0aFZpc2liaWxpdHlbXSwgcHVibGljIGRpc3RhbmNlVG9QYXJlbnQ6IG51bWJlcixcbiAgICAgICAgICAgICAgX2ZpcnN0UHJvdmlkZXJJc0NvbXBvbmVudDogYm9vbGVhbixcbiAgICAgICAgICAgICAgcHVibGljIGRpcmVjdGl2ZVZhcmlhYmxlQmluZGluZ3M6IE1hcDxzdHJpbmcsIG51bWJlcj4pIHtcbiAgICB0aGlzLl9maXJzdFByb3ZpZGVySXNDb21wb25lbnQgPSBfZmlyc3RQcm92aWRlcklzQ29tcG9uZW50O1xuICAgIHZhciBsZW5ndGggPSBid3YubGVuZ3RoO1xuICAgIHRoaXMucHJvdG9JbmplY3RvciA9IG5ldyBQcm90b0luamVjdG9yKGJ3dik7XG4gICAgdGhpcy5ldmVudEVtaXR0ZXJBY2Nlc3NvcnMgPSBMaXN0V3JhcHBlci5jcmVhdGVGaXhlZFNpemUobGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICB0aGlzLmV2ZW50RW1pdHRlckFjY2Vzc29yc1tpXSA9IF9jcmVhdGVFdmVudEVtaXR0ZXJBY2Nlc3NvcnMoYnd2W2ldKTtcbiAgICB9XG4gICAgdGhpcy5wcm90b1F1ZXJ5UmVmcyA9IF9jcmVhdGVQcm90b1F1ZXJ5UmVmcyhid3YpO1xuICB9XG5cbiAgaW5zdGFudGlhdGUocGFyZW50OiBFbGVtZW50SW5qZWN0b3IpOiBFbGVtZW50SW5qZWN0b3Ige1xuICAgIHJldHVybiBuZXcgRWxlbWVudEluamVjdG9yKHRoaXMsIHBhcmVudCk7XG4gIH1cblxuICBkaXJlY3RQYXJlbnQoKTogUHJvdG9FbGVtZW50SW5qZWN0b3IgeyByZXR1cm4gdGhpcy5kaXN0YW5jZVRvUGFyZW50IDwgMiA/IHRoaXMucGFyZW50IDogbnVsbDsgfVxuXG4gIGdldCBoYXNCaW5kaW5ncygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuZXZlbnRFbWl0dGVyQWNjZXNzb3JzLmxlbmd0aCA+IDA7IH1cblxuICBnZXRQcm92aWRlckF0SW5kZXgoaW5kZXg6IG51bWJlcik6IGFueSB7IHJldHVybiB0aGlzLnByb3RvSW5qZWN0b3IuZ2V0UHJvdmlkZXJBdEluZGV4KGluZGV4KTsgfVxufVxuXG5jbGFzcyBfQ29udGV4dCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50OiBhbnksIHB1YmxpYyBjb21wb25lbnRFbGVtZW50OiBhbnksIHB1YmxpYyBpbmplY3RvcjogYW55KSB7fVxufVxuXG5leHBvcnQgY2xhc3MgRWxlbWVudEluamVjdG9yIGV4dGVuZHMgVHJlZU5vZGU8RWxlbWVudEluamVjdG9yPiBpbXBsZW1lbnRzIERlcGVuZGVuY3lQcm92aWRlcixcbiAgICBBZnRlclZpZXdDaGVja2VkIHtcbiAgcHJpdmF0ZSBfaG9zdDogRWxlbWVudEluamVjdG9yO1xuICBwcml2YXRlIF9wcmVCdWlsdE9iamVjdHM6IFByZUJ1aWx0T2JqZWN0cyA9IG51bGw7XG4gIHByaXZhdGUgX3F1ZXJ5U3RyYXRlZ3k6IF9RdWVyeVN0cmF0ZWd5O1xuXG4gIGh5ZHJhdGVkOiBib29sZWFuO1xuXG4gIHByaXZhdGUgX2luamVjdG9yOiBJbmplY3RvcjtcbiAgcHJpdmF0ZSBfc3RyYXRlZ3k6IF9FbGVtZW50SW5qZWN0b3JTdHJhdGVneTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgX3Byb3RvOiBQcm90b0VsZW1lbnRJbmplY3RvcjtcblxuICBjb25zdHJ1Y3RvcihfcHJvdG86IFByb3RvRWxlbWVudEluamVjdG9yLCBwYXJlbnQ6IEVsZW1lbnRJbmplY3Rvcikge1xuICAgIHN1cGVyKHBhcmVudCk7XG4gICAgdGhpcy5fcHJvdG8gPSBfcHJvdG87XG4gICAgdGhpcy5faW5qZWN0b3IgPVxuICAgICAgICBuZXcgSW5qZWN0b3IodGhpcy5fcHJvdG8ucHJvdG9JbmplY3RvciwgbnVsbCwgdGhpcywgKCkgPT4gdGhpcy5fZGVidWdDb250ZXh0KCkpO1xuXG4gICAgLy8gd2UgY291cGxlIG91cnNlbHZlcyB0byB0aGUgaW5qZWN0b3Igc3RyYXRlZ3kgdG8gYXZvaWQgcG9seW1vcHJoaWMgY2FsbHNcbiAgICB2YXIgaW5qZWN0b3JTdHJhdGVneSA9IDxhbnk+dGhpcy5faW5qZWN0b3IuaW50ZXJuYWxTdHJhdGVneTtcbiAgICB0aGlzLl9zdHJhdGVneSA9IGluamVjdG9yU3RyYXRlZ3kgaW5zdGFuY2VvZiBJbmplY3RvcklubGluZVN0cmF0ZWd5ID9cbiAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRWxlbWVudEluamVjdG9ySW5saW5lU3RyYXRlZ3koaW5qZWN0b3JTdHJhdGVneSwgdGhpcykgOlxuICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFbGVtZW50SW5qZWN0b3JEeW5hbWljU3RyYXRlZ3koaW5qZWN0b3JTdHJhdGVneSwgdGhpcyk7XG5cbiAgICB0aGlzLmh5ZHJhdGVkID0gZmFsc2U7XG5cbiAgICB0aGlzLl9xdWVyeVN0cmF0ZWd5ID0gdGhpcy5fYnVpbGRRdWVyeVN0cmF0ZWd5KCk7XG4gIH1cblxuICBkZWh5ZHJhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5oeWRyYXRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2hvc3QgPSBudWxsO1xuICAgIHRoaXMuX3ByZUJ1aWx0T2JqZWN0cyA9IG51bGw7XG4gICAgdGhpcy5fc3RyYXRlZ3kuY2FsbE9uRGVzdHJveSgpO1xuICAgIHRoaXMuX3N0cmF0ZWd5LmRlaHlkcmF0ZSgpO1xuICAgIHRoaXMuX3F1ZXJ5U3RyYXRlZ3kuZGVoeWRyYXRlKCk7XG4gIH1cblxuICBoeWRyYXRlKGltcGVyYXRpdmVseUNyZWF0ZWRJbmplY3RvcjogSW5qZWN0b3IsIGhvc3Q6IEVsZW1lbnRJbmplY3RvcixcbiAgICAgICAgICBwcmVCdWlsdE9iamVjdHM6IFByZUJ1aWx0T2JqZWN0cyk6IHZvaWQge1xuICAgIHRoaXMuX2hvc3QgPSBob3N0O1xuICAgIHRoaXMuX3ByZUJ1aWx0T2JqZWN0cyA9IHByZUJ1aWx0T2JqZWN0cztcblxuICAgIHRoaXMuX3JlYXR0YWNoSW5qZWN0b3JzKGltcGVyYXRpdmVseUNyZWF0ZWRJbmplY3Rvcik7XG4gICAgdGhpcy5fcXVlcnlTdHJhdGVneS5oeWRyYXRlKCk7XG4gICAgdGhpcy5fc3RyYXRlZ3kuaHlkcmF0ZSgpO1xuXG4gICAgdGhpcy5oeWRyYXRlZCA9IHRydWU7XG4gIH1cblxuICBwcml2YXRlIF9kZWJ1Z0NvbnRleHQoKTogYW55IHtcbiAgICB2YXIgcCA9IHRoaXMuX3ByZUJ1aWx0T2JqZWN0cztcbiAgICB2YXIgaW5kZXggPSBwLmVsZW1lbnRSZWYuYm91bmRFbGVtZW50SW5kZXggLSBwLnZpZXcuZWxlbWVudE9mZnNldDtcbiAgICB2YXIgYyA9IHRoaXMuX3ByZUJ1aWx0T2JqZWN0cy52aWV3LmdldERlYnVnQ29udGV4dChpbmRleCwgbnVsbCk7XG4gICAgcmV0dXJuIGlzUHJlc2VudChjKSA/IG5ldyBfQ29udGV4dChjLmVsZW1lbnQsIGMuY29tcG9uZW50RWxlbWVudCwgYy5pbmplY3RvcikgOiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVhdHRhY2hJbmplY3RvcnMoaW1wZXJhdGl2ZWx5Q3JlYXRlZEluamVjdG9yOiBJbmplY3Rvcik6IHZvaWQge1xuICAgIC8vIER5bmFtaWNhbGx5LWxvYWRlZCBjb21wb25lbnQgaW4gdGhlIHRlbXBsYXRlLiBOb3QgYSByb290IEVsZW1lbnRJbmplY3Rvci5cbiAgICBpZiAoaXNQcmVzZW50KHRoaXMuX3BhcmVudCkpIHtcbiAgICAgIGlmIChpc1ByZXNlbnQoaW1wZXJhdGl2ZWx5Q3JlYXRlZEluamVjdG9yKSkge1xuICAgICAgICAvLyBUaGUgaW1wZXJhdGl2ZSBpbmplY3RvciBpcyBzaW1pbGFyIHRvIGhhdmluZyBhbiBlbGVtZW50IGJldHdlZW5cbiAgICAgICAgLy8gdGhlIGR5bmFtaWMtbG9hZGVkIGNvbXBvbmVudCBhbmQgaXRzIHBhcmVudCA9PiBubyBib3VuZGFyaWVzLlxuICAgICAgICB0aGlzLl9yZWF0dGFjaEluamVjdG9yKHRoaXMuX2luamVjdG9yLCBpbXBlcmF0aXZlbHlDcmVhdGVkSW5qZWN0b3IsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5fcmVhdHRhY2hJbmplY3RvcihpbXBlcmF0aXZlbHlDcmVhdGVkSW5qZWN0b3IsIHRoaXMuX3BhcmVudC5faW5qZWN0b3IsIGZhbHNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3JlYXR0YWNoSW5qZWN0b3IodGhpcy5faW5qZWN0b3IsIHRoaXMuX3BhcmVudC5faW5qZWN0b3IsIGZhbHNlKTtcbiAgICAgIH1cblxuICAgICAgLy8gRHluYW1pY2FsbHktbG9hZGVkIGNvbXBvbmVudCBpbiB0aGUgdGVtcGxhdGUuIEEgcm9vdCBFbGVtZW50SW5qZWN0b3IuXG4gICAgfSBlbHNlIGlmIChpc1ByZXNlbnQodGhpcy5faG9zdCkpIHtcbiAgICAgIC8vIFRoZSBpbXBlcmF0aXZlIGluamVjdG9yIGlzIHNpbWlsYXIgdG8gaGF2aW5nIGFuIGVsZW1lbnQgYmV0d2VlblxuICAgICAgLy8gdGhlIGR5bmFtaWMtbG9hZGVkIGNvbXBvbmVudCBhbmQgaXRzIHBhcmVudCA9PiBubyBib3VuZGFyeSBiZXR3ZWVuXG4gICAgICAvLyB0aGUgY29tcG9uZW50IGFuZCBpbXBlcmF0aXZlbHlDcmVhdGVkSW5qZWN0b3IuXG4gICAgICAvLyBCdXQgc2luY2UgaXQgaXMgYSByb290IEVsZW1lbnRJbmplY3Rvciwgd2UgbmVlZCB0byBjcmVhdGUgYSBib3VuZGFyeVxuICAgICAgLy8gYmV0d2VlbiBpbXBlcmF0aXZlbHlDcmVhdGVkSW5qZWN0b3IgYW5kIF9ob3N0LlxuICAgICAgaWYgKGlzUHJlc2VudChpbXBlcmF0aXZlbHlDcmVhdGVkSW5qZWN0b3IpKSB7XG4gICAgICAgIHRoaXMuX3JlYXR0YWNoSW5qZWN0b3IodGhpcy5faW5qZWN0b3IsIGltcGVyYXRpdmVseUNyZWF0ZWRJbmplY3RvciwgZmFsc2UpO1xuICAgICAgICB0aGlzLl9yZWF0dGFjaEluamVjdG9yKGltcGVyYXRpdmVseUNyZWF0ZWRJbmplY3RvciwgdGhpcy5faG9zdC5faW5qZWN0b3IsIHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcmVhdHRhY2hJbmplY3Rvcih0aGlzLl9pbmplY3RvciwgdGhpcy5faG9zdC5faW5qZWN0b3IsIHRydWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBCb290c3RyYXBcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGlzUHJlc2VudChpbXBlcmF0aXZlbHlDcmVhdGVkSW5qZWN0b3IpKSB7XG4gICAgICAgIHRoaXMuX3JlYXR0YWNoSW5qZWN0b3IodGhpcy5faW5qZWN0b3IsIGltcGVyYXRpdmVseUNyZWF0ZWRJbmplY3RvciwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVhdHRhY2hJbmplY3RvcihpbmplY3RvcjogSW5qZWN0b3IsIHBhcmVudEluamVjdG9yOiBJbmplY3RvciwgaXNCb3VuZGFyeTogYm9vbGVhbikge1xuICAgIGluamVjdG9yLmludGVybmFsU3RyYXRlZ3kuYXR0YWNoKHBhcmVudEluamVjdG9yLCBpc0JvdW5kYXJ5KTtcbiAgfVxuXG4gIGhhc1ZhcmlhYmxlQmluZGluZyhuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB2YXIgdmIgPSB0aGlzLl9wcm90by5kaXJlY3RpdmVWYXJpYWJsZUJpbmRpbmdzO1xuICAgIHJldHVybiBpc1ByZXNlbnQodmIpICYmIHZiLmhhcyhuYW1lKTtcbiAgfVxuXG4gIGdldFZhcmlhYmxlQmluZGluZyhuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIHZhciBpbmRleCA9IHRoaXMuX3Byb3RvLmRpcmVjdGl2ZVZhcmlhYmxlQmluZGluZ3MuZ2V0KG5hbWUpO1xuICAgIHJldHVybiBpc1ByZXNlbnQoaW5kZXgpID8gdGhpcy5nZXREaXJlY3RpdmVBdEluZGV4KDxudW1iZXI+aW5kZXgpIDogdGhpcy5nZXRFbGVtZW50UmVmKCk7XG4gIH1cblxuICBnZXQodG9rZW46IGFueSk6IGFueSB7IHJldHVybiB0aGlzLl9pbmplY3Rvci5nZXQodG9rZW4pOyB9XG5cbiAgaGFzRGlyZWN0aXZlKHR5cGU6IFR5cGUpOiBib29sZWFuIHsgcmV0dXJuIGlzUHJlc2VudCh0aGlzLl9pbmplY3Rvci5nZXRPcHRpb25hbCh0eXBlKSk7IH1cblxuICBnZXRFdmVudEVtaXR0ZXJBY2Nlc3NvcnMoKTogRXZlbnRFbWl0dGVyQWNjZXNzb3JbXVtdIHsgcmV0dXJuIHRoaXMuX3Byb3RvLmV2ZW50RW1pdHRlckFjY2Vzc29yczsgfVxuXG4gIGdldERpcmVjdGl2ZVZhcmlhYmxlQmluZGluZ3MoKTogTWFwPHN0cmluZywgbnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMuX3Byb3RvLmRpcmVjdGl2ZVZhcmlhYmxlQmluZGluZ3M7XG4gIH1cblxuICBnZXRDb21wb25lbnQoKTogYW55IHsgcmV0dXJuIHRoaXMuX3N0cmF0ZWd5LmdldENvbXBvbmVudCgpOyB9XG5cbiAgZ2V0SW5qZWN0b3IoKTogSW5qZWN0b3IgeyByZXR1cm4gdGhpcy5faW5qZWN0b3I7IH1cblxuICBnZXRFbGVtZW50UmVmKCk6IEVsZW1lbnRSZWYgeyByZXR1cm4gdGhpcy5fcHJlQnVpbHRPYmplY3RzLmVsZW1lbnRSZWY7IH1cblxuICBnZXRWaWV3Q29udGFpbmVyUmVmKCk6IFZpZXdDb250YWluZXJSZWYge1xuICAgIHJldHVybiBuZXcgVmlld0NvbnRhaW5lclJlZl8odGhpcy5fcHJlQnVpbHRPYmplY3RzLnZpZXdNYW5hZ2VyLCB0aGlzLmdldEVsZW1lbnRSZWYoKSk7XG4gIH1cblxuICBnZXROZXN0ZWRWaWV3KCk6IEFwcFZpZXcgeyByZXR1cm4gdGhpcy5fcHJlQnVpbHRPYmplY3RzLm5lc3RlZFZpZXc7IH1cblxuICBnZXRWaWV3KCk6IEFwcFZpZXcgeyByZXR1cm4gdGhpcy5fcHJlQnVpbHRPYmplY3RzLnZpZXc7IH1cblxuICBkaXJlY3RQYXJlbnQoKTogRWxlbWVudEluamVjdG9yIHsgcmV0dXJuIHRoaXMuX3Byb3RvLmRpc3RhbmNlVG9QYXJlbnQgPCAyID8gdGhpcy5wYXJlbnQgOiBudWxsOyB9XG5cbiAgaXNDb21wb25lbnRLZXkoa2V5OiBLZXkpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX3N0cmF0ZWd5LmlzQ29tcG9uZW50S2V5KGtleSk7IH1cblxuICBnZXREZXBlbmRlbmN5KGluamVjdG9yOiBJbmplY3RvciwgcHJvdmlkZXI6IFJlc29sdmVkUHJvdmlkZXIsIGRlcDogRGVwZW5kZW5jeSk6IGFueSB7XG4gICAgdmFyIGtleTogS2V5ID0gZGVwLmtleTtcblxuICAgIGlmIChwcm92aWRlciBpbnN0YW5jZW9mIERpcmVjdGl2ZVByb3ZpZGVyKSB7XG4gICAgICB2YXIgZGlyRGVwID0gPERpcmVjdGl2ZURlcGVuZGVuY3k+ZGVwO1xuICAgICAgdmFyIGRpclByb3ZpZGVyID0gcHJvdmlkZXI7XG4gICAgICB2YXIgc3RhdGljS2V5cyA9IFN0YXRpY0tleXMuaW5zdGFuY2UoKTtcblxuXG4gICAgICBpZiAoa2V5LmlkID09PSBzdGF0aWNLZXlzLnZpZXdNYW5hZ2VySWQpIHJldHVybiB0aGlzLl9wcmVCdWlsdE9iamVjdHMudmlld01hbmFnZXI7XG5cbiAgICAgIGlmIChpc1ByZXNlbnQoZGlyRGVwLmF0dHJpYnV0ZU5hbWUpKSByZXR1cm4gdGhpcy5fYnVpbGRBdHRyaWJ1dGUoZGlyRGVwKTtcblxuICAgICAgaWYgKGlzUHJlc2VudChkaXJEZXAucXVlcnlEZWNvcmF0b3IpKVxuICAgICAgICByZXR1cm4gdGhpcy5fcXVlcnlTdHJhdGVneS5maW5kUXVlcnkoZGlyRGVwLnF1ZXJ5RGVjb3JhdG9yKS5saXN0O1xuXG4gICAgICBpZiAoZGlyRGVwLmtleS5pZCA9PT0gU3RhdGljS2V5cy5pbnN0YW5jZSgpLmNoYW5nZURldGVjdG9yUmVmSWQpIHtcbiAgICAgICAgLy8gV2UgcHJvdmlkZSB0aGUgY29tcG9uZW50J3MgdmlldyBjaGFuZ2UgZGV0ZWN0b3IgdG8gY29tcG9uZW50cyBhbmRcbiAgICAgICAgLy8gdGhlIHN1cnJvdW5kaW5nIGNvbXBvbmVudCdzIGNoYW5nZSBkZXRlY3RvciB0byBkaXJlY3RpdmVzLlxuICAgICAgICBpZiAoZGlyUHJvdmlkZXIubWV0YWRhdGEgaW5zdGFuY2VvZiBDb21wb25lbnRNZXRhZGF0YSkge1xuICAgICAgICAgIHZhciBjb21wb25lbnRWaWV3ID0gdGhpcy5fcHJlQnVpbHRPYmplY3RzLnZpZXcuZ2V0TmVzdGVkVmlldyhcbiAgICAgICAgICAgICAgdGhpcy5fcHJlQnVpbHRPYmplY3RzLmVsZW1lbnRSZWYuYm91bmRFbGVtZW50SW5kZXgpO1xuICAgICAgICAgIHJldHVybiBjb21wb25lbnRWaWV3LmNoYW5nZURldGVjdG9yLnJlZjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fcHJlQnVpbHRPYmplY3RzLnZpZXcuY2hhbmdlRGV0ZWN0b3IucmVmO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXJEZXAua2V5LmlkID09PSBTdGF0aWNLZXlzLmluc3RhbmNlKCkuZWxlbWVudFJlZklkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEVsZW1lbnRSZWYoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpckRlcC5rZXkuaWQgPT09IFN0YXRpY0tleXMuaW5zdGFuY2UoKS52aWV3Q29udGFpbmVySWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Vmlld0NvbnRhaW5lclJlZigpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlyRGVwLmtleS5pZCA9PT0gU3RhdGljS2V5cy5pbnN0YW5jZSgpLnRlbXBsYXRlUmVmSWQpIHtcbiAgICAgICAgaWYgKGlzQmxhbmsodGhpcy5fcHJlQnVpbHRPYmplY3RzLnRlbXBsYXRlUmVmKSkge1xuICAgICAgICAgIGlmIChkaXJEZXAub3B0aW9uYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRocm93IG5ldyBOb1Byb3ZpZGVyRXJyb3IobnVsbCwgZGlyRGVwLmtleSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3ByZUJ1aWx0T2JqZWN0cy50ZW1wbGF0ZVJlZjtcbiAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAocHJvdmlkZXIgaW5zdGFuY2VvZiBQaXBlUHJvdmlkZXIpIHtcbiAgICAgIGlmIChkZXAua2V5LmlkID09PSBTdGF0aWNLZXlzLmluc3RhbmNlKCkuY2hhbmdlRGV0ZWN0b3JSZWZJZCkge1xuICAgICAgICB2YXIgY29tcG9uZW50VmlldyA9IHRoaXMuX3ByZUJ1aWx0T2JqZWN0cy52aWV3LmdldE5lc3RlZFZpZXcoXG4gICAgICAgICAgICB0aGlzLl9wcmVCdWlsdE9iamVjdHMuZWxlbWVudFJlZi5ib3VuZEVsZW1lbnRJbmRleCk7XG4gICAgICAgIHJldHVybiBjb21wb25lbnRWaWV3LmNoYW5nZURldGVjdG9yLnJlZjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gVU5ERUZJTkVEO1xuICB9XG5cbiAgcHJpdmF0ZSBfYnVpbGRBdHRyaWJ1dGUoZGVwOiBEaXJlY3RpdmVEZXBlbmRlbmN5KTogc3RyaW5nIHtcbiAgICB2YXIgYXR0cmlidXRlcyA9IHRoaXMuX3Byb3RvLmF0dHJpYnV0ZXM7XG4gICAgaWYgKGlzUHJlc2VudChhdHRyaWJ1dGVzKSAmJiBhdHRyaWJ1dGVzLmhhcyhkZXAuYXR0cmlidXRlTmFtZSkpIHtcbiAgICAgIHJldHVybiBhdHRyaWJ1dGVzLmdldChkZXAuYXR0cmlidXRlTmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGFkZERpcmVjdGl2ZXNNYXRjaGluZ1F1ZXJ5KHF1ZXJ5OiBRdWVyeU1ldGFkYXRhLCBsaXN0OiBhbnlbXSk6IHZvaWQge1xuICAgIHZhciB0ZW1wbGF0ZVJlZiA9IGlzQmxhbmsodGhpcy5fcHJlQnVpbHRPYmplY3RzKSA/IG51bGwgOiB0aGlzLl9wcmVCdWlsdE9iamVjdHMudGVtcGxhdGVSZWY7XG4gICAgaWYgKHF1ZXJ5LnNlbGVjdG9yID09PSBUZW1wbGF0ZVJlZiAmJiBpc1ByZXNlbnQodGVtcGxhdGVSZWYpKSB7XG4gICAgICBsaXN0LnB1c2godGVtcGxhdGVSZWYpO1xuICAgIH1cbiAgICB0aGlzLl9zdHJhdGVneS5hZGREaXJlY3RpdmVzTWF0Y2hpbmdRdWVyeShxdWVyeSwgbGlzdCk7XG4gIH1cblxuICBwcml2YXRlIF9idWlsZFF1ZXJ5U3RyYXRlZ3koKTogX1F1ZXJ5U3RyYXRlZ3kge1xuICAgIGlmICh0aGlzLl9wcm90by5wcm90b1F1ZXJ5UmVmcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBfZW1wdHlRdWVyeVN0cmF0ZWd5O1xuICAgIH0gZWxzZSBpZiAodGhpcy5fcHJvdG8ucHJvdG9RdWVyeVJlZnMubGVuZ3RoIDw9XG4gICAgICAgICAgICAgICBJbmxpbmVRdWVyeVN0cmF0ZWd5Lk5VTUJFUl9PRl9TVVBQT1JURURfUVVFUklFUykge1xuICAgICAgcmV0dXJuIG5ldyBJbmxpbmVRdWVyeVN0cmF0ZWd5KHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IER5bmFtaWNRdWVyeVN0cmF0ZWd5KHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIGxpbmsocGFyZW50OiBFbGVtZW50SW5qZWN0b3IpOiB2b2lkIHsgcGFyZW50LmFkZENoaWxkKHRoaXMpOyB9XG5cbiAgdW5saW5rKCk6IHZvaWQgeyB0aGlzLnJlbW92ZSgpOyB9XG5cbiAgZ2V0RGlyZWN0aXZlQXRJbmRleChpbmRleDogbnVtYmVyKTogYW55IHsgcmV0dXJuIHRoaXMuX2luamVjdG9yLmdldEF0KGluZGV4KTsgfVxuXG4gIGhhc0luc3RhbmNlcygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX3Byb3RvLmhhc0JpbmRpbmdzICYmIHRoaXMuaHlkcmF0ZWQ7IH1cblxuICBnZXRIb3N0KCk6IEVsZW1lbnRJbmplY3RvciB7IHJldHVybiB0aGlzLl9ob3N0OyB9XG5cbiAgZ2V0Qm91bmRFbGVtZW50SW5kZXgoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3Byb3RvLmluZGV4OyB9XG5cbiAgZ2V0Um9vdFZpZXdJbmplY3RvcnMoKTogRWxlbWVudEluamVjdG9yW10ge1xuICAgIGlmICghdGhpcy5oeWRyYXRlZCkgcmV0dXJuIFtdO1xuICAgIHZhciB2aWV3ID0gdGhpcy5fcHJlQnVpbHRPYmplY3RzLnZpZXc7XG4gICAgdmFyIG5lc3RlZFZpZXcgPSB2aWV3LmdldE5lc3RlZFZpZXcodmlldy5lbGVtZW50T2Zmc2V0ICsgdGhpcy5nZXRCb3VuZEVsZW1lbnRJbmRleCgpKTtcbiAgICByZXR1cm4gaXNQcmVzZW50KG5lc3RlZFZpZXcpID8gbmVzdGVkVmlldy5yb290RWxlbWVudEluamVjdG9ycyA6IFtdO1xuICB9XG5cbiAgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQgeyB0aGlzLl9xdWVyeVN0cmF0ZWd5LnVwZGF0ZVZpZXdRdWVyaWVzKCk7IH1cblxuICBuZ0FmdGVyQ29udGVudENoZWNrZWQoKTogdm9pZCB7IHRoaXMuX3F1ZXJ5U3RyYXRlZ3kudXBkYXRlQ29udGVudFF1ZXJpZXMoKTsgfVxuXG4gIHRyYXZlcnNlQW5kU2V0UXVlcmllc0FzRGlydHkoKTogdm9pZCB7XG4gICAgdmFyIGluajogRWxlbWVudEluamVjdG9yID0gdGhpcztcbiAgICB3aGlsZSAoaXNQcmVzZW50KGluaikpIHtcbiAgICAgIGluai5fc2V0UXVlcmllc0FzRGlydHkoKTtcbiAgICAgIGluaiA9IGluai5wYXJlbnQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2V0UXVlcmllc0FzRGlydHkoKTogdm9pZCB7XG4gICAgdGhpcy5fcXVlcnlTdHJhdGVneS5zZXRDb250ZW50UXVlcmllc0FzRGlydHkoKTtcbiAgICBpZiAoaXNQcmVzZW50KHRoaXMuX2hvc3QpKSB0aGlzLl9ob3N0Ll9xdWVyeVN0cmF0ZWd5LnNldFZpZXdRdWVyaWVzQXNEaXJ0eSgpO1xuICB9XG59XG5cbmludGVyZmFjZSBfUXVlcnlTdHJhdGVneSB7XG4gIHNldENvbnRlbnRRdWVyaWVzQXNEaXJ0eSgpOiB2b2lkO1xuICBzZXRWaWV3UXVlcmllc0FzRGlydHkoKTogdm9pZDtcbiAgaHlkcmF0ZSgpOiB2b2lkO1xuICBkZWh5ZHJhdGUoKTogdm9pZDtcbiAgdXBkYXRlQ29udGVudFF1ZXJpZXMoKTogdm9pZDtcbiAgdXBkYXRlVmlld1F1ZXJpZXMoKTogdm9pZDtcbiAgZmluZFF1ZXJ5KHF1ZXJ5OiBRdWVyeU1ldGFkYXRhKTogUXVlcnlSZWY7XG59XG5cbmNsYXNzIF9FbXB0eVF1ZXJ5U3RyYXRlZ3kgaW1wbGVtZW50cyBfUXVlcnlTdHJhdGVneSB7XG4gIHNldENvbnRlbnRRdWVyaWVzQXNEaXJ0eSgpOiB2b2lkIHt9XG4gIHNldFZpZXdRdWVyaWVzQXNEaXJ0eSgpOiB2b2lkIHt9XG4gIGh5ZHJhdGUoKTogdm9pZCB7fVxuICBkZWh5ZHJhdGUoKTogdm9pZCB7fVxuICB1cGRhdGVDb250ZW50UXVlcmllcygpOiB2b2lkIHt9XG4gIHVwZGF0ZVZpZXdRdWVyaWVzKCk6IHZvaWQge31cbiAgZmluZFF1ZXJ5KHF1ZXJ5OiBRdWVyeU1ldGFkYXRhKTogUXVlcnlSZWYge1xuICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBDYW5ub3QgZmluZCBxdWVyeSBmb3IgZGlyZWN0aXZlICR7cXVlcnl9LmApO1xuICB9XG59XG5cbnZhciBfZW1wdHlRdWVyeVN0cmF0ZWd5ID0gbmV3IF9FbXB0eVF1ZXJ5U3RyYXRlZ3koKTtcblxuY2xhc3MgSW5saW5lUXVlcnlTdHJhdGVneSBpbXBsZW1lbnRzIF9RdWVyeVN0cmF0ZWd5IHtcbiAgc3RhdGljIE5VTUJFUl9PRl9TVVBQT1JURURfUVVFUklFUyA9IDM7XG5cbiAgcXVlcnkwOiBRdWVyeVJlZjtcbiAgcXVlcnkxOiBRdWVyeVJlZjtcbiAgcXVlcnkyOiBRdWVyeVJlZjtcblxuICBjb25zdHJ1Y3RvcihlaTogRWxlbWVudEluamVjdG9yKSB7XG4gICAgdmFyIHByb3RvUmVmcyA9IGVpLl9wcm90by5wcm90b1F1ZXJ5UmVmcztcbiAgICBpZiAocHJvdG9SZWZzLmxlbmd0aCA+IDApIHRoaXMucXVlcnkwID0gbmV3IFF1ZXJ5UmVmKHByb3RvUmVmc1swXSwgZWkpO1xuICAgIGlmIChwcm90b1JlZnMubGVuZ3RoID4gMSkgdGhpcy5xdWVyeTEgPSBuZXcgUXVlcnlSZWYocHJvdG9SZWZzWzFdLCBlaSk7XG4gICAgaWYgKHByb3RvUmVmcy5sZW5ndGggPiAyKSB0aGlzLnF1ZXJ5MiA9IG5ldyBRdWVyeVJlZihwcm90b1JlZnNbMl0sIGVpKTtcbiAgfVxuXG4gIHNldENvbnRlbnRRdWVyaWVzQXNEaXJ0eSgpOiB2b2lkIHtcbiAgICBpZiAoaXNQcmVzZW50KHRoaXMucXVlcnkwKSAmJiAhdGhpcy5xdWVyeTAuaXNWaWV3UXVlcnkpIHRoaXMucXVlcnkwLmRpcnR5ID0gdHJ1ZTtcbiAgICBpZiAoaXNQcmVzZW50KHRoaXMucXVlcnkxKSAmJiAhdGhpcy5xdWVyeTEuaXNWaWV3UXVlcnkpIHRoaXMucXVlcnkxLmRpcnR5ID0gdHJ1ZTtcbiAgICBpZiAoaXNQcmVzZW50KHRoaXMucXVlcnkyKSAmJiAhdGhpcy5xdWVyeTIuaXNWaWV3UXVlcnkpIHRoaXMucXVlcnkyLmRpcnR5ID0gdHJ1ZTtcbiAgfVxuXG4gIHNldFZpZXdRdWVyaWVzQXNEaXJ0eSgpOiB2b2lkIHtcbiAgICBpZiAoaXNQcmVzZW50KHRoaXMucXVlcnkwKSAmJiB0aGlzLnF1ZXJ5MC5pc1ZpZXdRdWVyeSkgdGhpcy5xdWVyeTAuZGlydHkgPSB0cnVlO1xuICAgIGlmIChpc1ByZXNlbnQodGhpcy5xdWVyeTEpICYmIHRoaXMucXVlcnkxLmlzVmlld1F1ZXJ5KSB0aGlzLnF1ZXJ5MS5kaXJ0eSA9IHRydWU7XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLnF1ZXJ5MikgJiYgdGhpcy5xdWVyeTIuaXNWaWV3UXVlcnkpIHRoaXMucXVlcnkyLmRpcnR5ID0gdHJ1ZTtcbiAgfVxuXG4gIGh5ZHJhdGUoKTogdm9pZCB7XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLnF1ZXJ5MCkpIHRoaXMucXVlcnkwLmh5ZHJhdGUoKTtcbiAgICBpZiAoaXNQcmVzZW50KHRoaXMucXVlcnkxKSkgdGhpcy5xdWVyeTEuaHlkcmF0ZSgpO1xuICAgIGlmIChpc1ByZXNlbnQodGhpcy5xdWVyeTIpKSB0aGlzLnF1ZXJ5Mi5oeWRyYXRlKCk7XG4gIH1cblxuICBkZWh5ZHJhdGUoKTogdm9pZCB7XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLnF1ZXJ5MCkpIHRoaXMucXVlcnkwLmRlaHlkcmF0ZSgpO1xuICAgIGlmIChpc1ByZXNlbnQodGhpcy5xdWVyeTEpKSB0aGlzLnF1ZXJ5MS5kZWh5ZHJhdGUoKTtcbiAgICBpZiAoaXNQcmVzZW50KHRoaXMucXVlcnkyKSkgdGhpcy5xdWVyeTIuZGVoeWRyYXRlKCk7XG4gIH1cblxuICB1cGRhdGVDb250ZW50UXVlcmllcygpIHtcbiAgICBpZiAoaXNQcmVzZW50KHRoaXMucXVlcnkwKSAmJiAhdGhpcy5xdWVyeTAuaXNWaWV3UXVlcnkpIHtcbiAgICAgIHRoaXMucXVlcnkwLnVwZGF0ZSgpO1xuICAgIH1cbiAgICBpZiAoaXNQcmVzZW50KHRoaXMucXVlcnkxKSAmJiAhdGhpcy5xdWVyeTEuaXNWaWV3UXVlcnkpIHtcbiAgICAgIHRoaXMucXVlcnkxLnVwZGF0ZSgpO1xuICAgIH1cbiAgICBpZiAoaXNQcmVzZW50KHRoaXMucXVlcnkyKSAmJiAhdGhpcy5xdWVyeTIuaXNWaWV3UXVlcnkpIHtcbiAgICAgIHRoaXMucXVlcnkyLnVwZGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVZpZXdRdWVyaWVzKCkge1xuICAgIGlmIChpc1ByZXNlbnQodGhpcy5xdWVyeTApICYmIHRoaXMucXVlcnkwLmlzVmlld1F1ZXJ5KSB7XG4gICAgICB0aGlzLnF1ZXJ5MC51cGRhdGUoKTtcbiAgICB9XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLnF1ZXJ5MSkgJiYgdGhpcy5xdWVyeTEuaXNWaWV3UXVlcnkpIHtcbiAgICAgIHRoaXMucXVlcnkxLnVwZGF0ZSgpO1xuICAgIH1cbiAgICBpZiAoaXNQcmVzZW50KHRoaXMucXVlcnkyKSAmJiB0aGlzLnF1ZXJ5Mi5pc1ZpZXdRdWVyeSkge1xuICAgICAgdGhpcy5xdWVyeTIudXBkYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgZmluZFF1ZXJ5KHF1ZXJ5OiBRdWVyeU1ldGFkYXRhKTogUXVlcnlSZWYge1xuICAgIGlmIChpc1ByZXNlbnQodGhpcy5xdWVyeTApICYmIHRoaXMucXVlcnkwLnByb3RvUXVlcnlSZWYucXVlcnkgPT09IHF1ZXJ5KSB7XG4gICAgICByZXR1cm4gdGhpcy5xdWVyeTA7XG4gICAgfVxuICAgIGlmIChpc1ByZXNlbnQodGhpcy5xdWVyeTEpICYmIHRoaXMucXVlcnkxLnByb3RvUXVlcnlSZWYucXVlcnkgPT09IHF1ZXJ5KSB7XG4gICAgICByZXR1cm4gdGhpcy5xdWVyeTE7XG4gICAgfVxuICAgIGlmIChpc1ByZXNlbnQodGhpcy5xdWVyeTIpICYmIHRoaXMucXVlcnkyLnByb3RvUXVlcnlSZWYucXVlcnkgPT09IHF1ZXJ5KSB7XG4gICAgICByZXR1cm4gdGhpcy5xdWVyeTI7XG4gICAgfVxuICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBDYW5ub3QgZmluZCBxdWVyeSBmb3IgZGlyZWN0aXZlICR7cXVlcnl9LmApO1xuICB9XG59XG5cbmNsYXNzIER5bmFtaWNRdWVyeVN0cmF0ZWd5IGltcGxlbWVudHMgX1F1ZXJ5U3RyYXRlZ3kge1xuICBxdWVyaWVzOiBRdWVyeVJlZltdO1xuXG4gIGNvbnN0cnVjdG9yKGVpOiBFbGVtZW50SW5qZWN0b3IpIHtcbiAgICB0aGlzLnF1ZXJpZXMgPSBlaS5fcHJvdG8ucHJvdG9RdWVyeVJlZnMubWFwKHAgPT4gbmV3IFF1ZXJ5UmVmKHAsIGVpKSk7XG4gIH1cblxuICBzZXRDb250ZW50UXVlcmllc0FzRGlydHkoKTogdm9pZCB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnF1ZXJpZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBxID0gdGhpcy5xdWVyaWVzW2ldO1xuICAgICAgaWYgKCFxLmlzVmlld1F1ZXJ5KSBxLmRpcnR5ID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBzZXRWaWV3UXVlcmllc0FzRGlydHkoKTogdm9pZCB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnF1ZXJpZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBxID0gdGhpcy5xdWVyaWVzW2ldO1xuICAgICAgaWYgKHEuaXNWaWV3UXVlcnkpIHEuZGlydHkgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGh5ZHJhdGUoKTogdm9pZCB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnF1ZXJpZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBxID0gdGhpcy5xdWVyaWVzW2ldO1xuICAgICAgcS5oeWRyYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgZGVoeWRyYXRlKCk6IHZvaWQge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5xdWVyaWVzLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgcSA9IHRoaXMucXVlcmllc1tpXTtcbiAgICAgIHEuZGVoeWRyYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlQ29udGVudFF1ZXJpZXMoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnF1ZXJpZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBxID0gdGhpcy5xdWVyaWVzW2ldO1xuICAgICAgaWYgKCFxLmlzVmlld1F1ZXJ5KSB7XG4gICAgICAgIHEudXBkYXRlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlVmlld1F1ZXJpZXMoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnF1ZXJpZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBxID0gdGhpcy5xdWVyaWVzW2ldO1xuICAgICAgaWYgKHEuaXNWaWV3UXVlcnkpIHtcbiAgICAgICAgcS51cGRhdGUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmaW5kUXVlcnkocXVlcnk6IFF1ZXJ5TWV0YWRhdGEpOiBRdWVyeVJlZiB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnF1ZXJpZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBxID0gdGhpcy5xdWVyaWVzW2ldO1xuICAgICAgaWYgKHEucHJvdG9RdWVyeVJlZi5xdWVyeSA9PT0gcXVlcnkpIHtcbiAgICAgICAgcmV0dXJuIHE7XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBDYW5ub3QgZmluZCBxdWVyeSBmb3IgZGlyZWN0aXZlICR7cXVlcnl9LmApO1xuICB9XG59XG5cbmludGVyZmFjZSBfRWxlbWVudEluamVjdG9yU3RyYXRlZ3kge1xuICBjYWxsT25EZXN0cm95KCk6IHZvaWQ7XG4gIGdldENvbXBvbmVudCgpOiBhbnk7XG4gIGlzQ29tcG9uZW50S2V5KGtleTogS2V5KTogYm9vbGVhbjtcbiAgYWRkRGlyZWN0aXZlc01hdGNoaW5nUXVlcnkocTogUXVlcnlNZXRhZGF0YSwgcmVzOiBhbnlbXSk6IHZvaWQ7XG4gIGh5ZHJhdGUoKTogdm9pZDtcbiAgZGVoeWRyYXRlKCk6IHZvaWQ7XG59XG5cbi8qKlxuICogU3RyYXRlZ3kgdXNlZCBieSB0aGUgYEVsZW1lbnRJbmplY3RvcmAgd2hlbiB0aGUgbnVtYmVyIG9mIHByb3ZpZGVycyBpcyAxMCBvciBsZXNzLlxuICogSW4gc3VjaCBhIGNhc2UsIGlubGluaW5nIGZpZWxkcyBpcyBiZW5lZmljaWFsIGZvciBwZXJmb3JtYW5jZXMuXG4gKi9cbmNsYXNzIEVsZW1lbnRJbmplY3RvcklubGluZVN0cmF0ZWd5IGltcGxlbWVudHMgX0VsZW1lbnRJbmplY3RvclN0cmF0ZWd5IHtcbiAgY29uc3RydWN0b3IocHVibGljIGluamVjdG9yU3RyYXRlZ3k6IEluamVjdG9ySW5saW5lU3RyYXRlZ3ksIHB1YmxpYyBfZWk6IEVsZW1lbnRJbmplY3Rvcikge31cblxuICBoeWRyYXRlKCk6IHZvaWQge1xuICAgIHZhciBpID0gdGhpcy5pbmplY3RvclN0cmF0ZWd5O1xuICAgIHZhciBwID0gaS5wcm90b1N0cmF0ZWd5O1xuICAgIGkucmVzZXRDb25zdHJ1Y3Rpb25Db3VudGVyKCk7XG5cbiAgICBpZiAocC5wcm92aWRlcjAgaW5zdGFuY2VvZiBEaXJlY3RpdmVQcm92aWRlciAmJiBpc1ByZXNlbnQocC5rZXlJZDApICYmIGkub2JqMCA9PT0gVU5ERUZJTkVEKVxuICAgICAgaS5vYmowID0gaS5pbnN0YW50aWF0ZVByb3ZpZGVyKHAucHJvdmlkZXIwLCBwLnZpc2liaWxpdHkwKTtcbiAgICBpZiAocC5wcm92aWRlcjEgaW5zdGFuY2VvZiBEaXJlY3RpdmVQcm92aWRlciAmJiBpc1ByZXNlbnQocC5rZXlJZDEpICYmIGkub2JqMSA9PT0gVU5ERUZJTkVEKVxuICAgICAgaS5vYmoxID0gaS5pbnN0YW50aWF0ZVByb3ZpZGVyKHAucHJvdmlkZXIxLCBwLnZpc2liaWxpdHkxKTtcbiAgICBpZiAocC5wcm92aWRlcjIgaW5zdGFuY2VvZiBEaXJlY3RpdmVQcm92aWRlciAmJiBpc1ByZXNlbnQocC5rZXlJZDIpICYmIGkub2JqMiA9PT0gVU5ERUZJTkVEKVxuICAgICAgaS5vYmoyID0gaS5pbnN0YW50aWF0ZVByb3ZpZGVyKHAucHJvdmlkZXIyLCBwLnZpc2liaWxpdHkyKTtcbiAgICBpZiAocC5wcm92aWRlcjMgaW5zdGFuY2VvZiBEaXJlY3RpdmVQcm92aWRlciAmJiBpc1ByZXNlbnQocC5rZXlJZDMpICYmIGkub2JqMyA9PT0gVU5ERUZJTkVEKVxuICAgICAgaS5vYmozID0gaS5pbnN0YW50aWF0ZVByb3ZpZGVyKHAucHJvdmlkZXIzLCBwLnZpc2liaWxpdHkzKTtcbiAgICBpZiAocC5wcm92aWRlcjQgaW5zdGFuY2VvZiBEaXJlY3RpdmVQcm92aWRlciAmJiBpc1ByZXNlbnQocC5rZXlJZDQpICYmIGkub2JqNCA9PT0gVU5ERUZJTkVEKVxuICAgICAgaS5vYmo0ID0gaS5pbnN0YW50aWF0ZVByb3ZpZGVyKHAucHJvdmlkZXI0LCBwLnZpc2liaWxpdHk0KTtcbiAgICBpZiAocC5wcm92aWRlcjUgaW5zdGFuY2VvZiBEaXJlY3RpdmVQcm92aWRlciAmJiBpc1ByZXNlbnQocC5rZXlJZDUpICYmIGkub2JqNSA9PT0gVU5ERUZJTkVEKVxuICAgICAgaS5vYmo1ID0gaS5pbnN0YW50aWF0ZVByb3ZpZGVyKHAucHJvdmlkZXI1LCBwLnZpc2liaWxpdHk1KTtcbiAgICBpZiAocC5wcm92aWRlcjYgaW5zdGFuY2VvZiBEaXJlY3RpdmVQcm92aWRlciAmJiBpc1ByZXNlbnQocC5rZXlJZDYpICYmIGkub2JqNiA9PT0gVU5ERUZJTkVEKVxuICAgICAgaS5vYmo2ID0gaS5pbnN0YW50aWF0ZVByb3ZpZGVyKHAucHJvdmlkZXI2LCBwLnZpc2liaWxpdHk2KTtcbiAgICBpZiAocC5wcm92aWRlcjcgaW5zdGFuY2VvZiBEaXJlY3RpdmVQcm92aWRlciAmJiBpc1ByZXNlbnQocC5rZXlJZDcpICYmIGkub2JqNyA9PT0gVU5ERUZJTkVEKVxuICAgICAgaS5vYmo3ID0gaS5pbnN0YW50aWF0ZVByb3ZpZGVyKHAucHJvdmlkZXI3LCBwLnZpc2liaWxpdHk3KTtcbiAgICBpZiAocC5wcm92aWRlcjggaW5zdGFuY2VvZiBEaXJlY3RpdmVQcm92aWRlciAmJiBpc1ByZXNlbnQocC5rZXlJZDgpICYmIGkub2JqOCA9PT0gVU5ERUZJTkVEKVxuICAgICAgaS5vYmo4ID0gaS5pbnN0YW50aWF0ZVByb3ZpZGVyKHAucHJvdmlkZXI4LCBwLnZpc2liaWxpdHk4KTtcbiAgICBpZiAocC5wcm92aWRlcjkgaW5zdGFuY2VvZiBEaXJlY3RpdmVQcm92aWRlciAmJiBpc1ByZXNlbnQocC5rZXlJZDkpICYmIGkub2JqOSA9PT0gVU5ERUZJTkVEKVxuICAgICAgaS5vYmo5ID0gaS5pbnN0YW50aWF0ZVByb3ZpZGVyKHAucHJvdmlkZXI5LCBwLnZpc2liaWxpdHk5KTtcbiAgfVxuXG4gIGRlaHlkcmF0ZSgpIHtcbiAgICB2YXIgaSA9IHRoaXMuaW5qZWN0b3JTdHJhdGVneTtcblxuICAgIGkub2JqMCA9IFVOREVGSU5FRDtcbiAgICBpLm9iajEgPSBVTkRFRklORUQ7XG4gICAgaS5vYmoyID0gVU5ERUZJTkVEO1xuICAgIGkub2JqMyA9IFVOREVGSU5FRDtcbiAgICBpLm9iajQgPSBVTkRFRklORUQ7XG4gICAgaS5vYmo1ID0gVU5ERUZJTkVEO1xuICAgIGkub2JqNiA9IFVOREVGSU5FRDtcbiAgICBpLm9iajcgPSBVTkRFRklORUQ7XG4gICAgaS5vYmo4ID0gVU5ERUZJTkVEO1xuICAgIGkub2JqOSA9IFVOREVGSU5FRDtcbiAgfVxuXG4gIGNhbGxPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdmFyIGkgPSB0aGlzLmluamVjdG9yU3RyYXRlZ3k7XG4gICAgdmFyIHAgPSBpLnByb3RvU3RyYXRlZ3k7XG5cbiAgICBpZiAocC5wcm92aWRlcjAgaW5zdGFuY2VvZiBEaXJlY3RpdmVQcm92aWRlciAmJlxuICAgICAgICAoPERpcmVjdGl2ZVByb3ZpZGVyPnAucHJvdmlkZXIwKS5jYWxsT25EZXN0cm95KSB7XG4gICAgICBpLm9iajAubmdPbkRlc3Ryb3koKTtcbiAgICB9XG4gICAgaWYgKHAucHJvdmlkZXIxIGluc3RhbmNlb2YgRGlyZWN0aXZlUHJvdmlkZXIgJiZcbiAgICAgICAgKDxEaXJlY3RpdmVQcm92aWRlcj5wLnByb3ZpZGVyMSkuY2FsbE9uRGVzdHJveSkge1xuICAgICAgaS5vYmoxLm5nT25EZXN0cm95KCk7XG4gICAgfVxuICAgIGlmIChwLnByb3ZpZGVyMiBpbnN0YW5jZW9mIERpcmVjdGl2ZVByb3ZpZGVyICYmXG4gICAgICAgICg8RGlyZWN0aXZlUHJvdmlkZXI+cC5wcm92aWRlcjIpLmNhbGxPbkRlc3Ryb3kpIHtcbiAgICAgIGkub2JqMi5uZ09uRGVzdHJveSgpO1xuICAgIH1cbiAgICBpZiAocC5wcm92aWRlcjMgaW5zdGFuY2VvZiBEaXJlY3RpdmVQcm92aWRlciAmJlxuICAgICAgICAoPERpcmVjdGl2ZVByb3ZpZGVyPnAucHJvdmlkZXIzKS5jYWxsT25EZXN0cm95KSB7XG4gICAgICBpLm9iajMubmdPbkRlc3Ryb3koKTtcbiAgICB9XG4gICAgaWYgKHAucHJvdmlkZXI0IGluc3RhbmNlb2YgRGlyZWN0aXZlUHJvdmlkZXIgJiZcbiAgICAgICAgKDxEaXJlY3RpdmVQcm92aWRlcj5wLnByb3ZpZGVyNCkuY2FsbE9uRGVzdHJveSkge1xuICAgICAgaS5vYmo0Lm5nT25EZXN0cm95KCk7XG4gICAgfVxuICAgIGlmIChwLnByb3ZpZGVyNSBpbnN0YW5jZW9mIERpcmVjdGl2ZVByb3ZpZGVyICYmXG4gICAgICAgICg8RGlyZWN0aXZlUHJvdmlkZXI+cC5wcm92aWRlcjUpLmNhbGxPbkRlc3Ryb3kpIHtcbiAgICAgIGkub2JqNS5uZ09uRGVzdHJveSgpO1xuICAgIH1cbiAgICBpZiAocC5wcm92aWRlcjYgaW5zdGFuY2VvZiBEaXJlY3RpdmVQcm92aWRlciAmJlxuICAgICAgICAoPERpcmVjdGl2ZVByb3ZpZGVyPnAucHJvdmlkZXI2KS5jYWxsT25EZXN0cm95KSB7XG4gICAgICBpLm9iajYubmdPbkRlc3Ryb3koKTtcbiAgICB9XG4gICAgaWYgKHAucHJvdmlkZXI3IGluc3RhbmNlb2YgRGlyZWN0aXZlUHJvdmlkZXIgJiZcbiAgICAgICAgKDxEaXJlY3RpdmVQcm92aWRlcj5wLnByb3ZpZGVyNykuY2FsbE9uRGVzdHJveSkge1xuICAgICAgaS5vYmo3Lm5nT25EZXN0cm95KCk7XG4gICAgfVxuICAgIGlmIChwLnByb3ZpZGVyOCBpbnN0YW5jZW9mIERpcmVjdGl2ZVByb3ZpZGVyICYmXG4gICAgICAgICg8RGlyZWN0aXZlUHJvdmlkZXI+cC5wcm92aWRlcjgpLmNhbGxPbkRlc3Ryb3kpIHtcbiAgICAgIGkub2JqOC5uZ09uRGVzdHJveSgpO1xuICAgIH1cbiAgICBpZiAocC5wcm92aWRlcjkgaW5zdGFuY2VvZiBEaXJlY3RpdmVQcm92aWRlciAmJlxuICAgICAgICAoPERpcmVjdGl2ZVByb3ZpZGVyPnAucHJvdmlkZXI5KS5jYWxsT25EZXN0cm95KSB7XG4gICAgICBpLm9iajkubmdPbkRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICBnZXRDb21wb25lbnQoKTogYW55IHsgcmV0dXJuIHRoaXMuaW5qZWN0b3JTdHJhdGVneS5vYmowOyB9XG5cbiAgaXNDb21wb25lbnRLZXkoa2V5OiBLZXkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZWkuX3Byb3RvLl9maXJzdFByb3ZpZGVySXNDb21wb25lbnQgJiYgaXNQcmVzZW50KGtleSkgJiZcbiAgICAgICAgICAga2V5LmlkID09PSB0aGlzLmluamVjdG9yU3RyYXRlZ3kucHJvdG9TdHJhdGVneS5rZXlJZDA7XG4gIH1cblxuICBhZGREaXJlY3RpdmVzTWF0Y2hpbmdRdWVyeShxdWVyeTogUXVlcnlNZXRhZGF0YSwgbGlzdDogYW55W10pOiB2b2lkIHtcbiAgICB2YXIgaSA9IHRoaXMuaW5qZWN0b3JTdHJhdGVneTtcbiAgICB2YXIgcCA9IGkucHJvdG9TdHJhdGVneTtcblxuICAgIGlmIChpc1ByZXNlbnQocC5wcm92aWRlcjApICYmIHAucHJvdmlkZXIwLmtleS50b2tlbiA9PT0gcXVlcnkuc2VsZWN0b3IpIHtcbiAgICAgIGlmIChpLm9iajAgPT09IFVOREVGSU5FRCkgaS5vYmowID0gaS5pbnN0YW50aWF0ZVByb3ZpZGVyKHAucHJvdmlkZXIwLCBwLnZpc2liaWxpdHkwKTtcbiAgICAgIGxpc3QucHVzaChpLm9iajApO1xuICAgIH1cbiAgICBpZiAoaXNQcmVzZW50KHAucHJvdmlkZXIxKSAmJiBwLnByb3ZpZGVyMS5rZXkudG9rZW4gPT09IHF1ZXJ5LnNlbGVjdG9yKSB7XG4gICAgICBpZiAoaS5vYmoxID09PSBVTkRFRklORUQpIGkub2JqMSA9IGkuaW5zdGFudGlhdGVQcm92aWRlcihwLnByb3ZpZGVyMSwgcC52aXNpYmlsaXR5MSk7XG4gICAgICBsaXN0LnB1c2goaS5vYmoxKTtcbiAgICB9XG4gICAgaWYgKGlzUHJlc2VudChwLnByb3ZpZGVyMikgJiYgcC5wcm92aWRlcjIua2V5LnRva2VuID09PSBxdWVyeS5zZWxlY3Rvcikge1xuICAgICAgaWYgKGkub2JqMiA9PT0gVU5ERUZJTkVEKSBpLm9iajIgPSBpLmluc3RhbnRpYXRlUHJvdmlkZXIocC5wcm92aWRlcjIsIHAudmlzaWJpbGl0eTIpO1xuICAgICAgbGlzdC5wdXNoKGkub2JqMik7XG4gICAgfVxuICAgIGlmIChpc1ByZXNlbnQocC5wcm92aWRlcjMpICYmIHAucHJvdmlkZXIzLmtleS50b2tlbiA9PT0gcXVlcnkuc2VsZWN0b3IpIHtcbiAgICAgIGlmIChpLm9iajMgPT09IFVOREVGSU5FRCkgaS5vYmozID0gaS5pbnN0YW50aWF0ZVByb3ZpZGVyKHAucHJvdmlkZXIzLCBwLnZpc2liaWxpdHkzKTtcbiAgICAgIGxpc3QucHVzaChpLm9iajMpO1xuICAgIH1cbiAgICBpZiAoaXNQcmVzZW50KHAucHJvdmlkZXI0KSAmJiBwLnByb3ZpZGVyNC5rZXkudG9rZW4gPT09IHF1ZXJ5LnNlbGVjdG9yKSB7XG4gICAgICBpZiAoaS5vYmo0ID09PSBVTkRFRklORUQpIGkub2JqNCA9IGkuaW5zdGFudGlhdGVQcm92aWRlcihwLnByb3ZpZGVyNCwgcC52aXNpYmlsaXR5NCk7XG4gICAgICBsaXN0LnB1c2goaS5vYmo0KTtcbiAgICB9XG4gICAgaWYgKGlzUHJlc2VudChwLnByb3ZpZGVyNSkgJiYgcC5wcm92aWRlcjUua2V5LnRva2VuID09PSBxdWVyeS5zZWxlY3Rvcikge1xuICAgICAgaWYgKGkub2JqNSA9PT0gVU5ERUZJTkVEKSBpLm9iajUgPSBpLmluc3RhbnRpYXRlUHJvdmlkZXIocC5wcm92aWRlcjUsIHAudmlzaWJpbGl0eTUpO1xuICAgICAgbGlzdC5wdXNoKGkub2JqNSk7XG4gICAgfVxuICAgIGlmIChpc1ByZXNlbnQocC5wcm92aWRlcjYpICYmIHAucHJvdmlkZXI2LmtleS50b2tlbiA9PT0gcXVlcnkuc2VsZWN0b3IpIHtcbiAgICAgIGlmIChpLm9iajYgPT09IFVOREVGSU5FRCkgaS5vYmo2ID0gaS5pbnN0YW50aWF0ZVByb3ZpZGVyKHAucHJvdmlkZXI2LCBwLnZpc2liaWxpdHk2KTtcbiAgICAgIGxpc3QucHVzaChpLm9iajYpO1xuICAgIH1cbiAgICBpZiAoaXNQcmVzZW50KHAucHJvdmlkZXI3KSAmJiBwLnByb3ZpZGVyNy5rZXkudG9rZW4gPT09IHF1ZXJ5LnNlbGVjdG9yKSB7XG4gICAgICBpZiAoaS5vYmo3ID09PSBVTkRFRklORUQpIGkub2JqNyA9IGkuaW5zdGFudGlhdGVQcm92aWRlcihwLnByb3ZpZGVyNywgcC52aXNpYmlsaXR5Nyk7XG4gICAgICBsaXN0LnB1c2goaS5vYmo3KTtcbiAgICB9XG4gICAgaWYgKGlzUHJlc2VudChwLnByb3ZpZGVyOCkgJiYgcC5wcm92aWRlcjgua2V5LnRva2VuID09PSBxdWVyeS5zZWxlY3Rvcikge1xuICAgICAgaWYgKGkub2JqOCA9PT0gVU5ERUZJTkVEKSBpLm9iajggPSBpLmluc3RhbnRpYXRlUHJvdmlkZXIocC5wcm92aWRlcjgsIHAudmlzaWJpbGl0eTgpO1xuICAgICAgbGlzdC5wdXNoKGkub2JqOCk7XG4gICAgfVxuICAgIGlmIChpc1ByZXNlbnQocC5wcm92aWRlcjkpICYmIHAucHJvdmlkZXI5LmtleS50b2tlbiA9PT0gcXVlcnkuc2VsZWN0b3IpIHtcbiAgICAgIGlmIChpLm9iajkgPT09IFVOREVGSU5FRCkgaS5vYmo5ID0gaS5pbnN0YW50aWF0ZVByb3ZpZGVyKHAucHJvdmlkZXI5LCBwLnZpc2liaWxpdHk5KTtcbiAgICAgIGxpc3QucHVzaChpLm9iajkpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFN0cmF0ZWd5IHVzZWQgYnkgdGhlIGBFbGVtZW50SW5qZWN0b3JgIHdoZW4gdGhlIG51bWJlciBvZiBiaW5kaW5ncyBpcyAxMSBvciBtb3JlLlxuICogSW4gc3VjaCBhIGNhc2UsIHRoZXJlIGFyZSB0b28gbWFueSBmaWVsZHMgdG8gaW5saW5lIChzZWUgRWxlbWVudEluamVjdG9ySW5saW5lU3RyYXRlZ3kpLlxuICovXG5jbGFzcyBFbGVtZW50SW5qZWN0b3JEeW5hbWljU3RyYXRlZ3kgaW1wbGVtZW50cyBfRWxlbWVudEluamVjdG9yU3RyYXRlZ3kge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgaW5qZWN0b3JTdHJhdGVneTogSW5qZWN0b3JEeW5hbWljU3RyYXRlZ3ksIHB1YmxpYyBfZWk6IEVsZW1lbnRJbmplY3Rvcikge31cblxuICBoeWRyYXRlKCk6IHZvaWQge1xuICAgIHZhciBpbmogPSB0aGlzLmluamVjdG9yU3RyYXRlZ3k7XG4gICAgdmFyIHAgPSBpbmoucHJvdG9TdHJhdGVneTtcbiAgICBpbmoucmVzZXRDb25zdHJ1Y3Rpb25Db3VudGVyKCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHAua2V5SWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocC5wcm92aWRlcnNbaV0gaW5zdGFuY2VvZiBEaXJlY3RpdmVQcm92aWRlciAmJiBpc1ByZXNlbnQocC5rZXlJZHNbaV0pICYmXG4gICAgICAgICAgaW5qLm9ianNbaV0gPT09IFVOREVGSU5FRCkge1xuICAgICAgICBpbmoub2Jqc1tpXSA9IGluai5pbnN0YW50aWF0ZVByb3ZpZGVyKHAucHJvdmlkZXJzW2ldLCBwLnZpc2liaWxpdGllc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZGVoeWRyYXRlKCk6IHZvaWQge1xuICAgIHZhciBpbmogPSB0aGlzLmluamVjdG9yU3RyYXRlZ3k7XG4gICAgTGlzdFdyYXBwZXIuZmlsbChpbmoub2JqcywgVU5ERUZJTkVEKTtcbiAgfVxuXG4gIGNhbGxPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdmFyIGlzdCA9IHRoaXMuaW5qZWN0b3JTdHJhdGVneTtcbiAgICB2YXIgcCA9IGlzdC5wcm90b1N0cmF0ZWd5O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwLnByb3ZpZGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHAucHJvdmlkZXJzW2ldIGluc3RhbmNlb2YgRGlyZWN0aXZlUHJvdmlkZXIgJiZcbiAgICAgICAgICAoPERpcmVjdGl2ZVByb3ZpZGVyPnAucHJvdmlkZXJzW2ldKS5jYWxsT25EZXN0cm95KSB7XG4gICAgICAgIGlzdC5vYmpzW2ldLm5nT25EZXN0cm95KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0Q29tcG9uZW50KCk6IGFueSB7IHJldHVybiB0aGlzLmluamVjdG9yU3RyYXRlZ3kub2Jqc1swXTsgfVxuXG4gIGlzQ29tcG9uZW50S2V5KGtleTogS2V5KTogYm9vbGVhbiB7XG4gICAgdmFyIHAgPSB0aGlzLmluamVjdG9yU3RyYXRlZ3kucHJvdG9TdHJhdGVneTtcbiAgICByZXR1cm4gdGhpcy5fZWkuX3Byb3RvLl9maXJzdFByb3ZpZGVySXNDb21wb25lbnQgJiYgaXNQcmVzZW50KGtleSkgJiYga2V5LmlkID09PSBwLmtleUlkc1swXTtcbiAgfVxuXG4gIGFkZERpcmVjdGl2ZXNNYXRjaGluZ1F1ZXJ5KHF1ZXJ5OiBRdWVyeU1ldGFkYXRhLCBsaXN0OiBhbnlbXSk6IHZvaWQge1xuICAgIHZhciBpc3QgPSB0aGlzLmluamVjdG9yU3RyYXRlZ3k7XG4gICAgdmFyIHAgPSBpc3QucHJvdG9TdHJhdGVneTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcC5wcm92aWRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChwLnByb3ZpZGVyc1tpXS5rZXkudG9rZW4gPT09IHF1ZXJ5LnNlbGVjdG9yKSB7XG4gICAgICAgIGlmIChpc3Qub2Jqc1tpXSA9PT0gVU5ERUZJTkVEKSB7XG4gICAgICAgICAgaXN0Lm9ianNbaV0gPSBpc3QuaW5zdGFudGlhdGVQcm92aWRlcihwLnByb3ZpZGVyc1tpXSwgcC52aXNpYmlsaXRpZXNbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGxpc3QucHVzaChpc3Qub2Jqc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQcm90b1F1ZXJ5UmVmIHtcbiAgY29uc3RydWN0b3IocHVibGljIGRpckluZGV4OiBudW1iZXIsIHB1YmxpYyBzZXR0ZXI6IFNldHRlckZuLCBwdWJsaWMgcXVlcnk6IFF1ZXJ5TWV0YWRhdGEpIHt9XG5cbiAgZ2V0IHVzZXNQcm9wZXJ0eVN5bnRheCgpOiBib29sZWFuIHsgcmV0dXJuIGlzUHJlc2VudCh0aGlzLnNldHRlcik7IH1cbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXJ5UmVmIHtcbiAgcHVibGljIGxpc3Q6IFF1ZXJ5TGlzdDxhbnk+O1xuICBwdWJsaWMgZGlydHk6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IocHVibGljIHByb3RvUXVlcnlSZWY6IFByb3RvUXVlcnlSZWYsIHByaXZhdGUgb3JpZ2luYXRvcjogRWxlbWVudEluamVjdG9yKSB7fVxuXG4gIGdldCBpc1ZpZXdRdWVyeSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMucHJvdG9RdWVyeVJlZi5xdWVyeS5pc1ZpZXdRdWVyeTsgfVxuXG4gIHVwZGF0ZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICB0aGlzLl91cGRhdGUoKTtcbiAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG5cbiAgICAvLyBUT0RPIGRlbGV0ZSB0aGUgY2hlY2sgb25jZSBvbmx5IGZpZWxkIHF1ZXJpZXMgYXJlIHN1cHBvcnRlZFxuICAgIGlmICh0aGlzLnByb3RvUXVlcnlSZWYudXNlc1Byb3BlcnR5U3ludGF4KSB7XG4gICAgICB2YXIgZGlyID0gdGhpcy5vcmlnaW5hdG9yLmdldERpcmVjdGl2ZUF0SW5kZXgodGhpcy5wcm90b1F1ZXJ5UmVmLmRpckluZGV4KTtcbiAgICAgIGlmICh0aGlzLnByb3RvUXVlcnlSZWYucXVlcnkuZmlyc3QpIHtcbiAgICAgICAgdGhpcy5wcm90b1F1ZXJ5UmVmLnNldHRlcihkaXIsIHRoaXMubGlzdC5sZW5ndGggPiAwID8gdGhpcy5saXN0LmZpcnN0IDogbnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnByb3RvUXVlcnlSZWYuc2V0dGVyKGRpciwgdGhpcy5saXN0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxpc3Qubm90aWZ5T25DaGFuZ2VzKCk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGUoKTogdm9pZCB7XG4gICAgdmFyIGFnZ3JlZ2F0b3IgPSBbXTtcbiAgICBpZiAodGhpcy5wcm90b1F1ZXJ5UmVmLnF1ZXJ5LmlzVmlld1F1ZXJ5KSB7XG4gICAgICB2YXIgdmlldyA9IHRoaXMub3JpZ2luYXRvci5nZXRWaWV3KCk7XG4gICAgICAvLyBpbnRlbnRpb25hbGx5IHNraXBwaW5nIG9yaWdpbmF0b3IgZm9yIHZpZXcgcXVlcmllcy5cbiAgICAgIHZhciBuZXN0ZWRWaWV3ID1cbiAgICAgICAgICB2aWV3LmdldE5lc3RlZFZpZXcodmlldy5lbGVtZW50T2Zmc2V0ICsgdGhpcy5vcmlnaW5hdG9yLmdldEJvdW5kRWxlbWVudEluZGV4KCkpO1xuICAgICAgaWYgKGlzUHJlc2VudChuZXN0ZWRWaWV3KSkgdGhpcy5fdmlzaXRWaWV3KG5lc3RlZFZpZXcsIGFnZ3JlZ2F0b3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl92aXNpdCh0aGlzLm9yaWdpbmF0b3IsIGFnZ3JlZ2F0b3IpO1xuICAgIH1cbiAgICB0aGlzLmxpc3QucmVzZXQoYWdncmVnYXRvcik7XG4gIH07XG5cbiAgcHJpdmF0ZSBfdmlzaXQoaW5qOiBFbGVtZW50SW5qZWN0b3IsIGFnZ3JlZ2F0b3I6IGFueVtdKTogdm9pZCB7XG4gICAgdmFyIHZpZXcgPSBpbmouZ2V0VmlldygpO1xuICAgIHZhciBzdGFydElkeCA9IHZpZXcuZWxlbWVudE9mZnNldCArIGluai5fcHJvdG8uaW5kZXg7XG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0SWR4OyBpIDwgdmlldy5lbGVtZW50T2Zmc2V0ICsgdmlldy5vd25CaW5kZXJzQ291bnQ7IGkrKykge1xuICAgICAgdmFyIGN1ckluaiA9IHZpZXcuZWxlbWVudEluamVjdG9yc1tpXTtcbiAgICAgIGlmIChpc0JsYW5rKGN1ckluaikpIGNvbnRpbnVlO1xuICAgICAgLy8gVGhlIGZpcnN0IGluamVjdG9yIGFmdGVyIGluaiwgdGhhdCBpcyBvdXRzaWRlIHRoZSBzdWJ0cmVlIHJvb3RlZCBhdFxuICAgICAgLy8gaW5qIGhhcyB0byBoYXZlIGEgbnVsbCBwYXJlbnQgb3IgYSBwYXJlbnQgdGhhdCBpcyBhbiBhbmNlc3RvciBvZiBpbmouXG4gICAgICBpZiAoaSA+IHN0YXJ0SWR4ICYmIChpc0JsYW5rKGN1ckluaikgfHwgaXNCbGFuayhjdXJJbmoucGFyZW50KSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlldy5lbGVtZW50T2Zmc2V0ICsgY3VySW5qLnBhcmVudC5fcHJvdG8uaW5kZXggPCBzdGFydElkeCkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5wcm90b1F1ZXJ5UmVmLnF1ZXJ5LmRlc2NlbmRhbnRzICYmXG4gICAgICAgICAgIShjdXJJbmoucGFyZW50ID09IHRoaXMub3JpZ2luYXRvciB8fCBjdXJJbmogPT0gdGhpcy5vcmlnaW5hdG9yKSlcbiAgICAgICAgY29udGludWU7XG5cbiAgICAgIC8vIFdlIHZpc2l0IHRoZSB2aWV3IGNvbnRhaW5lcihWQykgdmlld3MgcmlnaHQgYWZ0ZXIgdGhlIGluamVjdG9yIHRoYXQgY29udGFpbnNcbiAgICAgIC8vIHRoZSBWQy4gVGhlb3JldGljYWxseSwgdGhhdCBtaWdodCBub3QgYmUgdGhlIHJpZ2h0IG9yZGVyIGlmIHRoZXJlIGFyZVxuICAgICAgLy8gY2hpbGQgaW5qZWN0b3JzIG9mIHNhaWQgaW5qZWN0b3IuIE5vdCBjbGVhciB3aGV0aGVyIGlmIHN1Y2ggY2FzZSBjYW5cbiAgICAgIC8vIGV2ZW4gYmUgY29uc3RydWN0ZWQgd2l0aCB0aGUgY3VycmVudCBhcGlzLlxuICAgICAgdGhpcy5fdmlzaXRJbmplY3RvcihjdXJJbmosIGFnZ3JlZ2F0b3IpO1xuICAgICAgdmFyIHZjID0gdmlldy52aWV3Q29udGFpbmVyc1tpXTtcbiAgICAgIGlmIChpc1ByZXNlbnQodmMpKSB0aGlzLl92aXNpdFZpZXdDb250YWluZXIodmMsIGFnZ3JlZ2F0b3IpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3Zpc2l0SW5qZWN0b3IoaW5qOiBFbGVtZW50SW5qZWN0b3IsIGFnZ3JlZ2F0b3I6IGFueVtdKSB7XG4gICAgaWYgKHRoaXMucHJvdG9RdWVyeVJlZi5xdWVyeS5pc1ZhckJpbmRpbmdRdWVyeSkge1xuICAgICAgdGhpcy5fYWdncmVnYXRlVmFyaWFibGVCaW5kaW5nKGluaiwgYWdncmVnYXRvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2FnZ3JlZ2F0ZURpcmVjdGl2ZShpbmosIGFnZ3JlZ2F0b3IpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3Zpc2l0Vmlld0NvbnRhaW5lcih2YzogQXBwVmlld0NvbnRhaW5lciwgYWdncmVnYXRvcjogYW55W10pIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZjLnZpZXdzLmxlbmd0aDsgaisrKSB7XG4gICAgICB0aGlzLl92aXNpdFZpZXcodmMudmlld3Nbal0sIGFnZ3JlZ2F0b3IpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3Zpc2l0Vmlldyh2aWV3OiBBcHBWaWV3LCBhZ2dyZWdhdG9yOiBhbnlbXSkge1xuICAgIGZvciAodmFyIGkgPSB2aWV3LmVsZW1lbnRPZmZzZXQ7IGkgPCB2aWV3LmVsZW1lbnRPZmZzZXQgKyB2aWV3Lm93bkJpbmRlcnNDb3VudDsgaSsrKSB7XG4gICAgICB2YXIgaW5qID0gdmlldy5lbGVtZW50SW5qZWN0b3JzW2ldO1xuICAgICAgaWYgKGlzQmxhbmsoaW5qKSkgY29udGludWU7XG5cbiAgICAgIHRoaXMuX3Zpc2l0SW5qZWN0b3IoaW5qLCBhZ2dyZWdhdG9yKTtcblxuICAgICAgdmFyIHZjID0gdmlldy52aWV3Q29udGFpbmVyc1tpXTtcbiAgICAgIGlmIChpc1ByZXNlbnQodmMpKSB0aGlzLl92aXNpdFZpZXdDb250YWluZXIodmMsIGFnZ3JlZ2F0b3IpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2FnZ3JlZ2F0ZVZhcmlhYmxlQmluZGluZyhpbmo6IEVsZW1lbnRJbmplY3RvciwgYWdncmVnYXRvcjogYW55W10pOiB2b2lkIHtcbiAgICB2YXIgdmIgPSB0aGlzLnByb3RvUXVlcnlSZWYucXVlcnkudmFyQmluZGluZ3M7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2Yi5sZW5ndGg7ICsraSkge1xuICAgICAgaWYgKGluai5oYXNWYXJpYWJsZUJpbmRpbmcodmJbaV0pKSB7XG4gICAgICAgIGFnZ3JlZ2F0b3IucHVzaChpbmouZ2V0VmFyaWFibGVCaW5kaW5nKHZiW2ldKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYWdncmVnYXRlRGlyZWN0aXZlKGluajogRWxlbWVudEluamVjdG9yLCBhZ2dyZWdhdG9yOiBhbnlbXSk6IHZvaWQge1xuICAgIGluai5hZGREaXJlY3RpdmVzTWF0Y2hpbmdRdWVyeSh0aGlzLnByb3RvUXVlcnlSZWYucXVlcnksIGFnZ3JlZ2F0b3IpO1xuICB9XG5cbiAgZGVoeWRyYXRlKCk6IHZvaWQgeyB0aGlzLmxpc3QgPSBudWxsOyB9XG5cbiAgaHlkcmF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmxpc3QgPSBuZXcgUXVlcnlMaXN0PGFueT4oKTtcbiAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL2VsZW1lbnRfaW5qZWN0b3IudHNcbiAqKi8iLCJpbXBvcnQge1xuICBJbmplY3RvcixcbiAgSW5qZWN0LFxuICBQcm92aWRlcixcbiAgSW5qZWN0YWJsZSxcbiAgUmVzb2x2ZWRQcm92aWRlcixcbiAgZm9yd2FyZFJlZlxufSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5pbXBvcnQge2lzUHJlc2VudCwgaXNCbGFua30gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCAqIGFzIHZpZXdNb2R1bGUgZnJvbSAnLi92aWV3JztcbmltcG9ydCB7RWxlbWVudFJlZiwgRWxlbWVudFJlZl99IGZyb20gJy4vZWxlbWVudF9yZWYnO1xuaW1wb3J0IHtQcm90b1ZpZXdSZWYsIFZpZXdSZWYsIEhvc3RWaWV3UmVmLCBpbnRlcm5hbFZpZXcsIGludGVybmFsUHJvdG9WaWV3fSBmcm9tICcuL3ZpZXdfcmVmJztcbmltcG9ydCB7Vmlld0NvbnRhaW5lclJlZn0gZnJvbSAnLi92aWV3X2NvbnRhaW5lcl9yZWYnO1xuaW1wb3J0IHtUZW1wbGF0ZVJlZiwgVGVtcGxhdGVSZWZffSBmcm9tICcuL3RlbXBsYXRlX3JlZic7XG5pbXBvcnQge1xuICBSZW5kZXJlcixcbiAgUmVuZGVyVmlld1JlZixcbiAgUmVuZGVyRnJhZ21lbnRSZWYsXG4gIFJlbmRlclZpZXdXaXRoRnJhZ21lbnRzXG59IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL3JlbmRlci9hcGknO1xuaW1wb3J0IHtBcHBWaWV3TWFuYWdlclV0aWxzfSBmcm9tICcuL3ZpZXdfbWFuYWdlcl91dGlscyc7XG5pbXBvcnQge0FwcFZpZXdQb29sfSBmcm9tICcuL3ZpZXdfcG9vbCc7XG5pbXBvcnQge0FwcFZpZXdMaXN0ZW5lcn0gZnJvbSAnLi92aWV3X2xpc3RlbmVyJztcbmltcG9ydCB7d3RmQ3JlYXRlU2NvcGUsIHd0ZkxlYXZlLCBXdGZTY29wZUZufSBmcm9tICcuLi9wcm9maWxlL3Byb2ZpbGUnO1xuaW1wb3J0IHtQcm90b1ZpZXdGYWN0b3J5fSBmcm9tICcuL3Byb3RvX3ZpZXdfZmFjdG9yeSc7XG5cbi8qKlxuICogU2VydmljZSBleHBvc2luZyBsb3cgbGV2ZWwgQVBJIGZvciBjcmVhdGluZywgbW92aW5nIGFuZCBkZXN0cm95aW5nIFZpZXdzLlxuICpcbiAqIE1vc3QgYXBwbGljYXRpb25zIHNob3VsZCB1c2UgaGlnaGVyLWxldmVsIGFic3RyYWN0aW9ucyBsaWtlIHtAbGluayBEeW5hbWljQ29tcG9uZW50TG9hZGVyfSBhbmRcbiAqIHtAbGluayBWaWV3Q29udGFpbmVyUmVmfSBpbnN0ZWFkLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQXBwVmlld01hbmFnZXIge1xuICAvKipcbiAgICogUmV0dXJucyBhIHtAbGluayBWaWV3Q29udGFpbmVyUmVmfSBvZiB0aGUgVmlldyBDb250YWluZXIgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbi5cbiAgICovXG4gIGFic3RyYWN0IGdldFZpZXdDb250YWluZXIobG9jYXRpb246IEVsZW1lbnRSZWYpOiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgRWxlbWVudFJlZn0gdGhhdCBtYWtlcyB1cCB0aGUgc3BlY2lmaWVkIEhvc3QgVmlldy5cbiAgICovXG4gIGdldEhvc3RFbGVtZW50KGhvc3RWaWV3UmVmOiBIb3N0Vmlld1JlZik6IEVsZW1lbnRSZWYge1xuICAgIHZhciBob3N0VmlldyA9IGludGVybmFsVmlldyg8Vmlld1JlZj5ob3N0Vmlld1JlZik7XG4gICAgaWYgKGhvc3RWaWV3LnByb3RvLnR5cGUgIT09IHZpZXdNb2R1bGUuVmlld1R5cGUuSE9TVCkge1xuICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ1RoaXMgb3BlcmF0aW9uIGlzIG9ubHkgYWxsb3dlZCBvbiBob3N0IHZpZXdzJyk7XG4gICAgfVxuICAgIHJldHVybiBob3N0Vmlldy5lbGVtZW50UmVmc1tob3N0Vmlldy5lbGVtZW50T2Zmc2V0XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2hlcyB0aGUgQ29tcG9uZW50IFZpZXcgb2YgdGhlIENvbXBvbmVudCBzcGVjaWZpZWQgdmlhIGBob3N0TG9jYXRpb25gIGFuZCByZXR1cm5zIHRoZVxuICAgKiB7QGxpbmsgRWxlbWVudFJlZn0gZm9yIHRoZSBFbGVtZW50IGlkZW50aWZpZWQgdmlhIGEgVmFyaWFibGUgTmFtZSBgdmFyaWFibGVOYW1lYC5cbiAgICpcbiAgICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIGBob3N0TG9jYXRpb25gIGlzIG5vdCBhIEhvc3QgRWxlbWVudCBvZiBhIENvbXBvbmVudCwgb3IgaWZcbiAgICogdmFyaWFibGUgYHZhcmlhYmxlTmFtZWAgY291bGRuJ3QgYmUgZm91bmQgaW4gdGhlIENvbXBvbmVudCBWaWV3IG9mIHRoaXMgQ29tcG9uZW50LlxuICAgKi9cbiAgYWJzdHJhY3QgZ2V0TmFtZWRFbGVtZW50SW5Db21wb25lbnRWaWV3KGhvc3RMb2NhdGlvbjogRWxlbWVudFJlZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlTmFtZTogc3RyaW5nKTogRWxlbWVudFJlZjtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29tcG9uZW50IGluc3RhbmNlIGZvciB0aGUgcHJvdmlkZWQgSG9zdCBFbGVtZW50LlxuICAgKi9cbiAgYWJzdHJhY3QgZ2V0Q29tcG9uZW50KGhvc3RMb2NhdGlvbjogRWxlbWVudFJlZik6IGFueTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhIENvbXBvbmVudCBhbmQgYXR0YWNoZXMgaXQgdG8gdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGdsb2JhbCBWaWV3XG4gICAqICh1c3VhbGx5IERPTSBEb2N1bWVudCkgdGhhdCBtYXRjaGVzIHRoZSBjb21wb25lbnQncyBzZWxlY3RvciBvciBgb3ZlcnJpZGVTZWxlY3RvcmAuXG4gICAqXG4gICAqIFRoaXMgYXMgYSBsb3ctbGV2ZWwgd2F5IHRvIGJvb3RzdHJhcCBhbiBhcHBsaWNhdGlvbiBhbmQgdXBncmFkZSBhbiBleGlzdGluZyBFbGVtZW50IHRvIGFcbiAgICogSG9zdCBFbGVtZW50LiBNb3N0IGFwcGxpY2F0aW9ucyBzaG91bGQgdXNlIHtAbGluayBEeW5hbWljQ29tcG9uZW50TG9hZGVyI2xvYWRBc1Jvb3R9IGluc3RlYWQuXG4gICAqXG4gICAqIFRoZSBDb21wb25lbnQgYW5kIGl0cyBWaWV3IGFyZSBjcmVhdGVkIGJhc2VkIG9uIHRoZSBgaG9zdFByb3RvVmlld1JlZmAgd2hpY2ggY2FuIGJlIG9idGFpbmVkXG4gICAqIGJ5IGNvbXBpbGluZyB0aGUgY29tcG9uZW50IHdpdGgge0BsaW5rIENvbXBpbGVyI2NvbXBpbGVJbkhvc3R9LlxuICAgKlxuICAgKiBVc2Uge0BsaW5rIEFwcFZpZXdNYW5hZ2VyI2Rlc3Ryb3lSb290SG9zdFZpZXd9IHRvIGRlc3Ryb3kgdGhlIGNyZWF0ZWQgQ29tcG9uZW50IGFuZCBpdCdzIEhvc3RcbiAgICogVmlldy5cbiAgICpcbiAgICogIyMjIEV4YW1wbGVcbiAgICpcbiAgICogYGBgXG4gICAqIEBuZy5Db21wb25lbnQoe1xuICAgKiAgIHNlbGVjdG9yOiAnY2hpbGQtY29tcG9uZW50J1xuICAgKiB9KVxuICAgKiBAbmcuVmlldyh7XG4gICAqICAgdGVtcGxhdGU6ICdDaGlsZCdcbiAgICogfSlcbiAgICogY2xhc3MgQ2hpbGRDb21wb25lbnQge1xuICAgKlxuICAgKiB9XG4gICAqXG4gICAqIEBuZy5Db21wb25lbnQoe1xuICAgKiAgIHNlbGVjdG9yOiAnbXktYXBwJ1xuICAgKiB9KVxuICAgKiBAbmcuVmlldyh7XG4gICAqICAgdGVtcGxhdGU6IGBcbiAgICogICAgIFBhcmVudCAoPHNvbWUtY29tcG9uZW50Pjwvc29tZS1jb21wb25lbnQ+KVxuICAgKiAgIGBcbiAgICogfSlcbiAgICogY2xhc3MgTXlBcHAgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAgKiAgIHZpZXdSZWY6IG5nLlZpZXdSZWY7XG4gICAqXG4gICAqICAgY29uc3RydWN0b3IocHVibGljIGFwcFZpZXdNYW5hZ2VyOiBuZy5BcHBWaWV3TWFuYWdlciwgY29tcGlsZXI6IG5nLkNvbXBpbGVyKSB7XG4gICAqICAgICBjb21waWxlci5jb21waWxlSW5Ib3N0KENoaWxkQ29tcG9uZW50KS50aGVuKChwcm90b1ZpZXc6IG5nLlByb3RvVmlld1JlZikgPT4ge1xuICAgKiAgICAgICB0aGlzLnZpZXdSZWYgPSBhcHBWaWV3TWFuYWdlci5jcmVhdGVSb290SG9zdFZpZXcocHJvdG9WaWV3LCAnc29tZS1jb21wb25lbnQnLCBudWxsKTtcbiAgICogICAgIH0pXG4gICAqICAgfVxuICAgKlxuICAgKiAgIG5nT25EZXN0cm95KCkge1xuICAgKiAgICAgdGhpcy5hcHBWaWV3TWFuYWdlci5kZXN0cm95Um9vdEhvc3RWaWV3KHRoaXMudmlld1JlZik7XG4gICAqICAgICB0aGlzLnZpZXdSZWYgPSBudWxsO1xuICAgKiAgIH1cbiAgICogfVxuICAgKlxuICAgKiBuZy5ib290c3RyYXAoTXlBcHApO1xuICAgKiBgYGBcbiAgICovXG4gIGFic3RyYWN0IGNyZWF0ZVJvb3RIb3N0Vmlldyhob3N0UHJvdG9WaWV3UmVmOiBQcm90b1ZpZXdSZWYsIG92ZXJyaWRlU2VsZWN0b3I6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdG9yOiBJbmplY3Rvcik6IEhvc3RWaWV3UmVmO1xuXG4gIC8qKlxuICAgKiBEZXN0cm95cyB0aGUgSG9zdCBWaWV3IGNyZWF0ZWQgdmlhIHtAbGluayBBcHBWaWV3TWFuYWdlciNjcmVhdGVSb290SG9zdFZpZXd9LlxuICAgKlxuICAgKiBBbG9uZyB3aXRoIHRoZSBIb3N0IFZpZXcsIHRoZSBDb21wb25lbnQgSW5zdGFuY2UgYXMgd2VsbCBhcyBhbGwgbmVzdGVkIFZpZXcgYW5kIENvbXBvbmVudHMgYXJlXG4gICAqIGRlc3Ryb3llZCBhcyB3ZWxsLlxuICAgKi9cbiAgYWJzdHJhY3QgZGVzdHJveVJvb3RIb3N0Vmlldyhob3N0Vmlld1JlZjogSG9zdFZpZXdSZWYpO1xuXG4gIC8qKlxuICAgKiBJbnN0YW50aWF0ZXMgYW4gRW1iZWRkZWQgVmlldyBiYXNlZCBvbiB0aGUge0BsaW5rIFRlbXBsYXRlUmVmIGB0ZW1wbGF0ZVJlZmB9IGFuZCBpbnNlcnRzIGl0XG4gICAqIGludG8gdGhlIFZpZXcgQ29udGFpbmVyIHNwZWNpZmllZCB2aWEgYHZpZXdDb250YWluZXJMb2NhdGlvbmAgYXQgdGhlIHNwZWNpZmllZCBgaW5kZXhgLlxuICAgKlxuICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVmlld1JlZn0gZm9yIHRoZSBuZXdseSBjcmVhdGVkIFZpZXcuXG4gICAqXG4gICAqIFRoaXMgYXMgYSBsb3ctbGV2ZWwgd2F5IHRvIGNyZWF0ZSBhbmQgYXR0YWNoIGFuIEVtYmVkZGVkIHZpYSB0byBhIFZpZXcgQ29udGFpbmVyLiBNb3N0XG4gICAqIGFwcGxpY2F0aW9ucyBzaG91bGQgdXNlZCB7QGxpbmsgVmlld0NvbnRhaW5lclJlZiNjcmVhdGVFbWJlZGRlZFZpZXd9IGluc3RlYWQuXG4gICAqXG4gICAqIFVzZSB7QGxpbmsgQXBwVmlld01hbmFnZXIjZGVzdHJveVZpZXdJbkNvbnRhaW5lcn0gdG8gZGVzdHJveSB0aGUgY3JlYXRlZCBFbWJlZGRlZCBWaWV3LlxuICAgKi9cbiAgLy8gVE9ETyhpKTogdGhpcyBsb3ctbGV2ZWwgdmVyc2lvbiBvZiBWaWV3Q29udGFpbmVyUmVmI2NyZWF0ZUVtYmVkZGVkVmlldyBkb2Vzbid0IGFkZCBhbnl0aGluZyBuZXdcbiAgLy8gICAgd2Ugc2hvdWxkIG1ha2UgaXQgcHJpdmF0ZSwgb3RoZXJ3aXNlIHdlIGhhdmUgdHdvIGFwaXMgdG8gZG8gdGhlIHNhbWUgdGhpbmcuXG4gIGFic3RyYWN0IGNyZWF0ZUVtYmVkZGVkVmlld0luQ29udGFpbmVyKHZpZXdDb250YWluZXJMb2NhdGlvbjogRWxlbWVudFJlZiwgaW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmKTogVmlld1JlZjtcblxuICAvKipcbiAgICogSW5zdGFudGlhdGVzIGEgc2luZ2xlIHtAbGluayBDb21wb25lbnR9IGFuZCBpbnNlcnRzIGl0cyBIb3N0IFZpZXcgaW50byB0aGUgVmlldyBDb250YWluZXJcbiAgICogZm91bmQgYXQgYHZpZXdDb250YWluZXJMb2NhdGlvbmAuIFdpdGhpbiB0aGUgY29udGFpbmVyLCB0aGUgdmlldyB3aWxsIGJlIGluc2VydGVkIGF0IHBvc2l0aW9uXG4gICAqIHNwZWNpZmllZCB2aWEgYGluZGV4YC5cbiAgICpcbiAgICogVGhlIGNvbXBvbmVudCBpcyBpbnN0YW50aWF0ZWQgdXNpbmcgaXRzIHtAbGluayBQcm90b1ZpZXdSZWYgYHByb3RvVmlld1JlZmB9IHdoaWNoIGNhbiBiZVxuICAgKiBvYnRhaW5lZCB2aWEge0BsaW5rIENvbXBpbGVyI2NvbXBpbGVJbkhvc3R9LlxuICAgKlxuICAgKiBZb3UgY2FuIG9wdGlvbmFsbHkgc3BlY2lmeSBgaW1wZXJhdGl2ZWx5Q3JlYXRlZEluamVjdG9yYCwgd2hpY2ggY29uZmlndXJlIHRoZSB7QGxpbmsgSW5qZWN0b3J9XG4gICAqIHRoYXQgd2lsbCBiZSBjcmVhdGVkIGZvciB0aGUgSG9zdCBWaWV3LlxuICAgKlxuICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgSG9zdFZpZXdSZWZ9IG9mIHRoZSBIb3N0IFZpZXcgY3JlYXRlZCBmb3IgdGhlIG5ld2x5IGluc3RhbnRpYXRlZCBDb21wb25lbnQuXG4gICAqXG4gICAqIFVzZSB7QGxpbmsgQXBwVmlld01hbmFnZXIjZGVzdHJveVZpZXdJbkNvbnRhaW5lcn0gdG8gZGVzdHJveSB0aGUgY3JlYXRlZCBIb3N0IFZpZXcuXG4gICAqL1xuICBhYnN0cmFjdCBjcmVhdGVIb3N0Vmlld0luQ29udGFpbmVyKHZpZXdDb250YWluZXJMb2NhdGlvbjogRWxlbWVudFJlZiwgaW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b1ZpZXdSZWY6IFByb3RvVmlld1JlZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBlcmF0aXZlbHlDcmVhdGVkSW5qZWN0b3I6IFJlc29sdmVkUHJvdmlkZXJbXSk6IEhvc3RWaWV3UmVmO1xuXG4gIC8qKlxuICAgKiBEZXN0cm95cyBhbiBFbWJlZGRlZCBvciBIb3N0IFZpZXcgYXR0YWNoZWQgdG8gYSBWaWV3IENvbnRhaW5lciBhdCB0aGUgc3BlY2lmaWVkIGBpbmRleGAuXG4gICAqXG4gICAqIFRoZSBWaWV3IENvbnRhaW5lciBpcyBsb2NhdGVkIHZpYSBgdmlld0NvbnRhaW5lckxvY2F0aW9uYC5cbiAgICovXG4gIGFic3RyYWN0IGRlc3Ryb3lWaWV3SW5Db250YWluZXIodmlld0NvbnRhaW5lckxvY2F0aW9uOiBFbGVtZW50UmVmLCBpbmRleDogbnVtYmVyKTtcblxuICAvKipcbiAgICpcbiAgICogU2VlIHtAbGluayBBcHBWaWV3TWFuYWdlciNkZXRhY2hWaWV3SW5Db250YWluZXJ9LlxuICAgKi9cbiAgLy8gVE9ETyhpKTogcmVmYWN0b3IgZGV0YWNoVmlld0luQ29udGFpbmVyK2F0dGFjaFZpZXdJbkNvbnRhaW5lciB0byBtb3ZlVmlld0luQ29udGFpbmVyXG4gIGFic3RyYWN0IGF0dGFjaFZpZXdJbkNvbnRhaW5lcih2aWV3Q29udGFpbmVyTG9jYXRpb246IEVsZW1lbnRSZWYsIGluZGV4OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3UmVmOiBWaWV3UmVmKTogVmlld1JlZjtcblxuICAvKipcbiAgICogU2VlIHtAbGluayBBcHBWaWV3TWFuYWdlciNhdHRhY2hWaWV3SW5Db250YWluZXJ9LlxuICAgKi9cbiAgYWJzdHJhY3QgZGV0YWNoVmlld0luQ29udGFpbmVyKHZpZXdDb250YWluZXJMb2NhdGlvbjogRWxlbWVudFJlZiwgaW5kZXg6IG51bWJlcik6IFZpZXdSZWY7XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBBcHBWaWV3TWFuYWdlcl8gZXh0ZW5kcyBBcHBWaWV3TWFuYWdlciB7XG4gIHByaXZhdGUgX3Byb3RvVmlld0ZhY3Rvcnk6IFByb3RvVmlld0ZhY3Rvcnk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfdmlld1Bvb2w6IEFwcFZpZXdQb29sLCBwcml2YXRlIF92aWV3TGlzdGVuZXI6IEFwcFZpZXdMaXN0ZW5lcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfdXRpbHM6IEFwcFZpZXdNYW5hZ2VyVXRpbHMsIHByaXZhdGUgX3JlbmRlcmVyOiBSZW5kZXJlcixcbiAgICAgICAgICAgICAgQEluamVjdChmb3J3YXJkUmVmKCgpID0+IFByb3RvVmlld0ZhY3RvcnkpKSBfcHJvdG9WaWV3RmFjdG9yeSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fcHJvdG9WaWV3RmFjdG9yeSA9IF9wcm90b1ZpZXdGYWN0b3J5O1xuICB9XG5cbiAgZ2V0Vmlld0NvbnRhaW5lcihsb2NhdGlvbjogRWxlbWVudFJlZik6IFZpZXdDb250YWluZXJSZWYge1xuICAgIHZhciBob3N0VmlldyA9IGludGVybmFsVmlldygoPEVsZW1lbnRSZWZfPmxvY2F0aW9uKS5wYXJlbnRWaWV3KTtcbiAgICByZXR1cm4gaG9zdFZpZXcuZWxlbWVudEluamVjdG9yc1soPEVsZW1lbnRSZWZfPmxvY2F0aW9uKS5ib3VuZEVsZW1lbnRJbmRleF1cbiAgICAgICAgLmdldFZpZXdDb250YWluZXJSZWYoKTtcbiAgfVxuXG4gIGdldE5hbWVkRWxlbWVudEluQ29tcG9uZW50Vmlldyhob3N0TG9jYXRpb246IEVsZW1lbnRSZWYsIHZhcmlhYmxlTmFtZTogc3RyaW5nKTogRWxlbWVudFJlZiB7XG4gICAgdmFyIGhvc3RWaWV3ID0gaW50ZXJuYWxWaWV3KCg8RWxlbWVudFJlZl8+aG9zdExvY2F0aW9uKS5wYXJlbnRWaWV3KTtcbiAgICB2YXIgYm91bmRFbGVtZW50SW5kZXggPSAoPEVsZW1lbnRSZWZfPmhvc3RMb2NhdGlvbikuYm91bmRFbGVtZW50SW5kZXg7XG4gICAgdmFyIGNvbXBvbmVudFZpZXcgPSBob3N0Vmlldy5nZXROZXN0ZWRWaWV3KGJvdW5kRWxlbWVudEluZGV4KTtcbiAgICBpZiAoaXNCbGFuayhjb21wb25lbnRWaWV3KSkge1xuICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYFRoZXJlIGlzIG5vIGNvbXBvbmVudCBkaXJlY3RpdmUgYXQgZWxlbWVudCAke2JvdW5kRWxlbWVudEluZGV4fWApO1xuICAgIH1cbiAgICB2YXIgYmluZGVySWR4ID0gY29tcG9uZW50Vmlldy5wcm90by52YXJpYWJsZUxvY2F0aW9ucy5nZXQodmFyaWFibGVOYW1lKTtcbiAgICBpZiAoaXNCbGFuayhiaW5kZXJJZHgpKSB7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgQ291bGQgbm90IGZpbmQgdmFyaWFibGUgJHt2YXJpYWJsZU5hbWV9YCk7XG4gICAgfVxuICAgIHJldHVybiBjb21wb25lbnRWaWV3LmVsZW1lbnRSZWZzW2NvbXBvbmVudFZpZXcuZWxlbWVudE9mZnNldCArIGJpbmRlcklkeF07XG4gIH1cblxuICBnZXRDb21wb25lbnQoaG9zdExvY2F0aW9uOiBFbGVtZW50UmVmKTogYW55IHtcbiAgICB2YXIgaG9zdFZpZXcgPSBpbnRlcm5hbFZpZXcoKDxFbGVtZW50UmVmXz5ob3N0TG9jYXRpb24pLnBhcmVudFZpZXcpO1xuICAgIHZhciBib3VuZEVsZW1lbnRJbmRleCA9ICg8RWxlbWVudFJlZl8+aG9zdExvY2F0aW9uKS5ib3VuZEVsZW1lbnRJbmRleDtcbiAgICByZXR1cm4gdGhpcy5fdXRpbHMuZ2V0Q29tcG9uZW50SW5zdGFuY2UoaG9zdFZpZXcsIGJvdW5kRWxlbWVudEluZGV4KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2NyZWF0ZVJvb3RIb3N0Vmlld1Njb3BlOiBXdGZTY29wZUZuID0gd3RmQ3JlYXRlU2NvcGUoJ0FwcFZpZXdNYW5hZ2VyI2NyZWF0ZVJvb3RIb3N0VmlldygpJyk7XG5cbiAgY3JlYXRlUm9vdEhvc3RWaWV3KGhvc3RQcm90b1ZpZXdSZWY6IFByb3RvVmlld1JlZiwgb3ZlcnJpZGVTZWxlY3Rvcjogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgaW5qZWN0b3I6IEluamVjdG9yKTogSG9zdFZpZXdSZWYge1xuICAgIHZhciBzID0gdGhpcy5fY3JlYXRlUm9vdEhvc3RWaWV3U2NvcGUoKTtcbiAgICB2YXIgaG9zdFByb3RvVmlldzogdmlld01vZHVsZS5BcHBQcm90b1ZpZXcgPSBpbnRlcm5hbFByb3RvVmlldyhob3N0UHJvdG9WaWV3UmVmKTtcbiAgICB0aGlzLl9wcm90b1ZpZXdGYWN0b3J5LmluaXRpYWxpemVQcm90b1ZpZXdJZk5lZWRlZChob3N0UHJvdG9WaWV3KTtcbiAgICB2YXIgaG9zdEVsZW1lbnRTZWxlY3RvciA9IG92ZXJyaWRlU2VsZWN0b3I7XG4gICAgaWYgKGlzQmxhbmsoaG9zdEVsZW1lbnRTZWxlY3RvcikpIHtcbiAgICAgIGhvc3RFbGVtZW50U2VsZWN0b3IgPSBob3N0UHJvdG9WaWV3LmVsZW1lbnRCaW5kZXJzWzBdLmNvbXBvbmVudERpcmVjdGl2ZS5tZXRhZGF0YS5zZWxlY3RvcjtcbiAgICB9XG4gICAgdmFyIHJlbmRlclZpZXdXaXRoRnJhZ21lbnRzID0gdGhpcy5fcmVuZGVyZXIuY3JlYXRlUm9vdEhvc3RWaWV3KFxuICAgICAgICBob3N0UHJvdG9WaWV3LnJlbmRlciwgaG9zdFByb3RvVmlldy5tZXJnZUluZm8uZW1iZWRkZWRWaWV3Q291bnQgKyAxLCBob3N0RWxlbWVudFNlbGVjdG9yKTtcbiAgICB2YXIgaG9zdFZpZXcgPSB0aGlzLl9jcmVhdGVNYWluVmlldyhob3N0UHJvdG9WaWV3LCByZW5kZXJWaWV3V2l0aEZyYWdtZW50cyk7XG5cbiAgICB0aGlzLl9yZW5kZXJlci5oeWRyYXRlVmlldyhob3N0Vmlldy5yZW5kZXIpO1xuICAgIHRoaXMuX3V0aWxzLmh5ZHJhdGVSb290SG9zdFZpZXcoaG9zdFZpZXcsIGluamVjdG9yKTtcbiAgICByZXR1cm4gd3RmTGVhdmUocywgaG9zdFZpZXcucmVmKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2Rlc3Ryb3lSb290SG9zdFZpZXdTY29wZTogV3RmU2NvcGVGbiA9IHd0ZkNyZWF0ZVNjb3BlKCdBcHBWaWV3TWFuYWdlciNkZXN0cm95Um9vdEhvc3RWaWV3KCknKTtcblxuICBkZXN0cm95Um9vdEhvc3RWaWV3KGhvc3RWaWV3UmVmOiBIb3N0Vmlld1JlZikge1xuICAgIC8vIE5vdGU6IERvbid0IHB1dCB0aGUgaG9zdFZpZXcgaW50byB0aGUgdmlldyBwb29sXG4gICAgLy8gYXMgaXQgaXMgZGVwZW5kaW5nIG9uIHRoZSBlbGVtZW50IGZvciB3aGljaCBpdCB3YXMgY3JlYXRlZC5cbiAgICB2YXIgcyA9IHRoaXMuX2Rlc3Ryb3lSb290SG9zdFZpZXdTY29wZSgpO1xuICAgIHZhciBob3N0VmlldyA9IGludGVybmFsVmlldyg8Vmlld1JlZj5ob3N0Vmlld1JlZik7XG4gICAgdGhpcy5fcmVuZGVyZXIuZGV0YWNoRnJhZ21lbnQoaG9zdFZpZXcucmVuZGVyRnJhZ21lbnQpO1xuICAgIHRoaXMuX3JlbmRlcmVyLmRlaHlkcmF0ZVZpZXcoaG9zdFZpZXcucmVuZGVyKTtcbiAgICB0aGlzLl92aWV3RGVoeWRyYXRlUmVjdXJzZShob3N0Vmlldyk7XG4gICAgdGhpcy5fdmlld0xpc3RlbmVyLm9uVmlld0Rlc3Ryb3llZChob3N0Vmlldyk7XG4gICAgdGhpcy5fcmVuZGVyZXIuZGVzdHJveVZpZXcoaG9zdFZpZXcucmVuZGVyKTtcbiAgICB3dGZMZWF2ZShzKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2NyZWF0ZUVtYmVkZGVkVmlld0luQ29udGFpbmVyU2NvcGU6IFd0ZlNjb3BlRm4gPVxuICAgICAgd3RmQ3JlYXRlU2NvcGUoJ0FwcFZpZXdNYW5hZ2VyI2NyZWF0ZUVtYmVkZGVkVmlld0luQ29udGFpbmVyKCknKTtcblxuICBjcmVhdGVFbWJlZGRlZFZpZXdJbkNvbnRhaW5lcih2aWV3Q29udGFpbmVyTG9jYXRpb246IEVsZW1lbnRSZWYsIGluZGV4OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZik6IFZpZXdSZWYge1xuICAgIHZhciBzID0gdGhpcy5fY3JlYXRlRW1iZWRkZWRWaWV3SW5Db250YWluZXJTY29wZSgpO1xuICAgIHZhciBwcm90b1ZpZXcgPSBpbnRlcm5hbFByb3RvVmlldygoPFRlbXBsYXRlUmVmXz50ZW1wbGF0ZVJlZikucHJvdG9WaWV3UmVmKTtcbiAgICBpZiAocHJvdG9WaWV3LnR5cGUgIT09IHZpZXdNb2R1bGUuVmlld1R5cGUuRU1CRURERUQpIHtcbiAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdUaGlzIG1ldGhvZCBjYW4gb25seSBiZSBjYWxsZWQgd2l0aCBlbWJlZGRlZCBQcm90b1ZpZXdzIScpO1xuICAgIH1cbiAgICB0aGlzLl9wcm90b1ZpZXdGYWN0b3J5LmluaXRpYWxpemVQcm90b1ZpZXdJZk5lZWRlZChwcm90b1ZpZXcpO1xuICAgIHJldHVybiB3dGZMZWF2ZShzLCB0aGlzLl9jcmVhdGVWaWV3SW5Db250YWluZXIodmlld0NvbnRhaW5lckxvY2F0aW9uLCBpbmRleCwgcHJvdG9WaWV3LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVSZWYuZWxlbWVudFJlZiwgbnVsbCkpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfY3JlYXRlSG9zdFZpZXdJbkNvbnRhaW5lclNjb3BlOiBXdGZTY29wZUZuID1cbiAgICAgIHd0ZkNyZWF0ZVNjb3BlKCdBcHBWaWV3TWFuYWdlciNjcmVhdGVIb3N0Vmlld0luQ29udGFpbmVyKCknKTtcblxuICBjcmVhdGVIb3N0Vmlld0luQ29udGFpbmVyKHZpZXdDb250YWluZXJMb2NhdGlvbjogRWxlbWVudFJlZiwgaW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b1ZpZXdSZWY6IFByb3RvVmlld1JlZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBlcmF0aXZlbHlDcmVhdGVkSW5qZWN0b3I6IFJlc29sdmVkUHJvdmlkZXJbXSk6IEhvc3RWaWV3UmVmIHtcbiAgICB2YXIgcyA9IHRoaXMuX2NyZWF0ZUhvc3RWaWV3SW5Db250YWluZXJTY29wZSgpO1xuICAgIHZhciBwcm90b1ZpZXcgPSBpbnRlcm5hbFByb3RvVmlldyhwcm90b1ZpZXdSZWYpO1xuICAgIGlmIChwcm90b1ZpZXcudHlwZSAhPT0gdmlld01vZHVsZS5WaWV3VHlwZS5IT1NUKSB7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignVGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgY2FsbGVkIHdpdGggaG9zdCBQcm90b1ZpZXdzIScpO1xuICAgIH1cbiAgICB0aGlzLl9wcm90b1ZpZXdGYWN0b3J5LmluaXRpYWxpemVQcm90b1ZpZXdJZk5lZWRlZChwcm90b1ZpZXcpO1xuICAgIHJldHVybiB3dGZMZWF2ZShcbiAgICAgICAgcywgdGhpcy5fY3JlYXRlVmlld0luQ29udGFpbmVyKHZpZXdDb250YWluZXJMb2NhdGlvbiwgaW5kZXgsIHByb3RvVmlldyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdDb250YWluZXJMb2NhdGlvbiwgaW1wZXJhdGl2ZWx5Q3JlYXRlZEluamVjdG9yKSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogU2VlIHtAbGluayBBcHBWaWV3TWFuYWdlciNkZXN0cm95Vmlld0luQ29udGFpbmVyfS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBfY3JlYXRlVmlld0luQ29udGFpbmVyKHZpZXdDb250YWluZXJMb2NhdGlvbjogRWxlbWVudFJlZiwgaW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b1ZpZXc6IHZpZXdNb2R1bGUuQXBwUHJvdG9WaWV3LCBjb250ZXh0OiBFbGVtZW50UmVmLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGltcGVyYXRpdmVseUNyZWF0ZWRJbmplY3RvcjogUmVzb2x2ZWRQcm92aWRlcltdKTogVmlld1JlZiB7XG4gICAgdmFyIHBhcmVudFZpZXcgPSBpbnRlcm5hbFZpZXcoKDxFbGVtZW50UmVmXz52aWV3Q29udGFpbmVyTG9jYXRpb24pLnBhcmVudFZpZXcpO1xuICAgIHZhciBib3VuZEVsZW1lbnRJbmRleCA9ICg8RWxlbWVudFJlZl8+dmlld0NvbnRhaW5lckxvY2F0aW9uKS5ib3VuZEVsZW1lbnRJbmRleDtcbiAgICB2YXIgY29udGV4dFZpZXcgPSBpbnRlcm5hbFZpZXcoKDxFbGVtZW50UmVmXz5jb250ZXh0KS5wYXJlbnRWaWV3KTtcbiAgICB2YXIgY29udGV4dEJvdW5kRWxlbWVudEluZGV4ID0gKDxFbGVtZW50UmVmXz5jb250ZXh0KS5ib3VuZEVsZW1lbnRJbmRleDtcbiAgICB2YXIgZW1iZWRkZWRGcmFnbWVudFZpZXcgPSBjb250ZXh0Vmlldy5nZXROZXN0ZWRWaWV3KGNvbnRleHRCb3VuZEVsZW1lbnRJbmRleCk7XG4gICAgdmFyIHZpZXc7XG4gICAgaWYgKHByb3RvVmlldy50eXBlID09PSB2aWV3TW9kdWxlLlZpZXdUeXBlLkVNQkVEREVEICYmIGlzUHJlc2VudChlbWJlZGRlZEZyYWdtZW50VmlldykgJiZcbiAgICAgICAgIWVtYmVkZGVkRnJhZ21lbnRWaWV3Lmh5ZHJhdGVkKCkpIHtcbiAgICAgIC8vIENhc2UgMTogaW5zdGFudGlhdGUgdGhlIGZpcnN0IHZpZXcgb2YgYSB0ZW1wbGF0ZSB0aGF0IGhhcyBiZWVuIG1lcmdlZCBpbnRvIGEgcGFyZW50XG4gICAgICB2aWV3ID0gZW1iZWRkZWRGcmFnbWVudFZpZXc7XG4gICAgICB0aGlzLl9hdHRhY2hSZW5kZXJWaWV3KHBhcmVudFZpZXcsIGJvdW5kRWxlbWVudEluZGV4LCBpbmRleCwgdmlldyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENhc2UgMjogaW5zdGFudGlhdGUgYW5vdGhlciBjb3B5IG9mIHRoZSB0ZW1wbGF0ZSBvciBhIGhvc3QgUHJvdG9WaWV3LlxuICAgICAgLy8gVGhpcyBpcyBhIHNlcGFyYXRlIGNhc2VcbiAgICAgIC8vIGFzIHdlIG9ubHkgaW5saW5lIG9uZSBjb3B5IG9mIHRoZSB0ZW1wbGF0ZSBpbnRvIHRoZSBwYXJlbnQgdmlldy5cbiAgICAgIHZpZXcgPSB0aGlzLl9jcmVhdGVQb29sZWRWaWV3KHByb3RvVmlldyk7XG4gICAgICB0aGlzLl9hdHRhY2hSZW5kZXJWaWV3KHBhcmVudFZpZXcsIGJvdW5kRWxlbWVudEluZGV4LCBpbmRleCwgdmlldyk7XG4gICAgICB0aGlzLl9yZW5kZXJlci5oeWRyYXRlVmlldyh2aWV3LnJlbmRlcik7XG4gICAgfVxuICAgIHRoaXMuX3V0aWxzLmF0dGFjaFZpZXdJbkNvbnRhaW5lcihwYXJlbnRWaWV3LCBib3VuZEVsZW1lbnRJbmRleCwgY29udGV4dFZpZXcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRCb3VuZEVsZW1lbnRJbmRleCwgaW5kZXgsIHZpZXcpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX3V0aWxzLmh5ZHJhdGVWaWV3SW5Db250YWluZXIocGFyZW50VmlldywgYm91bmRFbGVtZW50SW5kZXgsIGNvbnRleHRWaWV3LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0Qm91bmRFbGVtZW50SW5kZXgsIGluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBlcmF0aXZlbHlDcmVhdGVkSW5qZWN0b3IpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuX3V0aWxzLmRldGFjaFZpZXdJbkNvbnRhaW5lcihwYXJlbnRWaWV3LCBib3VuZEVsZW1lbnRJbmRleCwgaW5kZXgpO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgcmV0dXJuIHZpZXcucmVmO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfYXR0YWNoUmVuZGVyVmlldyhwYXJlbnRWaWV3OiB2aWV3TW9kdWxlLkFwcFZpZXcsIGJvdW5kRWxlbWVudEluZGV4OiBudW1iZXIsIGluZGV4OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgIHZpZXc6IHZpZXdNb2R1bGUuQXBwVmlldykge1xuICAgIHZhciBlbGVtZW50UmVmID0gcGFyZW50Vmlldy5lbGVtZW50UmVmc1tib3VuZEVsZW1lbnRJbmRleF07XG4gICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICB0aGlzLl9yZW5kZXJlci5hdHRhY2hGcmFnbWVudEFmdGVyRWxlbWVudChlbGVtZW50UmVmLCB2aWV3LnJlbmRlckZyYWdtZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHByZXZWaWV3ID0gcGFyZW50Vmlldy52aWV3Q29udGFpbmVyc1tib3VuZEVsZW1lbnRJbmRleF0udmlld3NbaW5kZXggLSAxXTtcbiAgICAgIHRoaXMuX3JlbmRlcmVyLmF0dGFjaEZyYWdtZW50QWZ0ZXJGcmFnbWVudChwcmV2Vmlldy5yZW5kZXJGcmFnbWVudCwgdmlldy5yZW5kZXJGcmFnbWVudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZGVzdHJveVZpZXdJbkNvbnRhaW5lclNjb3BlID0gd3RmQ3JlYXRlU2NvcGUoJ0FwcFZpZXdNYW5hbmdlciNkZXN0cm95Vmlld0luQ29udGFpbmVyKCknKTtcblxuICBkZXN0cm95Vmlld0luQ29udGFpbmVyKHZpZXdDb250YWluZXJMb2NhdGlvbjogRWxlbWVudFJlZiwgaW5kZXg6IG51bWJlcikge1xuICAgIHZhciBzID0gdGhpcy5fZGVzdHJveVZpZXdJbkNvbnRhaW5lclNjb3BlKCk7XG4gICAgdmFyIHBhcmVudFZpZXcgPSBpbnRlcm5hbFZpZXcoKDxFbGVtZW50UmVmXz52aWV3Q29udGFpbmVyTG9jYXRpb24pLnBhcmVudFZpZXcpO1xuICAgIHZhciBib3VuZEVsZW1lbnRJbmRleCA9ICg8RWxlbWVudFJlZl8+dmlld0NvbnRhaW5lckxvY2F0aW9uKS5ib3VuZEVsZW1lbnRJbmRleDtcbiAgICB0aGlzLl9kZXN0cm95Vmlld0luQ29udGFpbmVyKHBhcmVudFZpZXcsIGJvdW5kRWxlbWVudEluZGV4LCBpbmRleCk7XG4gICAgd3RmTGVhdmUocyk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9hdHRhY2hWaWV3SW5Db250YWluZXJTY29wZSA9IHd0ZkNyZWF0ZVNjb3BlKCdBcHBWaWV3TWFuYW5nZXIjYXR0YWNoVmlld0luQ29udGFpbmVyKCknKTtcblxuICAvLyBUT0RPKGkpOiByZWZhY3RvciBkZXRhY2hWaWV3SW5Db250YWluZXIrYXR0YWNoVmlld0luQ29udGFpbmVyIHRvIG1vdmVWaWV3SW5Db250YWluZXJcbiAgYXR0YWNoVmlld0luQ29udGFpbmVyKHZpZXdDb250YWluZXJMb2NhdGlvbjogRWxlbWVudFJlZiwgaW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdSZWY6IFZpZXdSZWYpOiBWaWV3UmVmIHtcbiAgICB2YXIgcyA9IHRoaXMuX2F0dGFjaFZpZXdJbkNvbnRhaW5lclNjb3BlKCk7XG4gICAgdmFyIHZpZXcgPSBpbnRlcm5hbFZpZXcodmlld1JlZik7XG4gICAgdmFyIHBhcmVudFZpZXcgPSBpbnRlcm5hbFZpZXcoKDxFbGVtZW50UmVmXz52aWV3Q29udGFpbmVyTG9jYXRpb24pLnBhcmVudFZpZXcpO1xuICAgIHZhciBib3VuZEVsZW1lbnRJbmRleCA9ICg8RWxlbWVudFJlZl8+dmlld0NvbnRhaW5lckxvY2F0aW9uKS5ib3VuZEVsZW1lbnRJbmRleDtcbiAgICAvLyBUT0RPKHRib3NjaCk6IHRoZSBwdWJsaWMgbWV0aG9kcyBhdHRhY2hWaWV3SW5Db250YWluZXIvZGV0YWNoVmlld0luQ29udGFpbmVyXG4gICAgLy8gYXJlIHVzZWQgZm9yIG1vdmluZyBlbGVtZW50cyB3aXRob3V0IHRoZSBzYW1lIGNvbnRhaW5lci5cbiAgICAvLyBXZSB3aWxsIGNoYW5nZSB0aGlzIGludG8gYW4gYXRvbWljIGBtb3ZlYCBvcGVyYXRpb24sIHdoaWNoIHNob3VsZCBwcmVzZXJ2ZSB0aGVcbiAgICAvLyBwcmV2aW91cyBwYXJlbnQgaW5qZWN0b3IgKHNlZSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8xMzc3KS5cbiAgICAvLyBSaWdodCBub3cgd2UgYXJlIGRlc3Ryb3lpbmcgYW55IHNwZWNpYWxcbiAgICAvLyBjb250ZXh0IHZpZXcgdGhhdCBtaWdodCBoYXZlIGJlZW4gdXNlZC5cbiAgICB0aGlzLl91dGlscy5hdHRhY2hWaWV3SW5Db250YWluZXIocGFyZW50VmlldywgYm91bmRFbGVtZW50SW5kZXgsIG51bGwsIG51bGwsIGluZGV4LCB2aWV3KTtcbiAgICB0aGlzLl9hdHRhY2hSZW5kZXJWaWV3KHBhcmVudFZpZXcsIGJvdW5kRWxlbWVudEluZGV4LCBpbmRleCwgdmlldyk7XG4gICAgcmV0dXJuIHd0ZkxlYXZlKHMsIHZpZXdSZWYpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZGV0YWNoVmlld0luQ29udGFpbmVyU2NvcGUgPSB3dGZDcmVhdGVTY29wZSgnQXBwVmlld01hbmFuZ2VyI2RldGFjaFZpZXdJbkNvbnRhaW5lcigpJyk7XG5cbiAgLy8gVE9ETyhpKTogcmVmYWN0b3IgZGV0YWNoVmlld0luQ29udGFpbmVyK2F0dGFjaFZpZXdJbkNvbnRhaW5lciB0byBtb3ZlVmlld0luQ29udGFpbmVyXG4gIGRldGFjaFZpZXdJbkNvbnRhaW5lcih2aWV3Q29udGFpbmVyTG9jYXRpb246IEVsZW1lbnRSZWYsIGluZGV4OiBudW1iZXIpOiBWaWV3UmVmIHtcbiAgICB2YXIgcyA9IHRoaXMuX2RldGFjaFZpZXdJbkNvbnRhaW5lclNjb3BlKCk7XG4gICAgdmFyIHBhcmVudFZpZXcgPSBpbnRlcm5hbFZpZXcoKDxFbGVtZW50UmVmXz52aWV3Q29udGFpbmVyTG9jYXRpb24pLnBhcmVudFZpZXcpO1xuICAgIHZhciBib3VuZEVsZW1lbnRJbmRleCA9ICg8RWxlbWVudFJlZl8+dmlld0NvbnRhaW5lckxvY2F0aW9uKS5ib3VuZEVsZW1lbnRJbmRleDtcbiAgICB2YXIgdmlld0NvbnRhaW5lciA9IHBhcmVudFZpZXcudmlld0NvbnRhaW5lcnNbYm91bmRFbGVtZW50SW5kZXhdO1xuICAgIHZhciB2aWV3ID0gdmlld0NvbnRhaW5lci52aWV3c1tpbmRleF07XG4gICAgdGhpcy5fdXRpbHMuZGV0YWNoVmlld0luQ29udGFpbmVyKHBhcmVudFZpZXcsIGJvdW5kRWxlbWVudEluZGV4LCBpbmRleCk7XG4gICAgdGhpcy5fcmVuZGVyZXIuZGV0YWNoRnJhZ21lbnQodmlldy5yZW5kZXJGcmFnbWVudCk7XG4gICAgcmV0dXJuIHd0ZkxlYXZlKHMsIHZpZXcucmVmKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2NyZWF0ZU1haW5WaWV3KHByb3RvVmlldzogdmlld01vZHVsZS5BcHBQcm90b1ZpZXcsXG4gICAgICAgICAgICAgICAgICByZW5kZXJWaWV3V2l0aEZyYWdtZW50czogUmVuZGVyVmlld1dpdGhGcmFnbWVudHMpOiB2aWV3TW9kdWxlLkFwcFZpZXcge1xuICAgIHZhciBtZXJnZWRQYXJlbnRWaWV3ID1cbiAgICAgICAgdGhpcy5fdXRpbHMuY3JlYXRlVmlldyhwcm90b1ZpZXcsIHJlbmRlclZpZXdXaXRoRnJhZ21lbnRzLCB0aGlzLCB0aGlzLl9yZW5kZXJlcik7XG4gICAgdGhpcy5fcmVuZGVyZXIuc2V0RXZlbnREaXNwYXRjaGVyKG1lcmdlZFBhcmVudFZpZXcucmVuZGVyLCBtZXJnZWRQYXJlbnRWaWV3KTtcbiAgICB0aGlzLl92aWV3TGlzdGVuZXIub25WaWV3Q3JlYXRlZChtZXJnZWRQYXJlbnRWaWV3KTtcbiAgICByZXR1cm4gbWVyZ2VkUGFyZW50VmlldztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2NyZWF0ZVBvb2xlZFZpZXcocHJvdG9WaWV3OiB2aWV3TW9kdWxlLkFwcFByb3RvVmlldyk6IHZpZXdNb2R1bGUuQXBwVmlldyB7XG4gICAgdmFyIHZpZXcgPSB0aGlzLl92aWV3UG9vbC5nZXRWaWV3KHByb3RvVmlldyk7XG4gICAgaWYgKGlzQmxhbmsodmlldykpIHtcbiAgICAgIHZpZXcgPSB0aGlzLl9jcmVhdGVNYWluVmlldyhcbiAgICAgICAgICBwcm90b1ZpZXcsXG4gICAgICAgICAgdGhpcy5fcmVuZGVyZXIuY3JlYXRlVmlldyhwcm90b1ZpZXcucmVuZGVyLCBwcm90b1ZpZXcubWVyZ2VJbmZvLmVtYmVkZGVkVmlld0NvdW50ICsgMSkpO1xuICAgIH1cbiAgICByZXR1cm4gdmlldztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2Rlc3Ryb3lQb29sZWRWaWV3KHZpZXc6IHZpZXdNb2R1bGUuQXBwVmlldykge1xuICAgIHZhciB3YXNSZXR1cm5lZCA9IHRoaXMuX3ZpZXdQb29sLnJldHVyblZpZXcodmlldyk7XG4gICAgaWYgKCF3YXNSZXR1cm5lZCkge1xuICAgICAgdGhpcy5fdmlld0xpc3RlbmVyLm9uVmlld0Rlc3Ryb3llZCh2aWV3KTtcbiAgICAgIHRoaXMuX3JlbmRlcmVyLmRlc3Ryb3lWaWV3KHZpZXcucmVuZGVyKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9kZXN0cm95Vmlld0luQ29udGFpbmVyKHBhcmVudFZpZXc6IHZpZXdNb2R1bGUuQXBwVmlldywgYm91bmRFbGVtZW50SW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IG51bWJlcikge1xuICAgIHZhciB2aWV3Q29udGFpbmVyID0gcGFyZW50Vmlldy52aWV3Q29udGFpbmVyc1tib3VuZEVsZW1lbnRJbmRleF07XG4gICAgdmFyIHZpZXcgPSB2aWV3Q29udGFpbmVyLnZpZXdzW2luZGV4XTtcblxuICAgIHRoaXMuX3ZpZXdEZWh5ZHJhdGVSZWN1cnNlKHZpZXcpO1xuICAgIHRoaXMuX3V0aWxzLmRldGFjaFZpZXdJbkNvbnRhaW5lcihwYXJlbnRWaWV3LCBib3VuZEVsZW1lbnRJbmRleCwgaW5kZXgpO1xuICAgIGlmICh2aWV3LnZpZXdPZmZzZXQgPiAwKSB7XG4gICAgICAvLyBDYXNlIDE6IGEgdmlldyB0aGF0IGlzIHBhcnQgb2YgYW5vdGhlciB2aWV3LlxuICAgICAgLy8gSnVzdCBkZXRhY2ggdGhlIGZyYWdtZW50XG4gICAgICB0aGlzLl9yZW5kZXJlci5kZXRhY2hGcmFnbWVudCh2aWV3LnJlbmRlckZyYWdtZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ2FzZSAyOiBhIHZpZXcgdGhhdCBpcyBub3QgcGFydCBvZiBhbm90aGVyIHZpZXcuXG4gICAgICAvLyBkZWh5ZHJhdGUgYW5kIGRlc3Ryb3kgaXQuXG4gICAgICB0aGlzLl9yZW5kZXJlci5kZWh5ZHJhdGVWaWV3KHZpZXcucmVuZGVyKTtcbiAgICAgIHRoaXMuX3JlbmRlcmVyLmRldGFjaEZyYWdtZW50KHZpZXcucmVuZGVyRnJhZ21lbnQpO1xuICAgICAgdGhpcy5fZGVzdHJveVBvb2xlZFZpZXcodmlldyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfdmlld0RlaHlkcmF0ZVJlY3Vyc2Uodmlldzogdmlld01vZHVsZS5BcHBWaWV3KSB7XG4gICAgaWYgKHZpZXcuaHlkcmF0ZWQoKSkge1xuICAgICAgdGhpcy5fdXRpbHMuZGVoeWRyYXRlVmlldyh2aWV3KTtcbiAgICB9XG4gICAgdmFyIHZpZXdDb250YWluZXJzID0gdmlldy52aWV3Q29udGFpbmVycztcbiAgICB2YXIgc3RhcnRWaWV3T2Zmc2V0ID0gdmlldy52aWV3T2Zmc2V0O1xuICAgIHZhciBlbmRWaWV3T2Zmc2V0ID0gdmlldy52aWV3T2Zmc2V0ICsgdmlldy5wcm90by5tZXJnZUluZm8udmlld0NvdW50IC0gMTtcbiAgICB2YXIgZWxlbWVudE9mZnNldCA9IHZpZXcuZWxlbWVudE9mZnNldDtcbiAgICBmb3IgKHZhciB2aWV3SWR4ID0gc3RhcnRWaWV3T2Zmc2V0OyB2aWV3SWR4IDw9IGVuZFZpZXdPZmZzZXQ7IHZpZXdJZHgrKykge1xuICAgICAgdmFyIGN1cnJWaWV3ID0gdmlldy52aWV3c1t2aWV3SWR4XTtcbiAgICAgIGZvciAodmFyIGJpbmRlcklkeCA9IDA7IGJpbmRlcklkeCA8IGN1cnJWaWV3LnByb3RvLmVsZW1lbnRCaW5kZXJzLmxlbmd0aDtcbiAgICAgICAgICAgYmluZGVySWR4KyssIGVsZW1lbnRPZmZzZXQrKykge1xuICAgICAgICB2YXIgdmMgPSB2aWV3Q29udGFpbmVyc1tlbGVtZW50T2Zmc2V0XTtcbiAgICAgICAgaWYgKGlzUHJlc2VudCh2YykpIHtcbiAgICAgICAgICBmb3IgKHZhciBqID0gdmMudmlld3MubGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgICAgIHRoaXMuX2Rlc3Ryb3lWaWV3SW5Db250YWluZXIoY3VyclZpZXcsIGVsZW1lbnRPZmZzZXQsIGopO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL3ZpZXdfbWFuYWdlci50c1xuICoqLyIsImltcG9ydCB7SW5qZWN0b3IsIFByb3ZpZGVyLCBJbmplY3RhYmxlLCBSZXNvbHZlZFByb3ZpZGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5pbXBvcnQge0xpc3RXcmFwcGVyLCBNYXBXcmFwcGVyLCBNYXAsIFN0cmluZ01hcFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQgKiBhcyBlbGkgZnJvbSAnLi9lbGVtZW50X2luamVjdG9yJztcbmltcG9ydCB7aXNQcmVzZW50LCBpc0JsYW5rfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0ICogYXMgdmlld01vZHVsZSBmcm9tICcuL3ZpZXcnO1xuaW1wb3J0ICogYXMgYXZtTW9kdWxlIGZyb20gJy4vdmlld19tYW5hZ2VyJztcbmltcG9ydCB7RWxlbWVudFJlZiwgRWxlbWVudFJlZl99IGZyb20gJy4vZWxlbWVudF9yZWYnO1xuaW1wb3J0IHtUZW1wbGF0ZVJlZiwgVGVtcGxhdGVSZWZffSBmcm9tICcuL3RlbXBsYXRlX3JlZic7XG5pbXBvcnQge1JlbmRlcmVyLCBSZW5kZXJWaWV3V2l0aEZyYWdtZW50c30gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvcmVuZGVyL2FwaSc7XG5pbXBvcnQge0xvY2Fsc30gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9jaGFuZ2VfZGV0ZWN0aW9uJztcbmltcG9ydCB7UGlwZXN9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL3BpcGVzL3BpcGVzJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEFwcFZpZXdNYW5hZ2VyVXRpbHMge1xuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgZ2V0Q29tcG9uZW50SW5zdGFuY2UocGFyZW50Vmlldzogdmlld01vZHVsZS5BcHBWaWV3LCBib3VuZEVsZW1lbnRJbmRleDogbnVtYmVyKTogYW55IHtcbiAgICB2YXIgZWxpID0gcGFyZW50Vmlldy5lbGVtZW50SW5qZWN0b3JzW2JvdW5kRWxlbWVudEluZGV4XTtcbiAgICByZXR1cm4gZWxpLmdldENvbXBvbmVudCgpO1xuICB9XG5cbiAgY3JlYXRlVmlldyhtZXJnZWRQYXJlbnRWaWV3UHJvdG86IHZpZXdNb2R1bGUuQXBwUHJvdG9WaWV3LFxuICAgICAgICAgICAgIHJlbmRlclZpZXdXaXRoRnJhZ21lbnRzOiBSZW5kZXJWaWV3V2l0aEZyYWdtZW50cyxcbiAgICAgICAgICAgICB2aWV3TWFuYWdlcjogYXZtTW9kdWxlLkFwcFZpZXdNYW5hZ2VyLCByZW5kZXJlcjogUmVuZGVyZXIpOiB2aWV3TW9kdWxlLkFwcFZpZXcge1xuICAgIHZhciByZW5kZXJGcmFnbWVudHMgPSByZW5kZXJWaWV3V2l0aEZyYWdtZW50cy5mcmFnbWVudFJlZnM7XG4gICAgdmFyIHJlbmRlclZpZXcgPSByZW5kZXJWaWV3V2l0aEZyYWdtZW50cy52aWV3UmVmO1xuXG4gICAgdmFyIGVsZW1lbnRDb3VudCA9IG1lcmdlZFBhcmVudFZpZXdQcm90by5tZXJnZUluZm8uZWxlbWVudENvdW50O1xuICAgIHZhciB2aWV3Q291bnQgPSBtZXJnZWRQYXJlbnRWaWV3UHJvdG8ubWVyZ2VJbmZvLnZpZXdDb3VudDtcbiAgICB2YXIgZWxlbWVudFJlZnM6IEVsZW1lbnRSZWZbXSA9IExpc3RXcmFwcGVyLmNyZWF0ZUZpeGVkU2l6ZShlbGVtZW50Q291bnQpO1xuICAgIHZhciB2aWV3Q29udGFpbmVycyA9IExpc3RXcmFwcGVyLmNyZWF0ZUZpeGVkU2l6ZShlbGVtZW50Q291bnQpO1xuICAgIHZhciBwcmVCdWlsdE9iamVjdHM6IGVsaS5QcmVCdWlsdE9iamVjdHNbXSA9IExpc3RXcmFwcGVyLmNyZWF0ZUZpeGVkU2l6ZShlbGVtZW50Q291bnQpO1xuICAgIHZhciBlbGVtZW50SW5qZWN0b3JzOiBlbGkuRWxlbWVudEluamVjdG9yW10gPSBMaXN0V3JhcHBlci5jcmVhdGVGaXhlZFNpemUoZWxlbWVudENvdW50KTtcbiAgICB2YXIgdmlld3MgPSBMaXN0V3JhcHBlci5jcmVhdGVGaXhlZFNpemUodmlld0NvdW50KTtcblxuICAgIHZhciBlbGVtZW50T2Zmc2V0ID0gMDtcbiAgICB2YXIgdGV4dE9mZnNldCA9IDA7XG4gICAgdmFyIGZyYWdtZW50SWR4ID0gMDtcbiAgICB2YXIgY29udGFpbmVyRWxlbWVudEluZGljZXNCeVZpZXdJbmRleDogbnVtYmVyW10gPSBMaXN0V3JhcHBlci5jcmVhdGVGaXhlZFNpemUodmlld0NvdW50KTtcbiAgICBmb3IgKHZhciB2aWV3T2Zmc2V0ID0gMDsgdmlld09mZnNldCA8IHZpZXdDb3VudDsgdmlld09mZnNldCsrKSB7XG4gICAgICB2YXIgY29udGFpbmVyRWxlbWVudEluZGV4ID0gY29udGFpbmVyRWxlbWVudEluZGljZXNCeVZpZXdJbmRleFt2aWV3T2Zmc2V0XTtcbiAgICAgIHZhciBjb250YWluZXJFbGVtZW50SW5qZWN0b3IgPVxuICAgICAgICAgIGlzUHJlc2VudChjb250YWluZXJFbGVtZW50SW5kZXgpID8gZWxlbWVudEluamVjdG9yc1tjb250YWluZXJFbGVtZW50SW5kZXhdIDogbnVsbDtcbiAgICAgIHZhciBwYXJlbnRWaWV3ID1cbiAgICAgICAgICBpc1ByZXNlbnQoY29udGFpbmVyRWxlbWVudEluamVjdG9yKSA/IHByZUJ1aWx0T2JqZWN0c1tjb250YWluZXJFbGVtZW50SW5kZXhdLnZpZXcgOiBudWxsO1xuICAgICAgdmFyIHByb3RvVmlldyA9XG4gICAgICAgICAgaXNQcmVzZW50KGNvbnRhaW5lckVsZW1lbnRJbmRleCkgP1xuICAgICAgICAgICAgICBwYXJlbnRWaWV3LnByb3RvLmVsZW1lbnRCaW5kZXJzW2NvbnRhaW5lckVsZW1lbnRJbmRleCAtIHBhcmVudFZpZXcuZWxlbWVudE9mZnNldF1cbiAgICAgICAgICAgICAgICAgIC5uZXN0ZWRQcm90b1ZpZXcgOlxuICAgICAgICAgICAgICBtZXJnZWRQYXJlbnRWaWV3UHJvdG87XG4gICAgICB2YXIgcmVuZGVyRnJhZ21lbnQgPSBudWxsO1xuICAgICAgaWYgKHZpZXdPZmZzZXQgPT09IDAgfHwgcHJvdG9WaWV3LnR5cGUgPT09IHZpZXdNb2R1bGUuVmlld1R5cGUuRU1CRURERUQpIHtcbiAgICAgICAgcmVuZGVyRnJhZ21lbnQgPSByZW5kZXJGcmFnbWVudHNbZnJhZ21lbnRJZHgrK107XG4gICAgICB9XG4gICAgICB2YXIgY3VycmVudFZpZXcgPSBuZXcgdmlld01vZHVsZS5BcHBWaWV3KHJlbmRlcmVyLCBwcm90b1ZpZXcsIHZpZXdPZmZzZXQsIGVsZW1lbnRPZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRPZmZzZXQsIHByb3RvVmlldy5wcm90b0xvY2FscywgcmVuZGVyVmlldyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyRnJhZ21lbnQsIGNvbnRhaW5lckVsZW1lbnRJbmplY3Rvcik7XG4gICAgICB2aWV3c1t2aWV3T2Zmc2V0XSA9IGN1cnJlbnRWaWV3O1xuICAgICAgaWYgKGlzUHJlc2VudChjb250YWluZXJFbGVtZW50SW5kZXgpKSB7XG4gICAgICAgIHByZUJ1aWx0T2JqZWN0c1tjb250YWluZXJFbGVtZW50SW5kZXhdLm5lc3RlZFZpZXcgPSBjdXJyZW50VmlldztcbiAgICAgIH1cbiAgICAgIHZhciByb290RWxlbWVudEluamVjdG9ycyA9IFtdO1xuICAgICAgdmFyIG5lc3RlZFZpZXdPZmZzZXQgPSB2aWV3T2Zmc2V0ICsgMTtcbiAgICAgIGZvciAodmFyIGJpbmRlcklkeCA9IDA7IGJpbmRlcklkeCA8IHByb3RvVmlldy5lbGVtZW50QmluZGVycy5sZW5ndGg7IGJpbmRlcklkeCsrKSB7XG4gICAgICAgIHZhciBiaW5kZXIgPSBwcm90b1ZpZXcuZWxlbWVudEJpbmRlcnNbYmluZGVySWR4XTtcbiAgICAgICAgdmFyIGJvdW5kRWxlbWVudEluZGV4ID0gZWxlbWVudE9mZnNldCArIGJpbmRlcklkeDtcbiAgICAgICAgdmFyIGVsZW1lbnRJbmplY3RvciA9IG51bGw7XG5cbiAgICAgICAgaWYgKGlzUHJlc2VudChiaW5kZXIubmVzdGVkUHJvdG9WaWV3KSAmJiBiaW5kZXIubmVzdGVkUHJvdG9WaWV3LmlzTWVyZ2FibGUpIHtcbiAgICAgICAgICBjb250YWluZXJFbGVtZW50SW5kaWNlc0J5Vmlld0luZGV4W25lc3RlZFZpZXdPZmZzZXRdID0gYm91bmRFbGVtZW50SW5kZXg7XG4gICAgICAgICAgbmVzdGVkVmlld09mZnNldCArPSBiaW5kZXIubmVzdGVkUHJvdG9WaWV3Lm1lcmdlSW5mby52aWV3Q291bnQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlbGVtZW50SW5qZWN0b3JzIGFuZCByb290RWxlbWVudEluamVjdG9yc1xuICAgICAgICB2YXIgcHJvdG9FbGVtZW50SW5qZWN0b3IgPSBiaW5kZXIucHJvdG9FbGVtZW50SW5qZWN0b3I7XG4gICAgICAgIGlmIChpc1ByZXNlbnQocHJvdG9FbGVtZW50SW5qZWN0b3IpKSB7XG4gICAgICAgICAgaWYgKGlzUHJlc2VudChwcm90b0VsZW1lbnRJbmplY3Rvci5wYXJlbnQpKSB7XG4gICAgICAgICAgICB2YXIgcGFyZW50RWxlbWVudEluamVjdG9yID1cbiAgICAgICAgICAgICAgICBlbGVtZW50SW5qZWN0b3JzW2VsZW1lbnRPZmZzZXQgKyBwcm90b0VsZW1lbnRJbmplY3Rvci5wYXJlbnQuaW5kZXhdO1xuICAgICAgICAgICAgZWxlbWVudEluamVjdG9yID0gcHJvdG9FbGVtZW50SW5qZWN0b3IuaW5zdGFudGlhdGUocGFyZW50RWxlbWVudEluamVjdG9yKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZWxlbWVudEluamVjdG9yID0gcHJvdG9FbGVtZW50SW5qZWN0b3IuaW5zdGFudGlhdGUobnVsbCk7XG4gICAgICAgICAgICByb290RWxlbWVudEluamVjdG9ycy5wdXNoKGVsZW1lbnRJbmplY3Rvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnRJbmplY3RvcnNbYm91bmRFbGVtZW50SW5kZXhdID0gZWxlbWVudEluamVjdG9yO1xuXG4gICAgICAgIC8vIGVsZW1lbnRSZWZzXG4gICAgICAgIHZhciBlbCA9IG5ldyBFbGVtZW50UmVmXyhjdXJyZW50Vmlldy5yZWYsIGJvdW5kRWxlbWVudEluZGV4LCByZW5kZXJlcik7XG4gICAgICAgIGVsZW1lbnRSZWZzW2VsLmJvdW5kRWxlbWVudEluZGV4XSA9IGVsO1xuXG4gICAgICAgIC8vIHByZUJ1aWx0T2JqZWN0c1xuICAgICAgICBpZiAoaXNQcmVzZW50KGVsZW1lbnRJbmplY3RvcikpIHtcbiAgICAgICAgICB2YXIgdGVtcGxhdGVSZWYgPSBpc1ByZXNlbnQoYmluZGVyLm5lc3RlZFByb3RvVmlldykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRlci5uZXN0ZWRQcm90b1ZpZXcudHlwZSA9PT0gdmlld01vZHVsZS5WaWV3VHlwZS5FTUJFRERFRCA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUZW1wbGF0ZVJlZl8oZWwpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbDtcbiAgICAgICAgICBwcmVCdWlsdE9iamVjdHNbYm91bmRFbGVtZW50SW5kZXhdID1cbiAgICAgICAgICAgICAgbmV3IGVsaS5QcmVCdWlsdE9iamVjdHModmlld01hbmFnZXIsIGN1cnJlbnRWaWV3LCBlbCwgdGVtcGxhdGVSZWYpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjdXJyZW50Vmlldy5pbml0KHByb3RvVmlldy5jaGFuZ2VEZXRlY3RvckZhY3RvcnkoY3VycmVudFZpZXcpLCBlbGVtZW50SW5qZWN0b3JzLFxuICAgICAgICAgICAgICAgICAgICAgICByb290RWxlbWVudEluamVjdG9ycywgcHJlQnVpbHRPYmplY3RzLCB2aWV3cywgZWxlbWVudFJlZnMsIHZpZXdDb250YWluZXJzKTtcbiAgICAgIGlmIChpc1ByZXNlbnQocGFyZW50VmlldykgJiYgcHJvdG9WaWV3LnR5cGUgPT09IHZpZXdNb2R1bGUuVmlld1R5cGUuQ09NUE9ORU5UKSB7XG4gICAgICAgIHBhcmVudFZpZXcuY2hhbmdlRGV0ZWN0b3IuYWRkVmlld0NoaWxkKGN1cnJlbnRWaWV3LmNoYW5nZURldGVjdG9yKTtcbiAgICAgIH1cbiAgICAgIGVsZW1lbnRPZmZzZXQgKz0gcHJvdG9WaWV3LmVsZW1lbnRCaW5kZXJzLmxlbmd0aDtcbiAgICAgIHRleHRPZmZzZXQgKz0gcHJvdG9WaWV3LnRleHRCaW5kaW5nQ291bnQ7XG4gICAgfVxuICAgIHJldHVybiB2aWV3c1swXTtcbiAgfVxuXG4gIGh5ZHJhdGVSb290SG9zdFZpZXcoaG9zdFZpZXc6IHZpZXdNb2R1bGUuQXBwVmlldywgaW5qZWN0b3I6IEluamVjdG9yKSB7XG4gICAgdGhpcy5faHlkcmF0ZVZpZXcoaG9zdFZpZXcsIGluamVjdG9yLCBudWxsLCBuZXcgT2JqZWN0KCksIG51bGwpO1xuICB9XG5cbiAgLy8gTWlzbm9tZXI6IHRoaXMgbWV0aG9kIGlzIGF0dGFjaGluZyBuZXh0IHRvIHRoZSB2aWV3IGNvbnRhaW5lci5cbiAgYXR0YWNoVmlld0luQ29udGFpbmVyKHBhcmVudFZpZXc6IHZpZXdNb2R1bGUuQXBwVmlldywgYm91bmRFbGVtZW50SW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRWaWV3OiB2aWV3TW9kdWxlLkFwcFZpZXcsIGNvbnRleHRCb3VuZEVsZW1lbnRJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IG51bWJlciwgdmlldzogdmlld01vZHVsZS5BcHBWaWV3KSB7XG4gICAgaWYgKGlzQmxhbmsoY29udGV4dFZpZXcpKSB7XG4gICAgICBjb250ZXh0VmlldyA9IHBhcmVudFZpZXc7XG4gICAgICBjb250ZXh0Qm91bmRFbGVtZW50SW5kZXggPSBib3VuZEVsZW1lbnRJbmRleDtcbiAgICB9XG4gICAgcGFyZW50Vmlldy5jaGFuZ2VEZXRlY3Rvci5hZGRDb250ZW50Q2hpbGQodmlldy5jaGFuZ2VEZXRlY3Rvcik7XG4gICAgdmFyIHZpZXdDb250YWluZXIgPSBwYXJlbnRWaWV3LnZpZXdDb250YWluZXJzW2JvdW5kRWxlbWVudEluZGV4XTtcbiAgICBpZiAoaXNCbGFuayh2aWV3Q29udGFpbmVyKSkge1xuICAgICAgdmlld0NvbnRhaW5lciA9IG5ldyB2aWV3TW9kdWxlLkFwcFZpZXdDb250YWluZXIoKTtcbiAgICAgIHBhcmVudFZpZXcudmlld0NvbnRhaW5lcnNbYm91bmRFbGVtZW50SW5kZXhdID0gdmlld0NvbnRhaW5lcjtcbiAgICB9XG4gICAgTGlzdFdyYXBwZXIuaW5zZXJ0KHZpZXdDb250YWluZXIudmlld3MsIGluZGV4LCB2aWV3KTtcbiAgICB2YXIgZWxlbWVudEluamVjdG9yID0gY29udGV4dFZpZXcuZWxlbWVudEluamVjdG9yc1tjb250ZXh0Qm91bmRFbGVtZW50SW5kZXhdO1xuXG4gICAgZm9yICh2YXIgaSA9IHZpZXcucm9vdEVsZW1lbnRJbmplY3RvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGlmIChpc1ByZXNlbnQoZWxlbWVudEluamVjdG9yLnBhcmVudCkpIHtcbiAgICAgICAgdmlldy5yb290RWxlbWVudEluamVjdG9yc1tpXS5saW5rKGVsZW1lbnRJbmplY3Rvci5wYXJlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICBlbGVtZW50SW5qZWN0b3IudHJhdmVyc2VBbmRTZXRRdWVyaWVzQXNEaXJ0eSgpO1xuICB9XG5cbiAgZGV0YWNoVmlld0luQ29udGFpbmVyKHBhcmVudFZpZXc6IHZpZXdNb2R1bGUuQXBwVmlldywgYm91bmRFbGVtZW50SW5kZXg6IG51bWJlciwgaW5kZXg6IG51bWJlcikge1xuICAgIHZhciB2aWV3Q29udGFpbmVyID0gcGFyZW50Vmlldy52aWV3Q29udGFpbmVyc1tib3VuZEVsZW1lbnRJbmRleF07XG4gICAgdmFyIHZpZXcgPSB2aWV3Q29udGFpbmVyLnZpZXdzW2luZGV4XTtcblxuICAgIHBhcmVudFZpZXcuZWxlbWVudEluamVjdG9yc1tib3VuZEVsZW1lbnRJbmRleF0udHJhdmVyc2VBbmRTZXRRdWVyaWVzQXNEaXJ0eSgpO1xuXG4gICAgdmlldy5jaGFuZ2VEZXRlY3Rvci5yZW1vdmUoKTtcbiAgICBMaXN0V3JhcHBlci5yZW1vdmVBdCh2aWV3Q29udGFpbmVyLnZpZXdzLCBpbmRleCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2aWV3LnJvb3RFbGVtZW50SW5qZWN0b3JzLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgaW5qID0gdmlldy5yb290RWxlbWVudEluamVjdG9yc1tpXTtcbiAgICAgIGluai51bmxpbmsoKTtcbiAgICB9XG4gIH1cblxuXG4gIGh5ZHJhdGVWaWV3SW5Db250YWluZXIocGFyZW50Vmlldzogdmlld01vZHVsZS5BcHBWaWV3LCBib3VuZEVsZW1lbnRJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRWaWV3OiB2aWV3TW9kdWxlLkFwcFZpZXcsIGNvbnRleHRCb3VuZEVsZW1lbnRJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBudW1iZXIsIGltcGVyYXRpdmVseUNyZWF0ZWRQcm92aWRlcnM6IFJlc29sdmVkUHJvdmlkZXJbXSkge1xuICAgIGlmIChpc0JsYW5rKGNvbnRleHRWaWV3KSkge1xuICAgICAgY29udGV4dFZpZXcgPSBwYXJlbnRWaWV3O1xuICAgICAgY29udGV4dEJvdW5kRWxlbWVudEluZGV4ID0gYm91bmRFbGVtZW50SW5kZXg7XG4gICAgfVxuICAgIHZhciB2aWV3Q29udGFpbmVyID0gcGFyZW50Vmlldy52aWV3Q29udGFpbmVyc1tib3VuZEVsZW1lbnRJbmRleF07XG4gICAgdmFyIHZpZXcgPSB2aWV3Q29udGFpbmVyLnZpZXdzW2luZGV4XTtcbiAgICB2YXIgZWxlbWVudEluamVjdG9yID0gY29udGV4dFZpZXcuZWxlbWVudEluamVjdG9yc1tjb250ZXh0Qm91bmRFbGVtZW50SW5kZXhdO1xuXG4gICAgdmFyIGluamVjdG9yID0gaXNQcmVzZW50KGltcGVyYXRpdmVseUNyZWF0ZWRQcm92aWRlcnMpID9cbiAgICAgICAgICAgICAgICAgICAgICAgSW5qZWN0b3IuZnJvbVJlc29sdmVkUHJvdmlkZXJzKGltcGVyYXRpdmVseUNyZWF0ZWRQcm92aWRlcnMpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgbnVsbDtcbiAgICB0aGlzLl9oeWRyYXRlVmlldyh2aWV3LCBpbmplY3RvciwgZWxlbWVudEluamVjdG9yLmdldEhvc3QoKSwgY29udGV4dFZpZXcuY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0Vmlldy5sb2NhbHMpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfaHlkcmF0ZVZpZXcoaW5pdFZpZXc6IHZpZXdNb2R1bGUuQXBwVmlldywgaW1wZXJhdGl2ZWx5Q3JlYXRlZEluamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgICAgICAgIGhvc3RFbGVtZW50SW5qZWN0b3I6IGVsaS5FbGVtZW50SW5qZWN0b3IsIGNvbnRleHQ6IE9iamVjdCwgcGFyZW50TG9jYWxzOiBMb2NhbHMpIHtcbiAgICB2YXIgdmlld0lkeCA9IGluaXRWaWV3LnZpZXdPZmZzZXQ7XG4gICAgdmFyIGVuZFZpZXdPZmZzZXQgPSB2aWV3SWR4ICsgaW5pdFZpZXcucHJvdG8ubWVyZ2VJbmZvLnZpZXdDb3VudCAtIDE7XG4gICAgd2hpbGUgKHZpZXdJZHggPD0gZW5kVmlld09mZnNldCkge1xuICAgICAgdmFyIGN1cnJWaWV3ID0gaW5pdFZpZXcudmlld3Nbdmlld0lkeF07XG4gICAgICB2YXIgY3VyclByb3RvVmlldyA9IGN1cnJWaWV3LnByb3RvO1xuICAgICAgaWYgKGN1cnJWaWV3ICE9PSBpbml0VmlldyAmJiBjdXJyVmlldy5wcm90by50eXBlID09PSB2aWV3TW9kdWxlLlZpZXdUeXBlLkVNQkVEREVEKSB7XG4gICAgICAgIC8vIERvbid0IGh5ZHJhdGUgY29tcG9uZW50cyBvZiBlbWJlZGRlZCBmcmFnbWVudCB2aWV3cy5cbiAgICAgICAgdmlld0lkeCArPSBjdXJyVmlldy5wcm90by5tZXJnZUluZm8udmlld0NvdW50O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGN1cnJWaWV3ICE9PSBpbml0Vmlldykge1xuICAgICAgICAgIC8vIGh5ZHJhdGUgYSBuZXN0ZWQgY29tcG9uZW50IHZpZXdcbiAgICAgICAgICBpbXBlcmF0aXZlbHlDcmVhdGVkSW5qZWN0b3IgPSBudWxsO1xuICAgICAgICAgIHBhcmVudExvY2FscyA9IG51bGw7XG4gICAgICAgICAgaG9zdEVsZW1lbnRJbmplY3RvciA9IGN1cnJWaWV3LmNvbnRhaW5lckVsZW1lbnRJbmplY3RvcjtcbiAgICAgICAgICBjb250ZXh0ID0gaG9zdEVsZW1lbnRJbmplY3Rvci5nZXRDb21wb25lbnQoKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyVmlldy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgY3VyclZpZXcubG9jYWxzLnBhcmVudCA9IHBhcmVudExvY2FscztcbiAgICAgICAgdmFyIGJpbmRlcnMgPSBjdXJyUHJvdG9WaWV3LmVsZW1lbnRCaW5kZXJzO1xuICAgICAgICBmb3IgKHZhciBiaW5kZXJJZHggPSAwOyBiaW5kZXJJZHggPCBiaW5kZXJzLmxlbmd0aDsgYmluZGVySWR4KyspIHtcbiAgICAgICAgICB2YXIgYm91bmRFbGVtZW50SW5kZXggPSBiaW5kZXJJZHggKyBjdXJyVmlldy5lbGVtZW50T2Zmc2V0O1xuICAgICAgICAgIHZhciBlbGVtZW50SW5qZWN0b3IgPSBpbml0Vmlldy5lbGVtZW50SW5qZWN0b3JzW2JvdW5kRWxlbWVudEluZGV4XTtcblxuICAgICAgICAgIGlmIChpc1ByZXNlbnQoZWxlbWVudEluamVjdG9yKSkge1xuICAgICAgICAgICAgZWxlbWVudEluamVjdG9yLmh5ZHJhdGUoaW1wZXJhdGl2ZWx5Q3JlYXRlZEluamVjdG9yLCBob3N0RWxlbWVudEluamVjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyclZpZXcucHJlQnVpbHRPYmplY3RzW2JvdW5kRWxlbWVudEluZGV4XSk7XG4gICAgICAgICAgICB0aGlzLl9wb3B1bGF0ZVZpZXdMb2NhbHMoY3VyclZpZXcsIGVsZW1lbnRJbmplY3RvciwgYm91bmRFbGVtZW50SW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5fc2V0VXBFdmVudEVtaXR0ZXJzKGN1cnJWaWV3LCBlbGVtZW50SW5qZWN0b3IsIGJvdW5kRWxlbWVudEluZGV4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBpcGVzID0gaXNQcmVzZW50KGhvc3RFbGVtZW50SW5qZWN0b3IpID9cbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQaXBlcyhjdXJyVmlldy5wcm90by5waXBlcywgaG9zdEVsZW1lbnRJbmplY3Rvci5nZXRJbmplY3RvcigpKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICBudWxsO1xuICAgICAgICBjdXJyVmlldy5jaGFuZ2VEZXRlY3Rvci5oeWRyYXRlKGN1cnJWaWV3LmNvbnRleHQsIGN1cnJWaWV3LmxvY2FscywgY3VyclZpZXcsIHBpcGVzKTtcbiAgICAgICAgdmlld0lkeCsrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3BvcHVsYXRlVmlld0xvY2Fscyh2aWV3OiB2aWV3TW9kdWxlLkFwcFZpZXcsIGVsZW1lbnRJbmplY3RvcjogZWxpLkVsZW1lbnRJbmplY3RvcixcbiAgICAgICAgICAgICAgICAgICAgICBib3VuZEVsZW1lbnRJZHg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChpc1ByZXNlbnQoZWxlbWVudEluamVjdG9yLmdldERpcmVjdGl2ZVZhcmlhYmxlQmluZGluZ3MoKSkpIHtcbiAgICAgIGVsZW1lbnRJbmplY3Rvci5nZXREaXJlY3RpdmVWYXJpYWJsZUJpbmRpbmdzKCkuZm9yRWFjaCgoZGlyZWN0aXZlSW5kZXgsIG5hbWUpID0+IHtcbiAgICAgICAgaWYgKGlzQmxhbmsoZGlyZWN0aXZlSW5kZXgpKSB7XG4gICAgICAgICAgdmlldy5sb2NhbHMuc2V0KG5hbWUsIHZpZXcuZWxlbWVudFJlZnNbYm91bmRFbGVtZW50SWR4XS5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2aWV3LmxvY2Fscy5zZXQobmFtZSwgZWxlbWVudEluamVjdG9yLmdldERpcmVjdGl2ZUF0SW5kZXgoZGlyZWN0aXZlSW5kZXgpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfc2V0VXBFdmVudEVtaXR0ZXJzKHZpZXc6IHZpZXdNb2R1bGUuQXBwVmlldywgZWxlbWVudEluamVjdG9yOiBlbGkuRWxlbWVudEluamVjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgIGJvdW5kRWxlbWVudEluZGV4OiBudW1iZXIpIHtcbiAgICB2YXIgZW1pdHRlcnMgPSBlbGVtZW50SW5qZWN0b3IuZ2V0RXZlbnRFbWl0dGVyQWNjZXNzb3JzKCk7XG4gICAgZm9yICh2YXIgZGlyZWN0aXZlSW5kZXggPSAwOyBkaXJlY3RpdmVJbmRleCA8IGVtaXR0ZXJzLmxlbmd0aDsgKytkaXJlY3RpdmVJbmRleCkge1xuICAgICAgdmFyIGRpcmVjdGl2ZUVtaXR0ZXJzID0gZW1pdHRlcnNbZGlyZWN0aXZlSW5kZXhdO1xuICAgICAgdmFyIGRpcmVjdGl2ZSA9IGVsZW1lbnRJbmplY3Rvci5nZXREaXJlY3RpdmVBdEluZGV4KGRpcmVjdGl2ZUluZGV4KTtcblxuICAgICAgZm9yICh2YXIgZXZlbnRJbmRleCA9IDA7IGV2ZW50SW5kZXggPCBkaXJlY3RpdmVFbWl0dGVycy5sZW5ndGg7ICsrZXZlbnRJbmRleCkge1xuICAgICAgICB2YXIgZXZlbnRFbWl0dGVyQWNjZXNzb3IgPSBkaXJlY3RpdmVFbWl0dGVyc1tldmVudEluZGV4XTtcbiAgICAgICAgZXZlbnRFbWl0dGVyQWNjZXNzb3Iuc3Vic2NyaWJlKHZpZXcsIGJvdW5kRWxlbWVudEluZGV4LCBkaXJlY3RpdmUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGRlaHlkcmF0ZVZpZXcoaW5pdFZpZXc6IHZpZXdNb2R1bGUuQXBwVmlldykge1xuICAgIHZhciBlbmRWaWV3T2Zmc2V0ID0gaW5pdFZpZXcudmlld09mZnNldCArIGluaXRWaWV3LnByb3RvLm1lcmdlSW5mby52aWV3Q291bnQgLSAxO1xuICAgIGZvciAodmFyIHZpZXdJZHggPSBpbml0Vmlldy52aWV3T2Zmc2V0OyB2aWV3SWR4IDw9IGVuZFZpZXdPZmZzZXQ7IHZpZXdJZHgrKykge1xuICAgICAgdmFyIGN1cnJWaWV3ID0gaW5pdFZpZXcudmlld3Nbdmlld0lkeF07XG4gICAgICBpZiAoY3VyclZpZXcuaHlkcmF0ZWQoKSkge1xuICAgICAgICBpZiAoaXNQcmVzZW50KGN1cnJWaWV3LmxvY2FscykpIHtcbiAgICAgICAgICBjdXJyVmlldy5sb2NhbHMuY2xlYXJWYWx1ZXMoKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyVmlldy5jb250ZXh0ID0gbnVsbDtcbiAgICAgICAgY3VyclZpZXcuY2hhbmdlRGV0ZWN0b3IuZGVoeWRyYXRlKCk7XG4gICAgICAgIHZhciBiaW5kZXJzID0gY3VyclZpZXcucHJvdG8uZWxlbWVudEJpbmRlcnM7XG4gICAgICAgIGZvciAodmFyIGJpbmRlcklkeCA9IDA7IGJpbmRlcklkeCA8IGJpbmRlcnMubGVuZ3RoOyBiaW5kZXJJZHgrKykge1xuICAgICAgICAgIHZhciBlbGkgPSBpbml0Vmlldy5lbGVtZW50SW5qZWN0b3JzW2N1cnJWaWV3LmVsZW1lbnRPZmZzZXQgKyBiaW5kZXJJZHhdO1xuICAgICAgICAgIGlmIChpc1ByZXNlbnQoZWxpKSkge1xuICAgICAgICAgICAgZWxpLmRlaHlkcmF0ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL3ZpZXdfbWFuYWdlcl91dGlscy50c1xuICoqLyIsImltcG9ydCB7QmFzZUV4Y2VwdGlvbiwgdW5pbXBsZW1lbnRlZH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7Vmlld1JlZiwgVmlld1JlZl99IGZyb20gJy4vdmlld19yZWYnO1xuaW1wb3J0IHtSZW5kZXJWaWV3UmVmLCBSZW5kZXJFbGVtZW50UmVmLCBSZW5kZXJlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvcmVuZGVyL2FwaSc7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGxvY2F0aW9uIGluIGEgVmlldyB0aGF0IGhhcyBhbiBpbmplY3Rpb24sIGNoYW5nZS1kZXRlY3Rpb24gYW5kIHJlbmRlciBjb250ZXh0XG4gKiBhc3NvY2lhdGVkIHdpdGggaXQuXG4gKlxuICogQW4gYEVsZW1lbnRSZWZgIGlzIGNyZWF0ZWQgZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgVGVtcGxhdGUgdGhhdCBjb250YWlucyBhIERpcmVjdGl2ZSwgQ29tcG9uZW50XG4gKiBvciBkYXRhLWJpbmRpbmcuXG4gKlxuICogQW4gYEVsZW1lbnRSZWZgIGlzIGJhY2tlZCBieSBhIHJlbmRlci1zcGVjaWZpYyBlbGVtZW50LiBJbiB0aGUgYnJvd3NlciwgdGhpcyBpcyB1c3VhbGx5IGEgRE9NXG4gKiBlbGVtZW50LlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRWxlbWVudFJlZiBpbXBsZW1lbnRzIFJlbmRlckVsZW1lbnRSZWYge1xuICAvKipcbiAgICogQGludGVybmFsXG4gICAqXG4gICAqIFJlZmVyZW5jZSB0byB0aGUge0BsaW5rIFZpZXdSZWZ9IHRoYXQgdGhpcyBgRWxlbWVudFJlZmAgaXMgcGFydCBvZi5cbiAgICovXG4gIHBhcmVudFZpZXc6IFZpZXdSZWY7XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKlxuICAgKiBJbmRleCBvZiB0aGUgZWxlbWVudCBpbnNpZGUgdGhlIHtAbGluayBWaWV3UmVmfS5cbiAgICpcbiAgICogVGhpcyBpcyB1c2VkIGludGVybmFsbHkgYnkgdGhlIEFuZ3VsYXIgZnJhbWV3b3JrIHRvIGxvY2F0ZSBlbGVtZW50cy5cbiAgICovXG4gIGJvdW5kRWxlbWVudEluZGV4OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB1bmRlcmx5aW5nIG5hdGl2ZSBlbGVtZW50IG9yIGBudWxsYCBpZiBkaXJlY3QgYWNjZXNzIHRvIG5hdGl2ZSBlbGVtZW50cyBpcyBub3Qgc3VwcG9ydGVkXG4gICAqIChlLmcuIHdoZW4gdGhlIGFwcGxpY2F0aW9uIHJ1bnMgaW4gYSB3ZWIgd29ya2VyKS5cbiAgICpcbiAgICogPGRpdiBjbGFzcz1cImNhbGxvdXQgaXMtY3JpdGljYWxcIj5cbiAgICogICA8aGVhZGVyPlVzZSB3aXRoIGNhdXRpb248L2hlYWRlcj5cbiAgICogICA8cD5cbiAgICogICAgVXNlIHRoaXMgQVBJIGFzIHRoZSBsYXN0IHJlc29ydCB3aGVuIGRpcmVjdCBhY2Nlc3MgdG8gRE9NIGlzIG5lZWRlZC4gVXNlIHRlbXBsYXRpbmcgYW5kXG4gICAqICAgIGRhdGEtYmluZGluZyBwcm92aWRlZCBieSBBbmd1bGFyIGluc3RlYWQuIEFsdGVybmF0aXZlbHkgeW91IHRha2UgYSBsb29rIGF0IHtAbGluayBSZW5kZXJlcn1cbiAgICogICAgd2hpY2ggcHJvdmlkZXMgQVBJIHRoYXQgY2FuIHNhZmVseSBiZSB1c2VkIGV2ZW4gd2hlbiBkaXJlY3QgYWNjZXNzIHRvIG5hdGl2ZSBlbGVtZW50cyBpcyBub3RcbiAgICogICAgc3VwcG9ydGVkLlxuICAgKiAgIDwvcD5cbiAgICogICA8cD5cbiAgICogICAgUmVseWluZyBvbiBkaXJlY3QgRE9NIGFjY2VzcyBjcmVhdGVzIHRpZ2h0IGNvdXBsaW5nIGJldHdlZW4geW91ciBhcHBsaWNhdGlvbiBhbmQgcmVuZGVyaW5nXG4gICAqICAgIGxheWVycyB3aGljaCB3aWxsIG1ha2UgaXQgaW1wb3NzaWJsZSB0byBzZXBhcmF0ZSB0aGUgdHdvIGFuZCBkZXBsb3kgeW91ciBhcHBsaWNhdGlvbiBpbnRvIGFcbiAgICogICAgd2ViIHdvcmtlci5cbiAgICogICA8L3A+XG4gICAqIDwvZGl2PlxuICAgKi9cbiAgZ2V0IG5hdGl2ZUVsZW1lbnQoKTogYW55IHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfTtcblxuICBnZXQgcmVuZGVyVmlldygpOiBSZW5kZXJWaWV3UmVmIHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfVxufVxuXG5leHBvcnQgY2xhc3MgRWxlbWVudFJlZl8gZXh0ZW5kcyBFbGVtZW50UmVmIHtcbiAgY29uc3RydWN0b3IocHVibGljIHBhcmVudFZpZXc6IFZpZXdSZWYsXG5cbiAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAqIEluZGV4IG9mIHRoZSBlbGVtZW50IGluc2lkZSB0aGUge0BsaW5rIFZpZXdSZWZ9LlxuICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgKiBUaGlzIGlzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgQW5ndWxhciBmcmFtZXdvcmsgdG8gbG9jYXRlIGVsZW1lbnRzLlxuICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgcHVibGljIGJvdW5kRWxlbWVudEluZGV4OiBudW1iZXIsIHByaXZhdGUgX3JlbmRlcmVyOiBSZW5kZXJlcikge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBnZXQgcmVuZGVyVmlldygpOiBSZW5kZXJWaWV3UmVmIHsgcmV0dXJuICg8Vmlld1JlZl8+dGhpcy5wYXJlbnRWaWV3KS5yZW5kZXI7IH1cbiAgc2V0IHJlbmRlclZpZXcodmFsdWUpIHsgdW5pbXBsZW1lbnRlZCgpOyB9XG4gIGdldCBuYXRpdmVFbGVtZW50KCk6IGFueSB7IHJldHVybiB0aGlzLl9yZW5kZXJlci5nZXROYXRpdmVFbGVtZW50U3luYyh0aGlzKTsgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL2VsZW1lbnRfcmVmLnRzXG4gKiovIiwiaW1wb3J0IHtpbnRlcm5hbFZpZXcsIFByb3RvVmlld1JlZn0gZnJvbSAnLi92aWV3X3JlZic7XG5pbXBvcnQge0VsZW1lbnRSZWYsIEVsZW1lbnRSZWZffSBmcm9tICcuL2VsZW1lbnRfcmVmJztcbmltcG9ydCAqIGFzIHZpZXdNb2R1bGUgZnJvbSAnLi92aWV3JztcblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIEVtYmVkZGVkIFRlbXBsYXRlIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW5zdGFudGlhdGUgRW1iZWRkZWQgVmlld3MuXG4gKlxuICogWW91IGNhbiBhY2Nlc3MgYSBgVGVtcGxhdGVSZWZgLCBpbiB0d28gd2F5cy4gVmlhIGEgZGlyZWN0aXZlIHBsYWNlZCBvbiBhIGA8dGVtcGxhdGU+YCBlbGVtZW50IChvclxuICogZGlyZWN0aXZlIHByZWZpeGVkIHdpdGggYCpgKSBhbmQgaGF2ZSB0aGUgYFRlbXBsYXRlUmVmYCBmb3IgdGhpcyBFbWJlZGRlZCBWaWV3IGluamVjdGVkIGludG8gdGhlXG4gKiBjb25zdHJ1Y3RvciBvZiB0aGUgZGlyZWN0aXZlIHVzaW5nIHRoZSBgVGVtcGxhdGVSZWZgIFRva2VuLiBBbHRlcm5hdGl2ZWx5IHlvdSBjYW4gcXVlcnkgZm9yIHRoZVxuICogYFRlbXBsYXRlUmVmYCBmcm9tIGEgQ29tcG9uZW50IG9yIGEgRGlyZWN0aXZlIHZpYSB7QGxpbmsgUXVlcnl9LlxuICpcbiAqIFRvIGluc3RhbnRpYXRlIEVtYmVkZGVkIFZpZXdzIGJhc2VkIG9uIGEgVGVtcGxhdGUsIHVzZVxuICoge0BsaW5rIFZpZXdDb250YWluZXJSZWYjY3JlYXRlRW1iZWRkZWRWaWV3fSwgd2hpY2ggd2lsbCBjcmVhdGUgdGhlIFZpZXcgYW5kIGF0dGFjaCBpdCB0byB0aGVcbiAqIFZpZXcgQ29udGFpbmVyLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVGVtcGxhdGVSZWYge1xuICAvKipcbiAgICogVGhlIGxvY2F0aW9uIGluIHRoZSBWaWV3IHdoZXJlIHRoZSBFbWJlZGRlZCBWaWV3IGxvZ2ljYWxseSBiZWxvbmdzIHRvLlxuICAgKlxuICAgKiBUaGUgZGF0YS1iaW5kaW5nIGFuZCBpbmplY3Rpb24gY29udGV4dHMgb2YgRW1iZWRkZWQgVmlld3MgY3JlYXRlZCBmcm9tIHRoaXMgYFRlbXBsYXRlUmVmYFxuICAgKiBpbmhlcml0IGZyb20gdGhlIGNvbnRleHRzIG9mIHRoaXMgbG9jYXRpb24uXG4gICAqXG4gICAqIFR5cGljYWxseSBuZXcgRW1iZWRkZWQgVmlld3MgYXJlIGF0dGFjaGVkIHRvIHRoZSBWaWV3IENvbnRhaW5lciBvZiB0aGlzIGxvY2F0aW9uLCBidXQgaW5cbiAgICogYWR2YW5jZWQgdXNlLWNhc2VzLCB0aGUgVmlldyBjYW4gYmUgYXR0YWNoZWQgdG8gYSBkaWZmZXJlbnQgY29udGFpbmVyIHdoaWxlIGtlZXBpbmcgdGhlXG4gICAqIGRhdGEtYmluZGluZyBhbmQgaW5qZWN0aW9uIGNvbnRleHQgZnJvbSB0aGUgb3JpZ2luYWwgbG9jYXRpb24uXG4gICAqXG4gICAqL1xuICAvLyBUT0RPKGkpOiByZW5hbWUgdG8gYW5jaG9yIG9yIGxvY2F0aW9uXG4gIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY7XG5cbiAgLyoqXG4gICAqIEFsbG93cyB5b3UgdG8gY2hlY2sgaWYgdGhpcyBFbWJlZGRlZCBUZW1wbGF0ZSBkZWZpbmVzIExvY2FsIFZhcmlhYmxlIHdpdGggbmFtZSBtYXRjaGluZyBgbmFtZWAuXG4gICAqL1xuICBhYnN0cmFjdCBoYXNMb2NhbChuYW1lOiBzdHJpbmcpOiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVSZWZfIGV4dGVuZHMgVGVtcGxhdGVSZWYge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmVsZW1lbnRSZWYgPSBlbGVtZW50UmVmO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0UHJvdG9WaWV3KCk6IHZpZXdNb2R1bGUuQXBwUHJvdG9WaWV3IHtcbiAgICBsZXQgZWxlbWVudFJlZiA9IDxFbGVtZW50UmVmXz50aGlzLmVsZW1lbnRSZWY7XG4gICAgdmFyIHBhcmVudFZpZXcgPSBpbnRlcm5hbFZpZXcoZWxlbWVudFJlZi5wYXJlbnRWaWV3KTtcbiAgICByZXR1cm4gcGFyZW50Vmlldy5wcm90by5lbGVtZW50QmluZGVyc1tlbGVtZW50UmVmLmJvdW5kRWxlbWVudEluZGV4IC0gcGFyZW50Vmlldy5lbGVtZW50T2Zmc2V0XVxuICAgICAgICAubmVzdGVkUHJvdG9WaWV3O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZmVyZW5jZSB0byB0aGUgUHJvdG9WaWV3IHVzZWQgZm9yIGNyZWF0aW5nIEVtYmVkZGVkIFZpZXdzIHRoYXQgYXJlIGJhc2VkIG9uIHRoZSBjb21waWxlZFxuICAgKiBFbWJlZGRlZCBUZW1wbGF0ZS5cbiAgICovXG4gIGdldCBwcm90b1ZpZXdSZWYoKTogUHJvdG9WaWV3UmVmIHsgcmV0dXJuIHRoaXMuX2dldFByb3RvVmlldygpLnJlZjsgfVxuXG4gIGhhc0xvY2FsKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9nZXRQcm90b1ZpZXcoKS50ZW1wbGF0ZVZhcmlhYmxlQmluZGluZ3MuaGFzKG5hbWUpO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvdGVtcGxhdGVfcmVmLnRzXG4gKiovIiwiaW1wb3J0IHtJbmplY3QsIEluamVjdGFibGUsIE9wYXF1ZVRva2VufSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5cbmltcG9ydCB7aXNQcmVzZW50LCBpc0JsYW5rLCBDT05TVF9FWFBSfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtNYXBXcmFwcGVyLCBNYXB9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5cbmltcG9ydCAqIGFzIHZpZXdNb2R1bGUgZnJvbSAnLi92aWV3JztcblxuZXhwb3J0IGNvbnN0IEFQUF9WSUVXX1BPT0xfQ0FQQUNJVFkgPSBDT05TVF9FWFBSKG5ldyBPcGFxdWVUb2tlbignQXBwVmlld1Bvb2wudmlld1Bvb2xDYXBhY2l0eScpKTtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEFwcFZpZXdQb29sIHtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcG9vbENhcGFjaXR5UGVyUHJvdG9WaWV3OiBudW1iZXI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3Bvb2xlZFZpZXdzUGVyUHJvdG9WaWV3ID0gbmV3IE1hcDx2aWV3TW9kdWxlLkFwcFByb3RvVmlldywgQXJyYXk8dmlld01vZHVsZS5BcHBWaWV3Pj4oKTtcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KEFQUF9WSUVXX1BPT0xfQ0FQQUNJVFkpIHBvb2xDYXBhY2l0eVBlclByb3RvVmlldykge1xuICAgIHRoaXMuX3Bvb2xDYXBhY2l0eVBlclByb3RvVmlldyA9IHBvb2xDYXBhY2l0eVBlclByb3RvVmlldztcbiAgfVxuXG4gIGdldFZpZXcocHJvdG9WaWV3OiB2aWV3TW9kdWxlLkFwcFByb3RvVmlldyk6IHZpZXdNb2R1bGUuQXBwVmlldyB7XG4gICAgdmFyIHBvb2xlZFZpZXdzID0gdGhpcy5fcG9vbGVkVmlld3NQZXJQcm90b1ZpZXcuZ2V0KHByb3RvVmlldyk7XG4gICAgaWYgKGlzUHJlc2VudChwb29sZWRWaWV3cykgJiYgcG9vbGVkVmlld3MubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHBvb2xlZFZpZXdzLnBvcCgpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVyblZpZXcodmlldzogdmlld01vZHVsZS5BcHBWaWV3KTogYm9vbGVhbiB7XG4gICAgdmFyIHByb3RvVmlldyA9IHZpZXcucHJvdG87XG4gICAgdmFyIHBvb2xlZFZpZXdzID0gdGhpcy5fcG9vbGVkVmlld3NQZXJQcm90b1ZpZXcuZ2V0KHByb3RvVmlldyk7XG4gICAgaWYgKGlzQmxhbmsocG9vbGVkVmlld3MpKSB7XG4gICAgICBwb29sZWRWaWV3cyA9IFtdO1xuICAgICAgdGhpcy5fcG9vbGVkVmlld3NQZXJQcm90b1ZpZXcuc2V0KHByb3RvVmlldywgcG9vbGVkVmlld3MpO1xuICAgIH1cbiAgICB2YXIgaGF2ZVJlbWFpbmluZ0NhcGFjaXR5ID0gcG9vbGVkVmlld3MubGVuZ3RoIDwgdGhpcy5fcG9vbENhcGFjaXR5UGVyUHJvdG9WaWV3O1xuICAgIGlmIChoYXZlUmVtYWluaW5nQ2FwYWNpdHkpIHtcbiAgICAgIHBvb2xlZFZpZXdzLnB1c2godmlldyk7XG4gICAgfVxuICAgIHJldHVybiBoYXZlUmVtYWluaW5nQ2FwYWNpdHk7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci92aWV3X3Bvb2wudHNcbiAqKi8iLCJpbXBvcnQge0luamVjdGFibGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpJztcbmltcG9ydCAqIGFzIHZpZXdNb2R1bGUgZnJvbSAnLi92aWV3JztcblxuLyoqXG4gKiBMaXN0ZW5lciBmb3IgdmlldyBjcmVhdGlvbiAvIGRlc3RydWN0aW9uLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQXBwVmlld0xpc3RlbmVyIHtcbiAgb25WaWV3Q3JlYXRlZCh2aWV3OiB2aWV3TW9kdWxlLkFwcFZpZXcpIHt9XG4gIG9uVmlld0Rlc3Ryb3llZCh2aWV3OiB2aWV3TW9kdWxlLkFwcFZpZXcpIHt9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvdmlld19saXN0ZW5lci50c1xuICoqLyIsImltcG9ydCB7TGlzdFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge3VuaW1wbGVtZW50ZWR9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9ucyc7XG5pbXBvcnQge1Jlc29sdmVkUHJvdmlkZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpJztcbmltcG9ydCB7aXNQcmVzZW50LCBpc0JsYW5rfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuXG5pbXBvcnQgKiBhcyBhdm1Nb2R1bGUgZnJvbSAnLi92aWV3X21hbmFnZXInO1xuaW1wb3J0ICogYXMgdmlld01vZHVsZSBmcm9tICcuL3ZpZXcnO1xuXG5pbXBvcnQge0VsZW1lbnRSZWYsIEVsZW1lbnRSZWZffSBmcm9tICcuL2VsZW1lbnRfcmVmJztcbmltcG9ydCB7VGVtcGxhdGVSZWZ9IGZyb20gJy4vdGVtcGxhdGVfcmVmJztcbmltcG9ydCB7Vmlld1JlZiwgSG9zdFZpZXdSZWYsIFByb3RvVmlld1JlZiwgaW50ZXJuYWxWaWV3fSBmcm9tICcuL3ZpZXdfcmVmJztcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgY29udGFpbmVyIHdoZXJlIG9uZSBvciBtb3JlIFZpZXdzIGNhbiBiZSBhdHRhY2hlZC5cbiAqXG4gKiBUaGUgY29udGFpbmVyIGNhbiBjb250YWluIHR3byBraW5kcyBvZiBWaWV3cy4gSG9zdCBWaWV3cywgY3JlYXRlZCBieSBpbnN0YW50aWF0aW5nIGFcbiAqIHtAbGluayBDb21wb25lbnR9IHZpYSB7QGxpbmsgI2NyZWF0ZUhvc3RWaWV3fSwgYW5kIEVtYmVkZGVkIFZpZXdzLCBjcmVhdGVkIGJ5IGluc3RhbnRpYXRpbmcgYW5cbiAqIHtAbGluayBUZW1wbGF0ZVJlZiBFbWJlZGRlZCBUZW1wbGF0ZX0gdmlhIHtAbGluayAjY3JlYXRlRW1iZWRkZWRWaWV3fS5cbiAqXG4gKiBUaGUgbG9jYXRpb24gb2YgdGhlIFZpZXcgQ29udGFpbmVyIHdpdGhpbiB0aGUgY29udGFpbmluZyBWaWV3IGlzIHNwZWNpZmllZCBieSB0aGUgQW5jaG9yXG4gKiBgZWxlbWVudGAuIEVhY2ggVmlldyBDb250YWluZXIgY2FuIGhhdmUgb25seSBvbmUgQW5jaG9yIEVsZW1lbnQgYW5kIGVhY2ggQW5jaG9yIEVsZW1lbnQgY2FuIG9ubHlcbiAqIGhhdmUgYSBzaW5nbGUgVmlldyBDb250YWluZXIuXG4gKlxuICogUm9vdCBlbGVtZW50cyBvZiBWaWV3cyBhdHRhY2hlZCB0byB0aGlzIGNvbnRhaW5lciBiZWNvbWUgc2libGluZ3Mgb2YgdGhlIEFuY2hvciBFbGVtZW50IGluXG4gKiB0aGUgUmVuZGVyZWQgVmlldy5cbiAqXG4gKiBUbyBhY2Nlc3MgYSBgVmlld0NvbnRhaW5lclJlZmAgb2YgYW4gRWxlbWVudCwgeW91IGNhbiBlaXRoZXIgcGxhY2UgYSB7QGxpbmsgRGlyZWN0aXZlfSBpbmplY3RlZFxuICogd2l0aCBgVmlld0NvbnRhaW5lclJlZmAgb24gdGhlIEVsZW1lbnQsIG9yIHlvdSBvYnRhaW4gaXQgdmlhXG4gKiB7QGxpbmsgQXBwVmlld01hbmFnZXIjZ2V0Vmlld0NvbnRhaW5lcn0uXG4gKlxuICogPCEtLSBUT0RPKGkpOiB3ZSBhcmUgYWxzbyBjb25zaWRlcmluZyBFbGVtZW50UmVmI3ZpZXdDb250YWluZXIgYXBpIC0tPlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVmlld0NvbnRhaW5lclJlZiB7XG4gIC8qKlxuICAgKiBBbmNob3IgZWxlbWVudCB0aGF0IHNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YgdGhpcyBjb250YWluZXIgaW4gdGhlIGNvbnRhaW5pbmcgVmlldy5cbiAgICogPCEtLSBUT0RPOiByZW5hbWUgdG8gYW5jaG9yRWxlbWVudCAtLT5cbiAgICovXG4gIHB1YmxpYyBlbGVtZW50OiBFbGVtZW50UmVmO1xuXG4gIC8qKlxuICAgKiBEZXN0cm95cyBhbGwgVmlld3MgaW4gdGhpcyBjb250YWluZXIuXG4gICAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdGhpcy5yZW1vdmUoaSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHtAbGluayBWaWV3UmVmfSBmb3IgdGhlIFZpZXcgbG9jYXRlZCBpbiB0aGlzIGNvbnRhaW5lciBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LlxuICAgKi9cbiAgYWJzdHJhY3QgZ2V0KGluZGV4OiBudW1iZXIpOiBWaWV3UmVmO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgVmlld3MgY3VycmVudGx5IGF0dGFjaGVkIHRvIHRoaXMgY29udGFpbmVyLlxuICAgKi9cbiAgZ2V0IGxlbmd0aCgpOiBudW1iZXIgeyByZXR1cm4gdW5pbXBsZW1lbnRlZCgpOyB9O1xuXG4gIC8qKlxuICAgKiBJbnN0YW50aWF0ZXMgYW4gRW1iZWRkZWQgVmlldyBiYXNlZCBvbiB0aGUge0BsaW5rIFRlbXBsYXRlUmVmIGB0ZW1wbGF0ZVJlZmB9IGFuZCBpbnNlcnRzIGl0XG4gICAqIGludG8gdGhpcyBjb250YWluZXIgYXQgdGhlIHNwZWNpZmllZCBgaW5kZXhgLlxuICAgKlxuICAgKiBJZiBgaW5kZXhgIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBuZXcgVmlldyB3aWxsIGJlIGluc2VydGVkIGFzIHRoZSBsYXN0IFZpZXcgaW4gdGhlIGNvbnRhaW5lci5cbiAgICpcbiAgICogUmV0dXJucyB0aGUge0BsaW5rIFZpZXdSZWZ9IGZvciB0aGUgbmV3bHkgY3JlYXRlZCBWaWV3LlxuICAgKi9cbiAgYWJzdHJhY3QgY3JlYXRlRW1iZWRkZWRWaWV3KHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZiwgaW5kZXg/OiBudW1iZXIpOiBWaWV3UmVmO1xuXG4gIC8qKlxuICAgKiBJbnN0YW50aWF0ZXMgYSBzaW5nbGUge0BsaW5rIENvbXBvbmVudH0gYW5kIGluc2VydHMgaXRzIEhvc3QgVmlldyBpbnRvIHRoaXMgY29udGFpbmVyIGF0IHRoZVxuICAgKiBzcGVjaWZpZWQgYGluZGV4YC5cbiAgICpcbiAgICogVGhlIGNvbXBvbmVudCBpcyBpbnN0YW50aWF0ZWQgdXNpbmcgaXRzIHtAbGluayBQcm90b1ZpZXdSZWYgYHByb3RvVmlld2B9IHdoaWNoIGNhbiBiZVxuICAgKiBvYnRhaW5lZCB2aWEge0BsaW5rIENvbXBpbGVyI2NvbXBpbGVJbkhvc3R9LlxuICAgKlxuICAgKiBJZiBgaW5kZXhgIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBuZXcgVmlldyB3aWxsIGJlIGluc2VydGVkIGFzIHRoZSBsYXN0IFZpZXcgaW4gdGhlIGNvbnRhaW5lci5cbiAgICpcbiAgICogWW91IGNhbiBvcHRpb25hbGx5IHNwZWNpZnkgYGR5bmFtaWNhbGx5Q3JlYXRlZFByb3ZpZGVyc2AsIHdoaWNoIGNvbmZpZ3VyZSB0aGUge0BsaW5rIEluamVjdG9yfVxuICAgKiB0aGF0IHdpbGwgYmUgY3JlYXRlZCBmb3IgdGhlIEhvc3QgVmlldy5cbiAgICpcbiAgICogUmV0dXJucyB0aGUge0BsaW5rIEhvc3RWaWV3UmVmfSBvZiB0aGUgSG9zdCBWaWV3IGNyZWF0ZWQgZm9yIHRoZSBuZXdseSBpbnN0YW50aWF0ZWQgQ29tcG9uZW50LlxuICAgKi9cbiAgYWJzdHJhY3QgY3JlYXRlSG9zdFZpZXcocHJvdG9WaWV3UmVmPzogUHJvdG9WaWV3UmVmLCBpbmRleD86IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pY2FsbHlDcmVhdGVkUHJvdmlkZXJzPzogUmVzb2x2ZWRQcm92aWRlcltdKTogSG9zdFZpZXdSZWY7XG5cbiAgLyoqXG4gICAqIEluc2VydHMgYSBWaWV3IGlkZW50aWZpZWQgYnkgYSB7QGxpbmsgVmlld1JlZn0gaW50byB0aGUgY29udGFpbmVyIGF0IHRoZSBzcGVjaWZpZWQgYGluZGV4YC5cbiAgICpcbiAgICogSWYgYGluZGV4YCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgbmV3IFZpZXcgd2lsbCBiZSBpbnNlcnRlZCBhcyB0aGUgbGFzdCBWaWV3IGluIHRoZSBjb250YWluZXIuXG4gICAqXG4gICAqIFJldHVybnMgdGhlIGluc2VydGVkIHtAbGluayBWaWV3UmVmfS5cbiAgICovXG4gIGFic3RyYWN0IGluc2VydCh2aWV3UmVmOiBWaWV3UmVmLCBpbmRleD86IG51bWJlcik6IFZpZXdSZWY7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBWaWV3LCBzcGVjaWZpZWQgdmlhIHtAbGluayBWaWV3UmVmfSwgd2l0aGluIHRoZSBjdXJyZW50IGNvbnRhaW5lciBvclxuICAgKiBgLTFgIGlmIHRoaXMgY29udGFpbmVyIGRvZXNuJ3QgY29udGFpbiB0aGUgVmlldy5cbiAgICovXG4gIGFic3RyYWN0IGluZGV4T2Yodmlld1JlZjogVmlld1JlZik6IG51bWJlcjtcblxuICAvKipcbiAgICogRGVzdHJveXMgYSBWaWV3IGF0dGFjaGVkIHRvIHRoaXMgY29udGFpbmVyIGF0IHRoZSBzcGVjaWZpZWQgYGluZGV4YC5cbiAgICpcbiAgICogSWYgYGluZGV4YCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgbGFzdCBWaWV3IGluIHRoZSBjb250YWluZXIgd2lsbCBiZSByZW1vdmVkLlxuICAgKi9cbiAgYWJzdHJhY3QgcmVtb3ZlKGluZGV4PzogbnVtYmVyKTogdm9pZDtcblxuICAvKipcbiAgICogVXNlIGFsb25nIHdpdGgge0BsaW5rICNpbnNlcnR9IHRvIG1vdmUgYSBWaWV3IHdpdGhpbiB0aGUgY3VycmVudCBjb250YWluZXIuXG4gICAqXG4gICAqIElmIHRoZSBgaW5kZXhgIHBhcmFtIGlzIG9taXR0ZWQsIHRoZSBsYXN0IHtAbGluayBWaWV3UmVmfSBpcyBkZXRhY2hlZC5cbiAgICovXG4gIGFic3RyYWN0IGRldGFjaChpbmRleD86IG51bWJlcik6IFZpZXdSZWY7XG59XG5cbmV4cG9ydCBjbGFzcyBWaWV3Q29udGFpbmVyUmVmXyBleHRlbmRzIFZpZXdDb250YWluZXJSZWYge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdmlld01hbmFnZXI6IGF2bU1vZHVsZS5BcHBWaWV3TWFuYWdlciwgZWxlbWVudDogRWxlbWVudFJlZikge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFZpZXdzKCk6IEFycmF5PHZpZXdNb2R1bGUuQXBwVmlldz4ge1xuICAgIGxldCBlbGVtZW50ID0gPEVsZW1lbnRSZWZfPnRoaXMuZWxlbWVudDtcbiAgICB2YXIgdmMgPSBpbnRlcm5hbFZpZXcoZWxlbWVudC5wYXJlbnRWaWV3KS52aWV3Q29udGFpbmVyc1tlbGVtZW50LmJvdW5kRWxlbWVudEluZGV4XTtcbiAgICByZXR1cm4gaXNQcmVzZW50KHZjKSA/IHZjLnZpZXdzIDogW107XG4gIH1cblxuICBnZXQoaW5kZXg6IG51bWJlcik6IFZpZXdSZWYgeyByZXR1cm4gdGhpcy5fZ2V0Vmlld3MoKVtpbmRleF0ucmVmOyB9XG4gIGdldCBsZW5ndGgoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX2dldFZpZXdzKCkubGVuZ3RoOyB9XG5cbiAgLy8gVE9ETyhyYWRvKTogcHJvZmlsZSBhbmQgZGVjaWRlIHdoZXRoZXIgYm91bmRzIGNoZWNrcyBzaG91bGQgYmUgYWRkZWRcbiAgLy8gdG8gdGhlIG1ldGhvZHMgYmVsb3cuXG4gIGNyZWF0ZUVtYmVkZGVkVmlldyh0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWYsIGluZGV4OiBudW1iZXIgPSAtMSk6IFZpZXdSZWYge1xuICAgIGlmIChpbmRleCA9PSAtMSkgaW5kZXggPSB0aGlzLmxlbmd0aDtcbiAgICByZXR1cm4gdGhpcy52aWV3TWFuYWdlci5jcmVhdGVFbWJlZGRlZFZpZXdJbkNvbnRhaW5lcih0aGlzLmVsZW1lbnQsIGluZGV4LCB0ZW1wbGF0ZVJlZik7XG4gIH1cblxuICBjcmVhdGVIb3N0Vmlldyhwcm90b1ZpZXdSZWY6IFByb3RvVmlld1JlZiA9IG51bGwsIGluZGV4OiBudW1iZXIgPSAtMSxcbiAgICAgICAgICAgICAgICAgZHluYW1pY2FsbHlDcmVhdGVkUHJvdmlkZXJzOiBSZXNvbHZlZFByb3ZpZGVyW10gPSBudWxsKTogSG9zdFZpZXdSZWYge1xuICAgIGlmIChpbmRleCA9PSAtMSkgaW5kZXggPSB0aGlzLmxlbmd0aDtcbiAgICByZXR1cm4gdGhpcy52aWV3TWFuYWdlci5jcmVhdGVIb3N0Vmlld0luQ29udGFpbmVyKHRoaXMuZWxlbWVudCwgaW5kZXgsIHByb3RvVmlld1JlZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNhbGx5Q3JlYXRlZFByb3ZpZGVycyk7XG4gIH1cblxuICAvLyBUT0RPKGkpOiByZWZhY3RvciBpbnNlcnQrcmVtb3ZlIGludG8gbW92ZVxuICBpbnNlcnQodmlld1JlZjogVmlld1JlZiwgaW5kZXg6IG51bWJlciA9IC0xKTogVmlld1JlZiB7XG4gICAgaWYgKGluZGV4ID09IC0xKSBpbmRleCA9IHRoaXMubGVuZ3RoO1xuICAgIHJldHVybiB0aGlzLnZpZXdNYW5hZ2VyLmF0dGFjaFZpZXdJbkNvbnRhaW5lcih0aGlzLmVsZW1lbnQsIGluZGV4LCB2aWV3UmVmKTtcbiAgfVxuXG4gIGluZGV4T2Yodmlld1JlZjogVmlld1JlZik6IG51bWJlciB7XG4gICAgcmV0dXJuIExpc3RXcmFwcGVyLmluZGV4T2YodGhpcy5fZ2V0Vmlld3MoKSwgaW50ZXJuYWxWaWV3KHZpZXdSZWYpKTtcbiAgfVxuXG4gIC8vIFRPRE8oaSk6IHJlbmFtZSB0byBkZXN0cm95XG4gIHJlbW92ZShpbmRleDogbnVtYmVyID0gLTEpOiB2b2lkIHtcbiAgICBpZiAoaW5kZXggPT0gLTEpIGluZGV4ID0gdGhpcy5sZW5ndGggLSAxO1xuICAgIHRoaXMudmlld01hbmFnZXIuZGVzdHJveVZpZXdJbkNvbnRhaW5lcih0aGlzLmVsZW1lbnQsIGluZGV4KTtcbiAgICAvLyB2aWV3IGlzIGludGVudGlvbmFsbHkgbm90IHJldHVybmVkIHRvIHRoZSBjbGllbnQuXG4gIH1cblxuICAvLyBUT0RPKGkpOiByZWZhY3RvciBpbnNlcnQrcmVtb3ZlIGludG8gbW92ZVxuICBkZXRhY2goaW5kZXg6IG51bWJlciA9IC0xKTogVmlld1JlZiB7XG4gICAgaWYgKGluZGV4ID09IC0xKSBpbmRleCA9IHRoaXMubGVuZ3RoIC0gMTtcbiAgICByZXR1cm4gdGhpcy52aWV3TWFuYWdlci5kZXRhY2hWaWV3SW5Db250YWluZXIodGhpcy5lbGVtZW50LCBpbmRleCk7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci92aWV3X2NvbnRhaW5lcl9yZWYudHNcbiAqKi8iLCJpbXBvcnQge1R5cGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge0xpZmVjeWNsZUhvb2tzfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gaGFzTGlmZWN5Y2xlSG9vayhsY0ludGVyZmFjZTogTGlmZWN5Y2xlSG9va3MsIHRva2VuKTogYm9vbGVhbiB7XG4gIGlmICghKHRva2VuIGluc3RhbmNlb2YgVHlwZSkpIHJldHVybiBmYWxzZTtcblxuICB2YXIgcHJvdG8gPSAoPGFueT50b2tlbikucHJvdG90eXBlO1xuXG4gIHN3aXRjaCAobGNJbnRlcmZhY2UpIHtcbiAgICBjYXNlIExpZmVjeWNsZUhvb2tzLkFmdGVyQ29udGVudEluaXQ6XG4gICAgICByZXR1cm4gISFwcm90by5uZ0FmdGVyQ29udGVudEluaXQ7XG4gICAgY2FzZSBMaWZlY3ljbGVIb29rcy5BZnRlckNvbnRlbnRDaGVja2VkOlxuICAgICAgcmV0dXJuICEhcHJvdG8ubmdBZnRlckNvbnRlbnRDaGVja2VkO1xuICAgIGNhc2UgTGlmZWN5Y2xlSG9va3MuQWZ0ZXJWaWV3SW5pdDpcbiAgICAgIHJldHVybiAhIXByb3RvLm5nQWZ0ZXJWaWV3SW5pdDtcbiAgICBjYXNlIExpZmVjeWNsZUhvb2tzLkFmdGVyVmlld0NoZWNrZWQ6XG4gICAgICByZXR1cm4gISFwcm90by5uZ0FmdGVyVmlld0NoZWNrZWQ7XG4gICAgY2FzZSBMaWZlY3ljbGVIb29rcy5PbkNoYW5nZXM6XG4gICAgICByZXR1cm4gISFwcm90by5uZ09uQ2hhbmdlcztcbiAgICBjYXNlIExpZmVjeWNsZUhvb2tzLkRvQ2hlY2s6XG4gICAgICByZXR1cm4gISFwcm90by5uZ0RvQ2hlY2s7XG4gICAgY2FzZSBMaWZlY3ljbGVIb29rcy5PbkRlc3Ryb3k6XG4gICAgICByZXR1cm4gISFwcm90by5uZ09uRGVzdHJveTtcbiAgICBjYXNlIExpZmVjeWNsZUhvb2tzLk9uSW5pdDpcbiAgICAgIHJldHVybiAhIXByb3RvLm5nT25Jbml0O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9kaXJlY3RpdmVfbGlmZWN5Y2xlX3JlZmxlY3Rvci50c1xuICoqLyIsImltcG9ydCB7TWFwV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcbmltcG9ydCB7U2ltcGxlQ2hhbmdlfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2NoYW5nZV9kZXRlY3Rpb25fdXRpbCc7XG5cbmV4cG9ydCBlbnVtIExpZmVjeWNsZUhvb2tzIHtcbiAgT25Jbml0LFxuICBPbkRlc3Ryb3ksXG4gIERvQ2hlY2ssXG4gIE9uQ2hhbmdlcyxcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQWZ0ZXJDb250ZW50Q2hlY2tlZCxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQWZ0ZXJWaWV3Q2hlY2tlZFxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgdmFyIExJRkVDWUNMRV9IT09LU19WQUxVRVMgPSBbXG4gIExpZmVjeWNsZUhvb2tzLk9uSW5pdCxcbiAgTGlmZWN5Y2xlSG9va3MuT25EZXN0cm95LFxuICBMaWZlY3ljbGVIb29rcy5Eb0NoZWNrLFxuICBMaWZlY3ljbGVIb29rcy5PbkNoYW5nZXMsXG4gIExpZmVjeWNsZUhvb2tzLkFmdGVyQ29udGVudEluaXQsXG4gIExpZmVjeWNsZUhvb2tzLkFmdGVyQ29udGVudENoZWNrZWQsXG4gIExpZmVjeWNsZUhvb2tzLkFmdGVyVmlld0luaXQsXG4gIExpZmVjeWNsZUhvb2tzLkFmdGVyVmlld0NoZWNrZWRcbl07XG5cbi8qKlxuICogTGlmZWN5Y2xlIGhvb2tzIGFyZSBndWFyYW50ZWVkIHRvIGJlIGNhbGxlZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOlxuICogLSBgT25DaGFuZ2VzYCAoaWYgYW55IGJpbmRpbmdzIGhhdmUgY2hhbmdlZCksXG4gKiAtIGBPbkluaXRgIChhZnRlciB0aGUgZmlyc3QgY2hlY2sgb25seSksXG4gKiAtIGBEb0NoZWNrYCxcbiAqIC0gYEFmdGVyQ29udGVudEluaXRgLFxuICogLSBgQWZ0ZXJDb250ZW50Q2hlY2tlZGAsXG4gKiAtIGBBZnRlclZpZXdJbml0YCxcbiAqIC0gYEFmdGVyVmlld0NoZWNrZWRgLFxuICogLSBgT25EZXN0cm95YCAoYXQgdGhlIHZlcnkgZW5kIGJlZm9yZSBkZXN0cnVjdGlvbilcbiAqL1xuXG4vKipcbiAqIEltcGxlbWVudCB0aGlzIGludGVyZmFjZSB0byBnZXQgbm90aWZpZWQgd2hlbiBhbnkgZGF0YS1ib3VuZCBwcm9wZXJ0eSBvZiB5b3VyIGRpcmVjdGl2ZSBjaGFuZ2VzLlxuICpcbiAqIGBuZ09uQ2hhbmdlc2AgaXMgY2FsbGVkIHJpZ2h0IGFmdGVyIHRoZSBkYXRhLWJvdW5kIHByb3BlcnRpZXMgaGF2ZSBiZWVuIGNoZWNrZWQgYW5kIGJlZm9yZSB2aWV3XG4gKiBhbmQgY29udGVudCBjaGlsZHJlbiBhcmUgY2hlY2tlZCBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlbSBoYXMgY2hhbmdlZC5cbiAqXG4gKiBUaGUgYGNoYW5nZXNgIHBhcmFtZXRlciBjb250YWlucyBhbiBlbnRyeSBmb3IgZWFjaCBvZiB0aGUgY2hhbmdlZCBkYXRhLWJvdW5kIHByb3BlcnR5LiBUaGUga2V5IGlzXG4gKiB0aGUgcHJvcGVydHkgbmFtZSBhbmQgdGhlIHZhbHVlIGlzIGFuIGluc3RhbmNlIG9mIHtAbGluayBTaW1wbGVDaGFuZ2V9LlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBleGFtcGxlXShodHRwOi8vcGxua3IuY28vZWRpdC9BSHJCNm9wTHFIREJQa3Q0S3BkVD9wPXByZXZpZXcpKTpcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICdteS1jbXAnLFxuICogICB0ZW1wbGF0ZTogYDxwPm15UHJvcCA9IHt7bXlQcm9wfX08L3A+YFxuICogfSlcbiAqIGNsYXNzIE15Q29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAqICAgQElucHV0KCkgbXlQcm9wOiBhbnk7XG4gKlxuICogICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiB7W3Byb3BOYW1lOiBzdHJpbmddOiBTaW1wbGVDaGFuZ2V9KSB7XG4gKiAgICAgY29uc29sZS5sb2coJ25nT25DaGFuZ2VzIC0gbXlQcm9wID0gJyArIGNoYW5nZXNbJ215UHJvcCddLmN1cnJlbnRWYWx1ZSk7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICdhcHAnLFxuICogICB0ZW1wbGF0ZTogYFxuICogICAgIDxidXR0b24gKGNsaWNrKT1cInZhbHVlID0gdmFsdWUgKyAxXCI+Q2hhbmdlIE15Q29tcG9uZW50PC9idXR0b24+XG4gKiAgICAgPG15LWNtcCBbbXktcHJvcF09XCJ2YWx1ZVwiPjwvbXktY21wPmAsXG4gKiAgIGRpcmVjdGl2ZXM6IFtNeUNvbXBvbmVudF1cbiAqIH0pXG4gKiBleHBvcnQgY2xhc3MgQXBwIHtcbiAqICAgdmFsdWUgPSAwO1xuICogfVxuICpcbiAqIGJvb3RzdHJhcChBcHApLmNhdGNoKGVyciA9PiBjb25zb2xlLmVycm9yKGVycikpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT25DaGFuZ2VzIHsgbmdPbkNoYW5nZXMoY2hhbmdlczoge1trZXk6IHN0cmluZ106IFNpbXBsZUNoYW5nZX0pOyB9XG5cbi8qKlxuICogSW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIHRvIGV4ZWN1dGUgY3VzdG9tIGluaXRpYWxpemF0aW9uIGxvZ2ljIGFmdGVyIHlvdXIgZGlyZWN0aXZlJ3NcbiAqIGRhdGEtYm91bmQgcHJvcGVydGllcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQuXG4gKlxuICogYG5nT25Jbml0YCBpcyBjYWxsZWQgcmlnaHQgYWZ0ZXIgdGhlIGRpcmVjdGl2ZSdzIGRhdGEtYm91bmQgcHJvcGVydGllcyBoYXZlIGJlZW4gY2hlY2tlZCBmb3IgdGhlXG4gKiBmaXJzdCB0aW1lLCBhbmQgYmVmb3JlIGFueSBvZiBpdHMgY2hpbGRyZW4gaGF2ZSBiZWVuIGNoZWNrZWQuIEl0IGlzIGludm9rZWQgb25seSBvbmNlIHdoZW4gdGhlXG4gKiBkaXJlY3RpdmUgaXMgaW5zdGFudGlhdGVkLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBleGFtcGxlXShodHRwOi8vcGxua3IuY28vZWRpdC8xTUJ5cFJyeVhkNjR2NHBWMDNZbj9wPXByZXZpZXcpKVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIEBDb21wb25lbnQoe1xuICogICBzZWxlY3RvcjogJ215LWNtcCcsXG4gKiAgIHRlbXBsYXRlOiBgPHA+bXktY29tcG9uZW50PC9wPmBcbiAqIH0pXG4gKiBjbGFzcyBNeUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAqICAgbmdPbkluaXQoKSB7XG4gKiAgICAgY29uc29sZS5sb2coJ25nT25Jbml0Jyk7XG4gKiAgIH1cbiAqXG4gKiAgIG5nT25EZXN0cm95KCkge1xuICogICAgIGNvbnNvbGUubG9nKCduZ09uRGVzdHJveScpO1xuICogICB9XG4gKiB9XG4gKlxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAnYXBwJyxcbiAqICAgdGVtcGxhdGU6IGBcbiAqICAgICA8YnV0dG9uIChjbGljayk9XCJoYXNDaGlsZCA9ICFoYXNDaGlsZFwiPlxuICogICAgICAge3toYXNDaGlsZCA/ICdEZXN0cm95JyA6ICdDcmVhdGUnfX0gTXlDb21wb25lbnRcbiAqICAgICA8L2J1dHRvbj5cbiAqICAgICA8bXktY21wICpuZ0lmPVwiaGFzQ2hpbGRcIj48L215LWNtcD5gLFxuICogICBkaXJlY3RpdmVzOiBbTXlDb21wb25lbnQsIE5nSWZdXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIEFwcCB7XG4gKiAgIGhhc0NoaWxkID0gdHJ1ZTtcbiAqIH1cbiAqXG4gKiBib290c3RyYXAoQXBwKS5jYXRjaChlcnIgPT4gY29uc29sZS5lcnJvcihlcnIpKTtcbiAqICBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPbkluaXQgeyBuZ09uSW5pdCgpOyB9XG5cbi8qKlxuICogSW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGNoYW5nZSBkZXRlY3Rpb24gYWxnb3JpdGhtIGZvciB5b3VyIGRpcmVjdGl2ZS5cbiAqXG4gKiBgbmdEb0NoZWNrYCBnZXRzIGNhbGxlZCB0byBjaGVjayB0aGUgY2hhbmdlcyBpbiB0aGUgZGlyZWN0aXZlcyBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGFsZ29yaXRobS5cbiAqXG4gKiBUaGUgZGVmYXVsdCBjaGFuZ2UgZGV0ZWN0aW9uIGFsZ29yaXRobSBsb29rcyBmb3IgZGlmZmVyZW5jZXMgYnkgY29tcGFyaW5nIGJvdW5kLXByb3BlcnR5IHZhbHVlc1xuICogYnkgcmVmZXJlbmNlIGFjcm9zcyBjaGFuZ2UgZGV0ZWN0aW9uIHJ1bnMuIFdoZW4gYERvQ2hlY2tgIGlzIGltcGxlbWVudGVkLCB0aGUgZGVmYXVsdCBhbGdvcml0aG1cbiAqIGlzIGRpc2FibGVkIGFuZCBgbmdEb0NoZWNrYCBpcyByZXNwb25zaWJsZSBmb3IgY2hlY2tpbmcgZm9yIGNoYW5nZXMuXG4gKlxuICogSW1wbGVtZW50aW5nIHRoaXMgaW50ZXJmYWNlIGFsbG93cyBpbXByb3ZpbmcgcGVyZm9ybWFuY2UgYnkgdXNpbmcgaW5zaWdodHMgYWJvdXQgdGhlIGNvbXBvbmVudCxcbiAqIGl0cyBpbXBsZW1lbnRhdGlvbiBhbmQgZGF0YSB0eXBlcyBvZiBpdHMgcHJvcGVydGllcy5cbiAqXG4gKiBOb3RlIHRoYXQgYSBkaXJlY3RpdmUgc2hvdWxkIG5vdCBpbXBsZW1lbnQgYm90aCBgRG9DaGVja2AgYW5kIHtAbGluayBPbkNoYW5nZXN9IGF0IHRoZSBzYW1lIHRpbWUuXG4gKiBgbmdPbkNoYW5nZXNgIHdvdWxkIG5vdCBiZSBjYWxsZWQgd2hlbiBhIGRpcmVjdGl2ZSBpbXBsZW1lbnRzIGBEb0NoZWNrYC4gUmVhY3Rpb24gdG8gdGhlIGNoYW5nZXNcbiAqIGhhdmUgdG8gYmUgaGFuZGxlZCBmcm9tIHdpdGhpbiB0aGUgYG5nRG9DaGVja2AgY2FsbGJhY2suXG4gKlxuICogVXNlIHtAbGluayBLZXlWYWx1ZURpZmZlcnN9IGFuZCB7QGxpbmsgSXRlcmFibGVEaWZmZXJzfSB0byBhZGQgeW91ciBjdXN0b20gY2hlY2sgbWVjaGFuaXNtcy5cbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvUXBuSWxGMENSMmk1YmNZYkhFVUo/cD1wcmV2aWV3KSlcbiAqXG4gKiBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUgYG5nRG9DaGVja2AgdXNlcyBhbiB7QGxpbmsgSXRlcmFibGVEaWZmZXJzfSB0byBkZXRlY3QgdGhlIHVwZGF0ZXMgdG8gdGhlXG4gKiBhcnJheSBgbGlzdGA6XG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAnY3VzdG9tLWNoZWNrJyxcbiAqICAgdGVtcGxhdGU6IGBcbiAqICAgICA8cD5DaGFuZ2VzOjwvcD5cbiAqICAgICA8dWw+XG4gKiAgICAgICA8bGkgKm5nRm9yPVwiI2xpbmUgb2YgbG9nc1wiPnt7bGluZX19PC9saT5cbiAqICAgICA8L3VsPmAsXG4gKiAgIGRpcmVjdGl2ZXM6IFtOZ0Zvcl1cbiAqIH0pXG4gKiBjbGFzcyBDdXN0b21DaGVja0NvbXBvbmVudCBpbXBsZW1lbnRzIERvQ2hlY2sge1xuICogICBASW5wdXQoKSBsaXN0OiBhbnlbXTtcbiAqICAgZGlmZmVyOiBhbnk7XG4gKiAgIGxvZ3MgPSBbXTtcbiAqXG4gKiAgIGNvbnN0cnVjdG9yKGRpZmZlcnM6IEl0ZXJhYmxlRGlmZmVycykge1xuICogICAgIHRoaXMuZGlmZmVyID0gZGlmZmVycy5maW5kKFtdKS5jcmVhdGUobnVsbCk7XG4gKiAgIH1cbiAqXG4gKiAgIG5nRG9DaGVjaygpIHtcbiAqICAgICB2YXIgY2hhbmdlcyA9IHRoaXMuZGlmZmVyLmRpZmYodGhpcy5saXN0KTtcbiAqXG4gKiAgICAgaWYgKGNoYW5nZXMpIHtcbiAqICAgICAgIGNoYW5nZXMuZm9yRWFjaEFkZGVkSXRlbShyID0+IHRoaXMubG9ncy5wdXNoKCdhZGRlZCAnICsgci5pdGVtKSk7XG4gKiAgICAgICBjaGFuZ2VzLmZvckVhY2hSZW1vdmVkSXRlbShyID0+IHRoaXMubG9ncy5wdXNoKCdyZW1vdmVkICcgKyByLml0ZW0pKVxuICogICAgIH1cbiAqICAgfVxuICogfVxuICpcbiAqIEBDb21wb25lbnQoe1xuICogICBzZWxlY3RvcjogJ2FwcCcsXG4gKiAgIHRlbXBsYXRlOiBgXG4gKiAgICAgPGJ1dHRvbiAoY2xpY2spPVwibGlzdC5wdXNoKGxpc3QubGVuZ3RoKVwiPlB1c2g8L2J1dHRvbj5cbiAqICAgICA8YnV0dG9uIChjbGljayk9XCJsaXN0LnBvcCgpXCI+UG9wPC9idXR0b24+XG4gKiAgICAgPGN1c3RvbS1jaGVjayBbbGlzdF09XCJsaXN0XCI+PC9jdXN0b20tY2hlY2s+YCxcbiAqICAgZGlyZWN0aXZlczogW0N1c3RvbUNoZWNrQ29tcG9uZW50XVxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBBcHAge1xuICogICBsaXN0ID0gW107XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb0NoZWNrIHsgbmdEb0NoZWNrKCk7IH1cblxuLyoqXG4gKiBJbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgdG8gZ2V0IG5vdGlmaWVkIHdoZW4geW91ciBkaXJlY3RpdmUgaXMgZGVzdHJveWVkLlxuICpcbiAqIGBuZ09uRGVzdHJveWAgY2FsbGJhY2sgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIGFueSBjdXN0b20gY2xlYW51cCB0aGF0IG5lZWRzIHRvIG9jY3VyIHdoZW4gdGhlXG4gKiBpbnN0YW5jZSBpcyBkZXN0cm95ZWRcbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZXhhbXBsZV0oaHR0cDovL3BsbmtyLmNvL2VkaXQvMU1CeXBScnlYZDY0djRwVjAzWW4/cD1wcmV2aWV3KSlcbiAqXG4gKiBgYGB0eXBlc3JpcHRcbiAqIEBDb21wb25lbnQoe1xuICogICBzZWxlY3RvcjogJ215LWNtcCcsXG4gKiAgIHRlbXBsYXRlOiBgPHA+bXktY29tcG9uZW50PC9wPmBcbiAqIH0pXG4gKiBjbGFzcyBNeUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAqICAgbmdPbkluaXQoKSB7XG4gKiAgICAgY29uc29sZS5sb2coJ25nT25Jbml0Jyk7XG4gKiAgIH1cbiAqXG4gKiAgIG5nT25EZXN0cm95KCkge1xuICogICAgIGNvbnNvbGUubG9nKCduZ09uRGVzdHJveScpO1xuICogICB9XG4gKiB9XG4gKlxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAnYXBwJyxcbiAqICAgdGVtcGxhdGU6IGBcbiAqICAgICA8YnV0dG9uIChjbGljayk9XCJoYXNDaGlsZCA9ICFoYXNDaGlsZFwiPlxuICogICAgICAge3toYXNDaGlsZCA/ICdEZXN0cm95JyA6ICdDcmVhdGUnfX0gTXlDb21wb25lbnRcbiAqICAgICA8L2J1dHRvbj5cbiAqICAgICA8bXktY21wICpuZ0lmPVwiaGFzQ2hpbGRcIj48L215LWNtcD5gLFxuICogICBkaXJlY3RpdmVzOiBbTXlDb21wb25lbnQsIE5nSWZdXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIEFwcCB7XG4gKiAgIGhhc0NoaWxkID0gdHJ1ZTtcbiAqIH1cbiAqXG4gKiBib290c3RyYXAoQXBwKS5jYXRjaChlcnIgPT4gY29uc29sZS5lcnJvcihlcnIpKTtcbiAqIGBgYFxuICpcbiAqXG4gKiBUbyBjcmVhdGUgYSBzdGF0ZWZ1bCBQaXBlLCB5b3Ugc2hvdWxkIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBhbmQgc2V0IHRoZSBgcHVyZWBcbiAqIHBhcmFtZXRlciB0byBgZmFsc2VgIGluIHRoZSB7QGxpbmsgUGlwZU1ldGFkYXRhfS5cbiAqXG4gKiBBIHN0YXRlZnVsIHBpcGUgbWF5IHByb2R1Y2UgZGlmZmVyZW50IG91dHB1dCwgZ2l2ZW4gdGhlIHNhbWUgaW5wdXQuIEl0IGlzXG4gKiBsaWtlbHkgdGhhdCBhIHN0YXRlZnVsIHBpcGUgbWF5IGNvbnRhaW4gc3RhdGUgdGhhdCBzaG91bGQgYmUgY2xlYW5lZCB1cCB3aGVuXG4gKiBhIGJpbmRpbmcgaXMgZGVzdHJveWVkLiBGb3IgZXhhbXBsZSwgYSBzdWJzY3JpcHRpb24gdG8gYSBzdHJlYW0gb2YgZGF0YSBtYXkgbmVlZCB0b1xuICogYmUgZGlzcG9zZWQsIG9yIGFuIGludGVydmFsIG1heSBuZWVkIHRvIGJlIGNsZWFyZWQuXG4gKlxuICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L2k4cG01YnJPNHNQYUx4Qng1Nk1SP3A9cHJldmlldykpXG4gKlxuICogSW4gdGhpcyBleGFtcGxlLCBhIHBpcGUgaXMgY3JlYXRlZCB0byBjb3VudGRvd24gaXRzIGlucHV0IHZhbHVlLCB1cGRhdGluZyBpdCBldmVyeVxuICogNTBtcy4gQmVjYXVzZSBpdCBtYWludGFpbnMgYW4gaW50ZXJuYWwgaW50ZXJ2YWwsIGl0IGF1dG9tYXRpY2FsbHkgY2xlYXJzXG4gKiB0aGUgaW50ZXJ2YWwgd2hlbiB0aGUgYmluZGluZyBpcyBkZXN0cm95ZWQgb3IgdGhlIGNvdW50ZG93biBjb21wbGV0ZXMuXG4gKlxuICogYGBgXG4gKiBpbXBvcnQge09uRGVzdHJveSwgUGlwZSwgUGlwZVRyYW5zZm9ybX0gZnJvbSAnYW5ndWxhcjIvY29yZSdcbiAqIEBQaXBlKHtuYW1lOiAnY291bnRkb3duJywgcHVyZTogZmFsc2V9KVxuICogY2xhc3MgQ291bnREb3duIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSwgT25EZXN0cm95IHtcbiAqICAgcmVtYWluaW5nVGltZTpOdW1iZXI7XG4gKiAgIGludGVydmFsOlNldEludGVydmFsO1xuICogICBuZ09uRGVzdHJveSgpIHtcbiAqICAgICBpZiAodGhpcy5pbnRlcnZhbCkge1xuICogICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsKTtcbiAqICAgICB9XG4gKiAgIH1cbiAqICAgdHJhbnNmb3JtKHZhbHVlOiBhbnksIGFyZ3M6IGFueVtdID0gW10pIHtcbiAqICAgICBpZiAoIXBhcnNlSW50KHZhbHVlLCAxMCkpIHJldHVybiBudWxsO1xuICogICAgIGlmICh0eXBlb2YgdGhpcy5yZW1haW5pbmdUaW1lICE9PSAnbnVtYmVyJykge1xuICogICAgICAgdGhpcy5yZW1haW5pbmdUaW1lID0gcGFyc2VJbnQodmFsdWUsIDEwKTtcbiAqICAgICB9XG4gKiAgICAgaWYgKCF0aGlzLmludGVydmFsKSB7XG4gKiAgICAgICB0aGlzLmludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICogICAgICAgICB0aGlzLnJlbWFpbmluZ1RpbWUtPTUwO1xuICogICAgICAgICBpZiAodGhpcy5yZW1haW5pbmdUaW1lIDw9IDApIHtcbiAqICAgICAgICAgICB0aGlzLnJlbWFpbmluZ1RpbWUgPSAwO1xuICogICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbCk7XG4gKiAgICAgICAgICAgZGVsZXRlIHRoaXMuaW50ZXJ2YWw7XG4gKiAgICAgICAgIH1cbiAqICAgICAgIH0sIDUwKTtcbiAqICAgICB9XG4gKiAgICAgcmV0dXJuIHRoaXMucmVtYWluaW5nVGltZTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogSW52b2tpbmcgYHt7IDEwMDAwIHwgY291bnRkb3duIH19YCB3b3VsZCBjYXVzZSB0aGUgdmFsdWUgdG8gYmUgZGVjcmVtZW50ZWQgYnkgNTAsXG4gKiBldmVyeSA1MG1zLCB1bnRpbCBpdCByZWFjaGVzIDAuXG4gKlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9uRGVzdHJveSB7IG5nT25EZXN0cm95KCk7IH1cblxuLyoqXG4gKiBJbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgdG8gZ2V0IG5vdGlmaWVkIHdoZW4geW91ciBkaXJlY3RpdmUncyBjb250ZW50IGhhcyBiZWVuIGZ1bGx5XG4gKiBpbml0aWFsaXplZC5cbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvcGxhbVhVcHNMUWJJWHBWaVpoVU8/cD1wcmV2aWV3KSlcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICdjaGlsZC1jbXAnLFxuICogICB0ZW1wbGF0ZTogYHt7d2hlcmV9fSBjaGlsZGBcbiAqIH0pXG4gKiBjbGFzcyBDaGlsZENvbXBvbmVudCB7XG4gKiAgIEBJbnB1dCgpIHdoZXJlOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAncGFyZW50LWNtcCcsXG4gKiAgIHRlbXBsYXRlOiBgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PmBcbiAqIH0pXG4gKiBjbGFzcyBQYXJlbnRDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0IHtcbiAqICAgQENvbnRlbnRDaGlsZChDaGlsZENvbXBvbmVudCkgY29udGVudENoaWxkOiBDaGlsZENvbXBvbmVudDtcbiAqXG4gKiAgIGNvbnN0cnVjdG9yKCkge1xuICogICAgIC8vIGNvbnRlbnRDaGlsZCBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0XG4gKiAgICAgY29uc29sZS5sb2codGhpcy5nZXRNZXNzYWdlKHRoaXMuY29udGVudENoaWxkKSk7XG4gKiAgIH1cbiAqXG4gKiAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAqICAgICAvLyBjb250ZW50Q2hpbGQgaXMgdXBkYXRlZCBhZnRlciB0aGUgY29udGVudCBoYXMgYmVlbiBjaGVja2VkXG4gKiAgICAgY29uc29sZS5sb2coJ0FmdGVyQ29udGVudEluaXQ6ICcgKyB0aGlzLmdldE1lc3NhZ2UodGhpcy5jb250ZW50Q2hpbGQpKTtcbiAqICAgfVxuICpcbiAqICAgcHJpdmF0ZSBnZXRNZXNzYWdlKGNtcDogQ2hpbGRDb21wb25lbnQpOiBzdHJpbmcge1xuICogICAgIHJldHVybiBjbXAgPyBjbXAud2hlcmUgKyAnIGNoaWxkJyA6ICdubyBjaGlsZCc7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICdhcHAnLFxuICogICB0ZW1wbGF0ZTogYFxuICogICAgIDxwYXJlbnQtY21wPlxuICogICAgICAgPGNoaWxkLWNtcCB3aGVyZT1cImNvbnRlbnRcIj48L2NoaWxkLWNtcD5cbiAqICAgICA8L3BhcmVudC1jbXA+YCxcbiAqICAgZGlyZWN0aXZlczogW1BhcmVudENvbXBvbmVudCwgQ2hpbGRDb21wb25lbnRdXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIEFwcCB7XG4gKiB9XG4gKlxuICogYm9vdHN0cmFwKEFwcCkuY2F0Y2goZXJyID0+IGNvbnNvbGUuZXJyb3IoZXJyKSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZnRlckNvbnRlbnRJbml0IHsgbmdBZnRlckNvbnRlbnRJbml0KCk7IH1cblxuLyoqXG4gKiBJbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgdG8gZ2V0IG5vdGlmaWVkIGFmdGVyIGV2ZXJ5IGNoZWNrIG9mIHlvdXIgZGlyZWN0aXZlJ3MgY29udGVudC5cbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvdEdkcnl0TkVLUW5lY0lQa0Q3TlU/cD1wcmV2aWV3KSlcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBAQ29tcG9uZW50KHtzZWxlY3RvcjogJ2NoaWxkLWNtcCcsIHRlbXBsYXRlOiBge3t3aGVyZX19IGNoaWxkYH0pXG4gKiBjbGFzcyBDaGlsZENvbXBvbmVudCB7XG4gKiAgIEBJbnB1dCgpIHdoZXJlOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogQENvbXBvbmVudCh7c2VsZWN0b3I6ICdwYXJlbnQtY21wJywgdGVtcGxhdGU6IGA8bmctY29udGVudD48L25nLWNvbnRlbnQ+YH0pXG4gKiBjbGFzcyBQYXJlbnRDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRDaGVja2VkIHtcbiAqICAgQENvbnRlbnRDaGlsZChDaGlsZENvbXBvbmVudCkgY29udGVudENoaWxkOiBDaGlsZENvbXBvbmVudDtcbiAqXG4gKiAgIGNvbnN0cnVjdG9yKCkge1xuICogICAgIC8vIGNvbnRlbnRDaGlsZCBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0XG4gKiAgICAgY29uc29sZS5sb2codGhpcy5nZXRNZXNzYWdlKHRoaXMuY29udGVudENoaWxkKSk7XG4gKiAgIH1cbiAqXG4gKiAgIG5nQWZ0ZXJDb250ZW50Q2hlY2tlZCgpIHtcbiAqICAgICAvLyBjb250ZW50Q2hpbGQgaXMgdXBkYXRlZCBhZnRlciB0aGUgY29udGVudCBoYXMgYmVlbiBjaGVja2VkXG4gKiAgICAgY29uc29sZS5sb2coJ0FmdGVyQ29udGVudENoZWNrZWQ6ICcgKyB0aGlzLmdldE1lc3NhZ2UodGhpcy5jb250ZW50Q2hpbGQpKTtcbiAqICAgfVxuICpcbiAqICAgcHJpdmF0ZSBnZXRNZXNzYWdlKGNtcDogQ2hpbGRDb21wb25lbnQpOiBzdHJpbmcge1xuICogICAgIHJldHVybiBjbXAgPyBjbXAud2hlcmUgKyAnIGNoaWxkJyA6ICdubyBjaGlsZCc7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICdhcHAnLFxuICogICB0ZW1wbGF0ZTogYFxuICogICAgIDxwYXJlbnQtY21wPlxuICogICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiaGFzQ29udGVudCA9ICFoYXNDb250ZW50XCI+VG9nZ2xlIGNvbnRlbnQgY2hpbGQ8L2J1dHRvbj5cbiAqICAgICAgIDxjaGlsZC1jbXAgKm5nSWY9XCJoYXNDb250ZW50XCIgd2hlcmU9XCJjb250ZW50XCI+PC9jaGlsZC1jbXA+XG4gKiAgICAgPC9wYXJlbnQtY21wPmAsXG4gKiAgIGRpcmVjdGl2ZXM6IFtOZ0lmLCBQYXJlbnRDb21wb25lbnQsIENoaWxkQ29tcG9uZW50XVxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBBcHAge1xuICogICBoYXNDb250ZW50ID0gdHJ1ZTtcbiAqIH1cbiAqXG4gKiBib290c3RyYXAoQXBwKS5jYXRjaChlcnIgPT4gY29uc29sZS5lcnJvcihlcnIpKTtcbiAqIGBgYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFmdGVyQ29udGVudENoZWNrZWQgeyBuZ0FmdGVyQ29udGVudENoZWNrZWQoKTsgfVxuXG4vKipcbiAqIEltcGxlbWVudCB0aGlzIGludGVyZmFjZSB0byBnZXQgbm90aWZpZWQgd2hlbiB5b3VyIGNvbXBvbmVudCdzIHZpZXcgaGFzIGJlZW4gZnVsbHkgaW5pdGlhbGl6ZWQuXG4gKlxuICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L0xoVEtWTUVNMGZrSmd5cDRDSTFXP3A9cHJldmlldykpXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogQENvbXBvbmVudCh7c2VsZWN0b3I6ICdjaGlsZC1jbXAnLCB0ZW1wbGF0ZTogYHt7d2hlcmV9fSBjaGlsZGB9KVxuICogY2xhc3MgQ2hpbGRDb21wb25lbnQge1xuICogICBASW5wdXQoKSB3aGVyZTogc3RyaW5nO1xuICogfVxuICpcbiAqIEBDb21wb25lbnQoe1xuICogICBzZWxlY3RvcjogJ3BhcmVudC1jbXAnLFxuICogICB0ZW1wbGF0ZTogYDxjaGlsZC1jbXAgd2hlcmU9XCJ2aWV3XCI+PC9jaGlsZC1jbXA+YCxcbiAqICAgZGlyZWN0aXZlczogW0NoaWxkQ29tcG9uZW50XVxuICogfSlcbiAqIGNsYXNzIFBhcmVudENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuICogICBAVmlld0NoaWxkKENoaWxkQ29tcG9uZW50KSB2aWV3Q2hpbGQ6IENoaWxkQ29tcG9uZW50O1xuICpcbiAqICAgY29uc3RydWN0b3IoKSB7XG4gKiAgICAgLy8gdmlld0NoaWxkIGlzIG5vdCBpbml0aWFsaXplZCB5ZXRcbiAqICAgICBjb25zb2xlLmxvZyh0aGlzLmdldE1lc3NhZ2UodGhpcy52aWV3Q2hpbGQpKTtcbiAqICAgfVxuICpcbiAqICAgbmdBZnRlclZpZXdJbml0KCkge1xuICogICAgIC8vIHZpZXdDaGlsZCBpcyB1cGRhdGVkIGFmdGVyIHRoZSB2aWV3IGhhcyBiZWVuIGluaXRpYWxpemVkXG4gKiAgICAgY29uc29sZS5sb2coJ25nQWZ0ZXJWaWV3SW5pdDogJyArIHRoaXMuZ2V0TWVzc2FnZSh0aGlzLnZpZXdDaGlsZCkpO1xuICogICB9XG4gKlxuICogICBwcml2YXRlIGdldE1lc3NhZ2UoY21wOiBDaGlsZENvbXBvbmVudCk6IHN0cmluZyB7XG4gKiAgICAgcmV0dXJuIGNtcCA/IGNtcC53aGVyZSArICcgY2hpbGQnIDogJ25vIGNoaWxkJztcbiAqICAgfVxuICogfVxuICpcbiAqIEBDb21wb25lbnQoe1xuICogICBzZWxlY3RvcjogJ2FwcCcsXG4gKiAgIHRlbXBsYXRlOiBgPHBhcmVudC1jbXA+PC9wYXJlbnQtY21wPmAsXG4gKiAgIGRpcmVjdGl2ZXM6IFtQYXJlbnRDb21wb25lbnRdXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIEFwcCB7XG4gKiB9XG4gKlxuICogYm9vdHN0cmFwKEFwcCkuY2F0Y2goZXJyID0+IGNvbnNvbGUuZXJyb3IoZXJyKSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZnRlclZpZXdJbml0IHsgbmdBZnRlclZpZXdJbml0KCk7IH1cblxuLyoqXG4gKiBJbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgdG8gZ2V0IG5vdGlmaWVkIGFmdGVyIGV2ZXJ5IGNoZWNrIG9mIHlvdXIgY29tcG9uZW50J3Mgdmlldy5cbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvMHFER0hjUFFrYzI1Q1hoVE56S1U/cD1wcmV2aWV3KSlcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBAQ29tcG9uZW50KHtzZWxlY3RvcjogJ2NoaWxkLWNtcCcsIHRlbXBsYXRlOiBge3t3aGVyZX19IGNoaWxkYH0pXG4gKiBjbGFzcyBDaGlsZENvbXBvbmVudCB7XG4gKiAgIEBJbnB1dCgpIHdoZXJlOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAncGFyZW50LWNtcCcsXG4gKiAgIHRlbXBsYXRlOiBgXG4gKiAgICAgPGJ1dHRvbiAoY2xpY2spPVwic2hvd1ZpZXcgPSAhc2hvd1ZpZXdcIj5Ub2dnbGUgdmlldyBjaGlsZDwvYnV0dG9uPlxuICogICAgIDxjaGlsZC1jbXAgKm5nSWY9XCJzaG93Vmlld1wiIHdoZXJlPVwidmlld1wiPjwvY2hpbGQtY21wPmAsXG4gKiAgIGRpcmVjdGl2ZXM6IFtOZ0lmLCBDaGlsZENvbXBvbmVudF1cbiAqIH0pXG4gKiBjbGFzcyBQYXJlbnRDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdDaGVja2VkIHtcbiAqICAgQFZpZXdDaGlsZChDaGlsZENvbXBvbmVudCkgdmlld0NoaWxkOiBDaGlsZENvbXBvbmVudDtcbiAqICAgc2hvd1ZpZXcgPSB0cnVlO1xuICpcbiAqICAgY29uc3RydWN0b3IoKSB7XG4gKiAgICAgLy8gdmlld0NoaWxkIGlzIG5vdCBpbml0aWFsaXplZCB5ZXRcbiAqICAgICBjb25zb2xlLmxvZyh0aGlzLmdldE1lc3NhZ2UodGhpcy52aWV3Q2hpbGQpKTtcbiAqICAgfVxuICpcbiAqICAgbmdBZnRlclZpZXdDaGVja2VkKCkge1xuICogICAgIC8vIHZpZXdDaGlsZCBpcyB1cGRhdGVkIGFmdGVyIHRoZSB2aWV3IGhhcyBiZWVuIGNoZWNrZWRcbiAqICAgICBjb25zb2xlLmxvZygnQWZ0ZXJWaWV3Q2hlY2tlZDogJyArIHRoaXMuZ2V0TWVzc2FnZSh0aGlzLnZpZXdDaGlsZCkpO1xuICogICB9XG4gKlxuICogICBwcml2YXRlIGdldE1lc3NhZ2UoY21wOiBDaGlsZENvbXBvbmVudCk6IHN0cmluZyB7XG4gKiAgICAgcmV0dXJuIGNtcCA/IGNtcC53aGVyZSArICcgY2hpbGQnIDogJ25vIGNoaWxkJztcbiAqICAgfVxuICogfVxuICpcbiAqIEBDb21wb25lbnQoe1xuICogICBzZWxlY3RvcjogJ2FwcCcsXG4gKiAgIHRlbXBsYXRlOiBgPHBhcmVudC1jbXA+PC9wYXJlbnQtY21wPmAsXG4gKiAgIGRpcmVjdGl2ZXM6IFtQYXJlbnRDb21wb25lbnRdXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIEFwcCB7XG4gKiB9XG4gKlxuICogYm9vdHN0cmFwKEFwcCkuY2F0Y2goZXJyID0+IGNvbnNvbGUuZXJyb3IoZXJyKSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZnRlclZpZXdDaGVja2VkIHsgbmdBZnRlclZpZXdDaGVja2VkKCk7IH1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9pbnRlcmZhY2VzLnRzXG4gKiovIiwiaW1wb3J0IHtMaXN0V3JhcHBlciwgTWFwV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcbmltcG9ydCB7Z2V0U3ltYm9sSXRlcmF0b3J9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge09ic2VydmFibGUsIEV2ZW50RW1pdHRlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9hc3luYyc7XG5cblxuLyoqXG4gKiBBbiB1bm1vZGlmaWFibGUgbGlzdCBvZiBpdGVtcyB0aGF0IEFuZ3VsYXIga2VlcHMgdXAgdG8gZGF0ZSB3aGVuIHRoZSBzdGF0ZVxuICogb2YgdGhlIGFwcGxpY2F0aW9uIGNoYW5nZXMuXG4gKlxuICogVGhlIHR5cGUgb2Ygb2JqZWN0IHRoYXQge0BsaW5rIFF1ZXJ5TWV0YWRhdGF9IGFuZCB7QGxpbmsgVmlld1F1ZXJ5TWV0YWRhdGF9IHByb3ZpZGUuXG4gKlxuICogSW1wbGVtZW50cyBhbiBpdGVyYWJsZSBpbnRlcmZhY2UsIHRoZXJlZm9yZSBpdCBjYW4gYmUgdXNlZCBpbiBib3RoIEVTNlxuICogamF2YXNjcmlwdCBgZm9yICh2YXIgaSBvZiBpdGVtcylgIGxvb3BzIGFzIHdlbGwgYXMgaW4gQW5ndWxhciB0ZW1wbGF0ZXMgd2l0aFxuICogYCpuZ0Zvcj1cIiNpIG9mIG15TGlzdFwiYC5cbiAqXG4gKiBDaGFuZ2VzIGNhbiBiZSBvYnNlcnZlZCBieSBzdWJzY3JpYmluZyB0byB0aGUgY2hhbmdlcyBgT2JzZXJ2YWJsZWAuXG4gKlxuICogTk9URTogSW4gdGhlIGZ1dHVyZSB0aGlzIGNsYXNzIHdpbGwgaW1wbGVtZW50IGFuIGBPYnNlcnZhYmxlYCBpbnRlcmZhY2UuXG4gKlxuICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L1JYOHNKblFZbDlGV3VTQ1dtZTV6P3A9cHJldmlldykpXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBAQ29tcG9uZW50KHsuLi59KVxuICogY2xhc3MgQ29udGFpbmVyIHtcbiAqICAgY29uc3RydWN0b3IoQFF1ZXJ5KEl0ZW0pIGl0ZW1zOiBRdWVyeUxpc3Q8SXRlbT4pIHtcbiAqICAgICBpdGVtcy5jaGFuZ2VzLnN1YnNjcmliZShfID0+IGNvbnNvbGUubG9nKGl0ZW1zLmxlbmd0aCkpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXJ5TGlzdDxUPiB7XG4gIHByaXZhdGUgX3Jlc3VsdHM6IEFycmF5PFQ+ID0gW107XG4gIHByaXZhdGUgX2VtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgZ2V0IGNoYW5nZXMoKTogT2JzZXJ2YWJsZTxhbnk+IHsgcmV0dXJuIHRoaXMuX2VtaXR0ZXI7IH1cbiAgZ2V0IGxlbmd0aCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fcmVzdWx0cy5sZW5ndGg7IH1cbiAgZ2V0IGZpcnN0KCk6IFQgeyByZXR1cm4gTGlzdFdyYXBwZXIuZmlyc3QodGhpcy5fcmVzdWx0cyk7IH1cbiAgZ2V0IGxhc3QoKTogVCB7IHJldHVybiBMaXN0V3JhcHBlci5sYXN0KHRoaXMuX3Jlc3VsdHMpOyB9XG5cbiAgLyoqXG4gICAqIHJldHVybnMgYSBuZXcgYXJyYXkgd2l0aCB0aGUgcGFzc2VkIGluIGZ1bmN0aW9uIGFwcGxpZWQgdG8gZWFjaCBlbGVtZW50LlxuICAgKi9cbiAgbWFwPFU+KGZuOiAoaXRlbTogVCkgPT4gVSk6IFVbXSB7IHJldHVybiB0aGlzLl9yZXN1bHRzLm1hcChmbik7IH1cblxuICAvKipcbiAgICogcmV0dXJucyBhIGZpbHRlcmVkIGFycmF5LlxuICAgKi9cbiAgZmlsdGVyKGZuOiAoaXRlbTogVCkgPT4gYm9vbGVhbik6IFRbXSB7IHJldHVybiB0aGlzLl9yZXN1bHRzLmZpbHRlcihmbik7IH1cblxuICAvKipcbiAgICogcmV0dXJucyBhIHJlZHVjZWQgdmFsdWUuXG4gICAqL1xuICByZWR1Y2U8VT4oZm46IChhY2M6IFUsIGl0ZW06IFQpID0+IFUsIGluaXQ6IFUpOiBVIHsgcmV0dXJuIHRoaXMuX3Jlc3VsdHMucmVkdWNlKGZuLCBpbml0KTsgfVxuXG4gIC8qKlxuICAgKiBjb252ZXJ0cyBRdWVyeUxpc3QgaW50byBhbiBhcnJheVxuICAgKi9cbiAgdG9BcnJheSgpOiBUW10geyByZXR1cm4gTGlzdFdyYXBwZXIuY2xvbmUodGhpcy5fcmVzdWx0cyk7IH1cblxuICBbZ2V0U3ltYm9sSXRlcmF0b3IoKV0oKTogYW55IHsgcmV0dXJuIHRoaXMuX3Jlc3VsdHNbZ2V0U3ltYm9sSXRlcmF0b3IoKV0oKTsgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9yZXN1bHRzLnRvU3RyaW5nKCk7IH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICByZXNldChyZXM6IFRbXSk6IHZvaWQgeyB0aGlzLl9yZXN1bHRzID0gcmVzOyB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBub3RpZnlPbkNoYW5nZXMoKTogdm9pZCB7IHRoaXMuX2VtaXR0ZXIuZW1pdCh0aGlzKTsgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL3F1ZXJ5X2xpc3QudHNcbiAqKi8iLCJleHBvcnQgY29uc3QgRVZFTlRfVEFSR0VUX1NFUEFSQVRPUiA9ICc6JztcblxuZXhwb3J0IGNsYXNzIEV2ZW50Q29uZmlnIHtcbiAgY29uc3RydWN0b3IocHVibGljIGZpZWxkTmFtZTogc3RyaW5nLCBwdWJsaWMgZXZlbnROYW1lOiBzdHJpbmcsIHB1YmxpYyBpc0xvbmdGb3JtOiBib29sZWFuKSB7fVxuXG4gIHN0YXRpYyBwYXJzZShldmVudENvbmZpZzogc3RyaW5nKTogRXZlbnRDb25maWcge1xuICAgIHZhciBmaWVsZE5hbWUgPSBldmVudENvbmZpZywgZXZlbnROYW1lID0gZXZlbnRDb25maWcsIGlzTG9uZ0Zvcm0gPSBmYWxzZTtcbiAgICB2YXIgc2VwYXJhdG9ySWR4ID0gZXZlbnRDb25maWcuaW5kZXhPZihFVkVOVF9UQVJHRVRfU0VQQVJBVE9SKTtcbiAgICBpZiAoc2VwYXJhdG9ySWR4ID4gLTEpIHtcbiAgICAgIC8vIGxvbmcgZm9ybWF0OiAnZmllbGROYW1lOiBldmVudE5hbWUnXG4gICAgICBmaWVsZE5hbWUgPSBldmVudENvbmZpZy5zdWJzdHJpbmcoMCwgc2VwYXJhdG9ySWR4KS50cmltKCk7XG4gICAgICBldmVudE5hbWUgPSBldmVudENvbmZpZy5zdWJzdHJpbmcoc2VwYXJhdG9ySWR4ICsgMSkudHJpbSgpO1xuICAgICAgaXNMb25nRm9ybSA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRXZlbnRDb25maWcoZmllbGROYW1lLCBldmVudE5hbWUsIGlzTG9uZ0Zvcm0pO1xuICB9XG5cbiAgZ2V0RnVsbE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pc0xvbmdGb3JtID8gYCR7dGhpcy5maWVsZE5hbWV9JHtFVkVOVF9UQVJHRVRfU0VQQVJBVE9SfSR7dGhpcy5ldmVudE5hbWV9YCA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXZlbnROYW1lO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvZXZlbnRfY29uZmlnLnRzXG4gKiovIiwiaW1wb3J0IHtyZXNvbHZlRm9yd2FyZFJlZiwgSW5qZWN0YWJsZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvZGknO1xuaW1wb3J0IHtUeXBlLCBpc1ByZXNlbnQsIGlzQmxhbmssIHN0cmluZ2lmeX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7TGlzdFdyYXBwZXIsIFN0cmluZ01hcFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge1xuICBEaXJlY3RpdmVNZXRhZGF0YSxcbiAgQ29tcG9uZW50TWV0YWRhdGEsXG4gIElucHV0TWV0YWRhdGEsXG4gIE91dHB1dE1ldGFkYXRhLFxuICBIb3N0QmluZGluZ01ldGFkYXRhLFxuICBIb3N0TGlzdGVuZXJNZXRhZGF0YSxcbiAgQ29udGVudENoaWxkcmVuTWV0YWRhdGEsXG4gIFZpZXdDaGlsZHJlbk1ldGFkYXRhLFxuICBDb250ZW50Q2hpbGRNZXRhZGF0YSxcbiAgVmlld0NoaWxkTWV0YWRhdGFcbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvbWV0YWRhdGEnO1xuaW1wb3J0IHtyZWZsZWN0b3J9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL3JlZmxlY3Rpb24vcmVmbGVjdGlvbic7XG5cbmZ1bmN0aW9uIF9pc0RpcmVjdGl2ZU1ldGFkYXRhKHR5cGU6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZSBpbnN0YW5jZW9mIERpcmVjdGl2ZU1ldGFkYXRhO1xufVxuXG4vKlxuICogUmVzb2x2ZSBhIGBUeXBlYCBmb3Ige0BsaW5rIERpcmVjdGl2ZU1ldGFkYXRhfS5cbiAqXG4gKiBUaGlzIGludGVyZmFjZSBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgYXBwbGljYXRpb24gZGV2ZWxvcGVyIHRvIGNyZWF0ZSBjdXN0b20gYmVoYXZpb3IuXG4gKlxuICogU2VlIHtAbGluayBDb21waWxlcn1cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERpcmVjdGl2ZVJlc29sdmVyIHtcbiAgLyoqXG4gICAqIFJldHVybiB7QGxpbmsgRGlyZWN0aXZlTWV0YWRhdGF9IGZvciBhIGdpdmVuIGBUeXBlYC5cbiAgICovXG4gIHJlc29sdmUodHlwZTogVHlwZSk6IERpcmVjdGl2ZU1ldGFkYXRhIHtcbiAgICB2YXIgdHlwZU1ldGFkYXRhID0gcmVmbGVjdG9yLmFubm90YXRpb25zKHJlc29sdmVGb3J3YXJkUmVmKHR5cGUpKTtcbiAgICBpZiAoaXNQcmVzZW50KHR5cGVNZXRhZGF0YSkpIHtcbiAgICAgIHZhciBtZXRhZGF0YSA9IHR5cGVNZXRhZGF0YS5maW5kKF9pc0RpcmVjdGl2ZU1ldGFkYXRhKTtcbiAgICAgIGlmIChpc1ByZXNlbnQobWV0YWRhdGEpKSB7XG4gICAgICAgIHZhciBwcm9wZXJ0eU1ldGFkYXRhID0gcmVmbGVjdG9yLnByb3BNZXRhZGF0YSh0eXBlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21lcmdlV2l0aFByb3BlcnR5TWV0YWRhdGEobWV0YWRhdGEsIHByb3BlcnR5TWV0YWRhdGEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBObyBEaXJlY3RpdmUgYW5ub3RhdGlvbiBmb3VuZCBvbiAke3N0cmluZ2lmeSh0eXBlKX1gKTtcbiAgfVxuXG4gIHByaXZhdGUgX21lcmdlV2l0aFByb3BlcnR5TWV0YWRhdGEoZG06IERpcmVjdGl2ZU1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TWV0YWRhdGE6IHtba2V5OiBzdHJpbmddOiBhbnlbXX0pOiBEaXJlY3RpdmVNZXRhZGF0YSB7XG4gICAgdmFyIGlucHV0cyA9IFtdO1xuICAgIHZhciBvdXRwdXRzID0gW107XG4gICAgdmFyIGhvc3Q6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9ID0ge307XG4gICAgdmFyIHF1ZXJpZXM6IHtba2V5OiBzdHJpbmddOiBhbnl9ID0ge307XG5cbiAgICBTdHJpbmdNYXBXcmFwcGVyLmZvckVhY2gocHJvcGVydHlNZXRhZGF0YSwgKG1ldGFkYXRhOiBhbnlbXSwgcHJvcE5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgbWV0YWRhdGEuZm9yRWFjaChhID0+IHtcbiAgICAgICAgaWYgKGEgaW5zdGFuY2VvZiBJbnB1dE1ldGFkYXRhKSB7XG4gICAgICAgICAgaWYgKGlzUHJlc2VudChhLmJpbmRpbmdQcm9wZXJ0eU5hbWUpKSB7XG4gICAgICAgICAgICBpbnB1dHMucHVzaChgJHtwcm9wTmFtZX06ICR7YS5iaW5kaW5nUHJvcGVydHlOYW1lfWApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbnB1dHMucHVzaChwcm9wTmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGEgaW5zdGFuY2VvZiBPdXRwdXRNZXRhZGF0YSkge1xuICAgICAgICAgIGlmIChpc1ByZXNlbnQoYS5iaW5kaW5nUHJvcGVydHlOYW1lKSkge1xuICAgICAgICAgICAgb3V0cHV0cy5wdXNoKGAke3Byb3BOYW1lfTogJHthLmJpbmRpbmdQcm9wZXJ0eU5hbWV9YCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dHB1dHMucHVzaChwcm9wTmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGEgaW5zdGFuY2VvZiBIb3N0QmluZGluZ01ldGFkYXRhKSB7XG4gICAgICAgICAgaWYgKGlzUHJlc2VudChhLmhvc3RQcm9wZXJ0eU5hbWUpKSB7XG4gICAgICAgICAgICBob3N0W2BbJHthLmhvc3RQcm9wZXJ0eU5hbWV9XWBdID0gcHJvcE5hbWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhvc3RbYFske3Byb3BOYW1lfV1gXSA9IHByb3BOYW1lO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhIGluc3RhbmNlb2YgSG9zdExpc3RlbmVyTWV0YWRhdGEpIHtcbiAgICAgICAgICB2YXIgYXJncyA9IGlzUHJlc2VudChhLmFyZ3MpID8gKDxhbnlbXT5hLmFyZ3MpLmpvaW4oJywgJykgOiAnJztcbiAgICAgICAgICBob3N0W2AoJHthLmV2ZW50TmFtZX0pYF0gPSBgJHtwcm9wTmFtZX0oJHthcmdzfSlgO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGEgaW5zdGFuY2VvZiBDb250ZW50Q2hpbGRyZW5NZXRhZGF0YSkge1xuICAgICAgICAgIHF1ZXJpZXNbcHJvcE5hbWVdID0gYTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhIGluc3RhbmNlb2YgVmlld0NoaWxkcmVuTWV0YWRhdGEpIHtcbiAgICAgICAgICBxdWVyaWVzW3Byb3BOYW1lXSA9IGE7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYSBpbnN0YW5jZW9mIENvbnRlbnRDaGlsZE1ldGFkYXRhKSB7XG4gICAgICAgICAgcXVlcmllc1twcm9wTmFtZV0gPSBhO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGEgaW5zdGFuY2VvZiBWaWV3Q2hpbGRNZXRhZGF0YSkge1xuICAgICAgICAgIHF1ZXJpZXNbcHJvcE5hbWVdID0gYTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuX21lcmdlKGRtLCBpbnB1dHMsIG91dHB1dHMsIGhvc3QsIHF1ZXJpZXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBfbWVyZ2UoZG06IERpcmVjdGl2ZU1ldGFkYXRhLCBpbnB1dHM6IHN0cmluZ1tdLCBvdXRwdXRzOiBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICAgaG9zdDoge1trZXk6IHN0cmluZ106IHN0cmluZ30sIHF1ZXJpZXM6IHtba2V5OiBzdHJpbmddOiBhbnl9KTogRGlyZWN0aXZlTWV0YWRhdGEge1xuICAgIHZhciBtZXJnZWRJbnB1dHMgPSBpc1ByZXNlbnQoZG0uaW5wdXRzKSA/IExpc3RXcmFwcGVyLmNvbmNhdChkbS5pbnB1dHMsIGlucHV0cykgOiBpbnB1dHM7XG4gICAgdmFyIG1lcmdlZE91dHB1dHMgPSBpc1ByZXNlbnQoZG0ub3V0cHV0cykgPyBMaXN0V3JhcHBlci5jb25jYXQoZG0ub3V0cHV0cywgb3V0cHV0cykgOiBvdXRwdXRzO1xuICAgIHZhciBtZXJnZWRIb3N0ID0gaXNQcmVzZW50KGRtLmhvc3QpID8gU3RyaW5nTWFwV3JhcHBlci5tZXJnZShkbS5ob3N0LCBob3N0KSA6IGhvc3Q7XG4gICAgdmFyIG1lcmdlZFF1ZXJpZXMgPVxuICAgICAgICBpc1ByZXNlbnQoZG0ucXVlcmllcykgPyBTdHJpbmdNYXBXcmFwcGVyLm1lcmdlKGRtLnF1ZXJpZXMsIHF1ZXJpZXMpIDogcXVlcmllcztcblxuICAgIGlmIChkbSBpbnN0YW5jZW9mIENvbXBvbmVudE1ldGFkYXRhKSB7XG4gICAgICByZXR1cm4gbmV3IENvbXBvbmVudE1ldGFkYXRhKHtcbiAgICAgICAgc2VsZWN0b3I6IGRtLnNlbGVjdG9yLFxuICAgICAgICBpbnB1dHM6IG1lcmdlZElucHV0cyxcbiAgICAgICAgb3V0cHV0czogbWVyZ2VkT3V0cHV0cyxcbiAgICAgICAgaG9zdDogbWVyZ2VkSG9zdCxcbiAgICAgICAgZXhwb3J0QXM6IGRtLmV4cG9ydEFzLFxuICAgICAgICBtb2R1bGVJZDogZG0ubW9kdWxlSWQsXG4gICAgICAgIHF1ZXJpZXM6IG1lcmdlZFF1ZXJpZXMsXG4gICAgICAgIGNoYW5nZURldGVjdGlvbjogZG0uY2hhbmdlRGV0ZWN0aW9uLFxuICAgICAgICBwcm92aWRlcnM6IGRtLnByb3ZpZGVycyxcbiAgICAgICAgdmlld1Byb3ZpZGVyczogZG0udmlld1Byb3ZpZGVyc1xuICAgICAgfSk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBEaXJlY3RpdmVNZXRhZGF0YSh7XG4gICAgICAgIHNlbGVjdG9yOiBkbS5zZWxlY3RvcixcbiAgICAgICAgaW5wdXRzOiBtZXJnZWRJbnB1dHMsXG4gICAgICAgIG91dHB1dHM6IG1lcmdlZE91dHB1dHMsXG4gICAgICAgIGhvc3Q6IG1lcmdlZEhvc3QsXG4gICAgICAgIGV4cG9ydEFzOiBkbS5leHBvcnRBcyxcbiAgICAgICAgcXVlcmllczogbWVyZ2VkUXVlcmllcyxcbiAgICAgICAgcHJvdmlkZXJzOiBkbS5wcm92aWRlcnNcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL2RpcmVjdGl2ZV9yZXNvbHZlci50c1xuICoqLyIsImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvZGknO1xuaW1wb3J0IHtWaWV3TWV0YWRhdGF9IGZyb20gJy4uL21ldGFkYXRhL3ZpZXcnO1xuaW1wb3J0IHtDb21wb25lbnRNZXRhZGF0YX0gZnJvbSAnLi4vbWV0YWRhdGEvZGlyZWN0aXZlcyc7XG5cbmltcG9ydCB7VHlwZSwgc3RyaW5naWZ5LCBpc0JsYW5rLCBpc1ByZXNlbnR9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge0Jhc2VFeGNlcHRpb259IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9ucyc7XG5pbXBvcnQge01hcH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcblxuaW1wb3J0IHtyZWZsZWN0b3J9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL3JlZmxlY3Rpb24vcmVmbGVjdGlvbic7XG5cblxuLyoqXG4gKiBSZXNvbHZlcyB0eXBlcyB0byB7QGxpbmsgVmlld01ldGFkYXRhfS5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFZpZXdSZXNvbHZlciB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2NhY2hlID0gbmV3IE1hcDxUeXBlLCBWaWV3TWV0YWRhdGE+KCk7XG5cbiAgcmVzb2x2ZShjb21wb25lbnQ6IFR5cGUpOiBWaWV3TWV0YWRhdGEge1xuICAgIHZhciB2aWV3ID0gdGhpcy5fY2FjaGUuZ2V0KGNvbXBvbmVudCk7XG5cbiAgICBpZiAoaXNCbGFuayh2aWV3KSkge1xuICAgICAgdmlldyA9IHRoaXMuX3Jlc29sdmUoY29tcG9uZW50KTtcbiAgICAgIHRoaXMuX2NhY2hlLnNldChjb21wb25lbnQsIHZpZXcpO1xuICAgIH1cblxuICAgIHJldHVybiB2aWV3O1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcmVzb2x2ZShjb21wb25lbnQ6IFR5cGUpOiBWaWV3TWV0YWRhdGEge1xuICAgIHZhciBjb21wTWV0YTogQ29tcG9uZW50TWV0YWRhdGE7XG4gICAgdmFyIHZpZXdNZXRhOiBWaWV3TWV0YWRhdGE7XG5cbiAgICByZWZsZWN0b3IuYW5ub3RhdGlvbnMoY29tcG9uZW50KS5mb3JFYWNoKG0gPT4ge1xuICAgICAgaWYgKG0gaW5zdGFuY2VvZiBWaWV3TWV0YWRhdGEpIHtcbiAgICAgICAgdmlld01ldGEgPSBtO1xuICAgICAgfVxuICAgICAgaWYgKG0gaW5zdGFuY2VvZiBDb21wb25lbnRNZXRhZGF0YSkge1xuICAgICAgICBjb21wTWV0YSA9IG07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoaXNQcmVzZW50KGNvbXBNZXRhKSkge1xuICAgICAgaWYgKGlzQmxhbmsoY29tcE1ldGEudGVtcGxhdGUpICYmIGlzQmxhbmsoY29tcE1ldGEudGVtcGxhdGVVcmwpICYmIGlzQmxhbmsodmlld01ldGEpKSB7XG4gICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKFxuICAgICAgICAgICAgYENvbXBvbmVudCAnJHtzdHJpbmdpZnkoY29tcG9uZW50KX0nIG11c3QgaGF2ZSBlaXRoZXIgJ3RlbXBsYXRlJywgJ3RlbXBsYXRlVXJsJywgb3IgJ0BWaWV3JyBzZXQuYCk7XG5cbiAgICAgIH0gZWxzZSBpZiAoaXNQcmVzZW50KGNvbXBNZXRhLnRlbXBsYXRlKSAmJiBpc1ByZXNlbnQodmlld01ldGEpKSB7XG4gICAgICAgIHRoaXMuX3Rocm93TWl4aW5nVmlld0FuZENvbXBvbmVudChcInRlbXBsYXRlXCIsIGNvbXBvbmVudCk7XG5cbiAgICAgIH0gZWxzZSBpZiAoaXNQcmVzZW50KGNvbXBNZXRhLnRlbXBsYXRlVXJsKSAmJiBpc1ByZXNlbnQodmlld01ldGEpKSB7XG4gICAgICAgIHRoaXMuX3Rocm93TWl4aW5nVmlld0FuZENvbXBvbmVudChcInRlbXBsYXRlVXJsXCIsIGNvbXBvbmVudCk7XG5cbiAgICAgIH0gZWxzZSBpZiAoaXNQcmVzZW50KGNvbXBNZXRhLmRpcmVjdGl2ZXMpICYmIGlzUHJlc2VudCh2aWV3TWV0YSkpIHtcbiAgICAgICAgdGhpcy5fdGhyb3dNaXhpbmdWaWV3QW5kQ29tcG9uZW50KFwiZGlyZWN0aXZlc1wiLCBjb21wb25lbnQpO1xuXG4gICAgICB9IGVsc2UgaWYgKGlzUHJlc2VudChjb21wTWV0YS5waXBlcykgJiYgaXNQcmVzZW50KHZpZXdNZXRhKSkge1xuICAgICAgICB0aGlzLl90aHJvd01peGluZ1ZpZXdBbmRDb21wb25lbnQoXCJwaXBlc1wiLCBjb21wb25lbnQpO1xuXG4gICAgICB9IGVsc2UgaWYgKGlzUHJlc2VudChjb21wTWV0YS5lbmNhcHN1bGF0aW9uKSAmJiBpc1ByZXNlbnQodmlld01ldGEpKSB7XG4gICAgICAgIHRoaXMuX3Rocm93TWl4aW5nVmlld0FuZENvbXBvbmVudChcImVuY2Fwc3VsYXRpb25cIiwgY29tcG9uZW50KTtcblxuICAgICAgfSBlbHNlIGlmIChpc1ByZXNlbnQoY29tcE1ldGEuc3R5bGVzKSAmJiBpc1ByZXNlbnQodmlld01ldGEpKSB7XG4gICAgICAgIHRoaXMuX3Rocm93TWl4aW5nVmlld0FuZENvbXBvbmVudChcInN0eWxlc1wiLCBjb21wb25lbnQpO1xuXG4gICAgICB9IGVsc2UgaWYgKGlzUHJlc2VudChjb21wTWV0YS5zdHlsZVVybHMpICYmIGlzUHJlc2VudCh2aWV3TWV0YSkpIHtcbiAgICAgICAgdGhpcy5fdGhyb3dNaXhpbmdWaWV3QW5kQ29tcG9uZW50KFwic3R5bGVVcmxzXCIsIGNvbXBvbmVudCk7XG5cbiAgICAgIH0gZWxzZSBpZiAoaXNQcmVzZW50KHZpZXdNZXRhKSkge1xuICAgICAgICByZXR1cm4gdmlld01ldGE7XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgVmlld01ldGFkYXRhKHtcbiAgICAgICAgICB0ZW1wbGF0ZVVybDogY29tcE1ldGEudGVtcGxhdGVVcmwsXG4gICAgICAgICAgdGVtcGxhdGU6IGNvbXBNZXRhLnRlbXBsYXRlLFxuICAgICAgICAgIGRpcmVjdGl2ZXM6IGNvbXBNZXRhLmRpcmVjdGl2ZXMsXG4gICAgICAgICAgcGlwZXM6IGNvbXBNZXRhLnBpcGVzLFxuICAgICAgICAgIGVuY2Fwc3VsYXRpb246IGNvbXBNZXRhLmVuY2Fwc3VsYXRpb24sXG4gICAgICAgICAgc3R5bGVzOiBjb21wTWV0YS5zdHlsZXMsXG4gICAgICAgICAgc3R5bGVVcmxzOiBjb21wTWV0YS5zdHlsZVVybHNcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpc0JsYW5rKHZpZXdNZXRhKSkge1xuICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgTm8gVmlldyBkZWNvcmF0b3IgZm91bmQgb24gY29tcG9uZW50ICcke3N0cmluZ2lmeShjb21wb25lbnQpfSdgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB2aWV3TWV0YTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF90aHJvd01peGluZ1ZpZXdBbmRDb21wb25lbnQocHJvcGVydHlOYW1lOiBzdHJpbmcsIGNvbXBvbmVudDogVHlwZSk6IHZvaWQge1xuICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKFxuICAgICAgICBgQ29tcG9uZW50ICcke3N0cmluZ2lmeShjb21wb25lbnQpfScgY2Fubm90IGhhdmUgYm90aCAnJHtwcm9wZXJ0eU5hbWV9JyBhbmQgJ0BWaWV3JyBzZXQgYXQgdGhlIHNhbWUgdGltZVwiYCk7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci92aWV3X3Jlc29sdmVyLnRzXG4gKiovIiwiaW1wb3J0IHtyZXNvbHZlRm9yd2FyZFJlZiwgSW5qZWN0YWJsZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvZGknO1xuaW1wb3J0IHtUeXBlLCBpc1ByZXNlbnQsIHN0cmluZ2lmeX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7UGlwZU1ldGFkYXRhfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9tZXRhZGF0YSc7XG5pbXBvcnQge3JlZmxlY3Rvcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvcmVmbGVjdGlvbi9yZWZsZWN0aW9uJztcblxuZnVuY3Rpb24gX2lzUGlwZU1ldGFkYXRhKHR5cGU6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZSBpbnN0YW5jZW9mIFBpcGVNZXRhZGF0YTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgYFR5cGVgIGZvciB7QGxpbmsgUGlwZU1ldGFkYXRhfS5cbiAqXG4gKiBUaGlzIGludGVyZmFjZSBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgYXBwbGljYXRpb24gZGV2ZWxvcGVyIHRvIGNyZWF0ZSBjdXN0b20gYmVoYXZpb3IuXG4gKlxuICogU2VlIHtAbGluayBDb21waWxlcn1cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFBpcGVSZXNvbHZlciB7XG4gIC8qKlxuICAgKiBSZXR1cm4ge0BsaW5rIFBpcGVNZXRhZGF0YX0gZm9yIGEgZ2l2ZW4gYFR5cGVgLlxuICAgKi9cbiAgcmVzb2x2ZSh0eXBlOiBUeXBlKTogUGlwZU1ldGFkYXRhIHtcbiAgICB2YXIgbWV0YXMgPSByZWZsZWN0b3IuYW5ub3RhdGlvbnMocmVzb2x2ZUZvcndhcmRSZWYodHlwZSkpO1xuICAgIGlmIChpc1ByZXNlbnQobWV0YXMpKSB7XG4gICAgICB2YXIgYW5ub3RhdGlvbiA9IG1ldGFzLmZpbmQoX2lzUGlwZU1ldGFkYXRhKTtcbiAgICAgIGlmIChpc1ByZXNlbnQoYW5ub3RhdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIGFubm90YXRpb247XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBObyBQaXBlIGRlY29yYXRvciBmb3VuZCBvbiAke3N0cmluZ2lmeSh0eXBlKX1gKTtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL3BpcGVfcmVzb2x2ZXIudHNcbiAqKi8iLCJpbXBvcnQge09wYXF1ZVRva2VufSBmcm9tIFwiYW5ndWxhcjIvc3JjL2NvcmUvZGlcIjtcbmltcG9ydCB7Q09OU1RfRVhQUn0gZnJvbSBcImFuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZ1wiO1xuXG4vKipcbiAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgcHJvdmlkZWQgd2hlbiBib290c3RyYXBpbmcgYW4gYXBwbGljYXRpb24gdG8gbWFrZSBhbiBhcnJheSBvZiBkaXJlY3RpdmVzXG4gKiBhdmFpbGFibGUgaW4gZXZlcnkgY29tcG9uZW50IG9mIHRoZSBhcHBsaWNhdGlvbi5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7UExBVEZPUk1fRElSRUNUSVZFU30gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG4gKiBpbXBvcnQge090aGVyRGlyZWN0aXZlfSBmcm9tICcuL215RGlyZWN0aXZlcyc7XG4gKlxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAnbXktY29tcG9uZW50JyxcbiAqICAgdGVtcGxhdGU6IGBcbiAqICAgICA8IS0tIGNhbiB1c2Ugb3RoZXIgZGlyZWN0aXZlIGV2ZW4gdGhvdWdoIHRoZSBjb21wb25lbnQgZG9lcyBub3QgbGlzdCBpdCBpbiBgZGlyZWN0aXZlc2AgLS0+XG4gKiAgICAgPG90aGVyLWRpcmVjdGl2ZT48L290aGVyLWRpcmVjdGl2ZT5cbiAqICAgYFxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBNeUNvbXBvbmVudCB7XG4gKiAgIC4uLlxuICogfVxuICpcbiAqIGJvb3RzdHJhcChNeUNvbXBvbmVudCwgW3Byb3ZpZGUoUExBVEZPUk1fRElSRUNUSVZFUywge3VzZVZhbHVlOiBbT3RoZXJEaXJlY3RpdmVdLCBtdWx0aTp0cnVlfSldKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgUExBVEZPUk1fRElSRUNUSVZFUzogT3BhcXVlVG9rZW4gPSBDT05TVF9FWFBSKG5ldyBPcGFxdWVUb2tlbihcIlBsYXRmb3JtIERpcmVjdGl2ZXNcIikpO1xuXG4vKipcbiAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgcHJvdmlkZWQgd2hlbiBib290c3RyYXBpbmcgYW4gYXBwbGljYXRpb24gdG8gbWFrZSBhbiBhcnJheSBvZiBwaXBlc1xuICogYXZhaWxhYmxlIGluIGV2ZXJ5IGNvbXBvbmVudCBvZiB0aGUgYXBwbGljYXRpb24uXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQge1BMQVRGT1JNX1BJUEVTfSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbiAqIGltcG9ydCB7T3RoZXJQaXBlfSBmcm9tICcuL215UGlwZSc7XG4gKlxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAnbXktY29tcG9uZW50JyxcbiAqICAgdGVtcGxhdGU6IGBcbiAqICAgICB7ezEyMyB8IG90aGVyLXBpcGV9fVxuICogICBgXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIE15Q29tcG9uZW50IHtcbiAqICAgLi4uXG4gKiB9XG4gKlxuICogYm9vdHN0cmFwKE15Q29tcG9uZW50LCBbcHJvdmlkZShQTEFURk9STV9QSVBFUywge3VzZVZhbHVlOiBbT3RoZXJQaXBlXSwgbXVsdGk6dHJ1ZX0pXSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IFBMQVRGT1JNX1BJUEVTOiBPcGFxdWVUb2tlbiA9IENPTlNUX0VYUFIobmV3IE9wYXF1ZVRva2VuKFwiUGxhdGZvcm0gUGlwZXNcIikpO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvcGxhdGZvcm1fZGlyZWN0aXZlc19hbmRfcGlwZXMudHNcbiAqKi8iLCJpbXBvcnQge1R5cGUsIENPTlNUX0VYUFIsIENPTlNULCBpc1ByZXNlbnQsIGlzQmxhbmt9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge3VuaW1wbGVtZW50ZWR9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9ucyc7XG5pbXBvcnQge1xuICBSZW5kZXJUZW1wbGF0ZUNtZCxcbiAgUmVuZGVyQ29tbWFuZFZpc2l0b3IsXG4gIFJlbmRlckJlZ2luRWxlbWVudENtZCxcbiAgUmVuZGVyVGV4dENtZCxcbiAgUmVuZGVyTmdDb250ZW50Q21kLFxuICBSZW5kZXJCZWdpbkNvbXBvbmVudENtZCxcbiAgUmVuZGVyRW1iZWRkZWRUZW1wbGF0ZUNtZFxufSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9yZW5kZXIvYXBpJztcbmltcG9ydCB7Vmlld0VuY2Fwc3VsYXRpb259IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL21ldGFkYXRhJztcbi8vIEV4cG9ydCBWaWV3RW5jYXBzdWxhdGlvbiBzbyB0aGF0IGNvbXBpbGVkIHRlbXBsYXRlcyBvbmx5IG5lZWQgdG8gZGVwZW5kXG4vLyBvbiB0ZW1wbGF0ZV9jb21tYW5kcy5cbmV4cG9ydCB7Vmlld0VuY2Fwc3VsYXRpb259IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL21ldGFkYXRhJztcblxuLyoqXG4gKiBBIGNvbXBpbGVkIGhvc3QgdGVtcGxhdGUuXG4gKlxuICogVGhpcyBpcyBjb25zdCBhcyB3ZSBhcmUgc3RvcmluZyBpdCBhcyBhbm5vdGF0aW9uXG4gKiBmb3IgdGhlIGNvbXBpbGVkIGNvbXBvbmVudCB0eXBlLlxuICovXG5AQ09OU1QoKVxuZXhwb3J0IGNsYXNzIENvbXBpbGVkSG9zdFRlbXBsYXRlIHtcbiAgY29uc3RydWN0b3IocHVibGljIHRlbXBsYXRlOiBDb21waWxlZENvbXBvbmVudFRlbXBsYXRlKSB7fVxufVxuXG4vKipcbiAqIEEgY29tcGlsZWQgdGVtcGxhdGUuXG4gKi9cbkBDT05TVCgpXG5leHBvcnQgY2xhc3MgQ29tcGlsZWRDb21wb25lbnRUZW1wbGF0ZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBpZDogc3RyaW5nLCBwdWJsaWMgY2hhbmdlRGV0ZWN0b3JGYWN0b3J5OiBGdW5jdGlvbixcbiAgICAgICAgICAgICAgcHVibGljIGNvbW1hbmRzOiBUZW1wbGF0ZUNtZFtdLCBwdWJsaWMgc3R5bGVzOiBzdHJpbmdbXSkge31cbn1cblxuY29uc3QgRU1QVFlfQVJSID0gQ09OU1RfRVhQUihbXSk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVtcGxhdGVDbWQgZXh0ZW5kcyBSZW5kZXJUZW1wbGF0ZUNtZCB7XG4gIHZpc2l0KHZpc2l0b3I6IFJlbmRlckNvbW1hbmRWaXNpdG9yLCBjb250ZXh0OiBhbnkpOiBhbnk7XG59XG5cbkBDT05TVCgpXG5leHBvcnQgY2xhc3MgVGV4dENtZCBpbXBsZW1lbnRzIFRlbXBsYXRlQ21kLCBSZW5kZXJUZXh0Q21kIHtcbiAgY29uc3RydWN0b3IocHVibGljIHZhbHVlOiBzdHJpbmcsIHB1YmxpYyBpc0JvdW5kOiBib29sZWFuLCBwdWJsaWMgbmdDb250ZW50SW5kZXg6IG51bWJlcikge31cbiAgdmlzaXQodmlzaXRvcjogUmVuZGVyQ29tbWFuZFZpc2l0b3IsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHZpc2l0b3IudmlzaXRUZXh0KHRoaXMsIGNvbnRleHQpO1xuICB9XG59XG5cbkBDT05TVCgpXG5leHBvcnQgY2xhc3MgTmdDb250ZW50Q21kIGltcGxlbWVudHMgVGVtcGxhdGVDbWQsIFJlbmRlck5nQ29udGVudENtZCB7XG4gIGlzQm91bmQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY29uc3RydWN0b3IocHVibGljIGluZGV4OiBudW1iZXIsIHB1YmxpYyBuZ0NvbnRlbnRJbmRleDogbnVtYmVyKSB7fVxuICB2aXNpdCh2aXNpdG9yOiBSZW5kZXJDb21tYW5kVmlzaXRvciwgY29udGV4dDogYW55KTogYW55IHtcbiAgICByZXR1cm4gdmlzaXRvci52aXNpdE5nQ29udGVudCh0aGlzLCBjb250ZXh0KTtcbiAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSUJlZ2luRWxlbWVudENtZCBleHRlbmRzIFJlbmRlckJlZ2luRWxlbWVudENtZCBpbXBsZW1lbnRzIFRlbXBsYXRlQ21kIHtcbiAgZ2V0IHZhcmlhYmxlTmFtZUFuZFZhbHVlcygpOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+IHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfVxuICBnZXQgZXZlbnRUYXJnZXRBbmROYW1lcygpOiBzdHJpbmdbXSB7IHJldHVybiB1bmltcGxlbWVudGVkKCk7IH1cbiAgZ2V0IGRpcmVjdGl2ZXMoKTogVHlwZVtdIHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfVxuICBhYnN0cmFjdCB2aXNpdCh2aXNpdG9yOiBSZW5kZXJDb21tYW5kVmlzaXRvciwgY29udGV4dDogYW55KTogYW55O1xufVxuXG5AQ09OU1QoKVxuZXhwb3J0IGNsYXNzIEJlZ2luRWxlbWVudENtZCBpbXBsZW1lbnRzIFRlbXBsYXRlQ21kLCBJQmVnaW5FbGVtZW50Q21kLCBSZW5kZXJCZWdpbkVsZW1lbnRDbWQge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nLCBwdWJsaWMgYXR0ck5hbWVBbmRWYWx1ZXM6IHN0cmluZ1tdLFxuICAgICAgICAgICAgICBwdWJsaWMgZXZlbnRUYXJnZXRBbmROYW1lczogc3RyaW5nW10sXG4gICAgICAgICAgICAgIHB1YmxpYyB2YXJpYWJsZU5hbWVBbmRWYWx1ZXM6IEFycmF5PHN0cmluZyB8IG51bWJlcj4sIHB1YmxpYyBkaXJlY3RpdmVzOiBUeXBlW10sXG4gICAgICAgICAgICAgIHB1YmxpYyBpc0JvdW5kOiBib29sZWFuLCBwdWJsaWMgbmdDb250ZW50SW5kZXg6IG51bWJlcikge31cbiAgdmlzaXQodmlzaXRvcjogUmVuZGVyQ29tbWFuZFZpc2l0b3IsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHZpc2l0b3IudmlzaXRCZWdpbkVsZW1lbnQodGhpcywgY29udGV4dCk7XG4gIH1cbn1cblxuXG5AQ09OU1QoKVxuZXhwb3J0IGNsYXNzIEVuZEVsZW1lbnRDbWQgaW1wbGVtZW50cyBUZW1wbGF0ZUNtZCB7XG4gIHZpc2l0KHZpc2l0b3I6IFJlbmRlckNvbW1hbmRWaXNpdG9yLCBjb250ZXh0OiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB2aXNpdG9yLnZpc2l0RW5kRWxlbWVudChjb250ZXh0KTtcbiAgfVxufVxuXG5AQ09OU1QoKVxuZXhwb3J0IGNsYXNzIEJlZ2luQ29tcG9uZW50Q21kIGltcGxlbWVudHMgVGVtcGxhdGVDbWQsIElCZWdpbkVsZW1lbnRDbWQsIFJlbmRlckJlZ2luQ29tcG9uZW50Q21kIHtcbiAgaXNCb3VuZDogYm9vbGVhbiA9IHRydWU7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcsIHB1YmxpYyBhdHRyTmFtZUFuZFZhbHVlczogc3RyaW5nW10sXG4gICAgICAgICAgICAgIHB1YmxpYyBldmVudFRhcmdldEFuZE5hbWVzOiBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgcHVibGljIHZhcmlhYmxlTmFtZUFuZFZhbHVlczogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPiwgcHVibGljIGRpcmVjdGl2ZXM6IFR5cGVbXSxcbiAgICAgICAgICAgICAgcHVibGljIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLCBwdWJsaWMgbmdDb250ZW50SW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgLy8gTm90ZTogdGhlIHRlbXBsYXRlIG5lZWRzIHRvIGJlIHN0b3JlZCBhcyBhIGZ1bmN0aW9uXG4gICAgICAgICAgICAgIC8vIHNvIHRoYXQgd2UgY2FuIHJlc29sdmUgY3ljbGVzXG4gICAgICAgICAgICAgIHB1YmxpYyB0ZW1wbGF0ZUdldHRlcjogRnVuY3Rpb24gLyooKSA9PiBDb21waWxlZENvbXBvbmVudFRlbXBsYXRlKi8pIHt9XG5cbiAgZ2V0IHRlbXBsYXRlSWQoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMudGVtcGxhdGVHZXR0ZXIoKS5pZDsgfVxuXG4gIHZpc2l0KHZpc2l0b3I6IFJlbmRlckNvbW1hbmRWaXNpdG9yLCBjb250ZXh0OiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB2aXNpdG9yLnZpc2l0QmVnaW5Db21wb25lbnQodGhpcywgY29udGV4dCk7XG4gIH1cbn1cblxuQENPTlNUKClcbmV4cG9ydCBjbGFzcyBFbmRDb21wb25lbnRDbWQgaW1wbGVtZW50cyBUZW1wbGF0ZUNtZCB7XG4gIHZpc2l0KHZpc2l0b3I6IFJlbmRlckNvbW1hbmRWaXNpdG9yLCBjb250ZXh0OiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB2aXNpdG9yLnZpc2l0RW5kQ29tcG9uZW50KGNvbnRleHQpO1xuICB9XG59XG5cbkBDT05TVCgpXG5leHBvcnQgY2xhc3MgRW1iZWRkZWRUZW1wbGF0ZUNtZCBpbXBsZW1lbnRzIFRlbXBsYXRlQ21kLCBJQmVnaW5FbGVtZW50Q21kLFxuICAgIFJlbmRlckVtYmVkZGVkVGVtcGxhdGVDbWQge1xuICBpc0JvdW5kOiBib29sZWFuID0gdHJ1ZTtcbiAgbmFtZTogc3RyaW5nID0gbnVsbDtcbiAgZXZlbnRUYXJnZXRBbmROYW1lczogc3RyaW5nW10gPSBFTVBUWV9BUlI7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBhdHRyTmFtZUFuZFZhbHVlczogc3RyaW5nW10sIHB1YmxpYyB2YXJpYWJsZU5hbWVBbmRWYWx1ZXM6IHN0cmluZ1tdLFxuICAgICAgICAgICAgICBwdWJsaWMgZGlyZWN0aXZlczogVHlwZVtdLCBwdWJsaWMgaXNNZXJnZWQ6IGJvb2xlYW4sIHB1YmxpYyBuZ0NvbnRlbnRJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICBwdWJsaWMgY2hhbmdlRGV0ZWN0b3JGYWN0b3J5OiBGdW5jdGlvbiwgcHVibGljIGNoaWxkcmVuOiBUZW1wbGF0ZUNtZFtdKSB7fVxuICB2aXNpdCh2aXNpdG9yOiBSZW5kZXJDb21tYW5kVmlzaXRvciwgY29udGV4dDogYW55KTogYW55IHtcbiAgICByZXR1cm4gdmlzaXRvci52aXNpdEVtYmVkZGVkVGVtcGxhdGUodGhpcywgY29udGV4dCk7XG4gIH1cbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIENvbW1hbmRWaXNpdG9yIGV4dGVuZHMgUmVuZGVyQ29tbWFuZFZpc2l0b3Ige1xuICB2aXNpdFRleHQoY21kOiBUZXh0Q21kLCBjb250ZXh0OiBhbnkpOiBhbnk7XG4gIHZpc2l0TmdDb250ZW50KGNtZDogTmdDb250ZW50Q21kLCBjb250ZXh0OiBhbnkpOiBhbnk7XG4gIHZpc2l0QmVnaW5FbGVtZW50KGNtZDogQmVnaW5FbGVtZW50Q21kLCBjb250ZXh0OiBhbnkpOiBhbnk7XG4gIHZpc2l0RW5kRWxlbWVudChjb250ZXh0OiBhbnkpOiBhbnk7XG4gIHZpc2l0QmVnaW5Db21wb25lbnQoY21kOiBCZWdpbkNvbXBvbmVudENtZCwgY29udGV4dDogYW55KTogYW55O1xuICB2aXNpdEVuZENvbXBvbmVudChjb250ZXh0OiBhbnkpOiBhbnk7XG4gIHZpc2l0RW1iZWRkZWRUZW1wbGF0ZShjbWQ6IEVtYmVkZGVkVGVtcGxhdGVDbWQsIGNvbnRleHQ6IGFueSk6IGFueTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZpc2l0QWxsQ29tbWFuZHModmlzaXRvcjogQ29tbWFuZFZpc2l0b3IsIGNtZHM6IFRlbXBsYXRlQ21kW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBhbnkgPSBudWxsKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY21kcy5sZW5ndGg7IGkrKykge1xuICAgIGNtZHNbaV0udmlzaXQodmlzaXRvciwgY29udGV4dCk7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci90ZW1wbGF0ZV9jb21tYW5kcy50c1xuICoqLyIsImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvZGknO1xuaW1wb3J0IHtwcmludH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIENvbnNvbGUge1xuICBsb2cobWVzc2FnZTogc3RyaW5nKTogdm9pZCB7IHByaW50KG1lc3NhZ2UpOyB9XG59XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvY29uc29sZS50c1xuICoqLyIsIi8vIFB1YmxpYyBBUEkgZm9yIFpvbmVcbmV4cG9ydCB7Tmdab25lLCBaZXJvQXJnRnVuY3Rpb24sIEVycm9ySGFuZGxpbmdGbiwgTmdab25lRXJyb3J9IGZyb20gJy4vem9uZS9uZ196b25lJztcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL3pvbmUudHNcbiAqKi8iLCIvLyBQdWJsaWMgQVBJIGZvciByZW5kZXJcbmV4cG9ydCB7XG4gIFJlbmRlckV2ZW50RGlzcGF0Y2hlcixcbiAgUmVuZGVyZXIsXG4gIFJlbmRlckVsZW1lbnRSZWYsXG4gIFJlbmRlclZpZXdSZWYsXG4gIFJlbmRlclByb3RvVmlld1JlZixcbiAgUmVuZGVyRnJhZ21lbnRSZWYsXG4gIFJlbmRlclZpZXdXaXRoRnJhZ21lbnRzLFxuICBSZW5kZXJUZW1wbGF0ZUNtZCxcbiAgUmVuZGVyQ29tbWFuZFZpc2l0b3IsXG4gIFJlbmRlclRleHRDbWQsXG4gIFJlbmRlck5nQ29udGVudENtZCxcbiAgUmVuZGVyQmVnaW5FbGVtZW50Q21kLFxuICBSZW5kZXJCZWdpbkNvbXBvbmVudENtZCxcbiAgUmVuZGVyRW1iZWRkZWRUZW1wbGF0ZUNtZCxcbiAgUmVuZGVyQmVnaW5DbWQsXG4gIFJlbmRlckNvbXBvbmVudFRlbXBsYXRlXG59IGZyb20gJy4vcmVuZGVyL2FwaSc7XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvcmVuZGVyLnRzXG4gKiovIiwiLy8gUHVibGljIEFQSSBmb3IgY29tcGlsZXJcbmV4cG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIEFmdGVyQ29udGVudENoZWNrZWQsXG4gIEFmdGVyVmlld0luaXQsXG4gIEFmdGVyVmlld0NoZWNrZWQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIERvQ2hlY2tcbn0gZnJvbSAnLi9saW5rZXIvaW50ZXJmYWNlcyc7XG5leHBvcnQge0RpcmVjdGl2ZVJlc29sdmVyfSBmcm9tICcuL2xpbmtlci9kaXJlY3RpdmVfcmVzb2x2ZXInO1xuZXhwb3J0IHtWaWV3UmVzb2x2ZXJ9IGZyb20gJy4vbGlua2VyL3ZpZXdfcmVzb2x2ZXInO1xuZXhwb3J0IHtDb21waWxlcn0gZnJvbSAnLi9saW5rZXIvY29tcGlsZXInO1xuZXhwb3J0IHtBcHBWaWV3TWFuYWdlcn0gZnJvbSAnLi9saW5rZXIvdmlld19tYW5hZ2VyJztcbmV4cG9ydCB7UXVlcnlMaXN0fSBmcm9tICcuL2xpbmtlci9xdWVyeV9saXN0JztcbmV4cG9ydCB7RHluYW1pY0NvbXBvbmVudExvYWRlcn0gZnJvbSAnLi9saW5rZXIvZHluYW1pY19jb21wb25lbnRfbG9hZGVyJztcbmV4cG9ydCB7RWxlbWVudFJlZn0gZnJvbSAnLi9saW5rZXIvZWxlbWVudF9yZWYnO1xuZXhwb3J0IHtUZW1wbGF0ZVJlZn0gZnJvbSAnLi9saW5rZXIvdGVtcGxhdGVfcmVmJztcbmV4cG9ydCB7Vmlld1JlZiwgSG9zdFZpZXdSZWYsIFByb3RvVmlld1JlZn0gZnJvbSAnLi9saW5rZXIvdmlld19yZWYnO1xuZXhwb3J0IHtWaWV3Q29udGFpbmVyUmVmfSBmcm9tICcuL2xpbmtlci92aWV3X2NvbnRhaW5lcl9yZWYnO1xuZXhwb3J0IHtDb21wb25lbnRSZWZ9IGZyb20gJy4vbGlua2VyL2R5bmFtaWNfY29tcG9uZW50X2xvYWRlcic7XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyLnRzXG4gKiovIiwiaW1wb3J0IHtUeXBlLCBpc1ByZXNlbnQsIGlzQmxhbmt9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge0xpc3RXcmFwcGVyLCBNYXBXcmFwcGVyLCBQcmVkaWNhdGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge3VuaW1wbGVtZW50ZWR9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9ucyc7XG5pbXBvcnQge0VsZW1lbnRJbmplY3Rvcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL2VsZW1lbnRfaW5qZWN0b3InO1xuaW1wb3J0IHtBcHBWaWV3LCBWaWV3VHlwZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL3ZpZXcnO1xuaW1wb3J0IHtpbnRlcm5hbFZpZXd9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci92aWV3X3JlZic7XG5pbXBvcnQge0VsZW1lbnRSZWYsIEVsZW1lbnRSZWZffSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvZWxlbWVudF9yZWYnO1xuXG4vKipcbiAqIEEgRGVidWdFbGVtZW50IGNvbnRhaW5zIGluZm9ybWF0aW9uIGZyb20gdGhlIEFuZ3VsYXIgY29tcGlsZXIgYWJvdXQgYW5cbiAqIGVsZW1lbnQgYW5kIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgY29ycmVzcG9uZGluZyBFbGVtZW50SW5qZWN0b3IgYW5kXG4gKiB1bmRlcmx5aW5nIERPTSBFbGVtZW50LCBhcyB3ZWxsIGFzIGEgd2F5IHRvIHF1ZXJ5IGZvciBjaGlsZHJlbi5cbiAqXG4gKiBBIERlYnVnRWxlbWVudCBjYW4gYmUgb2J0YWluZWQgZnJvbSBhIHtAbGluayBDb21wb25lbnRGaXh0dXJlfSBvciBmcm9tIGFuXG4gKiB7QGxpbmsgRWxlbWVudFJlZn0gdmlhIHtAbGluayBpbnNwZWN0RWxlbWVudH0uXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEZWJ1Z0VsZW1lbnQge1xuICAvKipcbiAgICogUmV0dXJuIHRoZSBpbnN0YW5jZSBvZiB0aGUgY29tcG9uZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVsZW1lbnQsIGlmIGFueS5cbiAgICovXG4gIGdldCBjb21wb25lbnRJbnN0YW5jZSgpOiBhbnkgeyByZXR1cm4gdW5pbXBsZW1lbnRlZCgpOyB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG5hdGl2ZSBIVE1MIGVsZW1lbnQgZm9yIHRoaXMgRGVidWdFbGVtZW50LlxuICAgKi9cbiAgZ2V0IG5hdGl2ZUVsZW1lbnQoKTogYW55IHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfTtcblxuICAvKipcbiAgICogUmV0dXJuIGFuIEFuZ3VsYXIge0BsaW5rIEVsZW1lbnRSZWZ9IGZvciB0aGlzIGVsZW1lbnQuXG4gICAqL1xuICBnZXQgZWxlbWVudFJlZigpOiBFbGVtZW50UmVmIHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfTtcblxuICAvKipcbiAgICogR2V0IHRoZSBkaXJlY3RpdmUgYWN0aXZlIGZvciB0aGlzIGVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4gaW5kZXgsIGlmIGFueS5cbiAgICovXG4gIGFic3RyYWN0IGdldERpcmVjdGl2ZUluc3RhbmNlKGRpcmVjdGl2ZUluZGV4OiBudW1iZXIpOiBhbnk7XG5cbiAgLyoqXG4gICAqIEdldCBjaGlsZCBEZWJ1Z0VsZW1lbnRzIGZyb20gd2l0aGluIHRoZSBMaWdodCBET00uXG4gICAqXG4gICAqIEByZXR1cm4ge0RlYnVnRWxlbWVudFtdfVxuICAgKi9cbiAgZ2V0IGNoaWxkcmVuKCk6IERlYnVnRWxlbWVudFtdIHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfTtcblxuICAvKipcbiAgICogR2V0IHRoZSByb290IERlYnVnRWxlbWVudCBjaGlsZHJlbiBvZiBhIGNvbXBvbmVudC4gUmV0dXJucyBhbiBlbXB0eVxuICAgKiBsaXN0IGlmIHRoZSBjdXJyZW50IERlYnVnRWxlbWVudCBpcyBub3QgYSBjb21wb25lbnQgcm9vdC5cbiAgICpcbiAgICogQHJldHVybiB7RGVidWdFbGVtZW50W119XG4gICAqL1xuICBnZXQgY29tcG9uZW50Vmlld0NoaWxkcmVuKCk6IERlYnVnRWxlbWVudFtdIHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfTtcblxuICAvKipcbiAgICogU2ltdWxhdGUgYW4gZXZlbnQgZnJvbSB0aGlzIGVsZW1lbnQgYXMgaWYgdGhlIHVzZXIgaGFkIGNhdXNlZFxuICAgKiB0aGlzIGV2ZW50IHRvIGZpcmUgZnJvbSB0aGUgcGFnZS5cbiAgICovXG4gIGFic3RyYWN0IHRyaWdnZXJFdmVudEhhbmRsZXIoZXZlbnROYW1lOiBzdHJpbmcsIGV2ZW50T2JqOiBFdmVudCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENoZWNrIHdoZXRoZXIgdGhlIGVsZW1lbnQgaGFzIGEgZGlyZWN0aXZlIHdpdGggdGhlIGdpdmVuIHR5cGUuXG4gICAqL1xuICBhYnN0cmFjdCBoYXNEaXJlY3RpdmUodHlwZTogVHlwZSk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluamVjdCB0aGUgZ2l2ZW4gdHlwZSBmcm9tIHRoZSBlbGVtZW50IGluamVjdG9yLlxuICAgKi9cbiAgYWJzdHJhY3QgaW5qZWN0KHR5cGU6IFR5cGUpOiBhbnk7XG5cblxuICAvKipcbiAgICogUmVhZCBhIGxvY2FsIHZhcmlhYmxlIGZyb20gdGhlIGVsZW1lbnQgKGUuZy4gb25lIGRlZmluZWQgd2l0aCBgI3ZhcmlhYmxlYCkuXG4gICAqL1xuICBhYnN0cmFjdCBnZXRMb2NhbChuYW1lOiBzdHJpbmcpOiBhbnk7XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgZmlyc3QgZGVzY2VuZGFudCBUZXN0RWxlbWVudCBtYXRjaGluZyB0aGUgZ2l2ZW4gcHJlZGljYXRlXG4gICAqIGFuZCBzY29wZS5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbjogYm9vbGVhbn0gcHJlZGljYXRlXG4gICAqIEBwYXJhbSB7U2NvcGV9IHNjb3BlXG4gICAqXG4gICAqIEByZXR1cm4ge0RlYnVnRWxlbWVudH1cbiAgICovXG4gIHF1ZXJ5KHByZWRpY2F0ZTogUHJlZGljYXRlPERlYnVnRWxlbWVudD4sIHNjb3BlOiBGdW5jdGlvbiA9IFNjb3BlLmFsbCk6IERlYnVnRWxlbWVudCB7XG4gICAgdmFyIHJlc3VsdHMgPSB0aGlzLnF1ZXJ5QWxsKHByZWRpY2F0ZSwgc2NvcGUpO1xuICAgIHJldHVybiByZXN1bHRzLmxlbmd0aCA+IDAgPyByZXN1bHRzWzBdIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gZGVzY2VuZGFudCBUZXN0RWxlbWVtdHMgbWF0Y2hpbmcgdGhlIGdpdmVuIHByZWRpY2F0ZVxuICAgKiBhbmQgc2NvcGUuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb246IGJvb2xlYW59IHByZWRpY2F0ZVxuICAgKiBAcGFyYW0ge1Njb3BlfSBzY29wZVxuICAgKlxuICAgKiBAcmV0dXJuIHtEZWJ1Z0VsZW1lbnRbXX1cbiAgICovXG4gIHF1ZXJ5QWxsKHByZWRpY2F0ZTogUHJlZGljYXRlPERlYnVnRWxlbWVudD4sIHNjb3BlOiBGdW5jdGlvbiA9IFNjb3BlLmFsbCk6IERlYnVnRWxlbWVudFtdIHtcbiAgICB2YXIgZWxlbWVudHNJblNjb3BlOiBhbnlbXSA9IHNjb3BlKHRoaXMpO1xuXG4gICAgcmV0dXJuIGVsZW1lbnRzSW5TY29wZS5maWx0ZXIocHJlZGljYXRlKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGVidWdFbGVtZW50XyBleHRlbmRzIERlYnVnRWxlbWVudCB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2VsZW1lbnRJbmplY3RvcjogRWxlbWVudEluamVjdG9yO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3BhcmVudFZpZXc6IEFwcFZpZXcsIHByaXZhdGUgX2JvdW5kRWxlbWVudEluZGV4OiBudW1iZXIpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2VsZW1lbnRJbmplY3RvciA9IHRoaXMuX3BhcmVudFZpZXcuZWxlbWVudEluamVjdG9yc1t0aGlzLl9ib3VuZEVsZW1lbnRJbmRleF07XG4gIH1cblxuICBnZXQgY29tcG9uZW50SW5zdGFuY2UoKTogYW55IHtcbiAgICBpZiAoIWlzUHJlc2VudCh0aGlzLl9lbGVtZW50SW5qZWN0b3IpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRJbmplY3Rvci5nZXRDb21wb25lbnQoKTtcbiAgfVxuXG4gIGdldCBuYXRpdmVFbGVtZW50KCk6IGFueSB7IHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDsgfVxuXG4gIGdldCBlbGVtZW50UmVmKCk6IEVsZW1lbnRSZWYgeyByZXR1cm4gdGhpcy5fcGFyZW50Vmlldy5lbGVtZW50UmVmc1t0aGlzLl9ib3VuZEVsZW1lbnRJbmRleF07IH1cblxuICBnZXREaXJlY3RpdmVJbnN0YW5jZShkaXJlY3RpdmVJbmRleDogbnVtYmVyKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudEluamVjdG9yLmdldERpcmVjdGl2ZUF0SW5kZXgoZGlyZWN0aXZlSW5kZXgpO1xuICB9XG5cbiAgZ2V0IGNoaWxkcmVuKCk6IERlYnVnRWxlbWVudFtdIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0Q2hpbGRFbGVtZW50cyh0aGlzLl9wYXJlbnRWaWV3LCB0aGlzLl9ib3VuZEVsZW1lbnRJbmRleCk7XG4gIH1cblxuICBnZXQgY29tcG9uZW50Vmlld0NoaWxkcmVuKCk6IERlYnVnRWxlbWVudFtdIHtcbiAgICB2YXIgc2hhZG93VmlldyA9IHRoaXMuX3BhcmVudFZpZXcuZ2V0TmVzdGVkVmlldyh0aGlzLl9ib3VuZEVsZW1lbnRJbmRleCk7XG5cbiAgICBpZiAoIWlzUHJlc2VudChzaGFkb3dWaWV3KSB8fCBzaGFkb3dWaWV3LnByb3RvLnR5cGUgIT09IFZpZXdUeXBlLkNPTVBPTkVOVCkge1xuICAgICAgLy8gVGhlIGN1cnJlbnQgZWxlbWVudCBpcyBub3QgYSBjb21wb25lbnQuXG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2dldENoaWxkRWxlbWVudHMoc2hhZG93VmlldywgbnVsbCk7XG4gIH1cblxuICB0cmlnZ2VyRXZlbnRIYW5kbGVyKGV2ZW50TmFtZTogc3RyaW5nLCBldmVudE9iajogRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLl9wYXJlbnRWaWV3LnRyaWdnZXJFdmVudEhhbmRsZXJzKGV2ZW50TmFtZSwgZXZlbnRPYmosIHRoaXMuX2JvdW5kRWxlbWVudEluZGV4KTtcbiAgfVxuXG4gIGhhc0RpcmVjdGl2ZSh0eXBlOiBUeXBlKTogYm9vbGVhbiB7XG4gICAgaWYgKCFpc1ByZXNlbnQodGhpcy5fZWxlbWVudEluamVjdG9yKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudEluamVjdG9yLmhhc0RpcmVjdGl2ZSh0eXBlKTtcbiAgfVxuXG4gIGluamVjdCh0eXBlOiBUeXBlKTogYW55IHtcbiAgICBpZiAoIWlzUHJlc2VudCh0aGlzLl9lbGVtZW50SW5qZWN0b3IpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRJbmplY3Rvci5nZXQodHlwZSk7XG4gIH1cblxuICBnZXRMb2NhbChuYW1lOiBzdHJpbmcpOiBhbnkgeyByZXR1cm4gdGhpcy5fcGFyZW50Vmlldy5sb2NhbHMuZ2V0KG5hbWUpOyB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZ2V0Q2hpbGRFbGVtZW50cyh2aWV3OiBBcHBWaWV3LCBwYXJlbnRCb3VuZEVsZW1lbnRJbmRleDogbnVtYmVyKTogRGVidWdFbGVtZW50W10ge1xuICAgIHZhciBlbHMgPSBbXTtcbiAgICB2YXIgcGFyZW50RWxlbWVudEJpbmRlciA9IG51bGw7XG4gICAgaWYgKGlzUHJlc2VudChwYXJlbnRCb3VuZEVsZW1lbnRJbmRleCkpIHtcbiAgICAgIHBhcmVudEVsZW1lbnRCaW5kZXIgPSB2aWV3LnByb3RvLmVsZW1lbnRCaW5kZXJzW3BhcmVudEJvdW5kRWxlbWVudEluZGV4IC0gdmlldy5lbGVtZW50T2Zmc2V0XTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2aWV3LnByb3RvLmVsZW1lbnRCaW5kZXJzLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgYmluZGVyID0gdmlldy5wcm90by5lbGVtZW50QmluZGVyc1tpXTtcbiAgICAgIGlmIChiaW5kZXIucGFyZW50ID09IHBhcmVudEVsZW1lbnRCaW5kZXIpIHtcbiAgICAgICAgZWxzLnB1c2gobmV3IERlYnVnRWxlbWVudF8odmlldywgdmlldy5lbGVtZW50T2Zmc2V0ICsgaSkpO1xuXG4gICAgICAgIHZhciB2aWV3cyA9IHZpZXcudmlld0NvbnRhaW5lcnNbdmlldy5lbGVtZW50T2Zmc2V0ICsgaV07XG4gICAgICAgIGlmIChpc1ByZXNlbnQodmlld3MpKSB7XG4gICAgICAgICAgdmlld3Mudmlld3MuZm9yRWFjaChcbiAgICAgICAgICAgICAgKG5leHRWaWV3KSA9PiB7IGVscyA9IGVscy5jb25jYXQodGhpcy5fZ2V0Q2hpbGRFbGVtZW50cyhuZXh0VmlldywgbnVsbCkpOyB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZWxzO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHtAbGluayBEZWJ1Z0VsZW1lbnR9IGZvciBhbiB7QGxpbmsgRWxlbWVudFJlZn0uXG4gKlxuICogQHBhcmFtIHtFbGVtZW50UmVmfTogZWxlbWVudFJlZlxuICogQHJldHVybiB7RGVidWdFbGVtZW50fVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zcGVjdEVsZW1lbnQoZWxlbWVudFJlZjogRWxlbWVudFJlZik6IERlYnVnRWxlbWVudCB7XG4gIHJldHVybiBuZXcgRGVidWdFbGVtZW50XyhpbnRlcm5hbFZpZXcoKDxFbGVtZW50UmVmXz5lbGVtZW50UmVmKS5wYXJlbnRWaWV3KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICg8RWxlbWVudFJlZl8+ZWxlbWVudFJlZikuYm91bmRFbGVtZW50SW5kZXgpO1xufVxuXG4vKipcbiAqIE1hcHMgYW4gYXJyYXkgb2Yge0BsaW5rIERlYnVnRWxlbWVudH1zIHRvIGFuIGFycmF5IG9mIG5hdGl2ZSBET00gZWxlbWVudHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc05hdGl2ZUVsZW1lbnRzKGFycjogRGVidWdFbGVtZW50W10pOiBhbnlbXSB7XG4gIHJldHVybiBhcnIubWFwKChkZWJ1Z0VsKSA9PiBkZWJ1Z0VsLm5hdGl2ZUVsZW1lbnQpO1xufVxuXG4vKipcbiAqIFNldCBvZiBzY29wZSBmdW5jdGlvbnMgdXNlZCB3aXRoIHtAbGluayBEZWJ1Z0VsZW1lbnR9J3MgcXVlcnkgZnVuY3Rpb25hbGl0eS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNjb3BlIHtcbiAgLyoqXG4gICAqIFNjb3BlIHF1ZXJpZXMgdG8gYm90aCB0aGUgbGlnaHQgZG9tIGFuZCB2aWV3IG9mIGFuIGVsZW1lbnQgYW5kIGl0c1xuICAgKiBjaGlsZHJlbi5cbiAgICpcbiAgICogIyMgRXhhbXBsZVxuICAgKlxuICAgKiB7QGV4YW1wbGUgY29yZS9kZWJ1Zy90cy9kZWJ1Z19lbGVtZW50L2RlYnVnX2VsZW1lbnQudHMgcmVnaW9uPSdzY29wZV9hbGwnfVxuICAgKi9cbiAgc3RhdGljIGFsbChkZWJ1Z0VsZW1lbnQ6IERlYnVnRWxlbWVudCk6IERlYnVnRWxlbWVudFtdIHtcbiAgICB2YXIgc2NvcGUgPSBbXTtcbiAgICBzY29wZS5wdXNoKGRlYnVnRWxlbWVudCk7XG5cbiAgICBkZWJ1Z0VsZW1lbnQuY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiBzY29wZSA9IHNjb3BlLmNvbmNhdChTY29wZS5hbGwoY2hpbGQpKSk7XG5cbiAgICBkZWJ1Z0VsZW1lbnQuY29tcG9uZW50Vmlld0NoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4gc2NvcGUgPSBzY29wZS5jb25jYXQoU2NvcGUuYWxsKGNoaWxkKSkpO1xuXG4gICAgcmV0dXJuIHNjb3BlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNjb3BlIHF1ZXJpZXMgdG8gdGhlIGxpZ2h0IGRvbSBvZiBhbiBlbGVtZW50IGFuZCBpdHMgY2hpbGRyZW4uXG4gICAqXG4gICAqICMjIEV4YW1wbGVcbiAgICpcbiAgICoge0BleGFtcGxlIGNvcmUvZGVidWcvdHMvZGVidWdfZWxlbWVudC9kZWJ1Z19lbGVtZW50LnRzIHJlZ2lvbj0nc2NvcGVfbGlnaHQnfVxuICAgKi9cbiAgc3RhdGljIGxpZ2h0KGRlYnVnRWxlbWVudDogRGVidWdFbGVtZW50KTogRGVidWdFbGVtZW50W10ge1xuICAgIHZhciBzY29wZSA9IFtdO1xuICAgIGRlYnVnRWxlbWVudC5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgIHNjb3BlLnB1c2goY2hpbGQpO1xuICAgICAgc2NvcGUgPSBzY29wZS5jb25jYXQoU2NvcGUubGlnaHQoY2hpbGQpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gc2NvcGU7XG4gIH1cblxuICAvKipcbiAgICogU2NvcGUgcXVlcmllcyB0byB0aGUgdmlldyBvZiBhbiBlbGVtZW50IG9mIGl0cyBjaGlsZHJlbi5cbiAgICpcbiAgICogIyMgRXhhbXBsZVxuICAgKlxuICAgKiB7QGV4YW1wbGUgY29yZS9kZWJ1Zy90cy9kZWJ1Z19lbGVtZW50L2RlYnVnX2VsZW1lbnQudHMgcmVnaW9uPSdzY29wZV92aWV3J31cbiAgICovXG4gIHN0YXRpYyB2aWV3KGRlYnVnRWxlbWVudDogRGVidWdFbGVtZW50KTogRGVidWdFbGVtZW50W10ge1xuICAgIHZhciBzY29wZSA9IFtdO1xuXG4gICAgZGVidWdFbGVtZW50LmNvbXBvbmVudFZpZXdDaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgIHNjb3BlLnB1c2goY2hpbGQpO1xuICAgICAgc2NvcGUgPSBzY29wZS5jb25jYXQoU2NvcGUubGlnaHQoY2hpbGQpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gc2NvcGU7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2RlYnVnL2RlYnVnX2VsZW1lbnQudHNcbiAqKi8iLCJpbXBvcnQge1R5cGUsIGlzQmxhbmssIGlzUHJlc2VudCwgYXNzZXJ0aW9uc0VuYWJsZWQsIENPTlNUX0VYUFJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge3Byb3ZpZGUsIFByb3ZpZGVyLCBJbmplY3RvciwgT3BhcXVlVG9rZW59IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpJztcbmltcG9ydCB7Q29uc29sZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvY29uc29sZSc7XG5pbXBvcnQge1JlZmxlY3RvciwgcmVmbGVjdG9yfSBmcm9tICcuL3JlZmxlY3Rpb24vcmVmbGVjdGlvbic7XG5pbXBvcnQge1Rlc3RhYmlsaXR5UmVnaXN0cnl9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL3Rlc3RhYmlsaXR5L3Rlc3RhYmlsaXR5JztcblxuZnVuY3Rpb24gX3JlZmxlY3RvcigpOiBSZWZsZWN0b3Ige1xuICByZXR1cm4gcmVmbGVjdG9yO1xufVxuXG4vKipcbiAqIEEgZGVmYXVsdCBzZXQgb2YgcHJvdmlkZXJzIHdoaWNoIHNob3VsZCBiZSBpbmNsdWRlZCBpbiBhbnkgQW5ndWxhciBwbGF0Zm9ybS5cbiAqL1xuZXhwb3J0IGNvbnN0IFBMQVRGT1JNX0NPTU1PTl9QUk9WSURFUlM6IEFycmF5PFR5cGUgfCBQcm92aWRlciB8IGFueVtdPiA9IENPTlNUX0VYUFIoXG4gICAgW25ldyBQcm92aWRlcihSZWZsZWN0b3IsIHt1c2VGYWN0b3J5OiBfcmVmbGVjdG9yLCBkZXBzOiBbXX0pLCBUZXN0YWJpbGl0eVJlZ2lzdHJ5LCBDb25zb2xlXSk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9wbGF0Zm9ybV9jb21tb25fcHJvdmlkZXJzLnRzXG4gKiovIiwiaW1wb3J0IHtUeXBlLCBDT05TVF9FWFBSfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtwcm92aWRlLCBQcm92aWRlciwgSW5qZWN0b3IsIE9wYXF1ZVRva2VufSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5pbXBvcnQge1xuICBBUFBfQ09NUE9ORU5UX1JFRl9QUk9NSVNFLFxuICBBUFBfQ09NUE9ORU5ULFxuICBBUFBfSURfUkFORE9NX1BST1ZJREVSXG59IGZyb20gJy4vYXBwbGljYXRpb25fdG9rZW5zJztcbmltcG9ydCB7XG4gIEl0ZXJhYmxlRGlmZmVycyxcbiAgZGVmYXVsdEl0ZXJhYmxlRGlmZmVycyxcbiAgS2V5VmFsdWVEaWZmZXJzLFxuICBkZWZhdWx0S2V5VmFsdWVEaWZmZXJzXG59IGZyb20gJy4vY2hhbmdlX2RldGVjdGlvbi9jaGFuZ2VfZGV0ZWN0aW9uJztcbmltcG9ydCB7QXBwVmlld1Bvb2wsIEFQUF9WSUVXX1BPT0xfQ0FQQUNJVFl9IGZyb20gJy4vbGlua2VyL3ZpZXdfcG9vbCc7XG5pbXBvcnQge0FwcFZpZXdNYW5hZ2VyfSBmcm9tICcuL2xpbmtlci92aWV3X21hbmFnZXInO1xuaW1wb3J0IHtBcHBWaWV3TWFuYWdlcl99IGZyb20gXCIuL2xpbmtlci92aWV3X21hbmFnZXJcIjtcbmltcG9ydCB7QXBwVmlld01hbmFnZXJVdGlsc30gZnJvbSAnLi9saW5rZXIvdmlld19tYW5hZ2VyX3V0aWxzJztcbmltcG9ydCB7Vmlld1Jlc29sdmVyfSBmcm9tICcuL2xpbmtlci92aWV3X3Jlc29sdmVyJztcbmltcG9ydCB7QXBwVmlld0xpc3RlbmVyfSBmcm9tICcuL2xpbmtlci92aWV3X2xpc3RlbmVyJztcbmltcG9ydCB7UHJvdG9WaWV3RmFjdG9yeX0gZnJvbSAnLi9saW5rZXIvcHJvdG9fdmlld19mYWN0b3J5JztcbmltcG9ydCB7RGlyZWN0aXZlUmVzb2x2ZXJ9IGZyb20gJy4vbGlua2VyL2RpcmVjdGl2ZV9yZXNvbHZlcic7XG5pbXBvcnQge1BpcGVSZXNvbHZlcn0gZnJvbSAnLi9saW5rZXIvcGlwZV9yZXNvbHZlcic7XG5pbXBvcnQge0NvbXBpbGVyfSBmcm9tICcuL2xpbmtlci9jb21waWxlcic7XG5pbXBvcnQge0NvbXBpbGVyX30gZnJvbSBcIi4vbGlua2VyL2NvbXBpbGVyXCI7XG5pbXBvcnQge0R5bmFtaWNDb21wb25lbnRMb2FkZXJ9IGZyb20gJy4vbGlua2VyL2R5bmFtaWNfY29tcG9uZW50X2xvYWRlcic7XG5pbXBvcnQge0R5bmFtaWNDb21wb25lbnRMb2FkZXJffSBmcm9tIFwiLi9saW5rZXIvZHluYW1pY19jb21wb25lbnRfbG9hZGVyXCI7XG5cbi8qKlxuICogQSBkZWZhdWx0IHNldCBvZiBwcm92aWRlcnMgd2hpY2ggc2hvdWxkIGJlIGluY2x1ZGVkIGluIGFueSBBbmd1bGFyXG4gKiBhcHBsaWNhdGlvbiwgcmVnYXJkbGVzcyBvZiB0aGUgcGxhdGZvcm0gaXQgcnVucyBvbnRvLlxuICovXG5leHBvcnQgY29uc3QgQVBQTElDQVRJT05fQ09NTU9OX1BST1ZJREVSUzogQXJyYXk8VHlwZSB8IFByb3ZpZGVyIHwgYW55W10+ID0gQ09OU1RfRVhQUihbXG4gIG5ldyBQcm92aWRlcihDb21waWxlciwge3VzZUNsYXNzOiBDb21waWxlcl99KSxcbiAgQVBQX0lEX1JBTkRPTV9QUk9WSURFUixcbiAgQXBwVmlld1Bvb2wsXG4gIG5ldyBQcm92aWRlcihBUFBfVklFV19QT09MX0NBUEFDSVRZLCB7dXNlVmFsdWU6IDEwMDAwfSksXG4gIG5ldyBQcm92aWRlcihBcHBWaWV3TWFuYWdlciwge3VzZUNsYXNzOiBBcHBWaWV3TWFuYWdlcl99KSxcbiAgQXBwVmlld01hbmFnZXJVdGlscyxcbiAgQXBwVmlld0xpc3RlbmVyLFxuICBQcm90b1ZpZXdGYWN0b3J5LFxuICBWaWV3UmVzb2x2ZXIsXG4gIG5ldyBQcm92aWRlcihJdGVyYWJsZURpZmZlcnMsIHt1c2VWYWx1ZTogZGVmYXVsdEl0ZXJhYmxlRGlmZmVyc30pLFxuICBuZXcgUHJvdmlkZXIoS2V5VmFsdWVEaWZmZXJzLCB7dXNlVmFsdWU6IGRlZmF1bHRLZXlWYWx1ZURpZmZlcnN9KSxcbiAgRGlyZWN0aXZlUmVzb2x2ZXIsXG4gIFBpcGVSZXNvbHZlcixcbiAgbmV3IFByb3ZpZGVyKER5bmFtaWNDb21wb25lbnRMb2FkZXIsIHt1c2VDbGFzczogRHluYW1pY0NvbXBvbmVudExvYWRlcl99KVxuXSk7XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvYXBwbGljYXRpb25fY29tbW9uX3Byb3ZpZGVycy50c1xuICoqLyIsImV4cG9ydCAqIGZyb20gJy4vc3JjL2NvbW1vbi9waXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL3NyYy9jb21tb24vZGlyZWN0aXZlcyc7XG5leHBvcnQgKiBmcm9tICcuL3NyYy9jb21tb24vZm9ybXMnO1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvY29tbW9uL2NvbW1vbl9kaXJlY3RpdmVzJztcblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9jb21tb24udHNcbiAqKi8iLCIvKipcbiAqIEBtb2R1bGVcbiAqIEBkZXNjcmlwdGlvblxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBzZXQgb2YgY29tbW9uIFBpcGVzLlxuICovXG5pbXBvcnQge0FzeW5jUGlwZX0gZnJvbSAnLi9waXBlcy9hc3luY19waXBlJztcbmltcG9ydCB7VXBwZXJDYXNlUGlwZX0gZnJvbSAnLi9waXBlcy91cHBlcmNhc2VfcGlwZSc7XG5pbXBvcnQge0xvd2VyQ2FzZVBpcGV9IGZyb20gJy4vcGlwZXMvbG93ZXJjYXNlX3BpcGUnO1xuaW1wb3J0IHtKc29uUGlwZX0gZnJvbSAnLi9waXBlcy9qc29uX3BpcGUnO1xuaW1wb3J0IHtTbGljZVBpcGV9IGZyb20gJy4vcGlwZXMvc2xpY2VfcGlwZSc7XG5pbXBvcnQge0RhdGVQaXBlfSBmcm9tICcuL3BpcGVzL2RhdGVfcGlwZSc7XG5pbXBvcnQge0RlY2ltYWxQaXBlLCBQZXJjZW50UGlwZSwgQ3VycmVuY3lQaXBlfSBmcm9tICcuL3BpcGVzL251bWJlcl9waXBlJztcbmltcG9ydCB7Q09OU1RfRVhQUn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxuZXhwb3J0IHtBc3luY1BpcGV9IGZyb20gJy4vcGlwZXMvYXN5bmNfcGlwZSc7XG5leHBvcnQge0RhdGVQaXBlfSBmcm9tICcuL3BpcGVzL2RhdGVfcGlwZSc7XG5leHBvcnQge0pzb25QaXBlfSBmcm9tICcuL3BpcGVzL2pzb25fcGlwZSc7XG5leHBvcnQge1NsaWNlUGlwZX0gZnJvbSAnLi9waXBlcy9zbGljZV9waXBlJztcbmV4cG9ydCB7TG93ZXJDYXNlUGlwZX0gZnJvbSAnLi9waXBlcy9sb3dlcmNhc2VfcGlwZSc7XG5leHBvcnQge051bWJlclBpcGUsIERlY2ltYWxQaXBlLCBQZXJjZW50UGlwZSwgQ3VycmVuY3lQaXBlfSBmcm9tICcuL3BpcGVzL251bWJlcl9waXBlJztcbmV4cG9ydCB7VXBwZXJDYXNlUGlwZX0gZnJvbSAnLi9waXBlcy91cHBlcmNhc2VfcGlwZSc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIEFuZ3VsYXIgY29yZSBwaXBlcyB0aGF0IGFyZSBsaWtlbHkgdG8gYmUgdXNlZCBpbiBlYWNoIGFuZCBldmVyeVxuICogYXBwbGljYXRpb24uXG4gKlxuICogVGhpcyBjb2xsZWN0aW9uIGNhbiBiZSB1c2VkIHRvIHF1aWNrbHkgZW51bWVyYXRlIGFsbCB0aGUgYnVpbHQtaW4gcGlwZXMgaW4gdGhlIGBwaXBlc2BcbiAqIHByb3BlcnR5IG9mIHRoZSBgQENvbXBvbmVudGAgb3IgYEBWaWV3YCBkZWNvcmF0b3JzLlxuICovXG5leHBvcnQgY29uc3QgQ09NTU9OX1BJUEVTID0gQ09OU1RfRVhQUihbXG4gIEFzeW5jUGlwZSxcbiAgVXBwZXJDYXNlUGlwZSxcbiAgTG93ZXJDYXNlUGlwZSxcbiAgSnNvblBpcGUsXG4gIFNsaWNlUGlwZSxcbiAgRGVjaW1hbFBpcGUsXG4gIFBlcmNlbnRQaXBlLFxuICBDdXJyZW5jeVBpcGUsXG4gIERhdGVQaXBlXG5dKTtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21tb24vcGlwZXMudHNcbiAqKi8iLCJpbXBvcnQge2lzQmxhbmssIGlzUHJlc2VudCwgaXNQcm9taXNlLCBDT05TVH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7UHJvbWlzZSwgT2JzZXJ2YWJsZVdyYXBwZXIsIE9ic2VydmFibGUsIEV2ZW50RW1pdHRlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9hc3luYyc7XG5pbXBvcnQge1xuICBQaXBlLFxuICBJbmplY3RhYmxlLFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgT25EZXN0cm95LFxuICBQaXBlVHJhbnNmb3JtLFxuICBXcmFwcGVkVmFsdWVcbn0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5cbmltcG9ydCB7SW52YWxpZFBpcGVBcmd1bWVudEV4Y2VwdGlvbn0gZnJvbSAnLi9pbnZhbGlkX3BpcGVfYXJndW1lbnRfZXhjZXB0aW9uJztcblxuY2xhc3MgT2JzZXJ2YWJsZVN0cmF0ZWd5IHtcbiAgY3JlYXRlU3Vic2NyaXB0aW9uKGFzeW5jOiBhbnksIHVwZGF0ZUxhdGVzdFZhbHVlOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiBPYnNlcnZhYmxlV3JhcHBlci5zdWJzY3JpYmUoYXN5bmMsIHVwZGF0ZUxhdGVzdFZhbHVlLCBlID0+IHsgdGhyb3cgZTsgfSk7XG4gIH1cblxuICBkaXNwb3NlKHN1YnNjcmlwdGlvbjogYW55KTogdm9pZCB7IE9ic2VydmFibGVXcmFwcGVyLmRpc3Bvc2Uoc3Vic2NyaXB0aW9uKTsgfVxuXG4gIG9uRGVzdHJveShzdWJzY3JpcHRpb246IGFueSk6IHZvaWQgeyBPYnNlcnZhYmxlV3JhcHBlci5kaXNwb3NlKHN1YnNjcmlwdGlvbik7IH1cbn1cblxuY2xhc3MgUHJvbWlzZVN0cmF0ZWd5IHtcbiAgY3JlYXRlU3Vic2NyaXB0aW9uKGFzeW5jOiBhbnksIHVwZGF0ZUxhdGVzdFZhbHVlOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiBhc3luYy50aGVuKHVwZGF0ZUxhdGVzdFZhbHVlKTtcbiAgfVxuXG4gIGRpc3Bvc2Uoc3Vic2NyaXB0aW9uOiBhbnkpOiB2b2lkIHt9XG5cbiAgb25EZXN0cm95KHN1YnNjcmlwdGlvbjogYW55KTogdm9pZCB7fVxufVxuXG52YXIgX3Byb21pc2VTdHJhdGVneSA9IG5ldyBQcm9taXNlU3RyYXRlZ3koKTtcbnZhciBfb2JzZXJ2YWJsZVN0cmF0ZWd5ID0gbmV3IE9ic2VydmFibGVTdHJhdGVneSgpO1xuXG5cbi8qKlxuICogVGhlIGBhc3luY2AgcGlwZSBzdWJzY3JpYmVzIHRvIGFuIE9ic2VydmFibGUgb3IgUHJvbWlzZSBhbmQgcmV0dXJucyB0aGUgbGF0ZXN0IHZhbHVlIGl0IGhhc1xuICogZW1pdHRlZC5cbiAqIFdoZW4gYSBuZXcgdmFsdWUgaXMgZW1pdHRlZCwgdGhlIGBhc3luY2AgcGlwZSBtYXJrcyB0aGUgY29tcG9uZW50IHRvIGJlIGNoZWNrZWQgZm9yIGNoYW5nZXMuXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBUaGlzIGV4YW1wbGUgYmluZHMgYSBgUHJvbWlzZWAgdG8gdGhlIHZpZXcuIENsaWNraW5nIHRoZSBgUmVzb2x2ZWAgYnV0dG9uIHJlc29sdmVzIHRoZVxuICogcHJvbWlzZS5cbiAqXG4gKiB7QGV4YW1wbGUgY29yZS9waXBlcy90cy9hc3luY19waXBlL2FzeW5jX3BpcGVfZXhhbXBsZS50cyByZWdpb249J0FzeW5jUGlwZSd9XG4gKlxuICogSXQncyBhbHNvIHBvc3NpYmxlIHRvIHVzZSBgYXN5bmNgIHdpdGggT2JzZXJ2YWJsZXMuIFRoZSBleGFtcGxlIGJlbG93IGJpbmRzIHRoZSBgdGltZWAgT2JzZXJ2YWJsZVxuICogdG8gdGhlIHZpZXcuIEV2ZXJ5IDUwMG1zLCB0aGUgYHRpbWVgIE9ic2VydmFibGUgdXBkYXRlcyB0aGUgdmlldyB3aXRoIHRoZSBjdXJyZW50IHRpbWUuXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogYGBgXG4gKi9cbkBQaXBlKHtuYW1lOiAnYXN5bmMnLCBwdXJlOiBmYWxzZX0pXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQXN5bmNQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSwgT25EZXN0cm95IHtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfbGF0ZXN0VmFsdWU6IE9iamVjdCA9IG51bGw7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2xhdGVzdFJldHVybmVkVmFsdWU6IE9iamVjdCA9IG51bGw7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfc3Vic2NyaXB0aW9uOiBPYmplY3QgPSBudWxsO1xuICAvKiogQGludGVybmFsICovXG4gIF9vYmo6IE9ic2VydmFibGU8YW55PnwgUHJvbWlzZTxhbnk+fCBFdmVudEVtaXR0ZXI8YW55PiA9IG51bGw7XG4gIHByaXZhdGUgX3N0cmF0ZWd5OiBhbnkgPSBudWxsO1xuICAvKiogQGludGVybmFsICovXG4gIHB1YmxpYyBfcmVmOiBDaGFuZ2VEZXRlY3RvclJlZjtcbiAgY29uc3RydWN0b3IoX3JlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHsgdGhpcy5fcmVmID0gX3JlZjsgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmIChpc1ByZXNlbnQodGhpcy5fc3Vic2NyaXB0aW9uKSkge1xuICAgICAgdGhpcy5fZGlzcG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIHRyYW5zZm9ybShvYmo6IE9ic2VydmFibGU8YW55PnwgUHJvbWlzZTxhbnk+fCBFdmVudEVtaXR0ZXI8YW55PiwgYXJncz86IGFueVtdKTogYW55IHtcbiAgICBpZiAoaXNCbGFuayh0aGlzLl9vYmopKSB7XG4gICAgICBpZiAoaXNQcmVzZW50KG9iaikpIHtcbiAgICAgICAgdGhpcy5fc3Vic2NyaWJlKG9iaik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5fbGF0ZXN0VmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKG9iaiAhPT0gdGhpcy5fb2JqKSB7XG4gICAgICB0aGlzLl9kaXNwb3NlKCk7XG4gICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0ob2JqKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fbGF0ZXN0VmFsdWUgPT09IHRoaXMuX2xhdGVzdFJldHVybmVkVmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9sYXRlc3RSZXR1cm5lZFZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9sYXRlc3RSZXR1cm5lZFZhbHVlID0gdGhpcy5fbGF0ZXN0VmFsdWU7XG4gICAgICByZXR1cm4gV3JhcHBlZFZhbHVlLndyYXAodGhpcy5fbGF0ZXN0VmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3N1YnNjcmliZShvYmo6IE9ic2VydmFibGU8YW55PnwgUHJvbWlzZTxhbnk+fCBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMuX29iaiA9IG9iajtcbiAgICB0aGlzLl9zdHJhdGVneSA9IHRoaXMuX3NlbGVjdFN0cmF0ZWd5KG9iaik7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uID1cbiAgICAgICAgdGhpcy5fc3RyYXRlZ3kuY3JlYXRlU3Vic2NyaXB0aW9uKG9iaiwgdmFsdWUgPT4gdGhpcy5fdXBkYXRlTGF0ZXN0VmFsdWUob2JqLCB2YWx1ZSkpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfc2VsZWN0U3RyYXRlZ3kob2JqOiBPYnNlcnZhYmxlPGFueT58IFByb21pc2U8YW55PnwgRXZlbnRFbWl0dGVyPGFueT4pOiBhbnkge1xuICAgIGlmIChpc1Byb21pc2Uob2JqKSkge1xuICAgICAgcmV0dXJuIF9wcm9taXNlU3RyYXRlZ3k7XG4gICAgfSBlbHNlIGlmIChPYnNlcnZhYmxlV3JhcHBlci5pc09ic2VydmFibGUob2JqKSkge1xuICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlU3RyYXRlZ3k7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkUGlwZUFyZ3VtZW50RXhjZXB0aW9uKEFzeW5jUGlwZSwgb2JqKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9kaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuX3N0cmF0ZWd5LmRpc3Bvc2UodGhpcy5fc3Vic2NyaXB0aW9uKTtcbiAgICB0aGlzLl9sYXRlc3RWYWx1ZSA9IG51bGw7XG4gICAgdGhpcy5fbGF0ZXN0UmV0dXJuZWRWYWx1ZSA9IG51bGw7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uID0gbnVsbDtcbiAgICB0aGlzLl9vYmogPSBudWxsO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfdXBkYXRlTGF0ZXN0VmFsdWUoYXN5bmM6IGFueSwgdmFsdWU6IE9iamVjdCkge1xuICAgIGlmIChhc3luYyA9PT0gdGhpcy5fb2JqKSB7XG4gICAgICB0aGlzLl9sYXRlc3RWYWx1ZSA9IHZhbHVlO1xuICAgICAgdGhpcy5fcmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbW1vbi9waXBlcy9hc3luY19waXBlLnRzXG4gKiovIiwiaW1wb3J0IHtDT05TVCwgVHlwZSwgc3RyaW5naWZ5fSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9uLCBXcmFwcGVkRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuXG5leHBvcnQgY2xhc3MgSW52YWxpZFBpcGVBcmd1bWVudEV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3Rvcih0eXBlOiBUeXBlLCB2YWx1ZTogT2JqZWN0KSB7XG4gICAgc3VwZXIoYEludmFsaWQgYXJndW1lbnQgJyR7dmFsdWV9JyBmb3IgcGlwZSAnJHtzdHJpbmdpZnkodHlwZSl9J2ApO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tbW9uL3BpcGVzL2ludmFsaWRfcGlwZV9hcmd1bWVudF9leGNlcHRpb24udHNcbiAqKi8iLCJpbXBvcnQge2lzU3RyaW5nLCBDT05TVCwgaXNCbGFua30gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7UGlwZVRyYW5zZm9ybSwgV3JhcHBlZFZhbHVlLCBJbmplY3RhYmxlLCBQaXBlfSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbmltcG9ydCB7SW52YWxpZFBpcGVBcmd1bWVudEV4Y2VwdGlvbn0gZnJvbSAnLi9pbnZhbGlkX3BpcGVfYXJndW1lbnRfZXhjZXB0aW9uJztcblxuLyoqXG4gKiBJbXBsZW1lbnRzIHVwcGVyY2FzZSB0cmFuc2Zvcm1zIHRvIHRleHQuXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiB7QGV4YW1wbGUgY29yZS9waXBlcy90cy9sb3dlcnVwcGVyX3BpcGUvbG93ZXJ1cHBlcl9waXBlX2V4YW1wbGUudHMgcmVnaW9uPSdMb3dlclVwcGVyUGlwZSd9XG4gKi9cbkBDT05TVCgpXG5AUGlwZSh7bmFtZTogJ3VwcGVyY2FzZSd9KVxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFVwcGVyQ2FzZVBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgdHJhbnNmb3JtKHZhbHVlOiBzdHJpbmcsIGFyZ3M6IGFueVtdID0gbnVsbCk6IHN0cmluZyB7XG4gICAgaWYgKGlzQmxhbmsodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gICAgaWYgKCFpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkUGlwZUFyZ3VtZW50RXhjZXB0aW9uKFVwcGVyQ2FzZVBpcGUsIHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlLnRvVXBwZXJDYXNlKCk7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21tb24vcGlwZXMvdXBwZXJjYXNlX3BpcGUudHNcbiAqKi8iLCJpbXBvcnQge2lzU3RyaW5nLCBDT05TVCwgaXNCbGFua30gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7SW5qZWN0YWJsZSwgUGlwZVRyYW5zZm9ybSwgV3JhcHBlZFZhbHVlLCBQaXBlfSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbmltcG9ydCB7SW52YWxpZFBpcGVBcmd1bWVudEV4Y2VwdGlvbn0gZnJvbSAnLi9pbnZhbGlkX3BpcGVfYXJndW1lbnRfZXhjZXB0aW9uJztcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRleHQgdG8gbG93ZXJjYXNlLlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICoge0BleGFtcGxlIGNvcmUvcGlwZXMvdHMvbG93ZXJ1cHBlcl9waXBlL2xvd2VydXBwZXJfcGlwZV9leGFtcGxlLnRzIHJlZ2lvbj0nTG93ZXJVcHBlclBpcGUnfVxuICovXG5AQ09OU1QoKVxuQFBpcGUoe25hbWU6ICdsb3dlcmNhc2UnfSlcbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBMb3dlckNhc2VQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG4gIHRyYW5zZm9ybSh2YWx1ZTogc3RyaW5nLCBhcmdzOiBhbnlbXSA9IG51bGwpOiBzdHJpbmcge1xuICAgIGlmIChpc0JsYW5rKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICAgIGlmICghaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFBpcGVBcmd1bWVudEV4Y2VwdGlvbihMb3dlckNhc2VQaXBlLCB2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tbW9uL3BpcGVzL2xvd2VyY2FzZV9waXBlLnRzXG4gKiovIiwiaW1wb3J0IHtpc0JsYW5rLCBpc1ByZXNlbnQsIEpzb24sIENPTlNUfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtJbmplY3RhYmxlLCBQaXBlVHJhbnNmb3JtLCBXcmFwcGVkVmFsdWUsIFBpcGV9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgYW55IGlucHV0IHZhbHVlIHVzaW5nIGBKU09OLnN0cmluZ2lmeWAuIFVzZWZ1bCBmb3IgZGVidWdnaW5nLlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKiB7QGV4YW1wbGUgY29yZS9waXBlcy90cy9qc29uX3BpcGUvanNvbl9waXBlX2V4YW1wbGUudHMgcmVnaW9uPSdKc29uUGlwZSd9XG4gKi9cbkBDT05TVCgpXG5AUGlwZSh7bmFtZTogJ2pzb24nLCBwdXJlOiBmYWxzZX0pXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSnNvblBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgdHJhbnNmb3JtKHZhbHVlOiBhbnksIGFyZ3M6IGFueVtdID0gbnVsbCk6IHN0cmluZyB7IHJldHVybiBKc29uLnN0cmluZ2lmeSh2YWx1ZSk7IH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21tb24vcGlwZXMvanNvbl9waXBlLnRzXG4gKiovIiwiaW1wb3J0IHtpc0JsYW5rLCBpc1N0cmluZywgaXNBcnJheSwgU3RyaW5nV3JhcHBlciwgQ09OU1R9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge0Jhc2VFeGNlcHRpb259IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9ucyc7XG5pbXBvcnQge0xpc3RXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtJbmplY3RhYmxlLCBQaXBlVHJhbnNmb3JtLCBXcmFwcGVkVmFsdWUsIFBpcGV9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuaW1wb3J0IHtJbnZhbGlkUGlwZUFyZ3VtZW50RXhjZXB0aW9ufSBmcm9tICcuL2ludmFsaWRfcGlwZV9hcmd1bWVudF9leGNlcHRpb24nO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgTGlzdCBvciBTdHJpbmcgY29udGFpbmluZyBvbmx5IGEgc3Vic2V0IChzbGljZSkgb2YgdGhlXG4gKiBlbGVtZW50cy5cbiAqXG4gKiBUaGUgc3RhcnRpbmcgaW5kZXggb2YgdGhlIHN1YnNldCB0byByZXR1cm4gaXMgc3BlY2lmaWVkIGJ5IHRoZSBgc3RhcnRgIHBhcmFtZXRlci5cbiAqXG4gKiBUaGUgZW5kaW5nIGluZGV4IG9mIHRoZSBzdWJzZXQgdG8gcmV0dXJuIGlzIHNwZWNpZmllZCBieSB0aGUgb3B0aW9uYWwgYGVuZGAgcGFyYW1ldGVyLlxuICpcbiAqICMjIyBVc2FnZVxuICpcbiAqICAgICBleHByZXNzaW9uIHwgc2xpY2U6c3RhcnRbOmVuZF1cbiAqXG4gKiBBbGwgYmVoYXZpb3IgaXMgYmFzZWQgb24gdGhlIGV4cGVjdGVkIGJlaGF2aW9yIG9mIHRoZSBKYXZhU2NyaXB0IEFQSVxuICogQXJyYXkucHJvdG90eXBlLnNsaWNlKCkgYW5kIFN0cmluZy5wcm90b3R5cGUuc2xpY2UoKVxuICpcbiAqIFdoZXJlIHRoZSBpbnB1dCBleHByZXNzaW9uIGlzIGEgW0xpc3RdIG9yIFtTdHJpbmddLCBhbmQgYHN0YXJ0YCBpczpcbiAqXG4gKiAtICoqYSBwb3NpdGl2ZSBpbnRlZ2VyKio6IHJldHVybiB0aGUgaXRlbSBhdCBfc3RhcnRfIGluZGV4IGFuZCBhbGwgaXRlbXMgYWZ0ZXJcbiAqIGluIHRoZSBsaXN0IG9yIHN0cmluZyBleHByZXNzaW9uLlxuICogLSAqKmEgbmVnYXRpdmUgaW50ZWdlcioqOiByZXR1cm4gdGhlIGl0ZW0gYXQgX3N0YXJ0XyBpbmRleCBmcm9tIHRoZSBlbmQgYW5kIGFsbCBpdGVtcyBhZnRlclxuICogaW4gdGhlIGxpc3Qgb3Igc3RyaW5nIGV4cHJlc3Npb24uXG4gKiAtICoqYHxzdGFydHxgIGdyZWF0ZXIgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgZXhwcmVzc2lvbioqOiByZXR1cm4gYW4gZW1wdHkgbGlzdCBvciBzdHJpbmcuXG4gKiAtICoqYHxzdGFydHxgIG5lZ2F0aXZlIGdyZWF0ZXIgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgZXhwcmVzc2lvbioqOiByZXR1cm4gZW50aXJlIGxpc3Qgb3JcbiAqIHN0cmluZyBleHByZXNzaW9uLlxuICpcbiAqIGFuZCB3aGVyZSBgZW5kYCBpczpcbiAqXG4gKiAtICoqb21pdHRlZCoqOiByZXR1cm4gYWxsIGl0ZW1zIHVudGlsIHRoZSBlbmQgb2YgdGhlIGlucHV0XG4gKiAtICoqYSBwb3NpdGl2ZSBpbnRlZ2VyKio6IHJldHVybiBhbGwgaXRlbXMgYmVmb3JlIF9lbmRfIGluZGV4IG9mIHRoZSBsaXN0IG9yIHN0cmluZ1xuICogZXhwcmVzc2lvbi5cbiAqIC0gKiphIG5lZ2F0aXZlIGludGVnZXIqKjogcmV0dXJuIGFsbCBpdGVtcyBiZWZvcmUgX2VuZF8gaW5kZXggZnJvbSB0aGUgZW5kIG9mIHRoZSBsaXN0XG4gKiBvciBzdHJpbmcgZXhwcmVzc2lvbi5cbiAqXG4gKiBXaGVuIG9wZXJhdGluZyBvbiBhIFtMaXN0XSwgdGhlIHJldHVybmVkIGxpc3QgaXMgYWx3YXlzIGEgY29weSBldmVuIHdoZW4gYWxsXG4gKiB0aGUgZWxlbWVudHMgYXJlIGJlaW5nIHJldHVybmVkLlxuICpcbiAqICMjIExpc3QgRXhhbXBsZVxuICpcbiAqIFRoaXMgYG5nRm9yYCBleGFtcGxlOlxuICpcbiAqIHtAZXhhbXBsZSBjb3JlL3BpcGVzL3RzL3NsaWNlX3BpcGUvc2xpY2VfcGlwZV9leGFtcGxlLnRzIHJlZ2lvbj0nU2xpY2VQaXBlX2xpc3QnfVxuICpcbiAqIHByb2R1Y2VzIHRoZSBmb2xsb3dpbmc6XG4gKlxuICogICAgIDxsaT5iPC9saT5cbiAqICAgICA8bGk+YzwvbGk+XG4gKlxuICogIyMgU3RyaW5nIEV4YW1wbGVzXG4gKlxuICoge0BleGFtcGxlIGNvcmUvcGlwZXMvdHMvc2xpY2VfcGlwZS9zbGljZV9waXBlX2V4YW1wbGUudHMgcmVnaW9uPSdTbGljZVBpcGVfc3RyaW5nJ31cbiAqL1xuXG5AUGlwZSh7bmFtZTogJ3NsaWNlJywgcHVyZTogZmFsc2V9KVxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFNsaWNlUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuICB0cmFuc2Zvcm0odmFsdWU6IGFueSwgYXJnczogYW55W10gPSBudWxsKTogYW55IHtcbiAgICBpZiAoaXNCbGFuayhhcmdzKSB8fCBhcmdzLmxlbmd0aCA9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignU2xpY2UgcGlwZSByZXF1aXJlcyBvbmUgYXJndW1lbnQnKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnN1cHBvcnRzKHZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRQaXBlQXJndW1lbnRFeGNlcHRpb24oU2xpY2VQaXBlLCB2YWx1ZSk7XG4gICAgfVxuICAgIGlmIChpc0JsYW5rKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICAgIHZhciBzdGFydDogbnVtYmVyID0gYXJnc1swXTtcbiAgICB2YXIgZW5kOiBudW1iZXIgPSBhcmdzLmxlbmd0aCA+IDEgPyBhcmdzWzFdIDogbnVsbDtcbiAgICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgICByZXR1cm4gU3RyaW5nV3JhcHBlci5zbGljZSh2YWx1ZSwgc3RhcnQsIGVuZCk7XG4gICAgfVxuICAgIHJldHVybiBMaXN0V3JhcHBlci5zbGljZSh2YWx1ZSwgc3RhcnQsIGVuZCk7XG4gIH1cblxuICBwcml2YXRlIHN1cHBvcnRzKG9iajogYW55KTogYm9vbGVhbiB7IHJldHVybiBpc1N0cmluZyhvYmopIHx8IGlzQXJyYXkob2JqKTsgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbW1vbi9waXBlcy9zbGljZV9waXBlLnRzXG4gKiovIiwiaW1wb3J0IHtcbiAgaXNEYXRlLFxuICBpc051bWJlcixcbiAgaXNQcmVzZW50LFxuICBEYXRlLFxuICBEYXRlV3JhcHBlcixcbiAgQ09OU1QsXG4gIGlzQmxhbmssXG4gIEZ1bmN0aW9uV3JhcHBlclxufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtEYXRlRm9ybWF0dGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2ludGwnO1xuaW1wb3J0IHtQaXBlVHJhbnNmb3JtLCBXcmFwcGVkVmFsdWUsIFBpcGUsIEluamVjdGFibGV9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuaW1wb3J0IHtTdHJpbmdNYXBXcmFwcGVyLCBMaXN0V3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcblxuaW1wb3J0IHtJbnZhbGlkUGlwZUFyZ3VtZW50RXhjZXB0aW9ufSBmcm9tICcuL2ludmFsaWRfcGlwZV9hcmd1bWVudF9leGNlcHRpb24nO1xuXG5cbi8vIFRPRE86IG1vdmUgdG8gYSBnbG9iYWwgY29uZmlndXJhYmxlIGxvY2F0aW9uIGFsb25nIHdpdGggb3RoZXIgaTE4biBjb21wb25lbnRzLlxudmFyIGRlZmF1bHRMb2NhbGU6IHN0cmluZyA9ICdlbi1VUyc7XG5cbi8qKlxuICogRm9ybWF0cyBhIGRhdGUgdmFsdWUgdG8gYSBzdHJpbmcgYmFzZWQgb24gdGhlIHJlcXVlc3RlZCBmb3JtYXQuXG4gKlxuICogV0FSTklOR1M6XG4gKiAtIHRoaXMgcGlwZSBpcyBtYXJrZWQgYXMgcHVyZSBoZW5jZSBpdCB3aWxsIG5vdCBiZSByZS1ldmFsdWF0ZWQgd2hlbiB0aGUgaW5wdXQgaXMgbXV0YXRlZC5cbiAqICAgSW5zdGVhZCB1c2VycyBzaG91bGQgdHJlYXQgdGhlIGRhdGUgYXMgYW4gaW1tdXRhYmxlIG9iamVjdCBhbmQgY2hhbmdlIHRoZSByZWZlcmVuY2Ugd2hlbiB0aGVcbiAqICAgcGlwZSBuZWVkcyB0byByZS1ydW4gKHRoaXMgaXMgdG8gYXZvaWQgcmVmb3JtYXR0aW5nIHRoZSBkYXRlIG9uIGV2ZXJ5IGNoYW5nZSBkZXRlY3Rpb24gcnVuXG4gKiAgIHdoaWNoIHdvdWxkIGJlIGFuIGV4cGVuc2l2ZSBvcGVyYXRpb24pLlxuICogLSB0aGlzIHBpcGUgdXNlcyB0aGUgSW50ZXJuYXRpb25hbGl6YXRpb24gQVBJLiBUaGVyZWZvcmUgaXQgaXMgb25seSByZWxpYWJsZSBpbiBDaHJvbWUgYW5kIE9wZXJhXG4gKiAgIGJyb3dzZXJzLlxuICpcbiAqICMjIFVzYWdlXG4gKlxuICogICAgIGV4cHJlc3Npb24gfCBkYXRlWzpmb3JtYXRdXG4gKlxuICogd2hlcmUgYGV4cHJlc3Npb25gIGlzIGEgZGF0ZSBvYmplY3Qgb3IgYSBudW1iZXIgKG1pbGxpc2Vjb25kcyBzaW5jZSBVVEMgZXBvY2gpIGFuZFxuICogYGZvcm1hdGAgaW5kaWNhdGVzIHdoaWNoIGRhdGUvdGltZSBjb21wb25lbnRzIHRvIGluY2x1ZGU6XG4gKlxuICogIHwgQ29tcG9uZW50IHwgU3ltYm9sIHwgU2hvcnQgRm9ybSAgIHwgTG9uZyBGb3JtICAgICAgICAgfCBOdW1lcmljICAgfCAyLWRpZ2l0ICAgfFxuICogIHwtLS0tLS0tLS0tLXw6LS0tLS0tOnwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tfFxuICogIHwgZXJhICAgICAgIHwgICBHICAgIHwgRyAoQUQpICAgICAgIHwgR0dHRyAoQW5ubyBEb21pbmkpfCAtICAgICAgICAgfCAtICAgICAgICAgfFxuICogIHwgeWVhciAgICAgIHwgICB5ICAgIHwgLSAgICAgICAgICAgIHwgLSAgICAgICAgICAgICAgICAgfCB5ICgyMDE1KSAgfCB5eSAoMTUpICAgfFxuICogIHwgbW9udGggICAgIHwgICBNICAgIHwgTU1NIChTZXApICAgIHwgTU1NTSAoU2VwdGVtYmVyKSAgfCBNICg5KSAgICAgfCBNTSAoMDkpICAgfFxuICogIHwgZGF5ICAgICAgIHwgICBkICAgIHwgLSAgICAgICAgICAgIHwgLSAgICAgICAgICAgICAgICAgfCBkICgzKSAgICAgfCBkZCAoMDMpICAgfFxuICogIHwgd2Vla2RheSAgIHwgICBFICAgIHwgRUVFIChTdW4pICAgIHwgRUVFRSAoU3VuZGF5KSAgICAgfCAtICAgICAgICAgfCAtICAgICAgICAgfFxuICogIHwgaG91ciAgICAgIHwgICBqICAgIHwgLSAgICAgICAgICAgIHwgLSAgICAgICAgICAgICAgICAgfCBqICgxMykgICAgfCBqaiAoMTMpICAgfFxuICogIHwgaG91cjEyICAgIHwgICBoICAgIHwgLSAgICAgICAgICAgIHwgLSAgICAgICAgICAgICAgICAgfCBoICgxIFBNKSAgfCBoaCAoMDEgUE0pfFxuICogIHwgaG91cjI0ICAgIHwgICBIICAgIHwgLSAgICAgICAgICAgIHwgLSAgICAgICAgICAgICAgICAgfCBIICgxMykgICAgfCBISCAoMTMpICAgfFxuICogIHwgbWludXRlICAgIHwgICBtICAgIHwgLSAgICAgICAgICAgIHwgLSAgICAgICAgICAgICAgICAgfCBtICg1KSAgICAgfCBtbSAoMDUpICAgfFxuICogIHwgc2Vjb25kICAgIHwgICBzICAgIHwgLSAgICAgICAgICAgIHwgLSAgICAgICAgICAgICAgICAgfCBzICg5KSAgICAgfCBzcyAoMDkpICAgfFxuICogIHwgdGltZXpvbmUgIHwgICB6ICAgIHwgLSAgICAgICAgICAgIHwgeiAoUGFjaWZpYyBTdGFuZGFyZCBUaW1lKXwgLSAgfCAtICAgICAgICAgfFxuICogIHwgdGltZXpvbmUgIHwgICBaICAgIHwgWiAoR01ULTg6MDApIHwgLSAgICAgICAgICAgICAgICAgfCAtICAgICAgICAgfCAtICAgICAgICAgfFxuICpcbiAqIEluIGphdmFzY3JpcHQsIG9ubHkgdGhlIGNvbXBvbmVudHMgc3BlY2lmaWVkIHdpbGwgYmUgcmVzcGVjdGVkIChub3QgdGhlIG9yZGVyaW5nLFxuICogcHVuY3R1YXRpb25zLCAuLi4pIGFuZCBkZXRhaWxzIG9mIHRoZSBmb3JtYXR0aW5nIHdpbGwgYmUgZGVwZW5kZW50IG9uIHRoZSBsb2NhbGUuXG4gKiBPbiB0aGUgb3RoZXIgaGFuZCBpbiBEYXJ0IHZlcnNpb24sIHlvdSBjYW4gYWxzbyBpbmNsdWRlIHF1b3RlZCB0ZXh0IGFzIHdlbGwgYXMgc29tZSBleHRyYVxuICogZGF0ZS90aW1lIGNvbXBvbmVudHMgc3VjaCBhcyBxdWFydGVyLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWU6XG4gKiBodHRwczovL2FwaS5kYXJ0bGFuZy5vcmcvYXBpZG9jcy9jaGFubmVscy9zdGFibGUvZGFydGRvYy12aWV3ZXIvaW50bC9pbnRsLkRhdGVGb3JtYXQuXG4gKlxuICogYGZvcm1hdGAgY2FuIGFsc28gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgcHJlZGVmaW5lZCBmb3JtYXRzOlxuICpcbiAqICAtIGAnbWVkaXVtJ2A6IGVxdWl2YWxlbnQgdG8gYCd5TU1NZGptcydgIChlLmcuIFNlcCAzLCAyMDEwLCAxMjowNTowOCBQTSBmb3IgZW4tVVMpXG4gKiAgLSBgJ3Nob3J0J2A6IGVxdWl2YWxlbnQgdG8gYCd5TWRqbSdgIChlLmcuIDkvMy8yMDEwLCAxMjowNSBQTSBmb3IgZW4tVVMpXG4gKiAgLSBgJ2Z1bGxEYXRlJ2A6IGVxdWl2YWxlbnQgdG8gYCd5TU1NTUVFRUVkJ2AgKGUuZy4gRnJpZGF5LCBTZXB0ZW1iZXIgMywgMjAxMCBmb3IgZW4tVVMpXG4gKiAgLSBgJ2xvbmdEYXRlJ2A6IGVxdWl2YWxlbnQgdG8gYCd5TU1NTWQnYCAoZS5nLiBTZXB0ZW1iZXIgMywgMjAxMClcbiAqICAtIGAnbWVkaXVtRGF0ZSdgOiBlcXVpdmFsZW50IHRvIGAneU1NTWQnYCAoZS5nLiBTZXAgMywgMjAxMCBmb3IgZW4tVVMpXG4gKiAgLSBgJ3Nob3J0RGF0ZSdgOiBlcXVpdmFsZW50IHRvIGAneU1kJ2AgKGUuZy4gOS8zLzIwMTAgZm9yIGVuLVVTKVxuICogIC0gYCdtZWRpdW1UaW1lJ2A6IGVxdWl2YWxlbnQgdG8gYCdqbXMnYCAoZS5nLiAxMjowNTowOCBQTSBmb3IgZW4tVVMpXG4gKiAgLSBgJ3Nob3J0VGltZSdgOiBlcXVpdmFsZW50IHRvIGAnam0nYCAoZS5nLiAxMjowNSBQTSBmb3IgZW4tVVMpXG4gKlxuICogVGltZXpvbmUgb2YgdGhlIGZvcm1hdHRlZCB0ZXh0IHdpbGwgYmUgdGhlIGxvY2FsIHN5c3RlbSB0aW1lem9uZSBvZiB0aGUgZW5kLXVzZXJzIG1hY2hpbmUuXG4gKlxuICogIyMjIEV4YW1wbGVzXG4gKlxuICogQXNzdW1pbmcgYGRhdGVPYmpgIGlzICh5ZWFyOiAyMDE1LCBtb250aDogNiwgZGF5OiAxNSwgaG91cjogMjEsIG1pbnV0ZTogNDMsIHNlY29uZDogMTEpXG4gKiBpbiB0aGUgX2xvY2FsXyB0aW1lIGFuZCBsb2NhbGUgaXMgJ2VuLVVTJzpcbiAqXG4gKiBgYGBcbiAqICAgICB7eyBkYXRlT2JqIHwgZGF0ZSB9fSAgICAgICAgICAgICAgIC8vIG91dHB1dCBpcyAnSnVuIDE1LCAyMDE1J1xuICogICAgIHt7IGRhdGVPYmogfCBkYXRlOidtZWRpdW0nIH19ICAgICAgLy8gb3V0cHV0IGlzICdKdW4gMTUsIDIwMTUsIDk6NDM6MTEgUE0nXG4gKiAgICAge3sgZGF0ZU9iaiB8IGRhdGU6J3Nob3J0VGltZScgfX0gICAvLyBvdXRwdXQgaXMgJzk6NDMgUE0nXG4gKiAgICAge3sgZGF0ZU9iaiB8IGRhdGU6J21tc3MnIH19ICAgICAgICAvLyBvdXRwdXQgaXMgJzQzOjExJ1xuICogYGBgXG4gKlxuICoge0BleGFtcGxlIGNvcmUvcGlwZXMvdHMvZGF0ZV9waXBlL2RhdGVfcGlwZV9leGFtcGxlLnRzIHJlZ2lvbj0nRGF0ZVBpcGUnfVxuICovXG5AQ09OU1QoKVxuQFBpcGUoe25hbWU6ICdkYXRlJywgcHVyZTogdHJ1ZX0pXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRGF0ZVBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzdGF0aWMgX0FMSUFTRVM6IHtba2V5OiBzdHJpbmddOiBTdHJpbmd9ID0ge1xuICAgICdtZWRpdW0nOiAneU1NTWRqbXMnLFxuICAgICdzaG9ydCc6ICd5TWRqbScsXG4gICAgJ2Z1bGxEYXRlJzogJ3lNTU1NRUVFRWQnLFxuICAgICdsb25nRGF0ZSc6ICd5TU1NTWQnLFxuICAgICdtZWRpdW1EYXRlJzogJ3lNTU1kJyxcbiAgICAnc2hvcnREYXRlJzogJ3lNZCcsXG4gICAgJ21lZGl1bVRpbWUnOiAnam1zJyxcbiAgICAnc2hvcnRUaW1lJzogJ2ptJ1xuICB9O1xuXG5cbiAgdHJhbnNmb3JtKHZhbHVlOiBhbnksIGFyZ3M6IGFueVtdKTogc3RyaW5nIHtcbiAgICBpZiAoaXNCbGFuayh2YWx1ZSkpIHJldHVybiBudWxsO1xuXG4gICAgaWYgKCF0aGlzLnN1cHBvcnRzKHZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRQaXBlQXJndW1lbnRFeGNlcHRpb24oRGF0ZVBpcGUsIHZhbHVlKTtcbiAgICB9XG5cbiAgICB2YXIgcGF0dGVybjogc3RyaW5nID0gaXNQcmVzZW50KGFyZ3MpICYmIGFyZ3MubGVuZ3RoID4gMCA/IGFyZ3NbMF0gOiAnbWVkaXVtRGF0ZSc7XG4gICAgaWYgKGlzTnVtYmVyKHZhbHVlKSkge1xuICAgICAgdmFsdWUgPSBEYXRlV3JhcHBlci5mcm9tTWlsbGlzKHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKFN0cmluZ01hcFdyYXBwZXIuY29udGFpbnMoRGF0ZVBpcGUuX0FMSUFTRVMsIHBhdHRlcm4pKSB7XG4gICAgICBwYXR0ZXJuID0gPHN0cmluZz5TdHJpbmdNYXBXcmFwcGVyLmdldChEYXRlUGlwZS5fQUxJQVNFUywgcGF0dGVybik7XG4gICAgfVxuICAgIHJldHVybiBEYXRlRm9ybWF0dGVyLmZvcm1hdCh2YWx1ZSwgZGVmYXVsdExvY2FsZSwgcGF0dGVybik7XG4gIH1cblxuICBzdXBwb3J0cyhvYmo6IGFueSk6IGJvb2xlYW4geyByZXR1cm4gaXNEYXRlKG9iaikgfHwgaXNOdW1iZXIob2JqKTsgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbW1vbi9waXBlcy9kYXRlX3BpcGUudHNcbiAqKi8iLCJcbi8vIE1vZGlmaWVkIHZlcnNpb24gb2YgaW50ZXJuYWwgVHlwZXNjcmlwdCBpbnRsLmQudHMuXG4vLyBUT0RPKHBpbG9vcGluKTogcmVtb3ZlIHdoZW4gaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8zNTIxIGlzIHNoaXBwZWQuXG5kZWNsYXJlIG1vZHVsZSBJbnRsIHtcbiAgaW50ZXJmYWNlIE51bWJlckZvcm1hdE9wdGlvbnMge1xuICAgIGxvY2FsZU1hdGNoZXI/OiBzdHJpbmc7XG4gICAgc3R5bGU/OiBzdHJpbmc7XG4gICAgY3VycmVuY3k/OiBzdHJpbmc7XG4gICAgY3VycmVuY3lEaXNwbGF5Pzogc3RyaW5nO1xuICAgIHVzZUdyb3VwaW5nPzogYm9vbGVhbjtcbiAgICBtaW5pbXVtSW50ZWdlckRpZ2l0cz86IG51bWJlcjtcbiAgICBtaW5pbXVtRnJhY3Rpb25EaWdpdHM/OiBudW1iZXI7XG4gICAgbWF4aW11bUZyYWN0aW9uRGlnaXRzPzogbnVtYmVyO1xuICB9XG5cbiAgaW50ZXJmYWNlIE51bWJlckZvcm1hdCB7XG4gICAgZm9ybWF0KHZhbHVlOiBudW1iZXIpOiBzdHJpbmc7XG4gIH1cblxuICB2YXIgTnVtYmVyRm9ybWF0OiB7bmV3IChsb2NhbGU/OiBzdHJpbmcsIG9wdGlvbnM/OiBOdW1iZXJGb3JtYXRPcHRpb25zKTogTnVtYmVyRm9ybWF0fTtcblxuICBpbnRlcmZhY2UgRGF0ZVRpbWVGb3JtYXRPcHRpb25zIHtcbiAgICBsb2NhbGVNYXRjaGVyPzogc3RyaW5nO1xuICAgIHdlZWtkYXk/OiBzdHJpbmc7XG4gICAgZXJhPzogc3RyaW5nO1xuICAgIHllYXI/OiBzdHJpbmc7XG4gICAgbW9udGg/OiBzdHJpbmc7XG4gICAgZGF5Pzogc3RyaW5nO1xuICAgIGhvdXI/OiBzdHJpbmc7XG4gICAgbWludXRlPzogc3RyaW5nO1xuICAgIHNlY29uZD86IHN0cmluZztcbiAgICB0aW1lWm9uZU5hbWU/OiBzdHJpbmc7XG4gICAgZm9ybWF0TWF0Y2hlcj86IHN0cmluZztcbiAgICBob3VyMTI/OiBib29sZWFuO1xuICB9XG5cbiAgaW50ZXJmYWNlIERhdGVUaW1lRm9ybWF0IHtcbiAgICBmb3JtYXQoZGF0ZT86IERhdGUgfCBudW1iZXIpOiBzdHJpbmc7XG4gIH1cblxuICB2YXIgRGF0ZVRpbWVGb3JtYXQ6IHtuZXcgKGxvY2FsZT86IHN0cmluZywgb3B0aW9ucz86IERhdGVUaW1lRm9ybWF0T3B0aW9ucyk6IERhdGVUaW1lRm9ybWF0fTtcbn1cblxuZXhwb3J0IGVudW0gTnVtYmVyRm9ybWF0U3R5bGUge1xuICBEZWNpbWFsLFxuICBQZXJjZW50LFxuICBDdXJyZW5jeVxufVxuXG5leHBvcnQgY2xhc3MgTnVtYmVyRm9ybWF0dGVyIHtcbiAgc3RhdGljIGZvcm1hdChudW06IG51bWJlciwgbG9jYWxlOiBzdHJpbmcsIHN0eWxlOiBOdW1iZXJGb3JtYXRTdHlsZSxcbiAgICAgICAgICAgICAgICB7bWluaW11bUludGVnZXJEaWdpdHMgPSAxLCBtaW5pbXVtRnJhY3Rpb25EaWdpdHMgPSAwLCBtYXhpbXVtRnJhY3Rpb25EaWdpdHMgPSAzLFxuICAgICAgICAgICAgICAgICBjdXJyZW5jeSwgY3VycmVuY3lBc1N5bWJvbCA9IGZhbHNlfToge1xuICAgICAgICAgICAgICAgICAgbWluaW11bUludGVnZXJEaWdpdHM/OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICBtaW5pbXVtRnJhY3Rpb25EaWdpdHM/OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICBtYXhpbXVtRnJhY3Rpb25EaWdpdHM/OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICBjdXJyZW5jeT86IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgIGN1cnJlbmN5QXNTeW1ib2w/OiBib29sZWFuXG4gICAgICAgICAgICAgICAgfSA9IHt9KTogc3RyaW5nIHtcbiAgICB2YXIgaW50bE9wdGlvbnM6IEludGwuTnVtYmVyRm9ybWF0T3B0aW9ucyA9IHtcbiAgICAgIG1pbmltdW1JbnRlZ2VyRGlnaXRzOiBtaW5pbXVtSW50ZWdlckRpZ2l0cyxcbiAgICAgIG1pbmltdW1GcmFjdGlvbkRpZ2l0czogbWluaW11bUZyYWN0aW9uRGlnaXRzLFxuICAgICAgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiBtYXhpbXVtRnJhY3Rpb25EaWdpdHNcbiAgICB9O1xuICAgIGludGxPcHRpb25zLnN0eWxlID0gTnVtYmVyRm9ybWF0U3R5bGVbc3R5bGVdLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHN0eWxlID09IE51bWJlckZvcm1hdFN0eWxlLkN1cnJlbmN5KSB7XG4gICAgICBpbnRsT3B0aW9ucy5jdXJyZW5jeSA9IGN1cnJlbmN5O1xuICAgICAgaW50bE9wdGlvbnMuY3VycmVuY3lEaXNwbGF5ID0gY3VycmVuY3lBc1N5bWJvbCA/ICdzeW1ib2wnIDogJ2NvZGUnO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEludGwuTnVtYmVyRm9ybWF0KGxvY2FsZSwgaW50bE9wdGlvbnMpLmZvcm1hdChudW0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRpZ2l0Q29uZGl0aW9uKGxlbjogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIGxlbiA9PSAyID8gJzItZGlnaXQnIDogJ251bWVyaWMnO1xufVxuZnVuY3Rpb24gbmFtZUNvbmRpdGlvbihsZW46IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBsZW4gPCA0ID8gJ3Nob3J0JyA6ICdsb25nJztcbn1cbmZ1bmN0aW9uIGV4dHJhY3RDb21wb25lbnRzKHBhdHRlcm46IHN0cmluZyk6IEludGwuRGF0ZVRpbWVGb3JtYXRPcHRpb25zIHtcbiAgdmFyIHJldDogSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMgPSB7fTtcbiAgdmFyIGkgPSAwLCBqO1xuICB3aGlsZSAoaSA8IHBhdHRlcm4ubGVuZ3RoKSB7XG4gICAgaiA9IGk7XG4gICAgd2hpbGUgKGogPCBwYXR0ZXJuLmxlbmd0aCAmJiBwYXR0ZXJuW2pdID09IHBhdHRlcm5baV0pIGorKztcbiAgICBsZXQgbGVuID0gaiAtIGk7XG4gICAgc3dpdGNoIChwYXR0ZXJuW2ldKSB7XG4gICAgICBjYXNlICdHJzpcbiAgICAgICAgcmV0LmVyYSA9IG5hbWVDb25kaXRpb24obGVuKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd5JzpcbiAgICAgICAgcmV0LnllYXIgPSBkaWdpdENvbmRpdGlvbihsZW4pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ00nOlxuICAgICAgICBpZiAobGVuID49IDMpXG4gICAgICAgICAgcmV0Lm1vbnRoID0gbmFtZUNvbmRpdGlvbihsZW4pO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgcmV0Lm1vbnRoID0gZGlnaXRDb25kaXRpb24obGVuKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdkJzpcbiAgICAgICAgcmV0LmRheSA9IGRpZ2l0Q29uZGl0aW9uKGxlbik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRSc6XG4gICAgICAgIHJldC53ZWVrZGF5ID0gbmFtZUNvbmRpdGlvbihsZW4pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2onOlxuICAgICAgICByZXQuaG91ciA9IGRpZ2l0Q29uZGl0aW9uKGxlbik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaCc6XG4gICAgICAgIHJldC5ob3VyID0gZGlnaXRDb25kaXRpb24obGVuKTtcbiAgICAgICAgcmV0LmhvdXIxMiA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnSCc6XG4gICAgICAgIHJldC5ob3VyID0gZGlnaXRDb25kaXRpb24obGVuKTtcbiAgICAgICAgcmV0LmhvdXIxMiA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ20nOlxuICAgICAgICByZXQubWludXRlID0gZGlnaXRDb25kaXRpb24obGVuKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzJzpcbiAgICAgICAgcmV0LnNlY29uZCA9IGRpZ2l0Q29uZGl0aW9uKGxlbik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAneic6XG4gICAgICAgIHJldC50aW1lWm9uZU5hbWUgPSAnbG9uZyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnWic6XG4gICAgICAgIHJldC50aW1lWm9uZU5hbWUgPSAnc2hvcnQnO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgaSA9IGo7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxudmFyIGRhdGVGb3JtYXR0ZXJDYWNoZTogTWFwPHN0cmluZywgSW50bC5EYXRlVGltZUZvcm1hdD4gPSBuZXcgTWFwPHN0cmluZywgSW50bC5EYXRlVGltZUZvcm1hdD4oKTtcblxuZXhwb3J0IGNsYXNzIERhdGVGb3JtYXR0ZXIge1xuICBzdGF0aWMgZm9ybWF0KGRhdGU6IERhdGUsIGxvY2FsZTogc3RyaW5nLCBwYXR0ZXJuOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHZhciBrZXkgPSBsb2NhbGUgKyBwYXR0ZXJuO1xuICAgIGlmIChkYXRlRm9ybWF0dGVyQ2FjaGUuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybiBkYXRlRm9ybWF0dGVyQ2FjaGUuZ2V0KGtleSkuZm9ybWF0KGRhdGUpO1xuICAgIH1cbiAgICB2YXIgZm9ybWF0dGVyID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQobG9jYWxlLCBleHRyYWN0Q29tcG9uZW50cyhwYXR0ZXJuKSk7XG4gICAgZGF0ZUZvcm1hdHRlckNhY2hlLnNldChrZXksIGZvcm1hdHRlcik7XG4gICAgcmV0dXJuIGZvcm1hdHRlci5mb3JtYXQoZGF0ZSk7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9mYWNhZGUvaW50bC50c1xuICoqLyIsImltcG9ydCB7XG4gIGlzTnVtYmVyLFxuICBpc1ByZXNlbnQsXG4gIGlzQmxhbmssXG4gIFN0cmluZ1dyYXBwZXIsXG4gIE51bWJlcldyYXBwZXIsXG4gIFJlZ0V4cFdyYXBwZXIsXG4gIENPTlNULFxuICBGdW5jdGlvbldyYXBwZXJcbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbiwgV3JhcHBlZEV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7TnVtYmVyRm9ybWF0dGVyLCBOdW1iZXJGb3JtYXRTdHlsZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9pbnRsJztcbmltcG9ydCB7SW5qZWN0YWJsZSwgUGlwZVRyYW5zZm9ybSwgV3JhcHBlZFZhbHVlLCBQaXBlfSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbmltcG9ydCB7TGlzdFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5cbmltcG9ydCB7SW52YWxpZFBpcGVBcmd1bWVudEV4Y2VwdGlvbn0gZnJvbSAnLi9pbnZhbGlkX3BpcGVfYXJndW1lbnRfZXhjZXB0aW9uJztcblxudmFyIGRlZmF1bHRMb2NhbGU6IHN0cmluZyA9ICdlbi1VUyc7XG52YXIgX3JlID0gUmVnRXhwV3JhcHBlci5jcmVhdGUoJ14oXFxcXGQrKT9cXFxcLigoXFxcXGQrKShcXFxcLShcXFxcZCspKT8pPyQnKTtcblxuLyoqXG4gKiBJbnRlcm5hbCBiYXNlIGNsYXNzIGZvciBudW1lcmljIHBpcGVzLlxuICovXG5AQ09OU1QoKVxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE51bWJlclBpcGUge1xuICAvKiogQGludGVybmFsICovXG4gIHN0YXRpYyBfZm9ybWF0KHZhbHVlOiBudW1iZXIsIHN0eWxlOiBOdW1iZXJGb3JtYXRTdHlsZSwgZGlnaXRzOiBzdHJpbmcsIGN1cnJlbmN5OiBzdHJpbmcgPSBudWxsLFxuICAgICAgICAgICAgICAgICBjdXJyZW5jeUFzU3ltYm9sOiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmcge1xuICAgIGlmIChpc0JsYW5rKHZhbHVlKSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKCFpc051bWJlcih2YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkUGlwZUFyZ3VtZW50RXhjZXB0aW9uKE51bWJlclBpcGUsIHZhbHVlKTtcbiAgICB9XG4gICAgdmFyIG1pbkludCA9IDEsIG1pbkZyYWN0aW9uID0gMCwgbWF4RnJhY3Rpb24gPSAzO1xuICAgIGlmIChpc1ByZXNlbnQoZGlnaXRzKSkge1xuICAgICAgdmFyIHBhcnRzID0gUmVnRXhwV3JhcHBlci5maXJzdE1hdGNoKF9yZSwgZGlnaXRzKTtcbiAgICAgIGlmIChpc0JsYW5rKHBhcnRzKSkge1xuICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgJHtkaWdpdHN9IGlzIG5vdCBhIHZhbGlkIGRpZ2l0IGluZm8gZm9yIG51bWJlciBwaXBlc2ApO1xuICAgICAgfVxuICAgICAgaWYgKGlzUHJlc2VudChwYXJ0c1sxXSkpIHsgIC8vIG1pbiBpbnRlZ2VyIGRpZ2l0c1xuICAgICAgICBtaW5JbnQgPSBOdW1iZXJXcmFwcGVyLnBhcnNlSW50QXV0b1JhZGl4KHBhcnRzWzFdKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1ByZXNlbnQocGFydHNbM10pKSB7ICAvLyBtaW4gZnJhY3Rpb24gZGlnaXRzXG4gICAgICAgIG1pbkZyYWN0aW9uID0gTnVtYmVyV3JhcHBlci5wYXJzZUludEF1dG9SYWRpeChwYXJ0c1szXSk7XG4gICAgICB9XG4gICAgICBpZiAoaXNQcmVzZW50KHBhcnRzWzVdKSkgeyAgLy8gbWF4IGZyYWN0aW9uIGRpZ2l0c1xuICAgICAgICBtYXhGcmFjdGlvbiA9IE51bWJlcldyYXBwZXIucGFyc2VJbnRBdXRvUmFkaXgocGFydHNbNV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gTnVtYmVyRm9ybWF0dGVyLmZvcm1hdCh2YWx1ZSwgZGVmYXVsdExvY2FsZSwgc3R5bGUsIHtcbiAgICAgIG1pbmltdW1JbnRlZ2VyRGlnaXRzOiBtaW5JbnQsXG4gICAgICBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IG1pbkZyYWN0aW9uLFxuICAgICAgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiBtYXhGcmFjdGlvbixcbiAgICAgIGN1cnJlbmN5OiBjdXJyZW5jeSxcbiAgICAgIGN1cnJlbmN5QXNTeW1ib2w6IGN1cnJlbmN5QXNTeW1ib2xcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFdBUk5JTkc6IHRoaXMgcGlwZSB1c2VzIHRoZSBJbnRlcm5hdGlvbmFsaXphdGlvbiBBUEkuXG4gKiBUaGVyZWZvcmUgaXQgaXMgb25seSByZWxpYWJsZSBpbiBDaHJvbWUgYW5kIE9wZXJhIGJyb3dzZXJzLlxuICpcbiAqIEZvcm1hdHMgYSBudW1iZXIgYXMgbG9jYWwgdGV4dC4gaS5lLiBncm91cCBzaXppbmcgYW5kIHNlcGFyYXRvciBhbmQgb3RoZXIgbG9jYWxlLXNwZWNpZmljXG4gKiBjb25maWd1cmF0aW9ucyBhcmUgYmFzZWQgb24gdGhlIGFjdGl2ZSBsb2NhbGUuXG4gKlxuICogIyMjIFVzYWdlXG4gKlxuICogICAgIGV4cHJlc3Npb24gfCBudW1iZXJbOmRpZ2l0SW5mb11cbiAqXG4gKiB3aGVyZSBgZXhwcmVzc2lvbmAgaXMgYSBudW1iZXIgYW5kIGBkaWdpdEluZm9gIGhhcyB0aGUgZm9sbG93aW5nIGZvcm1hdDpcbiAqXG4gKiAgICAge21pbkludGVnZXJEaWdpdHN9LnttaW5GcmFjdGlvbkRpZ2l0c30te21heEZyYWN0aW9uRGlnaXRzfVxuICpcbiAqIC0gbWluSW50ZWdlckRpZ2l0cyBpcyB0aGUgbWluaW11bSBudW1iZXIgb2YgaW50ZWdlciBkaWdpdHMgdG8gdXNlLiBEZWZhdWx0cyB0byAxLlxuICogLSBtaW5GcmFjdGlvbkRpZ2l0cyBpcyB0aGUgbWluaW11bSBudW1iZXIgb2YgZGlnaXRzIGFmdGVyIGZyYWN0aW9uLiBEZWZhdWx0cyB0byAwLlxuICogLSBtYXhGcmFjdGlvbkRpZ2l0cyBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgZGlnaXRzIGFmdGVyIGZyYWN0aW9uLiBEZWZhdWx0cyB0byAzLlxuICpcbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBhY2NlcHRhYmxlIHJhbmdlIGZvciBlYWNoIG9mIHRoZXNlIG51bWJlcnMgYW5kIG90aGVyXG4gKiBkZXRhaWxzIHNlZSB5b3VyIG5hdGl2ZSBpbnRlcm5hdGlvbmFsaXphdGlvbiBsaWJyYXJ5LlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICoge0BleGFtcGxlIGNvcmUvcGlwZXMvdHMvbnVtYmVyX3BpcGUvbnVtYmVyX3BpcGVfZXhhbXBsZS50cyByZWdpb249J051bWJlclBpcGUnfVxuICovXG5AQ09OU1QoKVxuQFBpcGUoe25hbWU6ICdudW1iZXInfSlcbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEZWNpbWFsUGlwZSBleHRlbmRzIE51bWJlclBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgdHJhbnNmb3JtKHZhbHVlOiBhbnksIGFyZ3M6IGFueVtdKTogc3RyaW5nIHtcbiAgICB2YXIgZGlnaXRzOiBzdHJpbmcgPSBMaXN0V3JhcHBlci5maXJzdChhcmdzKTtcbiAgICByZXR1cm4gTnVtYmVyUGlwZS5fZm9ybWF0KHZhbHVlLCBOdW1iZXJGb3JtYXRTdHlsZS5EZWNpbWFsLCBkaWdpdHMpO1xuICB9XG59XG5cbi8qKlxuICogV0FSTklORzogdGhpcyBwaXBlIHVzZXMgdGhlIEludGVybmF0aW9uYWxpemF0aW9uIEFQSS5cbiAqIFRoZXJlZm9yZSBpdCBpcyBvbmx5IHJlbGlhYmxlIGluIENocm9tZSBhbmQgT3BlcmEgYnJvd3NlcnMuXG4gKlxuICogRm9ybWF0cyBhIG51bWJlciBhcyBsb2NhbCBwZXJjZW50LlxuICpcbiAqICMjIyBVc2FnZVxuICpcbiAqICAgICBleHByZXNzaW9uIHwgcGVyY2VudFs6ZGlnaXRJbmZvXVxuICpcbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGBkaWdpdEluZm9gIHNlZSB7QGxpbmsgRGVjaW1hbFBpcGV9XG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiB7QGV4YW1wbGUgY29yZS9waXBlcy90cy9udW1iZXJfcGlwZS9udW1iZXJfcGlwZV9leGFtcGxlLnRzIHJlZ2lvbj0nUGVyY2VudFBpcGUnfVxuICovXG5AQ09OU1QoKVxuQFBpcGUoe25hbWU6ICdwZXJjZW50J30pXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUGVyY2VudFBpcGUgZXh0ZW5kcyBOdW1iZXJQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG4gIHRyYW5zZm9ybSh2YWx1ZTogYW55LCBhcmdzOiBhbnlbXSk6IHN0cmluZyB7XG4gICAgdmFyIGRpZ2l0czogc3RyaW5nID0gTGlzdFdyYXBwZXIuZmlyc3QoYXJncyk7XG4gICAgcmV0dXJuIE51bWJlclBpcGUuX2Zvcm1hdCh2YWx1ZSwgTnVtYmVyRm9ybWF0U3R5bGUuUGVyY2VudCwgZGlnaXRzKTtcbiAgfVxufVxuXG4vKipcbiAqIFdBUk5JTkc6IHRoaXMgcGlwZSB1c2VzIHRoZSBJbnRlcm5hdGlvbmFsaXphdGlvbiBBUEkuXG4gKiBUaGVyZWZvcmUgaXQgaXMgb25seSByZWxpYWJsZSBpbiBDaHJvbWUgYW5kIE9wZXJhIGJyb3dzZXJzLlxuICpcbiAqIEZvcm1hdHMgYSBudW1iZXIgYXMgbG9jYWwgY3VycmVuY3kuXG4gKlxuICogIyMjIFVzYWdlXG4gKlxuICogICAgIGV4cHJlc3Npb24gfCBjdXJyZW5jeVs6Y3VycmVuY3lDb2RlWzpzeW1ib2xEaXNwbGF5WzpkaWdpdEluZm9dXV1cbiAqXG4gKiB3aGVyZSBgY3VycmVuY3lDb2RlYCBpcyB0aGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSwgc3VjaCBhcyBcIlVTRFwiIGZvciB0aGUgVVMgZG9sbGFyIGFuZFxuICogXCJFVVJcIiBmb3IgdGhlIGV1cm8uIGBzeW1ib2xEaXNwbGF5YCBpcyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRvIHVzZSB0aGUgY3VycmVuY3lcbiAqIHN5bWJvbCAoZS5nLiAkKSBvciB0aGUgY3VycmVuY3kgY29kZSAoZS5nLiBVU0QpIGluIHRoZSBvdXRwdXQuIFRoZSBkZWZhdWx0IGZvciB0aGlzIHZhbHVlXG4gKiBpcyBgZmFsc2VgLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgYGRpZ2l0SW5mb2Agc2VlIHtAbGluayBEZWNpbWFsUGlwZX1cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIHtAZXhhbXBsZSBjb3JlL3BpcGVzL3RzL251bWJlcl9waXBlL251bWJlcl9waXBlX2V4YW1wbGUudHMgcmVnaW9uPSdDdXJyZW5jeVBpcGUnfVxuICovXG5AQ09OU1QoKVxuQFBpcGUoe25hbWU6ICdjdXJyZW5jeSd9KVxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEN1cnJlbmN5UGlwZSBleHRlbmRzIE51bWJlclBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgdHJhbnNmb3JtKHZhbHVlOiBhbnksIGFyZ3M6IGFueVtdKTogc3RyaW5nIHtcbiAgICB2YXIgY3VycmVuY3lDb2RlOiBzdHJpbmcgPSBpc1ByZXNlbnQoYXJncykgJiYgYXJncy5sZW5ndGggPiAwID8gYXJnc1swXSA6ICdVU0QnO1xuICAgIHZhciBzeW1ib2xEaXNwbGF5OiBib29sZWFuID0gaXNQcmVzZW50KGFyZ3MpICYmIGFyZ3MubGVuZ3RoID4gMSA/IGFyZ3NbMV0gOiBmYWxzZTtcbiAgICB2YXIgZGlnaXRzOiBzdHJpbmcgPSBpc1ByZXNlbnQoYXJncykgJiYgYXJncy5sZW5ndGggPiAyID8gYXJnc1syXSA6IG51bGw7XG4gICAgcmV0dXJuIE51bWJlclBpcGUuX2Zvcm1hdCh2YWx1ZSwgTnVtYmVyRm9ybWF0U3R5bGUuQ3VycmVuY3ksIGRpZ2l0cywgY3VycmVuY3lDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sRGlzcGxheSk7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21tb24vcGlwZXMvbnVtYmVyX3BpcGUudHNcbiAqKi8iLCIvKipcbiAqIEBtb2R1bGVcbiAqIEBkZXNjcmlwdGlvblxuICogQ29tbW9uIGRpcmVjdGl2ZXMgc2hpcHBlZCB3aXRoIEFuZ3VsYXIuXG4gKi9cbmV4cG9ydCB7TmdDbGFzc30gZnJvbSAnLi9kaXJlY3RpdmVzL25nX2NsYXNzJztcbmV4cG9ydCB7TmdGb3J9IGZyb20gJy4vZGlyZWN0aXZlcy9uZ19mb3InO1xuZXhwb3J0IHtOZ0lmfSBmcm9tICcuL2RpcmVjdGl2ZXMvbmdfaWYnO1xuZXhwb3J0IHtOZ1N0eWxlfSBmcm9tICcuL2RpcmVjdGl2ZXMvbmdfc3R5bGUnO1xuZXhwb3J0IHtOZ1N3aXRjaCwgTmdTd2l0Y2hXaGVuLCBOZ1N3aXRjaERlZmF1bHR9IGZyb20gJy4vZGlyZWN0aXZlcy9uZ19zd2l0Y2gnO1xuZXhwb3J0ICogZnJvbSAnLi9kaXJlY3RpdmVzL29ic2VydmFibGVfbGlzdF9kaWZmJztcbmV4cG9ydCB7Q09SRV9ESVJFQ1RJVkVTfSBmcm9tICcuL2RpcmVjdGl2ZXMvY29yZV9kaXJlY3RpdmVzJztcblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tbW9uL2RpcmVjdGl2ZXMudHNcbiAqKi8iLCJpbXBvcnQge2lzUHJlc2VudCwgaXNTdHJpbmcsIFN0cmluZ1dyYXBwZXIsIGlzQmxhbmssIGlzQXJyYXl9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge1xuICBEb0NoZWNrLFxuICBPbkRlc3Ryb3ksXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgSXRlcmFibGVEaWZmZXIsXG4gIEl0ZXJhYmxlRGlmZmVycyxcbiAgS2V5VmFsdWVEaWZmZXIsXG4gIEtleVZhbHVlRGlmZmVycyxcbiAgUmVuZGVyZXJcbn0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5pbXBvcnQge1N0cmluZ01hcFdyYXBwZXIsIGlzTGlzdExpa2VJdGVyYWJsZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcblxuLyoqXG4gKiBUaGUgYE5nQ2xhc3NgIGRpcmVjdGl2ZSBjb25kaXRpb25hbGx5IGFkZHMgYW5kIHJlbW92ZXMgQ1NTIGNsYXNzZXMgb24gYW4gSFRNTCBlbGVtZW50IGJhc2VkIG9uXG4gKiBhbiBleHByZXNzaW9uJ3MgZXZhbHVhdGlvbiByZXN1bHQuXG4gKlxuICogVGhlIHJlc3VsdCBvZiBhbiBleHByZXNzaW9uIGV2YWx1YXRpb24gaXMgaW50ZXJwcmV0ZWQgZGlmZmVyZW50bHkgZGVwZW5kaW5nIG9uIHR5cGUgb2ZcbiAqIHRoZSBleHByZXNzaW9uIGV2YWx1YXRpb24gcmVzdWx0OlxuICogLSBgc3RyaW5nYCAtIGFsbCB0aGUgQ1NTIGNsYXNzZXMgbGlzdGVkIGluIGEgc3RyaW5nIChzcGFjZSBkZWxpbWl0ZWQpIGFyZSBhZGRlZFxuICogLSBgQXJyYXlgIC0gYWxsIHRoZSBDU1MgY2xhc3NlcyAoQXJyYXkgZWxlbWVudHMpIGFyZSBhZGRlZFxuICogLSBgT2JqZWN0YCAtIGVhY2gga2V5IGNvcnJlc3BvbmRzIHRvIGEgQ1NTIGNsYXNzIG5hbWUgd2hpbGUgdmFsdWVzIGFyZSBpbnRlcnByZXRlZCBhcyBleHByZXNzaW9uc1xuICogZXZhbHVhdGluZyB0byBgQm9vbGVhbmAuIElmIGEgZ2l2ZW4gZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYHRydWVgIGEgY29ycmVzcG9uZGluZyBDU1MgY2xhc3NcbiAqIGlzIGFkZGVkIC0gb3RoZXJ3aXNlIGl0IGlzIHJlbW92ZWQuXG4gKlxuICogV2hpbGUgdGhlIGBOZ0NsYXNzYCBkaXJlY3RpdmUgY2FuIGludGVycHJldCBleHByZXNzaW9ucyBldmFsdWF0aW5nIHRvIGBzdHJpbmdgLCBgQXJyYXlgXG4gKiBvciBgT2JqZWN0YCwgdGhlIGBPYmplY3RgLWJhc2VkIHZlcnNpb24gaXMgdGhlIG1vc3Qgb2Z0ZW4gdXNlZCBhbmQgaGFzIGFuIGFkdmFudGFnZSBvZiBrZWVwaW5nXG4gKiBhbGwgdGhlIENTUyBjbGFzcyBuYW1lcyBpbiBhIHRlbXBsYXRlLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9hNFlkdG1XeXdoSjMzdXFmcFBQbj9wPXByZXZpZXcpKTpcbiAqXG4gKiBgYGBcbiAqIGltcG9ydCB7Q29tcG9uZW50fSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbiAqIGltcG9ydCB7TmdDbGFzc30gZnJvbSAnYW5ndWxhcjIvY29tbW9uJztcbiAqXG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICd0b2dnbGUtYnV0dG9uJyxcbiAqICAgaW5wdXRzOiBbJ2lzRGlzYWJsZWQnXSxcbiAqICAgdGVtcGxhdGU6IGBcbiAqICAgICAgPGRpdiBjbGFzcz1cImJ1dHRvblwiIFtuZ0NsYXNzXT1cInthY3RpdmU6IGlzT24sIGRpc2FibGVkOiBpc0Rpc2FibGVkfVwiXG4gKiAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlKCFpc09uKVwiPlxuICogICAgICAgICAgQ2xpY2sgbWUhXG4gKiAgICAgIDwvZGl2PmAsXG4gKiAgIHN0eWxlczogW2BcbiAqICAgICAuYnV0dG9uIHtcbiAqICAgICAgIHdpZHRoOiAxMjBweDtcbiAqICAgICAgIGJvcmRlcjogbWVkaXVtIHNvbGlkIGJsYWNrO1xuICogICAgIH1cbiAqXG4gKiAgICAgLmFjdGl2ZSB7XG4gKiAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7XG4gKiAgICB9XG4gKlxuICogICAgIC5kaXNhYmxlZCB7XG4gKiAgICAgICBjb2xvcjogZ3JheTtcbiAqICAgICAgIGJvcmRlcjogbWVkaXVtIHNvbGlkIGdyYXk7XG4gKiAgICAgfVxuICogICBgXVxuICogICBkaXJlY3RpdmVzOiBbTmdDbGFzc11cbiAqIH0pXG4gKiBjbGFzcyBUb2dnbGVCdXR0b24ge1xuICogICBpc09uID0gZmFsc2U7XG4gKiAgIGlzRGlzYWJsZWQgPSBmYWxzZTtcbiAqXG4gKiAgIHRvZ2dsZShuZXdTdGF0ZSkge1xuICogICAgIGlmICghdGhpcy5pc0Rpc2FibGVkKSB7XG4gKiAgICAgICB0aGlzLmlzT24gPSBuZXdTdGF0ZTtcbiAqICAgICB9XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5ARGlyZWN0aXZlKHtzZWxlY3RvcjogJ1tuZ0NsYXNzXScsIGlucHV0czogWydyYXdDbGFzczogbmdDbGFzcycsICdpbml0aWFsQ2xhc3NlczogY2xhc3MnXX0pXG5leHBvcnQgY2xhc3MgTmdDbGFzcyBpbXBsZW1lbnRzIERvQ2hlY2ssIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgX2RpZmZlcjogYW55O1xuICBwcml2YXRlIF9tb2RlOiBzdHJpbmc7XG4gIHByaXZhdGUgX2luaXRpYWxDbGFzc2VzID0gW107XG4gIHByaXZhdGUgX3Jhd0NsYXNzO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2l0ZXJhYmxlRGlmZmVyczogSXRlcmFibGVEaWZmZXJzLCBwcml2YXRlIF9rZXlWYWx1ZURpZmZlcnM6IEtleVZhbHVlRGlmZmVycyxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfbmdFbDogRWxlbWVudFJlZiwgcHJpdmF0ZSBfcmVuZGVyZXI6IFJlbmRlcmVyKSB7fVxuXG4gIHNldCBpbml0aWFsQ2xhc3Nlcyh2KSB7XG4gICAgdGhpcy5fYXBwbHlJbml0aWFsQ2xhc3Nlcyh0cnVlKTtcbiAgICB0aGlzLl9pbml0aWFsQ2xhc3NlcyA9IGlzUHJlc2VudCh2KSAmJiBpc1N0cmluZyh2KSA/IHYuc3BsaXQoJyAnKSA6IFtdO1xuICAgIHRoaXMuX2FwcGx5SW5pdGlhbENsYXNzZXMoZmFsc2UpO1xuICAgIHRoaXMuX2FwcGx5Q2xhc3Nlcyh0aGlzLl9yYXdDbGFzcywgZmFsc2UpO1xuICB9XG5cbiAgc2V0IHJhd0NsYXNzKHYpIHtcbiAgICB0aGlzLl9jbGVhbnVwQ2xhc3Nlcyh0aGlzLl9yYXdDbGFzcyk7XG5cbiAgICBpZiAoaXNTdHJpbmcodikpIHtcbiAgICAgIHYgPSB2LnNwbGl0KCcgJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fcmF3Q2xhc3MgPSB2O1xuICAgIGlmIChpc1ByZXNlbnQodikpIHtcbiAgICAgIGlmIChpc0xpc3RMaWtlSXRlcmFibGUodikpIHtcbiAgICAgICAgdGhpcy5fZGlmZmVyID0gdGhpcy5faXRlcmFibGVEaWZmZXJzLmZpbmQodikuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLl9tb2RlID0gJ2l0ZXJhYmxlJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2RpZmZlciA9IHRoaXMuX2tleVZhbHVlRGlmZmVycy5maW5kKHYpLmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy5fbW9kZSA9ICdrZXlWYWx1ZSc7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2RpZmZlciA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgbmdEb0NoZWNrKCk6IHZvaWQge1xuICAgIGlmIChpc1ByZXNlbnQodGhpcy5fZGlmZmVyKSkge1xuICAgICAgdmFyIGNoYW5nZXMgPSB0aGlzLl9kaWZmZXIuZGlmZih0aGlzLl9yYXdDbGFzcyk7XG4gICAgICBpZiAoaXNQcmVzZW50KGNoYW5nZXMpKSB7XG4gICAgICAgIGlmICh0aGlzLl9tb2RlID09ICdpdGVyYWJsZScpIHtcbiAgICAgICAgICB0aGlzLl9hcHBseUl0ZXJhYmxlQ2hhbmdlcyhjaGFuZ2VzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9hcHBseUtleVZhbHVlQ2hhbmdlcyhjaGFuZ2VzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQgeyB0aGlzLl9jbGVhbnVwQ2xhc3Nlcyh0aGlzLl9yYXdDbGFzcyk7IH1cblxuICBwcml2YXRlIF9jbGVhbnVwQ2xhc3NlcyhyYXdDbGFzc1ZhbCk6IHZvaWQge1xuICAgIHRoaXMuX2FwcGx5Q2xhc3NlcyhyYXdDbGFzc1ZhbCwgdHJ1ZSk7XG4gICAgdGhpcy5fYXBwbHlJbml0aWFsQ2xhc3NlcyhmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIF9hcHBseUtleVZhbHVlQ2hhbmdlcyhjaGFuZ2VzOiBhbnkpOiB2b2lkIHtcbiAgICBjaGFuZ2VzLmZvckVhY2hBZGRlZEl0ZW0oKHJlY29yZCkgPT4geyB0aGlzLl90b2dnbGVDbGFzcyhyZWNvcmQua2V5LCByZWNvcmQuY3VycmVudFZhbHVlKTsgfSk7XG4gICAgY2hhbmdlcy5mb3JFYWNoQ2hhbmdlZEl0ZW0oKHJlY29yZCkgPT4geyB0aGlzLl90b2dnbGVDbGFzcyhyZWNvcmQua2V5LCByZWNvcmQuY3VycmVudFZhbHVlKTsgfSk7XG4gICAgY2hhbmdlcy5mb3JFYWNoUmVtb3ZlZEl0ZW0oKHJlY29yZCkgPT4ge1xuICAgICAgaWYgKHJlY29yZC5wcmV2aW91c1ZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3RvZ2dsZUNsYXNzKHJlY29yZC5rZXksIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2FwcGx5SXRlcmFibGVDaGFuZ2VzKGNoYW5nZXM6IGFueSk6IHZvaWQge1xuICAgIGNoYW5nZXMuZm9yRWFjaEFkZGVkSXRlbSgocmVjb3JkKSA9PiB7IHRoaXMuX3RvZ2dsZUNsYXNzKHJlY29yZC5pdGVtLCB0cnVlKTsgfSk7XG4gICAgY2hhbmdlcy5mb3JFYWNoUmVtb3ZlZEl0ZW0oKHJlY29yZCkgPT4geyB0aGlzLl90b2dnbGVDbGFzcyhyZWNvcmQuaXRlbSwgZmFsc2UpOyB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2FwcGx5SW5pdGlhbENsYXNzZXMoaXNDbGVhbnVwOiBib29sZWFuKSB7XG4gICAgdGhpcy5faW5pdGlhbENsYXNzZXMuZm9yRWFjaChjbGFzc05hbWUgPT4gdGhpcy5fdG9nZ2xlQ2xhc3MoY2xhc3NOYW1lLCAhaXNDbGVhbnVwKSk7XG4gIH1cblxuICBwcml2YXRlIF9hcHBseUNsYXNzZXMocmF3Q2xhc3NWYWw6IHN0cmluZ1tdIHwgU2V0PHN0cmluZz58IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9LFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNDbGVhbnVwOiBib29sZWFuKSB7XG4gICAgaWYgKGlzUHJlc2VudChyYXdDbGFzc1ZhbCkpIHtcbiAgICAgIGlmIChpc0FycmF5KHJhd0NsYXNzVmFsKSkge1xuICAgICAgICAoPHN0cmluZ1tdPnJhd0NsYXNzVmFsKS5mb3JFYWNoKGNsYXNzTmFtZSA9PiB0aGlzLl90b2dnbGVDbGFzcyhjbGFzc05hbWUsICFpc0NsZWFudXApKTtcbiAgICAgIH0gZWxzZSBpZiAocmF3Q2xhc3NWYWwgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgICAgKDxTZXQ8c3RyaW5nPj5yYXdDbGFzc1ZhbCkuZm9yRWFjaChjbGFzc05hbWUgPT4gdGhpcy5fdG9nZ2xlQ2xhc3MoY2xhc3NOYW1lLCAhaXNDbGVhbnVwKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBTdHJpbmdNYXBXcmFwcGVyLmZvckVhY2goPHtbazogc3RyaW5nXTogc3RyaW5nfT5yYXdDbGFzc1ZhbCwgKGV4cFZhbCwgY2xhc3NOYW1lKSA9PiB7XG4gICAgICAgICAgaWYgKGV4cFZhbCkgdGhpcy5fdG9nZ2xlQ2xhc3MoY2xhc3NOYW1lLCAhaXNDbGVhbnVwKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfdG9nZ2xlQ2xhc3MoY2xhc3NOYW1lOiBzdHJpbmcsIGVuYWJsZWQpOiB2b2lkIHtcbiAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUudHJpbSgpO1xuICAgIGlmIChjbGFzc05hbWUubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKGNsYXNzTmFtZS5pbmRleE9mKCcgJykgPiAtMSkge1xuICAgICAgICB2YXIgY2xhc3NlcyA9IGNsYXNzTmFtZS5zcGxpdCgvXFxzKy9nKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNsYXNzZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRFbGVtZW50Q2xhc3ModGhpcy5fbmdFbCwgY2xhc3Nlc1tpXSwgZW5hYmxlZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldEVsZW1lbnRDbGFzcyh0aGlzLl9uZ0VsLCBjbGFzc05hbWUsIGVuYWJsZWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbW1vbi9kaXJlY3RpdmVzL25nX2NsYXNzLnRzXG4gKiovIiwiaW1wb3J0IHtcbiAgRG9DaGVjayxcbiAgRGlyZWN0aXZlLFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgSXRlcmFibGVEaWZmZXIsXG4gIEl0ZXJhYmxlRGlmZmVycyxcbiAgVmlld0NvbnRhaW5lclJlZixcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdSZWZcbn0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5pbXBvcnQge2lzUHJlc2VudCwgaXNCbGFua30gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxuLyoqXG4gKiBUaGUgYE5nRm9yYCBkaXJlY3RpdmUgaW5zdGFudGlhdGVzIGEgdGVtcGxhdGUgb25jZSBwZXIgaXRlbSBmcm9tIGFuIGl0ZXJhYmxlLiBUaGUgY29udGV4dCBmb3JcbiAqIGVhY2ggaW5zdGFudGlhdGVkIHRlbXBsYXRlIGluaGVyaXRzIGZyb20gdGhlIG91dGVyIGNvbnRleHQgd2l0aCB0aGUgZ2l2ZW4gbG9vcCB2YXJpYWJsZSBzZXRcbiAqIHRvIHRoZSBjdXJyZW50IGl0ZW0gZnJvbSB0aGUgaXRlcmFibGUuXG4gKlxuICogIyBMb2NhbCBWYXJpYWJsZXNcbiAqXG4gKiBgTmdGb3JgIHByb3ZpZGVzIHNldmVyYWwgZXhwb3J0ZWQgdmFsdWVzIHRoYXQgY2FuIGJlIGFsaWFzZWQgdG8gbG9jYWwgdmFyaWFibGVzOlxuICpcbiAqICogYGluZGV4YCB3aWxsIGJlIHNldCB0byB0aGUgY3VycmVudCBsb29wIGl0ZXJhdGlvbiBmb3IgZWFjaCB0ZW1wbGF0ZSBjb250ZXh0LlxuICogKiBgbGFzdGAgd2lsbCBiZSBzZXQgdG8gYSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgaXRlbSBpcyB0aGUgbGFzdCBvbmUgaW4gdGhlXG4gKiAgIGl0ZXJhdGlvbi5cbiAqICogYGV2ZW5gIHdpbGwgYmUgc2V0IHRvIGEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBpdGVtIGhhcyBhbiBldmVuIGluZGV4LlxuICogKiBgb2RkYCB3aWxsIGJlIHNldCB0byBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgaXRlbSBoYXMgYW4gb2RkIGluZGV4LlxuICpcbiAqICMgQ2hhbmdlIFByb3BhZ2F0aW9uXG4gKlxuICogV2hlbiB0aGUgY29udGVudHMgb2YgdGhlIGl0ZXJhdG9yIGNoYW5nZXMsIGBOZ0ZvcmAgbWFrZXMgdGhlIGNvcnJlc3BvbmRpbmcgY2hhbmdlcyB0byB0aGUgRE9NOlxuICpcbiAqICogV2hlbiBhbiBpdGVtIGlzIGFkZGVkLCBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdGVtcGxhdGUgaXMgYWRkZWQgdG8gdGhlIERPTS5cbiAqICogV2hlbiBhbiBpdGVtIGlzIHJlbW92ZWQsIGl0cyB0ZW1wbGF0ZSBpbnN0YW5jZSBpcyByZW1vdmVkIGZyb20gdGhlIERPTS5cbiAqICogV2hlbiBpdGVtcyBhcmUgcmVvcmRlcmVkLCB0aGVpciByZXNwZWN0aXZlIHRlbXBsYXRlcyBhcmUgcmVvcmRlcmVkIGluIHRoZSBET00uXG4gKiAqIE90aGVyd2lzZSwgdGhlIERPTSBlbGVtZW50IGZvciB0aGF0IGl0ZW0gd2lsbCByZW1haW4gdGhlIHNhbWUuXG4gKlxuICogQW5ndWxhciB1c2VzIG9iamVjdCBpZGVudGl0eSB0byB0cmFjayBpbnNlcnRpb25zIGFuZCBkZWxldGlvbnMgd2l0aGluIHRoZSBpdGVyYXRvciBhbmQgcmVwcm9kdWNlXG4gKiB0aG9zZSBjaGFuZ2VzIGluIHRoZSBET00uIFRoaXMgaGFzIGltcG9ydGFudCBpbXBsaWNhdGlvbnMgZm9yIGFuaW1hdGlvbnMgYW5kIGFueSBzdGF0ZWZ1bFxuICogY29udHJvbHNcbiAqIChzdWNoIGFzIGA8aW5wdXQ+YCBlbGVtZW50cyB3aGljaCBhY2NlcHQgdXNlciBpbnB1dCkgdGhhdCBhcmUgcHJlc2VudC4gSW5zZXJ0ZWQgcm93cyBjYW4gYmVcbiAqIGFuaW1hdGVkIGluLCBkZWxldGVkIHJvd3MgY2FuIGJlIGFuaW1hdGVkIG91dCwgYW5kIHVuY2hhbmdlZCByb3dzIHJldGFpbiBhbnkgdW5zYXZlZCBzdGF0ZSBzdWNoXG4gKiBhcyB1c2VyIGlucHV0LlxuICpcbiAqIEl0IGlzIHBvc3NpYmxlIGZvciB0aGUgaWRlbnRpdGllcyBvZiBlbGVtZW50cyBpbiB0aGUgaXRlcmF0b3IgdG8gY2hhbmdlIHdoaWxlIHRoZSBkYXRhIGRvZXMgbm90LlxuICogVGhpcyBjYW4gaGFwcGVuLCBmb3IgZXhhbXBsZSwgaWYgdGhlIGl0ZXJhdG9yIHByb2R1Y2VkIGZyb20gYW4gUlBDIHRvIHRoZSBzZXJ2ZXIsIGFuZCB0aGF0XG4gKiBSUEMgaXMgcmUtcnVuLiBFdmVuIGlmIHRoZSBkYXRhIGhhc24ndCBjaGFuZ2VkLCB0aGUgc2Vjb25kIHJlc3BvbnNlIHdpbGwgcHJvZHVjZSBvYmplY3RzIHdpdGhcbiAqIGRpZmZlcmVudCBpZGVudGl0aWVzLCBhbmQgQW5ndWxhciB3aWxsIHRlYXIgZG93biB0aGUgZW50aXJlIERPTSBhbmQgcmVidWlsZCBpdCAoYXMgaWYgYWxsIG9sZFxuICogZWxlbWVudHMgd2VyZSBkZWxldGVkIGFuZCBhbGwgbmV3IGVsZW1lbnRzIGluc2VydGVkKS4gVGhpcyBpcyBhbiBleHBlbnNpdmUgb3BlcmF0aW9uIGFuZCBzaG91bGRcbiAqIGJlIGF2b2lkZWQgaWYgcG9zc2libGUuXG4gKlxuICogIyBTeW50YXhcbiAqXG4gKiAtIGA8bGkgKm5nRm9yPVwiI2l0ZW0gb2YgaXRlbXM7ICNpID0gaW5kZXhcIj4uLi48L2xpPmBcbiAqIC0gYDxsaSB0ZW1wbGF0ZT1cIm5nRm9yICNpdGVtIG9mIGl0ZW1zOyAjaSA9IGluZGV4XCI+Li4uPC9saT5gXG4gKiAtIGA8dGVtcGxhdGUgbmdGb3IgI2l0ZW0gW25nRm9yT2ZdPVwiaXRlbXNcIiAjaT1cImluZGV4XCI+PGxpPi4uLjwvbGk+PC90ZW1wbGF0ZT5gXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBTZWUgYSBbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9LVnVYeERwMHFpbkdEeW8zMDdRVz9wPXByZXZpZXcpIGZvciBhIG1vcmUgZGV0YWlsZWRcbiAqIGV4YW1wbGUuXG4gKi9cbkBEaXJlY3RpdmUoe3NlbGVjdG9yOiAnW25nRm9yXVtuZ0Zvck9mXScsIGlucHV0czogWyduZ0Zvck9mJywgJ25nRm9yVGVtcGxhdGUnXX0pXG5leHBvcnQgY2xhc3MgTmdGb3IgaW1wbGVtZW50cyBEb0NoZWNrIHtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfbmdGb3JPZjogYW55O1xuICBwcml2YXRlIF9kaWZmZXI6IEl0ZXJhYmxlRGlmZmVyO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3ZpZXdDb250YWluZXI6IFZpZXdDb250YWluZXJSZWYsIHByaXZhdGUgX3RlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfaXRlcmFibGVEaWZmZXJzOiBJdGVyYWJsZURpZmZlcnMsIHByaXZhdGUgX2NkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgc2V0IG5nRm9yT2YodmFsdWU6IGFueSkge1xuICAgIHRoaXMuX25nRm9yT2YgPSB2YWx1ZTtcbiAgICBpZiAoaXNCbGFuayh0aGlzLl9kaWZmZXIpICYmIGlzUHJlc2VudCh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuX2RpZmZlciA9IHRoaXMuX2l0ZXJhYmxlRGlmZmVycy5maW5kKHZhbHVlKS5jcmVhdGUodGhpcy5fY2RyKTtcbiAgICB9XG4gIH1cblxuICBzZXQgbmdGb3JUZW1wbGF0ZSh2YWx1ZTogVGVtcGxhdGVSZWYpIHtcbiAgICBpZiAoaXNQcmVzZW50KHZhbHVlKSkge1xuICAgICAgdGhpcy5fdGVtcGxhdGVSZWYgPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBuZ0RvQ2hlY2soKSB7XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLl9kaWZmZXIpKSB7XG4gICAgICB2YXIgY2hhbmdlcyA9IHRoaXMuX2RpZmZlci5kaWZmKHRoaXMuX25nRm9yT2YpO1xuICAgICAgaWYgKGlzUHJlc2VudChjaGFuZ2VzKSkgdGhpcy5fYXBwbHlDaGFuZ2VzKGNoYW5nZXMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2FwcGx5Q2hhbmdlcyhjaGFuZ2VzKSB7XG4gICAgLy8gVE9ETyhyYWRvKTogY2hlY2sgaWYgY2hhbmdlIGRldGVjdGlvbiBjYW4gcHJvZHVjZSBhIGNoYW5nZSByZWNvcmQgdGhhdCBpc1xuICAgIC8vIGVhc2llciB0byBjb25zdW1lIHRoYW4gY3VycmVudC5cbiAgICB2YXIgcmVjb3JkVmlld1R1cGxlcyA9IFtdO1xuICAgIGNoYW5nZXMuZm9yRWFjaFJlbW92ZWRJdGVtKChyZW1vdmVkUmVjb3JkKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRWaWV3VHVwbGVzLnB1c2gobmV3IFJlY29yZFZpZXdUdXBsZShyZW1vdmVkUmVjb3JkLCBudWxsKSkpO1xuXG4gICAgY2hhbmdlcy5mb3JFYWNoTW92ZWRJdGVtKChtb3ZlZFJlY29yZCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZFZpZXdUdXBsZXMucHVzaChuZXcgUmVjb3JkVmlld1R1cGxlKG1vdmVkUmVjb3JkLCBudWxsKSkpO1xuXG4gICAgdmFyIGluc2VydFR1cGxlcyA9IHRoaXMuX2J1bGtSZW1vdmUocmVjb3JkVmlld1R1cGxlcyk7XG5cbiAgICBjaGFuZ2VzLmZvckVhY2hBZGRlZEl0ZW0oKGFkZGVkUmVjb3JkKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0VHVwbGVzLnB1c2gobmV3IFJlY29yZFZpZXdUdXBsZShhZGRlZFJlY29yZCwgbnVsbCkpKTtcblxuICAgIHRoaXMuX2J1bGtJbnNlcnQoaW5zZXJ0VHVwbGVzKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5zZXJ0VHVwbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLl9wZXJWaWV3Q2hhbmdlKGluc2VydFR1cGxlc1tpXS52aWV3LCBpbnNlcnRUdXBsZXNbaV0ucmVjb3JkKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMCwgaWxlbiA9IHRoaXMuX3ZpZXdDb250YWluZXIubGVuZ3RoOyBpIDwgaWxlbjsgaSsrKSB7XG4gICAgICB0aGlzLl92aWV3Q29udGFpbmVyLmdldChpKS5zZXRMb2NhbCgnbGFzdCcsIGkgPT09IGlsZW4gLSAxKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9wZXJWaWV3Q2hhbmdlKHZpZXcsIHJlY29yZCkge1xuICAgIHZpZXcuc2V0TG9jYWwoJ1xcJGltcGxpY2l0JywgcmVjb3JkLml0ZW0pO1xuICAgIHZpZXcuc2V0TG9jYWwoJ2luZGV4JywgcmVjb3JkLmN1cnJlbnRJbmRleCk7XG4gICAgdmlldy5zZXRMb2NhbCgnZXZlbicsIChyZWNvcmQuY3VycmVudEluZGV4ICUgMiA9PSAwKSk7XG4gICAgdmlldy5zZXRMb2NhbCgnb2RkJywgKHJlY29yZC5jdXJyZW50SW5kZXggJSAyID09IDEpKTtcbiAgfVxuXG4gIHByaXZhdGUgX2J1bGtSZW1vdmUodHVwbGVzOiBSZWNvcmRWaWV3VHVwbGVbXSk6IFJlY29yZFZpZXdUdXBsZVtdIHtcbiAgICB0dXBsZXMuc29ydCgoYSwgYikgPT4gYS5yZWNvcmQucHJldmlvdXNJbmRleCAtIGIucmVjb3JkLnByZXZpb3VzSW5kZXgpO1xuICAgIHZhciBtb3ZlZFR1cGxlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSB0dXBsZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciB0dXBsZSA9IHR1cGxlc1tpXTtcbiAgICAgIC8vIHNlcGFyYXRlIG1vdmVkIHZpZXdzIGZyb20gcmVtb3ZlZCB2aWV3cy5cbiAgICAgIGlmIChpc1ByZXNlbnQodHVwbGUucmVjb3JkLmN1cnJlbnRJbmRleCkpIHtcbiAgICAgICAgdHVwbGUudmlldyA9IHRoaXMuX3ZpZXdDb250YWluZXIuZGV0YWNoKHR1cGxlLnJlY29yZC5wcmV2aW91c0luZGV4KTtcbiAgICAgICAgbW92ZWRUdXBsZXMucHVzaCh0dXBsZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyLnJlbW92ZSh0dXBsZS5yZWNvcmQucHJldmlvdXNJbmRleCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtb3ZlZFR1cGxlcztcbiAgfVxuXG4gIHByaXZhdGUgX2J1bGtJbnNlcnQodHVwbGVzOiBSZWNvcmRWaWV3VHVwbGVbXSk6IFJlY29yZFZpZXdUdXBsZVtdIHtcbiAgICB0dXBsZXMuc29ydCgoYSwgYikgPT4gYS5yZWNvcmQuY3VycmVudEluZGV4IC0gYi5yZWNvcmQuY3VycmVudEluZGV4KTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHR1cGxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHR1cGxlID0gdHVwbGVzW2ldO1xuICAgICAgaWYgKGlzUHJlc2VudCh0dXBsZS52aWV3KSkge1xuICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyLmluc2VydCh0dXBsZS52aWV3LCB0dXBsZS5yZWNvcmQuY3VycmVudEluZGV4KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHR1cGxlLnZpZXcgPVxuICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lci5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy5fdGVtcGxhdGVSZWYsIHR1cGxlLnJlY29yZC5jdXJyZW50SW5kZXgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHVwbGVzO1xuICB9XG59XG5cbmNsYXNzIFJlY29yZFZpZXdUdXBsZSB7XG4gIHZpZXc6IFZpZXdSZWY7XG4gIHJlY29yZDogYW55O1xuICBjb25zdHJ1Y3RvcihyZWNvcmQsIHZpZXcpIHtcbiAgICB0aGlzLnJlY29yZCA9IHJlY29yZDtcbiAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tbW9uL2RpcmVjdGl2ZXMvbmdfZm9yLnRzXG4gKiovIiwiaW1wb3J0IHtEaXJlY3RpdmUsIFZpZXdDb250YWluZXJSZWYsIFRlbXBsYXRlUmVmfSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbmltcG9ydCB7aXNCbGFua30gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxuLyoqXG4gKiBSZW1vdmVzIG9yIHJlY3JlYXRlcyBhIHBvcnRpb24gb2YgdGhlIERPTSB0cmVlIGJhc2VkIG9uIGFuIHtleHByZXNzaW9ufS5cbiAqXG4gKiBJZiB0aGUgZXhwcmVzc2lvbiBhc3NpZ25lZCB0byBgbmdJZmAgZXZhbHVhdGVzIHRvIGEgZmFsc2UgdmFsdWUgdGhlbiB0aGUgZWxlbWVudFxuICogaXMgcmVtb3ZlZCBmcm9tIHRoZSBET00sIG90aGVyd2lzZSBhIGNsb25lIG9mIHRoZSBlbGVtZW50IGlzIHJlaW5zZXJ0ZWQgaW50byB0aGUgRE9NLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9mZTBrZ2VtRkJ0bVFPWTMxYjR0dz9wPXByZXZpZXcpKTpcbiAqXG4gKiBgYGBcbiAqIDxkaXYgKm5nSWY9XCJlcnJvckNvdW50ID4gMFwiIGNsYXNzPVwiZXJyb3JcIj5cbiAqICAgPCEtLSBFcnJvciBtZXNzYWdlIGRpc3BsYXllZCB3aGVuIHRoZSBlcnJvckNvdW50IHByb3BlcnR5IG9uIHRoZSBjdXJyZW50IGNvbnRleHQgaXMgZ3JlYXRlclxuICogdGhhbiAwLiAtLT5cbiAqICAge3tlcnJvckNvdW50fX0gZXJyb3JzIGRldGVjdGVkXG4gKiA8L2Rpdj5cbiAqIGBgYFxuICpcbiAqICMjIyBTeW50YXhcbiAqXG4gKiAtIGA8ZGl2ICpuZ0lmPVwiY29uZGl0aW9uXCI+Li4uPC9kaXY+YFxuICogLSBgPGRpdiB0ZW1wbGF0ZT1cIm5nSWYgY29uZGl0aW9uXCI+Li4uPC9kaXY+YFxuICogLSBgPHRlbXBsYXRlIFtuZ0lmXT1cImNvbmRpdGlvblwiPjxkaXY+Li4uPC9kaXY+PC90ZW1wbGF0ZT5gXG4gKi9cbkBEaXJlY3RpdmUoe3NlbGVjdG9yOiAnW25nSWZdJywgaW5wdXRzOiBbJ25nSWYnXX0pXG5leHBvcnQgY2xhc3MgTmdJZiB7XG4gIHByaXZhdGUgX3ByZXZDb25kaXRpb246IGJvb2xlYW4gPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3ZpZXdDb250YWluZXI6IFZpZXdDb250YWluZXJSZWYsIHByaXZhdGUgX3RlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZikge31cblxuICBzZXQgbmdJZihuZXdDb25kaXRpb24gLyogYm9vbGVhbiAqLykge1xuICAgIGlmIChuZXdDb25kaXRpb24gJiYgKGlzQmxhbmsodGhpcy5fcHJldkNvbmRpdGlvbikgfHwgIXRoaXMuX3ByZXZDb25kaXRpb24pKSB7XG4gICAgICB0aGlzLl9wcmV2Q29uZGl0aW9uID0gdHJ1ZTtcbiAgICAgIHRoaXMuX3ZpZXdDb250YWluZXIuY3JlYXRlRW1iZWRkZWRWaWV3KHRoaXMuX3RlbXBsYXRlUmVmKTtcbiAgICB9IGVsc2UgaWYgKCFuZXdDb25kaXRpb24gJiYgKGlzQmxhbmsodGhpcy5fcHJldkNvbmRpdGlvbikgfHwgdGhpcy5fcHJldkNvbmRpdGlvbikpIHtcbiAgICAgIHRoaXMuX3ByZXZDb25kaXRpb24gPSBmYWxzZTtcbiAgICAgIHRoaXMuX3ZpZXdDb250YWluZXIuY2xlYXIoKTtcbiAgICB9XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21tb24vZGlyZWN0aXZlcy9uZ19pZi50c1xuICoqLyIsImltcG9ydCB7XG4gIERvQ2hlY2ssXG4gIEtleVZhbHVlRGlmZmVyLFxuICBLZXlWYWx1ZURpZmZlcnMsXG4gIEVsZW1lbnRSZWYsXG4gIERpcmVjdGl2ZSxcbiAgUmVuZGVyZXJcbn0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5pbXBvcnQge2lzUHJlc2VudCwgaXNCbGFuaywgcHJpbnR9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5cbi8qKlxuICogVGhlIGBOZ1N0eWxlYCBkaXJlY3RpdmUgY2hhbmdlcyBzdHlsZXMgYmFzZWQgb24gYSByZXN1bHQgb2YgZXhwcmVzc2lvbiBldmFsdWF0aW9uLlxuICpcbiAqIEFuIGV4cHJlc3Npb24gYXNzaWduZWQgdG8gdGhlIGBuZ1N0eWxlYCBwcm9wZXJ0eSBtdXN0IGV2YWx1YXRlIHRvIGFuIG9iamVjdCBhbmQgdGhlXG4gKiBjb3JyZXNwb25kaW5nIGVsZW1lbnQgc3R5bGVzIGFyZSB1cGRhdGVkIGJhc2VkIG9uIGNoYW5nZXMgdG8gdGhpcyBvYmplY3QuIFN0eWxlIG5hbWVzIHRvIHVwZGF0ZVxuICogYXJlIHRha2VuIGZyb20gdGhlIG9iamVjdCdzIGtleXMsIGFuZCB2YWx1ZXMgLSBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIG9iamVjdCdzIHZhbHVlcy5cbiAqXG4gKiAjIyMgU3ludGF4XG4gKlxuICogLSBgPGRpdiBbbmdTdHlsZV09XCJ7J2ZvbnQtc3R5bGUnOiBzdHlsZX1cIj48L2Rpdj5gXG4gKiAtIGA8ZGl2IFtuZ1N0eWxlXT1cInN0eWxlRXhwXCI+PC9kaXY+YCAtIGhlcmUgdGhlIGBzdHlsZUV4cGAgbXVzdCBldmFsdWF0ZSB0byBhbiBvYmplY3RcbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvWWFtR1M2R2tVaDlHcVdOUWhDeU0/cD1wcmV2aWV3KSk6XG4gKlxuICogYGBgXG4gKiBpbXBvcnQge0NvbXBvbmVudH0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG4gKiBpbXBvcnQge05nU3R5bGV9IGZyb20gJ2FuZ3VsYXIyL2NvbW1vbic7XG4gKlxuICogQENvbXBvbmVudCh7XG4gKiAgc2VsZWN0b3I6ICduZ1N0eWxlLWV4YW1wbGUnLFxuICogIHRlbXBsYXRlOiBgXG4gKiAgICA8aDEgW25nU3R5bGVdPVwieydmb250LXN0eWxlJzogc3R5bGUsICdmb250LXNpemUnOiBzaXplLCAnZm9udC13ZWlnaHQnOiB3ZWlnaHR9XCI+XG4gKiAgICAgIENoYW5nZSBzdHlsZSBvZiB0aGlzIHRleHQhXG4gKiAgICA8L2gxPlxuICpcbiAqICAgIDxocj5cbiAqXG4gKiAgICA8bGFiZWw+SXRhbGljOiA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgKGNoYW5nZSk9XCJjaGFuZ2VTdHlsZSgkZXZlbnQpXCI+PC9sYWJlbD5cbiAqICAgIDxsYWJlbD5Cb2xkOiA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgKGNoYW5nZSk9XCJjaGFuZ2VXZWlnaHQoJGV2ZW50KVwiPjwvbGFiZWw+XG4gKiAgICA8bGFiZWw+U2l6ZTogPGlucHV0IHR5cGU9XCJ0ZXh0XCIgW3ZhbHVlXT1cInNpemVcIiAoY2hhbmdlKT1cInNpemUgPSAkZXZlbnQudGFyZ2V0LnZhbHVlXCI+PC9sYWJlbD5cbiAqICBgLFxuICogIGRpcmVjdGl2ZXM6IFtOZ1N0eWxlXVxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBOZ1N0eWxlRXhhbXBsZSB7XG4gKiAgICBzdHlsZSA9ICdub3JtYWwnO1xuICogICAgd2VpZ2h0ID0gJ25vcm1hbCc7XG4gKiAgICBzaXplID0gJzIwcHgnO1xuICpcbiAqICAgIGNoYW5nZVN0eWxlKCRldmVudDogYW55KSB7XG4gKiAgICAgIHRoaXMuc3R5bGUgPSAkZXZlbnQudGFyZ2V0LmNoZWNrZWQgPyAnaXRhbGljJyA6ICdub3JtYWwnO1xuICogICAgfVxuICpcbiAqICAgIGNoYW5nZVdlaWdodCgkZXZlbnQ6IGFueSkge1xuICogICAgICB0aGlzLndlaWdodCA9ICRldmVudC50YXJnZXQuY2hlY2tlZCA/ICdib2xkJyA6ICdub3JtYWwnO1xuICogICAgfVxuICogfVxuICogYGBgXG4gKlxuICogSW4gdGhpcyBleGFtcGxlIHRoZSBgZm9udC1zdHlsZWAsIGBmb250LXNpemVgIGFuZCBgZm9udC13ZWlnaHRgIHN0eWxlcyB3aWxsIGJlIHVwZGF0ZWRcbiAqIGJhc2VkIG9uIHRoZSBgc3R5bGVgIHByb3BlcnR5J3MgdmFsdWUgY2hhbmdlcy5cbiAqL1xuQERpcmVjdGl2ZSh7c2VsZWN0b3I6ICdbbmdTdHlsZV0nLCBpbnB1dHM6IFsncmF3U3R5bGU6IG5nU3R5bGUnXX0pXG5leHBvcnQgY2xhc3MgTmdTdHlsZSBpbXBsZW1lbnRzIERvQ2hlY2sge1xuICAvKiogQGludGVybmFsICovXG4gIF9yYXdTdHlsZTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZGlmZmVyOiBLZXlWYWx1ZURpZmZlcjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kaWZmZXJzOiBLZXlWYWx1ZURpZmZlcnMsIHByaXZhdGUgX25nRWw6IEVsZW1lbnRSZWYsXG4gICAgICAgICAgICAgIHByaXZhdGUgX3JlbmRlcmVyOiBSZW5kZXJlcikge31cblxuICBzZXQgcmF3U3R5bGUodikge1xuICAgIHRoaXMuX3Jhd1N0eWxlID0gdjtcbiAgICBpZiAoaXNCbGFuayh0aGlzLl9kaWZmZXIpICYmIGlzUHJlc2VudCh2KSkge1xuICAgICAgdGhpcy5fZGlmZmVyID0gdGhpcy5fZGlmZmVycy5maW5kKHRoaXMuX3Jhd1N0eWxlKS5jcmVhdGUobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgbmdEb0NoZWNrKCkge1xuICAgIGlmIChpc1ByZXNlbnQodGhpcy5fZGlmZmVyKSkge1xuICAgICAgdmFyIGNoYW5nZXMgPSB0aGlzLl9kaWZmZXIuZGlmZih0aGlzLl9yYXdTdHlsZSk7XG4gICAgICBpZiAoaXNQcmVzZW50KGNoYW5nZXMpKSB7XG4gICAgICAgIHRoaXMuX2FwcGx5Q2hhbmdlcyhjaGFuZ2VzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9hcHBseUNoYW5nZXMoY2hhbmdlczogYW55KTogdm9pZCB7XG4gICAgY2hhbmdlcy5mb3JFYWNoQWRkZWRJdGVtKChyZWNvcmQpID0+IHsgdGhpcy5fc2V0U3R5bGUocmVjb3JkLmtleSwgcmVjb3JkLmN1cnJlbnRWYWx1ZSk7IH0pO1xuICAgIGNoYW5nZXMuZm9yRWFjaENoYW5nZWRJdGVtKChyZWNvcmQpID0+IHsgdGhpcy5fc2V0U3R5bGUocmVjb3JkLmtleSwgcmVjb3JkLmN1cnJlbnRWYWx1ZSk7IH0pO1xuICAgIGNoYW5nZXMuZm9yRWFjaFJlbW92ZWRJdGVtKChyZWNvcmQpID0+IHsgdGhpcy5fc2V0U3R5bGUocmVjb3JkLmtleSwgbnVsbCk7IH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0U3R5bGUobmFtZTogc3RyaW5nLCB2YWw6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX3JlbmRlcmVyLnNldEVsZW1lbnRTdHlsZSh0aGlzLl9uZ0VsLCBuYW1lLCB2YWwpO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tbW9uL2RpcmVjdGl2ZXMvbmdfc3R5bGUudHNcbiAqKi8iLCJpbXBvcnQge0RpcmVjdGl2ZSwgSG9zdCwgVmlld0NvbnRhaW5lclJlZiwgVGVtcGxhdGVSZWZ9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuaW1wb3J0IHtpc1ByZXNlbnQsIGlzQmxhbmssIG5vcm1hbGl6ZUJsYW5rLCBDT05TVF9FWFBSfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtMaXN0V3JhcHBlciwgTWFwfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuXG5jb25zdCBfV0hFTl9ERUZBVUxUID0gQ09OU1RfRVhQUihuZXcgT2JqZWN0KCkpO1xuXG5jbGFzcyBTd2l0Y2hWaWV3IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZiwgcHJpdmF0ZSBfdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmKSB7fVxuXG4gIGNyZWF0ZSgpOiB2b2lkIHsgdGhpcy5fdmlld0NvbnRhaW5lclJlZi5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy5fdGVtcGxhdGVSZWYpOyB9XG5cbiAgZGVzdHJveSgpOiB2b2lkIHsgdGhpcy5fdmlld0NvbnRhaW5lclJlZi5jbGVhcigpOyB9XG59XG5cbi8qKlxuICogQWRkcyBvciByZW1vdmVzIERPTSBzdWItdHJlZXMgd2hlbiB0aGVpciBtYXRjaCBleHByZXNzaW9ucyBtYXRjaCB0aGUgc3dpdGNoIGV4cHJlc3Npb24uXG4gKlxuICogRWxlbWVudHMgd2l0aGluIGBOZ1N3aXRjaGAgYnV0IHdpdGhvdXQgYE5nU3dpdGNoV2hlbmAgb3IgYE5nU3dpdGNoRGVmYXVsdGAgZGlyZWN0aXZlcyB3aWxsIGJlXG4gKiBwcmVzZXJ2ZWQgYXQgdGhlIGxvY2F0aW9uIGFzIHNwZWNpZmllZCBpbiB0aGUgdGVtcGxhdGUuXG4gKlxuICogYE5nU3dpdGNoYCBzaW1wbHkgaW5zZXJ0cyBuZXN0ZWQgZWxlbWVudHMgYmFzZWQgb24gd2hpY2ggbWF0Y2ggZXhwcmVzc2lvbiBtYXRjaGVzIHRoZSB2YWx1ZVxuICogb2J0YWluZWQgZnJvbSB0aGUgZXZhbHVhdGVkIHN3aXRjaCBleHByZXNzaW9uLiBJbiBvdGhlciB3b3JkcywgeW91IGRlZmluZSBhIGNvbnRhaW5lciBlbGVtZW50XG4gKiAod2hlcmUgeW91IHBsYWNlIHRoZSBkaXJlY3RpdmUgd2l0aCBhIHN3aXRjaCBleHByZXNzaW9uIG9uIHRoZVxuICogKipgW25nU3dpdGNoXT1cIi4uLlwiYCBhdHRyaWJ1dGUqKiksIGRlZmluZSBhbnkgaW5uZXIgZWxlbWVudHMgaW5zaWRlIG9mIHRoZSBkaXJlY3RpdmUgYW5kXG4gKiBwbGFjZSBhIGBbbmdTd2l0Y2hXaGVuXWAgYXR0cmlidXRlIHBlciBlbGVtZW50LlxuICpcbiAqIFRoZSBgbmdTd2l0Y2hXaGVuYCBwcm9wZXJ0eSBpcyB1c2VkIHRvIGluZm9ybSBgTmdTd2l0Y2hgIHdoaWNoIGVsZW1lbnQgdG8gZGlzcGxheSB3aGVuIHRoZVxuICogZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQuIElmIGEgbWF0Y2hpbmcgZXhwcmVzc2lvbiBpcyBub3QgZm91bmQgdmlhIGEgYG5nU3dpdGNoV2hlbmAgcHJvcGVydHlcbiAqIHRoZW4gYW4gZWxlbWVudCB3aXRoIHRoZSBgbmdTd2l0Y2hEZWZhdWx0YCBhdHRyaWJ1dGUgaXMgZGlzcGxheWVkLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9EUU1USUk5NUNidXFXcmwzbFlBcz9wPXByZXZpZXcpKVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIEBDb21wb25lbnQoe3NlbGVjdG9yOiAnYXBwJ30pXG4gKiBAVmlldyh7XG4gKiAgIHRlbXBsYXRlOiBgXG4gKiAgICAgPHA+VmFsdWUgPSB7e3ZhbHVlfX08L3A+XG4gKiAgICAgPGJ1dHRvbiAoY2xpY2spPVwiaW5jKClcIj5JbmNyZW1lbnQ8L2J1dHRvbj5cbiAqXG4gKiAgICAgPGRpdiBbbmdTd2l0Y2hdPVwidmFsdWVcIj5cbiAqICAgICAgIDxwICpuZ1N3aXRjaFdoZW49XCInaW5pdCdcIj5pbmNyZW1lbnQgdG8gc3RhcnQ8L3A+XG4gKiAgICAgICA8cCAqbmdTd2l0Y2hXaGVuPVwiMFwiPjAsIGluY3JlbWVudCBhZ2FpbjwvcD5cbiAqICAgICAgIDxwICpuZ1N3aXRjaFdoZW49XCIxXCI+MSwgaW5jcmVtZW50IGFnYWluPC9wPlxuICogICAgICAgPHAgKm5nU3dpdGNoV2hlbj1cIjJcIj4yLCBzdG9wIGluY3JlbWVudGluZzwvcD5cbiAqICAgICAgIDxwICpuZ1N3aXRjaERlZmF1bHQ+Jmd0OyAyLCBTVE9QITwvcD5cbiAqICAgICA8L2Rpdj5cbiAqXG4gKiAgICAgPCEtLSBhbHRlcm5hdGUgc3ludGF4IC0tPlxuICpcbiAqICAgICA8cCBbbmdTd2l0Y2hdPVwidmFsdWVcIj5cbiAqICAgICAgIDx0ZW1wbGF0ZSBuZ1N3aXRjaFdoZW49XCJpbml0XCI+aW5jcmVtZW50IHRvIHN0YXJ0PC90ZW1wbGF0ZT5cbiAqICAgICAgIDx0ZW1wbGF0ZSBbbmdTd2l0Y2hXaGVuXT1cIjBcIj4wLCBpbmNyZW1lbnQgYWdhaW48L3RlbXBsYXRlPlxuICogICAgICAgPHRlbXBsYXRlIFtuZ1N3aXRjaFdoZW5dPVwiMVwiPjEsIGluY3JlbWVudCBhZ2FpbjwvdGVtcGxhdGU+XG4gKiAgICAgICA8dGVtcGxhdGUgW25nU3dpdGNoV2hlbl09XCIyXCI+Miwgc3RvcCBpbmNyZW1lbnRpbmc8L3RlbXBsYXRlPlxuICogICAgICAgPHRlbXBsYXRlIG5nU3dpdGNoRGVmYXVsdD4mZ3Q7IDIsIFNUT1AhPC90ZW1wbGF0ZT5cbiAqICAgICA8L3A+XG4gKiAgIGAsXG4gKiAgIGRpcmVjdGl2ZXM6IFtOZ1N3aXRjaCwgTmdTd2l0Y2hXaGVuLCBOZ1N3aXRjaERlZmF1bHRdXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIEFwcCB7XG4gKiAgIHZhbHVlID0gJ2luaXQnO1xuICpcbiAqICAgaW5jKCkge1xuICogICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlID09PSAnaW5pdCcgPyAwIDogdGhpcy52YWx1ZSArIDE7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBib290c3RyYXAoQXBwKS5jYXRjaChlcnIgPT4gY29uc29sZS5lcnJvcihlcnIpKTtcbiAqIGBgYFxuICovXG5ARGlyZWN0aXZlKHtzZWxlY3RvcjogJ1tuZ1N3aXRjaF0nLCBpbnB1dHM6IFsnbmdTd2l0Y2gnXX0pXG5leHBvcnQgY2xhc3MgTmdTd2l0Y2gge1xuICBwcml2YXRlIF9zd2l0Y2hWYWx1ZTogYW55O1xuICBwcml2YXRlIF91c2VEZWZhdWx0OiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX3ZhbHVlVmlld3MgPSBuZXcgTWFwPGFueSwgU3dpdGNoVmlld1tdPigpO1xuICBwcml2YXRlIF9hY3RpdmVWaWV3czogU3dpdGNoVmlld1tdID0gW107XG5cbiAgc2V0IG5nU3dpdGNoKHZhbHVlKSB7XG4gICAgLy8gRW1wdHkgdGhlIGN1cnJlbnRseSBhY3RpdmUgVmlld0NvbnRhaW5lcnNcbiAgICB0aGlzLl9lbXB0eUFsbEFjdGl2ZVZpZXdzKCk7XG5cbiAgICAvLyBBZGQgdGhlIFZpZXdDb250YWluZXJzIG1hdGNoaW5nIHRoZSB2YWx1ZSAod2l0aCBhIGZhbGxiYWNrIHRvIGRlZmF1bHQpXG4gICAgdGhpcy5fdXNlRGVmYXVsdCA9IGZhbHNlO1xuICAgIHZhciB2aWV3cyA9IHRoaXMuX3ZhbHVlVmlld3MuZ2V0KHZhbHVlKTtcbiAgICBpZiAoaXNCbGFuayh2aWV3cykpIHtcbiAgICAgIHRoaXMuX3VzZURlZmF1bHQgPSB0cnVlO1xuICAgICAgdmlld3MgPSBub3JtYWxpemVCbGFuayh0aGlzLl92YWx1ZVZpZXdzLmdldChfV0hFTl9ERUZBVUxUKSk7XG4gICAgfVxuICAgIHRoaXMuX2FjdGl2YXRlVmlld3Modmlld3MpO1xuXG4gICAgdGhpcy5fc3dpdGNoVmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX29uV2hlblZhbHVlQ2hhbmdlZChvbGRXaGVuLCBuZXdXaGVuLCB2aWV3OiBTd2l0Y2hWaWV3KTogdm9pZCB7XG4gICAgdGhpcy5fZGVyZWdpc3RlclZpZXcob2xkV2hlbiwgdmlldyk7XG4gICAgdGhpcy5fcmVnaXN0ZXJWaWV3KG5ld1doZW4sIHZpZXcpO1xuXG4gICAgaWYgKG9sZFdoZW4gPT09IHRoaXMuX3N3aXRjaFZhbHVlKSB7XG4gICAgICB2aWV3LmRlc3Ryb3koKTtcbiAgICAgIExpc3RXcmFwcGVyLnJlbW92ZSh0aGlzLl9hY3RpdmVWaWV3cywgdmlldyk7XG4gICAgfSBlbHNlIGlmIChuZXdXaGVuID09PSB0aGlzLl9zd2l0Y2hWYWx1ZSkge1xuICAgICAgaWYgKHRoaXMuX3VzZURlZmF1bHQpIHtcbiAgICAgICAgdGhpcy5fdXNlRGVmYXVsdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9lbXB0eUFsbEFjdGl2ZVZpZXdzKCk7XG4gICAgICB9XG4gICAgICB2aWV3LmNyZWF0ZSgpO1xuICAgICAgdGhpcy5fYWN0aXZlVmlld3MucHVzaCh2aWV3KTtcbiAgICB9XG5cbiAgICAvLyBTd2l0Y2ggdG8gZGVmYXVsdCB3aGVuIHRoZXJlIGlzIG5vIG1vcmUgYWN0aXZlIFZpZXdDb250YWluZXJzXG4gICAgaWYgKHRoaXMuX2FjdGl2ZVZpZXdzLmxlbmd0aCA9PT0gMCAmJiAhdGhpcy5fdXNlRGVmYXVsdCkge1xuICAgICAgdGhpcy5fdXNlRGVmYXVsdCA9IHRydWU7XG4gICAgICB0aGlzLl9hY3RpdmF0ZVZpZXdzKHRoaXMuX3ZhbHVlVmlld3MuZ2V0KF9XSEVOX0RFRkFVTFQpKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9lbXB0eUFsbEFjdGl2ZVZpZXdzKCk6IHZvaWQge1xuICAgIHZhciBhY3RpdmVDb250YWluZXJzID0gdGhpcy5fYWN0aXZlVmlld3M7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhY3RpdmVDb250YWluZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhY3RpdmVDb250YWluZXJzW2ldLmRlc3Ryb3koKTtcbiAgICB9XG4gICAgdGhpcy5fYWN0aXZlVmlld3MgPSBbXTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2FjdGl2YXRlVmlld3Modmlld3M6IFN3aXRjaFZpZXdbXSk6IHZvaWQge1xuICAgIC8vIFRPRE8odmljYik6IGFzc2VydCh0aGlzLl9hY3RpdmVWaWV3cy5sZW5ndGggPT09IDApO1xuICAgIGlmIChpc1ByZXNlbnQodmlld3MpKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZpZXdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZpZXdzW2ldLmNyZWF0ZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5fYWN0aXZlVmlld3MgPSB2aWV3cztcbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9yZWdpc3RlclZpZXcodmFsdWUsIHZpZXc6IFN3aXRjaFZpZXcpOiB2b2lkIHtcbiAgICB2YXIgdmlld3MgPSB0aGlzLl92YWx1ZVZpZXdzLmdldCh2YWx1ZSk7XG4gICAgaWYgKGlzQmxhbmsodmlld3MpKSB7XG4gICAgICB2aWV3cyA9IFtdO1xuICAgICAgdGhpcy5fdmFsdWVWaWV3cy5zZXQodmFsdWUsIHZpZXdzKTtcbiAgICB9XG4gICAgdmlld3MucHVzaCh2aWV3KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2RlcmVnaXN0ZXJWaWV3KHZhbHVlLCB2aWV3OiBTd2l0Y2hWaWV3KTogdm9pZCB7XG4gICAgLy8gYF9XSEVOX0RFRkFVTFRgIGlzIHVzZWQgYSBtYXJrZXIgZm9yIG5vbi1yZWdpc3RlcmVkIHdoZW5zXG4gICAgaWYgKHZhbHVlID09PSBfV0hFTl9ERUZBVUxUKSByZXR1cm47XG4gICAgdmFyIHZpZXdzID0gdGhpcy5fdmFsdWVWaWV3cy5nZXQodmFsdWUpO1xuICAgIGlmICh2aWV3cy5sZW5ndGggPT0gMSkge1xuICAgICAgdGhpcy5fdmFsdWVWaWV3cy5kZWxldGUodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBMaXN0V3JhcHBlci5yZW1vdmUodmlld3MsIHZpZXcpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEluc2VydCB0aGUgc3ViLXRyZWUgd2hlbiB0aGUgYG5nU3dpdGNoV2hlbmAgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gdGhlIHNhbWUgdmFsdWUgYXMgdGhlXG4gKiBlbmNsb3Npbmcgc3dpdGNoIGV4cHJlc3Npb24uXG4gKlxuICogSWYgbXVsdGlwbGUgbWF0Y2ggZXhwcmVzc2lvbiBtYXRjaCB0aGUgc3dpdGNoIGV4cHJlc3Npb24gdmFsdWUsIGFsbCBvZiB0aGVtIGFyZSBkaXNwbGF5ZWQuXG4gKlxuICogU2VlIHtAbGluayBOZ1N3aXRjaH0gZm9yIG1vcmUgZGV0YWlscyBhbmQgZXhhbXBsZS5cbiAqL1xuQERpcmVjdGl2ZSh7c2VsZWN0b3I6ICdbbmdTd2l0Y2hXaGVuXScsIGlucHV0czogWyduZ1N3aXRjaFdoZW4nXX0pXG5leHBvcnQgY2xhc3MgTmdTd2l0Y2hXaGVuIHtcbiAgLy8gYF9XSEVOX0RFRkFVTFRgIGlzIHVzZWQgYXMgYSBtYXJrZXIgZm9yIGEgbm90IHlldCBpbml0aWFsaXplZCB2YWx1ZVxuICAvKiogQGludGVybmFsICovXG4gIF92YWx1ZTogYW55ID0gX1dIRU5fREVGQVVMVDtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfdmlldzogU3dpdGNoVmlldztcbiAgcHJpdmF0ZSBfc3dpdGNoOiBOZ1N3aXRjaDtcblxuICBjb25zdHJ1Y3Rvcih2aWV3Q29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmLCB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWYsXG4gICAgICAgICAgICAgIEBIb3N0KCkgbmdTd2l0Y2g6IE5nU3dpdGNoKSB7XG4gICAgdGhpcy5fc3dpdGNoID0gbmdTd2l0Y2g7XG4gICAgdGhpcy5fdmlldyA9IG5ldyBTd2l0Y2hWaWV3KHZpZXdDb250YWluZXIsIHRlbXBsYXRlUmVmKTtcbiAgfVxuXG4gIHNldCBuZ1N3aXRjaFdoZW4odmFsdWUpIHtcbiAgICB0aGlzLl9zd2l0Y2guX29uV2hlblZhbHVlQ2hhbmdlZCh0aGlzLl92YWx1ZSwgdmFsdWUsIHRoaXMuX3ZpZXcpO1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBEZWZhdWx0IGNhc2Ugc3RhdGVtZW50cyBhcmUgZGlzcGxheWVkIHdoZW4gbm8gbWF0Y2ggZXhwcmVzc2lvbiBtYXRjaGVzIHRoZSBzd2l0Y2ggZXhwcmVzc2lvblxuICogdmFsdWUuXG4gKlxuICogU2VlIHtAbGluayBOZ1N3aXRjaH0gZm9yIG1vcmUgZGV0YWlscyBhbmQgZXhhbXBsZS5cbiAqL1xuQERpcmVjdGl2ZSh7c2VsZWN0b3I6ICdbbmdTd2l0Y2hEZWZhdWx0XSd9KVxuZXhwb3J0IGNsYXNzIE5nU3dpdGNoRGVmYXVsdCB7XG4gIGNvbnN0cnVjdG9yKHZpZXdDb250YWluZXI6IFZpZXdDb250YWluZXJSZWYsIHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZixcbiAgICAgICAgICAgICAgQEhvc3QoKSBzc3dpdGNoOiBOZ1N3aXRjaCkge1xuICAgIHNzd2l0Y2guX3JlZ2lzdGVyVmlldyhfV0hFTl9ERUZBVUxULCBuZXcgU3dpdGNoVmlldyh2aWV3Q29udGFpbmVyLCB0ZW1wbGF0ZVJlZikpO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tbW9uL2RpcmVjdGl2ZXMvbmdfc3dpdGNoLnRzXG4gKiovIiwiLy8gVFMgZG9lcyBub3QgaGF2ZSBPYnNlcnZhYmxlc1xuXG4vLyBJIG5lZWQgdG8gYmUgaGVyZSB0byBtYWtlIFR5cGVTY3JpcHQgdGhpbmsgdGhpcyBpcyBhIG1vZHVsZS5cbmltcG9ydCB7fSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuXG4vKipcbiAqIFRoaXMgbW9kdWxlIGV4aXN0cyBpbiBEYXJ0LCBidXQgbm90IGluIFR5cGVzY3JpcHQuIFRoaXMgZXhwb3J0ZWQgc3ltYm9sXG4gKiBpcyBvbmx5IGhlcmUgdG8gaGVscCBUeXBlc2NyaXB0IHRoaW5rIHRoaXMgaXMgYSBtb2R1bGUuXG4gKi9cbmV4cG9ydCB2YXIgd29ya2Fyb3VuZF9lbXB0eV9vYnNlcnZhYmxlX2xpc3RfZGlmZjogYW55O1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbW1vbi9kaXJlY3RpdmVzL29ic2VydmFibGVfbGlzdF9kaWZmLnRzXG4gKiovIiwiaW1wb3J0IHtDT05TVF9FWFBSLCBUeXBlfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtOZ0NsYXNzfSBmcm9tICcuL25nX2NsYXNzJztcbmltcG9ydCB7TmdGb3J9IGZyb20gJy4vbmdfZm9yJztcbmltcG9ydCB7TmdJZn0gZnJvbSAnLi9uZ19pZic7XG5pbXBvcnQge05nU3R5bGV9IGZyb20gJy4vbmdfc3R5bGUnO1xuaW1wb3J0IHtOZ1N3aXRjaCwgTmdTd2l0Y2hXaGVuLCBOZ1N3aXRjaERlZmF1bHR9IGZyb20gJy4vbmdfc3dpdGNoJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgQW5ndWxhciBjb3JlIGRpcmVjdGl2ZXMgdGhhdCBhcmUgbGlrZWx5IHRvIGJlIHVzZWQgaW4gZWFjaCBhbmQgZXZlcnkgQW5ndWxhclxuICogYXBwbGljYXRpb24uXG4gKlxuICogVGhpcyBjb2xsZWN0aW9uIGNhbiBiZSB1c2VkIHRvIHF1aWNrbHkgZW51bWVyYXRlIGFsbCB0aGUgYnVpbHQtaW4gZGlyZWN0aXZlcyBpbiB0aGUgYGRpcmVjdGl2ZXNgXG4gKiBwcm9wZXJ0eSBvZiB0aGUgYEBWaWV3YCBhbm5vdGF0aW9uLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC95YWtHd3BDZFVrZzBxZnpYNW04Zz9wPXByZXZpZXcpKVxuICpcbiAqIEluc3RlYWQgb2Ygd3JpdGluZzpcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQge05nQ2xhc3MsIE5nSWYsIE5nRm9yLCBOZ1N3aXRjaCwgTmdTd2l0Y2hXaGVuLCBOZ1N3aXRjaERlZmF1bHR9IGZyb20gJ2FuZ3VsYXIyL2NvbW1vbic7XG4gKiBpbXBvcnQge090aGVyRGlyZWN0aXZlfSBmcm9tICcuL215RGlyZWN0aXZlcyc7XG4gKlxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAnbXktY29tcG9uZW50JyxcbiAqICAgdGVtcGxhdGVVcmw6ICdteUNvbXBvbmVudC5odG1sJyxcbiAqICAgZGlyZWN0aXZlczogW05nQ2xhc3MsIE5nSWYsIE5nRm9yLCBOZ1N3aXRjaCwgTmdTd2l0Y2hXaGVuLCBOZ1N3aXRjaERlZmF1bHQsIE90aGVyRGlyZWN0aXZlXVxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBNeUNvbXBvbmVudCB7XG4gKiAgIC4uLlxuICogfVxuICogYGBgXG4gKiBvbmUgY291bGQgaW1wb3J0IGFsbCB0aGUgY29yZSBkaXJlY3RpdmVzIGF0IG9uY2U6XG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHtDT1JFX0RJUkVDVElWRVN9IGZyb20gJ2FuZ3VsYXIyL2NvbW1vbic7XG4gKiBpbXBvcnQge090aGVyRGlyZWN0aXZlfSBmcm9tICcuL215RGlyZWN0aXZlcyc7XG4gKlxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAnbXktY29tcG9uZW50JyxcbiAqICAgdGVtcGxhdGVVcmw6ICdteUNvbXBvbmVudC5odG1sJyxcbiAqICAgZGlyZWN0aXZlczogW0NPUkVfRElSRUNUSVZFUywgT3RoZXJEaXJlY3RpdmVdXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIE15Q29tcG9uZW50IHtcbiAqICAgLi4uXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IENPUkVfRElSRUNUSVZFUzogVHlwZVtdID1cbiAgICBDT05TVF9FWFBSKFtOZ0NsYXNzLCBOZ0ZvciwgTmdJZiwgTmdTdHlsZSwgTmdTd2l0Y2gsIE5nU3dpdGNoV2hlbiwgTmdTd2l0Y2hEZWZhdWx0XSk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tbW9uL2RpcmVjdGl2ZXMvY29yZV9kaXJlY3RpdmVzLnRzXG4gKiovIiwiLyoqXG4gKiBAbW9kdWxlXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoaXMgbW9kdWxlIGlzIHVzZWQgZm9yIGhhbmRsaW5nIHVzZXIgaW5wdXQsIGJ5IGRlZmluaW5nIGFuZCBidWlsZGluZyBhIHtAbGluayBDb250cm9sR3JvdXB9IHRoYXRcbiAqIGNvbnNpc3RzIG9mXG4gKiB7QGxpbmsgQ29udHJvbH0gb2JqZWN0cywgYW5kIG1hcHBpbmcgdGhlbSBvbnRvIHRoZSBET00uIHtAbGluayBDb250cm9sfSBvYmplY3RzIGNhbiB0aGVuIGJlIHVzZWRcbiAqIHRvIHJlYWQgaW5mb3JtYXRpb25cbiAqIGZyb20gdGhlIGZvcm0gRE9NIGVsZW1lbnRzLlxuICpcbiAqIFRoaXMgbW9kdWxlIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgYGFuZ3VsYXIyYCBtb2R1bGU7IHlvdSBtdXN0IGltcG9ydCB0aGUgZm9ybXMgbW9kdWxlXG4gKiBleHBsaWNpdGx5LlxuICpcbiAqL1xuZXhwb3J0IHtBYnN0cmFjdENvbnRyb2wsIENvbnRyb2wsIENvbnRyb2xHcm91cCwgQ29udHJvbEFycmF5fSBmcm9tICcuL2Zvcm1zL21vZGVsJztcblxuZXhwb3J0IHtBYnN0cmFjdENvbnRyb2xEaXJlY3RpdmV9IGZyb20gJy4vZm9ybXMvZGlyZWN0aXZlcy9hYnN0cmFjdF9jb250cm9sX2RpcmVjdGl2ZSc7XG5leHBvcnQge0Zvcm19IGZyb20gJy4vZm9ybXMvZGlyZWN0aXZlcy9mb3JtX2ludGVyZmFjZSc7XG5leHBvcnQge0NvbnRyb2xDb250YWluZXJ9IGZyb20gJy4vZm9ybXMvZGlyZWN0aXZlcy9jb250cm9sX2NvbnRhaW5lcic7XG5leHBvcnQge05nQ29udHJvbE5hbWV9IGZyb20gJy4vZm9ybXMvZGlyZWN0aXZlcy9uZ19jb250cm9sX25hbWUnO1xuZXhwb3J0IHtOZ0Zvcm1Db250cm9sfSBmcm9tICcuL2Zvcm1zL2RpcmVjdGl2ZXMvbmdfZm9ybV9jb250cm9sJztcbmV4cG9ydCB7TmdNb2RlbH0gZnJvbSAnLi9mb3Jtcy9kaXJlY3RpdmVzL25nX21vZGVsJztcbmV4cG9ydCB7TmdDb250cm9sfSBmcm9tICcuL2Zvcm1zL2RpcmVjdGl2ZXMvbmdfY29udHJvbCc7XG5leHBvcnQge05nQ29udHJvbEdyb3VwfSBmcm9tICcuL2Zvcm1zL2RpcmVjdGl2ZXMvbmdfY29udHJvbF9ncm91cCc7XG5leHBvcnQge05nRm9ybU1vZGVsfSBmcm9tICcuL2Zvcm1zL2RpcmVjdGl2ZXMvbmdfZm9ybV9tb2RlbCc7XG5leHBvcnQge05nRm9ybX0gZnJvbSAnLi9mb3Jtcy9kaXJlY3RpdmVzL25nX2Zvcm0nO1xuZXhwb3J0IHtDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1J9IGZyb20gJy4vZm9ybXMvZGlyZWN0aXZlcy9jb250cm9sX3ZhbHVlX2FjY2Vzc29yJztcbmV4cG9ydCB7RGVmYXVsdFZhbHVlQWNjZXNzb3J9IGZyb20gJy4vZm9ybXMvZGlyZWN0aXZlcy9kZWZhdWx0X3ZhbHVlX2FjY2Vzc29yJztcbmV4cG9ydCB7TmdDb250cm9sU3RhdHVzfSBmcm9tICcuL2Zvcm1zL2RpcmVjdGl2ZXMvbmdfY29udHJvbF9zdGF0dXMnO1xuZXhwb3J0IHtDaGVja2JveENvbnRyb2xWYWx1ZUFjY2Vzc29yfSBmcm9tICcuL2Zvcm1zL2RpcmVjdGl2ZXMvY2hlY2tib3hfdmFsdWVfYWNjZXNzb3InO1xuZXhwb3J0IHtcbiAgTmdTZWxlY3RPcHRpb24sXG4gIFNlbGVjdENvbnRyb2xWYWx1ZUFjY2Vzc29yXG59IGZyb20gJy4vZm9ybXMvZGlyZWN0aXZlcy9zZWxlY3RfY29udHJvbF92YWx1ZV9hY2Nlc3Nvcic7XG5leHBvcnQge0ZPUk1fRElSRUNUSVZFU30gZnJvbSAnLi9mb3Jtcy9kaXJlY3RpdmVzJztcbmV4cG9ydCB7TkdfVkFMSURBVE9SUywgTkdfQVNZTkNfVkFMSURBVE9SUywgVmFsaWRhdG9yc30gZnJvbSAnLi9mb3Jtcy92YWxpZGF0b3JzJztcbmV4cG9ydCB7XG4gIFJlcXVpcmVkVmFsaWRhdG9yLFxuICBNaW5MZW5ndGhWYWxpZGF0b3IsXG4gIE1heExlbmd0aFZhbGlkYXRvcixcbiAgVmFsaWRhdG9yXG59IGZyb20gJy4vZm9ybXMvZGlyZWN0aXZlcy92YWxpZGF0b3JzJztcbmV4cG9ydCB7Rm9ybUJ1aWxkZXIsIEZPUk1fUFJPVklERVJTLCBGT1JNX0JJTkRJTkdTfSBmcm9tICcuL2Zvcm1zL2Zvcm1fYnVpbGRlcic7XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbW1vbi9mb3Jtcy50c1xuICoqLyIsImltcG9ydCB7U3RyaW5nV3JhcHBlciwgaXNQcmVzZW50LCBpc0JsYW5rLCBub3JtYWxpemVCb29sfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtPYnNlcnZhYmxlLCBFdmVudEVtaXR0ZXIsIE9ic2VydmFibGVXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2FzeW5jJztcbmltcG9ydCB7UHJvbWlzZVdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvcHJvbWlzZSc7XG5pbXBvcnQge1N0cmluZ01hcFdyYXBwZXIsIExpc3RXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuXG4vKipcbiAqIEluZGljYXRlcyB0aGF0IGEgQ29udHJvbCBpcyB2YWxpZCwgaS5lLiB0aGF0IG5vIGVycm9ycyBleGlzdCBpbiB0aGUgaW5wdXQgdmFsdWUuXG4gKi9cbmV4cG9ydCBjb25zdCBWQUxJRCA9IFwiVkFMSURcIjtcblxuLyoqXG4gKiBJbmRpY2F0ZXMgdGhhdCBhIENvbnRyb2wgaXMgaW52YWxpZCwgaS5lLiB0aGF0IGFuIGVycm9yIGV4aXN0cyBpbiB0aGUgaW5wdXQgdmFsdWUuXG4gKi9cbmV4cG9ydCBjb25zdCBJTlZBTElEID0gXCJJTlZBTElEXCI7XG5cbi8qKlxuICogSW5kaWNhdGVzIHRoYXQgYSBDb250cm9sIGlzIHBlbmRpbmcsIGkuZS4gdGhhdCBhc3luYyB2YWxpZGF0aW9uIGlzIG9jY3VyaW5nIGFuZFxuICogZXJyb3JzIGFyZSBub3QgeWV0IGF2YWlsYWJsZSBmb3IgdGhlIGlucHV0IHZhbHVlLlxuICovXG5leHBvcnQgY29uc3QgUEVORElORyA9IFwiUEVORElOR1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNDb250cm9sKGNvbnRyb2w6IE9iamVjdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29udHJvbCBpbnN0YW5jZW9mIEFic3RyYWN0Q29udHJvbDtcbn1cblxuZnVuY3Rpb24gX2ZpbmQoY29udHJvbDogQWJzdHJhY3RDb250cm9sLCBwYXRoOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+fCBzdHJpbmcpIHtcbiAgaWYgKGlzQmxhbmsocGF0aCkpIHJldHVybiBudWxsO1xuXG4gIGlmICghKHBhdGggaW5zdGFuY2VvZiBBcnJheSkpIHtcbiAgICBwYXRoID0gKDxzdHJpbmc+cGF0aCkuc3BsaXQoXCIvXCIpO1xuICB9XG4gIGlmIChwYXRoIGluc3RhbmNlb2YgQXJyYXkgJiYgTGlzdFdyYXBwZXIuaXNFbXB0eShwYXRoKSkgcmV0dXJuIG51bGw7XG5cbiAgcmV0dXJuICg8QXJyYXk8c3RyaW5nIHwgbnVtYmVyPj5wYXRoKVxuICAgICAgLnJlZHVjZSgodiwgbmFtZSkgPT4ge1xuICAgICAgICBpZiAodiBpbnN0YW5jZW9mIENvbnRyb2xHcm91cCkge1xuICAgICAgICAgIHJldHVybiBpc1ByZXNlbnQodi5jb250cm9sc1tuYW1lXSkgPyB2LmNvbnRyb2xzW25hbWVdIDogbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmICh2IGluc3RhbmNlb2YgQ29udHJvbEFycmF5KSB7XG4gICAgICAgICAgdmFyIGluZGV4ID0gPG51bWJlcj5uYW1lO1xuICAgICAgICAgIHJldHVybiBpc1ByZXNlbnQodi5hdChpbmRleCkpID8gdi5hdChpbmRleCkgOiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9LCBjb250cm9sKTtcbn1cblxuZnVuY3Rpb24gdG9PYnNlcnZhYmxlKHI6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gIHJldHVybiBQcm9taXNlV3JhcHBlci5pc1Byb21pc2UocikgPyBPYnNlcnZhYmxlV3JhcHBlci5mcm9tUHJvbWlzZShyKSA6IHI7XG59XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29udHJvbCB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3ZhbHVlOiBhbnk7XG5cbiAgcHJpdmF0ZSBfdmFsdWVDaGFuZ2VzOiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgcHJpdmF0ZSBfc3RhdHVzQ2hhbmdlczogRXZlbnRFbWl0dGVyPGFueT47XG4gIHByaXZhdGUgX3N0YXR1czogc3RyaW5nO1xuICBwcml2YXRlIF9lcnJvcnM6IHtba2V5OiBzdHJpbmddOiBhbnl9O1xuICBwcml2YXRlIF9wcmlzdGluZTogYm9vbGVhbiA9IHRydWU7XG4gIHByaXZhdGUgX3RvdWNoZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfcGFyZW50OiBDb250cm9sR3JvdXAgfCBDb250cm9sQXJyYXk7XG4gIHByaXZhdGUgX2FzeW5jVmFsaWRhdGlvblN1YnNjcmlwdGlvbjtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgdmFsaWRhdG9yOiBGdW5jdGlvbiwgcHVibGljIGFzeW5jVmFsaWRhdG9yOiBGdW5jdGlvbikge31cblxuICBnZXQgdmFsdWUoKTogYW55IHsgcmV0dXJuIHRoaXMuX3ZhbHVlOyB9XG5cbiAgZ2V0IHN0YXR1cygpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fc3RhdHVzOyB9XG5cbiAgZ2V0IHZhbGlkKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fc3RhdHVzID09PSBWQUxJRDsgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBlcnJvcnMgb2YgdGhpcyBjb250cm9sLlxuICAgKi9cbiAgZ2V0IGVycm9ycygpOiB7W2tleTogc3RyaW5nXTogYW55fSB7IHJldHVybiB0aGlzLl9lcnJvcnM7IH1cblxuICBnZXQgcHJpc3RpbmUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9wcmlzdGluZTsgfVxuXG4gIGdldCBkaXJ0eSgpOiBib29sZWFuIHsgcmV0dXJuICF0aGlzLnByaXN0aW5lOyB9XG5cbiAgZ2V0IHRvdWNoZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl90b3VjaGVkOyB9XG5cbiAgZ2V0IHVudG91Y2hlZCgpOiBib29sZWFuIHsgcmV0dXJuICF0aGlzLl90b3VjaGVkOyB9XG5cbiAgZ2V0IHZhbHVlQ2hhbmdlcygpOiBPYnNlcnZhYmxlPGFueT4geyByZXR1cm4gdGhpcy5fdmFsdWVDaGFuZ2VzOyB9XG5cbiAgZ2V0IHN0YXR1c0NoYW5nZXMoKTogT2JzZXJ2YWJsZTxhbnk+IHsgcmV0dXJuIHRoaXMuX3N0YXR1c0NoYW5nZXM7IH1cblxuICBnZXQgcGVuZGluZygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX3N0YXR1cyA9PSBQRU5ESU5HOyB9XG5cbiAgbWFya0FzVG91Y2hlZCgpOiB2b2lkIHsgdGhpcy5fdG91Y2hlZCA9IHRydWU7IH1cblxuICBtYXJrQXNEaXJ0eSh7b25seVNlbGZ9OiB7b25seVNlbGY/OiBib29sZWFufSA9IHt9KTogdm9pZCB7XG4gICAgb25seVNlbGYgPSBub3JtYWxpemVCb29sKG9ubHlTZWxmKTtcbiAgICB0aGlzLl9wcmlzdGluZSA9IGZhbHNlO1xuXG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLl9wYXJlbnQpICYmICFvbmx5U2VsZikge1xuICAgICAgdGhpcy5fcGFyZW50Lm1hcmtBc0RpcnR5KHtvbmx5U2VsZjogb25seVNlbGZ9KTtcbiAgICB9XG4gIH1cblxuICBtYXJrQXNQZW5kaW5nKHtvbmx5U2VsZn06IHtvbmx5U2VsZj86IGJvb2xlYW59ID0ge30pOiB2b2lkIHtcbiAgICBvbmx5U2VsZiA9IG5vcm1hbGl6ZUJvb2wob25seVNlbGYpO1xuICAgIHRoaXMuX3N0YXR1cyA9IFBFTkRJTkc7XG5cbiAgICBpZiAoaXNQcmVzZW50KHRoaXMuX3BhcmVudCkgJiYgIW9ubHlTZWxmKSB7XG4gICAgICB0aGlzLl9wYXJlbnQubWFya0FzUGVuZGluZyh7b25seVNlbGY6IG9ubHlTZWxmfSk7XG4gICAgfVxuICB9XG5cbiAgc2V0UGFyZW50KHBhcmVudDogQ29udHJvbEdyb3VwIHwgQ29udHJvbEFycmF5KTogdm9pZCB7IHRoaXMuX3BhcmVudCA9IHBhcmVudDsgfVxuXG4gIHVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoXG4gICAgICB7b25seVNlbGYsIGVtaXRFdmVudH06IHtvbmx5U2VsZj86IGJvb2xlYW4sIGVtaXRFdmVudD86IGJvb2xlYW59ID0ge30pOiB2b2lkIHtcbiAgICBvbmx5U2VsZiA9IG5vcm1hbGl6ZUJvb2wob25seVNlbGYpO1xuICAgIGVtaXRFdmVudCA9IGlzUHJlc2VudChlbWl0RXZlbnQpID8gZW1pdEV2ZW50IDogdHJ1ZTtcblxuICAgIHRoaXMuX3VwZGF0ZVZhbHVlKCk7XG5cbiAgICB0aGlzLl9lcnJvcnMgPSB0aGlzLl9ydW5WYWxpZGF0b3IoKTtcbiAgICB0aGlzLl9zdGF0dXMgPSB0aGlzLl9jYWxjdWxhdGVTdGF0dXMoKTtcblxuICAgIGlmICh0aGlzLl9zdGF0dXMgPT0gVkFMSUQgfHwgdGhpcy5fc3RhdHVzID09IFBFTkRJTkcpIHtcbiAgICAgIHRoaXMuX3J1bkFzeW5jVmFsaWRhdG9yKGVtaXRFdmVudCk7XG4gICAgfVxuXG4gICAgaWYgKGVtaXRFdmVudCkge1xuICAgICAgT2JzZXJ2YWJsZVdyYXBwZXIuY2FsbEVtaXQodGhpcy5fdmFsdWVDaGFuZ2VzLCB0aGlzLl92YWx1ZSk7XG4gICAgICBPYnNlcnZhYmxlV3JhcHBlci5jYWxsRW1pdCh0aGlzLl9zdGF0dXNDaGFuZ2VzLCB0aGlzLl9zdGF0dXMpO1xuICAgIH1cblxuICAgIGlmIChpc1ByZXNlbnQodGhpcy5fcGFyZW50KSAmJiAhb25seVNlbGYpIHtcbiAgICAgIHRoaXMuX3BhcmVudC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtvbmx5U2VsZjogb25seVNlbGYsIGVtaXRFdmVudDogZW1pdEV2ZW50fSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcnVuVmFsaWRhdG9yKCkgeyByZXR1cm4gaXNQcmVzZW50KHRoaXMudmFsaWRhdG9yKSA/IHRoaXMudmFsaWRhdG9yKHRoaXMpIDogbnVsbDsgfVxuXG4gIHByaXZhdGUgX3J1bkFzeW5jVmFsaWRhdG9yKGVtaXRFdmVudDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChpc1ByZXNlbnQodGhpcy5hc3luY1ZhbGlkYXRvcikpIHtcbiAgICAgIHRoaXMuX3N0YXR1cyA9IFBFTkRJTkc7XG4gICAgICB0aGlzLl9jYW5jZWxFeGlzdGluZ1N1YnNjcmlwdGlvbigpO1xuICAgICAgdmFyIG9icyA9IHRvT2JzZXJ2YWJsZSh0aGlzLmFzeW5jVmFsaWRhdG9yKHRoaXMpKTtcbiAgICAgIHRoaXMuX2FzeW5jVmFsaWRhdGlvblN1YnNjcmlwdGlvbiA9XG4gICAgICAgICAgT2JzZXJ2YWJsZVdyYXBwZXIuc3Vic2NyaWJlKG9icywgcmVzID0+IHRoaXMuc2V0RXJyb3JzKHJlcywge2VtaXRFdmVudDogZW1pdEV2ZW50fSkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2NhbmNlbEV4aXN0aW5nU3Vic2NyaXB0aW9uKCk6IHZvaWQge1xuICAgIGlmIChpc1ByZXNlbnQodGhpcy5fYXN5bmNWYWxpZGF0aW9uU3Vic2NyaXB0aW9uKSkge1xuICAgICAgT2JzZXJ2YWJsZVdyYXBwZXIuZGlzcG9zZSh0aGlzLl9hc3luY1ZhbGlkYXRpb25TdWJzY3JpcHRpb24pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGVycm9ycyBvbiBhIGNvbnRyb2wuXG4gICAqXG4gICAqIFRoaXMgaXMgdXNlZCB3aGVuIHZhbGlkYXRpb25zIGFyZSBydW4gbm90IGF1dG9tYXRpY2FsbHksIGJ1dCBtYW51YWxseSBieSB0aGUgdXNlci5cbiAgICpcbiAgICogQ2FsbGluZyBgc2V0RXJyb3JzYCB3aWxsIGFsc28gdXBkYXRlIHRoZSB2YWxpZGl0eSBvZiB0aGUgcGFyZW50IGNvbnRyb2wuXG4gICAqXG4gICAqICMjIFVzYWdlXG4gICAqXG4gICAqIGBgYFxuICAgKiB2YXIgbG9naW4gPSBuZXcgQ29udHJvbChcInNvbWVMb2dpblwiKTtcbiAgICogbG9naW4uc2V0RXJyb3JzKHtcbiAgICogICBcIm5vdFVuaXF1ZVwiOiB0cnVlXG4gICAqIH0pO1xuICAgKlxuICAgKiBleHBlY3QobG9naW4udmFsaWQpLnRvRXF1YWwoZmFsc2UpO1xuICAgKiBleHBlY3QobG9naW4uZXJyb3JzKS50b0VxdWFsKHtcIm5vdFVuaXF1ZVwiOiB0cnVlfSk7XG4gICAqXG4gICAqIGxvZ2luLnVwZGF0ZVZhbHVlKFwic29tZU90aGVyTG9naW5cIik7XG4gICAqXG4gICAqIGV4cGVjdChsb2dpbi52YWxpZCkudG9FcXVhbCh0cnVlKTtcbiAgICogYGBgXG4gICAqL1xuICBzZXRFcnJvcnMoZXJyb3JzOiB7W2tleTogc3RyaW5nXTogYW55fSwge2VtaXRFdmVudH06IHtlbWl0RXZlbnQ/OiBib29sZWFufSA9IHt9KTogdm9pZCB7XG4gICAgZW1pdEV2ZW50ID0gaXNQcmVzZW50KGVtaXRFdmVudCkgPyBlbWl0RXZlbnQgOiB0cnVlO1xuXG4gICAgdGhpcy5fZXJyb3JzID0gZXJyb3JzO1xuICAgIHRoaXMuX3N0YXR1cyA9IHRoaXMuX2NhbGN1bGF0ZVN0YXR1cygpO1xuXG4gICAgaWYgKGVtaXRFdmVudCkge1xuICAgICAgT2JzZXJ2YWJsZVdyYXBwZXIuY2FsbEVtaXQodGhpcy5fc3RhdHVzQ2hhbmdlcywgdGhpcy5fc3RhdHVzKTtcbiAgICB9XG5cbiAgICBpZiAoaXNQcmVzZW50KHRoaXMuX3BhcmVudCkpIHtcbiAgICAgIHRoaXMuX3BhcmVudC5fdXBkYXRlQ29udHJvbHNFcnJvcnMoKTtcbiAgICB9XG4gIH1cblxuICBmaW5kKHBhdGg6IEFycmF5PHN0cmluZyB8IG51bWJlcj58IHN0cmluZyk6IEFic3RyYWN0Q29udHJvbCB7IHJldHVybiBfZmluZCh0aGlzLCBwYXRoKTsgfVxuXG4gIGdldEVycm9yKGVycm9yQ29kZTogc3RyaW5nLCBwYXRoOiBzdHJpbmdbXSA9IG51bGwpOiBhbnkge1xuICAgIHZhciBjb250cm9sID0gaXNQcmVzZW50KHBhdGgpICYmICFMaXN0V3JhcHBlci5pc0VtcHR5KHBhdGgpID8gdGhpcy5maW5kKHBhdGgpIDogdGhpcztcbiAgICBpZiAoaXNQcmVzZW50KGNvbnRyb2wpICYmIGlzUHJlc2VudChjb250cm9sLl9lcnJvcnMpKSB7XG4gICAgICByZXR1cm4gU3RyaW5nTWFwV3JhcHBlci5nZXQoY29udHJvbC5fZXJyb3JzLCBlcnJvckNvZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBoYXNFcnJvcihlcnJvckNvZGU6IHN0cmluZywgcGF0aDogc3RyaW5nW10gPSBudWxsKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzUHJlc2VudCh0aGlzLmdldEVycm9yKGVycm9yQ29kZSwgcGF0aCkpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfdXBkYXRlQ29udHJvbHNFcnJvcnMoKTogdm9pZCB7XG4gICAgdGhpcy5fc3RhdHVzID0gdGhpcy5fY2FsY3VsYXRlU3RhdHVzKCk7XG5cbiAgICBpZiAoaXNQcmVzZW50KHRoaXMuX3BhcmVudCkpIHtcbiAgICAgIHRoaXMuX3BhcmVudC5fdXBkYXRlQ29udHJvbHNFcnJvcnMoKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9pbml0T2JzZXJ2YWJsZXMoKSB7XG4gICAgdGhpcy5fdmFsdWVDaGFuZ2VzID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuX3N0YXR1c0NoYW5nZXMgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIH1cblxuXG4gIHByaXZhdGUgX2NhbGN1bGF0ZVN0YXR1cygpOiBzdHJpbmcge1xuICAgIGlmIChpc1ByZXNlbnQodGhpcy5fZXJyb3JzKSkgcmV0dXJuIElOVkFMSUQ7XG4gICAgaWYgKHRoaXMuX2FueUNvbnRyb2xzSGF2ZVN0YXR1cyhQRU5ESU5HKSkgcmV0dXJuIFBFTkRJTkc7XG4gICAgaWYgKHRoaXMuX2FueUNvbnRyb2xzSGF2ZVN0YXR1cyhJTlZBTElEKSkgcmV0dXJuIElOVkFMSUQ7XG4gICAgcmV0dXJuIFZBTElEO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBhYnN0cmFjdCBfdXBkYXRlVmFsdWUoKTogdm9pZDtcblxuICAvKiogQGludGVybmFsICovXG4gIGFic3RyYWN0IF9hbnlDb250cm9sc0hhdmVTdGF0dXMoc3RhdHVzOiBzdHJpbmcpOiBib29sZWFuO1xufVxuXG4vKipcbiAqIERlZmluZXMgYSBwYXJ0IG9mIGEgZm9ybSB0aGF0IGNhbm5vdCBiZSBkaXZpZGVkIGludG8gb3RoZXIgY29udHJvbHMuIGBDb250cm9sYHMgaGF2ZSB2YWx1ZXMgYW5kXG4gKiB2YWxpZGF0aW9uIHN0YXRlLCB3aGljaCBpcyBkZXRlcm1pbmVkIGJ5IGFuIG9wdGlvbmFsIHZhbGlkYXRpb24gZnVuY3Rpb24uXG4gKlxuICogYENvbnRyb2xgIGlzIG9uZSBvZiB0aGUgdGhyZWUgZnVuZGFtZW50YWwgYnVpbGRpbmcgYmxvY2tzIHVzZWQgdG8gZGVmaW5lIGZvcm1zIGluIEFuZ3VsYXIsIGFsb25nXG4gKiB3aXRoIHtAbGluayBDb250cm9sR3JvdXB9IGFuZCB7QGxpbmsgQ29udHJvbEFycmF5fS5cbiAqXG4gKiAjIyBVc2FnZVxuICpcbiAqIEJ5IGRlZmF1bHQsIGEgYENvbnRyb2xgIGlzIGNyZWF0ZWQgZm9yIGV2ZXJ5IGA8aW5wdXQ+YCBvciBvdGhlciBmb3JtIGNvbXBvbmVudC5cbiAqIFdpdGgge0BsaW5rIE5nRm9ybUNvbnRyb2x9IG9yIHtAbGluayBOZ0Zvcm1Nb2RlbH0gYW4gZXhpc3Rpbmcge0BsaW5rIENvbnRyb2x9IGNhbiBiZVxuICogYm91bmQgdG8gYSBET00gZWxlbWVudCBpbnN0ZWFkLiBUaGlzIGBDb250cm9sYCBjYW4gYmUgY29uZmlndXJlZCB3aXRoIGEgY3VzdG9tXG4gKiB2YWxpZGF0aW9uIGZ1bmN0aW9uLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC8yM0RFU09wYk5uQnBCSFp0MUJSND9wPXByZXZpZXcpKVxuICovXG5leHBvcnQgY2xhc3MgQ29udHJvbCBleHRlbmRzIEFic3RyYWN0Q29udHJvbCB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX29uQ2hhbmdlOiBGdW5jdGlvbjtcblxuICBjb25zdHJ1Y3Rvcih2YWx1ZTogYW55ID0gbnVsbCwgdmFsaWRhdG9yOiBGdW5jdGlvbiA9IG51bGwsIGFzeW5jVmFsaWRhdG9yOiBGdW5jdGlvbiA9IG51bGwpIHtcbiAgICBzdXBlcih2YWxpZGF0b3IsIGFzeW5jVmFsaWRhdG9yKTtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7b25seVNlbGY6IHRydWUsIGVtaXRFdmVudDogZmFsc2V9KTtcbiAgICB0aGlzLl9pbml0T2JzZXJ2YWJsZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBjb250cm9sIHRvIGB2YWx1ZWAuXG4gICAqXG4gICAqIElmIGBvbmx5U2VsZmAgaXMgYHRydWVgLCB0aGlzIGNoYW5nZSB3aWxsIG9ubHkgYWZmZWN0IHRoZSB2YWxpZGF0aW9uIG9mIHRoaXMgYENvbnRyb2xgXG4gICAqIGFuZCBub3QgaXRzIHBhcmVudCBjb21wb25lbnQuIElmIGBlbWl0RXZlbnRgIGlzIGB0cnVlYCwgdGhpcyBjaGFuZ2Ugd2lsbCBjYXVzZSBhXG4gICAqIGB2YWx1ZUNoYW5nZXNgIGV2ZW50IG9uIHRoZSBgQ29udHJvbGAgdG8gYmUgZW1pdHRlZC4gQm90aCBvZiB0aGVzZSBvcHRpb25zIGRlZmF1bHQgdG9cbiAgICogYGZhbHNlYC5cbiAgICpcbiAgICogSWYgYGVtaXRNb2RlbFRvVmlld0NoYW5nZWAgaXMgYHRydWVgLCB0aGUgdmlldyB3aWxsIGJlIG5vdGlmaWVkIGFib3V0IHRoZSBuZXcgdmFsdWVcbiAgICogdmlhIGFuIGBvbkNoYW5nZWAgZXZlbnQuIFRoaXMgaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaWYgYGVtaXRNb2RlbFRvVmlld0NoYW5nZWAgaXMgbm90XG4gICAqIHNwZWNpZmllZC5cbiAgICovXG4gIHVwZGF0ZVZhbHVlKHZhbHVlOiBhbnksIHtvbmx5U2VsZiwgZW1pdEV2ZW50LCBlbWl0TW9kZWxUb1ZpZXdDaGFuZ2V9OiB7XG4gICAgb25seVNlbGY/OiBib29sZWFuLFxuICAgIGVtaXRFdmVudD86IGJvb2xlYW4sXG4gICAgZW1pdE1vZGVsVG9WaWV3Q2hhbmdlPzogYm9vbGVhblxuICB9ID0ge30pOiB2b2lkIHtcbiAgICBlbWl0TW9kZWxUb1ZpZXdDaGFuZ2UgPSBpc1ByZXNlbnQoZW1pdE1vZGVsVG9WaWV3Q2hhbmdlKSA/IGVtaXRNb2RlbFRvVmlld0NoYW5nZSA6IHRydWU7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICBpZiAoaXNQcmVzZW50KHRoaXMuX29uQ2hhbmdlKSAmJiBlbWl0TW9kZWxUb1ZpZXdDaGFuZ2UpIHRoaXMuX29uQ2hhbmdlKHRoaXMuX3ZhbHVlKTtcbiAgICB0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoe29ubHlTZWxmOiBvbmx5U2VsZiwgZW1pdEV2ZW50OiBlbWl0RXZlbnR9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF91cGRhdGVWYWx1ZSgpIHt9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX2FueUNvbnRyb2xzSGF2ZVN0YXR1cyhzdGF0dXM6IHN0cmluZyk6IGJvb2xlYW4geyByZXR1cm4gZmFsc2U7IH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBsaXN0ZW5lciBmb3IgY2hhbmdlIGV2ZW50cy5cbiAgICovXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IEZ1bmN0aW9uKTogdm9pZCB7IHRoaXMuX29uQ2hhbmdlID0gZm47IH1cbn1cblxuLyoqXG4gKiBEZWZpbmVzIGEgcGFydCBvZiBhIGZvcm0sIG9mIGZpeGVkIGxlbmd0aCwgdGhhdCBjYW4gY29udGFpbiBvdGhlciBjb250cm9scy5cbiAqXG4gKiBBIGBDb250cm9sR3JvdXBgIGFnZ3JlZ2F0ZXMgdGhlIHZhbHVlcyBhbmQgZXJyb3JzIG9mIGVhY2gge0BsaW5rIENvbnRyb2x9IGluIHRoZSBncm91cC4gVGh1cywgaWZcbiAqIG9uZSBvZiB0aGUgY29udHJvbHMgaW4gYSBncm91cCBpcyBpbnZhbGlkLCB0aGUgZW50aXJlIGdyb3VwIGlzIGludmFsaWQuIFNpbWlsYXJseSwgaWYgYSBjb250cm9sXG4gKiBjaGFuZ2VzIGl0cyB2YWx1ZSwgdGhlIGVudGlyZSBncm91cCBjaGFuZ2VzIGFzIHdlbGwuXG4gKlxuICogYENvbnRyb2xHcm91cGAgaXMgb25lIG9mIHRoZSB0aHJlZSBmdW5kYW1lbnRhbCBidWlsZGluZyBibG9ja3MgdXNlZCB0byBkZWZpbmUgZm9ybXMgaW4gQW5ndWxhcixcbiAqIGFsb25nIHdpdGgge0BsaW5rIENvbnRyb2x9IGFuZCB7QGxpbmsgQ29udHJvbEFycmF5fS4ge0BsaW5rIENvbnRyb2xBcnJheX0gY2FuIGFsc28gY29udGFpbiBvdGhlclxuICogY29udHJvbHMsIGJ1dCBpcyBvZiB2YXJpYWJsZSBsZW5ndGguXG4gKlxuICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0LzIzREVTT3BiTm5CcEJIWnQxQlI0P3A9cHJldmlldykpXG4gKi9cbmV4cG9ydCBjbGFzcyBDb250cm9sR3JvdXAgZXh0ZW5kcyBBYnN0cmFjdENvbnRyb2wge1xuICBwcml2YXRlIF9vcHRpb25hbHM6IHtba2V5OiBzdHJpbmddOiBib29sZWFufTtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgY29udHJvbHM6IHtba2V5OiBzdHJpbmddOiBBYnN0cmFjdENvbnRyb2x9LFxuICAgICAgICAgICAgICBvcHRpb25hbHM6IHtba2V5OiBzdHJpbmddOiBib29sZWFufSA9IG51bGwsIHZhbGlkYXRvcjogRnVuY3Rpb24gPSBudWxsLFxuICAgICAgICAgICAgICBhc3luY1ZhbGlkYXRvcjogRnVuY3Rpb24gPSBudWxsKSB7XG4gICAgc3VwZXIodmFsaWRhdG9yLCBhc3luY1ZhbGlkYXRvcik7XG4gICAgdGhpcy5fb3B0aW9uYWxzID0gaXNQcmVzZW50KG9wdGlvbmFscykgPyBvcHRpb25hbHMgOiB7fTtcbiAgICB0aGlzLl9pbml0T2JzZXJ2YWJsZXMoKTtcbiAgICB0aGlzLl9zZXRQYXJlbnRGb3JDb250cm9scygpO1xuICAgIHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7b25seVNlbGY6IHRydWUsIGVtaXRFdmVudDogZmFsc2V9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBjb250cm9sIHRvIHRoaXMgZ3JvdXAuXG4gICAqL1xuICBhZGRDb250cm9sKG5hbWU6IHN0cmluZywgY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9sc1tuYW1lXSA9IGNvbnRyb2w7XG4gICAgY29udHJvbC5zZXRQYXJlbnQodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgY29udHJvbCBmcm9tIHRoaXMgZ3JvdXAuXG4gICAqL1xuICByZW1vdmVDb250cm9sKG5hbWU6IHN0cmluZyk6IHZvaWQgeyBTdHJpbmdNYXBXcmFwcGVyLmRlbGV0ZSh0aGlzLmNvbnRyb2xzLCBuYW1lKTsgfVxuXG4gIC8qKlxuICAgKiBNYXJrIHRoZSBuYW1lZCBjb250cm9sIGFzIG5vbi1vcHRpb25hbC5cbiAgICovXG4gIGluY2x1ZGUoY29udHJvbE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIFN0cmluZ01hcFdyYXBwZXIuc2V0KHRoaXMuX29wdGlvbmFscywgY29udHJvbE5hbWUsIHRydWUpO1xuICAgIHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcmsgdGhlIG5hbWVkIGNvbnRyb2wgYXMgb3B0aW9uYWwuXG4gICAqL1xuICBleGNsdWRlKGNvbnRyb2xOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBTdHJpbmdNYXBXcmFwcGVyLnNldCh0aGlzLl9vcHRpb25hbHMsIGNvbnRyb2xOYW1lLCBmYWxzZSk7XG4gICAgdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgd2hldGhlciB0aGVyZSBpcyBhIGNvbnRyb2wgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpbiB0aGUgZ3JvdXAuXG4gICAqL1xuICBjb250YWlucyhjb250cm9sTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdmFyIGMgPSBTdHJpbmdNYXBXcmFwcGVyLmNvbnRhaW5zKHRoaXMuY29udHJvbHMsIGNvbnRyb2xOYW1lKTtcbiAgICByZXR1cm4gYyAmJiB0aGlzLl9pbmNsdWRlZChjb250cm9sTmFtZSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9zZXRQYXJlbnRGb3JDb250cm9scygpIHtcbiAgICBTdHJpbmdNYXBXcmFwcGVyLmZvckVhY2godGhpcy5jb250cm9scywgKGNvbnRyb2wsIG5hbWUpID0+IHsgY29udHJvbC5zZXRQYXJlbnQodGhpcyk7IH0pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfdXBkYXRlVmFsdWUoKSB7IHRoaXMuX3ZhbHVlID0gdGhpcy5fcmVkdWNlVmFsdWUoKTsgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2FueUNvbnRyb2xzSGF2ZVN0YXR1cyhzdGF0dXM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHZhciByZXMgPSBmYWxzZTtcbiAgICBTdHJpbmdNYXBXcmFwcGVyLmZvckVhY2godGhpcy5jb250cm9scywgKGNvbnRyb2wsIG5hbWUpID0+IHtcbiAgICAgIHJlcyA9IHJlcyB8fCAodGhpcy5jb250YWlucyhuYW1lKSAmJiBjb250cm9sLnN0YXR1cyA9PSBzdGF0dXMpO1xuICAgIH0pO1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9yZWR1Y2VWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVkdWNlQ2hpbGRyZW4oe30sIChhY2MsIGNvbnRyb2wsIG5hbWUpID0+IHtcbiAgICAgIGFjY1tuYW1lXSA9IGNvbnRyb2wudmFsdWU7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcmVkdWNlQ2hpbGRyZW4oaW5pdFZhbHVlOiBhbnksIGZuOiBGdW5jdGlvbikge1xuICAgIHZhciByZXMgPSBpbml0VmFsdWU7XG4gICAgU3RyaW5nTWFwV3JhcHBlci5mb3JFYWNoKHRoaXMuY29udHJvbHMsIChjb250cm9sLCBuYW1lKSA9PiB7XG4gICAgICBpZiAodGhpcy5faW5jbHVkZWQobmFtZSkpIHtcbiAgICAgICAgcmVzID0gZm4ocmVzLCBjb250cm9sLCBuYW1lKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfaW5jbHVkZWQoY29udHJvbE5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHZhciBpc09wdGlvbmFsID0gU3RyaW5nTWFwV3JhcHBlci5jb250YWlucyh0aGlzLl9vcHRpb25hbHMsIGNvbnRyb2xOYW1lKTtcbiAgICByZXR1cm4gIWlzT3B0aW9uYWwgfHwgU3RyaW5nTWFwV3JhcHBlci5nZXQodGhpcy5fb3B0aW9uYWxzLCBjb250cm9sTmFtZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEZWZpbmVzIGEgcGFydCBvZiBhIGZvcm0sIG9mIHZhcmlhYmxlIGxlbmd0aCwgdGhhdCBjYW4gY29udGFpbiBvdGhlciBjb250cm9scy5cbiAqXG4gKiBBIGBDb250cm9sQXJyYXlgIGFnZ3JlZ2F0ZXMgdGhlIHZhbHVlcyBhbmQgZXJyb3JzIG9mIGVhY2gge0BsaW5rIENvbnRyb2x9IGluIHRoZSBncm91cC4gVGh1cywgaWZcbiAqIG9uZSBvZiB0aGUgY29udHJvbHMgaW4gYSBncm91cCBpcyBpbnZhbGlkLCB0aGUgZW50aXJlIGdyb3VwIGlzIGludmFsaWQuIFNpbWlsYXJseSwgaWYgYSBjb250cm9sXG4gKiBjaGFuZ2VzIGl0cyB2YWx1ZSwgdGhlIGVudGlyZSBncm91cCBjaGFuZ2VzIGFzIHdlbGwuXG4gKlxuICogYENvbnRyb2xBcnJheWAgaXMgb25lIG9mIHRoZSB0aHJlZSBmdW5kYW1lbnRhbCBidWlsZGluZyBibG9ja3MgdXNlZCB0byBkZWZpbmUgZm9ybXMgaW4gQW5ndWxhcixcbiAqIGFsb25nIHdpdGgge0BsaW5rIENvbnRyb2x9IGFuZCB7QGxpbmsgQ29udHJvbEdyb3VwfS4ge0BsaW5rIENvbnRyb2xHcm91cH0gY2FuIGFsc28gY29udGFpblxuICogb3RoZXIgY29udHJvbHMsIGJ1dCBpcyBvZiBmaXhlZCBsZW5ndGguXG4gKlxuICogIyMgQWRkaW5nIG9yIHJlbW92aW5nIGNvbnRyb2xzXG4gKlxuICogVG8gY2hhbmdlIHRoZSBjb250cm9scyBpbiB0aGUgYXJyYXksIHVzZSB0aGUgYHB1c2hgLCBgaW5zZXJ0YCwgb3IgYHJlbW92ZUF0YCBtZXRob2RzXG4gKiBpbiBgQ29udHJvbEFycmF5YCBpdHNlbGYuIFRoZXNlIG1ldGhvZHMgZW5zdXJlIHRoZSBjb250cm9scyBhcmUgcHJvcGVybHkgdHJhY2tlZCBpbiB0aGVcbiAqIGZvcm0ncyBoaWVyYXJjaHkuIERvIG5vdCBtb2RpZnkgdGhlIGFycmF5IG9mIGBBYnN0cmFjdENvbnRyb2xgcyB1c2VkIHRvIGluc3RhbnRpYXRlXG4gKiB0aGUgYENvbnRyb2xBcnJheWAgZGlyZWN0bHksIGFzIHRoYXQgd2lsbCByZXN1bHQgaW4gc3RyYW5nZSBhbmQgdW5leHBlY3RlZCBiZWhhdmlvciBzdWNoXG4gKiBhcyBicm9rZW4gY2hhbmdlIGRldGVjdGlvbi5cbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvMjNERVNPcGJObkJwQkhadDFCUjQ/cD1wcmV2aWV3KSlcbiAqL1xuZXhwb3J0IGNsYXNzIENvbnRyb2xBcnJheSBleHRlbmRzIEFic3RyYWN0Q29udHJvbCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250cm9sczogQWJzdHJhY3RDb250cm9sW10sIHZhbGlkYXRvcjogRnVuY3Rpb24gPSBudWxsLFxuICAgICAgICAgICAgICBhc3luY1ZhbGlkYXRvcjogRnVuY3Rpb24gPSBudWxsKSB7XG4gICAgc3VwZXIodmFsaWRhdG9yLCBhc3luY1ZhbGlkYXRvcik7XG4gICAgdGhpcy5faW5pdE9ic2VydmFibGVzKCk7XG4gICAgdGhpcy5fc2V0UGFyZW50Rm9yQ29udHJvbHMoKTtcbiAgICB0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoe29ubHlTZWxmOiB0cnVlLCBlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB7QGxpbmsgQWJzdHJhY3RDb250cm9sfSBhdCB0aGUgZ2l2ZW4gYGluZGV4YCBpbiB0aGUgYXJyYXkuXG4gICAqL1xuICBhdChpbmRleDogbnVtYmVyKTogQWJzdHJhY3RDb250cm9sIHsgcmV0dXJuIHRoaXMuY29udHJvbHNbaW5kZXhdOyB9XG5cbiAgLyoqXG4gICAqIEluc2VydCBhIG5ldyB7QGxpbmsgQWJzdHJhY3RDb250cm9sfSBhdCB0aGUgZW5kIG9mIHRoZSBhcnJheS5cbiAgICovXG4gIHB1c2goY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9scy5wdXNoKGNvbnRyb2wpO1xuICAgIGNvbnRyb2wuc2V0UGFyZW50KHRoaXMpO1xuICAgIHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydCBhIG5ldyB7QGxpbmsgQWJzdHJhY3RDb250cm9sfSBhdCB0aGUgZ2l2ZW4gYGluZGV4YCBpbiB0aGUgYXJyYXkuXG4gICAqL1xuICBpbnNlcnQoaW5kZXg6IG51bWJlciwgY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogdm9pZCB7XG4gICAgTGlzdFdyYXBwZXIuaW5zZXJ0KHRoaXMuY29udHJvbHMsIGluZGV4LCBjb250cm9sKTtcbiAgICBjb250cm9sLnNldFBhcmVudCh0aGlzKTtcbiAgICB0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdGhlIGNvbnRyb2wgYXQgdGhlIGdpdmVuIGBpbmRleGAgaW4gdGhlIGFycmF5LlxuICAgKi9cbiAgcmVtb3ZlQXQoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIExpc3RXcmFwcGVyLnJlbW92ZUF0KHRoaXMuY29udHJvbHMsIGluZGV4KTtcbiAgICB0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMZW5ndGggb2YgdGhlIGNvbnRyb2wgYXJyYXkuXG4gICAqL1xuICBnZXQgbGVuZ3RoKCk6IG51bWJlciB7IHJldHVybiB0aGlzLmNvbnRyb2xzLmxlbmd0aDsgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3VwZGF0ZVZhbHVlKCk6IHZvaWQgeyB0aGlzLl92YWx1ZSA9IHRoaXMuY29udHJvbHMubWFwKChjb250cm9sKSA9PiBjb250cm9sLnZhbHVlKTsgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2FueUNvbnRyb2xzSGF2ZVN0YXR1cyhzdGF0dXM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbnRyb2xzLnNvbWUoYyA9PiBjLnN0YXR1cyA9PSBzdGF0dXMpO1xuICB9XG5cblxuICAvKiogQGludGVybmFsICovXG4gIF9zZXRQYXJlbnRGb3JDb250cm9scygpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2wpID0+IHsgY29udHJvbC5zZXRQYXJlbnQodGhpcyk7IH0pO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tbW9uL2Zvcm1zL21vZGVsLnRzXG4gKiovIiwiaW1wb3J0IHtBYnN0cmFjdENvbnRyb2x9IGZyb20gJy4uL21vZGVsJztcbmltcG9ydCB7aXNQcmVzZW50fSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHt1bmltcGxlbWVudGVkfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGNvbnRyb2wgZGlyZWN0aXZlcy5cbiAqXG4gKiBPbmx5IHVzZWQgaW50ZXJuYWxseSBpbiB0aGUgZm9ybXMgbW9kdWxlLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb250cm9sRGlyZWN0aXZlIHtcbiAgZ2V0IGNvbnRyb2woKTogQWJzdHJhY3RDb250cm9sIHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfVxuXG4gIGdldCB2YWx1ZSgpOiBhbnkgeyByZXR1cm4gaXNQcmVzZW50KHRoaXMuY29udHJvbCkgPyB0aGlzLmNvbnRyb2wudmFsdWUgOiBudWxsOyB9XG5cbiAgZ2V0IHZhbGlkKCk6IGJvb2xlYW4geyByZXR1cm4gaXNQcmVzZW50KHRoaXMuY29udHJvbCkgPyB0aGlzLmNvbnRyb2wudmFsaWQgOiBudWxsOyB9XG5cbiAgZ2V0IGVycm9ycygpOiB7W2tleTogc3RyaW5nXTogYW55fSB7XG4gICAgcmV0dXJuIGlzUHJlc2VudCh0aGlzLmNvbnRyb2wpID8gdGhpcy5jb250cm9sLmVycm9ycyA6IG51bGw7XG4gIH1cblxuICBnZXQgcHJpc3RpbmUoKTogYm9vbGVhbiB7IHJldHVybiBpc1ByZXNlbnQodGhpcy5jb250cm9sKSA/IHRoaXMuY29udHJvbC5wcmlzdGluZSA6IG51bGw7IH1cblxuICBnZXQgZGlydHkoKTogYm9vbGVhbiB7IHJldHVybiBpc1ByZXNlbnQodGhpcy5jb250cm9sKSA/IHRoaXMuY29udHJvbC5kaXJ0eSA6IG51bGw7IH1cblxuICBnZXQgdG91Y2hlZCgpOiBib29sZWFuIHsgcmV0dXJuIGlzUHJlc2VudCh0aGlzLmNvbnRyb2wpID8gdGhpcy5jb250cm9sLnRvdWNoZWQgOiBudWxsOyB9XG5cbiAgZ2V0IHVudG91Y2hlZCgpOiBib29sZWFuIHsgcmV0dXJuIGlzUHJlc2VudCh0aGlzLmNvbnRyb2wpID8gdGhpcy5jb250cm9sLnVudG91Y2hlZCA6IG51bGw7IH1cblxuICBnZXQgcGF0aCgpOiBzdHJpbmdbXSB7IHJldHVybiBudWxsOyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tbW9uL2Zvcm1zL2RpcmVjdGl2ZXMvYWJzdHJhY3RfY29udHJvbF9kaXJlY3RpdmUudHNcbiAqKi8iLCJpbXBvcnQge0Zvcm19IGZyb20gJy4vZm9ybV9pbnRlcmZhY2UnO1xuaW1wb3J0IHtBYnN0cmFjdENvbnRyb2xEaXJlY3RpdmV9IGZyb20gJy4vYWJzdHJhY3RfY29udHJvbF9kaXJlY3RpdmUnO1xuXG4vKipcbiAqIEEgZGlyZWN0aXZlIHRoYXQgY29udGFpbnMgbXVsdGlwbGUge0BsaW5rIE5nQ29udHJvbH1zLlxuICpcbiAqIE9ubHkgdXNlZCBieSB0aGUgZm9ybXMgbW9kdWxlLlxuICovXG5leHBvcnQgY2xhc3MgQ29udHJvbENvbnRhaW5lciBleHRlbmRzIEFic3RyYWN0Q29udHJvbERpcmVjdGl2ZSB7XG4gIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogR2V0IHRoZSBmb3JtIHRvIHdoaWNoIHRoaXMgY29udGFpbmVyIGJlbG9uZ3MuXG4gICAqL1xuICBnZXQgZm9ybURpcmVjdGl2ZSgpOiBGb3JtIHsgcmV0dXJuIG51bGw7IH1cblxuICAvKipcbiAgICogR2V0IHRoZSBwYXRoIHRvIHRoaXMgY29udGFpbmVyLlxuICAgKi9cbiAgZ2V0IHBhdGgoKTogc3RyaW5nW10geyByZXR1cm4gbnVsbDsgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbW1vbi9mb3Jtcy9kaXJlY3RpdmVzL2NvbnRyb2xfY29udGFpbmVyLnRzXG4gKiovIiwiaW1wb3J0IHtDT05TVF9FWFBSfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtFdmVudEVtaXR0ZXIsIE9ic2VydmFibGVXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2FzeW5jJztcblxuaW1wb3J0IHtcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIFNpbXBsZUNoYW5nZSxcbiAgUXVlcnksXG4gIERpcmVjdGl2ZSxcbiAgZm9yd2FyZFJlZixcbiAgSG9zdCxcbiAgU2tpcFNlbGYsXG4gIFByb3ZpZGVyLFxuICBJbmplY3QsXG4gIE9wdGlvbmFsLFxuICBTZWxmXG59IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuXG5pbXBvcnQge0NvbnRyb2xDb250YWluZXJ9IGZyb20gJy4vY29udHJvbF9jb250YWluZXInO1xuaW1wb3J0IHtOZ0NvbnRyb2x9IGZyb20gJy4vbmdfY29udHJvbCc7XG5pbXBvcnQge0NvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUn0gZnJvbSAnLi9jb250cm9sX3ZhbHVlX2FjY2Vzc29yJztcbmltcG9ydCB7XG4gIGNvbnRyb2xQYXRoLFxuICBjb21wb3NlVmFsaWRhdG9ycyxcbiAgY29tcG9zZUFzeW5jVmFsaWRhdG9ycyxcbiAgaXNQcm9wZXJ0eVVwZGF0ZWQsXG4gIHNlbGVjdFZhbHVlQWNjZXNzb3Jcbn0gZnJvbSAnLi9zaGFyZWQnO1xuaW1wb3J0IHtDb250cm9sfSBmcm9tICcuLi9tb2RlbCc7XG5pbXBvcnQge1ZhbGlkYXRvcnMsIE5HX1ZBTElEQVRPUlMsIE5HX0FTWU5DX1ZBTElEQVRPUlN9IGZyb20gJy4uL3ZhbGlkYXRvcnMnO1xuXG5cbmNvbnN0IGNvbnRyb2xOYW1lQmluZGluZyA9XG4gICAgQ09OU1RfRVhQUihuZXcgUHJvdmlkZXIoTmdDb250cm9sLCB7dXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTmdDb250cm9sTmFtZSl9KSk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbmQgYmluZHMgYSBjb250cm9sIHdpdGggYSBzcGVjaWZpZWQgbmFtZSB0byBhIERPTSBlbGVtZW50LlxuICpcbiAqIFRoaXMgZGlyZWN0aXZlIGNhbiBvbmx5IGJlIHVzZWQgYXMgYSBjaGlsZCBvZiB7QGxpbmsgTmdGb3JtfSBvciB7QGxpbmsgTmdGb3JtTW9kZWx9LlxuXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIEluIHRoaXMgZXhhbXBsZSwgd2UgY3JlYXRlIHRoZSBsb2dpbiBhbmQgcGFzc3dvcmQgY29udHJvbHMuXG4gKiBXZSBjYW4gd29yayB3aXRoIGVhY2ggY29udHJvbCBzZXBhcmF0ZWx5OiBjaGVjayBpdHMgdmFsaWRpdHksIGdldCBpdHMgdmFsdWUsIGxpc3RlbiB0byBpdHNcbiAqIGNoYW5nZXMuXG4gKlxuICogIGBgYFxuICogQENvbXBvbmVudCh7XG4gKiAgICAgIHNlbGVjdG9yOiBcImxvZ2luLWNvbXBcIixcbiAqICAgICAgZGlyZWN0aXZlczogW0ZPUk1fRElSRUNUSVZFU10sXG4gKiAgICAgIHRlbXBsYXRlOiBgXG4gKiAgICAgICAgPGZvcm0gI2Y9XCJuZ0Zvcm1cIiAoc3VibWl0KT0nb25Mb2dJbihmLnZhbHVlKSc+XG4gKiAgICAgICAgICBMb2dpbiA8aW5wdXQgdHlwZT0ndGV4dCcgbmdDb250cm9sPSdsb2dpbicgI2w9XCJmb3JtXCI+XG4gKiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWwudmFsaWRcIj5Mb2dpbiBpcyBpbnZhbGlkPC9kaXY+XG4gKlxuICogICAgICAgICAgUGFzc3dvcmQgPGlucHV0IHR5cGU9J3Bhc3N3b3JkJyBuZ0NvbnRyb2w9J3Bhc3N3b3JkJz5cbiAqICAgICAgICAgIDxidXR0b24gdHlwZT0nc3VibWl0Jz5Mb2cgaW4hPC9idXR0b24+XG4gKiAgICAgICAgPC9mb3JtPlxuICogICAgICBgfSlcbiAqIGNsYXNzIExvZ2luQ29tcCB7XG4gKiAgb25Mb2dJbih2YWx1ZSk6IHZvaWQge1xuICogICAgLy8gdmFsdWUgPT09IHtsb2dpbjogJ3NvbWUgbG9naW4nLCBwYXNzd29yZDogJ3NvbWUgcGFzc3dvcmQnfVxuICogIH1cbiAqIH1cbiAqICBgYGBcbiAqXG4gKiBXZSBjYW4gYWxzbyB1c2UgbmdNb2RlbCB0byBiaW5kIGEgZG9tYWluIG1vZGVsIHRvIHRoZSBmb3JtLlxuICpcbiAqICBgYGBcbiAqIEBDb21wb25lbnQoe1xuICogICAgICBzZWxlY3RvcjogXCJsb2dpbi1jb21wXCIsXG4gKiAgICAgIGRpcmVjdGl2ZXM6IFtGT1JNX0RJUkVDVElWRVNdLFxuICogICAgICB0ZW1wbGF0ZTogYFxuICogICAgICAgIDxmb3JtIChzdWJtaXQpPSdvbkxvZ0luKCknPlxuICogICAgICAgICAgTG9naW4gPGlucHV0IHR5cGU9J3RleHQnIG5nQ29udHJvbD0nbG9naW4nIFsobmdNb2RlbCldPVwiY3JlZGVudGlhbHMubG9naW5cIj5cbiAqICAgICAgICAgIFBhc3N3b3JkIDxpbnB1dCB0eXBlPSdwYXNzd29yZCcgbmdDb250cm9sPSdwYXNzd29yZCdcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNyZWRlbnRpYWxzLnBhc3N3b3JkXCI+XG4gKiAgICAgICAgICA8YnV0dG9uIHR5cGU9J3N1Ym1pdCc+TG9nIGluITwvYnV0dG9uPlxuICogICAgICAgIDwvZm9ybT5cbiAqICAgICAgYH0pXG4gKiBjbGFzcyBMb2dpbkNvbXAge1xuICogIGNyZWRlbnRpYWxzOiB7bG9naW46c3RyaW5nLCBwYXNzd29yZDpzdHJpbmd9O1xuICpcbiAqICBvbkxvZ0luKCk6IHZvaWQge1xuICogICAgLy8gdGhpcy5jcmVkZW50aWFscy5sb2dpbiA9PT0gXCJzb21lIGxvZ2luXCJcbiAqICAgIC8vIHRoaXMuY3JlZGVudGlhbHMucGFzc3dvcmQgPT09IFwic29tZSBwYXNzd29yZFwiXG4gKiAgfVxuICogfVxuICogIGBgYFxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbmdDb250cm9sXScsXG4gIGJpbmRpbmdzOiBbY29udHJvbE5hbWVCaW5kaW5nXSxcbiAgaW5wdXRzOiBbJ25hbWU6IG5nQ29udHJvbCcsICdtb2RlbDogbmdNb2RlbCddLFxuICBvdXRwdXRzOiBbJ3VwZGF0ZTogbmdNb2RlbENoYW5nZSddLFxuICBleHBvcnRBczogJ25nRm9ybSdcbn0pXG5leHBvcnQgY2xhc3MgTmdDb250cm9sTmFtZSBleHRlbmRzIE5nQ29udHJvbCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyxcbiAgICBPbkRlc3Ryb3kge1xuICAvKiogQGludGVybmFsICovXG4gIHVwZGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgbW9kZWw6IGFueTtcbiAgdmlld01vZGVsOiBhbnk7XG4gIHByaXZhdGUgX2FkZGVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoQEhvc3QoKSBAU2tpcFNlbGYoKSBwcml2YXRlIF9wYXJlbnQ6IENvbnRyb2xDb250YWluZXIsXG4gICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBTZWxmKCkgQEluamVjdChOR19WQUxJREFUT1JTKSBwcml2YXRlIF92YWxpZGF0b3JzOlxuICAgICAgICAgICAgICAgICAgLyogQXJyYXk8VmFsaWRhdG9yfEZ1bmN0aW9uPiAqLyBhbnlbXSxcbiAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQFNlbGYoKSBASW5qZWN0KE5HX0FTWU5DX1ZBTElEQVRPUlMpIHByaXZhdGUgX2FzeW5jVmFsaWRhdG9yczpcbiAgICAgICAgICAgICAgICAgIC8qIEFycmF5PFZhbGlkYXRvcnxGdW5jdGlvbj4gKi8gYW55W10sXG4gICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBTZWxmKCkgQEluamVjdChOR19WQUxVRV9BQ0NFU1NPUilcbiAgICAgICAgICAgICAgdmFsdWVBY2Nlc3NvcnM6IENvbnRyb2xWYWx1ZUFjY2Vzc29yW10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMudmFsdWVBY2Nlc3NvciA9IHNlbGVjdFZhbHVlQWNjZXNzb3IodGhpcywgdmFsdWVBY2Nlc3NvcnMpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczoge1trZXk6IHN0cmluZ106IFNpbXBsZUNoYW5nZX0pIHtcbiAgICBpZiAoIXRoaXMuX2FkZGVkKSB7XG4gICAgICB0aGlzLmZvcm1EaXJlY3RpdmUuYWRkQ29udHJvbCh0aGlzKTtcbiAgICAgIHRoaXMuX2FkZGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGlzUHJvcGVydHlVcGRhdGVkKGNoYW5nZXMsIHRoaXMudmlld01vZGVsKSkge1xuICAgICAgdGhpcy52aWV3TW9kZWwgPSB0aGlzLm1vZGVsO1xuICAgICAgdGhpcy5mb3JtRGlyZWN0aXZlLnVwZGF0ZU1vZGVsKHRoaXMsIHRoaXMubW9kZWwpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQgeyB0aGlzLmZvcm1EaXJlY3RpdmUucmVtb3ZlQ29udHJvbCh0aGlzKTsgfVxuXG4gIHZpZXdUb01vZGVsVXBkYXRlKG5ld1ZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdNb2RlbCA9IG5ld1ZhbHVlO1xuICAgIE9ic2VydmFibGVXcmFwcGVyLmNhbGxFbWl0KHRoaXMudXBkYXRlLCBuZXdWYWx1ZSk7XG4gIH1cblxuICBnZXQgcGF0aCgpOiBzdHJpbmdbXSB7IHJldHVybiBjb250cm9sUGF0aCh0aGlzLm5hbWUsIHRoaXMuX3BhcmVudCk7IH1cblxuICBnZXQgZm9ybURpcmVjdGl2ZSgpOiBhbnkgeyByZXR1cm4gdGhpcy5fcGFyZW50LmZvcm1EaXJlY3RpdmU7IH1cblxuICBnZXQgdmFsaWRhdG9yKCk6IEZ1bmN0aW9uIHsgcmV0dXJuIGNvbXBvc2VWYWxpZGF0b3JzKHRoaXMuX3ZhbGlkYXRvcnMpOyB9XG5cbiAgZ2V0IGFzeW5jVmFsaWRhdG9yKCk6IEZ1bmN0aW9uIHsgcmV0dXJuIGNvbXBvc2VBc3luY1ZhbGlkYXRvcnModGhpcy5fYXN5bmNWYWxpZGF0b3JzKTsgfVxuXG4gIGdldCBjb250cm9sKCk6IENvbnRyb2wgeyByZXR1cm4gdGhpcy5mb3JtRGlyZWN0aXZlLmdldENvbnRyb2wodGhpcyk7IH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21tb24vZm9ybXMvZGlyZWN0aXZlcy9uZ19jb250cm9sX25hbWUudHNcbiAqKi8iLCJpbXBvcnQge0NvbnRyb2xWYWx1ZUFjY2Vzc29yfSBmcm9tICcuL2NvbnRyb2xfdmFsdWVfYWNjZXNzb3InO1xuaW1wb3J0IHtBYnN0cmFjdENvbnRyb2xEaXJlY3RpdmV9IGZyb20gJy4vYWJzdHJhY3RfY29udHJvbF9kaXJlY3RpdmUnO1xuaW1wb3J0IHt1bmltcGxlbWVudGVkfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuXG4vKipcbiAqIEEgYmFzZSBjbGFzcyB0aGF0IGFsbCBjb250cm9sIGRpcmVjdGl2ZSBleHRlbmQuXG4gKiBJdCBiaW5kcyBhIHtAbGluayBDb250cm9sfSBvYmplY3QgdG8gYSBET00gZWxlbWVudC5cbiAqXG4gKiBVc2VkIGludGVybmFsbHkgYnkgQW5ndWxhciBmb3Jtcy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE5nQ29udHJvbCBleHRlbmRzIEFic3RyYWN0Q29udHJvbERpcmVjdGl2ZSB7XG4gIG5hbWU6IHN0cmluZyA9IG51bGw7XG4gIHZhbHVlQWNjZXNzb3I6IENvbnRyb2xWYWx1ZUFjY2Vzc29yID0gbnVsbDtcblxuICBnZXQgdmFsaWRhdG9yKCk6IEZ1bmN0aW9uIHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfVxuICBnZXQgYXN5bmNWYWxpZGF0b3IoKTogRnVuY3Rpb24geyByZXR1cm4gdW5pbXBsZW1lbnRlZCgpOyB9XG5cbiAgYWJzdHJhY3Qgdmlld1RvTW9kZWxVcGRhdGUobmV3VmFsdWU6IGFueSk6IHZvaWQ7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tbW9uL2Zvcm1zL2RpcmVjdGl2ZXMvbmdfY29udHJvbC50c1xuICoqLyIsImltcG9ydCB7T3BhcXVlVG9rZW59IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuaW1wb3J0IHtDT05TVF9FWFBSfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuXG4vKipcbiAqIEEgYnJpZGdlIGJldHdlZW4gYSBjb250cm9sIGFuZCBhIG5hdGl2ZSBlbGVtZW50LlxuICpcbiAqIEEgYENvbnRyb2xWYWx1ZUFjY2Vzc29yYCBhYnN0cmFjdHMgdGhlIG9wZXJhdGlvbnMgb2Ygd3JpdGluZyBhIG5ldyB2YWx1ZSB0byBhXG4gKiBET00gZWxlbWVudCByZXByZXNlbnRpbmcgYW4gaW5wdXQgY29udHJvbC5cbiAqXG4gKiBQbGVhc2Ugc2VlIHtAbGluayBEZWZhdWx0VmFsdWVBY2Nlc3Nvcn0gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICAvKipcbiAgICogV3JpdGUgYSBuZXcgdmFsdWUgdG8gdGhlIGVsZW1lbnQuXG4gICAqL1xuICB3cml0ZVZhbHVlKG9iajogYW55KTogdm9pZDtcblxuICAvKipcbiAgICogU2V0IHRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgY29udHJvbCByZWNlaXZlcyBhIGNoYW5nZSBldmVudC5cbiAgICovXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGNvbnRyb2wgcmVjZWl2ZXMgYSB0b3VjaCBldmVudC5cbiAgICovXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkO1xufVxuXG4vKipcbiAqIFVzZWQgdG8gcHJvdmlkZSBhIHtAbGluayBDb250cm9sVmFsdWVBY2Nlc3Nvcn0gZm9yIGZvcm0gY29udHJvbHMuXG4gKlxuICogU2VlIHtAbGluayBEZWZhdWx0VmFsdWVBY2Nlc3Nvcn0gZm9yIGhvdyB0byBpbXBsZW1lbnQgb25lLlxuICovXG5leHBvcnQgY29uc3QgTkdfVkFMVUVfQUNDRVNTT1I6IE9wYXF1ZVRva2VuID0gQ09OU1RfRVhQUihuZXcgT3BhcXVlVG9rZW4oXCJOZ1ZhbHVlQWNjZXNzb3JcIikpO1xuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21tb24vZm9ybXMvZGlyZWN0aXZlcy9jb250cm9sX3ZhbHVlX2FjY2Vzc29yLnRzXG4gKiovIiwiaW1wb3J0IHtMaXN0V3JhcHBlciwgU3RyaW5nTWFwV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcbmltcG9ydCB7aXNCbGFuaywgaXNQcmVzZW50LCBsb29zZUlkZW50aWNhbH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbiwgV3JhcHBlZEV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcblxuaW1wb3J0IHtDb250cm9sQ29udGFpbmVyfSBmcm9tICcuL2NvbnRyb2xfY29udGFpbmVyJztcbmltcG9ydCB7TmdDb250cm9sfSBmcm9tICcuL25nX2NvbnRyb2wnO1xuaW1wb3J0IHtBYnN0cmFjdENvbnRyb2xEaXJlY3RpdmV9IGZyb20gJy4vYWJzdHJhY3RfY29udHJvbF9kaXJlY3RpdmUnO1xuaW1wb3J0IHtOZ0NvbnRyb2xHcm91cH0gZnJvbSAnLi9uZ19jb250cm9sX2dyb3VwJztcbmltcG9ydCB7Q29udHJvbCwgQ29udHJvbEdyb3VwfSBmcm9tICcuLi9tb2RlbCc7XG5pbXBvcnQge1ZhbGlkYXRvcnN9IGZyb20gJy4uL3ZhbGlkYXRvcnMnO1xuaW1wb3J0IHtDb250cm9sVmFsdWVBY2Nlc3Nvcn0gZnJvbSAnLi9jb250cm9sX3ZhbHVlX2FjY2Vzc29yJztcbmltcG9ydCB7RGVmYXVsdFZhbHVlQWNjZXNzb3J9IGZyb20gJy4vZGVmYXVsdF92YWx1ZV9hY2Nlc3Nvcic7XG5pbXBvcnQge051bWJlclZhbHVlQWNjZXNzb3J9IGZyb20gJy4vbnVtYmVyX3ZhbHVlX2FjY2Vzc29yJztcbmltcG9ydCB7Q2hlY2tib3hDb250cm9sVmFsdWVBY2Nlc3Nvcn0gZnJvbSAnLi9jaGVja2JveF92YWx1ZV9hY2Nlc3Nvcic7XG5pbXBvcnQge1NlbGVjdENvbnRyb2xWYWx1ZUFjY2Vzc29yfSBmcm9tICcuL3NlbGVjdF9jb250cm9sX3ZhbHVlX2FjY2Vzc29yJztcbmltcG9ydCB7bm9ybWFsaXplVmFsaWRhdG9yfSBmcm9tICcuL25vcm1hbGl6ZV92YWxpZGF0b3InO1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBjb250cm9sUGF0aChuYW1lOiBzdHJpbmcsIHBhcmVudDogQ29udHJvbENvbnRhaW5lcik6IHN0cmluZ1tdIHtcbiAgdmFyIHAgPSBMaXN0V3JhcHBlci5jbG9uZShwYXJlbnQucGF0aCk7XG4gIHAucHVzaChuYW1lKTtcbiAgcmV0dXJuIHA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRVcENvbnRyb2woY29udHJvbDogQ29udHJvbCwgZGlyOiBOZ0NvbnRyb2wpOiB2b2lkIHtcbiAgaWYgKGlzQmxhbmsoY29udHJvbCkpIF90aHJvd0Vycm9yKGRpciwgXCJDYW5ub3QgZmluZCBjb250cm9sXCIpO1xuICBpZiAoaXNCbGFuayhkaXIudmFsdWVBY2Nlc3NvcikpIF90aHJvd0Vycm9yKGRpciwgXCJObyB2YWx1ZSBhY2Nlc3NvciBmb3JcIik7XG5cbiAgY29udHJvbC52YWxpZGF0b3IgPSBWYWxpZGF0b3JzLmNvbXBvc2UoW2NvbnRyb2wudmFsaWRhdG9yLCBkaXIudmFsaWRhdG9yXSk7XG4gIGNvbnRyb2wuYXN5bmNWYWxpZGF0b3IgPSBWYWxpZGF0b3JzLmNvbXBvc2VBc3luYyhbY29udHJvbC5hc3luY1ZhbGlkYXRvciwgZGlyLmFzeW5jVmFsaWRhdG9yXSk7XG4gIGRpci52YWx1ZUFjY2Vzc29yLndyaXRlVmFsdWUoY29udHJvbC52YWx1ZSk7XG5cbiAgLy8gdmlldyAtPiBtb2RlbFxuICBkaXIudmFsdWVBY2Nlc3Nvci5yZWdpc3Rlck9uQ2hhbmdlKG5ld1ZhbHVlID0+IHtcbiAgICBkaXIudmlld1RvTW9kZWxVcGRhdGUobmV3VmFsdWUpO1xuICAgIGNvbnRyb2wudXBkYXRlVmFsdWUobmV3VmFsdWUsIHtlbWl0TW9kZWxUb1ZpZXdDaGFuZ2U6IGZhbHNlfSk7XG4gICAgY29udHJvbC5tYXJrQXNEaXJ0eSgpO1xuICB9KTtcblxuICAvLyBtb2RlbCAtPiB2aWV3XG4gIGNvbnRyb2wucmVnaXN0ZXJPbkNoYW5nZShuZXdWYWx1ZSA9PiBkaXIudmFsdWVBY2Nlc3Nvci53cml0ZVZhbHVlKG5ld1ZhbHVlKSk7XG5cbiAgLy8gdG91Y2hlZFxuICBkaXIudmFsdWVBY2Nlc3Nvci5yZWdpc3Rlck9uVG91Y2hlZCgoKSA9PiBjb250cm9sLm1hcmtBc1RvdWNoZWQoKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRVcENvbnRyb2xHcm91cChjb250cm9sOiBDb250cm9sR3JvdXAsIGRpcjogTmdDb250cm9sR3JvdXApIHtcbiAgaWYgKGlzQmxhbmsoY29udHJvbCkpIF90aHJvd0Vycm9yKGRpciwgXCJDYW5ub3QgZmluZCBjb250cm9sXCIpO1xuICBjb250cm9sLnZhbGlkYXRvciA9IFZhbGlkYXRvcnMuY29tcG9zZShbY29udHJvbC52YWxpZGF0b3IsIGRpci52YWxpZGF0b3JdKTtcbiAgY29udHJvbC5hc3luY1ZhbGlkYXRvciA9IFZhbGlkYXRvcnMuY29tcG9zZUFzeW5jKFtjb250cm9sLmFzeW5jVmFsaWRhdG9yLCBkaXIuYXN5bmNWYWxpZGF0b3JdKTtcbn1cblxuZnVuY3Rpb24gX3Rocm93RXJyb3IoZGlyOiBBYnN0cmFjdENvbnRyb2xEaXJlY3RpdmUsIG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICB2YXIgcGF0aCA9IGRpci5wYXRoLmpvaW4oXCIgLT4gXCIpO1xuICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgJHttZXNzYWdlfSAnJHtwYXRofSdgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvc2VWYWxpZGF0b3JzKHZhbGlkYXRvcnM6IC8qIEFycmF5PFZhbGlkYXRvcnxGdW5jdGlvbj4gKi8gYW55W10pOiBGdW5jdGlvbiB7XG4gIHJldHVybiBpc1ByZXNlbnQodmFsaWRhdG9ycykgPyBWYWxpZGF0b3JzLmNvbXBvc2UodmFsaWRhdG9ycy5tYXAobm9ybWFsaXplVmFsaWRhdG9yKSkgOiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcG9zZUFzeW5jVmFsaWRhdG9ycyhcbiAgICB2YWxpZGF0b3JzOiAvKiBBcnJheTxWYWxpZGF0b3J8RnVuY3Rpb24+ICovIGFueVtdKTogRnVuY3Rpb24ge1xuICByZXR1cm4gaXNQcmVzZW50KHZhbGlkYXRvcnMpID8gVmFsaWRhdG9ycy5jb21wb3NlQXN5bmModmFsaWRhdG9ycy5tYXAobm9ybWFsaXplVmFsaWRhdG9yKSkgOiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcm9wZXJ0eVVwZGF0ZWQoY2hhbmdlczoge1trZXk6IHN0cmluZ106IGFueX0sIHZpZXdNb2RlbDogYW55KTogYm9vbGVhbiB7XG4gIGlmICghU3RyaW5nTWFwV3JhcHBlci5jb250YWlucyhjaGFuZ2VzLCBcIm1vZGVsXCIpKSByZXR1cm4gZmFsc2U7XG4gIHZhciBjaGFuZ2UgPSBjaGFuZ2VzW1wibW9kZWxcIl07XG5cbiAgaWYgKGNoYW5nZS5pc0ZpcnN0Q2hhbmdlKCkpIHJldHVybiB0cnVlO1xuICByZXR1cm4gIWxvb3NlSWRlbnRpY2FsKHZpZXdNb2RlbCwgY2hhbmdlLmN1cnJlbnRWYWx1ZSk7XG59XG5cbi8vIFRPRE86IHZzYXZraW4gcmVtb3ZlIGl0IG9uY2UgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMzAxMSBpcyBpbXBsZW1lbnRlZFxuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdFZhbHVlQWNjZXNzb3IoZGlyOiBOZ0NvbnRyb2wsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUFjY2Vzc29yczogQ29udHJvbFZhbHVlQWNjZXNzb3JbXSk6IENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgaWYgKGlzQmxhbmsodmFsdWVBY2Nlc3NvcnMpKSByZXR1cm4gbnVsbDtcblxuICB2YXIgZGVmYXVsdEFjY2Vzc29yO1xuICB2YXIgYnVpbHRpbkFjY2Vzc29yO1xuICB2YXIgY3VzdG9tQWNjZXNzb3I7XG5cbiAgdmFsdWVBY2Nlc3NvcnMuZm9yRWFjaCh2ID0+IHtcbiAgICBpZiAodiBpbnN0YW5jZW9mIERlZmF1bHRWYWx1ZUFjY2Vzc29yKSB7XG4gICAgICBkZWZhdWx0QWNjZXNzb3IgPSB2O1xuXG4gICAgfSBlbHNlIGlmICh2IGluc3RhbmNlb2YgQ2hlY2tib3hDb250cm9sVmFsdWVBY2Nlc3NvciB8fCB2IGluc3RhbmNlb2YgTnVtYmVyVmFsdWVBY2Nlc3NvciB8fFxuICAgICAgICAgICAgICAgdiBpbnN0YW5jZW9mIFNlbGVjdENvbnRyb2xWYWx1ZUFjY2Vzc29yKSB7XG4gICAgICBpZiAoaXNQcmVzZW50KGJ1aWx0aW5BY2Nlc3NvcikpXG4gICAgICAgIF90aHJvd0Vycm9yKGRpciwgXCJNb3JlIHRoYW4gb25lIGJ1aWx0LWluIHZhbHVlIGFjY2Vzc29yIG1hdGNoZXNcIik7XG4gICAgICBidWlsdGluQWNjZXNzb3IgPSB2O1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpc1ByZXNlbnQoY3VzdG9tQWNjZXNzb3IpKVxuICAgICAgICBfdGhyb3dFcnJvcihkaXIsIFwiTW9yZSB0aGFuIG9uZSBjdXN0b20gdmFsdWUgYWNjZXNzb3IgbWF0Y2hlc1wiKTtcbiAgICAgIGN1c3RvbUFjY2Vzc29yID0gdjtcbiAgICB9XG4gIH0pO1xuXG4gIGlmIChpc1ByZXNlbnQoY3VzdG9tQWNjZXNzb3IpKSByZXR1cm4gY3VzdG9tQWNjZXNzb3I7XG4gIGlmIChpc1ByZXNlbnQoYnVpbHRpbkFjY2Vzc29yKSkgcmV0dXJuIGJ1aWx0aW5BY2Nlc3NvcjtcbiAgaWYgKGlzUHJlc2VudChkZWZhdWx0QWNjZXNzb3IpKSByZXR1cm4gZGVmYXVsdEFjY2Vzc29yO1xuXG4gIF90aHJvd0Vycm9yKGRpciwgXCJObyB2YWxpZCB2YWx1ZSBhY2Nlc3NvciBmb3JcIik7XG4gIHJldHVybiBudWxsO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbW1vbi9mb3Jtcy9kaXJlY3RpdmVzL3NoYXJlZC50c1xuICoqLyIsImltcG9ydCB7aXNCbGFuaywgaXNQcmVzZW50LCBDT05TVF9FWFBSfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtQcm9taXNlV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9wcm9taXNlJztcbmltcG9ydCB7T2JzZXJ2YWJsZVdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvYXN5bmMnO1xuaW1wb3J0IHtMaXN0V3JhcHBlciwgU3RyaW5nTWFwV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcbmltcG9ydCB7T3BhcXVlVG9rZW59IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuXG5pbXBvcnQgKiBhcyBtb2RlbE1vZHVsZSBmcm9tICcuL21vZGVsJztcblxuLyoqXG4gKiBQcm92aWRlcnMgZm9yIHZhbGlkYXRvcnMgdG8gYmUgdXNlZCBmb3Ige0BsaW5rIENvbnRyb2x9cyBpbiBhIGZvcm0uXG4gKlxuICogUHJvdmlkZSB0aGlzIHVzaW5nIGBtdWx0aTogdHJ1ZWAgdG8gYWRkIHZhbGlkYXRvcnMuXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiB7QGV4YW1wbGUgY29yZS9mb3Jtcy90cy9uZ192YWxpZGF0b3JzL25nX3ZhbGlkYXRvcnMudHMgcmVnaW9uPSduZ192YWxpZGF0b3JzJ31cbiAqL1xuZXhwb3J0IGNvbnN0IE5HX1ZBTElEQVRPUlM6IE9wYXF1ZVRva2VuID0gQ09OU1RfRVhQUihuZXcgT3BhcXVlVG9rZW4oXCJOZ1ZhbGlkYXRvcnNcIikpO1xuXG4vKipcbiAqIFByb3ZpZGVycyBmb3IgYXN5bmNocm9ub3VzIHZhbGlkYXRvcnMgdG8gYmUgdXNlZCBmb3Ige0BsaW5rIENvbnRyb2x9c1xuICogaW4gYSBmb3JtLlxuICpcbiAqIFByb3ZpZGUgdGhpcyB1c2luZyBgbXVsdGk6IHRydWVgIHRvIGFkZCB2YWxpZGF0b3JzLlxuICpcbiAqIFNlZSB7QGxpbmsgTkdfVkFMSURBVE9SU30gZm9yIG1vcmUgZGV0YWlscy5cbiAqL1xuZXhwb3J0IGNvbnN0IE5HX0FTWU5DX1ZBTElEQVRPUlM6IE9wYXF1ZVRva2VuID0gQ09OU1RfRVhQUihuZXcgT3BhcXVlVG9rZW4oXCJOZ0FzeW5jVmFsaWRhdG9yc1wiKSk7XG5cbi8qKlxuICogUHJvdmlkZXMgYSBzZXQgb2YgdmFsaWRhdG9ycyB1c2VkIGJ5IGZvcm0gY29udHJvbHMuXG4gKlxuICogQSB2YWxpZGF0b3IgaXMgYSBmdW5jdGlvbiB0aGF0IHByb2Nlc3NlcyBhIHtAbGluayBDb250cm9sfSBvciBjb2xsZWN0aW9uIG9mXG4gKiBjb250cm9scyBhbmQgcmV0dXJucyBhIG1hcCBvZiBlcnJvcnMuIEEgbnVsbCBtYXAgbWVhbnMgdGhhdCB2YWxpZGF0aW9uIGhhcyBwYXNzZWQuXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiB2YXIgbG9naW5Db250cm9sID0gbmV3IENvbnRyb2woXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZClcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgVmFsaWRhdG9ycyB7XG4gIC8qKlxuICAgKiBWYWxpZGF0b3IgdGhhdCByZXF1aXJlcyBjb250cm9scyB0byBoYXZlIGEgbm9uLWVtcHR5IHZhbHVlLlxuICAgKi9cbiAgc3RhdGljIHJlcXVpcmVkKGNvbnRyb2w6IG1vZGVsTW9kdWxlLkNvbnRyb2wpOiB7W2tleTogc3RyaW5nXTogYm9vbGVhbn0ge1xuICAgIHJldHVybiBpc0JsYW5rKGNvbnRyb2wudmFsdWUpIHx8IGNvbnRyb2wudmFsdWUgPT0gXCJcIiA/IHtcInJlcXVpcmVkXCI6IHRydWV9IDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0b3IgdGhhdCByZXF1aXJlcyBjb250cm9scyB0byBoYXZlIGEgdmFsdWUgb2YgYSBtaW5pbXVtIGxlbmd0aC5cbiAgICovXG4gIHN0YXRpYyBtaW5MZW5ndGgobWluTGVuZ3RoOiBudW1iZXIpOiBGdW5jdGlvbiB7XG4gICAgcmV0dXJuIChjb250cm9sOiBtb2RlbE1vZHVsZS5Db250cm9sKToge1trZXk6IHN0cmluZ106IGFueX0gPT4ge1xuICAgICAgaWYgKGlzUHJlc2VudChWYWxpZGF0b3JzLnJlcXVpcmVkKGNvbnRyb2wpKSkgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgdjogc3RyaW5nID0gY29udHJvbC52YWx1ZTtcbiAgICAgIHJldHVybiB2Lmxlbmd0aCA8IG1pbkxlbmd0aCA/XG4gICAgICAgICAgICAgICAgIHtcIm1pbmxlbmd0aFwiOiB7XCJyZXF1aXJlZExlbmd0aFwiOiBtaW5MZW5ndGgsIFwiYWN0dWFsTGVuZ3RoXCI6IHYubGVuZ3RofX0gOlxuICAgICAgICAgICAgICAgICBudWxsO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdG9yIHRoYXQgcmVxdWlyZXMgY29udHJvbHMgdG8gaGF2ZSBhIHZhbHVlIG9mIGEgbWF4aW11bSBsZW5ndGguXG4gICAqL1xuICBzdGF0aWMgbWF4TGVuZ3RoKG1heExlbmd0aDogbnVtYmVyKTogRnVuY3Rpb24ge1xuICAgIHJldHVybiAoY29udHJvbDogbW9kZWxNb2R1bGUuQ29udHJvbCk6IHtba2V5OiBzdHJpbmddOiBhbnl9ID0+IHtcbiAgICAgIGlmIChpc1ByZXNlbnQoVmFsaWRhdG9ycy5yZXF1aXJlZChjb250cm9sKSkpIHJldHVybiBudWxsO1xuICAgICAgdmFyIHY6IHN0cmluZyA9IGNvbnRyb2wudmFsdWU7XG4gICAgICByZXR1cm4gdi5sZW5ndGggPiBtYXhMZW5ndGggP1xuICAgICAgICAgICAgICAgICB7XCJtYXhsZW5ndGhcIjoge1wicmVxdWlyZWRMZW5ndGhcIjogbWF4TGVuZ3RoLCBcImFjdHVhbExlbmd0aFwiOiB2Lmxlbmd0aH19IDpcbiAgICAgICAgICAgICAgICAgbnVsbDtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIE5vLW9wIHZhbGlkYXRvci5cbiAgICovXG4gIHN0YXRpYyBudWxsVmFsaWRhdG9yKGM6IGFueSk6IHtba2V5OiBzdHJpbmddOiBib29sZWFufSB7IHJldHVybiBudWxsOyB9XG5cbiAgLyoqXG4gICAqIENvbXBvc2UgbXVsdGlwbGUgdmFsaWRhdG9ycyBpbnRvIGEgc2luZ2xlIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgdW5pb25cbiAgICogb2YgdGhlIGluZGl2aWR1YWwgZXJyb3IgbWFwcy5cbiAgICovXG4gIHN0YXRpYyBjb21wb3NlKHZhbGlkYXRvcnM6IEZ1bmN0aW9uW10pOiBGdW5jdGlvbiB7XG4gICAgaWYgKGlzQmxhbmsodmFsaWRhdG9ycykpIHJldHVybiBudWxsO1xuICAgIHZhciBwcmVzZW50VmFsaWRhdG9ycyA9IHZhbGlkYXRvcnMuZmlsdGVyKGlzUHJlc2VudCk7XG4gICAgaWYgKHByZXNlbnRWYWxpZGF0b3JzLmxlbmd0aCA9PSAwKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiBmdW5jdGlvbihjb250cm9sOiBtb2RlbE1vZHVsZS5BYnN0cmFjdENvbnRyb2wpIHtcbiAgICAgIHJldHVybiBfbWVyZ2VFcnJvcnMoX2V4ZWN1dGVWYWxpZGF0b3JzKGNvbnRyb2wsIHByZXNlbnRWYWxpZGF0b3JzKSk7XG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBjb21wb3NlQXN5bmModmFsaWRhdG9yczogRnVuY3Rpb25bXSk6IEZ1bmN0aW9uIHtcbiAgICBpZiAoaXNCbGFuayh2YWxpZGF0b3JzKSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIHByZXNlbnRWYWxpZGF0b3JzID0gdmFsaWRhdG9ycy5maWx0ZXIoaXNQcmVzZW50KTtcbiAgICBpZiAocHJlc2VudFZhbGlkYXRvcnMubGVuZ3RoID09IDApIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKGNvbnRyb2w6IG1vZGVsTW9kdWxlLkFic3RyYWN0Q29udHJvbCkge1xuICAgICAgbGV0IHByb21pc2VzID0gX2V4ZWN1dGVWYWxpZGF0b3JzKGNvbnRyb2wsIHByZXNlbnRWYWxpZGF0b3JzKS5tYXAoX2NvbnZlcnRUb1Byb21pc2UpO1xuICAgICAgcmV0dXJuIFByb21pc2VXcmFwcGVyLmFsbChwcm9taXNlcykudGhlbihfbWVyZ2VFcnJvcnMpO1xuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NvbnZlcnRUb1Byb21pc2Uob2JqOiBhbnkpOiBhbnkge1xuICByZXR1cm4gUHJvbWlzZVdyYXBwZXIuaXNQcm9taXNlKG9iaikgPyBvYmogOiBPYnNlcnZhYmxlV3JhcHBlci50b1Byb21pc2Uob2JqKTtcbn1cblxuZnVuY3Rpb24gX2V4ZWN1dGVWYWxpZGF0b3JzKGNvbnRyb2w6IG1vZGVsTW9kdWxlLkFic3RyYWN0Q29udHJvbCwgdmFsaWRhdG9yczogRnVuY3Rpb25bXSk6IGFueVtdIHtcbiAgcmV0dXJuIHZhbGlkYXRvcnMubWFwKHYgPT4gdihjb250cm9sKSk7XG59XG5cbmZ1bmN0aW9uIF9tZXJnZUVycm9ycyhhcnJheU9mRXJyb3JzOiBhbnlbXSk6IHtba2V5OiBzdHJpbmddOiBhbnl9IHtcbiAgdmFyIHJlcyA9IGFycmF5T2ZFcnJvcnMucmVkdWNlKChyZXMsIGVycm9ycykgPT4ge1xuICAgIHJldHVybiBpc1ByZXNlbnQoZXJyb3JzKSA/IFN0cmluZ01hcFdyYXBwZXIubWVyZ2UoPGFueT5yZXMsIDxhbnk+ZXJyb3JzKSA6IHJlcztcbiAgfSwge30pO1xuICByZXR1cm4gU3RyaW5nTWFwV3JhcHBlci5pc0VtcHR5KHJlcykgPyBudWxsIDogcmVzO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbW1vbi9mb3Jtcy92YWxpZGF0b3JzLnRzXG4gKiovIiwiaW1wb3J0IHtEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIFJlbmRlcmVyLCBTZWxmLCBmb3J3YXJkUmVmLCBQcm92aWRlcn0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5pbXBvcnQge05HX1ZBTFVFX0FDQ0VTU09SLCBDb250cm9sVmFsdWVBY2Nlc3Nvcn0gZnJvbSAnLi9jb250cm9sX3ZhbHVlX2FjY2Vzc29yJztcbmltcG9ydCB7aXNCbGFuaywgQ09OU1RfRVhQUn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxuY29uc3QgREVGQVVMVF9WQUxVRV9BQ0NFU1NPUiA9IENPTlNUX0VYUFIobmV3IFByb3ZpZGVyKFxuICAgIE5HX1ZBTFVFX0FDQ0VTU09SLCB7dXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRGVmYXVsdFZhbHVlQWNjZXNzb3IpLCBtdWx0aTogdHJ1ZX0pKTtcblxuLyoqXG4gKiBUaGUgZGVmYXVsdCBhY2Nlc3NvciBmb3Igd3JpdGluZyBhIHZhbHVlIGFuZCBsaXN0ZW5pbmcgdG8gY2hhbmdlcyB0aGF0IGlzIHVzZWQgYnkgdGhlXG4gKiB7QGxpbmsgTmdNb2RlbH0sIHtAbGluayBOZ0Zvcm1Db250cm9sfSwgYW5kIHtAbGluayBOZ0NvbnRyb2xOYW1lfSBkaXJlY3RpdmVzLlxuICpcbiAqICAjIyMgRXhhbXBsZVxuICogIGBgYFxuICogIDxpbnB1dCB0eXBlPVwidGV4dFwiIG5nQ29udHJvbD1cInNlYXJjaFF1ZXJ5XCI+XG4gKiAgYGBgXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjpcbiAgICAgICdpbnB1dDpub3QoW3R5cGU9Y2hlY2tib3hdKVtuZ0NvbnRyb2xdLHRleHRhcmVhW25nQ29udHJvbF0saW5wdXQ6bm90KFt0eXBlPWNoZWNrYm94XSlbbmdGb3JtQ29udHJvbF0sdGV4dGFyZWFbbmdGb3JtQ29udHJvbF0saW5wdXQ6bm90KFt0eXBlPWNoZWNrYm94XSlbbmdNb2RlbF0sdGV4dGFyZWFbbmdNb2RlbF0sW25nRGVmYXVsdENvbnRyb2xdJyxcbiAgLy8gVE9ETzogdnNhdmtpbiByZXBsYWNlIHRoZSBhYm92ZSBzZWxlY3RvciB3aXRoIHRoZSBvbmUgYmVsb3cgaXQgb25jZVxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8zMDExIGlzIGltcGxlbWVudGVkXG4gIC8vIHNlbGVjdG9yOiAnW25nQ29udHJvbF0sW25nTW9kZWxdLFtuZ0Zvcm1Db250cm9sXScsXG4gIGhvc3Q6IHsnKGlucHV0KSc6ICdvbkNoYW5nZSgkZXZlbnQudGFyZ2V0LnZhbHVlKScsICcoYmx1ciknOiAnb25Ub3VjaGVkKCknfSxcbiAgYmluZGluZ3M6IFtERUZBVUxUX1ZBTFVFX0FDQ0VTU09SXVxufSlcbmV4cG9ydCBjbGFzcyBEZWZhdWx0VmFsdWVBY2Nlc3NvciBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgb25DaGFuZ2UgPSAoXykgPT4ge307XG4gIG9uVG91Y2hlZCA9ICgpID0+IHt9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3JlbmRlcmVyOiBSZW5kZXJlciwgcHJpdmF0ZSBfZWxlbWVudFJlZjogRWxlbWVudFJlZikge31cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB2YXIgbm9ybWFsaXplZFZhbHVlID0gaXNCbGFuayh2YWx1ZSkgPyAnJyA6IHZhbHVlO1xuICAgIHRoaXMuX3JlbmRlcmVyLnNldEVsZW1lbnRQcm9wZXJ0eSh0aGlzLl9lbGVtZW50UmVmLCAndmFsdWUnLCBub3JtYWxpemVkVmFsdWUpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKF86IGFueSkgPT4gdm9pZCk6IHZvaWQgeyB0aGlzLm9uQ2hhbmdlID0gZm47IH1cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHsgdGhpcy5vblRvdWNoZWQgPSBmbjsgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbW1vbi9mb3Jtcy9kaXJlY3RpdmVzL2RlZmF1bHRfdmFsdWVfYWNjZXNzb3IudHNcbiAqKi8iLCJpbXBvcnQge0RpcmVjdGl2ZSwgRWxlbWVudFJlZiwgUmVuZGVyZXIsIFNlbGYsIGZvcndhcmRSZWYsIFByb3ZpZGVyfSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbmltcG9ydCB7TkdfVkFMVUVfQUNDRVNTT1IsIENvbnRyb2xWYWx1ZUFjY2Vzc29yfSBmcm9tICcuL2NvbnRyb2xfdmFsdWVfYWNjZXNzb3InO1xuaW1wb3J0IHtpc0JsYW5rLCBDT05TVF9FWFBSLCBOdW1iZXJXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuXG5jb25zdCBOVU1CRVJfVkFMVUVfQUNDRVNTT1IgPSBDT05TVF9FWFBSKG5ldyBQcm92aWRlcihcbiAgICBOR19WQUxVRV9BQ0NFU1NPUiwge3VzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE51bWJlclZhbHVlQWNjZXNzb3IpLCBtdWx0aTogdHJ1ZX0pKTtcblxuLyoqXG4gKiBUaGUgYWNjZXNzb3IgZm9yIHdyaXRpbmcgYSBudW1iZXIgdmFsdWUgYW5kIGxpc3RlbmluZyB0byBjaGFuZ2VzIHRoYXQgaXMgdXNlZCBieSB0aGVcbiAqIHtAbGluayBOZ01vZGVsfSwge0BsaW5rIE5nRm9ybUNvbnRyb2x9LCBhbmQge0BsaW5rIE5nQ29udHJvbE5hbWV9IGRpcmVjdGl2ZXMuXG4gKlxuICogICMjIyBFeGFtcGxlXG4gKiAgYGBgXG4gKiAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBbKG5nTW9kZWwpXT1cImFnZVwiPlxuICogIGBgYFxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6XG4gICAgICAnaW5wdXRbdHlwZT1udW1iZXJdW25nQ29udHJvbF0saW5wdXRbdHlwZT1udW1iZXJdW25nRm9ybUNvbnRyb2xdLGlucHV0W3R5cGU9bnVtYmVyXVtuZ01vZGVsXScsXG4gIGhvc3Q6IHtcbiAgICAnKGNoYW5nZSknOiAnb25DaGFuZ2UoJGV2ZW50LnRhcmdldC52YWx1ZSknLFxuICAgICcoaW5wdXQpJzogJ29uQ2hhbmdlKCRldmVudC50YXJnZXQudmFsdWUpJyxcbiAgICAnKGJsdXIpJzogJ29uVG91Y2hlZCgpJ1xuICB9LFxuICBiaW5kaW5nczogW05VTUJFUl9WQUxVRV9BQ0NFU1NPUl1cbn0pXG5leHBvcnQgY2xhc3MgTnVtYmVyVmFsdWVBY2Nlc3NvciBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgb25DaGFuZ2UgPSAoXykgPT4ge307XG4gIG9uVG91Y2hlZCA9ICgpID0+IHt9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3JlbmRlcmVyOiBSZW5kZXJlciwgcHJpdmF0ZSBfZWxlbWVudFJlZjogRWxlbWVudFJlZikge31cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9yZW5kZXJlci5zZXRFbGVtZW50UHJvcGVydHkodGhpcy5fZWxlbWVudFJlZiwgJ3ZhbHVlJywgdmFsdWUpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKF86IG51bWJlcikgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSAodmFsdWUpID0+IHsgZm4oTnVtYmVyV3JhcHBlci5wYXJzZUZsb2F0KHZhbHVlKSk7IH07XG4gIH1cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHsgdGhpcy5vblRvdWNoZWQgPSBmbjsgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbW1vbi9mb3Jtcy9kaXJlY3RpdmVzL251bWJlcl92YWx1ZV9hY2Nlc3Nvci50c1xuICoqLyIsImltcG9ydCB7RGlyZWN0aXZlLCBSZW5kZXJlciwgRWxlbWVudFJlZiwgU2VsZiwgZm9yd2FyZFJlZiwgUHJvdmlkZXJ9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuXG5pbXBvcnQge05HX1ZBTFVFX0FDQ0VTU09SLCBDb250cm9sVmFsdWVBY2Nlc3Nvcn0gZnJvbSAnLi9jb250cm9sX3ZhbHVlX2FjY2Vzc29yJztcbmltcG9ydCB7Q09OU1RfRVhQUn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxuY29uc3QgQ0hFQ0tCT1hfVkFMVUVfQUNDRVNTT1IgPSBDT05TVF9FWFBSKG5ldyBQcm92aWRlcihcbiAgICBOR19WQUxVRV9BQ0NFU1NPUiwge3VzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IENoZWNrYm94Q29udHJvbFZhbHVlQWNjZXNzb3IpLCBtdWx0aTogdHJ1ZX0pKTtcblxuLyoqXG4gKiBUaGUgYWNjZXNzb3IgZm9yIHdyaXRpbmcgYSB2YWx1ZSBhbmQgbGlzdGVuaW5nIHRvIGNoYW5nZXMgb24gYSBjaGVja2JveCBpbnB1dCBlbGVtZW50LlxuICpcbiAqICAjIyMgRXhhbXBsZVxuICogIGBgYFxuICogIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuZ0NvbnRyb2w9XCJyZW1lbWJlckxvZ2luXCI+XG4gKiAgYGBgXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjpcbiAgICAgICdpbnB1dFt0eXBlPWNoZWNrYm94XVtuZ0NvbnRyb2xdLGlucHV0W3R5cGU9Y2hlY2tib3hdW25nRm9ybUNvbnRyb2xdLGlucHV0W3R5cGU9Y2hlY2tib3hdW25nTW9kZWxdJyxcbiAgaG9zdDogeycoY2hhbmdlKSc6ICdvbkNoYW5nZSgkZXZlbnQudGFyZ2V0LmNoZWNrZWQpJywgJyhibHVyKSc6ICdvblRvdWNoZWQoKSd9LFxuICBiaW5kaW5nczogW0NIRUNLQk9YX1ZBTFVFX0FDQ0VTU09SXVxufSlcbmV4cG9ydCBjbGFzcyBDaGVja2JveENvbnRyb2xWYWx1ZUFjY2Vzc29yIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBvbkNoYW5nZSA9IChfKSA9PiB7fTtcbiAgb25Ub3VjaGVkID0gKCkgPT4ge307XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfcmVuZGVyZXI6IFJlbmRlcmVyLCBwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7fVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuX3JlbmRlcmVyLnNldEVsZW1lbnRQcm9wZXJ0eSh0aGlzLl9lbGVtZW50UmVmLCAnY2hlY2tlZCcsIHZhbHVlKTtcbiAgfVxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAoXzogYW55KSA9PiB7fSk6IHZvaWQgeyB0aGlzLm9uQ2hhbmdlID0gZm47IH1cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHt9KTogdm9pZCB7IHRoaXMub25Ub3VjaGVkID0gZm47IH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21tb24vZm9ybXMvZGlyZWN0aXZlcy9jaGVja2JveF92YWx1ZV9hY2Nlc3Nvci50c1xuICoqLyIsImltcG9ydCB7XG4gIFF1ZXJ5LFxuICBEaXJlY3RpdmUsXG4gIFJlbmRlcmVyLFxuICBTZWxmLFxuICBmb3J3YXJkUmVmLFxuICBQcm92aWRlcixcbiAgRWxlbWVudFJlZixcbiAgUXVlcnlMaXN0XG59IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuXG5pbXBvcnQge09ic2VydmFibGVXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2FzeW5jJztcbmltcG9ydCB7TkdfVkFMVUVfQUNDRVNTT1IsIENvbnRyb2xWYWx1ZUFjY2Vzc29yfSBmcm9tICcuL2NvbnRyb2xfdmFsdWVfYWNjZXNzb3InO1xuaW1wb3J0IHtDT05TVF9FWFBSfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuXG5jb25zdCBTRUxFQ1RfVkFMVUVfQUNDRVNTT1IgPSBDT05TVF9FWFBSKG5ldyBQcm92aWRlcihcbiAgICBOR19WQUxVRV9BQ0NFU1NPUiwge3VzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFNlbGVjdENvbnRyb2xWYWx1ZUFjY2Vzc29yKSwgbXVsdGk6IHRydWV9KSk7XG5cbi8qKlxuICogTWFya3MgYDxvcHRpb24+YCBhcyBkeW5hbWljLCBzbyBBbmd1bGFyIGNhbiBiZSBub3RpZmllZCB3aGVuIG9wdGlvbnMgY2hhbmdlLlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogYGBgXG4gKiA8c2VsZWN0IG5nQ29udHJvbD1cImNpdHlcIj5cbiAqICAgPG9wdGlvbiAqbmdGb3I9XCIjYyBvZiBjaXRpZXNcIiBbdmFsdWVdPVwiY1wiPjwvb3B0aW9uPlxuICogPC9zZWxlY3Q+XG4gKiBgYGBcbiAqL1xuQERpcmVjdGl2ZSh7c2VsZWN0b3I6ICdvcHRpb24nfSlcbmV4cG9ydCBjbGFzcyBOZ1NlbGVjdE9wdGlvbiB7XG59XG5cbi8qKlxuICogVGhlIGFjY2Vzc29yIGZvciB3cml0aW5nIGEgdmFsdWUgYW5kIGxpc3RlbmluZyB0byBjaGFuZ2VzIG9uIGEgc2VsZWN0IGVsZW1lbnQuXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ3NlbGVjdFtuZ0NvbnRyb2xdLHNlbGVjdFtuZ0Zvcm1Db250cm9sXSxzZWxlY3RbbmdNb2RlbF0nLFxuICBob3N0OiB7XG4gICAgJyhjaGFuZ2UpJzogJ29uQ2hhbmdlKCRldmVudC50YXJnZXQudmFsdWUpJyxcbiAgICAnKGlucHV0KSc6ICdvbkNoYW5nZSgkZXZlbnQudGFyZ2V0LnZhbHVlKScsXG4gICAgJyhibHVyKSc6ICdvblRvdWNoZWQoKSdcbiAgfSxcbiAgYmluZGluZ3M6IFtTRUxFQ1RfVkFMVUVfQUNDRVNTT1JdXG59KVxuZXhwb3J0IGNsYXNzIFNlbGVjdENvbnRyb2xWYWx1ZUFjY2Vzc29yIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICB2YWx1ZTogc3RyaW5nO1xuICBvbkNoYW5nZSA9IChfKSA9PiB7fTtcbiAgb25Ub3VjaGVkID0gKCkgPT4ge307XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfcmVuZGVyZXI6IFJlbmRlcmVyLCBwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICAgICAgICBAUXVlcnkoTmdTZWxlY3RPcHRpb24sIHtkZXNjZW5kYW50czogdHJ1ZX0pIHF1ZXJ5OiBRdWVyeUxpc3Q8TmdTZWxlY3RPcHRpb24+KSB7XG4gICAgdGhpcy5fdXBkYXRlVmFsdWVXaGVuTGlzdE9mT3B0aW9uc0NoYW5nZXMocXVlcnkpO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuX3JlbmRlcmVyLnNldEVsZW1lbnRQcm9wZXJ0eSh0aGlzLl9lbGVtZW50UmVmLCAndmFsdWUnLCB2YWx1ZSk7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAoKSA9PiBhbnkpOiB2b2lkIHsgdGhpcy5vbkNoYW5nZSA9IGZuOyB9XG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiBhbnkpOiB2b2lkIHsgdGhpcy5vblRvdWNoZWQgPSBmbjsgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZVZhbHVlV2hlbkxpc3RPZk9wdGlvbnNDaGFuZ2VzKHF1ZXJ5OiBRdWVyeUxpc3Q8TmdTZWxlY3RPcHRpb24+KSB7XG4gICAgT2JzZXJ2YWJsZVdyYXBwZXIuc3Vic2NyaWJlKHF1ZXJ5LmNoYW5nZXMsIChfKSA9PiB0aGlzLndyaXRlVmFsdWUodGhpcy52YWx1ZSkpO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tbW9uL2Zvcm1zL2RpcmVjdGl2ZXMvc2VsZWN0X2NvbnRyb2xfdmFsdWVfYWNjZXNzb3IudHNcbiAqKi8iLCJpbXBvcnQge1ZhbGlkYXRvcn0gZnJvbSAnLi92YWxpZGF0b3JzJztcblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVZhbGlkYXRvcih2YWxpZGF0b3I6IEZ1bmN0aW9uIHwgVmFsaWRhdG9yKTogRnVuY3Rpb24ge1xuICBpZiAoKDxWYWxpZGF0b3I+dmFsaWRhdG9yKS52YWxpZGF0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIChjKSA9PiAoPFZhbGlkYXRvcj52YWxpZGF0b3IpLnZhbGlkYXRlKGMpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiA8RnVuY3Rpb24+dmFsaWRhdG9yO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tbW9uL2Zvcm1zL2RpcmVjdGl2ZXMvbm9ybWFsaXplX3ZhbGlkYXRvci50c1xuICoqLyIsImltcG9ydCB7Q09OU1RfRVhQUn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7U3RyaW5nTWFwV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcbmltcG9ydCB7RXZlbnRFbWl0dGVyLCBPYnNlcnZhYmxlV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9hc3luYyc7XG5pbXBvcnQge1xuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZSxcbiAgUXVlcnksXG4gIERpcmVjdGl2ZSxcbiAgZm9yd2FyZFJlZixcbiAgUHJvdmlkZXIsXG4gIEluamVjdCxcbiAgT3B0aW9uYWwsXG4gIFNlbGZcbn0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5pbXBvcnQge05nQ29udHJvbH0gZnJvbSAnLi9uZ19jb250cm9sJztcbmltcG9ydCB7Q29udHJvbH0gZnJvbSAnLi4vbW9kZWwnO1xuaW1wb3J0IHtWYWxpZGF0b3JzLCBOR19WQUxJREFUT1JTLCBOR19BU1lOQ19WQUxJREFUT1JTfSBmcm9tICcuLi92YWxpZGF0b3JzJztcbmltcG9ydCB7Q29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SfSBmcm9tICcuL2NvbnRyb2xfdmFsdWVfYWNjZXNzb3InO1xuaW1wb3J0IHtcbiAgc2V0VXBDb250cm9sLFxuICBjb21wb3NlVmFsaWRhdG9ycyxcbiAgY29tcG9zZUFzeW5jVmFsaWRhdG9ycyxcbiAgaXNQcm9wZXJ0eVVwZGF0ZWQsXG4gIHNlbGVjdFZhbHVlQWNjZXNzb3Jcbn0gZnJvbSAnLi9zaGFyZWQnO1xuXG5jb25zdCBmb3JtQ29udHJvbEJpbmRpbmcgPVxuICAgIENPTlNUX0VYUFIobmV3IFByb3ZpZGVyKE5nQ29udHJvbCwge3VzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE5nRm9ybUNvbnRyb2wpfSkpO1xuXG4vKipcbiAqIEJpbmRzIGFuIGV4aXN0aW5nIHtAbGluayBDb250cm9sfSB0byBhIERPTSBlbGVtZW50LlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9qY1FsWjJ0VGgyMkJaWjJ1Y05BVD9wPXByZXZpZXcpKVxuICpcbiAqIEluIHRoaXMgZXhhbXBsZSwgd2UgYmluZCB0aGUgY29udHJvbCB0byBhbiBpbnB1dCBlbGVtZW50LiBXaGVuIHRoZSB2YWx1ZSBvZiB0aGUgaW5wdXQgZWxlbWVudFxuICogY2hhbmdlcywgdGhlIHZhbHVlIG9mIHRoZSBjb250cm9sIHdpbGwgcmVmbGVjdCB0aGF0IGNoYW5nZS4gTGlrZXdpc2UsIGlmIHRoZSB2YWx1ZSBvZiB0aGVcbiAqIGNvbnRyb2wgY2hhbmdlcywgdGhlIGlucHV0IGVsZW1lbnQgcmVmbGVjdHMgdGhhdCBjaGFuZ2UuXG4gKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqIEBDb21wb25lbnQoe1xuICogICBzZWxlY3RvcjogJ215LWFwcCcsXG4gKiAgIHRlbXBsYXRlOiBgXG4gKiAgICAgPGRpdj5cbiAqICAgICAgIDxoMj5OZ0Zvcm1Db250cm9sIEV4YW1wbGU8L2gyPlxuICogICAgICAgPGZvcm0+XG4gKiAgICAgICAgIDxwPkVsZW1lbnQgd2l0aCBleGlzdGluZyBjb250cm9sOiA8aW5wdXQgdHlwZT1cInRleHRcIlxuICogW25nRm9ybUNvbnRyb2xdPVwibG9naW5Db250cm9sXCI+PC9wPlxuICogICAgICAgICA8cD5WYWx1ZSBvZiBleGlzdGluZyBjb250cm9sOiB7e2xvZ2luQ29udHJvbC52YWx1ZX19PC9wPlxuICogICAgICAgPC9mb3JtPlxuICogICAgIDwvZGl2PlxuICogICBgLFxuICogICBkaXJlY3RpdmVzOiBbQ09SRV9ESVJFQ1RJVkVTLCBGT1JNX0RJUkVDVElWRVNdXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIEFwcCB7XG4gKiAgIGxvZ2luQ29udHJvbDogQ29udHJvbCA9IG5ldyBDb250cm9sKCcnKTtcbiAqIH1cbiAqICBgYGBcbiAqXG4gKiAjIyNuZ01vZGVsXG4gKlxuICogV2UgY2FuIGFsc28gdXNlIGBuZ01vZGVsYCB0byBiaW5kIGEgZG9tYWluIG1vZGVsIHRvIHRoZSBmb3JtLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC95SE1MdUhPN0ROZ1Q4WHZ0alRESD9wPXByZXZpZXcpKVxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiBAQ29tcG9uZW50KHtcbiAqICAgICAgc2VsZWN0b3I6IFwibG9naW4tY29tcFwiLFxuICogICAgICBkaXJlY3RpdmVzOiBbRk9STV9ESVJFQ1RJVkVTXSxcbiAqICAgICAgdGVtcGxhdGU6IFwiPGlucHV0IHR5cGU9J3RleHQnIFtuZ0Zvcm1Db250cm9sXT0nbG9naW5Db250cm9sJyBbKG5nTW9kZWwpXT0nbG9naW4nPlwiXG4gKiAgICAgIH0pXG4gKiBjbGFzcyBMb2dpbkNvbXAge1xuICogIGxvZ2luQ29udHJvbDogQ29udHJvbCA9IG5ldyBDb250cm9sKCcnKTtcbiAqICBsb2dpbjpzdHJpbmc7XG4gKiB9XG4gKiAgYGBgXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tuZ0Zvcm1Db250cm9sXScsXG4gIGJpbmRpbmdzOiBbZm9ybUNvbnRyb2xCaW5kaW5nXSxcbiAgaW5wdXRzOiBbJ2Zvcm06IG5nRm9ybUNvbnRyb2wnLCAnbW9kZWw6IG5nTW9kZWwnXSxcbiAgb3V0cHV0czogWyd1cGRhdGU6IG5nTW9kZWxDaGFuZ2UnXSxcbiAgZXhwb3J0QXM6ICduZ0Zvcm0nXG59KVxuZXhwb3J0IGNsYXNzIE5nRm9ybUNvbnRyb2wgZXh0ZW5kcyBOZ0NvbnRyb2wgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBmb3JtOiBDb250cm9sO1xuICB1cGRhdGUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIG1vZGVsOiBhbnk7XG4gIHZpZXdNb2RlbDogYW55O1xuXG4gIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIEBTZWxmKCkgQEluamVjdChOR19WQUxJREFUT1JTKSBwcml2YXRlIF92YWxpZGF0b3JzOlxuICAgICAgICAgICAgICAgICAgLyogQXJyYXk8VmFsaWRhdG9yfEZ1bmN0aW9uPiAqLyBhbnlbXSxcbiAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQFNlbGYoKSBASW5qZWN0KE5HX0FTWU5DX1ZBTElEQVRPUlMpIHByaXZhdGUgX2FzeW5jVmFsaWRhdG9yczpcbiAgICAgICAgICAgICAgICAgIC8qIEFycmF5PFZhbGlkYXRvcnxGdW5jdGlvbj4gKi8gYW55W10sXG4gICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBTZWxmKCkgQEluamVjdChOR19WQUxVRV9BQ0NFU1NPUilcbiAgICAgICAgICAgICAgdmFsdWVBY2Nlc3NvcnM6IENvbnRyb2xWYWx1ZUFjY2Vzc29yW10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMudmFsdWVBY2Nlc3NvciA9IHNlbGVjdFZhbHVlQWNjZXNzb3IodGhpcywgdmFsdWVBY2Nlc3NvcnMpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczoge1trZXk6IHN0cmluZ106IFNpbXBsZUNoYW5nZX0pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5faXNDb250cm9sQ2hhbmdlZChjaGFuZ2VzKSkge1xuICAgICAgc2V0VXBDb250cm9sKHRoaXMuZm9ybSwgdGhpcyk7XG4gICAgICB0aGlzLmZvcm0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgIH1cbiAgICBpZiAoaXNQcm9wZXJ0eVVwZGF0ZWQoY2hhbmdlcywgdGhpcy52aWV3TW9kZWwpKSB7XG4gICAgICB0aGlzLmZvcm0udXBkYXRlVmFsdWUodGhpcy5tb2RlbCk7XG4gICAgICB0aGlzLnZpZXdNb2RlbCA9IHRoaXMubW9kZWw7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHBhdGgoKTogc3RyaW5nW10geyByZXR1cm4gW107IH1cblxuICBnZXQgdmFsaWRhdG9yKCk6IEZ1bmN0aW9uIHsgcmV0dXJuIGNvbXBvc2VWYWxpZGF0b3JzKHRoaXMuX3ZhbGlkYXRvcnMpOyB9XG5cbiAgZ2V0IGFzeW5jVmFsaWRhdG9yKCk6IEZ1bmN0aW9uIHsgcmV0dXJuIGNvbXBvc2VBc3luY1ZhbGlkYXRvcnModGhpcy5fYXN5bmNWYWxpZGF0b3JzKTsgfVxuXG4gIGdldCBjb250cm9sKCk6IENvbnRyb2wgeyByZXR1cm4gdGhpcy5mb3JtOyB9XG5cbiAgdmlld1RvTW9kZWxVcGRhdGUobmV3VmFsdWU6IGFueSk6IHZvaWQge1xuICAgIHRoaXMudmlld01vZGVsID0gbmV3VmFsdWU7XG4gICAgT2JzZXJ2YWJsZVdyYXBwZXIuY2FsbEVtaXQodGhpcy51cGRhdGUsIG5ld1ZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgX2lzQ29udHJvbENoYW5nZWQoY2hhbmdlczoge1trZXk6IHN0cmluZ106IGFueX0pOiBib29sZWFuIHtcbiAgICByZXR1cm4gU3RyaW5nTWFwV3JhcHBlci5jb250YWlucyhjaGFuZ2VzLCBcImZvcm1cIik7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21tb24vZm9ybXMvZGlyZWN0aXZlcy9uZ19mb3JtX2NvbnRyb2wudHNcbiAqKi8iLCJpbXBvcnQge0NPTlNUX0VYUFJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge0V2ZW50RW1pdHRlciwgT2JzZXJ2YWJsZVdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvYXN5bmMnO1xuaW1wb3J0IHtcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2UsXG4gIFF1ZXJ5LFxuICBEaXJlY3RpdmUsXG4gIGZvcndhcmRSZWYsXG4gIFByb3ZpZGVyLFxuICBJbmplY3QsXG4gIE9wdGlvbmFsLFxuICBTZWxmXG59IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuaW1wb3J0IHtDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1J9IGZyb20gJy4vY29udHJvbF92YWx1ZV9hY2Nlc3Nvcic7XG5pbXBvcnQge05nQ29udHJvbH0gZnJvbSAnLi9uZ19jb250cm9sJztcbmltcG9ydCB7Q29udHJvbH0gZnJvbSAnLi4vbW9kZWwnO1xuaW1wb3J0IHtWYWxpZGF0b3JzLCBOR19WQUxJREFUT1JTLCBOR19BU1lOQ19WQUxJREFUT1JTfSBmcm9tICcuLi92YWxpZGF0b3JzJztcbmltcG9ydCB7XG4gIHNldFVwQ29udHJvbCxcbiAgaXNQcm9wZXJ0eVVwZGF0ZWQsXG4gIHNlbGVjdFZhbHVlQWNjZXNzb3IsXG4gIGNvbXBvc2VWYWxpZGF0b3JzLFxuICBjb21wb3NlQXN5bmNWYWxpZGF0b3JzXG59IGZyb20gJy4vc2hhcmVkJztcblxuY29uc3QgZm9ybUNvbnRyb2xCaW5kaW5nID1cbiAgICBDT05TVF9FWFBSKG5ldyBQcm92aWRlcihOZ0NvbnRyb2wsIHt1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOZ01vZGVsKX0pKTtcblxuLyoqXG4gKiBCaW5kcyBhIGRvbWFpbiBtb2RlbCB0byBhIGZvcm0gY29udHJvbC5cbiAqXG4gKiAjIyMgVXNhZ2VcbiAqXG4gKiBgbmdNb2RlbGAgYmluZHMgYW4gZXhpc3RpbmcgZG9tYWluIG1vZGVsIHRvIGEgZm9ybSBjb250cm9sLiBGb3IgYVxuICogdHdvLXdheSBiaW5kaW5nLCB1c2UgYFsobmdNb2RlbCldYCB0byBlbnN1cmUgdGhlIG1vZGVsIHVwZGF0ZXMgaW5cbiAqIGJvdGggZGlyZWN0aW9ucy5cbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvUjNVWDVxRGFVcUZPMlZZUjBVekg/cD1wcmV2aWV3KSlcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiBAQ29tcG9uZW50KHtcbiAqICAgICAgc2VsZWN0b3I6IFwic2VhcmNoLWNvbXBcIixcbiAqICAgICAgZGlyZWN0aXZlczogW0ZPUk1fRElSRUNUSVZFU10sXG4gKiAgICAgIHRlbXBsYXRlOiBgPGlucHV0IHR5cGU9J3RleHQnIFsobmdNb2RlbCldPVwic2VhcmNoUXVlcnlcIj5gXG4gKiAgICAgIH0pXG4gKiBjbGFzcyBTZWFyY2hDb21wIHtcbiAqICBzZWFyY2hRdWVyeTogc3RyaW5nO1xuICogfVxuICogIGBgYFxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbmdNb2RlbF06bm90KFtuZ0NvbnRyb2xdKTpub3QoW25nRm9ybUNvbnRyb2xdKScsXG4gIGJpbmRpbmdzOiBbZm9ybUNvbnRyb2xCaW5kaW5nXSxcbiAgaW5wdXRzOiBbJ21vZGVsOiBuZ01vZGVsJ10sXG4gIG91dHB1dHM6IFsndXBkYXRlOiBuZ01vZGVsQ2hhbmdlJ10sXG4gIGV4cG9ydEFzOiAnbmdGb3JtJ1xufSlcbmV4cG9ydCBjbGFzcyBOZ01vZGVsIGV4dGVuZHMgTmdDb250cm9sIGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfY29udHJvbCA9IG5ldyBDb250cm9sKCk7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2FkZGVkID0gZmFsc2U7XG4gIHVwZGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgbW9kZWw6IGFueTtcbiAgdmlld01vZGVsOiBhbnk7XG5cbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgQFNlbGYoKSBASW5qZWN0KE5HX1ZBTElEQVRPUlMpIHByaXZhdGUgX3ZhbGlkYXRvcnM6IGFueVtdLFxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBAU2VsZigpIEBJbmplY3QoTkdfQVNZTkNfVkFMSURBVE9SUykgcHJpdmF0ZSBfYXN5bmNWYWxpZGF0b3JzOiBhbnlbXSxcbiAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQFNlbGYoKSBASW5qZWN0KE5HX1ZBTFVFX0FDQ0VTU09SKVxuICAgICAgICAgICAgICB2YWx1ZUFjY2Vzc29yczogQ29udHJvbFZhbHVlQWNjZXNzb3JbXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy52YWx1ZUFjY2Vzc29yID0gc2VsZWN0VmFsdWVBY2Nlc3Nvcih0aGlzLCB2YWx1ZUFjY2Vzc29ycyk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiB7W2tleTogc3RyaW5nXTogU2ltcGxlQ2hhbmdlfSkge1xuICAgIGlmICghdGhpcy5fYWRkZWQpIHtcbiAgICAgIHNldFVwQ29udHJvbCh0aGlzLl9jb250cm9sLCB0aGlzKTtcbiAgICAgIHRoaXMuX2NvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgICAgdGhpcy5fYWRkZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChpc1Byb3BlcnR5VXBkYXRlZChjaGFuZ2VzLCB0aGlzLnZpZXdNb2RlbCkpIHtcbiAgICAgIHRoaXMuX2NvbnRyb2wudXBkYXRlVmFsdWUodGhpcy5tb2RlbCk7XG4gICAgICB0aGlzLnZpZXdNb2RlbCA9IHRoaXMubW9kZWw7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGNvbnRyb2woKTogQ29udHJvbCB7IHJldHVybiB0aGlzLl9jb250cm9sOyB9XG5cbiAgZ2V0IHBhdGgoKTogc3RyaW5nW10geyByZXR1cm4gW107IH1cblxuICBnZXQgdmFsaWRhdG9yKCk6IEZ1bmN0aW9uIHsgcmV0dXJuIGNvbXBvc2VWYWxpZGF0b3JzKHRoaXMuX3ZhbGlkYXRvcnMpOyB9XG5cbiAgZ2V0IGFzeW5jVmFsaWRhdG9yKCk6IEZ1bmN0aW9uIHsgcmV0dXJuIGNvbXBvc2VBc3luY1ZhbGlkYXRvcnModGhpcy5fYXN5bmNWYWxpZGF0b3JzKTsgfVxuXG4gIHZpZXdUb01vZGVsVXBkYXRlKG5ld1ZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdNb2RlbCA9IG5ld1ZhbHVlO1xuICAgIE9ic2VydmFibGVXcmFwcGVyLmNhbGxFbWl0KHRoaXMudXBkYXRlLCBuZXdWYWx1ZSk7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21tb24vZm9ybXMvZGlyZWN0aXZlcy9uZ19tb2RlbC50c1xuICoqLyIsImltcG9ydCB7XG4gIE9uSW5pdCxcbiAgT25EZXN0cm95LFxuICBEaXJlY3RpdmUsXG4gIE9wdGlvbmFsLFxuICBJbmplY3QsXG4gIEhvc3QsXG4gIFNraXBTZWxmLFxuICBmb3J3YXJkUmVmLFxuICBQcm92aWRlcixcbiAgU2VsZlxufSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbmltcG9ydCB7Q09OU1RfRVhQUn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxuaW1wb3J0IHtDb250cm9sQ29udGFpbmVyfSBmcm9tICcuL2NvbnRyb2xfY29udGFpbmVyJztcbmltcG9ydCB7Y29udHJvbFBhdGgsIGNvbXBvc2VWYWxpZGF0b3JzLCBjb21wb3NlQXN5bmNWYWxpZGF0b3JzfSBmcm9tICcuL3NoYXJlZCc7XG5pbXBvcnQge0NvbnRyb2xHcm91cH0gZnJvbSAnLi4vbW9kZWwnO1xuaW1wb3J0IHtGb3JtfSBmcm9tICcuL2Zvcm1faW50ZXJmYWNlJztcbmltcG9ydCB7VmFsaWRhdG9ycywgTkdfVkFMSURBVE9SUywgTkdfQVNZTkNfVkFMSURBVE9SU30gZnJvbSAnLi4vdmFsaWRhdG9ycyc7XG5cbmNvbnN0IGNvbnRyb2xHcm91cFByb3ZpZGVyID1cbiAgICBDT05TVF9FWFBSKG5ldyBQcm92aWRlcihDb250cm9sQ29udGFpbmVyLCB7dXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTmdDb250cm9sR3JvdXApfSkpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW5kIGJpbmRzIGEgY29udHJvbCBncm91cCB0byBhIERPTSBlbGVtZW50LlxuICpcbiAqIFRoaXMgZGlyZWN0aXZlIGNhbiBvbmx5IGJlIHVzZWQgYXMgYSBjaGlsZCBvZiB7QGxpbmsgTmdGb3JtfSBvciB7QGxpbmsgTmdGb3JtTW9kZWx9LlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC83RUoxMXVHZWFnZ1ZpWU02VDVucT9wPXByZXZpZXcpKVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIEBDb21wb25lbnQoe1xuICogICBzZWxlY3RvcjogJ215LWFwcCcsXG4gKiAgIGRpcmVjdGl2ZXM6IFtGT1JNX0RJUkVDVElWRVNdLFxuICogfSlcbiAqIEBWaWV3KHtcbiAqICAgdGVtcGxhdGU6IGBcbiAqICAgICA8ZGl2PlxuICogICAgICAgPGgyPkFuZ3VsYXIyIENvbnRyb2wgJmFtcDsgQ29udHJvbEdyb3VwIEV4YW1wbGU8L2gyPlxuICogICAgICAgPGZvcm0gI2Y9XCJuZ0Zvcm1cIj5cbiAqICAgICAgICAgPGRpdiBuZ0NvbnRyb2xHcm91cD1cIm5hbWVcIiAjY2ctbmFtZT1cImZvcm1cIj5cbiAqICAgICAgICAgICA8aDM+RW50ZXIgeW91ciBuYW1lOjwvaDM+XG4gKiAgICAgICAgICAgPHA+Rmlyc3Q6IDxpbnB1dCBuZ0NvbnRyb2w9XCJmaXJzdFwiIHJlcXVpcmVkPjwvcD5cbiAqICAgICAgICAgICA8cD5NaWRkbGU6IDxpbnB1dCBuZ0NvbnRyb2w9XCJtaWRkbGVcIj48L3A+XG4gKiAgICAgICAgICAgPHA+TGFzdDogPGlucHV0IG5nQ29udHJvbD1cImxhc3RcIiByZXF1aXJlZD48L3A+XG4gKiAgICAgICAgIDwvZGl2PlxuICogICAgICAgICA8aDM+TmFtZSB2YWx1ZTo8L2gzPlxuICogICAgICAgICA8cHJlPnt7dmFsdWVPZihjZ05hbWUpfX08L3ByZT5cbiAqICAgICAgICAgPHA+TmFtZSBpcyB7e2NnTmFtZT8uY29udHJvbD8udmFsaWQgPyBcInZhbGlkXCIgOiBcImludmFsaWRcIn19PC9wPlxuICogICAgICAgICA8aDM+V2hhdCdzIHlvdXIgZmF2b3JpdGUgZm9vZD88L2gzPlxuICogICAgICAgICA8cD48aW5wdXQgbmdDb250cm9sPVwiZm9vZFwiPjwvcD5cbiAqICAgICAgICAgPGgzPkZvcm0gdmFsdWU8L2gzPlxuICogICAgICAgICA8cHJlPnt7dmFsdWVPZihmKX19PC9wcmU+XG4gKiAgICAgICA8L2Zvcm0+XG4gKiAgICAgPC9kaXY+XG4gKiAgIGAsXG4gKiAgIGRpcmVjdGl2ZXM6IFtGT1JNX0RJUkVDVElWRVNdXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIEFwcCB7XG4gKiAgIHZhbHVlT2YoY2c6IE5nQ29udHJvbEdyb3VwKTogc3RyaW5nIHtcbiAqICAgICBpZiAoY2cuY29udHJvbCA9PSBudWxsKSB7XG4gKiAgICAgICByZXR1cm4gbnVsbDtcbiAqICAgICB9XG4gKiAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGNnLmNvbnRyb2wudmFsdWUsIG51bGwsIDIpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBUaGlzIGV4YW1wbGUgZGVjbGFyZXMgYSBjb250cm9sIGdyb3VwIGZvciBhIHVzZXIncyBuYW1lLiBUaGUgdmFsdWUgYW5kIHZhbGlkYXRpb24gc3RhdGUgb2ZcbiAqIHRoaXMgZ3JvdXAgY2FuIGJlIGFjY2Vzc2VkIHNlcGFyYXRlbHkgZnJvbSB0aGUgb3ZlcmFsbCBmb3JtLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbmdDb250cm9sR3JvdXBdJyxcbiAgcHJvdmlkZXJzOiBbY29udHJvbEdyb3VwUHJvdmlkZXJdLFxuICBpbnB1dHM6IFsnbmFtZTogbmdDb250cm9sR3JvdXAnXSxcbiAgZXhwb3J0QXM6ICduZ0Zvcm0nXG59KVxuZXhwb3J0IGNsYXNzIE5nQ29udHJvbEdyb3VwIGV4dGVuZHMgQ29udHJvbENvbnRhaW5lciBpbXBsZW1lbnRzIE9uSW5pdCxcbiAgICBPbkRlc3Ryb3kge1xuICAvKiogQGludGVybmFsICovXG4gIF9wYXJlbnQ6IENvbnRyb2xDb250YWluZXI7XG5cbiAgY29uc3RydWN0b3IoQEhvc3QoKSBAU2tpcFNlbGYoKSBwYXJlbnQ6IENvbnRyb2xDb250YWluZXIsXG4gICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBTZWxmKCkgQEluamVjdChOR19WQUxJREFUT1JTKSBwcml2YXRlIF92YWxpZGF0b3JzOiBhbnlbXSxcbiAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQFNlbGYoKSBASW5qZWN0KE5HX0FTWU5DX1ZBTElEQVRPUlMpIHByaXZhdGUgX2FzeW5jVmFsaWRhdG9yczogYW55W10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQgeyB0aGlzLmZvcm1EaXJlY3RpdmUuYWRkQ29udHJvbEdyb3VwKHRoaXMpOyB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7IHRoaXMuZm9ybURpcmVjdGl2ZS5yZW1vdmVDb250cm9sR3JvdXAodGhpcyk7IH1cblxuICAvKipcbiAgICogR2V0IHRoZSB7QGxpbmsgQ29udHJvbEdyb3VwfSBiYWNraW5nIHRoaXMgYmluZGluZy5cbiAgICovXG4gIGdldCBjb250cm9sKCk6IENvbnRyb2xHcm91cCB7IHJldHVybiB0aGlzLmZvcm1EaXJlY3RpdmUuZ2V0Q29udHJvbEdyb3VwKHRoaXMpOyB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcGF0aCB0byB0aGlzIGNvbnRyb2wgZ3JvdXAuXG4gICAqL1xuICBnZXQgcGF0aCgpOiBzdHJpbmdbXSB7IHJldHVybiBjb250cm9sUGF0aCh0aGlzLm5hbWUsIHRoaXMuX3BhcmVudCk7IH1cblxuICAvKipcbiAgICogR2V0IHRoZSB7QGxpbmsgRm9ybX0gdG8gd2hpY2ggdGhpcyBncm91cCBiZWxvbmdzLlxuICAgKi9cbiAgZ2V0IGZvcm1EaXJlY3RpdmUoKTogRm9ybSB7IHJldHVybiB0aGlzLl9wYXJlbnQuZm9ybURpcmVjdGl2ZTsgfVxuXG4gIGdldCB2YWxpZGF0b3IoKTogRnVuY3Rpb24geyByZXR1cm4gY29tcG9zZVZhbGlkYXRvcnModGhpcy5fdmFsaWRhdG9ycyk7IH1cblxuICBnZXQgYXN5bmNWYWxpZGF0b3IoKTogRnVuY3Rpb24geyByZXR1cm4gY29tcG9zZUFzeW5jVmFsaWRhdG9ycyh0aGlzLl9hc3luY1ZhbGlkYXRvcnMpOyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tbW9uL2Zvcm1zL2RpcmVjdGl2ZXMvbmdfY29udHJvbF9ncm91cC50c1xuICoqLyIsImltcG9ydCB7Q09OU1RfRVhQUn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7TGlzdFdyYXBwZXIsIFN0cmluZ01hcFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge09ic2VydmFibGVXcmFwcGVyLCBFdmVudEVtaXR0ZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvYXN5bmMnO1xuaW1wb3J0IHtcbiAgU2ltcGxlQ2hhbmdlLFxuICBPbkNoYW5nZXMsXG4gIERpcmVjdGl2ZSxcbiAgZm9yd2FyZFJlZixcbiAgUHJvdmlkZXIsXG4gIEluamVjdCxcbiAgT3B0aW9uYWwsXG4gIFNlbGZcbn0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5pbXBvcnQge05nQ29udHJvbH0gZnJvbSAnLi9uZ19jb250cm9sJztcbmltcG9ydCB7TmdDb250cm9sR3JvdXB9IGZyb20gJy4vbmdfY29udHJvbF9ncm91cCc7XG5pbXBvcnQge0NvbnRyb2xDb250YWluZXJ9IGZyb20gJy4vY29udHJvbF9jb250YWluZXInO1xuaW1wb3J0IHtGb3JtfSBmcm9tICcuL2Zvcm1faW50ZXJmYWNlJztcbmltcG9ydCB7Q29udHJvbCwgQ29udHJvbEdyb3VwfSBmcm9tICcuLi9tb2RlbCc7XG5pbXBvcnQge3NldFVwQ29udHJvbCwgc2V0VXBDb250cm9sR3JvdXAsIGNvbXBvc2VWYWxpZGF0b3JzLCBjb21wb3NlQXN5bmNWYWxpZGF0b3JzfSBmcm9tICcuL3NoYXJlZCc7XG5pbXBvcnQge1ZhbGlkYXRvcnMsIE5HX1ZBTElEQVRPUlMsIE5HX0FTWU5DX1ZBTElEQVRPUlN9IGZyb20gJy4uL3ZhbGlkYXRvcnMnO1xuXG5jb25zdCBmb3JtRGlyZWN0aXZlUHJvdmlkZXIgPVxuICAgIENPTlNUX0VYUFIobmV3IFByb3ZpZGVyKENvbnRyb2xDb250YWluZXIsIHt1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOZ0Zvcm1Nb2RlbCl9KSk7XG5cbi8qKlxuICogQmluZHMgYW4gZXhpc3RpbmcgY29udHJvbCBncm91cCB0byBhIERPTSBlbGVtZW50LlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9qcXJWaXJ1ZFk4YW5KeFRNVWpUUD9wPXByZXZpZXcpKVxuICpcbiAqIEluIHRoaXMgZXhhbXBsZSwgd2UgYmluZCB0aGUgY29udHJvbCBncm91cCB0byB0aGUgZm9ybSBlbGVtZW50LCBhbmQgd2UgYmluZCB0aGUgbG9naW4gYW5kXG4gKiBwYXNzd29yZCBjb250cm9scyB0byB0aGUgbG9naW4gYW5kIHBhc3N3b3JkIGVsZW1lbnRzLlxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICdteS1hcHAnLFxuICogICB0ZW1wbGF0ZTogYFxuICogICAgIDxkaXY+XG4gKiAgICAgICA8aDI+TmdGb3JtTW9kZWwgRXhhbXBsZTwvaDI+XG4gKiAgICAgICA8Zm9ybSBbbmdGb3JtTW9kZWxdPVwibG9naW5Gb3JtXCI+XG4gKiAgICAgICAgIDxwPkxvZ2luOiA8aW5wdXQgdHlwZT1cInRleHRcIiBuZ0NvbnRyb2w9XCJsb2dpblwiPjwvcD5cbiAqICAgICAgICAgPHA+UGFzc3dvcmQ6IDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBuZ0NvbnRyb2w9XCJwYXNzd29yZFwiPjwvcD5cbiAqICAgICAgIDwvZm9ybT5cbiAqICAgICAgIDxwPlZhbHVlOjwvcD5cbiAqICAgICAgIDxwcmU+e3t2YWx1ZX19PC9wcmU+XG4gKiAgICAgPC9kaXY+XG4gKiAgIGAsXG4gKiAgIGRpcmVjdGl2ZXM6IFtGT1JNX0RJUkVDVElWRVNdXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIEFwcCB7XG4gKiAgIGxvZ2luRm9ybTogQ29udHJvbEdyb3VwO1xuICpcbiAqICAgY29uc3RydWN0b3IoKSB7XG4gKiAgICAgdGhpcy5sb2dpbkZvcm0gPSBuZXcgQ29udHJvbEdyb3VwKHtcbiAqICAgICAgIGxvZ2luOiBuZXcgQ29udHJvbChcIlwiKSxcbiAqICAgICAgIHBhc3N3b3JkOiBuZXcgQ29udHJvbChcIlwiKVxuICogICAgIH0pO1xuICogICB9XG4gKlxuICogICBnZXQgdmFsdWUoKTogc3RyaW5nIHtcbiAqICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5sb2dpbkZvcm0udmFsdWUsIG51bGwsIDIpO1xuICogICB9XG4gKiB9XG4gKiAgYGBgXG4gKlxuICogV2UgY2FuIGFsc28gdXNlIG5nTW9kZWwgdG8gYmluZCBhIGRvbWFpbiBtb2RlbCB0byB0aGUgZm9ybS5cbiAqXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogQENvbXBvbmVudCh7XG4gKiAgICAgIHNlbGVjdG9yOiBcImxvZ2luLWNvbXBcIixcbiAqICAgICAgZGlyZWN0aXZlczogW0ZPUk1fRElSRUNUSVZFU10sXG4gKiAgICAgIHRlbXBsYXRlOiBgXG4gKiAgICAgICAgPGZvcm0gW25nRm9ybU1vZGVsXT0nbG9naW5Gb3JtJz5cbiAqICAgICAgICAgIExvZ2luIDxpbnB1dCB0eXBlPSd0ZXh0JyBuZ0NvbnRyb2w9J2xvZ2luJyBbKG5nTW9kZWwpXT0nY3JlZGVudGlhbHMubG9naW4nPlxuICogICAgICAgICAgUGFzc3dvcmQgPGlucHV0IHR5cGU9J3Bhc3N3b3JkJyBuZ0NvbnRyb2w9J3Bhc3N3b3JkJ1xuICogICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPSdjcmVkZW50aWFscy5wYXNzd29yZCc+XG4gKiAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJvbkxvZ2luKClcIj5Mb2dpbjwvYnV0dG9uPlxuICogICAgICAgIDwvZm9ybT5gXG4gKiAgICAgIH0pXG4gKiBjbGFzcyBMb2dpbkNvbXAge1xuICogIGNyZWRlbnRpYWxzOiB7bG9naW46IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZ307XG4gKiAgbG9naW5Gb3JtOiBDb250cm9sR3JvdXA7XG4gKlxuICogIGNvbnN0cnVjdG9yKCkge1xuICogICAgdGhpcy5sb2dpbkZvcm0gPSBuZXcgQ29udHJvbEdyb3VwKHtcbiAqICAgICAgbG9naW46IG5ldyBDb250cm9sKFwiXCIpLFxuICogICAgICBwYXNzd29yZDogbmV3IENvbnRyb2woXCJcIilcbiAqICAgIH0pO1xuICogIH1cbiAqXG4gKiAgb25Mb2dpbigpOiB2b2lkIHtcbiAqICAgIC8vIHRoaXMuY3JlZGVudGlhbHMubG9naW4gPT09ICdzb21lIGxvZ2luJ1xuICogICAgLy8gdGhpcy5jcmVkZW50aWFscy5wYXNzd29yZCA9PT0gJ3NvbWUgcGFzc3dvcmQnXG4gKiAgfVxuICogfVxuICogIGBgYFxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbmdGb3JtTW9kZWxdJyxcbiAgYmluZGluZ3M6IFtmb3JtRGlyZWN0aXZlUHJvdmlkZXJdLFxuICBpbnB1dHM6IFsnZm9ybTogbmdGb3JtTW9kZWwnXSxcbiAgaG9zdDogeycoc3VibWl0KSc6ICdvblN1Ym1pdCgpJ30sXG4gIG91dHB1dHM6IFsnbmdTdWJtaXQnXSxcbiAgZXhwb3J0QXM6ICduZ0Zvcm0nXG59KVxuZXhwb3J0IGNsYXNzIE5nRm9ybU1vZGVsIGV4dGVuZHMgQ29udHJvbENvbnRhaW5lciBpbXBsZW1lbnRzIEZvcm0sXG4gICAgT25DaGFuZ2VzIHtcbiAgZm9ybTogQ29udHJvbEdyb3VwID0gbnVsbDtcbiAgZGlyZWN0aXZlczogTmdDb250cm9sW10gPSBbXTtcbiAgbmdTdWJtaXQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgQFNlbGYoKSBASW5qZWN0KE5HX1ZBTElEQVRPUlMpIHByaXZhdGUgX3ZhbGlkYXRvcnM6IGFueVtdLFxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBAU2VsZigpIEBJbmplY3QoTkdfQVNZTkNfVkFMSURBVE9SUykgcHJpdmF0ZSBfYXN5bmNWYWxpZGF0b3JzOiBhbnlbXSkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiB7W2tleTogc3RyaW5nXTogU2ltcGxlQ2hhbmdlfSk6IHZvaWQge1xuICAgIGlmIChTdHJpbmdNYXBXcmFwcGVyLmNvbnRhaW5zKGNoYW5nZXMsIFwiZm9ybVwiKSkge1xuICAgICAgdmFyIHN5bmMgPSBjb21wb3NlVmFsaWRhdG9ycyh0aGlzLl92YWxpZGF0b3JzKTtcbiAgICAgIHRoaXMuZm9ybS52YWxpZGF0b3IgPSBWYWxpZGF0b3JzLmNvbXBvc2UoW3RoaXMuZm9ybS52YWxpZGF0b3IsIHN5bmNdKTtcblxuICAgICAgdmFyIGFzeW5jID0gY29tcG9zZUFzeW5jVmFsaWRhdG9ycyh0aGlzLl9hc3luY1ZhbGlkYXRvcnMpO1xuICAgICAgdGhpcy5mb3JtLmFzeW5jVmFsaWRhdG9yID0gVmFsaWRhdG9ycy5jb21wb3NlQXN5bmMoW3RoaXMuZm9ybS5hc3luY1ZhbGlkYXRvciwgYXN5bmNdKTtcblxuICAgICAgdGhpcy5mb3JtLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoe29ubHlTZWxmOiB0cnVlLCBlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgfVxuXG4gICAgdGhpcy5fdXBkYXRlRG9tVmFsdWUoKTtcbiAgfVxuXG4gIGdldCBmb3JtRGlyZWN0aXZlKCk6IEZvcm0geyByZXR1cm4gdGhpczsgfVxuXG4gIGdldCBjb250cm9sKCk6IENvbnRyb2xHcm91cCB7IHJldHVybiB0aGlzLmZvcm07IH1cblxuICBnZXQgcGF0aCgpOiBzdHJpbmdbXSB7IHJldHVybiBbXTsgfVxuXG4gIGFkZENvbnRyb2woZGlyOiBOZ0NvbnRyb2wpOiB2b2lkIHtcbiAgICB2YXIgY3RybDogYW55ID0gdGhpcy5mb3JtLmZpbmQoZGlyLnBhdGgpO1xuICAgIHNldFVwQ29udHJvbChjdHJsLCBkaXIpO1xuICAgIGN0cmwudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgIHRoaXMuZGlyZWN0aXZlcy5wdXNoKGRpcik7XG4gIH1cblxuICBnZXRDb250cm9sKGRpcjogTmdDb250cm9sKTogQ29udHJvbCB7IHJldHVybiA8Q29udHJvbD50aGlzLmZvcm0uZmluZChkaXIucGF0aCk7IH1cblxuICByZW1vdmVDb250cm9sKGRpcjogTmdDb250cm9sKTogdm9pZCB7IExpc3RXcmFwcGVyLnJlbW92ZSh0aGlzLmRpcmVjdGl2ZXMsIGRpcik7IH1cblxuICBhZGRDb250cm9sR3JvdXAoZGlyOiBOZ0NvbnRyb2xHcm91cCkge1xuICAgIHZhciBjdHJsOiBhbnkgPSB0aGlzLmZvcm0uZmluZChkaXIucGF0aCk7XG4gICAgc2V0VXBDb250cm9sR3JvdXAoY3RybCwgZGlyKTtcbiAgICBjdHJsLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoe2VtaXRFdmVudDogZmFsc2V9KTtcbiAgfVxuXG4gIHJlbW92ZUNvbnRyb2xHcm91cChkaXI6IE5nQ29udHJvbEdyb3VwKSB7fVxuXG4gIGdldENvbnRyb2xHcm91cChkaXI6IE5nQ29udHJvbEdyb3VwKTogQ29udHJvbEdyb3VwIHtcbiAgICByZXR1cm4gPENvbnRyb2xHcm91cD50aGlzLmZvcm0uZmluZChkaXIucGF0aCk7XG4gIH1cblxuICB1cGRhdGVNb2RlbChkaXI6IE5nQ29udHJvbCwgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIHZhciBjdHJswqAgPSA8Q29udHJvbD50aGlzLmZvcm0uZmluZChkaXIucGF0aCk7XG4gICAgY3RybC51cGRhdGVWYWx1ZSh2YWx1ZSk7XG4gIH1cblxuICBvblN1Ym1pdCgpOiBib29sZWFuIHtcbiAgICBPYnNlcnZhYmxlV3JhcHBlci5jYWxsRW1pdCh0aGlzLm5nU3VibWl0LCBudWxsKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF91cGRhdGVEb21WYWx1ZSgpIHtcbiAgICB0aGlzLmRpcmVjdGl2ZXMuZm9yRWFjaChkaXIgPT4ge1xuICAgICAgdmFyIGN0cmw6IGFueSA9IHRoaXMuZm9ybS5maW5kKGRpci5wYXRoKTtcbiAgICAgIGRpci52YWx1ZUFjY2Vzc29yLndyaXRlVmFsdWUoY3RybC52YWx1ZSk7XG4gICAgfSk7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21tb24vZm9ybXMvZGlyZWN0aXZlcy9uZ19mb3JtX21vZGVsLnRzXG4gKiovIiwiaW1wb3J0IHtcbiAgUHJvbWlzZVdyYXBwZXIsXG4gIE9ic2VydmFibGVXcmFwcGVyLFxuICBFdmVudEVtaXR0ZXIsXG4gIFByb21pc2VDb21wbGV0ZXJcbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9hc3luYyc7XG5pbXBvcnQge1N0cmluZ01hcFdyYXBwZXIsIExpc3RXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtpc1ByZXNlbnQsIGlzQmxhbmssIENPTlNUX0VYUFJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge0RpcmVjdGl2ZSwgZm9yd2FyZFJlZiwgUHJvdmlkZXIsIE9wdGlvbmFsLCBJbmplY3QsIFNlbGZ9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuaW1wb3J0IHtOZ0NvbnRyb2x9IGZyb20gJy4vbmdfY29udHJvbCc7XG5pbXBvcnQge0Zvcm19IGZyb20gJy4vZm9ybV9pbnRlcmZhY2UnO1xuaW1wb3J0IHtOZ0NvbnRyb2xHcm91cH0gZnJvbSAnLi9uZ19jb250cm9sX2dyb3VwJztcbmltcG9ydCB7Q29udHJvbENvbnRhaW5lcn0gZnJvbSAnLi9jb250cm9sX2NvbnRhaW5lcic7XG5pbXBvcnQge0Fic3RyYWN0Q29udHJvbCwgQ29udHJvbEdyb3VwLCBDb250cm9sfSBmcm9tICcuLi9tb2RlbCc7XG5pbXBvcnQge3NldFVwQ29udHJvbCwgc2V0VXBDb250cm9sR3JvdXAsIGNvbXBvc2VWYWxpZGF0b3JzLCBjb21wb3NlQXN5bmNWYWxpZGF0b3JzfSBmcm9tICcuL3NoYXJlZCc7XG5pbXBvcnQge1ZhbGlkYXRvcnMsIE5HX1ZBTElEQVRPUlMsIE5HX0FTWU5DX1ZBTElEQVRPUlN9IGZyb20gJy4uL3ZhbGlkYXRvcnMnO1xuXG5jb25zdCBmb3JtRGlyZWN0aXZlUHJvdmlkZXIgPVxuICAgIENPTlNUX0VYUFIobmV3IFByb3ZpZGVyKENvbnRyb2xDb250YWluZXIsIHt1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOZ0Zvcm0pfSkpO1xuXG4vKipcbiAqIElmIGBOZ0Zvcm1gIGlzIGJvdW5kIGluIGEgY29tcG9uZW50LCBgPGZvcm0+YCBlbGVtZW50cyBpbiB0aGF0IGNvbXBvbmVudCB3aWxsIGJlXG4gKiB1cGdyYWRlZCB0byB1c2UgdGhlIEFuZ3VsYXIgZm9ybSBzeXN0ZW0uXG4gKlxuICogIyMjIFR5cGljYWwgVXNlXG4gKlxuICogSW5jbHVkZSBgRk9STV9ESVJFQ1RJVkVTYCBpbiB0aGUgYGRpcmVjdGl2ZXNgIHNlY3Rpb24gb2YgYSB7QGxpbmsgVmlld30gYW5ub3RhdGlvblxuICogdG8gdXNlIGBOZ0Zvcm1gIGFuZCBpdHMgYXNzb2NpYXRlZCBjb250cm9scy5cbiAqXG4gKiAjIyMgU3RydWN0dXJlXG4gKlxuICogQW4gQW5ndWxhciBmb3JtIGlzIGEgY29sbGVjdGlvbiBvZiBgQ29udHJvbGBzIGluIHNvbWUgaGllcmFyY2h5LlxuICogYENvbnRyb2xgcyBjYW4gYmUgYXQgdGhlIHRvcCBsZXZlbCBvciBjYW4gYmUgb3JnYW5pemVkIGluIGBDb250cm9sR3JvdXBgc1xuICogb3IgYENvbnRyb2xBcnJheWBzLiBUaGlzIGhpZXJhcmNoeSBpcyByZWZsZWN0ZWQgaW4gdGhlIGZvcm0ncyBgdmFsdWVgLCBhXG4gKiBKU09OIG9iamVjdCB0aGF0IG1pcnJvcnMgdGhlIGZvcm0gc3RydWN0dXJlLlxuICpcbiAqICMjIyBTdWJtaXNzaW9uXG4gKlxuICogVGhlIGBuZ1N1Ym1pdGAgZXZlbnQgc2lnbmFscyB3aGVuIHRoZSB1c2VyIHRyaWdnZXJzIGEgZm9ybSBzdWJtaXNzaW9uLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9sdGRnWWo0UDBpWTY0QVI3MUVwTD9wPXByZXZpZXcpKVxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICdteS1hcHAnLFxuICogICB0ZW1wbGF0ZTogYFxuICogICAgIDxkaXY+XG4gKiAgICAgICA8cD5TdWJtaXQgdGhlIGZvcm0gdG8gc2VlIHRoZSBkYXRhIG9iamVjdCBBbmd1bGFyIGJ1aWxkczwvcD5cbiAqICAgICAgIDxoMj5OZ0Zvcm0gZGVtbzwvaDI+XG4gKiAgICAgICA8Zm9ybSAjZj1cIm5nRm9ybVwiIChuZ1N1Ym1pdCk9XCJvblN1Ym1pdChmLnZhbHVlKVwiPlxuICogICAgICAgICA8aDM+Q29udHJvbCBncm91cDogY3JlZGVudGlhbHM8L2gzPlxuICogICAgICAgICA8ZGl2IG5nQ29udHJvbEdyb3VwPVwiY3JlZGVudGlhbHNcIj5cbiAqICAgICAgICAgICA8cD5Mb2dpbjogPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmdDb250cm9sPVwibG9naW5cIj48L3A+XG4gKiAgICAgICAgICAgPHA+UGFzc3dvcmQ6IDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBuZ0NvbnRyb2w9XCJwYXNzd29yZFwiPjwvcD5cbiAqICAgICAgICAgPC9kaXY+XG4gKiAgICAgICAgIDxoMz5Db250cm9sIGdyb3VwOiBwZXJzb248L2gzPlxuICogICAgICAgICA8ZGl2IG5nQ29udHJvbEdyb3VwPVwicGVyc29uXCI+XG4gKiAgICAgICAgICAgPHA+Rmlyc3QgbmFtZTogPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmdDb250cm9sPVwiZmlyc3ROYW1lXCI+PC9wPlxuICogICAgICAgICAgIDxwPkxhc3QgbmFtZTogPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmdDb250cm9sPVwibGFzdE5hbWVcIj48L3A+XG4gKiAgICAgICAgIDwvZGl2PlxuICogICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIj5TdWJtaXQgRm9ybTwvYnV0dG9uPlxuICogICAgICAgPHA+Rm9ybSBkYXRhIHN1Ym1pdHRlZDo8L3A+XG4gKiAgICAgICA8L2Zvcm0+XG4gKiAgICAgICA8cHJlPnt7ZGF0YX19PC9wcmU+XG4gKiAgICAgPC9kaXY+XG4gKiBgLFxuICogICBkaXJlY3RpdmVzOiBbQ09SRV9ESVJFQ1RJVkVTLCBGT1JNX0RJUkVDVElWRVNdXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIEFwcCB7XG4gKiAgIGNvbnN0cnVjdG9yKCkge31cbiAqXG4gKiAgIGRhdGE6IHN0cmluZztcbiAqXG4gKiAgIG9uU3VibWl0KGRhdGEpIHtcbiAqICAgICB0aGlzLmRhdGEgPSBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKTtcbiAqICAgfVxuICogfVxuICogIGBgYFxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdmb3JtOm5vdChbbmdOb0Zvcm1dKTpub3QoW25nRm9ybU1vZGVsXSksbmdGb3JtLFtuZ0Zvcm1dJyxcbiAgYmluZGluZ3M6IFtmb3JtRGlyZWN0aXZlUHJvdmlkZXJdLFxuICBob3N0OiB7XG4gICAgJyhzdWJtaXQpJzogJ29uU3VibWl0KCknLFxuICB9LFxuICBvdXRwdXRzOiBbJ25nU3VibWl0J10sXG4gIGV4cG9ydEFzOiAnbmdGb3JtJ1xufSlcbmV4cG9ydCBjbGFzcyBOZ0Zvcm0gZXh0ZW5kcyBDb250cm9sQ29udGFpbmVyIGltcGxlbWVudHMgRm9ybSB7XG4gIGZvcm06IENvbnRyb2xHcm91cDtcbiAgbmdTdWJtaXQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgQFNlbGYoKSBASW5qZWN0KE5HX1ZBTElEQVRPUlMpIHZhbGlkYXRvcnM6IGFueVtdLFxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBAU2VsZigpIEBJbmplY3QoTkdfQVNZTkNfVkFMSURBVE9SUykgYXN5bmNWYWxpZGF0b3JzOiBhbnlbXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5mb3JtID0gbmV3IENvbnRyb2xHcm91cCh7fSwgbnVsbCwgY29tcG9zZVZhbGlkYXRvcnModmFsaWRhdG9ycyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NlQXN5bmNWYWxpZGF0b3JzKGFzeW5jVmFsaWRhdG9ycykpO1xuICB9XG5cbiAgZ2V0IGZvcm1EaXJlY3RpdmUoKTogRm9ybSB7IHJldHVybiB0aGlzOyB9XG5cbiAgZ2V0IGNvbnRyb2woKTogQ29udHJvbEdyb3VwIHsgcmV0dXJuIHRoaXMuZm9ybTsgfVxuXG4gIGdldCBwYXRoKCk6IHN0cmluZ1tdIHsgcmV0dXJuIFtdOyB9XG5cbiAgZ2V0IGNvbnRyb2xzKCk6IHtba2V5OiBzdHJpbmddOiBBYnN0cmFjdENvbnRyb2x9IHsgcmV0dXJuIHRoaXMuZm9ybS5jb250cm9sczsgfVxuXG4gIGFkZENvbnRyb2woZGlyOiBOZ0NvbnRyb2wpOiB2b2lkIHtcbiAgICBQcm9taXNlV3JhcHBlci5zY2hlZHVsZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5fZmluZENvbnRhaW5lcihkaXIucGF0aCk7XG4gICAgICB2YXIgY3RybCA9IG5ldyBDb250cm9sKCk7XG4gICAgICBzZXRVcENvbnRyb2woY3RybCwgZGlyKTtcbiAgICAgIGNvbnRhaW5lci5hZGRDb250cm9sKGRpci5uYW1lLCBjdHJsKTtcbiAgICAgIGN0cmwudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q29udHJvbChkaXI6IE5nQ29udHJvbCk6IENvbnRyb2wgeyByZXR1cm4gPENvbnRyb2w+dGhpcy5mb3JtLmZpbmQoZGlyLnBhdGgpOyB9XG5cbiAgcmVtb3ZlQ29udHJvbChkaXI6IE5nQ29udHJvbCk6IHZvaWQge1xuICAgIFByb21pc2VXcmFwcGVyLnNjaGVkdWxlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIHZhciBjb250YWluZXIgPSB0aGlzLl9maW5kQ29udGFpbmVyKGRpci5wYXRoKTtcbiAgICAgIGlmIChpc1ByZXNlbnQoY29udGFpbmVyKSkge1xuICAgICAgICBjb250YWluZXIucmVtb3ZlQ29udHJvbChkaXIubmFtZSk7XG4gICAgICAgIGNvbnRhaW5lci51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhZGRDb250cm9sR3JvdXAoZGlyOiBOZ0NvbnRyb2xHcm91cCk6IHZvaWQge1xuICAgIFByb21pc2VXcmFwcGVyLnNjaGVkdWxlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIHZhciBjb250YWluZXIgPSB0aGlzLl9maW5kQ29udGFpbmVyKGRpci5wYXRoKTtcbiAgICAgIHZhciBncm91cCA9IG5ldyBDb250cm9sR3JvdXAoe30pO1xuICAgICAgc2V0VXBDb250cm9sR3JvdXAoZ3JvdXAsIGRpcik7XG4gICAgICBjb250YWluZXIuYWRkQ29udHJvbChkaXIubmFtZSwgZ3JvdXApO1xuICAgICAgZ3JvdXAudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgIH0pO1xuICB9XG5cbiAgcmVtb3ZlQ29udHJvbEdyb3VwKGRpcjogTmdDb250cm9sR3JvdXApOiB2b2lkIHtcbiAgICBQcm9taXNlV3JhcHBlci5zY2hlZHVsZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5fZmluZENvbnRhaW5lcihkaXIucGF0aCk7XG4gICAgICBpZiAoaXNQcmVzZW50KGNvbnRhaW5lcikpIHtcbiAgICAgICAgY29udGFpbmVyLnJlbW92ZUNvbnRyb2woZGlyLm5hbWUpO1xuICAgICAgICBjb250YWluZXIudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q29udHJvbEdyb3VwKGRpcjogTmdDb250cm9sR3JvdXApOiBDb250cm9sR3JvdXAge1xuICAgIHJldHVybiA8Q29udHJvbEdyb3VwPnRoaXMuZm9ybS5maW5kKGRpci5wYXRoKTtcbiAgfVxuXG4gIHVwZGF0ZU1vZGVsKGRpcjogTmdDb250cm9sLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgUHJvbWlzZVdyYXBwZXIuc2NoZWR1bGVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgdmFyIGN0cmwgPSA8Q29udHJvbD50aGlzLmZvcm0uZmluZChkaXIucGF0aCk7XG4gICAgICBjdHJsLnVwZGF0ZVZhbHVlKHZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIG9uU3VibWl0KCk6IGJvb2xlYW4ge1xuICAgIE9ic2VydmFibGVXcmFwcGVyLmNhbGxFbWl0KHRoaXMubmdTdWJtaXQsIG51bGwpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2ZpbmRDb250YWluZXIocGF0aDogc3RyaW5nW10pOiBDb250cm9sR3JvdXAge1xuICAgIHBhdGgucG9wKCk7XG4gICAgcmV0dXJuIExpc3RXcmFwcGVyLmlzRW1wdHkocGF0aCkgPyB0aGlzLmZvcm0gOiA8Q29udHJvbEdyb3VwPnRoaXMuZm9ybS5maW5kKHBhdGgpO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tbW9uL2Zvcm1zL2RpcmVjdGl2ZXMvbmdfZm9ybS50c1xuICoqLyIsImltcG9ydCB7RGlyZWN0aXZlLCBTZWxmfSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbmltcG9ydCB7TmdDb250cm9sfSBmcm9tICcuL25nX2NvbnRyb2wnO1xuaW1wb3J0IHtpc0JsYW5rLCBpc1ByZXNlbnR9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5cbi8qKlxuICogRGlyZWN0aXZlIGF1dG9tYXRpY2FsbHkgYXBwbGllZCB0byBBbmd1bGFyIGZvcm1zIHRoYXQgc2V0cyBDU1MgY2xhc3Nlc1xuICogYmFzZWQgb24gY29udHJvbCBzdGF0dXMgKHZhbGlkL2ludmFsaWQvZGlydHkvZXRjKS5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW25nQ29udHJvbF0sW25nTW9kZWxdLFtuZ0Zvcm1Db250cm9sXScsXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzLm5nLXVudG91Y2hlZF0nOiAnbmdDbGFzc1VudG91Y2hlZCcsXG4gICAgJ1tjbGFzcy5uZy10b3VjaGVkXSc6ICduZ0NsYXNzVG91Y2hlZCcsXG4gICAgJ1tjbGFzcy5uZy1wcmlzdGluZV0nOiAnbmdDbGFzc1ByaXN0aW5lJyxcbiAgICAnW2NsYXNzLm5nLWRpcnR5XSc6ICduZ0NsYXNzRGlydHknLFxuICAgICdbY2xhc3MubmctdmFsaWRdJzogJ25nQ2xhc3NWYWxpZCcsXG4gICAgJ1tjbGFzcy5uZy1pbnZhbGlkXSc6ICduZ0NsYXNzSW52YWxpZCdcbiAgfVxufSlcbmV4cG9ydCBjbGFzcyBOZ0NvbnRyb2xTdGF0dXMge1xuICBwcml2YXRlIF9jZDogTmdDb250cm9sO1xuXG4gIGNvbnN0cnVjdG9yKEBTZWxmKCkgY2Q6IE5nQ29udHJvbCkgeyB0aGlzLl9jZCA9IGNkOyB9XG5cbiAgZ2V0IG5nQ2xhc3NVbnRvdWNoZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzUHJlc2VudCh0aGlzLl9jZC5jb250cm9sKSA/IHRoaXMuX2NkLmNvbnRyb2wudW50b3VjaGVkIDogZmFsc2U7XG4gIH1cbiAgZ2V0IG5nQ2xhc3NUb3VjaGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1ByZXNlbnQodGhpcy5fY2QuY29udHJvbCkgPyB0aGlzLl9jZC5jb250cm9sLnRvdWNoZWQgOiBmYWxzZTtcbiAgfVxuICBnZXQgbmdDbGFzc1ByaXN0aW5lKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1ByZXNlbnQodGhpcy5fY2QuY29udHJvbCkgPyB0aGlzLl9jZC5jb250cm9sLnByaXN0aW5lIDogZmFsc2U7XG4gIH1cbiAgZ2V0IG5nQ2xhc3NEaXJ0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNQcmVzZW50KHRoaXMuX2NkLmNvbnRyb2wpID8gdGhpcy5fY2QuY29udHJvbC5kaXJ0eSA6IGZhbHNlO1xuICB9XG4gIGdldCBuZ0NsYXNzVmFsaWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzUHJlc2VudCh0aGlzLl9jZC5jb250cm9sKSA/IHRoaXMuX2NkLmNvbnRyb2wudmFsaWQgOiBmYWxzZTtcbiAgfVxuICBnZXQgbmdDbGFzc0ludmFsaWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzUHJlc2VudCh0aGlzLl9jZC5jb250cm9sKSA/ICF0aGlzLl9jZC5jb250cm9sLnZhbGlkIDogZmFsc2U7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21tb24vZm9ybXMvZGlyZWN0aXZlcy9uZ19jb250cm9sX3N0YXR1cy50c1xuICoqLyIsImltcG9ydCB7VHlwZSwgQ09OU1RfRVhQUn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7TmdDb250cm9sTmFtZX0gZnJvbSAnLi9kaXJlY3RpdmVzL25nX2NvbnRyb2xfbmFtZSc7XG5pbXBvcnQge05nRm9ybUNvbnRyb2x9IGZyb20gJy4vZGlyZWN0aXZlcy9uZ19mb3JtX2NvbnRyb2wnO1xuaW1wb3J0IHtOZ01vZGVsfSBmcm9tICcuL2RpcmVjdGl2ZXMvbmdfbW9kZWwnO1xuaW1wb3J0IHtOZ0NvbnRyb2xHcm91cH0gZnJvbSAnLi9kaXJlY3RpdmVzL25nX2NvbnRyb2xfZ3JvdXAnO1xuaW1wb3J0IHtOZ0Zvcm1Nb2RlbH0gZnJvbSAnLi9kaXJlY3RpdmVzL25nX2Zvcm1fbW9kZWwnO1xuaW1wb3J0IHtOZ0Zvcm19IGZyb20gJy4vZGlyZWN0aXZlcy9uZ19mb3JtJztcbmltcG9ydCB7RGVmYXVsdFZhbHVlQWNjZXNzb3J9IGZyb20gJy4vZGlyZWN0aXZlcy9kZWZhdWx0X3ZhbHVlX2FjY2Vzc29yJztcbmltcG9ydCB7Q2hlY2tib3hDb250cm9sVmFsdWVBY2Nlc3Nvcn0gZnJvbSAnLi9kaXJlY3RpdmVzL2NoZWNrYm94X3ZhbHVlX2FjY2Vzc29yJztcbmltcG9ydCB7TnVtYmVyVmFsdWVBY2Nlc3Nvcn0gZnJvbSAnLi9kaXJlY3RpdmVzL251bWJlcl92YWx1ZV9hY2Nlc3Nvcic7XG5pbXBvcnQge05nQ29udHJvbFN0YXR1c30gZnJvbSAnLi9kaXJlY3RpdmVzL25nX2NvbnRyb2xfc3RhdHVzJztcbmltcG9ydCB7XG4gIFNlbGVjdENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBOZ1NlbGVjdE9wdGlvblxufSBmcm9tICcuL2RpcmVjdGl2ZXMvc2VsZWN0X2NvbnRyb2xfdmFsdWVfYWNjZXNzb3InO1xuaW1wb3J0IHtSZXF1aXJlZFZhbGlkYXRvciwgTWluTGVuZ3RoVmFsaWRhdG9yLCBNYXhMZW5ndGhWYWxpZGF0b3J9IGZyb20gJy4vZGlyZWN0aXZlcy92YWxpZGF0b3JzJztcblxuZXhwb3J0IHtOZ0NvbnRyb2xOYW1lfSBmcm9tICcuL2RpcmVjdGl2ZXMvbmdfY29udHJvbF9uYW1lJztcbmV4cG9ydCB7TmdGb3JtQ29udHJvbH0gZnJvbSAnLi9kaXJlY3RpdmVzL25nX2Zvcm1fY29udHJvbCc7XG5leHBvcnQge05nTW9kZWx9IGZyb20gJy4vZGlyZWN0aXZlcy9uZ19tb2RlbCc7XG5leHBvcnQge05nQ29udHJvbEdyb3VwfSBmcm9tICcuL2RpcmVjdGl2ZXMvbmdfY29udHJvbF9ncm91cCc7XG5leHBvcnQge05nRm9ybU1vZGVsfSBmcm9tICcuL2RpcmVjdGl2ZXMvbmdfZm9ybV9tb2RlbCc7XG5leHBvcnQge05nRm9ybX0gZnJvbSAnLi9kaXJlY3RpdmVzL25nX2Zvcm0nO1xuZXhwb3J0IHtEZWZhdWx0VmFsdWVBY2Nlc3Nvcn0gZnJvbSAnLi9kaXJlY3RpdmVzL2RlZmF1bHRfdmFsdWVfYWNjZXNzb3InO1xuZXhwb3J0IHtDaGVja2JveENvbnRyb2xWYWx1ZUFjY2Vzc29yfSBmcm9tICcuL2RpcmVjdGl2ZXMvY2hlY2tib3hfdmFsdWVfYWNjZXNzb3InO1xuZXhwb3J0IHtOdW1iZXJWYWx1ZUFjY2Vzc29yfSBmcm9tICcuL2RpcmVjdGl2ZXMvbnVtYmVyX3ZhbHVlX2FjY2Vzc29yJztcbmV4cG9ydCB7TmdDb250cm9sU3RhdHVzfSBmcm9tICcuL2RpcmVjdGl2ZXMvbmdfY29udHJvbF9zdGF0dXMnO1xuZXhwb3J0IHtcbiAgU2VsZWN0Q29udHJvbFZhbHVlQWNjZXNzb3IsXG4gIE5nU2VsZWN0T3B0aW9uXG59IGZyb20gJy4vZGlyZWN0aXZlcy9zZWxlY3RfY29udHJvbF92YWx1ZV9hY2Nlc3Nvcic7XG5leHBvcnQge1JlcXVpcmVkVmFsaWRhdG9yLCBNaW5MZW5ndGhWYWxpZGF0b3IsIE1heExlbmd0aFZhbGlkYXRvcn0gZnJvbSAnLi9kaXJlY3RpdmVzL3ZhbGlkYXRvcnMnO1xuZXhwb3J0IHtOZ0NvbnRyb2x9IGZyb20gJy4vZGlyZWN0aXZlcy9uZ19jb250cm9sJztcbmV4cG9ydCB7Q29udHJvbFZhbHVlQWNjZXNzb3J9IGZyb20gJy4vZGlyZWN0aXZlcy9jb250cm9sX3ZhbHVlX2FjY2Vzc29yJztcblxuLyoqXG4gKlxuICogQSBsaXN0IG9mIGFsbCB0aGUgZm9ybSBkaXJlY3RpdmVzIHVzZWQgYXMgcGFydCBvZiBhIGBAVmlld2AgYW5ub3RhdGlvbi5cbiAqXG4gKiAgVGhpcyBpcyBhIHNob3J0aGFuZCBmb3IgaW1wb3J0aW5nIHRoZW0gZWFjaCBpbmRpdmlkdWFsbHkuXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICdteS1hcHAnLFxuICogICBkaXJlY3RpdmVzOiBbRk9STV9ESVJFQ1RJVkVTXVxuICogfSlcbiAqIGNsYXNzIE15QXBwIHt9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IEZPUk1fRElSRUNUSVZFUzogVHlwZVtdID0gQ09OU1RfRVhQUihbXG4gIE5nQ29udHJvbE5hbWUsXG4gIE5nQ29udHJvbEdyb3VwLFxuXG4gIE5nRm9ybUNvbnRyb2wsXG4gIE5nTW9kZWwsXG4gIE5nRm9ybU1vZGVsLFxuICBOZ0Zvcm0sXG5cbiAgTmdTZWxlY3RPcHRpb24sXG4gIERlZmF1bHRWYWx1ZUFjY2Vzc29yLFxuICBOdW1iZXJWYWx1ZUFjY2Vzc29yLFxuICBDaGVja2JveENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBTZWxlY3RDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgTmdDb250cm9sU3RhdHVzLFxuXG4gIFJlcXVpcmVkVmFsaWRhdG9yLFxuICBNaW5MZW5ndGhWYWxpZGF0b3IsXG4gIE1heExlbmd0aFZhbGlkYXRvclxuXSk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tbW9uL2Zvcm1zL2RpcmVjdGl2ZXMudHNcbiAqKi8iLCJpbXBvcnQge2ZvcndhcmRSZWYsIFByb3ZpZGVyLCBPcGFxdWVUb2tlbiwgQXR0cmlidXRlLCBEaXJlY3RpdmV9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuaW1wb3J0IHtDT05TVF9FWFBSfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtWYWxpZGF0b3JzLCBOR19WQUxJREFUT1JTfSBmcm9tICcuLi92YWxpZGF0b3JzJztcbmltcG9ydCB7Q29udHJvbH0gZnJvbSAnLi4vbW9kZWwnO1xuaW1wb3J0ICogYXMgbW9kZWxNb2R1bGUgZnJvbSAnLi4vbW9kZWwnO1xuaW1wb3J0IHtOdW1iZXJXcmFwcGVyfSBmcm9tIFwiYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nXCI7XG5cblxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgdGhhdCBjYW4gYmUgaW1wbGVtZW50ZWQgYnkgY2xhc3NlcyB0aGF0IGNhbiBhY3QgYXMgdmFsaWRhdG9ycy5cbiAqXG4gKiAjIyBVc2FnZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIEBEaXJlY3RpdmUoe1xuICogICBzZWxlY3RvcjogJ1tjdXN0b20tdmFsaWRhdG9yXScsXG4gKiAgIHByb3ZpZGVyczogW3Byb3ZpZGUoTkdfVkFMSURBVE9SUywge3VzZUV4aXN0aW5nOiBDdXN0b21WYWxpZGF0b3JEaXJlY3RpdmUsIG11bHRpOiB0cnVlfSldXG4gKiB9KVxuICogY2xhc3MgQ3VzdG9tVmFsaWRhdG9yRGlyZWN0aXZlIGltcGxlbWVudHMgVmFsaWRhdG9yIHtcbiAqICAgdmFsaWRhdGUoYzogQ29udHJvbCk6IHtba2V5OiBzdHJpbmddOiBhbnl9IHtcbiAqICAgICByZXR1cm4ge1wiY3VzdG9tXCI6IHRydWV9O1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0b3IgeyB2YWxpZGF0ZShjOiBtb2RlbE1vZHVsZS5Db250cm9sKToge1trZXk6IHN0cmluZ106IGFueX07IH1cblxuY29uc3QgUkVRVUlSRURfVkFMSURBVE9SID1cbiAgICBDT05TVF9FWFBSKG5ldyBQcm92aWRlcihOR19WQUxJREFUT1JTLCB7dXNlVmFsdWU6IFZhbGlkYXRvcnMucmVxdWlyZWQsIG11bHRpOiB0cnVlfSkpO1xuXG4vKipcbiAqIEEgRGlyZWN0aXZlIHRoYXQgYWRkcyB0aGUgYHJlcXVpcmVkYCB2YWxpZGF0b3IgdG8gYW55IGNvbnRyb2xzIG1hcmtlZCB3aXRoIHRoZVxuICogYHJlcXVpcmVkYCBhdHRyaWJ1dGUsIHZpYSB0aGUge0BsaW5rIE5HX1ZBTElEQVRPUlN9IGJpbmRpbmcuXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGBcbiAqIDxpbnB1dCBuZ0NvbnRyb2w9XCJmdWxsTmFtZVwiIHJlcXVpcmVkPlxuICogYGBgXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tyZXF1aXJlZF1bbmdDb250cm9sXSxbcmVxdWlyZWRdW25nRm9ybUNvbnRyb2xdLFtyZXF1aXJlZF1bbmdNb2RlbF0nLFxuICBwcm92aWRlcnM6IFtSRVFVSVJFRF9WQUxJREFUT1JdXG59KVxuZXhwb3J0IGNsYXNzIFJlcXVpcmVkVmFsaWRhdG9yIHtcbn1cblxuLyoqXG4gKiBQcm92aXZkZXIgd2hpY2ggYWRkcyB7QGxpbmsgTWluTGVuZ3RoVmFsaWRhdG9yfSB0byB7QGxpbmsgTkdfVkFMSURBVE9SU30uXG4gKlxuICogIyMgRXhhbXBsZTpcbiAqXG4gKiB7QGV4YW1wbGUgY29tbW9uL2Zvcm1zL3RzL3ZhbGlkYXRvcnMvdmFsaWRhdG9ycy50cyByZWdpb249J21pbid9XG4gKi9cbmNvbnN0IE1JTl9MRU5HVEhfVkFMSURBVE9SID0gQ09OU1RfRVhQUihcbiAgICBuZXcgUHJvdmlkZXIoTkdfVkFMSURBVE9SUywge3VzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE1pbkxlbmd0aFZhbGlkYXRvciksIG11bHRpOiB0cnVlfSkpO1xuXG4vKipcbiAqIEEgZGlyZWN0aXZlIHdoaWNoIGluc3RhbGxzIHRoZSB7QGxpbmsgTWluTGVuZ3RoVmFsaWRhdG9yfSBmb3IgYW55IGBuZ0NvbnRyb2xgLFxuICogYG5nRm9ybUNvbnRyb2xgLCBvciBjb250cm9sIHdpdGggYG5nTW9kZWxgIHRoYXQgYWxzbyBoYXMgYSBgbWlubGVuZ3RoYCBhdHRyaWJ1dGUuXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1ttaW5sZW5ndGhdW25nQ29udHJvbF0sW21pbmxlbmd0aF1bbmdGb3JtQ29udHJvbF0sW21pbmxlbmd0aF1bbmdNb2RlbF0nLFxuICBwcm92aWRlcnM6IFtNSU5fTEVOR1RIX1ZBTElEQVRPUl1cbn0pXG5leHBvcnQgY2xhc3MgTWluTGVuZ3RoVmFsaWRhdG9yIGltcGxlbWVudHMgVmFsaWRhdG9yIHtcbiAgcHJpdmF0ZSBfdmFsaWRhdG9yOiBGdW5jdGlvbjtcblxuICBjb25zdHJ1Y3RvcihAQXR0cmlidXRlKFwibWlubGVuZ3RoXCIpIG1pbkxlbmd0aDogc3RyaW5nKSB7XG4gICAgdGhpcy5fdmFsaWRhdG9yID0gVmFsaWRhdG9ycy5taW5MZW5ndGgoTnVtYmVyV3JhcHBlci5wYXJzZUludChtaW5MZW5ndGgsIDEwKSk7XG4gIH1cblxuICB2YWxpZGF0ZShjOiBDb250cm9sKToge1trZXk6IHN0cmluZ106IGFueX0geyByZXR1cm4gdGhpcy5fdmFsaWRhdG9yKGMpOyB9XG59XG5cbi8qKlxuICogUHJvdmlkZXIgd2hpY2ggYWRkcyB7QGxpbmsgTWF4TGVuZ3RoVmFsaWRhdG9yfSB0byB7QGxpbmsgTkdfVkFMSURBVE9SU30uXG4gKlxuICogIyMgRXhhbXBsZTpcbiAqXG4gKiB7QGV4YW1wbGUgY29tbW9uL2Zvcm1zL3RzL3ZhbGlkYXRvcnMvdmFsaWRhdG9ycy50cyByZWdpb249J21heCd9XG4gKi9cbmNvbnN0IE1BWF9MRU5HVEhfVkFMSURBVE9SID0gQ09OU1RfRVhQUihcbiAgICBuZXcgUHJvdmlkZXIoTkdfVkFMSURBVE9SUywge3VzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE1heExlbmd0aFZhbGlkYXRvciksIG11bHRpOiB0cnVlfSkpO1xuXG4vKipcbiAqIEEgZGlyZWN0aXZlIHdoaWNoIGluc3RhbGxzIHRoZSB7QGxpbmsgTWF4TGVuZ3RoVmFsaWRhdG9yfSBmb3IgYW55IGBuZ0NvbnRyb2wsIGBuZ0Zvcm1Db250cm9sYCxcbiAqIG9yIGNvbnRyb2wgd2l0aCBgbmdNb2RlbGAgdGhhdCBhbHNvIGhhcyBhIGBtYXhsZW5ndGhgIGF0dHJpYnV0ZS5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW21heGxlbmd0aF1bbmdDb250cm9sXSxbbWF4bGVuZ3RoXVtuZ0Zvcm1Db250cm9sXSxbbWF4bGVuZ3RoXVtuZ01vZGVsXScsXG4gIHByb3ZpZGVyczogW01BWF9MRU5HVEhfVkFMSURBVE9SXVxufSlcbmV4cG9ydCBjbGFzcyBNYXhMZW5ndGhWYWxpZGF0b3IgaW1wbGVtZW50cyBWYWxpZGF0b3Ige1xuICBwcml2YXRlIF92YWxpZGF0b3I6IEZ1bmN0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKEBBdHRyaWJ1dGUoXCJtYXhsZW5ndGhcIikgbWF4TGVuZ3RoOiBzdHJpbmcpIHtcbiAgICB0aGlzLl92YWxpZGF0b3IgPSBWYWxpZGF0b3JzLm1heExlbmd0aChOdW1iZXJXcmFwcGVyLnBhcnNlSW50KG1heExlbmd0aCwgMTApKTtcbiAgfVxuXG4gIHZhbGlkYXRlKGM6IENvbnRyb2wpOiB7W2tleTogc3RyaW5nXTogYW55fSB7IHJldHVybiB0aGlzLl92YWxpZGF0b3IoYyk7IH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21tb24vZm9ybXMvZGlyZWN0aXZlcy92YWxpZGF0b3JzLnRzXG4gKiovIiwiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbmltcG9ydCB7U3RyaW5nTWFwV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcbmltcG9ydCB7aXNQcmVzZW50LCBpc0FycmF5LCBDT05TVF9FWFBSLCBUeXBlfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0ICogYXMgbW9kZWxNb2R1bGUgZnJvbSAnLi9tb2RlbCc7XG5cblxuLyoqXG4gKiBDcmVhdGVzIGEgZm9ybSBvYmplY3QgZnJvbSBhIHVzZXItc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L0VOZ1pvOEV1SUVDWk5lbnNaQ1ZyP3A9cHJldmlldykpXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAnbXktYXBwJyxcbiAqICAgdmlld0JpbmRpbmdzOiBbRk9STV9CSU5ESU5HU11cbiAqICAgdGVtcGxhdGU6IGBcbiAqICAgICA8Zm9ybSBbbmdGb3JtTW9kZWxdPVwibG9naW5Gb3JtXCI+XG4gKiAgICAgICA8cD5Mb2dpbiA8aW5wdXQgbmdDb250cm9sPVwibG9naW5cIj48L3A+XG4gKiAgICAgICA8ZGl2IG5nQ29udHJvbEdyb3VwPVwicGFzc3dvcmRSZXRyeVwiPlxuICogICAgICAgICA8cD5QYXNzd29yZCA8aW5wdXQgdHlwZT1cInBhc3N3b3JkXCIgbmdDb250cm9sPVwicGFzc3dvcmRcIj48L3A+XG4gKiAgICAgICAgIDxwPkNvbmZpcm0gcGFzc3dvcmQgPGlucHV0IHR5cGU9XCJwYXNzd29yZFwiIG5nQ29udHJvbD1cInBhc3N3b3JkQ29uZmlybWF0aW9uXCI+PC9wPlxuICogICAgICAgPC9kaXY+XG4gKiAgICAgPC9mb3JtPlxuICogICAgIDxoMz5Gb3JtIHZhbHVlOjwvaDM+XG4gKiAgICAgPHByZT57e3ZhbHVlfX08L3ByZT5cbiAqICAgYCxcbiAqICAgZGlyZWN0aXZlczogW0ZPUk1fRElSRUNUSVZFU11cbiAqIH0pXG4gKiBleHBvcnQgY2xhc3MgQXBwIHtcbiAqICAgbG9naW5Gb3JtOiBDb250cm9sR3JvdXA7XG4gKlxuICogICBjb25zdHJ1Y3RvcihidWlsZGVyOiBGb3JtQnVpbGRlcikge1xuICogICAgIHRoaXMubG9naW5Gb3JtID0gYnVpbGRlci5ncm91cCh7XG4gKiAgICAgICBsb2dpbjogW1wiXCIsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICogICAgICAgcGFzc3dvcmRSZXRyeTogYnVpbGRlci5ncm91cCh7XG4gKiAgICAgICAgIHBhc3N3b3JkOiBbXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gKiAgICAgICAgIHBhc3N3b3JkQ29uZmlybWF0aW9uOiBbXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZCwgYXN5bmNWYWxpZGF0b3JdXG4gKiAgICAgICB9KVxuICogICAgIH0pO1xuICogICB9XG4gKlxuICogICBnZXQgdmFsdWUoKTogc3RyaW5nIHtcbiAqICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5sb2dpbkZvcm0udmFsdWUsIG51bGwsIDIpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEZvcm1CdWlsZGVyIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdCBhIG5ldyB7QGxpbmsgQ29udHJvbEdyb3VwfSB3aXRoIHRoZSBnaXZlbiBtYXAgb2YgY29uZmlndXJhdGlvbi5cbiAgICogVmFsaWQga2V5cyBmb3IgdGhlIGBleHRyYWAgcGFyYW1ldGVyIG1hcCBhcmUgYG9wdGlvbmFsc2AgYW5kIGB2YWxpZGF0b3JgLlxuICAgKlxuICAgKiBTZWUgdGhlIHtAbGluayBDb250cm9sR3JvdXB9IGNvbnN0cnVjdG9yIGZvciBtb3JlIGRldGFpbHMuXG4gICAqL1xuICBncm91cChjb250cm9sc0NvbmZpZzoge1trZXk6IHN0cmluZ106IGFueX0sXG4gICAgICAgIGV4dHJhOiB7W2tleTogc3RyaW5nXTogYW55fSA9IG51bGwpOiBtb2RlbE1vZHVsZS5Db250cm9sR3JvdXAge1xuICAgIHZhciBjb250cm9scyA9IHRoaXMuX3JlZHVjZUNvbnRyb2xzKGNvbnRyb2xzQ29uZmlnKTtcbiAgICB2YXIgb3B0aW9uYWxzID0gaXNQcmVzZW50KGV4dHJhKSA/IFN0cmluZ01hcFdyYXBwZXIuZ2V0KGV4dHJhLCBcIm9wdGlvbmFsc1wiKSA6IG51bGw7XG4gICAgdmFyIHZhbGlkYXRvciA9IGlzUHJlc2VudChleHRyYSkgPyBTdHJpbmdNYXBXcmFwcGVyLmdldChleHRyYSwgXCJ2YWxpZGF0b3JcIikgOiBudWxsO1xuICAgIHZhciBhc3luY1ZhbGlkYXRvciA9IGlzUHJlc2VudChleHRyYSkgPyBTdHJpbmdNYXBXcmFwcGVyLmdldChleHRyYSwgXCJhc3luY1ZhbGlkYXRvclwiKSA6IG51bGw7XG4gICAgcmV0dXJuIG5ldyBtb2RlbE1vZHVsZS5Db250cm9sR3JvdXAoY29udHJvbHMsIG9wdGlvbmFscywgdmFsaWRhdG9yLCBhc3luY1ZhbGlkYXRvcik7XG4gIH1cbiAgLyoqXG4gICAqIENvbnN0cnVjdCBhIG5ldyB7QGxpbmsgQ29udHJvbH0gd2l0aCB0aGUgZ2l2ZW4gYHZhbHVlYCxgdmFsaWRhdG9yYCwgYW5kIGBhc3luY1ZhbGlkYXRvcmAuXG4gICAqL1xuICBjb250cm9sKHZhbHVlOiBPYmplY3QsIHZhbGlkYXRvcjogRnVuY3Rpb24gPSBudWxsLFxuICAgICAgICAgIGFzeW5jVmFsaWRhdG9yOiBGdW5jdGlvbiA9IG51bGwpOiBtb2RlbE1vZHVsZS5Db250cm9sIHtcbiAgICByZXR1cm4gbmV3IG1vZGVsTW9kdWxlLkNvbnRyb2wodmFsdWUsIHZhbGlkYXRvciwgYXN5bmNWYWxpZGF0b3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdCBhbiBhcnJheSBvZiB7QGxpbmsgQ29udHJvbH1zIGZyb20gdGhlIGdpdmVuIGBjb250cm9sc0NvbmZpZ2AgYXJyYXkgb2ZcbiAgICogY29uZmlndXJhdGlvbiwgd2l0aCB0aGUgZ2l2ZW4gb3B0aW9uYWwgYHZhbGlkYXRvcmAgYW5kIGBhc3luY1ZhbGlkYXRvcmAuXG4gICAqL1xuICBhcnJheShjb250cm9sc0NvbmZpZzogYW55W10sIHZhbGlkYXRvcjogRnVuY3Rpb24gPSBudWxsLFxuICAgICAgICBhc3luY1ZhbGlkYXRvcjogRnVuY3Rpb24gPSBudWxsKTogbW9kZWxNb2R1bGUuQ29udHJvbEFycmF5IHtcbiAgICB2YXIgY29udHJvbHMgPSBjb250cm9sc0NvbmZpZy5tYXAoYyA9PiB0aGlzLl9jcmVhdGVDb250cm9sKGMpKTtcbiAgICByZXR1cm4gbmV3IG1vZGVsTW9kdWxlLkNvbnRyb2xBcnJheShjb250cm9scywgdmFsaWRhdG9yLCBhc3luY1ZhbGlkYXRvcik7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9yZWR1Y2VDb250cm9scyhjb250cm9sc0NvbmZpZzogYW55KToge1trZXk6IHN0cmluZ106IG1vZGVsTW9kdWxlLkFic3RyYWN0Q29udHJvbH0ge1xuICAgIHZhciBjb250cm9sczoge1trZXk6IHN0cmluZ106IG1vZGVsTW9kdWxlLkFic3RyYWN0Q29udHJvbH0gPSB7fTtcbiAgICBTdHJpbmdNYXBXcmFwcGVyLmZvckVhY2goY29udHJvbHNDb25maWcsIChjb250cm9sQ29uZmlnLCBjb250cm9sTmFtZSkgPT4ge1xuICAgICAgY29udHJvbHNbY29udHJvbE5hbWVdID0gdGhpcy5fY3JlYXRlQ29udHJvbChjb250cm9sQ29uZmlnKTtcbiAgICB9KTtcbiAgICByZXR1cm4gY29udHJvbHM7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9jcmVhdGVDb250cm9sKGNvbnRyb2xDb25maWc6IGFueSk6IG1vZGVsTW9kdWxlLkFic3RyYWN0Q29udHJvbCB7XG4gICAgaWYgKGNvbnRyb2xDb25maWcgaW5zdGFuY2VvZiBtb2RlbE1vZHVsZS5Db250cm9sIHx8XG4gICAgICAgIGNvbnRyb2xDb25maWcgaW5zdGFuY2VvZiBtb2RlbE1vZHVsZS5Db250cm9sR3JvdXAgfHxcbiAgICAgICAgY29udHJvbENvbmZpZyBpbnN0YW5jZW9mIG1vZGVsTW9kdWxlLkNvbnRyb2xBcnJheSkge1xuICAgICAgcmV0dXJuIGNvbnRyb2xDb25maWc7XG5cbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkoY29udHJvbENvbmZpZykpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGNvbnRyb2xDb25maWdbMF07XG4gICAgICB2YXIgdmFsaWRhdG9yID0gY29udHJvbENvbmZpZy5sZW5ndGggPiAxID8gY29udHJvbENvbmZpZ1sxXSA6IG51bGw7XG4gICAgICB2YXIgYXN5bmNWYWxpZGF0b3IgPSBjb250cm9sQ29uZmlnLmxlbmd0aCA+IDIgPyBjb250cm9sQ29uZmlnWzJdIDogbnVsbDtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRyb2wodmFsdWUsIHZhbGlkYXRvciwgYXN5bmNWYWxpZGF0b3IpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRyb2woY29udHJvbENvbmZpZyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogU2hvcnRoYW5kIHNldCBvZiBwcm92aWRlcnMgdXNlZCBmb3IgYnVpbGRpbmcgQW5ndWxhciBmb3Jtcy5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGJvb3RzdHJhcChNeUFwcCwgW0ZPUk1fUFJPVklERVJTXSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IEZPUk1fUFJPVklERVJTOiBUeXBlW10gPSBDT05TVF9FWFBSKFtGb3JtQnVpbGRlcl0pO1xuXG4vKipcbiAqIFNlZSB7QGxpbmsgRk9STV9QUk9WSURFUlN9IGluc3RlYWQuXG4gKlxuICogQGRlcHJlY2F0ZWRcbiAqL1xuZXhwb3J0IGNvbnN0IEZPUk1fQklORElOR1MgPSBGT1JNX1BST1ZJREVSUztcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21tb24vZm9ybXMvZm9ybV9idWlsZGVyLnRzXG4gKiovIiwiaW1wb3J0IHtDT05TVF9FWFBSLCBUeXBlfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuXG5pbXBvcnQge0ZPUk1fRElSRUNUSVZFU30gZnJvbSAnLi9mb3Jtcyc7XG5pbXBvcnQge0NPUkVfRElSRUNUSVZFU30gZnJvbSAnLi9kaXJlY3RpdmVzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgQW5ndWxhciBjb3JlIGRpcmVjdGl2ZXMgdGhhdCBhcmUgbGlrZWx5IHRvIGJlIHVzZWQgaW4gZWFjaCBhbmQgZXZlcnkgQW5ndWxhclxuICogYXBwbGljYXRpb24uIFRoaXMgaW5jbHVkZXMgY29yZSBkaXJlY3RpdmVzIChlLmcuLCBOZ0lmIGFuZCBOZ0ZvciksIGFuZCBmb3JtcyBkaXJlY3RpdmVzIChlLmcuLFxuICogTmdNb2RlbCkuXG4gKlxuICogVGhpcyBjb2xsZWN0aW9uIGNhbiBiZSB1c2VkIHRvIHF1aWNrbHkgZW51bWVyYXRlIGFsbCB0aGUgYnVpbHQtaW4gZGlyZWN0aXZlcyBpbiB0aGUgYGRpcmVjdGl2ZXNgXG4gKiBwcm9wZXJ0eSBvZiB0aGUgYEBDb21wb25lbnRgIG9yIGBAVmlld2AgZGVjb3JhdG9ycy5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIEluc3RlYWQgb2Ygd3JpdGluZzpcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQge05nQ2xhc3MsIE5nSWYsIE5nRm9yLCBOZ1N3aXRjaCwgTmdTd2l0Y2hXaGVuLCBOZ1N3aXRjaERlZmF1bHQsIE5nTW9kZWwsIE5nRm9ybX0gZnJvbVxuICogJ2FuZ3VsYXIyL2NvbW1vbic7XG4gKiBpbXBvcnQge090aGVyRGlyZWN0aXZlfSBmcm9tICcuL215RGlyZWN0aXZlcyc7XG4gKlxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAnbXktY29tcG9uZW50JyxcbiAqICAgdGVtcGxhdGVVcmw6ICdteUNvbXBvbmVudC5odG1sJyxcbiAqICAgZGlyZWN0aXZlczogW05nQ2xhc3MsIE5nSWYsIE5nRm9yLCBOZ1N3aXRjaCwgTmdTd2l0Y2hXaGVuLCBOZ1N3aXRjaERlZmF1bHQsIE5nTW9kZWwsIE5nRm9ybSxcbiAqIE90aGVyRGlyZWN0aXZlXVxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBNeUNvbXBvbmVudCB7XG4gKiAgIC4uLlxuICogfVxuICogYGBgXG4gKiBvbmUgY291bGQgaW1wb3J0IGFsbCB0aGUgY29tbW9uIGRpcmVjdGl2ZXMgYXQgb25jZTpcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQge0NPTU1PTl9ESVJFQ1RJVkVTfSBmcm9tICdhbmd1bGFyMi9jb21tb24nO1xuICogaW1wb3J0IHtPdGhlckRpcmVjdGl2ZX0gZnJvbSAnLi9teURpcmVjdGl2ZXMnO1xuICpcbiAqIEBDb21wb25lbnQoe1xuICogICBzZWxlY3RvcjogJ215LWNvbXBvbmVudCcsXG4gKiAgIHRlbXBsYXRlVXJsOiAnbXlDb21wb25lbnQuaHRtbCcsXG4gKiAgIGRpcmVjdGl2ZXM6IFtDT01NT05fRElSRUNUSVZFUywgT3RoZXJEaXJlY3RpdmVdXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIE15Q29tcG9uZW50IHtcbiAqICAgLi4uXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IENPTU1PTl9ESVJFQ1RJVkVTOiBUeXBlW11bXSA9IENPTlNUX0VYUFIoW0NPUkVfRElSRUNUSVZFUywgRk9STV9ESVJFQ1RJVkVTXSk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tbW9uL2NvbW1vbl9kaXJlY3RpdmVzLnRzXG4gKiovIiwiLyoqXG4gKiBAbW9kdWxlXG4gKiBAZGVzY3JpcHRpb25cbiAqIFN0YXJ0aW5nIHBvaW50IHRvIGltcG9ydCBhbGwgY29tcGlsZXIgQVBJcy5cbiAqL1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvY29tcGlsZXIvdXJsX3Jlc29sdmVyJztcbmV4cG9ydCAqIGZyb20gJy4vc3JjL2NvbXBpbGVyL3hocic7XG5leHBvcnQgKiBmcm9tICcuL3NyYy9jb21waWxlci9jb21waWxlcic7XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvY29tcGlsZXIudHNcbiAqKi8iLCJpbXBvcnQge0luamVjdGFibGUsIEluamVjdH0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvZGknO1xuaW1wb3J0IHtcbiAgU3RyaW5nV3JhcHBlcixcbiAgaXNQcmVzZW50LFxuICBpc0JsYW5rLFxuICBSZWdFeHBXcmFwcGVyLFxuICBub3JtYWxpemVCbGFua1xufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9uLCBXcmFwcGVkRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtMaXN0V3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcbmltcG9ydCB7UEFDS0FHRV9ST09UX1VSTH0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvYXBwbGljYXRpb25fdG9rZW5zJztcbmltcG9ydCB7UHJvdmlkZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpJztcblxuLyoqXG4gKiBDcmVhdGUgYSB7QGxpbmsgVXJsUmVzb2x2ZXJ9IHdpdGggbm8gcGFja2FnZSBwcmVmaXguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXaXRob3V0UGFja2FnZVByZWZpeCgpOiBVcmxSZXNvbHZlciB7XG4gIHJldHVybiBuZXcgVXJsUmVzb2x2ZXIoKTtcbn1cblxuLyoqXG4gKiBBIGRlZmF1bHQgcHJvdmlkZXIgZm9yIHtAbGluayBQQUNLQUdFX1JPT1RfVVJMfSB0aGF0IG1hcHMgdG8gJy8nLlxuICovXG5leHBvcnQgdmFyIERFRkFVTFRfUEFDS0FHRV9VUkxfUFJPVklERVIgPSBuZXcgUHJvdmlkZXIoUEFDS0FHRV9ST09UX1VSTCwge3VzZVZhbHVlOiBcIi9cIn0pO1xuXG4vKipcbiAqIFVzZWQgYnkgdGhlIHtAbGluayBDb21waWxlcn0gd2hlbiByZXNvbHZpbmcgSFRNTCBhbmQgQ1NTIHRlbXBsYXRlIFVSTHMuXG4gKlxuICogVGhpcyBjbGFzcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgYXBwbGljYXRpb24gZGV2ZWxvcGVyIHRvIGNyZWF0ZSBjdXN0b20gYmVoYXZpb3IuXG4gKlxuICogU2VlIHtAbGluayBDb21waWxlcn1cbiAqXG4gKiAjIyBFeGFtcGxlXG4gKlxuICoge0BleGFtcGxlIGNvbXBpbGVyL3RzL3VybF9yZXNvbHZlci91cmxfcmVzb2x2ZXIudHMgcmVnaW9uPSd1cmxfcmVzb2x2ZXInfVxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVXJsUmVzb2x2ZXIge1xuICBwcml2YXRlIF9wYWNrYWdlUHJlZml4OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoQEluamVjdChQQUNLQUdFX1JPT1RfVVJMKSBwYWNrYWdlUHJlZml4OiBzdHJpbmcgPSBudWxsKSB7XG4gICAgaWYgKGlzUHJlc2VudChwYWNrYWdlUHJlZml4KSkge1xuICAgICAgdGhpcy5fcGFja2FnZVByZWZpeCA9IFN0cmluZ1dyYXBwZXIuc3RyaXBSaWdodChwYWNrYWdlUHJlZml4LCBcIi9cIikgKyBcIi9cIjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIGB1cmxgIGdpdmVuIHRoZSBgYmFzZVVybGA6XG4gICAqIC0gd2hlbiB0aGUgYHVybGAgaXMgbnVsbCwgdGhlIGBiYXNlVXJsYCBpcyByZXR1cm5lZCxcbiAgICogLSBpZiBgdXJsYCBpcyByZWxhdGl2ZSAoJ3BhdGgvdG8vaGVyZScsICcuL3BhdGgvdG8vaGVyZScpLCB0aGUgcmVzb2x2ZWQgdXJsIGlzIGEgY29tYmluYXRpb24gb2ZcbiAgICogYGJhc2VVcmxgIGFuZCBgdXJsYCxcbiAgICogLSBpZiBgdXJsYCBpcyBhYnNvbHV0ZSAoaXQgaGFzIGEgc2NoZW1lOiAnaHR0cDovLycsICdodHRwczovLycgb3Igc3RhcnQgd2l0aCAnLycpLCB0aGUgYHVybGAgaXNcbiAgICogcmV0dXJuZWQgYXMgaXMgKGlnbm9yaW5nIHRoZSBgYmFzZVVybGApXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVXJsXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHJldHVybnMge3N0cmluZ30gdGhlIHJlc29sdmVkIFVSTFxuICAgKi9cbiAgcmVzb2x2ZShiYXNlVXJsOiBzdHJpbmcsIHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB2YXIgcmVzb2x2ZWRVcmwgPSB1cmw7XG4gICAgaWYgKGlzUHJlc2VudChiYXNlVXJsKSAmJiBiYXNlVXJsLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlc29sdmVkVXJsID0gX3Jlc29sdmVVcmwoYmFzZVVybCwgcmVzb2x2ZWRVcmwpO1xuICAgIH1cbiAgICBpZiAoaXNQcmVzZW50KHRoaXMuX3BhY2thZ2VQcmVmaXgpICYmIGdldFVybFNjaGVtZShyZXNvbHZlZFVybCkgPT0gXCJwYWNrYWdlXCIpIHtcbiAgICAgIHJlc29sdmVkVXJsID0gcmVzb2x2ZWRVcmwucmVwbGFjZShcInBhY2thZ2U6XCIsIHRoaXMuX3BhY2thZ2VQcmVmaXgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzb2x2ZWRVcmw7XG4gIH1cbn1cblxuLyoqXG4gKiBFeHRyYWN0IHRoZSBzY2hlbWUgb2YgYSBVUkwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRVcmxTY2hlbWUodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICB2YXIgbWF0Y2ggPSBfc3BsaXQodXJsKTtcbiAgcmV0dXJuIChtYXRjaCAmJiBtYXRjaFtfQ29tcG9uZW50SW5kZXguU2NoZW1lXSkgfHwgXCJcIjtcbn1cblxuLy8gVGhlIGNvZGUgYmVsb3cgaXMgYWRhcHRlZCBmcm9tIFRyYWNldXI6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL3RyYWNldXItY29tcGlsZXIvYmxvYi85NTExYzFkYWZhOTcyYmYwZGUxMjAyYThhODYzYmFkMDJmMGY5NWE4L3NyYy9ydW50aW1lL3VybC5qc1xuXG4vKipcbiAqIEJ1aWxkcyBhIFVSSSBzdHJpbmcgZnJvbSBhbHJlYWR5LWVuY29kZWQgcGFydHMuXG4gKlxuICogTm8gZW5jb2RpbmcgaXMgcGVyZm9ybWVkLiAgQW55IGNvbXBvbmVudCBtYXkgYmUgb21pdHRlZCBhcyBlaXRoZXIgbnVsbCBvclxuICogdW5kZWZpbmVkLlxuICpcbiAqIEBwYXJhbSB7P3N0cmluZz19IG9wdF9zY2hlbWUgVGhlIHNjaGVtZSBzdWNoIGFzICdodHRwJy5cbiAqIEBwYXJhbSB7P3N0cmluZz19IG9wdF91c2VySW5mbyBUaGUgdXNlciBuYW1lIGJlZm9yZSB0aGUgJ0AnLlxuICogQHBhcmFtIHs/c3RyaW5nPX0gb3B0X2RvbWFpbiBUaGUgZG9tYWluIHN1Y2ggYXMgJ3d3dy5nb29nbGUuY29tJywgYWxyZWFkeVxuICogICAgIFVSSS1lbmNvZGVkLlxuICogQHBhcmFtIHsoc3RyaW5nfG51bGwpPX0gb3B0X3BvcnQgVGhlIHBvcnQgbnVtYmVyLlxuICogQHBhcmFtIHs/c3RyaW5nPX0gb3B0X3BhdGggVGhlIHBhdGgsIGFscmVhZHkgVVJJLWVuY29kZWQuICBJZiBpdCBpcyBub3RcbiAqICAgICBlbXB0eSwgaXQgbXVzdCBiZWdpbiB3aXRoIGEgc2xhc2guXG4gKiBAcGFyYW0gez9zdHJpbmc9fSBvcHRfcXVlcnlEYXRhIFRoZSBVUkktZW5jb2RlZCBxdWVyeSBkYXRhLlxuICogQHBhcmFtIHs/c3RyaW5nPX0gb3B0X2ZyYWdtZW50IFRoZSBVUkktZW5jb2RlZCBmcmFnbWVudCBpZGVudGlmaWVyLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZnVsbHkgY29tYmluZWQgVVJJLlxuICovXG5mdW5jdGlvbiBfYnVpbGRGcm9tRW5jb2RlZFBhcnRzKG9wdF9zY2hlbWU/OiBzdHJpbmcsIG9wdF91c2VySW5mbz86IHN0cmluZywgb3B0X2RvbWFpbj86IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0X3BvcnQ/OiBzdHJpbmcsIG9wdF9wYXRoPzogc3RyaW5nLCBvcHRfcXVlcnlEYXRhPzogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRfZnJhZ21lbnQ/OiBzdHJpbmcpOiBzdHJpbmcge1xuICB2YXIgb3V0ID0gW107XG5cbiAgaWYgKGlzUHJlc2VudChvcHRfc2NoZW1lKSkge1xuICAgIG91dC5wdXNoKG9wdF9zY2hlbWUgKyAnOicpO1xuICB9XG5cbiAgaWYgKGlzUHJlc2VudChvcHRfZG9tYWluKSkge1xuICAgIG91dC5wdXNoKCcvLycpO1xuXG4gICAgaWYgKGlzUHJlc2VudChvcHRfdXNlckluZm8pKSB7XG4gICAgICBvdXQucHVzaChvcHRfdXNlckluZm8gKyAnQCcpO1xuICAgIH1cblxuICAgIG91dC5wdXNoKG9wdF9kb21haW4pO1xuXG4gICAgaWYgKGlzUHJlc2VudChvcHRfcG9ydCkpIHtcbiAgICAgIG91dC5wdXNoKCc6JyArIG9wdF9wb3J0KTtcbiAgICB9XG4gIH1cblxuICBpZiAoaXNQcmVzZW50KG9wdF9wYXRoKSkge1xuICAgIG91dC5wdXNoKG9wdF9wYXRoKTtcbiAgfVxuXG4gIGlmIChpc1ByZXNlbnQob3B0X3F1ZXJ5RGF0YSkpIHtcbiAgICBvdXQucHVzaCgnPycgKyBvcHRfcXVlcnlEYXRhKTtcbiAgfVxuXG4gIGlmIChpc1ByZXNlbnQob3B0X2ZyYWdtZW50KSkge1xuICAgIG91dC5wdXNoKCcjJyArIG9wdF9mcmFnbWVudCk7XG4gIH1cblxuICByZXR1cm4gb3V0LmpvaW4oJycpO1xufVxuXG4vKipcbiAqIEEgcmVndWxhciBleHByZXNzaW9uIGZvciBicmVha2luZyBhIFVSSSBpbnRvIGl0cyBjb21wb25lbnQgcGFydHMuXG4gKlxuICoge0BsaW5rIGh0dHA6Ly93d3cuZ2Jpdi5jb20vcHJvdG9jb2xzL3VyaS9yZmMvcmZjMzk4Ni5odG1sI1JGQzIyMzR9IHNheXNcbiAqIEFzIHRoZSBcImZpcnN0LW1hdGNoLXdpbnNcIiBhbGdvcml0aG0gaXMgaWRlbnRpY2FsIHRvIHRoZSBcImdyZWVkeVwiXG4gKiBkaXNhbWJpZ3VhdGlvbiBtZXRob2QgdXNlZCBieSBQT1NJWCByZWd1bGFyIGV4cHJlc3Npb25zLCBpdCBpcyBuYXR1cmFsIGFuZFxuICogY29tbW9ucGxhY2UgdG8gdXNlIGEgcmVndWxhciBleHByZXNzaW9uIGZvciBwYXJzaW5nIHRoZSBwb3RlbnRpYWwgZml2ZVxuICogY29tcG9uZW50cyBvZiBhIFVSSSByZWZlcmVuY2UuXG4gKlxuICogVGhlIGZvbGxvd2luZyBsaW5lIGlzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZm9yIGJyZWFraW5nLWRvd24gYVxuICogd2VsbC1mb3JtZWQgVVJJIHJlZmVyZW5jZSBpbnRvIGl0cyBjb21wb25lbnRzLlxuICpcbiAqIDxwcmU+XG4gKiBeKChbXjovPyNdKyk6KT8oLy8oW14vPyNdKikpPyhbXj8jXSopKFxcPyhbXiNdKikpPygjKC4qKSk/XG4gKiAgMTIgICAgICAgICAgICAzICA0ICAgICAgICAgIDUgICAgICAgNiAgNyAgICAgICAgOCA5XG4gKiA8L3ByZT5cbiAqXG4gKiBUaGUgbnVtYmVycyBpbiB0aGUgc2Vjb25kIGxpbmUgYWJvdmUgYXJlIG9ubHkgdG8gYXNzaXN0IHJlYWRhYmlsaXR5OyB0aGV5XG4gKiBpbmRpY2F0ZSB0aGUgcmVmZXJlbmNlIHBvaW50cyBmb3IgZWFjaCBzdWJleHByZXNzaW9uIChpLmUuLCBlYWNoIHBhaXJlZFxuICogcGFyZW50aGVzaXMpLiBXZSByZWZlciB0byB0aGUgdmFsdWUgbWF0Y2hlZCBmb3Igc3ViZXhwcmVzc2lvbiA8bj4gYXMgJDxuPi5cbiAqIEZvciBleGFtcGxlLCBtYXRjaGluZyB0aGUgYWJvdmUgZXhwcmVzc2lvbiB0b1xuICogPHByZT5cbiAqICAgICBodHRwOi8vd3d3Lmljcy51Y2kuZWR1L3B1Yi9pZXRmL3VyaS8jUmVsYXRlZFxuICogPC9wcmU+XG4gKiByZXN1bHRzIGluIHRoZSBmb2xsb3dpbmcgc3ViZXhwcmVzc2lvbiBtYXRjaGVzOlxuICogPHByZT5cbiAqICAgICQxID0gaHR0cDpcbiAqICAgICQyID0gaHR0cFxuICogICAgJDMgPSAvL3d3dy5pY3MudWNpLmVkdVxuICogICAgJDQgPSB3d3cuaWNzLnVjaS5lZHVcbiAqICAgICQ1ID0gL3B1Yi9pZXRmL3VyaS9cbiAqICAgICQ2ID0gPHVuZGVmaW5lZD5cbiAqICAgICQ3ID0gPHVuZGVmaW5lZD5cbiAqICAgICQ4ID0gI1JlbGF0ZWRcbiAqICAgICQ5ID0gUmVsYXRlZFxuICogPC9wcmU+XG4gKiB3aGVyZSA8dW5kZWZpbmVkPiBpbmRpY2F0ZXMgdGhhdCB0aGUgY29tcG9uZW50IGlzIG5vdCBwcmVzZW50LCBhcyBpcyB0aGVcbiAqIGNhc2UgZm9yIHRoZSBxdWVyeSBjb21wb25lbnQgaW4gdGhlIGFib3ZlIGV4YW1wbGUuIFRoZXJlZm9yZSwgd2UgY2FuXG4gKiBkZXRlcm1pbmUgdGhlIHZhbHVlIG9mIHRoZSBmaXZlIGNvbXBvbmVudHMgYXNcbiAqIDxwcmU+XG4gKiAgICBzY2hlbWUgICAgPSAkMlxuICogICAgYXV0aG9yaXR5ID0gJDRcbiAqICAgIHBhdGggICAgICA9ICQ1XG4gKiAgICBxdWVyeSAgICAgPSAkN1xuICogICAgZnJhZ21lbnQgID0gJDlcbiAqIDwvcHJlPlxuICpcbiAqIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gaGFzIGJlZW4gbW9kaWZpZWQgc2xpZ2h0bHkgdG8gZXhwb3NlIHRoZVxuICogdXNlckluZm8sIGRvbWFpbiwgYW5kIHBvcnQgc2VwYXJhdGVseSBmcm9tIHRoZSBhdXRob3JpdHkuXG4gKiBUaGUgbW9kaWZpZWQgdmVyc2lvbiB5aWVsZHNcbiAqIDxwcmU+XG4gKiAgICAkMSA9IGh0dHAgICAgICAgICAgICAgIHNjaGVtZVxuICogICAgJDIgPSA8dW5kZWZpbmVkPiAgICAgICB1c2VySW5mbyAtXFxcbiAqICAgICQzID0gd3d3Lmljcy51Y2kuZWR1ICAgZG9tYWluICAgICB8IGF1dGhvcml0eVxuICogICAgJDQgPSA8dW5kZWZpbmVkPiAgICAgICBwb3J0ICAgICAtL1xuICogICAgJDUgPSAvcHViL2lldGYvdXJpLyAgICBwYXRoXG4gKiAgICAkNiA9IDx1bmRlZmluZWQ+ICAgICAgIHF1ZXJ5IHdpdGhvdXQgP1xuICogICAgJDcgPSBSZWxhdGVkICAgICAgICAgICBmcmFnbWVudCB3aXRob3V0ICNcbiAqIDwvcHJlPlxuICogQHR5cGUgeyFSZWdFeHB9XG4gKiBAaW50ZXJuYWxcbiAqL1xudmFyIF9zcGxpdFJlID1cbiAgICBSZWdFeHBXcmFwcGVyLmNyZWF0ZSgnXicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICcoPzonICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAnKFteOi8/Iy5dKyknICsgIC8vIHNjaGVtZSAtIGlnbm9yZSBzcGVjaWFsIGNoYXJhY3RlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZWQgYnkgb3RoZXIgVVJMIHBhcnRzIHN1Y2ggYXMgOixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vID8sIC8sICMsIGFuZCAuXG4gICAgICAgICAgICAgICAgICAgICAgICAgJzopPycgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICcoPzovLycgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICcoPzooW14vPyNdKilAKT8nICsgICAgICAgICAgICAgICAgICAvLyB1c2VySW5mb1xuICAgICAgICAgICAgICAgICAgICAgICAgICcoW1xcXFx3XFxcXGRcXFxcLVxcXFx1MDEwMC1cXFxcdWZmZmYuJV0qKScgKyAgLy8gZG9tYWluIC0gcmVzdHJpY3QgdG8gbGV0dGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlnaXRzLCBkYXNoZXMsIGRvdHMsIHBlcmNlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNjYXBlcywgYW5kIHVuaWNvZGUgY2hhcmFjdGVycy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAnKD86OihbMC05XSspKT8nICsgICAgICAgICAgICAgICAgICAgLy8gcG9ydFxuICAgICAgICAgICAgICAgICAgICAgICAgICcpPycgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICcoW14/I10rKT8nICsgICAgICAgIC8vIHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAnKD86XFxcXD8oW14jXSopKT8nICsgIC8vIHF1ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgJyg/OiMoLiopKT8nICsgICAgICAgLy8gZnJhZ21lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAnJCcpO1xuXG4vKipcbiAqIFRoZSBpbmRleCBvZiBlYWNoIFVSSSBjb21wb25lbnQgaW4gdGhlIHJldHVybiB2YWx1ZSBvZiBnb29nLnVyaS51dGlscy5zcGxpdC5cbiAqIEBlbnVtIHtudW1iZXJ9XG4gKi9cbmVudW0gX0NvbXBvbmVudEluZGV4IHtcbiAgU2NoZW1lID0gMSxcbiAgVXNlckluZm8sXG4gIERvbWFpbixcbiAgUG9ydCxcbiAgUGF0aCxcbiAgUXVlcnlEYXRhLFxuICBGcmFnbWVudFxufVxuXG4vKipcbiAqIFNwbGl0cyBhIFVSSSBpbnRvIGl0cyBjb21wb25lbnQgcGFydHMuXG4gKlxuICogRWFjaCBjb21wb25lbnQgY2FuIGJlIGFjY2Vzc2VkIHZpYSB0aGUgY29tcG9uZW50IGluZGljZXM7IGZvciBleGFtcGxlOlxuICogPHByZT5cbiAqIGdvb2cudXJpLnV0aWxzLnNwbGl0KHNvbWVTdHIpW2dvb2cudXJpLnV0aWxzLkNvbXBvbnRlbnRJbmRleC5RVUVSWV9EQVRBXTtcbiAqIDwvcHJlPlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmkgVGhlIFVSSSBzdHJpbmcgdG8gZXhhbWluZS5cbiAqIEByZXR1cm4geyFBcnJheS48c3RyaW5nfHVuZGVmaW5lZD59IEVhY2ggY29tcG9uZW50IHN0aWxsIFVSSS1lbmNvZGVkLlxuICogICAgIEVhY2ggY29tcG9uZW50IHRoYXQgaXMgcHJlc2VudCB3aWxsIGNvbnRhaW4gdGhlIGVuY29kZWQgdmFsdWUsIHdoZXJlYXNcbiAqICAgICBjb21wb25lbnRzIHRoYXQgYXJlIG5vdCBwcmVzZW50IHdpbGwgYmUgdW5kZWZpbmVkIG9yIGVtcHR5LCBkZXBlbmRpbmdcbiAqICAgICBvbiB0aGUgYnJvd3NlcidzIHJlZ3VsYXIgZXhwcmVzc2lvbiBpbXBsZW1lbnRhdGlvbi4gIE5ldmVyIG51bGwsIHNpbmNlXG4gKiAgICAgYXJiaXRyYXJ5IHN0cmluZ3MgbWF5IHN0aWxsIGxvb2sgbGlrZSBwYXRoIG5hbWVzLlxuICovXG5mdW5jdGlvbiBfc3BsaXQodXJpOiBzdHJpbmcpOiBBcnJheTxzdHJpbmcgfCBhbnk+IHtcbiAgcmV0dXJuIFJlZ0V4cFdyYXBwZXIuZmlyc3RNYXRjaChfc3BsaXRSZSwgdXJpKTtcbn1cblxuLyoqXG4gICogUmVtb3ZlcyBkb3Qgc2VnbWVudHMgaW4gZ2l2ZW4gcGF0aCBjb21wb25lbnQsIGFzIGRlc2NyaWJlZCBpblxuICAqIFJGQyAzOTg2LCBzZWN0aW9uIDUuMi40LlxuICAqXG4gICogQHBhcmFtIHtzdHJpbmd9IHBhdGggQSBub24tZW1wdHkgcGF0aCBjb21wb25lbnQuXG4gICogQHJldHVybiB7c3RyaW5nfSBQYXRoIGNvbXBvbmVudCB3aXRoIHJlbW92ZWQgZG90IHNlZ21lbnRzLlxuICAqL1xuZnVuY3Rpb24gX3JlbW92ZURvdFNlZ21lbnRzKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChwYXRoID09ICcvJykgcmV0dXJuICcvJztcblxuICB2YXIgbGVhZGluZ1NsYXNoID0gcGF0aFswXSA9PSAnLycgPyAnLycgOiAnJztcbiAgdmFyIHRyYWlsaW5nU2xhc2ggPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV0gPT09ICcvJyA/ICcvJyA6ICcnO1xuICB2YXIgc2VnbWVudHMgPSBwYXRoLnNwbGl0KCcvJyk7XG5cbiAgdmFyIG91dDogc3RyaW5nW10gPSBbXTtcbiAgdmFyIHVwID0gMDtcbiAgZm9yICh2YXIgcG9zID0gMDsgcG9zIDwgc2VnbWVudHMubGVuZ3RoOyBwb3MrKykge1xuICAgIHZhciBzZWdtZW50ID0gc2VnbWVudHNbcG9zXTtcbiAgICBzd2l0Y2ggKHNlZ21lbnQpIHtcbiAgICAgIGNhc2UgJyc6XG4gICAgICBjYXNlICcuJzpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICcuLic6XG4gICAgICAgIGlmIChvdXQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIG91dC5wb3AoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1cCsrO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgb3V0LnB1c2goc2VnbWVudCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGxlYWRpbmdTbGFzaCA9PSAnJykge1xuICAgIHdoaWxlICh1cC0tID4gMCkge1xuICAgICAgb3V0LnVuc2hpZnQoJy4uJyk7XG4gICAgfVxuXG4gICAgaWYgKG91dC5sZW5ndGggPT09IDApIG91dC5wdXNoKCcuJyk7XG4gIH1cblxuICByZXR1cm4gbGVhZGluZ1NsYXNoICsgb3V0LmpvaW4oJy8nKSArIHRyYWlsaW5nU2xhc2g7XG59XG5cbi8qKlxuICogVGFrZXMgYW4gYXJyYXkgb2YgdGhlIHBhcnRzIGZyb20gc3BsaXQgYW5kIGNhbm9uaWNhbGl6ZXMgdGhlIHBhdGggcGFydFxuICogYW5kIHRoZW4gam9pbnMgYWxsIHRoZSBwYXJ0cy5cbiAqIEBwYXJhbSB7QXJyYXkuPHN0cmluZz8+fSBwYXJ0c1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBfam9pbkFuZENhbm9uaWNhbGl6ZVBhdGgocGFydHM6IGFueVtdKTogc3RyaW5nIHtcbiAgdmFyIHBhdGggPSBwYXJ0c1tfQ29tcG9uZW50SW5kZXguUGF0aF07XG4gIHBhdGggPSBpc0JsYW5rKHBhdGgpID8gJycgOiBfcmVtb3ZlRG90U2VnbWVudHMocGF0aCk7XG4gIHBhcnRzW19Db21wb25lbnRJbmRleC5QYXRoXSA9IHBhdGg7XG5cbiAgcmV0dXJuIF9idWlsZEZyb21FbmNvZGVkUGFydHMocGFydHNbX0NvbXBvbmVudEluZGV4LlNjaGVtZV0sIHBhcnRzW19Db21wb25lbnRJbmRleC5Vc2VySW5mb10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzW19Db21wb25lbnRJbmRleC5Eb21haW5dLCBwYXJ0c1tfQ29tcG9uZW50SW5kZXguUG9ydF0sIHBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzW19Db21wb25lbnRJbmRleC5RdWVyeURhdGFdLCBwYXJ0c1tfQ29tcG9uZW50SW5kZXguRnJhZ21lbnRdKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhIFVSTC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlIFRoZSBVUkwgYWN0aW5nIGFzIHRoZSBiYXNlIFVSTC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0byBUaGUgVVJMIHRvIHJlc29sdmUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIF9yZXNvbHZlVXJsKGJhc2U6IHN0cmluZywgdXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICB2YXIgcGFydHMgPSBfc3BsaXQoZW5jb2RlVVJJKHVybCkpO1xuICB2YXIgYmFzZVBhcnRzID0gX3NwbGl0KGJhc2UpO1xuXG4gIGlmIChpc1ByZXNlbnQocGFydHNbX0NvbXBvbmVudEluZGV4LlNjaGVtZV0pKSB7XG4gICAgcmV0dXJuIF9qb2luQW5kQ2Fub25pY2FsaXplUGF0aChwYXJ0cyk7XG4gIH0gZWxzZSB7XG4gICAgcGFydHNbX0NvbXBvbmVudEluZGV4LlNjaGVtZV0gPSBiYXNlUGFydHNbX0NvbXBvbmVudEluZGV4LlNjaGVtZV07XG4gIH1cblxuICBmb3IgKHZhciBpID0gX0NvbXBvbmVudEluZGV4LlNjaGVtZTsgaSA8PSBfQ29tcG9uZW50SW5kZXguUG9ydDsgaSsrKSB7XG4gICAgaWYgKGlzQmxhbmsocGFydHNbaV0pKSB7XG4gICAgICBwYXJ0c1tpXSA9IGJhc2VQYXJ0c1tpXTtcbiAgICB9XG4gIH1cblxuICBpZiAocGFydHNbX0NvbXBvbmVudEluZGV4LlBhdGhdWzBdID09ICcvJykge1xuICAgIHJldHVybiBfam9pbkFuZENhbm9uaWNhbGl6ZVBhdGgocGFydHMpO1xuICB9XG5cbiAgdmFyIHBhdGggPSBiYXNlUGFydHNbX0NvbXBvbmVudEluZGV4LlBhdGhdO1xuICBpZiAoaXNCbGFuayhwYXRoKSkgcGF0aCA9ICcvJztcbiAgdmFyIGluZGV4ID0gcGF0aC5sYXN0SW5kZXhPZignLycpO1xuICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgaW5kZXggKyAxKSArIHBhcnRzW19Db21wb25lbnRJbmRleC5QYXRoXTtcbiAgcGFydHNbX0NvbXBvbmVudEluZGV4LlBhdGhdID0gcGF0aDtcbiAgcmV0dXJuIF9qb2luQW5kQ2Fub25pY2FsaXplUGF0aChwYXJ0cyk7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tcGlsZXIvdXJsX3Jlc29sdmVyLnRzXG4gKiovIiwiaW1wb3J0IHtQcm9taXNlfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2FzeW5jJztcblxuLy8gVE9ETzogdnNhdmtpbiByZW5hbWUgaXQgaW50byBUZW1wbGF0ZUxvYWRlclxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgZm9yIHJldHJpZXZpbmcgZG9jdW1lbnRzIGJ5IFVSTCB0aGF0IHRoZSBjb21waWxlciB1c2VzXG4gKiB0byBsb2FkIHRlbXBsYXRlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFhIUiB7XG4gIGdldCh1cmw6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7IHJldHVybiBudWxsOyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tcGlsZXIveGhyLnRzXG4gKiovIiwiaW1wb3J0IHtSdW50aW1lQ29tcGlsZXJffSBmcm9tIFwiLi9ydW50aW1lX2NvbXBpbGVyXCI7XG5leHBvcnQge1RlbXBsYXRlQ29tcGlsZXJ9IGZyb20gJy4vdGVtcGxhdGVfY29tcGlsZXInO1xuZXhwb3J0IHtcbiAgQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhLFxuICBDb21waWxlVHlwZU1ldGFkYXRhLFxuICBDb21waWxlVGVtcGxhdGVNZXRhZGF0YVxufSBmcm9tICcuL2RpcmVjdGl2ZV9tZXRhZGF0YSc7XG5leHBvcnQge1NvdXJjZU1vZHVsZSwgU291cmNlV2l0aEltcG9ydHN9IGZyb20gJy4vc291cmNlX21vZHVsZSc7XG5leHBvcnQge1BMQVRGT1JNX0RJUkVDVElWRVMsIFBMQVRGT1JNX1BJUEVTfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9wbGF0Zm9ybV9kaXJlY3RpdmVzX2FuZF9waXBlcyc7XG5leHBvcnQgKiBmcm9tICdhbmd1bGFyMi9zcmMvY29tcGlsZXIvdGVtcGxhdGVfYXN0JztcbmV4cG9ydCB7VEVNUExBVEVfVFJBTlNGT1JNU30gZnJvbSAnYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3RlbXBsYXRlX3BhcnNlcic7XG5pbXBvcnQge2Fzc2VydGlvbnNFbmFibGVkLCBUeXBlLCBDT05TVF9FWFBSfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtwcm92aWRlLCBQcm92aWRlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvZGknO1xuaW1wb3J0IHtUZW1wbGF0ZVBhcnNlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3RlbXBsYXRlX3BhcnNlcic7XG5pbXBvcnQge0h0bWxQYXJzZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb21waWxlci9odG1sX3BhcnNlcic7XG5pbXBvcnQge1RlbXBsYXRlTm9ybWFsaXplcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3RlbXBsYXRlX25vcm1hbGl6ZXInO1xuaW1wb3J0IHtSdW50aW1lTWV0YWRhdGFSZXNvbHZlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3J1bnRpbWVfbWV0YWRhdGEnO1xuaW1wb3J0IHtDaGFuZ2VEZXRlY3Rpb25Db21waWxlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvbXBpbGVyL2NoYW5nZV9kZXRlY3Rvcl9jb21waWxlcic7XG5pbXBvcnQge1N0eWxlQ29tcGlsZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb21waWxlci9zdHlsZV9jb21waWxlcic7XG5pbXBvcnQge0NvbW1hbmRDb21waWxlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvbXBpbGVyL2NvbW1hbmRfY29tcGlsZXInO1xuaW1wb3J0IHtUZW1wbGF0ZUNvbXBpbGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvY29tcGlsZXIvdGVtcGxhdGVfY29tcGlsZXInO1xuaW1wb3J0IHtDaGFuZ2VEZXRlY3RvckdlbkNvbmZpZ30gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9jaGFuZ2VfZGV0ZWN0aW9uJztcbmltcG9ydCB7Q29tcGlsZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9jb21waWxlcic7XG5pbXBvcnQge1J1bnRpbWVDb21waWxlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3J1bnRpbWVfY29tcGlsZXInO1xuaW1wb3J0IHtFbGVtZW50U2NoZW1hUmVnaXN0cnl9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb21waWxlci9zY2hlbWEvZWxlbWVudF9zY2hlbWFfcmVnaXN0cnknO1xuaW1wb3J0IHtEb21FbGVtZW50U2NoZW1hUmVnaXN0cnl9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb21waWxlci9zY2hlbWEvZG9tX2VsZW1lbnRfc2NoZW1hX3JlZ2lzdHJ5JztcbmltcG9ydCB7VXJsUmVzb2x2ZXIsIERFRkFVTFRfUEFDS0FHRV9VUkxfUFJPVklERVJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb21waWxlci91cmxfcmVzb2x2ZXInO1xuaW1wb3J0IHtQYXJzZXIsIExleGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2NoYW5nZV9kZXRlY3Rpb24nO1xuXG5mdW5jdGlvbiBfY3JlYXRlQ2hhbmdlRGV0ZWN0b3JHZW5Db25maWcoKSB7XG4gIHJldHVybiBuZXcgQ2hhbmdlRGV0ZWN0b3JHZW5Db25maWcoYXNzZXJ0aW9uc0VuYWJsZWQoKSwgZmFsc2UsIHRydWUpO1xufVxuXG4vKipcbiAqIEEgc2V0IG9mIHByb3ZpZGVycyB0aGF0IHByb3ZpZGUgYFJ1bnRpbWVDb21waWxlcmAgYW5kIGl0cyBkZXBlbmRlbmNpZXMgdG8gdXNlIGZvclxuICogdGVtcGxhdGUgY29tcGlsYXRpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBDT01QSUxFUl9QUk9WSURFUlM6IEFycmF5PFR5cGUgfCBQcm92aWRlciB8IGFueVtdPiA9IENPTlNUX0VYUFIoW1xuICBMZXhlcixcbiAgUGFyc2VyLFxuICBIdG1sUGFyc2VyLFxuICBUZW1wbGF0ZVBhcnNlcixcbiAgVGVtcGxhdGVOb3JtYWxpemVyLFxuICBSdW50aW1lTWV0YWRhdGFSZXNvbHZlcixcbiAgREVGQVVMVF9QQUNLQUdFX1VSTF9QUk9WSURFUixcbiAgU3R5bGVDb21waWxlcixcbiAgQ29tbWFuZENvbXBpbGVyLFxuICBDaGFuZ2VEZXRlY3Rpb25Db21waWxlcixcbiAgbmV3IFByb3ZpZGVyKENoYW5nZURldGVjdG9yR2VuQ29uZmlnLCB7dXNlRmFjdG9yeTogX2NyZWF0ZUNoYW5nZURldGVjdG9yR2VuQ29uZmlnLCBkZXBzOiBbXX0pLFxuICBUZW1wbGF0ZUNvbXBpbGVyLFxuICBuZXcgUHJvdmlkZXIoUnVudGltZUNvbXBpbGVyLCB7dXNlQ2xhc3M6IFJ1bnRpbWVDb21waWxlcl99KSxcbiAgbmV3IFByb3ZpZGVyKENvbXBpbGVyLCB7dXNlRXhpc3Rpbmc6IFJ1bnRpbWVDb21waWxlcn0pLFxuICBEb21FbGVtZW50U2NoZW1hUmVnaXN0cnksXG4gIG5ldyBQcm92aWRlcihFbGVtZW50U2NoZW1hUmVnaXN0cnksIHt1c2VFeGlzdGluZzogRG9tRWxlbWVudFNjaGVtYVJlZ2lzdHJ5fSksXG4gIFVybFJlc29sdmVyXG5dKTtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21waWxlci9jb21waWxlci50c1xuICoqLyIsImltcG9ydCB7Q29tcGlsZXIsIENvbXBpbGVyXywgaW50ZXJuYWxDcmVhdGVQcm90b1ZpZXd9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9jb21waWxlcic7XG5pbXBvcnQge1Byb3RvVmlld1JlZn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL3ZpZXdfcmVmJztcbmltcG9ydCB7UHJvdG9WaWV3RmFjdG9yeX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL3Byb3RvX3ZpZXdfZmFjdG9yeSc7XG5pbXBvcnQge1RlbXBsYXRlQ29tcGlsZXJ9IGZyb20gJy4vdGVtcGxhdGVfY29tcGlsZXInO1xuXG5pbXBvcnQge0luamVjdGFibGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpJztcbmltcG9ydCB7VHlwZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7UHJvbWlzZSwgUHJvbWlzZVdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvYXN5bmMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUnVudGltZUNvbXBpbGVyIGV4dGVuZHMgQ29tcGlsZXIge31cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJ1bnRpbWVDb21waWxlcl8gZXh0ZW5kcyBDb21waWxlcl8gaW1wbGVtZW50cyBSdW50aW1lQ29tcGlsZXIge1xuICBjb25zdHJ1Y3RvcihfcHJvdG9WaWV3RmFjdG9yeTogUHJvdG9WaWV3RmFjdG9yeSwgcHJpdmF0ZSBfdGVtcGxhdGVDb21waWxlcjogVGVtcGxhdGVDb21waWxlcikge1xuICAgIHN1cGVyKF9wcm90b1ZpZXdGYWN0b3J5KTtcbiAgfVxuXG4gIGNvbXBpbGVJbkhvc3QoY29tcG9uZW50VHlwZTogVHlwZSk6IFByb21pc2U8UHJvdG9WaWV3UmVmPiB7XG4gICAgcmV0dXJuIHRoaXMuX3RlbXBsYXRlQ29tcGlsZXIuY29tcGlsZUhvc3RDb21wb25lbnRSdW50aW1lKGNvbXBvbmVudFR5cGUpXG4gICAgICAgIC50aGVuKGNvbXBpbGVkSG9zdFRlbXBsYXRlID0+IGludGVybmFsQ3JlYXRlUHJvdG9WaWV3KHRoaXMsIGNvbXBpbGVkSG9zdFRlbXBsYXRlKSk7XG4gIH1cblxuICBjbGVhckNhY2hlKCkge1xuICAgIHN1cGVyLmNsZWFyQ2FjaGUoKTtcbiAgICB0aGlzLl90ZW1wbGF0ZUNvbXBpbGVyLmNsZWFyQ2FjaGUoKTtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3J1bnRpbWVfY29tcGlsZXIudHNcbiAqKi8iLCJpbXBvcnQge0lTX0RBUlQsIFR5cGUsIEpzb24sIGlzQmxhbmssIHN0cmluZ2lmeX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7TGlzdFdyYXBwZXIsIFNldFdyYXBwZXIsIE1hcFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge1Byb21pc2VXcmFwcGVyLCBQcm9taXNlfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2FzeW5jJztcbmltcG9ydCB7XG4gIENvbXBpbGVkQ29tcG9uZW50VGVtcGxhdGUsXG4gIFRlbXBsYXRlQ21kLFxuICBDb21waWxlZEhvc3RUZW1wbGF0ZSxcbiAgQmVnaW5Db21wb25lbnRDbWRcbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL3RlbXBsYXRlX2NvbW1hbmRzJztcbmltcG9ydCB7XG4gIGNyZWF0ZUhvc3RDb21wb25lbnRNZXRhLFxuICBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGEsXG4gIENvbXBpbGVUeXBlTWV0YWRhdGEsXG4gIENvbXBpbGVUZW1wbGF0ZU1ldGFkYXRhXG59IGZyb20gJy4vZGlyZWN0aXZlX21ldGFkYXRhJztcbmltcG9ydCB7VGVtcGxhdGVBc3R9IGZyb20gJy4vdGVtcGxhdGVfYXN0JztcbmltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvZGknO1xuaW1wb3J0IHtTb3VyY2VNb2R1bGUsIG1vZHVsZVJlZn0gZnJvbSAnLi9zb3VyY2VfbW9kdWxlJztcbmltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uQ29tcGlsZXJ9IGZyb20gJy4vY2hhbmdlX2RldGVjdG9yX2NvbXBpbGVyJztcbmltcG9ydCB7U3R5bGVDb21waWxlcn0gZnJvbSAnLi9zdHlsZV9jb21waWxlcic7XG5pbXBvcnQge0NvbW1hbmRDb21waWxlcn0gZnJvbSAnLi9jb21tYW5kX2NvbXBpbGVyJztcbmltcG9ydCB7VGVtcGxhdGVQYXJzZXJ9IGZyb20gJy4vdGVtcGxhdGVfcGFyc2VyJztcbmltcG9ydCB7VGVtcGxhdGVOb3JtYWxpemVyfSBmcm9tICcuL3RlbXBsYXRlX25vcm1hbGl6ZXInO1xuaW1wb3J0IHtSdW50aW1lTWV0YWRhdGFSZXNvbHZlcn0gZnJvbSAnLi9ydW50aW1lX21ldGFkYXRhJztcblxuaW1wb3J0IHtURU1QTEFURV9DT01NQU5EU19NT0RVTEVfUkVGfSBmcm9tICcuL2NvbW1hbmRfY29tcGlsZXInO1xuaW1wb3J0IHtcbiAgY29kZUdlbkV4cG9ydFZhcmlhYmxlLFxuICBlc2NhcGVTaW5nbGVRdW90ZVN0cmluZyxcbiAgY29kZUdlblZhbHVlRm4sXG4gIE1PRFVMRV9TVUZGSVhcbn0gZnJvbSAnLi91dGlsJztcblxuLyoqXG4gKiBBbiBpbnRlcm5hbCBtb2R1bGUgb2YgdGhlIEFuZ3VsYXIgY29tcGlsZXIgdGhhdCBiZWdpbnMgd2l0aCBjb21wb25lbnQgdHlwZXMsXG4gKiBleHRyYWN0cyB0ZW1wbGF0ZXMsIGFuZCBldmVudHVhbGx5IHByb2R1Y2VzIGEgY29tcGlsZWQgdmVyc2lvbiBvZiB0aGUgY29tcG9uZW50XG4gKiByZWFkeSBmb3IgbGlua2luZyBpbnRvIGFuIGFwcGxpY2F0aW9uLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVDb21waWxlciB7XG4gIHByaXZhdGUgX2hvc3RDYWNoZUtleXMgPSBuZXcgTWFwPFR5cGUsIGFueT4oKTtcbiAgcHJpdmF0ZSBfY29tcGlsZWRUZW1wbGF0ZUNhY2hlID0gbmV3IE1hcDxhbnksIENvbXBpbGVkQ29tcG9uZW50VGVtcGxhdGU+KCk7XG4gIHByaXZhdGUgX2NvbXBpbGVkVGVtcGxhdGVEb25lID0gbmV3IE1hcDxhbnksIFByb21pc2U8Q29tcGlsZWRDb21wb25lbnRUZW1wbGF0ZT4+KCk7XG4gIHByaXZhdGUgX25leHRUZW1wbGF0ZUlkOiBudW1iZXIgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3J1bnRpbWVNZXRhZGF0YVJlc29sdmVyOiBSdW50aW1lTWV0YWRhdGFSZXNvbHZlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfdGVtcGxhdGVOb3JtYWxpemVyOiBUZW1wbGF0ZU5vcm1hbGl6ZXIsXG4gICAgICAgICAgICAgIHByaXZhdGUgX3RlbXBsYXRlUGFyc2VyOiBUZW1wbGF0ZVBhcnNlciwgcHJpdmF0ZSBfc3R5bGVDb21waWxlcjogU3R5bGVDb21waWxlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfY29tbWFuZENvbXBpbGVyOiBDb21tYW5kQ29tcGlsZXIsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2NkQ29tcGlsZXI6IENoYW5nZURldGVjdGlvbkNvbXBpbGVyKSB7fVxuXG4gIG5vcm1hbGl6ZURpcmVjdGl2ZU1ldGFkYXRhKGRpcmVjdGl2ZTogQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhKTpcbiAgICAgIFByb21pc2U8Q29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhPiB7XG4gICAgaWYgKCFkaXJlY3RpdmUuaXNDb21wb25lbnQpIHtcbiAgICAgIC8vIEZvciBub24gY29tcG9uZW50cyB0aGVyZSBpcyBub3RoaW5nIHRvIGJlIG5vcm1hbGl6ZWQgeWV0LlxuICAgICAgcmV0dXJuIFByb21pc2VXcmFwcGVyLnJlc29sdmUoZGlyZWN0aXZlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fdGVtcGxhdGVOb3JtYWxpemVyLm5vcm1hbGl6ZVRlbXBsYXRlKGRpcmVjdGl2ZS50eXBlLCBkaXJlY3RpdmUudGVtcGxhdGUpXG4gICAgICAgIC50aGVuKChub3JtYWxpemVkVGVtcGxhdGU6IENvbXBpbGVUZW1wbGF0ZU1ldGFkYXRhKSA9PiBuZXcgQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBkaXJlY3RpdmUudHlwZSxcbiAgICAgICAgICAgICAgICBpc0NvbXBvbmVudDogZGlyZWN0aXZlLmlzQ29tcG9uZW50LFxuICAgICAgICAgICAgICAgIGR5bmFtaWNMb2FkYWJsZTogZGlyZWN0aXZlLmR5bmFtaWNMb2FkYWJsZSxcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogZGlyZWN0aXZlLnNlbGVjdG9yLFxuICAgICAgICAgICAgICAgIGV4cG9ydEFzOiBkaXJlY3RpdmUuZXhwb3J0QXMsXG4gICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBkaXJlY3RpdmUuY2hhbmdlRGV0ZWN0aW9uLFxuICAgICAgICAgICAgICAgIGlucHV0czogZGlyZWN0aXZlLmlucHV0cyxcbiAgICAgICAgICAgICAgICBvdXRwdXRzOiBkaXJlY3RpdmUub3V0cHV0cyxcbiAgICAgICAgICAgICAgICBob3N0TGlzdGVuZXJzOiBkaXJlY3RpdmUuaG9zdExpc3RlbmVycyxcbiAgICAgICAgICAgICAgICBob3N0UHJvcGVydGllczogZGlyZWN0aXZlLmhvc3RQcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgIGhvc3RBdHRyaWJ1dGVzOiBkaXJlY3RpdmUuaG9zdEF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgbGlmZWN5Y2xlSG9va3M6IGRpcmVjdGl2ZS5saWZlY3ljbGVIb29rcyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogbm9ybWFsaXplZFRlbXBsYXRlXG4gICAgICAgICAgICAgIH0pKTtcbiAgfVxuXG4gIGNvbXBpbGVIb3N0Q29tcG9uZW50UnVudGltZSh0eXBlOiBUeXBlKTogUHJvbWlzZTxDb21waWxlZEhvc3RUZW1wbGF0ZT4ge1xuICAgIHZhciBob3N0Q2FjaGVLZXkgPSB0aGlzLl9ob3N0Q2FjaGVLZXlzLmdldCh0eXBlKTtcbiAgICBpZiAoaXNCbGFuayhob3N0Q2FjaGVLZXkpKSB7XG4gICAgICBob3N0Q2FjaGVLZXkgPSBuZXcgT2JqZWN0KCk7XG4gICAgICB0aGlzLl9ob3N0Q2FjaGVLZXlzLnNldCh0eXBlLCBob3N0Q2FjaGVLZXkpO1xuICAgICAgdmFyIGNvbXBNZXRhOiBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGEgPSB0aGlzLl9ydW50aW1lTWV0YWRhdGFSZXNvbHZlci5nZXRNZXRhZGF0YSh0eXBlKTtcbiAgICAgIGFzc2VydENvbXBvbmVudChjb21wTWV0YSk7XG4gICAgICB2YXIgaG9zdE1ldGE6IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YSA9XG4gICAgICAgICAgY3JlYXRlSG9zdENvbXBvbmVudE1ldGEoY29tcE1ldGEudHlwZSwgY29tcE1ldGEuc2VsZWN0b3IpO1xuXG4gICAgICB0aGlzLl9jb21waWxlQ29tcG9uZW50UnVudGltZShob3N0Q2FjaGVLZXksIGhvc3RNZXRhLCBbY29tcE1ldGFdLCBuZXcgU2V0KCkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY29tcGlsZWRUZW1wbGF0ZURvbmUuZ2V0KGhvc3RDYWNoZUtleSlcbiAgICAgICAgLnRoZW4oY29tcGlsZWRUZW1wbGF0ZSA9PiBuZXcgQ29tcGlsZWRIb3N0VGVtcGxhdGUoY29tcGlsZWRUZW1wbGF0ZSkpO1xuICB9XG5cbiAgY2xlYXJDYWNoZSgpIHtcbiAgICB0aGlzLl9ob3N0Q2FjaGVLZXlzLmNsZWFyKCk7XG4gICAgdGhpcy5fc3R5bGVDb21waWxlci5jbGVhckNhY2hlKCk7XG4gICAgdGhpcy5fY29tcGlsZWRUZW1wbGF0ZUNhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5fY29tcGlsZWRUZW1wbGF0ZURvbmUuY2xlYXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbXBpbGVDb21wb25lbnRSdW50aW1lKFxuICAgICAgY2FjaGVLZXk6IGFueSwgY29tcE1ldGE6IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YSwgdmlld0RpcmVjdGl2ZXM6IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YVtdLFxuICAgICAgY29tcGlsaW5nQ29tcG9uZW50Q2FjaGVLZXlzOiBTZXQ8YW55Pik6IENvbXBpbGVkQ29tcG9uZW50VGVtcGxhdGUge1xuICAgIGxldCB1bmlxVmlld0RpcmVjdGl2ZXMgPSByZW1vdmVEdXBsaWNhdGVzKHZpZXdEaXJlY3RpdmVzKTtcbiAgICB2YXIgY29tcGlsZWRUZW1wbGF0ZSA9IHRoaXMuX2NvbXBpbGVkVGVtcGxhdGVDYWNoZS5nZXQoY2FjaGVLZXkpO1xuICAgIHZhciBkb25lID0gdGhpcy5fY29tcGlsZWRUZW1wbGF0ZURvbmUuZ2V0KGNhY2hlS2V5KTtcbiAgICBpZiAoaXNCbGFuayhjb21waWxlZFRlbXBsYXRlKSkge1xuICAgICAgdmFyIHN0eWxlcyA9IFtdO1xuICAgICAgdmFyIGNoYW5nZURldGVjdG9yRmFjdG9yeTtcbiAgICAgIHZhciBjb21tYW5kcyA9IFtdO1xuICAgICAgdmFyIHRlbXBsYXRlSWQgPSBgJHtzdHJpbmdpZnkoY29tcE1ldGEudHlwZS5ydW50aW1lKX1UZW1wbGF0ZSR7dGhpcy5fbmV4dFRlbXBsYXRlSWQrK31gO1xuICAgICAgY29tcGlsZWRUZW1wbGF0ZSA9IG5ldyBDb21waWxlZENvbXBvbmVudFRlbXBsYXRlKFxuICAgICAgICAgIHRlbXBsYXRlSWQsIChkaXNwYXRjaGVyKSA9PiBjaGFuZ2VEZXRlY3RvckZhY3RvcnkoZGlzcGF0Y2hlciksIGNvbW1hbmRzLCBzdHlsZXMpO1xuICAgICAgdGhpcy5fY29tcGlsZWRUZW1wbGF0ZUNhY2hlLnNldChjYWNoZUtleSwgY29tcGlsZWRUZW1wbGF0ZSk7XG4gICAgICBjb21waWxpbmdDb21wb25lbnRDYWNoZUtleXMuYWRkKGNhY2hlS2V5KTtcbiAgICAgIGRvbmUgPSBQcm9taXNlV3JhcHBlclxuICAgICAgICAgICAgICAgICAuYWxsKFs8YW55PnRoaXMuX3N0eWxlQ29tcGlsZXIuY29tcGlsZUNvbXBvbmVudFJ1bnRpbWUoY29tcE1ldGEudGVtcGxhdGUpXS5jb25jYXQoXG4gICAgICAgICAgICAgICAgICAgICB1bmlxVmlld0RpcmVjdGl2ZXMubWFwKGRpck1ldGEgPT4gdGhpcy5ub3JtYWxpemVEaXJlY3RpdmVNZXRhZGF0YShkaXJNZXRhKSkpKVxuICAgICAgICAgICAgICAgICAudGhlbigoc3R5bGVzQW5kTm9ybWFsaXplZFZpZXdEaXJNZXRhczogYW55W10pID0+IHtcbiAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGRQcm9taXNlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgIHZhciBub3JtYWxpemVkVmlld0Rpck1ldGFzID0gc3R5bGVzQW5kTm9ybWFsaXplZFZpZXdEaXJNZXRhcy5zbGljZSgxKTtcbiAgICAgICAgICAgICAgICAgICB2YXIgcGFyc2VkVGVtcGxhdGUgPSB0aGlzLl90ZW1wbGF0ZVBhcnNlci5wYXJzZShcbiAgICAgICAgICAgICAgICAgICAgICAgY29tcE1ldGEudGVtcGxhdGUudGVtcGxhdGUsIG5vcm1hbGl6ZWRWaWV3RGlyTWV0YXMsIGNvbXBNZXRhLnR5cGUubmFtZSk7XG5cbiAgICAgICAgICAgICAgICAgICB2YXIgY2hhbmdlRGV0ZWN0b3JGYWN0b3JpZXMgPSB0aGlzLl9jZENvbXBpbGVyLmNvbXBpbGVDb21wb25lbnRSdW50aW1lKFxuICAgICAgICAgICAgICAgICAgICAgICBjb21wTWV0YS50eXBlLCBjb21wTWV0YS5jaGFuZ2VEZXRlY3Rpb24sIHBhcnNlZFRlbXBsYXRlKTtcbiAgICAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3RvckZhY3RvcnkgPSBjaGFuZ2VEZXRlY3RvckZhY3Rvcmllc1swXTtcbiAgICAgICAgICAgICAgICAgICB2YXIgdG1wU3R5bGVzOiBzdHJpbmdbXSA9IHN0eWxlc0FuZE5vcm1hbGl6ZWRWaWV3RGlyTWV0YXNbMF07XG4gICAgICAgICAgICAgICAgICAgdG1wU3R5bGVzLmZvckVhY2goc3R5bGUgPT4gc3R5bGVzLnB1c2goc3R5bGUpKTtcbiAgICAgICAgICAgICAgICAgICB2YXIgdG1wQ29tbWFuZHM6IFRlbXBsYXRlQ21kW10gPSB0aGlzLl9jb21waWxlQ29tbWFuZHNSdW50aW1lKFxuICAgICAgICAgICAgICAgICAgICAgICBjb21wTWV0YSwgcGFyc2VkVGVtcGxhdGUsIGNoYW5nZURldGVjdG9yRmFjdG9yaWVzLFxuICAgICAgICAgICAgICAgICAgICAgICBjb21waWxpbmdDb21wb25lbnRDYWNoZUtleXMsIGNoaWxkUHJvbWlzZXMpO1xuICAgICAgICAgICAgICAgICAgIHRtcENvbW1hbmRzLmZvckVhY2goY21kID0+IGNvbW1hbmRzLnB1c2goY21kKSk7XG4gICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2VXcmFwcGVyLmFsbChjaGlsZFByb21pc2VzKTtcbiAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgLnRoZW4oKF8pID0+IHtcbiAgICAgICAgICAgICAgICAgICBTZXRXcmFwcGVyLmRlbGV0ZShjb21waWxpbmdDb21wb25lbnRDYWNoZUtleXMsIGNhY2hlS2V5KTtcbiAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcGlsZWRUZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgfSk7XG4gICAgICB0aGlzLl9jb21waWxlZFRlbXBsYXRlRG9uZS5zZXQoY2FjaGVLZXksIGRvbmUpO1xuICAgIH1cbiAgICByZXR1cm4gY29tcGlsZWRUZW1wbGF0ZTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbXBpbGVDb21tYW5kc1J1bnRpbWUoY29tcE1ldGE6IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YSwgcGFyc2VkVGVtcGxhdGU6IFRlbXBsYXRlQXN0W10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0b3JGYWN0b3JpZXM6IEZ1bmN0aW9uW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsaW5nQ29tcG9uZW50Q2FjaGVLZXlzOiBTZXQ8VHlwZT4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRQcm9taXNlczogUHJvbWlzZTxhbnk+W10pOiBUZW1wbGF0ZUNtZFtdIHtcbiAgICB2YXIgY21kczogVGVtcGxhdGVDbWRbXSA9IHRoaXMuX2NvbW1hbmRDb21waWxlci5jb21waWxlQ29tcG9uZW50UnVudGltZShcbiAgICAgICAgY29tcE1ldGEsIHBhcnNlZFRlbXBsYXRlLCBjaGFuZ2VEZXRlY3RvckZhY3RvcmllcyxcbiAgICAgICAgKGNoaWxkQ29tcG9uZW50RGlyOiBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGEpID0+IHtcbiAgICAgICAgICB2YXIgY2hpbGRDYWNoZUtleSA9IGNoaWxkQ29tcG9uZW50RGlyLnR5cGUucnVudGltZTtcbiAgICAgICAgICB2YXIgY2hpbGRWaWV3RGlyZWN0aXZlczogQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhW10gPVxuICAgICAgICAgICAgICB0aGlzLl9ydW50aW1lTWV0YWRhdGFSZXNvbHZlci5nZXRWaWV3RGlyZWN0aXZlc01ldGFkYXRhKFxuICAgICAgICAgICAgICAgICAgY2hpbGRDb21wb25lbnREaXIudHlwZS5ydW50aW1lKTtcbiAgICAgICAgICB2YXIgY2hpbGRJc1JlY3Vyc2l2ZSA9IFNldFdyYXBwZXIuaGFzKGNvbXBpbGluZ0NvbXBvbmVudENhY2hlS2V5cywgY2hpbGRDYWNoZUtleSk7XG4gICAgICAgICAgdmFyIGNoaWxkVGVtcGxhdGUgPSB0aGlzLl9jb21waWxlQ29tcG9uZW50UnVudGltZShcbiAgICAgICAgICAgICAgY2hpbGRDYWNoZUtleSwgY2hpbGRDb21wb25lbnREaXIsIGNoaWxkVmlld0RpcmVjdGl2ZXMsIGNvbXBpbGluZ0NvbXBvbmVudENhY2hlS2V5cyk7XG4gICAgICAgICAgaWYgKCFjaGlsZElzUmVjdXJzaXZlKSB7XG4gICAgICAgICAgICAvLyBPbmx5IHdhaXQgZm9yIGEgY2hpbGQgaWYgaXQgaXMgbm90IGEgY3ljbGVcbiAgICAgICAgICAgIGNoaWxkUHJvbWlzZXMucHVzaCh0aGlzLl9jb21waWxlZFRlbXBsYXRlRG9uZS5nZXQoY2hpbGRDYWNoZUtleSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gKCkgPT4gY2hpbGRUZW1wbGF0ZTtcbiAgICAgICAgfSk7XG4gICAgY21kcy5mb3JFYWNoKGNtZCA9PiB7XG4gICAgICBpZiAoY21kIGluc3RhbmNlb2YgQmVnaW5Db21wb25lbnRDbWQpIHtcbiAgICAgICAgY21kLnRlbXBsYXRlR2V0dGVyKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNtZHM7XG4gIH1cblxuICBjb21waWxlVGVtcGxhdGVzQ29kZUdlbihjb21wb25lbnRzOiBOb3JtYWxpemVkQ29tcG9uZW50V2l0aFZpZXdEaXJlY3RpdmVzW10pOiBTb3VyY2VNb2R1bGUge1xuICAgIGlmIChjb21wb25lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ05vIGNvbXBvbmVudHMgZ2l2ZW4nKTtcbiAgICB9XG4gICAgdmFyIGRlY2xhcmF0aW9ucyA9IFtdO1xuICAgIHZhciB0ZW1wbGF0ZUFyZ3VtZW50cyA9IFtdO1xuICAgIHZhciBjb21wb25lbnRNZXRhczogQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhW10gPSBbXTtcbiAgICBjb21wb25lbnRzLmZvckVhY2goY29tcG9uZW50V2l0aERpcnMgPT4ge1xuICAgICAgdmFyIGNvbXBNZXRhID0gPENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YT5jb21wb25lbnRXaXRoRGlycy5jb21wb25lbnQ7XG4gICAgICBhc3NlcnRDb21wb25lbnQoY29tcE1ldGEpO1xuICAgICAgY29tcG9uZW50TWV0YXMucHVzaChjb21wTWV0YSk7XG5cbiAgICAgIHRoaXMuX3Byb2Nlc3NUZW1wbGF0ZUNvZGVHZW4oY29tcE1ldGEsIGNvbXBvbmVudFdpdGhEaXJzLmRpcmVjdGl2ZXMsIGRlY2xhcmF0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVBcmd1bWVudHMpO1xuICAgICAgaWYgKGNvbXBNZXRhLmR5bmFtaWNMb2FkYWJsZSkge1xuICAgICAgICB2YXIgaG9zdE1ldGEgPSBjcmVhdGVIb3N0Q29tcG9uZW50TWV0YShjb21wTWV0YS50eXBlLCBjb21wTWV0YS5zZWxlY3Rvcik7XG4gICAgICAgIGNvbXBvbmVudE1ldGFzLnB1c2goaG9zdE1ldGEpO1xuICAgICAgICB0aGlzLl9wcm9jZXNzVGVtcGxhdGVDb2RlR2VuKGhvc3RNZXRhLCBbY29tcE1ldGFdLCBkZWNsYXJhdGlvbnMsIHRlbXBsYXRlQXJndW1lbnRzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBMaXN0V3JhcHBlci5mb3JFYWNoV2l0aEluZGV4KGNvbXBvbmVudE1ldGFzLCAoY29tcE1ldGE6IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgdmFyIHRlbXBsYXRlSWQgPSBgJHtjb21wTWV0YS50eXBlLm1vZHVsZVVybH18JHtjb21wTWV0YS50eXBlLm5hbWV9YDtcbiAgICAgIHZhciBjb25zdHJ1Y3Rpb25LZXl3b3JkID0gSVNfREFSVCA/ICdjb25zdCcgOiAnbmV3JztcbiAgICAgIHZhciBjb21waWxlZFRlbXBsYXRlRXhwciA9XG4gICAgICAgICAgYCR7Y29uc3RydWN0aW9uS2V5d29yZH0gJHtURU1QTEFURV9DT01NQU5EU19NT0RVTEVfUkVGfUNvbXBpbGVkQ29tcG9uZW50VGVtcGxhdGUoJyR7dGVtcGxhdGVJZH0nLCR7KDxhbnlbXT50ZW1wbGF0ZUFyZ3VtZW50c1tpbmRleF0pLmpvaW4oJywnKX0pYDtcbiAgICAgIHZhciB2YXJpYWJsZVZhbHVlRXhwcjtcbiAgICAgIGlmIChjb21wTWV0YS50eXBlLmlzSG9zdCkge1xuICAgICAgICB2YXJpYWJsZVZhbHVlRXhwciA9XG4gICAgICAgICAgICBgJHtjb25zdHJ1Y3Rpb25LZXl3b3JkfSAke1RFTVBMQVRFX0NPTU1BTkRTX01PRFVMRV9SRUZ9Q29tcGlsZWRIb3N0VGVtcGxhdGUoJHtjb21waWxlZFRlbXBsYXRlRXhwcn0pYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhcmlhYmxlVmFsdWVFeHByID0gY29tcGlsZWRUZW1wbGF0ZUV4cHI7XG4gICAgICB9XG4gICAgICB2YXIgdmFyTmFtZSA9IHRlbXBsYXRlVmFyaWFibGVOYW1lKGNvbXBNZXRhLnR5cGUpO1xuICAgICAgZGVjbGFyYXRpb25zLnB1c2goYCR7Y29kZUdlbkV4cG9ydFZhcmlhYmxlKHZhck5hbWUpfSR7dmFyaWFibGVWYWx1ZUV4cHJ9O2ApO1xuICAgICAgZGVjbGFyYXRpb25zLnB1c2goYCR7Y29kZUdlblZhbHVlRm4oW10sIHZhck5hbWUsIHRlbXBsYXRlR2V0dGVyTmFtZShjb21wTWV0YS50eXBlKSl9O2ApO1xuICAgIH0pO1xuICAgIHZhciBtb2R1bGVVcmwgPSBjb21wb25lbnRzWzBdLmNvbXBvbmVudC50eXBlLm1vZHVsZVVybDtcbiAgICByZXR1cm4gbmV3IFNvdXJjZU1vZHVsZShgJHt0ZW1wbGF0ZU1vZHVsZVVybChtb2R1bGVVcmwpfWAsIGRlY2xhcmF0aW9ucy5qb2luKCdcXG4nKSk7XG4gIH1cblxuICBjb21waWxlU3R5bGVzaGVldENvZGVHZW4oc3R5bGVzaGVldFVybDogc3RyaW5nLCBjc3NUZXh0OiBzdHJpbmcpOiBTb3VyY2VNb2R1bGVbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0eWxlQ29tcGlsZXIuY29tcGlsZVN0eWxlc2hlZXRDb2RlR2VuKHN0eWxlc2hlZXRVcmwsIGNzc1RleHQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcHJvY2Vzc1RlbXBsYXRlQ29kZUdlbihjb21wTWV0YTogQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZXM6IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YVtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldERlY2xhcmF0aW9uczogc3RyaW5nW10sIHRhcmdldFRlbXBsYXRlQXJndW1lbnRzOiBhbnlbXVtdKSB7XG4gICAgbGV0IHVuaXF1ZURpcmVjdGl2ZXMgPSByZW1vdmVEdXBsaWNhdGVzKGRpcmVjdGl2ZXMpO1xuICAgIHZhciBzdHlsZUV4cHIgPSB0aGlzLl9zdHlsZUNvbXBpbGVyLmNvbXBpbGVDb21wb25lbnRDb2RlR2VuKGNvbXBNZXRhLnRlbXBsYXRlKTtcbiAgICB2YXIgcGFyc2VkVGVtcGxhdGUgPSB0aGlzLl90ZW1wbGF0ZVBhcnNlci5wYXJzZShjb21wTWV0YS50ZW1wbGF0ZS50ZW1wbGF0ZSwgdW5pcXVlRGlyZWN0aXZlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wTWV0YS50eXBlLm5hbWUpO1xuICAgIHZhciBjaGFuZ2VEZXRlY3RvcnNFeHBycyA9IHRoaXMuX2NkQ29tcGlsZXIuY29tcGlsZUNvbXBvbmVudENvZGVHZW4oXG4gICAgICAgIGNvbXBNZXRhLnR5cGUsIGNvbXBNZXRhLmNoYW5nZURldGVjdGlvbiwgcGFyc2VkVGVtcGxhdGUpO1xuICAgIHZhciBjb21tYW5kc0V4cHIgPSB0aGlzLl9jb21tYW5kQ29tcGlsZXIuY29tcGlsZUNvbXBvbmVudENvZGVHZW4oXG4gICAgICAgIGNvbXBNZXRhLCBwYXJzZWRUZW1wbGF0ZSwgY2hhbmdlRGV0ZWN0b3JzRXhwcnMuZXhwcmVzc2lvbnMsXG4gICAgICAgIGNvZGVHZW5Db21wb25lbnRUZW1wbGF0ZUZhY3RvcnkpO1xuXG4gICAgYWRkQWxsKHN0eWxlRXhwci5kZWNsYXJhdGlvbnMsIHRhcmdldERlY2xhcmF0aW9ucyk7XG4gICAgYWRkQWxsKGNoYW5nZURldGVjdG9yc0V4cHJzLmRlY2xhcmF0aW9ucywgdGFyZ2V0RGVjbGFyYXRpb25zKTtcbiAgICBhZGRBbGwoY29tbWFuZHNFeHByLmRlY2xhcmF0aW9ucywgdGFyZ2V0RGVjbGFyYXRpb25zKTtcblxuICAgIHRhcmdldFRlbXBsYXRlQXJndW1lbnRzLnB1c2goXG4gICAgICAgIFtjaGFuZ2VEZXRlY3RvcnNFeHBycy5leHByZXNzaW9uc1swXSwgY29tbWFuZHNFeHByLmV4cHJlc3Npb24sIHN0eWxlRXhwci5leHByZXNzaW9uXSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vcm1hbGl6ZWRDb21wb25lbnRXaXRoVmlld0RpcmVjdGl2ZXMge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgY29tcG9uZW50OiBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGEsXG4gICAgICAgICAgICAgIHB1YmxpYyBkaXJlY3RpdmVzOiBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGFbXSkge31cbn1cblxuZnVuY3Rpb24gYXNzZXJ0Q29tcG9uZW50KG1ldGE6IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YSkge1xuICBpZiAoIW1ldGEuaXNDb21wb25lbnQpIHtcbiAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgQ291bGQgbm90IGNvbXBpbGUgJyR7bWV0YS50eXBlLm5hbWV9JyBiZWNhdXNlIGl0IGlzIG5vdCBhIGNvbXBvbmVudC5gKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0ZW1wbGF0ZVZhcmlhYmxlTmFtZSh0eXBlOiBDb21waWxlVHlwZU1ldGFkYXRhKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke3R5cGUubmFtZX1UZW1wbGF0ZWA7XG59XG5cbmZ1bmN0aW9uIHRlbXBsYXRlR2V0dGVyTmFtZSh0eXBlOiBDb21waWxlVHlwZU1ldGFkYXRhKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke3RlbXBsYXRlVmFyaWFibGVOYW1lKHR5cGUpfUdldHRlcmA7XG59XG5cbmZ1bmN0aW9uIHRlbXBsYXRlTW9kdWxlVXJsKG1vZHVsZVVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgdmFyIHVybFdpdGhvdXRTdWZmaXggPSBtb2R1bGVVcmwuc3Vic3RyaW5nKDAsIG1vZHVsZVVybC5sZW5ndGggLSBNT0RVTEVfU1VGRklYLmxlbmd0aCk7XG4gIHJldHVybiBgJHt1cmxXaXRob3V0U3VmZml4fS50ZW1wbGF0ZSR7TU9EVUxFX1NVRkZJWH1gO1xufVxuXG5mdW5jdGlvbiBhZGRBbGwoc291cmNlOiBhbnlbXSwgdGFyZ2V0OiBhbnlbXSkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7IGkrKykge1xuICAgIHRhcmdldC5wdXNoKHNvdXJjZVtpXSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29kZUdlbkNvbXBvbmVudFRlbXBsYXRlRmFjdG9yeShuZXN0ZWRDb21wVHlwZTogQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke21vZHVsZVJlZih0ZW1wbGF0ZU1vZHVsZVVybChuZXN0ZWRDb21wVHlwZS50eXBlLm1vZHVsZVVybCkpfSR7dGVtcGxhdGVHZXR0ZXJOYW1lKG5lc3RlZENvbXBUeXBlLnR5cGUpfWA7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUR1cGxpY2F0ZXMoaXRlbXM6IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YVtdKTogQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhW10ge1xuICBsZXQgcmVzID0gW107XG4gIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgbGV0IGhhc01hdGNoID1cbiAgICAgICAgcmVzLmZpbHRlcihyID0+IHIudHlwZS5uYW1lID09IGl0ZW0udHlwZS5uYW1lICYmIHIudHlwZS5tb2R1bGVVcmwgPT0gaXRlbS50eXBlLm1vZHVsZVVybCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgci50eXBlLnJ1bnRpbWUgPT0gaXRlbS50eXBlLnJ1bnRpbWUpXG4gICAgICAgICAgICAubGVuZ3RoID4gMDtcbiAgICBpZiAoIWhhc01hdGNoKSB7XG4gICAgICByZXMucHVzaChpdGVtKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3RlbXBsYXRlX2NvbXBpbGVyLnRzXG4gKiovIiwiaW1wb3J0IHtcbiAgaXNQcmVzZW50LFxuICBpc0JsYW5rLFxuICBub3JtYWxpemVCb29sLFxuICBzZXJpYWxpemVFbnVtLFxuICBUeXBlLFxuICBSZWdFeHBXcmFwcGVyLFxuICBTdHJpbmdXcmFwcGVyXG59IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge1N0cmluZ01hcFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ0hBTkdFX0RFVEVDVElPTl9TVFJBVEVHWV9WQUxVRVNcbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9jaGFuZ2VfZGV0ZWN0aW9uJztcbmltcG9ydCB7Vmlld0VuY2Fwc3VsYXRpb24sIFZJRVdfRU5DQVBTVUxBVElPTl9WQUxVRVN9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL21ldGFkYXRhL3ZpZXcnO1xuaW1wb3J0IHtDc3NTZWxlY3Rvcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3NlbGVjdG9yJztcbmltcG9ydCB7c3BsaXRBdENvbG9ufSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IHtMaWZlY3ljbGVIb29rcywgTElGRUNZQ0xFX0hPT0tTX1ZBTFVFU30gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL2ludGVyZmFjZXMnO1xuXG4vLyBncm91cCAxOiBcInByb3BlcnR5XCIgZnJvbSBcIltwcm9wZXJ0eV1cIlxuLy8gZ3JvdXAgMjogXCJldmVudFwiIGZyb20gXCIoZXZlbnQpXCJcbnZhciBIT1NUX1JFR19FWFAgPSAvXig/Oig/OlxcWyhbXlxcXV0rKVxcXSl8KD86XFwoKFteXFwpXSspXFwpKSkkL2c7XG5cbi8qKlxuICogTWV0YWRhdGEgcmVnYXJkaW5nIGNvbXBpbGF0aW9uIG9mIGEgdHlwZS5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbXBpbGVUeXBlTWV0YWRhdGEge1xuICBydW50aW1lOiBUeXBlO1xuICBuYW1lOiBzdHJpbmc7XG4gIG1vZHVsZVVybDogc3RyaW5nO1xuICBpc0hvc3Q6IGJvb2xlYW47XG4gIGNvbnN0cnVjdG9yKHtydW50aW1lLCBuYW1lLCBtb2R1bGVVcmwsIGlzSG9zdH06XG4gICAgICAgICAgICAgICAgICB7cnVudGltZT86IFR5cGUsIG5hbWU/OiBzdHJpbmcsIG1vZHVsZVVybD86IHN0cmluZywgaXNIb3N0PzogYm9vbGVhbn0gPSB7fSkge1xuICAgIHRoaXMucnVudGltZSA9IHJ1bnRpbWU7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLm1vZHVsZVVybCA9IG1vZHVsZVVybDtcbiAgICB0aGlzLmlzSG9zdCA9IG5vcm1hbGl6ZUJvb2woaXNIb3N0KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tSnNvbihkYXRhOiB7W2tleTogc3RyaW5nXTogYW55fSk6IENvbXBpbGVUeXBlTWV0YWRhdGEge1xuICAgIHJldHVybiBuZXcgQ29tcGlsZVR5cGVNZXRhZGF0YShcbiAgICAgICAge25hbWU6IGRhdGFbJ25hbWUnXSwgbW9kdWxlVXJsOiBkYXRhWydtb2R1bGVVcmwnXSwgaXNIb3N0OiBkYXRhWydpc0hvc3QnXX0pO1xuICB9XG5cbiAgdG9Kc29uKCk6IHtba2V5OiBzdHJpbmddOiBhbnl9IHtcbiAgICByZXR1cm4ge1xuICAgICAgLy8gTm90ZTogUnVudGltZSB0eXBlIGNhbid0IGJlIHNlcmlhbGl6ZWQuLi5cbiAgICAgICduYW1lJzogdGhpcy5uYW1lLFxuICAgICAgJ21vZHVsZVVybCc6IHRoaXMubW9kdWxlVXJsLFxuICAgICAgJ2lzSG9zdCc6IHRoaXMuaXNIb3N0XG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIE1ldGFkYXRhIHJlZ2FyZGluZyBjb21waWxhdGlvbiBvZiBhIHRlbXBsYXRlLlxuICovXG5leHBvcnQgY2xhc3MgQ29tcGlsZVRlbXBsYXRlTWV0YWRhdGEge1xuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbjtcbiAgdGVtcGxhdGU6IHN0cmluZztcbiAgdGVtcGxhdGVVcmw6IHN0cmluZztcbiAgc3R5bGVzOiBzdHJpbmdbXTtcbiAgc3R5bGVVcmxzOiBzdHJpbmdbXTtcbiAgbmdDb250ZW50U2VsZWN0b3JzOiBzdHJpbmdbXTtcbiAgY29uc3RydWN0b3Ioe2VuY2Fwc3VsYXRpb24sIHRlbXBsYXRlLCB0ZW1wbGF0ZVVybCwgc3R5bGVzLCBzdHlsZVVybHMsIG5nQ29udGVudFNlbGVjdG9yc306IHtcbiAgICBlbmNhcHN1bGF0aW9uPzogVmlld0VuY2Fwc3VsYXRpb24sXG4gICAgdGVtcGxhdGU/OiBzdHJpbmcsXG4gICAgdGVtcGxhdGVVcmw/OiBzdHJpbmcsXG4gICAgc3R5bGVzPzogc3RyaW5nW10sXG4gICAgc3R5bGVVcmxzPzogc3RyaW5nW10sXG4gICAgbmdDb250ZW50U2VsZWN0b3JzPzogc3RyaW5nW11cbiAgfSA9IHt9KSB7XG4gICAgdGhpcy5lbmNhcHN1bGF0aW9uID0gaXNQcmVzZW50KGVuY2Fwc3VsYXRpb24pID8gZW5jYXBzdWxhdGlvbiA6IFZpZXdFbmNhcHN1bGF0aW9uLkVtdWxhdGVkO1xuICAgIHRoaXMudGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICB0aGlzLnRlbXBsYXRlVXJsID0gdGVtcGxhdGVVcmw7XG4gICAgdGhpcy5zdHlsZXMgPSBpc1ByZXNlbnQoc3R5bGVzKSA/IHN0eWxlcyA6IFtdO1xuICAgIHRoaXMuc3R5bGVVcmxzID0gaXNQcmVzZW50KHN0eWxlVXJscykgPyBzdHlsZVVybHMgOiBbXTtcbiAgICB0aGlzLm5nQ29udGVudFNlbGVjdG9ycyA9IGlzUHJlc2VudChuZ0NvbnRlbnRTZWxlY3RvcnMpID8gbmdDb250ZW50U2VsZWN0b3JzIDogW107XG4gIH1cblxuICBzdGF0aWMgZnJvbUpzb24oZGF0YToge1trZXk6IHN0cmluZ106IGFueX0pOiBDb21waWxlVGVtcGxhdGVNZXRhZGF0YSB7XG4gICAgcmV0dXJuIG5ldyBDb21waWxlVGVtcGxhdGVNZXRhZGF0YSh7XG4gICAgICBlbmNhcHN1bGF0aW9uOiBpc1ByZXNlbnQoZGF0YVsnZW5jYXBzdWxhdGlvbiddKSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgVklFV19FTkNBUFNVTEFUSU9OX1ZBTFVFU1tkYXRhWydlbmNhcHN1bGF0aW9uJ11dIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhWydlbmNhcHN1bGF0aW9uJ10sXG4gICAgICB0ZW1wbGF0ZTogZGF0YVsndGVtcGxhdGUnXSxcbiAgICAgIHRlbXBsYXRlVXJsOiBkYXRhWyd0ZW1wbGF0ZVVybCddLFxuICAgICAgc3R5bGVzOiBkYXRhWydzdHlsZXMnXSxcbiAgICAgIHN0eWxlVXJsczogZGF0YVsnc3R5bGVVcmxzJ10sXG4gICAgICBuZ0NvbnRlbnRTZWxlY3RvcnM6IGRhdGFbJ25nQ29udGVudFNlbGVjdG9ycyddXG4gICAgfSk7XG4gIH1cblxuICB0b0pzb24oKToge1trZXk6IHN0cmluZ106IGFueX0ge1xuICAgIHJldHVybiB7XG4gICAgICAnZW5jYXBzdWxhdGlvbic6XG4gICAgICAgICAgaXNQcmVzZW50KHRoaXMuZW5jYXBzdWxhdGlvbikgPyBzZXJpYWxpemVFbnVtKHRoaXMuZW5jYXBzdWxhdGlvbikgOiB0aGlzLmVuY2Fwc3VsYXRpb24sXG4gICAgICAndGVtcGxhdGUnOiB0aGlzLnRlbXBsYXRlLFxuICAgICAgJ3RlbXBsYXRlVXJsJzogdGhpcy50ZW1wbGF0ZVVybCxcbiAgICAgICdzdHlsZXMnOiB0aGlzLnN0eWxlcyxcbiAgICAgICdzdHlsZVVybHMnOiB0aGlzLnN0eWxlVXJscyxcbiAgICAgICduZ0NvbnRlbnRTZWxlY3RvcnMnOiB0aGlzLm5nQ29udGVudFNlbGVjdG9yc1xuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBNZXRhZGF0YSByZWdhcmRpbmcgY29tcGlsYXRpb24gb2YgYSBkaXJlY3RpdmUuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGEge1xuICBzdGF0aWMgY3JlYXRlKHt0eXBlLCBpc0NvbXBvbmVudCwgZHluYW1pY0xvYWRhYmxlLCBzZWxlY3RvciwgZXhwb3J0QXMsIGNoYW5nZURldGVjdGlvbiwgaW5wdXRzLFxuICAgICAgICAgICAgICAgICBvdXRwdXRzLCBob3N0LCBsaWZlY3ljbGVIb29rcywgdGVtcGxhdGV9OiB7XG4gICAgdHlwZT86IENvbXBpbGVUeXBlTWV0YWRhdGEsXG4gICAgaXNDb21wb25lbnQ/OiBib29sZWFuLFxuICAgIGR5bmFtaWNMb2FkYWJsZT86IGJvb2xlYW4sXG4gICAgc2VsZWN0b3I/OiBzdHJpbmcsXG4gICAgZXhwb3J0QXM/OiBzdHJpbmcsXG4gICAgY2hhbmdlRGV0ZWN0aW9uPzogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgaW5wdXRzPzogc3RyaW5nW10sXG4gICAgb3V0cHV0cz86IHN0cmluZ1tdLFxuICAgIGhvc3Q/OiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSxcbiAgICBsaWZlY3ljbGVIb29rcz86IExpZmVjeWNsZUhvb2tzW10sXG4gICAgdGVtcGxhdGU/OiBDb21waWxlVGVtcGxhdGVNZXRhZGF0YVxuICB9ID0ge30pOiBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGEge1xuICAgIHZhciBob3N0TGlzdGVuZXJzOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSA9IHt9O1xuICAgIHZhciBob3N0UHJvcGVydGllczoge1trZXk6IHN0cmluZ106IHN0cmluZ30gPSB7fTtcbiAgICB2YXIgaG9zdEF0dHJpYnV0ZXM6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9ID0ge307XG4gICAgaWYgKGlzUHJlc2VudChob3N0KSkge1xuICAgICAgU3RyaW5nTWFwV3JhcHBlci5mb3JFYWNoKGhvc3QsICh2YWx1ZTogc3RyaW5nLCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICB2YXIgbWF0Y2hlcyA9IFJlZ0V4cFdyYXBwZXIuZmlyc3RNYXRjaChIT1NUX1JFR19FWFAsIGtleSk7XG4gICAgICAgIGlmIChpc0JsYW5rKG1hdGNoZXMpKSB7XG4gICAgICAgICAgaG9zdEF0dHJpYnV0ZXNba2V5XSA9IHZhbHVlO1xuICAgICAgICB9IGVsc2UgaWYgKGlzUHJlc2VudChtYXRjaGVzWzFdKSkge1xuICAgICAgICAgIGhvc3RQcm9wZXJ0aWVzW21hdGNoZXNbMV1dID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNQcmVzZW50KG1hdGNoZXNbMl0pKSB7XG4gICAgICAgICAgaG9zdExpc3RlbmVyc1ttYXRjaGVzWzJdXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgdmFyIGlucHV0c01hcDoge1trZXk6IHN0cmluZ106IHN0cmluZ30gPSB7fTtcbiAgICBpZiAoaXNQcmVzZW50KGlucHV0cykpIHtcbiAgICAgIGlucHV0cy5mb3JFYWNoKChiaW5kQ29uZmlnOiBzdHJpbmcpID0+IHtcbiAgICAgICAgLy8gY2Fub25pY2FsIHN5bnRheDogYGRpclByb3A6IGVsUHJvcGBcbiAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gYDpgLCB1c2UgZGlyUHJvcCA9IGVsUHJvcFxuICAgICAgICB2YXIgcGFydHMgPSBzcGxpdEF0Q29sb24oYmluZENvbmZpZywgW2JpbmRDb25maWcsIGJpbmRDb25maWddKTtcbiAgICAgICAgaW5wdXRzTWFwW3BhcnRzWzBdXSA9IHBhcnRzWzFdO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHZhciBvdXRwdXRzTWFwOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSA9IHt9O1xuICAgIGlmIChpc1ByZXNlbnQob3V0cHV0cykpIHtcbiAgICAgIG91dHB1dHMuZm9yRWFjaCgoYmluZENvbmZpZzogc3RyaW5nKSA9PiB7XG4gICAgICAgIC8vIGNhbm9uaWNhbCBzeW50YXg6IGBkaXJQcm9wOiBlbFByb3BgXG4gICAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIGA6YCwgdXNlIGRpclByb3AgPSBlbFByb3BcbiAgICAgICAgdmFyIHBhcnRzID0gc3BsaXRBdENvbG9uKGJpbmRDb25maWcsIFtiaW5kQ29uZmlnLCBiaW5kQ29uZmlnXSk7XG4gICAgICAgIG91dHB1dHNNYXBbcGFydHNbMF1dID0gcGFydHNbMV07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YSh7XG4gICAgICB0eXBlOiB0eXBlLFxuICAgICAgaXNDb21wb25lbnQ6IG5vcm1hbGl6ZUJvb2woaXNDb21wb25lbnQpLFxuICAgICAgZHluYW1pY0xvYWRhYmxlOiBub3JtYWxpemVCb29sKGR5bmFtaWNMb2FkYWJsZSksXG4gICAgICBzZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgICBleHBvcnRBczogZXhwb3J0QXMsXG4gICAgICBjaGFuZ2VEZXRlY3Rpb246IGNoYW5nZURldGVjdGlvbixcbiAgICAgIGlucHV0czogaW5wdXRzTWFwLFxuICAgICAgb3V0cHV0czogb3V0cHV0c01hcCxcbiAgICAgIGhvc3RMaXN0ZW5lcnM6IGhvc3RMaXN0ZW5lcnMsXG4gICAgICBob3N0UHJvcGVydGllczogaG9zdFByb3BlcnRpZXMsXG4gICAgICBob3N0QXR0cmlidXRlczogaG9zdEF0dHJpYnV0ZXMsXG4gICAgICBsaWZlY3ljbGVIb29rczogaXNQcmVzZW50KGxpZmVjeWNsZUhvb2tzKSA/IGxpZmVjeWNsZUhvb2tzIDogW10sXG4gICAgICB0ZW1wbGF0ZTogdGVtcGxhdGVcbiAgICB9KTtcbiAgfVxuXG4gIHR5cGU6IENvbXBpbGVUeXBlTWV0YWRhdGE7XG4gIGlzQ29tcG9uZW50OiBib29sZWFuO1xuICBkeW5hbWljTG9hZGFibGU6IGJvb2xlYW47XG4gIHNlbGVjdG9yOiBzdHJpbmc7XG4gIGV4cG9ydEFzOiBzdHJpbmc7XG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3k7XG4gIGlucHV0czoge1trZXk6IHN0cmluZ106IHN0cmluZ307XG4gIG91dHB1dHM6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9O1xuICBob3N0TGlzdGVuZXJzOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfTtcbiAgaG9zdFByb3BlcnRpZXM6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9O1xuICBob3N0QXR0cmlidXRlczoge1trZXk6IHN0cmluZ106IHN0cmluZ307XG4gIGxpZmVjeWNsZUhvb2tzOiBMaWZlY3ljbGVIb29rc1tdO1xuICB0ZW1wbGF0ZTogQ29tcGlsZVRlbXBsYXRlTWV0YWRhdGE7XG4gIGNvbnN0cnVjdG9yKHt0eXBlLCBpc0NvbXBvbmVudCwgZHluYW1pY0xvYWRhYmxlLCBzZWxlY3RvciwgZXhwb3J0QXMsIGNoYW5nZURldGVjdGlvbiwgaW5wdXRzLFxuICAgICAgICAgICAgICAgb3V0cHV0cywgaG9zdExpc3RlbmVycywgaG9zdFByb3BlcnRpZXMsIGhvc3RBdHRyaWJ1dGVzLCBsaWZlY3ljbGVIb29rcywgdGVtcGxhdGV9OiB7XG4gICAgdHlwZT86IENvbXBpbGVUeXBlTWV0YWRhdGEsXG4gICAgaXNDb21wb25lbnQ/OiBib29sZWFuLFxuICAgIGR5bmFtaWNMb2FkYWJsZT86IGJvb2xlYW4sXG4gICAgc2VsZWN0b3I/OiBzdHJpbmcsXG4gICAgZXhwb3J0QXM/OiBzdHJpbmcsXG4gICAgY2hhbmdlRGV0ZWN0aW9uPzogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgaW5wdXRzPzoge1trZXk6IHN0cmluZ106IHN0cmluZ30sXG4gICAgb3V0cHV0cz86IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9LFxuICAgIGhvc3RMaXN0ZW5lcnM/OiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSxcbiAgICBob3N0UHJvcGVydGllcz86IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9LFxuICAgIGhvc3RBdHRyaWJ1dGVzPzoge1trZXk6IHN0cmluZ106IHN0cmluZ30sXG4gICAgbGlmZWN5Y2xlSG9va3M/OiBMaWZlY3ljbGVIb29rc1tdLFxuICAgIHRlbXBsYXRlPzogQ29tcGlsZVRlbXBsYXRlTWV0YWRhdGFcbiAgfSA9IHt9KSB7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLmlzQ29tcG9uZW50ID0gaXNDb21wb25lbnQ7XG4gICAgdGhpcy5keW5hbWljTG9hZGFibGUgPSBkeW5hbWljTG9hZGFibGU7XG4gICAgdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yO1xuICAgIHRoaXMuZXhwb3J0QXMgPSBleHBvcnRBcztcbiAgICB0aGlzLmNoYW5nZURldGVjdGlvbiA9IGNoYW5nZURldGVjdGlvbjtcbiAgICB0aGlzLmlucHV0cyA9IGlucHV0cztcbiAgICB0aGlzLm91dHB1dHMgPSBvdXRwdXRzO1xuICAgIHRoaXMuaG9zdExpc3RlbmVycyA9IGhvc3RMaXN0ZW5lcnM7XG4gICAgdGhpcy5ob3N0UHJvcGVydGllcyA9IGhvc3RQcm9wZXJ0aWVzO1xuICAgIHRoaXMuaG9zdEF0dHJpYnV0ZXMgPSBob3N0QXR0cmlidXRlcztcbiAgICB0aGlzLmxpZmVjeWNsZUhvb2tzID0gbGlmZWN5Y2xlSG9va3M7XG4gICAgdGhpcy50ZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICB9XG5cbiAgc3RhdGljIGZyb21Kc29uKGRhdGE6IHtba2V5OiBzdHJpbmddOiBhbnl9KTogQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhIHtcbiAgICByZXR1cm4gbmV3IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YSh7XG4gICAgICBpc0NvbXBvbmVudDogZGF0YVsnaXNDb21wb25lbnQnXSxcbiAgICAgIGR5bmFtaWNMb2FkYWJsZTogZGF0YVsnZHluYW1pY0xvYWRhYmxlJ10sXG4gICAgICBzZWxlY3RvcjogZGF0YVsnc2VsZWN0b3InXSxcbiAgICAgIGV4cG9ydEFzOiBkYXRhWydleHBvcnRBcyddLFxuICAgICAgdHlwZTogaXNQcmVzZW50KGRhdGFbJ3R5cGUnXSkgPyBDb21waWxlVHlwZU1ldGFkYXRhLmZyb21Kc29uKGRhdGFbJ3R5cGUnXSkgOiBkYXRhWyd0eXBlJ10sXG4gICAgICBjaGFuZ2VEZXRlY3Rpb246IGlzUHJlc2VudChkYXRhWydjaGFuZ2VEZXRlY3Rpb24nXSkgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTkdFX0RFVEVDVElPTl9TVFJBVEVHWV9WQUxVRVNbZGF0YVsnY2hhbmdlRGV0ZWN0aW9uJ11dIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbJ2NoYW5nZURldGVjdGlvbiddLFxuICAgICAgaW5wdXRzOiBkYXRhWydpbnB1dHMnXSxcbiAgICAgIG91dHB1dHM6IGRhdGFbJ291dHB1dHMnXSxcbiAgICAgIGhvc3RMaXN0ZW5lcnM6IGRhdGFbJ2hvc3RMaXN0ZW5lcnMnXSxcbiAgICAgIGhvc3RQcm9wZXJ0aWVzOiBkYXRhWydob3N0UHJvcGVydGllcyddLFxuICAgICAgaG9zdEF0dHJpYnV0ZXM6IGRhdGFbJ2hvc3RBdHRyaWJ1dGVzJ10sXG4gICAgICBsaWZlY3ljbGVIb29rczpcbiAgICAgICAgICAoPGFueVtdPmRhdGFbJ2xpZmVjeWNsZUhvb2tzJ10pLm1hcChob29rVmFsdWUgPT4gTElGRUNZQ0xFX0hPT0tTX1ZBTFVFU1tob29rVmFsdWVdKSxcbiAgICAgIHRlbXBsYXRlOiBpc1ByZXNlbnQoZGF0YVsndGVtcGxhdGUnXSkgPyBDb21waWxlVGVtcGxhdGVNZXRhZGF0YS5mcm9tSnNvbihkYXRhWyd0ZW1wbGF0ZSddKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVsndGVtcGxhdGUnXVxuICAgIH0pO1xuICB9XG5cbiAgdG9Kc29uKCk6IHtba2V5OiBzdHJpbmddOiBhbnl9IHtcbiAgICByZXR1cm4ge1xuICAgICAgJ2lzQ29tcG9uZW50JzogdGhpcy5pc0NvbXBvbmVudCxcbiAgICAgICdkeW5hbWljTG9hZGFibGUnOiB0aGlzLmR5bmFtaWNMb2FkYWJsZSxcbiAgICAgICdzZWxlY3Rvcic6IHRoaXMuc2VsZWN0b3IsXG4gICAgICAnZXhwb3J0QXMnOiB0aGlzLmV4cG9ydEFzLFxuICAgICAgJ3R5cGUnOiBpc1ByZXNlbnQodGhpcy50eXBlKSA/IHRoaXMudHlwZS50b0pzb24oKSA6IHRoaXMudHlwZSxcbiAgICAgICdjaGFuZ2VEZXRlY3Rpb24nOiBpc1ByZXNlbnQodGhpcy5jaGFuZ2VEZXRlY3Rpb24pID8gc2VyaWFsaXplRW51bSh0aGlzLmNoYW5nZURldGVjdGlvbikgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdGlvbixcbiAgICAgICdpbnB1dHMnOiB0aGlzLmlucHV0cyxcbiAgICAgICdvdXRwdXRzJzogdGhpcy5vdXRwdXRzLFxuICAgICAgJ2hvc3RMaXN0ZW5lcnMnOiB0aGlzLmhvc3RMaXN0ZW5lcnMsXG4gICAgICAnaG9zdFByb3BlcnRpZXMnOiB0aGlzLmhvc3RQcm9wZXJ0aWVzLFxuICAgICAgJ2hvc3RBdHRyaWJ1dGVzJzogdGhpcy5ob3N0QXR0cmlidXRlcyxcbiAgICAgICdsaWZlY3ljbGVIb29rcyc6IHRoaXMubGlmZWN5Y2xlSG9va3MubWFwKGhvb2sgPT4gc2VyaWFsaXplRW51bShob29rKSksXG4gICAgICAndGVtcGxhdGUnOiBpc1ByZXNlbnQodGhpcy50ZW1wbGF0ZSkgPyB0aGlzLnRlbXBsYXRlLnRvSnNvbigpIDogdGhpcy50ZW1wbGF0ZVxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3Qge0BsaW5rIENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YX0gZnJvbSB7QGxpbmsgQ29tcG9uZW50VHlwZU1ldGFkYXRhfSBhbmQgYSBzZWxlY3Rvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhvc3RDb21wb25lbnRNZXRhKGNvbXBvbmVudFR5cGU6IENvbXBpbGVUeXBlTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50U2VsZWN0b3I6IHN0cmluZyk6IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YSB7XG4gIHZhciB0ZW1wbGF0ZSA9IENzc1NlbGVjdG9yLnBhcnNlKGNvbXBvbmVudFNlbGVjdG9yKVswXS5nZXRNYXRjaGluZ0VsZW1lbnRUZW1wbGF0ZSgpO1xuICByZXR1cm4gQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhLmNyZWF0ZSh7XG4gICAgdHlwZTogbmV3IENvbXBpbGVUeXBlTWV0YWRhdGEoe1xuICAgICAgcnVudGltZTogT2JqZWN0LFxuICAgICAgbmFtZTogYEhvc3Qke2NvbXBvbmVudFR5cGUubmFtZX1gLFxuICAgICAgbW9kdWxlVXJsOiBjb21wb25lbnRUeXBlLm1vZHVsZVVybCxcbiAgICAgIGlzSG9zdDogdHJ1ZVxuICAgIH0pLFxuICAgIHRlbXBsYXRlOiBuZXcgQ29tcGlsZVRlbXBsYXRlTWV0YWRhdGEoXG4gICAgICAgIHt0ZW1wbGF0ZTogdGVtcGxhdGUsIHRlbXBsYXRlVXJsOiAnJywgc3R5bGVzOiBbXSwgc3R5bGVVcmxzOiBbXSwgbmdDb250ZW50U2VsZWN0b3JzOiBbXX0pLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuRGVmYXVsdCxcbiAgICBpbnB1dHM6IFtdLFxuICAgIG91dHB1dHM6IFtdLFxuICAgIGhvc3Q6IHt9LFxuICAgIGxpZmVjeWNsZUhvb2tzOiBbXSxcbiAgICBpc0NvbXBvbmVudDogdHJ1ZSxcbiAgICBkeW5hbWljTG9hZGFibGU6IGZhbHNlLFxuICAgIHNlbGVjdG9yOiAnKidcbiAgfSk7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tcGlsZXIvZGlyZWN0aXZlX21ldGFkYXRhLnRzXG4gKiovIiwiaW1wb3J0IHtNYXAsIExpc3RXcmFwcGVyLCBNYXBXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtcbiAgaXNQcmVzZW50LFxuICBpc0JsYW5rLFxuICBSZWdFeHBXcmFwcGVyLFxuICBSZWdFeHBNYXRjaGVyV3JhcHBlcixcbiAgU3RyaW5nV3JhcHBlclxufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9uLCBXcmFwcGVkRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuXG5jb25zdCBfRU1QVFlfQVRUUl9WQUxVRSA9ICcnO1xuXG4vLyBUT0RPOiBDYW4ndCB1c2UgYGNvbnN0YCBoZXJlIGFzXG4vLyBpbiBEYXJ0IHRoaXMgaXMgbm90IHRyYW5zcGlsZWQgaW50byBgZmluYWxgIHlldC4uLlxudmFyIF9TRUxFQ1RPUl9SRUdFWFAgPSBSZWdFeHBXcmFwcGVyLmNyZWF0ZShcbiAgICAnKFxcXFw6bm90XFxcXCgpfCcgKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cIjpub3QoXCJcbiAgICAnKFstXFxcXHddKyl8JyArICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFwidGFnXCJcbiAgICAnKD86XFxcXC4oWy1cXFxcd10rKSl8JyArICAgICAgICAgICAgICAgICAgICAgLy8gXCIuY2xhc3NcIlxuICAgICcoPzpcXFxcWyhbLVxcXFx3Kl0rKSg/Oj0oW15cXFxcXV0qKSk/XFxcXF0pfCcgKyAgLy8gXCJbbmFtZV1cIiwgXCJbbmFtZT12YWx1ZV1cIiBvciBcIltuYW1lKj12YWx1ZV1cIlxuICAgICcoXFxcXCkpfCcgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gXCIpXCJcbiAgICAnKFxcXFxzKixcXFxccyopJyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gXCIsXCJcblxuLyoqXG4gKiBBIGNzcyBzZWxlY3RvciBjb250YWlucyBhbiBlbGVtZW50IG5hbWUsXG4gKiBjc3MgY2xhc3NlcyBhbmQgYXR0cmlidXRlL3ZhbHVlIHBhaXJzIHdpdGggdGhlIHB1cnBvc2VcbiAqIG9mIHNlbGVjdGluZyBzdWJzZXRzIG91dCBvZiB0aGVtLlxuICovXG5leHBvcnQgY2xhc3MgQ3NzU2VsZWN0b3Ige1xuICBlbGVtZW50OiBzdHJpbmcgPSBudWxsO1xuICBjbGFzc05hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICBhdHRyczogc3RyaW5nW10gPSBbXTtcbiAgbm90U2VsZWN0b3JzOiBDc3NTZWxlY3RvcltdID0gW107XG5cbiAgc3RhdGljIHBhcnNlKHNlbGVjdG9yOiBzdHJpbmcpOiBDc3NTZWxlY3RvcltdIHtcbiAgICB2YXIgcmVzdWx0czogQ3NzU2VsZWN0b3JbXSA9IFtdO1xuICAgIHZhciBfYWRkUmVzdWx0ID0gKHJlczogQ3NzU2VsZWN0b3JbXSwgY3NzU2VsKSA9PiB7XG4gICAgICBpZiAoY3NzU2VsLm5vdFNlbGVjdG9ycy5sZW5ndGggPiAwICYmIGlzQmxhbmsoY3NzU2VsLmVsZW1lbnQpICYmXG4gICAgICAgICAgTGlzdFdyYXBwZXIuaXNFbXB0eShjc3NTZWwuY2xhc3NOYW1lcykgJiYgTGlzdFdyYXBwZXIuaXNFbXB0eShjc3NTZWwuYXR0cnMpKSB7XG4gICAgICAgIGNzc1NlbC5lbGVtZW50ID0gXCIqXCI7XG4gICAgICB9XG4gICAgICByZXMucHVzaChjc3NTZWwpO1xuICAgIH07XG4gICAgdmFyIGNzc1NlbGVjdG9yID0gbmV3IENzc1NlbGVjdG9yKCk7XG4gICAgdmFyIG1hdGNoZXIgPSBSZWdFeHBXcmFwcGVyLm1hdGNoZXIoX1NFTEVDVE9SX1JFR0VYUCwgc2VsZWN0b3IpO1xuICAgIHZhciBtYXRjaDtcbiAgICB2YXIgY3VycmVudCA9IGNzc1NlbGVjdG9yO1xuICAgIHZhciBpbk5vdCA9IGZhbHNlO1xuICAgIHdoaWxlIChpc1ByZXNlbnQobWF0Y2ggPSBSZWdFeHBNYXRjaGVyV3JhcHBlci5uZXh0KG1hdGNoZXIpKSkge1xuICAgICAgaWYgKGlzUHJlc2VudChtYXRjaFsxXSkpIHtcbiAgICAgICAgaWYgKGluTm90KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ05lc3RpbmcgOm5vdCBpcyBub3QgYWxsb3dlZCBpbiBhIHNlbGVjdG9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgaW5Ob3QgPSB0cnVlO1xuICAgICAgICBjdXJyZW50ID0gbmV3IENzc1NlbGVjdG9yKCk7XG4gICAgICAgIGNzc1NlbGVjdG9yLm5vdFNlbGVjdG9ycy5wdXNoKGN1cnJlbnQpO1xuICAgICAgfVxuICAgICAgaWYgKGlzUHJlc2VudChtYXRjaFsyXSkpIHtcbiAgICAgICAgY3VycmVudC5zZXRFbGVtZW50KG1hdGNoWzJdKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1ByZXNlbnQobWF0Y2hbM10pKSB7XG4gICAgICAgIGN1cnJlbnQuYWRkQ2xhc3NOYW1lKG1hdGNoWzNdKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1ByZXNlbnQobWF0Y2hbNF0pKSB7XG4gICAgICAgIGN1cnJlbnQuYWRkQXR0cmlidXRlKG1hdGNoWzRdLCBtYXRjaFs1XSk7XG4gICAgICB9XG4gICAgICBpZiAoaXNQcmVzZW50KG1hdGNoWzZdKSkge1xuICAgICAgICBpbk5vdCA9IGZhbHNlO1xuICAgICAgICBjdXJyZW50ID0gY3NzU2VsZWN0b3I7XG4gICAgICB9XG4gICAgICBpZiAoaXNQcmVzZW50KG1hdGNoWzddKSkge1xuICAgICAgICBpZiAoaW5Ob3QpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignTXVsdGlwbGUgc2VsZWN0b3JzIGluIDpub3QgYXJlIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBfYWRkUmVzdWx0KHJlc3VsdHMsIGNzc1NlbGVjdG9yKTtcbiAgICAgICAgY3NzU2VsZWN0b3IgPSBjdXJyZW50ID0gbmV3IENzc1NlbGVjdG9yKCk7XG4gICAgICB9XG4gICAgfVxuICAgIF9hZGRSZXN1bHQocmVzdWx0cywgY3NzU2VsZWN0b3IpO1xuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgaXNFbGVtZW50U2VsZWN0b3IoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzUHJlc2VudCh0aGlzLmVsZW1lbnQpICYmIExpc3RXcmFwcGVyLmlzRW1wdHkodGhpcy5jbGFzc05hbWVzKSAmJlxuICAgICAgICAgICBMaXN0V3JhcHBlci5pc0VtcHR5KHRoaXMuYXR0cnMpICYmIHRoaXMubm90U2VsZWN0b3JzLmxlbmd0aCA9PT0gMDtcbiAgfVxuXG4gIHNldEVsZW1lbnQoZWxlbWVudDogc3RyaW5nID0gbnVsbCkgeyB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OyB9XG5cbiAgLyoqIEdldHMgYSB0ZW1wbGF0ZSBzdHJpbmcgZm9yIGFuIGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3Rvci4gKi9cbiAgZ2V0TWF0Y2hpbmdFbGVtZW50VGVtcGxhdGUoKTogc3RyaW5nIHtcbiAgICBsZXQgdGFnTmFtZSA9IGlzUHJlc2VudCh0aGlzLmVsZW1lbnQpID8gdGhpcy5lbGVtZW50IDogJ2Rpdic7XG4gICAgbGV0IGNsYXNzQXR0ciA9IHRoaXMuY2xhc3NOYW1lcy5sZW5ndGggPiAwID8gYCBjbGFzcz1cIiR7dGhpcy5jbGFzc05hbWVzLmpvaW4oJyAnKX1cImAgOiAnJztcblxuICAgIGxldCBhdHRycyA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5hdHRycy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgbGV0IGF0dHJOYW1lID0gdGhpcy5hdHRyc1tpXTtcbiAgICAgIGxldCBhdHRyVmFsdWUgPSB0aGlzLmF0dHJzW2kgKyAxXSAhPT0gJycgPyBgPVwiJHt0aGlzLmF0dHJzW2kgKyAxXX1cImAgOiAnJztcbiAgICAgIGF0dHJzICs9IGAgJHthdHRyTmFtZX0ke2F0dHJWYWx1ZX1gO1xuICAgIH1cblxuICAgIHJldHVybiBgPCR7dGFnTmFtZX0ke2NsYXNzQXR0cn0ke2F0dHJzfT48LyR7dGFnTmFtZX0+YDtcbiAgfVxuXG4gIGFkZEF0dHJpYnV0ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgPSBfRU1QVFlfQVRUUl9WQUxVRSkge1xuICAgIHRoaXMuYXR0cnMucHVzaChuYW1lKTtcbiAgICBpZiAoaXNQcmVzZW50KHZhbHVlKSkge1xuICAgICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9IF9FTVBUWV9BVFRSX1ZBTFVFO1xuICAgIH1cbiAgICB0aGlzLmF0dHJzLnB1c2godmFsdWUpO1xuICB9XG5cbiAgYWRkQ2xhc3NOYW1lKG5hbWU6IHN0cmluZykgeyB0aGlzLmNsYXNzTmFtZXMucHVzaChuYW1lLnRvTG93ZXJDYXNlKCkpOyB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICB2YXIgcmVzID0gJyc7XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLmVsZW1lbnQpKSB7XG4gICAgICByZXMgKz0gdGhpcy5lbGVtZW50O1xuICAgIH1cbiAgICBpZiAoaXNQcmVzZW50KHRoaXMuY2xhc3NOYW1lcykpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jbGFzc05hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlcyArPSAnLicgKyB0aGlzLmNsYXNzTmFtZXNbaV07XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc1ByZXNlbnQodGhpcy5hdHRycykpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5hdHRycy5sZW5ndGg7KSB7XG4gICAgICAgIHZhciBhdHRyTmFtZSA9IHRoaXMuYXR0cnNbaSsrXTtcbiAgICAgICAgdmFyIGF0dHJWYWx1ZSA9IHRoaXMuYXR0cnNbaSsrXTtcbiAgICAgICAgcmVzICs9ICdbJyArIGF0dHJOYW1lO1xuICAgICAgICBpZiAoYXR0clZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXMgKz0gJz0nICsgYXR0clZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJlcyArPSAnXSc7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubm90U2VsZWN0b3JzLmZvckVhY2gobm90U2VsZWN0b3IgPT4gcmVzICs9IGA6bm90KCR7bm90U2VsZWN0b3J9KWApO1xuICAgIHJldHVybiByZXM7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWFkcyBhIGxpc3Qgb2YgQ3NzU2VsZWN0b3JzIGFuZCBhbGxvd3MgdG8gY2FsY3VsYXRlIHdoaWNoIG9uZXNcbiAqIGFyZSBjb250YWluZWQgaW4gYSBnaXZlbiBDc3NTZWxlY3Rvci5cbiAqL1xuZXhwb3J0IGNsYXNzIFNlbGVjdG9yTWF0Y2hlciB7XG4gIHN0YXRpYyBjcmVhdGVOb3RNYXRjaGVyKG5vdFNlbGVjdG9yczogQ3NzU2VsZWN0b3JbXSk6IFNlbGVjdG9yTWF0Y2hlciB7XG4gICAgdmFyIG5vdE1hdGNoZXIgPSBuZXcgU2VsZWN0b3JNYXRjaGVyKCk7XG4gICAgbm90TWF0Y2hlci5hZGRTZWxlY3RhYmxlcyhub3RTZWxlY3RvcnMsIG51bGwpO1xuICAgIHJldHVybiBub3RNYXRjaGVyO1xuICB9XG5cbiAgcHJpdmF0ZSBfZWxlbWVudE1hcCA9IG5ldyBNYXA8c3RyaW5nLCBTZWxlY3RvckNvbnRleHRbXT4oKTtcbiAgcHJpdmF0ZSBfZWxlbWVudFBhcnRpYWxNYXAgPSBuZXcgTWFwPHN0cmluZywgU2VsZWN0b3JNYXRjaGVyPigpO1xuICBwcml2YXRlIF9jbGFzc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBTZWxlY3RvckNvbnRleHRbXT4oKTtcbiAgcHJpdmF0ZSBfY2xhc3NQYXJ0aWFsTWFwID0gbmV3IE1hcDxzdHJpbmcsIFNlbGVjdG9yTWF0Y2hlcj4oKTtcbiAgcHJpdmF0ZSBfYXR0clZhbHVlTWFwID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIFNlbGVjdG9yQ29udGV4dFtdPj4oKTtcbiAgcHJpdmF0ZSBfYXR0clZhbHVlUGFydGlhbE1hcCA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBTZWxlY3Rvck1hdGNoZXI+PigpO1xuICBwcml2YXRlIF9saXN0Q29udGV4dHM6IFNlbGVjdG9yTGlzdENvbnRleHRbXSA9IFtdO1xuXG4gIGFkZFNlbGVjdGFibGVzKGNzc1NlbGVjdG9yczogQ3NzU2VsZWN0b3JbXSwgY2FsbGJhY2tDdHh0PzogYW55KSB7XG4gICAgdmFyIGxpc3RDb250ZXh0ID0gbnVsbDtcbiAgICBpZiAoY3NzU2VsZWN0b3JzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGxpc3RDb250ZXh0ID0gbmV3IFNlbGVjdG9yTGlzdENvbnRleHQoY3NzU2VsZWN0b3JzKTtcbiAgICAgIHRoaXMuX2xpc3RDb250ZXh0cy5wdXNoKGxpc3RDb250ZXh0KTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjc3NTZWxlY3RvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuX2FkZFNlbGVjdGFibGUoY3NzU2VsZWN0b3JzW2ldLCBjYWxsYmFja0N0eHQsIGxpc3RDb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFuIG9iamVjdCB0aGF0IGNhbiBiZSBmb3VuZCBsYXRlciBvbiBieSBjYWxsaW5nIGBtYXRjaGAuXG4gICAqIEBwYXJhbSBjc3NTZWxlY3RvciBBIGNzcyBzZWxlY3RvclxuICAgKiBAcGFyYW0gY2FsbGJhY2tDdHh0IEFuIG9wYXF1ZSBvYmplY3QgdGhhdCB3aWxsIGJlIGdpdmVuIHRvIHRoZSBjYWxsYmFjayBvZiB0aGUgYG1hdGNoYCBmdW5jdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBfYWRkU2VsZWN0YWJsZShjc3NTZWxlY3RvcjogQ3NzU2VsZWN0b3IsIGNhbGxiYWNrQ3R4dDogYW55LFxuICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RDb250ZXh0OiBTZWxlY3Rvckxpc3RDb250ZXh0KSB7XG4gICAgdmFyIG1hdGNoZXI6IFNlbGVjdG9yTWF0Y2hlciA9IHRoaXM7XG4gICAgdmFyIGVsZW1lbnQgPSBjc3NTZWxlY3Rvci5lbGVtZW50O1xuICAgIHZhciBjbGFzc05hbWVzID0gY3NzU2VsZWN0b3IuY2xhc3NOYW1lcztcbiAgICB2YXIgYXR0cnMgPSBjc3NTZWxlY3Rvci5hdHRycztcbiAgICB2YXIgc2VsZWN0YWJsZSA9IG5ldyBTZWxlY3RvckNvbnRleHQoY3NzU2VsZWN0b3IsIGNhbGxiYWNrQ3R4dCwgbGlzdENvbnRleHQpO1xuXG4gICAgaWYgKGlzUHJlc2VudChlbGVtZW50KSkge1xuICAgICAgdmFyIGlzVGVybWluYWwgPSBhdHRycy5sZW5ndGggPT09IDAgJiYgY2xhc3NOYW1lcy5sZW5ndGggPT09IDA7XG4gICAgICBpZiAoaXNUZXJtaW5hbCkge1xuICAgICAgICB0aGlzLl9hZGRUZXJtaW5hbChtYXRjaGVyLl9lbGVtZW50TWFwLCBlbGVtZW50LCBzZWxlY3RhYmxlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1hdGNoZXIgPSB0aGlzLl9hZGRQYXJ0aWFsKG1hdGNoZXIuX2VsZW1lbnRQYXJ0aWFsTWFwLCBlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNQcmVzZW50KGNsYXNzTmFtZXMpKSB7XG4gICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgY2xhc3NOYW1lcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgdmFyIGlzVGVybWluYWwgPSBhdHRycy5sZW5ndGggPT09IDAgJiYgaW5kZXggPT09IGNsYXNzTmFtZXMubGVuZ3RoIC0gMTtcbiAgICAgICAgdmFyIGNsYXNzTmFtZSA9IGNsYXNzTmFtZXNbaW5kZXhdO1xuICAgICAgICBpZiAoaXNUZXJtaW5hbCkge1xuICAgICAgICAgIHRoaXMuX2FkZFRlcm1pbmFsKG1hdGNoZXIuX2NsYXNzTWFwLCBjbGFzc05hbWUsIHNlbGVjdGFibGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1hdGNoZXIgPSB0aGlzLl9hZGRQYXJ0aWFsKG1hdGNoZXIuX2NsYXNzUGFydGlhbE1hcCwgY2xhc3NOYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc1ByZXNlbnQoYXR0cnMpKSB7XG4gICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgYXR0cnMubGVuZ3RoOykge1xuICAgICAgICB2YXIgaXNUZXJtaW5hbCA9IGluZGV4ID09PSBhdHRycy5sZW5ndGggLSAyO1xuICAgICAgICB2YXIgYXR0ck5hbWUgPSBhdHRyc1tpbmRleCsrXTtcbiAgICAgICAgdmFyIGF0dHJWYWx1ZSA9IGF0dHJzW2luZGV4KytdO1xuICAgICAgICBpZiAoaXNUZXJtaW5hbCkge1xuICAgICAgICAgIHZhciB0ZXJtaW5hbE1hcCA9IG1hdGNoZXIuX2F0dHJWYWx1ZU1hcDtcbiAgICAgICAgICB2YXIgdGVybWluYWxWYWx1ZXNNYXAgPSB0ZXJtaW5hbE1hcC5nZXQoYXR0ck5hbWUpO1xuICAgICAgICAgIGlmIChpc0JsYW5rKHRlcm1pbmFsVmFsdWVzTWFwKSkge1xuICAgICAgICAgICAgdGVybWluYWxWYWx1ZXNNYXAgPSBuZXcgTWFwPHN0cmluZywgU2VsZWN0b3JDb250ZXh0W10+KCk7XG4gICAgICAgICAgICB0ZXJtaW5hbE1hcC5zZXQoYXR0ck5hbWUsIHRlcm1pbmFsVmFsdWVzTWFwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fYWRkVGVybWluYWwodGVybWluYWxWYWx1ZXNNYXAsIGF0dHJWYWx1ZSwgc2VsZWN0YWJsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHBhcnR0aWFsTWFwID0gbWF0Y2hlci5fYXR0clZhbHVlUGFydGlhbE1hcDtcbiAgICAgICAgICB2YXIgcGFydGlhbFZhbHVlc01hcCA9IHBhcnR0aWFsTWFwLmdldChhdHRyTmFtZSk7XG4gICAgICAgICAgaWYgKGlzQmxhbmsocGFydGlhbFZhbHVlc01hcCkpIHtcbiAgICAgICAgICAgIHBhcnRpYWxWYWx1ZXNNYXAgPSBuZXcgTWFwPHN0cmluZywgU2VsZWN0b3JNYXRjaGVyPigpO1xuICAgICAgICAgICAgcGFydHRpYWxNYXAuc2V0KGF0dHJOYW1lLCBwYXJ0aWFsVmFsdWVzTWFwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbWF0Y2hlciA9IHRoaXMuX2FkZFBhcnRpYWwocGFydGlhbFZhbHVlc01hcCwgYXR0clZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2FkZFRlcm1pbmFsKG1hcDogTWFwPHN0cmluZywgU2VsZWN0b3JDb250ZXh0W10+LCBuYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGFibGU6IFNlbGVjdG9yQ29udGV4dCkge1xuICAgIHZhciB0ZXJtaW5hbExpc3QgPSBtYXAuZ2V0KG5hbWUpO1xuICAgIGlmIChpc0JsYW5rKHRlcm1pbmFsTGlzdCkpIHtcbiAgICAgIHRlcm1pbmFsTGlzdCA9IFtdO1xuICAgICAgbWFwLnNldChuYW1lLCB0ZXJtaW5hbExpc3QpO1xuICAgIH1cbiAgICB0ZXJtaW5hbExpc3QucHVzaChzZWxlY3RhYmxlKTtcbiAgfVxuXG4gIHByaXZhdGUgX2FkZFBhcnRpYWwobWFwOiBNYXA8c3RyaW5nLCBTZWxlY3Rvck1hdGNoZXI+LCBuYW1lOiBzdHJpbmcpOiBTZWxlY3Rvck1hdGNoZXIge1xuICAgIHZhciBtYXRjaGVyID0gbWFwLmdldChuYW1lKTtcbiAgICBpZiAoaXNCbGFuayhtYXRjaGVyKSkge1xuICAgICAgbWF0Y2hlciA9IG5ldyBTZWxlY3Rvck1hdGNoZXIoKTtcbiAgICAgIG1hcC5zZXQobmFtZSwgbWF0Y2hlcik7XG4gICAgfVxuICAgIHJldHVybiBtYXRjaGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgdGhlIG9iamVjdHMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgdmlhIGBhZGRTZWxlY3RhYmxlYFxuICAgKiB3aG9zZSBjc3Mgc2VsZWN0b3IgaXMgY29udGFpbmVkIGluIHRoZSBnaXZlbiBjc3Mgc2VsZWN0b3IuXG4gICAqIEBwYXJhbSBjc3NTZWxlY3RvciBBIGNzcyBzZWxlY3RvclxuICAgKiBAcGFyYW0gbWF0Y2hlZENhbGxiYWNrIFRoaXMgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgb2JqZWN0IGhhbmRlZCBpbnRvIGBhZGRTZWxlY3RhYmxlYFxuICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBhIG1hdGNoIHdhcyBmb3VuZFxuICAqL1xuICBtYXRjaChjc3NTZWxlY3RvcjogQ3NzU2VsZWN0b3IsIG1hdGNoZWRDYWxsYmFjazogKGM6IENzc1NlbGVjdG9yLCBhOiBhbnkpID0+IHZvaWQpOiBib29sZWFuIHtcbiAgICB2YXIgcmVzdWx0ID0gZmFsc2U7XG4gICAgdmFyIGVsZW1lbnQgPSBjc3NTZWxlY3Rvci5lbGVtZW50O1xuICAgIHZhciBjbGFzc05hbWVzID0gY3NzU2VsZWN0b3IuY2xhc3NOYW1lcztcbiAgICB2YXIgYXR0cnMgPSBjc3NTZWxlY3Rvci5hdHRycztcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fbGlzdENvbnRleHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLl9saXN0Q29udGV4dHNbaV0uYWxyZWFkeU1hdGNoZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICByZXN1bHQgPSB0aGlzLl9tYXRjaFRlcm1pbmFsKHRoaXMuX2VsZW1lbnRNYXAsIGVsZW1lbnQsIGNzc1NlbGVjdG9yLCBtYXRjaGVkQ2FsbGJhY2spIHx8IHJlc3VsdDtcbiAgICByZXN1bHQgPSB0aGlzLl9tYXRjaFBhcnRpYWwodGhpcy5fZWxlbWVudFBhcnRpYWxNYXAsIGVsZW1lbnQsIGNzc1NlbGVjdG9yLCBtYXRjaGVkQ2FsbGJhY2spIHx8XG4gICAgICAgICAgICAgcmVzdWx0O1xuXG4gICAgaWYgKGlzUHJlc2VudChjbGFzc05hbWVzKSkge1xuICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGNsYXNzTmFtZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIHZhciBjbGFzc05hbWUgPSBjbGFzc05hbWVzW2luZGV4XTtcbiAgICAgICAgcmVzdWx0ID1cbiAgICAgICAgICAgIHRoaXMuX21hdGNoVGVybWluYWwodGhpcy5fY2xhc3NNYXAsIGNsYXNzTmFtZSwgY3NzU2VsZWN0b3IsIG1hdGNoZWRDYWxsYmFjaykgfHwgcmVzdWx0O1xuICAgICAgICByZXN1bHQgPVxuICAgICAgICAgICAgdGhpcy5fbWF0Y2hQYXJ0aWFsKHRoaXMuX2NsYXNzUGFydGlhbE1hcCwgY2xhc3NOYW1lLCBjc3NTZWxlY3RvciwgbWF0Y2hlZENhbGxiYWNrKSB8fFxuICAgICAgICAgICAgcmVzdWx0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc1ByZXNlbnQoYXR0cnMpKSB7XG4gICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgYXR0cnMubGVuZ3RoOykge1xuICAgICAgICB2YXIgYXR0ck5hbWUgPSBhdHRyc1tpbmRleCsrXTtcbiAgICAgICAgdmFyIGF0dHJWYWx1ZSA9IGF0dHJzW2luZGV4KytdO1xuXG4gICAgICAgIHZhciB0ZXJtaW5hbFZhbHVlc01hcCA9IHRoaXMuX2F0dHJWYWx1ZU1hcC5nZXQoYXR0ck5hbWUpO1xuICAgICAgICBpZiAoIVN0cmluZ1dyYXBwZXIuZXF1YWxzKGF0dHJWYWx1ZSwgX0VNUFRZX0FUVFJfVkFMVUUpKSB7XG4gICAgICAgICAgcmVzdWx0ID0gdGhpcy5fbWF0Y2hUZXJtaW5hbCh0ZXJtaW5hbFZhbHVlc01hcCwgX0VNUFRZX0FUVFJfVkFMVUUsIGNzc1NlbGVjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZENhbGxiYWNrKSB8fFxuICAgICAgICAgICAgICAgICAgIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQgPSB0aGlzLl9tYXRjaFRlcm1pbmFsKHRlcm1pbmFsVmFsdWVzTWFwLCBhdHRyVmFsdWUsIGNzc1NlbGVjdG9yLCBtYXRjaGVkQ2FsbGJhY2spIHx8XG4gICAgICAgICAgICAgICAgIHJlc3VsdDtcblxuICAgICAgICB2YXIgcGFydGlhbFZhbHVlc01hcCA9IHRoaXMuX2F0dHJWYWx1ZVBhcnRpYWxNYXAuZ2V0KGF0dHJOYW1lKTtcbiAgICAgICAgaWYgKCFTdHJpbmdXcmFwcGVyLmVxdWFscyhhdHRyVmFsdWUsIF9FTVBUWV9BVFRSX1ZBTFVFKSkge1xuICAgICAgICAgIHJlc3VsdCA9IHRoaXMuX21hdGNoUGFydGlhbChwYXJ0aWFsVmFsdWVzTWFwLCBfRU1QVFlfQVRUUl9WQUxVRSwgY3NzU2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWRDYWxsYmFjaykgfHxcbiAgICAgICAgICAgICAgICAgICByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0ID1cbiAgICAgICAgICAgIHRoaXMuX21hdGNoUGFydGlhbChwYXJ0aWFsVmFsdWVzTWFwLCBhdHRyVmFsdWUsIGNzc1NlbGVjdG9yLCBtYXRjaGVkQ2FsbGJhY2spIHx8IHJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX21hdGNoVGVybWluYWwobWFwOiBNYXA8c3RyaW5nLCBTZWxlY3RvckNvbnRleHRbXT4sIG5hbWUsIGNzc1NlbGVjdG9yOiBDc3NTZWxlY3RvcixcbiAgICAgICAgICAgICAgICAgbWF0Y2hlZENhbGxiYWNrOiAoYzogQ3NzU2VsZWN0b3IsIGE6IGFueSkgPT4gdm9pZCk6IGJvb2xlYW4ge1xuICAgIGlmIChpc0JsYW5rKG1hcCkgfHwgaXNCbGFuayhuYW1lKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBzZWxlY3RhYmxlcyA9IG1hcC5nZXQobmFtZSk7XG4gICAgdmFyIHN0YXJTZWxlY3RhYmxlcyA9IG1hcC5nZXQoXCIqXCIpO1xuICAgIGlmIChpc1ByZXNlbnQoc3RhclNlbGVjdGFibGVzKSkge1xuICAgICAgc2VsZWN0YWJsZXMgPSBzZWxlY3RhYmxlcy5jb25jYXQoc3RhclNlbGVjdGFibGVzKTtcbiAgICB9XG4gICAgaWYgKGlzQmxhbmsoc2VsZWN0YWJsZXMpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciBzZWxlY3RhYmxlO1xuICAgIHZhciByZXN1bHQgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgc2VsZWN0YWJsZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBzZWxlY3RhYmxlID0gc2VsZWN0YWJsZXNbaW5kZXhdO1xuICAgICAgcmVzdWx0ID0gc2VsZWN0YWJsZS5maW5hbGl6ZShjc3NTZWxlY3RvciwgbWF0Y2hlZENhbGxiYWNrKSB8fCByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9tYXRjaFBhcnRpYWwobWFwOiBNYXA8c3RyaW5nLCBTZWxlY3Rvck1hdGNoZXI+LCBuYW1lLCBjc3NTZWxlY3RvcjogQ3NzU2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgbWF0Y2hlZENhbGxiYWNrIC8qOiAoYzogQ3NzU2VsZWN0b3IsIGE6IGFueSkgPT4gdm9pZCovKTogYm9vbGVhbiB7XG4gICAgaWYgKGlzQmxhbmsobWFwKSB8fCBpc0JsYW5rKG5hbWUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciBuZXN0ZWRTZWxlY3RvciA9IG1hcC5nZXQobmFtZSk7XG4gICAgaWYgKGlzQmxhbmsobmVzdGVkU2VsZWN0b3IpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIFRPRE8ocGVyZik6IGdldCByaWQgb2YgcmVjdXJzaW9uIGFuZCBtZWFzdXJlIGFnYWluXG4gICAgLy8gVE9ETyhwZXJmKTogZG9uJ3QgcGFzcyB0aGUgd2hvbGUgc2VsZWN0b3IgaW50byB0aGUgcmVjdXJzaW9uLFxuICAgIC8vIGJ1dCBvbmx5IHRoZSBub3QgcHJvY2Vzc2VkIHBhcnRzXG4gICAgcmV0dXJuIG5lc3RlZFNlbGVjdG9yLm1hdGNoKGNzc1NlbGVjdG9yLCBtYXRjaGVkQ2FsbGJhY2spO1xuICB9XG59XG5cblxuZXhwb3J0IGNsYXNzIFNlbGVjdG9yTGlzdENvbnRleHQge1xuICBhbHJlYWR5TWF0Y2hlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBzZWxlY3RvcnM6IENzc1NlbGVjdG9yW10pIHt9XG59XG5cbi8vIFN0b3JlIGNvbnRleHQgdG8gcGFzcyBiYWNrIHNlbGVjdG9yIGFuZCBjb250ZXh0IHdoZW4gYSBzZWxlY3RvciBpcyBtYXRjaGVkXG5leHBvcnQgY2xhc3MgU2VsZWN0b3JDb250ZXh0IHtcbiAgbm90U2VsZWN0b3JzOiBDc3NTZWxlY3RvcltdO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBzZWxlY3RvcjogQ3NzU2VsZWN0b3IsIHB1YmxpYyBjYkNvbnRleHQ6IGFueSxcbiAgICAgICAgICAgICAgcHVibGljIGxpc3RDb250ZXh0OiBTZWxlY3Rvckxpc3RDb250ZXh0KSB7XG4gICAgdGhpcy5ub3RTZWxlY3RvcnMgPSBzZWxlY3Rvci5ub3RTZWxlY3RvcnM7XG4gIH1cblxuICBmaW5hbGl6ZShjc3NTZWxlY3RvcjogQ3NzU2VsZWN0b3IsIGNhbGxiYWNrOiAoYzogQ3NzU2VsZWN0b3IsIGE6IGFueSkgPT4gdm9pZCk6IGJvb2xlYW4ge1xuICAgIHZhciByZXN1bHQgPSB0cnVlO1xuICAgIGlmICh0aGlzLm5vdFNlbGVjdG9ycy5sZW5ndGggPiAwICYmXG4gICAgICAgIChpc0JsYW5rKHRoaXMubGlzdENvbnRleHQpIHx8ICF0aGlzLmxpc3RDb250ZXh0LmFscmVhZHlNYXRjaGVkKSkge1xuICAgICAgdmFyIG5vdE1hdGNoZXIgPSBTZWxlY3Rvck1hdGNoZXIuY3JlYXRlTm90TWF0Y2hlcih0aGlzLm5vdFNlbGVjdG9ycyk7XG4gICAgICByZXN1bHQgPSAhbm90TWF0Y2hlci5tYXRjaChjc3NTZWxlY3RvciwgbnVsbCk7XG4gICAgfVxuICAgIGlmIChyZXN1bHQgJiYgaXNQcmVzZW50KGNhbGxiYWNrKSAmJlxuICAgICAgICAoaXNCbGFuayh0aGlzLmxpc3RDb250ZXh0KSB8fCAhdGhpcy5saXN0Q29udGV4dC5hbHJlYWR5TWF0Y2hlZCkpIHtcbiAgICAgIGlmIChpc1ByZXNlbnQodGhpcy5saXN0Q29udGV4dCkpIHtcbiAgICAgICAgdGhpcy5saXN0Q29udGV4dC5hbHJlYWR5TWF0Y2hlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBjYWxsYmFjayh0aGlzLnNlbGVjdG9yLCB0aGlzLmNiQ29udGV4dCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21waWxlci9zZWxlY3Rvci50c1xuICoqLyIsImltcG9ydCB7SVNfREFSVCwgU3RyaW5nV3JhcHBlciwgaXNCbGFua30gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxudmFyIENBTUVMX0NBU0VfUkVHRVhQID0gLyhbQS1aXSkvZztcbnZhciBEQVNIX0NBU0VfUkVHRVhQID0gLy0oW2Etel0pL2c7XG52YXIgU0lOR0xFX1FVT1RFX0VTQ0FQRV9TVFJJTkdfUkUgPSAvJ3xcXFxcfFxcbnxcXHJ8XFwkL2c7XG52YXIgRE9VQkxFX1FVT1RFX0VTQ0FQRV9TVFJJTkdfUkUgPSAvXCJ8XFxcXHxcXG58XFxyfFxcJC9nO1xuXG5leHBvcnQgdmFyIE1PRFVMRV9TVUZGSVggPSBJU19EQVJUID8gJy5kYXJ0JyA6ICcuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gY2FtZWxDYXNlVG9EYXNoQ2FzZShpbnB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIFN0cmluZ1dyYXBwZXIucmVwbGFjZUFsbE1hcHBlZChpbnB1dCwgQ0FNRUxfQ0FTRV9SRUdFWFAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG0pID0+IHsgcmV0dXJuICctJyArIG1bMV0udG9Mb3dlckNhc2UoKTsgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkYXNoQ2FzZVRvQ2FtZWxDYXNlKGlucHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gU3RyaW5nV3JhcHBlci5yZXBsYWNlQWxsTWFwcGVkKGlucHV0LCBEQVNIX0NBU0VfUkVHRVhQLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtKSA9PiB7IHJldHVybiBtWzFdLnRvVXBwZXJDYXNlKCk7IH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlU2luZ2xlUXVvdGVTdHJpbmcoaW5wdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChpc0JsYW5rKGlucHV0KSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBgJyR7ZXNjYXBlU3RyaW5nKGlucHV0LCBTSU5HTEVfUVVPVEVfRVNDQVBFX1NUUklOR19SRSl9J2A7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVEb3VibGVRdW90ZVN0cmluZyhpbnB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGlzQmxhbmsoaW5wdXQpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGBcIiR7ZXNjYXBlU3RyaW5nKGlucHV0LCBET1VCTEVfUVVPVEVfRVNDQVBFX1NUUklOR19SRSl9XCJgO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVTdHJpbmcoaW5wdXQ6IHN0cmluZywgcmU6IFJlZ0V4cCk6IHN0cmluZyB7XG4gIHJldHVybiBTdHJpbmdXcmFwcGVyLnJlcGxhY2VBbGxNYXBwZWQoaW5wdXQsIHJlLCAobWF0Y2gpID0+IHtcbiAgICBpZiAobWF0Y2hbMF0gPT0gJyQnKSB7XG4gICAgICByZXR1cm4gSVNfREFSVCA/ICdcXFxcJCcgOiAnJCc7XG4gICAgfSBlbHNlIGlmIChtYXRjaFswXSA9PSAnXFxuJykge1xuICAgICAgcmV0dXJuICdcXFxcbic7XG4gICAgfSBlbHNlIGlmIChtYXRjaFswXSA9PSAnXFxyJykge1xuICAgICAgcmV0dXJuICdcXFxccic7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgXFxcXCR7bWF0Y2hbMF19YDtcbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29kZUdlbkV4cG9ydFZhcmlhYmxlKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChJU19EQVJUKSB7XG4gICAgcmV0dXJuIGBjb25zdCAke25hbWV9ID0gYDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYHZhciAke25hbWV9ID0gZXhwb3J0c1snJHtuYW1lfSddID0gYDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29kZUdlbkNvbnN0Q29uc3RydWN0b3JDYWxsKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChJU19EQVJUKSB7XG4gICAgcmV0dXJuIGBjb25zdCAke25hbWV9YDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYG5ldyAke25hbWV9YDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29kZUdlblZhbHVlRm4ocGFyYW1zOiBzdHJpbmdbXSwgdmFsdWU6IHN0cmluZywgZm5OYW1lOiBzdHJpbmcgPSAnJyk6IHN0cmluZyB7XG4gIGlmIChJU19EQVJUKSB7XG4gICAgcmV0dXJuIGAke2ZuTmFtZX0oJHtwYXJhbXMuam9pbignLCcpfSkgPT4gJHt2YWx1ZX1gO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBgZnVuY3Rpb24gJHtmbk5hbWV9KCR7cGFyYW1zLmpvaW4oJywnKX0pIHsgcmV0dXJuICR7dmFsdWV9OyB9YDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29kZUdlblRvU3RyaW5nKGV4cHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChJU19EQVJUKSB7XG4gICAgcmV0dXJuIGAnXFwkeyR7ZXhwcn19J2A7XG4gIH0gZWxzZSB7XG4gICAgLy8gSlMgYXV0b21hdGljYWxseSBjb252ZXRzIHRvIHN0cmluZy4uLlxuICAgIHJldHVybiBleHByO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdEF0Q29sb24oaW5wdXQ6IHN0cmluZywgZGVmYXVsdFZhbHVlczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIHZhciBwYXJ0cyA9IFN0cmluZ1dyYXBwZXIuc3BsaXQoaW5wdXQudHJpbSgpLCAvXFxzKjpcXHMqL2cpO1xuICBpZiAocGFydHMubGVuZ3RoID4gMSkge1xuICAgIHJldHVybiBwYXJ0cztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZGVmYXVsdFZhbHVlcztcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3V0aWwudHNcbiAqKi8iLCJpbXBvcnQge1N0cmluZ1dyYXBwZXIsIGlzQmxhbmt9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5cbnZhciBNT0RVTEVfUkVHRVhQID0gLyNNT0RVTEVcXFsoW15cXF1dKilcXF0vZztcblxuZXhwb3J0IGZ1bmN0aW9uIG1vZHVsZVJlZihtb2R1bGVVcmwpOiBzdHJpbmcge1xuICByZXR1cm4gYCNNT0RVTEVbJHttb2R1bGVVcmx9XWA7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBnZW5lcmF0ZWQgc291cmNlIGNvZGUgd2l0aCBtb2R1bGUgcmVmZXJlbmNlcy4gSW50ZXJuYWwgdG8gdGhlIEFuZ3VsYXIgY29tcGlsZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBTb3VyY2VNb2R1bGUge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbW9kdWxlVXJsOiBzdHJpbmcsIHB1YmxpYyBzb3VyY2VXaXRoTW9kdWxlUmVmczogc3RyaW5nKSB7fVxuXG4gIGdldFNvdXJjZVdpdGhJbXBvcnRzKCk6IFNvdXJjZVdpdGhJbXBvcnRzIHtcbiAgICB2YXIgbW9kdWxlQWxpYXNlcyA9IHt9O1xuICAgIHZhciBpbXBvcnRzOiBzdHJpbmdbXVtdID0gW107XG4gICAgdmFyIG5ld1NvdXJjZSA9XG4gICAgICAgIFN0cmluZ1dyYXBwZXIucmVwbGFjZUFsbE1hcHBlZCh0aGlzLnNvdXJjZVdpdGhNb2R1bGVSZWZzLCBNT0RVTEVfUkVHRVhQLCAobWF0Y2gpID0+IHtcbiAgICAgICAgICB2YXIgbW9kdWxlVXJsID0gbWF0Y2hbMV07XG4gICAgICAgICAgdmFyIGFsaWFzID0gbW9kdWxlQWxpYXNlc1ttb2R1bGVVcmxdO1xuICAgICAgICAgIGlmIChpc0JsYW5rKGFsaWFzKSkge1xuICAgICAgICAgICAgaWYgKG1vZHVsZVVybCA9PSB0aGlzLm1vZHVsZVVybCkge1xuICAgICAgICAgICAgICBhbGlhcyA9ICcnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYWxpYXMgPSBgaW1wb3J0JHtpbXBvcnRzLmxlbmd0aH1gO1xuICAgICAgICAgICAgICBpbXBvcnRzLnB1c2goW21vZHVsZVVybCwgYWxpYXNdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1vZHVsZUFsaWFzZXNbbW9kdWxlVXJsXSA9IGFsaWFzO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYWxpYXMubGVuZ3RoID4gMCA/IGAke2FsaWFzfS5gIDogJyc7XG4gICAgICAgIH0pO1xuICAgIHJldHVybiBuZXcgU291cmNlV2l0aEltcG9ydHMobmV3U291cmNlLCBpbXBvcnRzKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU291cmNlRXhwcmVzc2lvbiB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBkZWNsYXJhdGlvbnM6IHN0cmluZ1tdLCBwdWJsaWMgZXhwcmVzc2lvbjogc3RyaW5nKSB7fVxufVxuXG5leHBvcnQgY2xhc3MgU291cmNlRXhwcmVzc2lvbnMge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZGVjbGFyYXRpb25zOiBzdHJpbmdbXSwgcHVibGljIGV4cHJlc3Npb25zOiBzdHJpbmdbXSkge31cbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGdlbmVyYXRlZCBzb3VyY2UgY29kZSB3aXRoIGltcG9ydHMuIEludGVybmFsIHRvIHRoZSBBbmd1bGFyIGNvbXBpbGVyLlxuICovXG5leHBvcnQgY2xhc3MgU291cmNlV2l0aEltcG9ydHMge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgc291cmNlOiBzdHJpbmcsIHB1YmxpYyBpbXBvcnRzOiBzdHJpbmdbXVtdKSB7fVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3NvdXJjZV9tb2R1bGUudHNcbiAqKi8iLCJpbXBvcnQge0NvbXBpbGVUeXBlTWV0YWRhdGF9IGZyb20gJy4vZGlyZWN0aXZlX21ldGFkYXRhJztcbmltcG9ydCB7U291cmNlRXhwcmVzc2lvbnMsIG1vZHVsZVJlZn0gZnJvbSAnLi9zb3VyY2VfbW9kdWxlJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdG9ySklUR2VuZXJhdG9yXG59IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vY2hhbmdlX2RldGVjdGlvbl9qaXRfZ2VuZXJhdG9yJztcblxuaW1wb3J0IHtjcmVhdGVDaGFuZ2VEZXRlY3RvckRlZmluaXRpb25zfSBmcm9tICcuL2NoYW5nZV9kZWZpbml0aW9uX2ZhY3RvcnknO1xuaW1wb3J0IHtJU19EQVJULCBpc0pzT2JqZWN0LCBDT05TVF9FWFBSfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuXG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvckdlbkNvbmZpZyxcbiAgQ2hhbmdlRGV0ZWN0b3JEZWZpbml0aW9uLFxuICBEeW5hbWljUHJvdG9DaGFuZ2VEZXRlY3RvcixcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3lcbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9jaGFuZ2VfZGV0ZWN0aW9uJztcblxuaW1wb3J0IHtUZW1wbGF0ZUFzdH0gZnJvbSAnLi90ZW1wbGF0ZV9hc3QnO1xuaW1wb3J0IHtDb2RlZ2VufSBmcm9tICdhbmd1bGFyMi9zcmMvdHJhbnNmb3JtL3RlbXBsYXRlX2NvbXBpbGVyL2NoYW5nZV9kZXRlY3Rvcl9jb2RlZ2VuJztcbmltcG9ydCB7TU9EVUxFX1NVRkZJWH0gZnJvbSAnLi91dGlsJztcbmltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvZGknO1xuXG5jb25zdCBBQlNUUkFDVF9DSEFOR0VfREVURUNUT1IgPSBcIkFic3RyYWN0Q2hhbmdlRGV0ZWN0b3JcIjtcbmNvbnN0IFVUSUwgPSBcIkNoYW5nZURldGVjdGlvblV0aWxcIjtcbmNvbnN0IENIQU5HRV9ERVRFQ1RPUl9TVEFURSA9IFwiQ2hhbmdlRGV0ZWN0b3JTdGF0ZVwiO1xuXG52YXIgQUJTVFJBQ1RfQ0hBTkdFX0RFVEVDVE9SX01PRFVMRSA9IG1vZHVsZVJlZihcbiAgICBgcGFja2FnZTphbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2Fic3RyYWN0X2NoYW5nZV9kZXRlY3RvciR7TU9EVUxFX1NVRkZJWH1gKTtcbnZhciBVVElMX01PRFVMRSA9XG4gICAgbW9kdWxlUmVmKGBwYWNrYWdlOmFuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vY2hhbmdlX2RldGVjdGlvbl91dGlsJHtNT0RVTEVfU1VGRklYfWApO1xudmFyIFBSRUdFTl9QUk9UT19DSEFOR0VfREVURUNUT1JfTU9EVUxFID0gbW9kdWxlUmVmKFxuICAgIGBwYWNrYWdlOmFuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vcHJlZ2VuX3Byb3RvX2NoYW5nZV9kZXRlY3RvciR7TU9EVUxFX1NVRkZJWH1gKTtcbnZhciBDT05TVEFOVFNfTU9EVUxFID1cbiAgICBtb2R1bGVSZWYoYHBhY2thZ2U6YW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9jb25zdGFudHMke01PRFVMRV9TVUZGSVh9YCk7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDaGFuZ2VEZXRlY3Rpb25Db21waWxlciB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2dlbkNvbmZpZzogQ2hhbmdlRGV0ZWN0b3JHZW5Db25maWcpIHt9XG5cbiAgY29tcGlsZUNvbXBvbmVudFJ1bnRpbWUoY29tcG9uZW50VHlwZTogQ29tcGlsZVR5cGVNZXRhZGF0YSwgc3RyYXRlZ3k6IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWRUZW1wbGF0ZTogVGVtcGxhdGVBc3RbXSk6IEZ1bmN0aW9uW10ge1xuICAgIHZhciBjaGFuZ2VEZXRlY3RvckRlZmluaXRpb25zID1cbiAgICAgICAgY3JlYXRlQ2hhbmdlRGV0ZWN0b3JEZWZpbml0aW9ucyhjb21wb25lbnRUeXBlLCBzdHJhdGVneSwgdGhpcy5fZ2VuQ29uZmlnLCBwYXJzZWRUZW1wbGF0ZSk7XG4gICAgcmV0dXJuIGNoYW5nZURldGVjdG9yRGVmaW5pdGlvbnMubWFwKGRlZmluaXRpb24gPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NyZWF0ZUNoYW5nZURldGVjdG9yRmFjdG9yeShkZWZpbml0aW9uKSk7XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVDaGFuZ2VEZXRlY3RvckZhY3RvcnkoZGVmaW5pdGlvbjogQ2hhbmdlRGV0ZWN0b3JEZWZpbml0aW9uKTogRnVuY3Rpb24ge1xuICAgIGlmIChJU19EQVJUIHx8ICF0aGlzLl9nZW5Db25maWcudXNlSml0KSB7XG4gICAgICB2YXIgcHJvdG8gPSBuZXcgRHluYW1pY1Byb3RvQ2hhbmdlRGV0ZWN0b3IoZGVmaW5pdGlvbik7XG4gICAgICByZXR1cm4gKGRpc3BhdGNoZXIpID0+IHByb3RvLmluc3RhbnRpYXRlKGRpc3BhdGNoZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IENoYW5nZURldGVjdG9ySklUR2VuZXJhdG9yKGRlZmluaXRpb24sIFVUSUwsIEFCU1RSQUNUX0NIQU5HRV9ERVRFQ1RPUixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTkdFX0RFVEVDVE9SX1NUQVRFKVxuICAgICAgICAgIC5nZW5lcmF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIGNvbXBpbGVDb21wb25lbnRDb2RlR2VuKGNvbXBvbmVudFR5cGU6IENvbXBpbGVUeXBlTWV0YWRhdGEsIHN0cmF0ZWd5OiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkVGVtcGxhdGU6IFRlbXBsYXRlQXN0W10pOiBTb3VyY2VFeHByZXNzaW9ucyB7XG4gICAgdmFyIGNoYW5nZURldGVjdG9yRGVmaW5pdGlvbnMgPVxuICAgICAgICBjcmVhdGVDaGFuZ2VEZXRlY3RvckRlZmluaXRpb25zKGNvbXBvbmVudFR5cGUsIHN0cmF0ZWd5LCB0aGlzLl9nZW5Db25maWcsIHBhcnNlZFRlbXBsYXRlKTtcbiAgICB2YXIgZmFjdG9yaWVzID0gW107XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgc291cmNlUGFydHMgPSBjaGFuZ2VEZXRlY3RvckRlZmluaXRpb25zLm1hcChkZWZpbml0aW9uID0+IHtcbiAgICAgIHZhciBjb2RlZ2VuOiBhbnk7XG4gICAgICB2YXIgc291cmNlUGFydDogc3RyaW5nO1xuICAgICAgLy8gVE9ETyh0Ym9zY2gpOiBtb3ZlIHRoZSAyIGNvZGUgZ2VuZXJhdG9ycyB0byB0aGUgc2FtZSBwbGFjZSwgb25lIHdpdGggLmRhcnQgYW5kIG9uZSB3aXRoIC50c1xuICAgICAgLy8gc3VmZml4XG4gICAgICAvLyBhbmQgaGF2ZSB0aGUgc2FtZSBBUEkgZm9yIGNhbGxpbmcgdGhlbSFcbiAgICAgIGlmIChJU19EQVJUKSB7XG4gICAgICAgIGNvZGVnZW4gPSBuZXcgQ29kZWdlbihQUkVHRU5fUFJPVE9fQ0hBTkdFX0RFVEVDVE9SX01PRFVMRSk7XG4gICAgICAgIHZhciBjbGFzc05hbWUgPSBgXyR7ZGVmaW5pdGlvbi5pZH1gO1xuICAgICAgICB2YXIgdHlwZVJlZiA9IChpbmRleCA9PT0gMCAmJiBjb21wb25lbnRUeXBlLmlzSG9zdCkgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnZHluYW1pYycgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICBgJHttb2R1bGVSZWYoY29tcG9uZW50VHlwZS5tb2R1bGVVcmwpfSR7Y29tcG9uZW50VHlwZS5uYW1lfWA7XG4gICAgICAgIGNvZGVnZW4uZ2VuZXJhdGUodHlwZVJlZiwgY2xhc3NOYW1lLCBkZWZpbml0aW9uKTtcbiAgICAgICAgZmFjdG9yaWVzLnB1c2goYCR7Y2xhc3NOYW1lfS5uZXdDaGFuZ2VEZXRlY3RvcmApO1xuICAgICAgICBzb3VyY2VQYXJ0ID0gY29kZWdlbi50b1N0cmluZygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29kZWdlbiA9IG5ldyBDaGFuZ2VEZXRlY3RvckpJVEdlbmVyYXRvcihcbiAgICAgICAgICAgIGRlZmluaXRpb24sIGAke1VUSUxfTU9EVUxFfSR7VVRJTH1gLFxuICAgICAgICAgICAgYCR7QUJTVFJBQ1RfQ0hBTkdFX0RFVEVDVE9SX01PRFVMRX0ke0FCU1RSQUNUX0NIQU5HRV9ERVRFQ1RPUn1gLFxuICAgICAgICAgICAgYCR7Q09OU1RBTlRTX01PRFVMRX0ke0NIQU5HRV9ERVRFQ1RPUl9TVEFURX1gKTtcbiAgICAgICAgZmFjdG9yaWVzLnB1c2goYGZ1bmN0aW9uKGRpc3BhdGNoZXIpIHsgcmV0dXJuIG5ldyAke2NvZGVnZW4udHlwZU5hbWV9KGRpc3BhdGNoZXIpOyB9YCk7XG4gICAgICAgIHNvdXJjZVBhcnQgPSBjb2RlZ2VuLmdlbmVyYXRlU291cmNlKCk7XG4gICAgICB9XG4gICAgICBpbmRleCsrO1xuICAgICAgcmV0dXJuIHNvdXJjZVBhcnQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBTb3VyY2VFeHByZXNzaW9ucyhzb3VyY2VQYXJ0cywgZmFjdG9yaWVzKTtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbXBpbGVyL2NoYW5nZV9kZXRlY3Rvcl9jb21waWxlci50c1xuICoqLyIsImltcG9ydCB7TGlzdFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge2lzUHJlc2VudCwgaXNCbGFua30gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7cmVmbGVjdG9yfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9yZWZsZWN0aW9uL3JlZmxlY3Rpb24nO1xuXG5pbXBvcnQge1xuICBEaXJlY3RpdmVJbmRleCxcbiAgQmluZGluZ1JlY29yZCxcbiAgRGlyZWN0aXZlUmVjb3JkLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JEZWZpbml0aW9uLFxuICBDaGFuZ2VEZXRlY3RvckdlbkNvbmZpZyxcbiAgQVNUV2l0aFNvdXJjZVxufSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2NoYW5nZV9kZXRlY3Rpb24nO1xuXG5pbXBvcnQge0NvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YSwgQ29tcGlsZVR5cGVNZXRhZGF0YX0gZnJvbSAnLi9kaXJlY3RpdmVfbWV0YWRhdGEnO1xuaW1wb3J0IHtcbiAgVGVtcGxhdGVBc3QsXG4gIEVsZW1lbnRBc3QsXG4gIEJvdW5kVGV4dEFzdCxcbiAgUHJvcGVydHlCaW5kaW5nVHlwZSxcbiAgRGlyZWN0aXZlQXN0LFxuICBUZW1wbGF0ZUFzdFZpc2l0b3IsXG4gIHRlbXBsYXRlVmlzaXRBbGwsXG4gIE5nQ29udGVudEFzdCxcbiAgRW1iZWRkZWRUZW1wbGF0ZUFzdCxcbiAgVmFyaWFibGVBc3QsXG4gIEJvdW5kRWxlbWVudFByb3BlcnR5QXN0LFxuICBCb3VuZEV2ZW50QXN0LFxuICBCb3VuZERpcmVjdGl2ZVByb3BlcnR5QXN0LFxuICBBdHRyQXN0LFxuICBUZXh0QXN0XG59IGZyb20gJy4vdGVtcGxhdGVfYXN0JztcbmltcG9ydCB7TGlmZWN5Y2xlSG9va3N9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9pbnRlcmZhY2VzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNoYW5nZURldGVjdG9yRGVmaW5pdGlvbnMoXG4gICAgY29tcG9uZW50VHlwZTogQ29tcGlsZVR5cGVNZXRhZGF0YSwgY29tcG9uZW50U3RyYXRlZ3k6IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIGdlbkNvbmZpZzogQ2hhbmdlRGV0ZWN0b3JHZW5Db25maWcsIHBhcnNlZFRlbXBsYXRlOiBUZW1wbGF0ZUFzdFtdKTogQ2hhbmdlRGV0ZWN0b3JEZWZpbml0aW9uW10ge1xuICB2YXIgcHZWaXNpdG9ycyA9IFtdO1xuICB2YXIgdmlzaXRvciA9IG5ldyBQcm90b1ZpZXdWaXNpdG9yKG51bGwsIHB2VmlzaXRvcnMsIGNvbXBvbmVudFN0cmF0ZWd5KTtcbiAgdGVtcGxhdGVWaXNpdEFsbCh2aXNpdG9yLCBwYXJzZWRUZW1wbGF0ZSk7XG4gIHJldHVybiBjcmVhdGVDaGFuZ2VEZWZpbml0aW9ucyhwdlZpc2l0b3JzLCBjb21wb25lbnRUeXBlLCBnZW5Db25maWcpO1xufVxuXG5jbGFzcyBQcm90b1ZpZXdWaXNpdG9yIGltcGxlbWVudHMgVGVtcGxhdGVBc3RWaXNpdG9yIHtcbiAgdmlld0luZGV4OiBudW1iZXI7XG4gIGJvdW5kVGV4dENvdW50OiBudW1iZXIgPSAwO1xuICBib3VuZEVsZW1lbnRDb3VudDogbnVtYmVyID0gMDtcbiAgdmFyaWFibGVOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgYmluZGluZ1JlY29yZHM6IEJpbmRpbmdSZWNvcmRbXSA9IFtdO1xuICBldmVudFJlY29yZHM6IEJpbmRpbmdSZWNvcmRbXSA9IFtdO1xuICBkaXJlY3RpdmVSZWNvcmRzOiBEaXJlY3RpdmVSZWNvcmRbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwYXJlbnQ6IFByb3RvVmlld1Zpc2l0b3IsIHB1YmxpYyBhbGxWaXNpdG9yczogUHJvdG9WaWV3VmlzaXRvcltdLFxuICAgICAgICAgICAgICBwdWJsaWMgc3RyYXRlZ3k6IENoYW5nZURldGVjdGlvblN0cmF0ZWd5KSB7XG4gICAgdGhpcy52aWV3SW5kZXggPSBhbGxWaXNpdG9ycy5sZW5ndGg7XG4gICAgYWxsVmlzaXRvcnMucHVzaCh0aGlzKTtcbiAgfVxuXG4gIHZpc2l0RW1iZWRkZWRUZW1wbGF0ZShhc3Q6IEVtYmVkZGVkVGVtcGxhdGVBc3QsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgdGhpcy5ib3VuZEVsZW1lbnRDb3VudCsrO1xuICAgIHRlbXBsYXRlVmlzaXRBbGwodGhpcywgYXN0Lm91dHB1dHMpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXN0LmRpcmVjdGl2ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFzdC5kaXJlY3RpdmVzW2ldLnZpc2l0KHRoaXMsIGkpO1xuICAgIH1cblxuICAgIHZhciBjaGlsZFZpc2l0b3IgPVxuICAgICAgICBuZXcgUHJvdG9WaWV3VmlzaXRvcih0aGlzLCB0aGlzLmFsbFZpc2l0b3JzLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5EZWZhdWx0KTtcbiAgICAvLyBBdHRlbnRpb246IHZhcmlhYmxlcyBwcmVzZW50IG9uIGFuIGVtYmVkZGVkIHRlbXBsYXRlIGNvdW50IHRvd2FyZHNcbiAgICAvLyB0aGUgZW1iZWRkZWQgdGVtcGxhdGUgYW5kIG5vdCB0aGUgdGVtcGxhdGUgYW5jaG9yIVxuICAgIHRlbXBsYXRlVmlzaXRBbGwoY2hpbGRWaXNpdG9yLCBhc3QudmFycyk7XG4gICAgdGVtcGxhdGVWaXNpdEFsbChjaGlsZFZpc2l0b3IsIGFzdC5jaGlsZHJlbik7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2aXNpdEVsZW1lbnQoYXN0OiBFbGVtZW50QXN0LCBjb250ZXh0OiBhbnkpOiBhbnkge1xuICAgIGlmIChhc3QuaXNCb3VuZCgpKSB7XG4gICAgICB0aGlzLmJvdW5kRWxlbWVudENvdW50Kys7XG4gICAgfVxuICAgIHRlbXBsYXRlVmlzaXRBbGwodGhpcywgYXN0LmlucHV0cywgbnVsbCk7XG4gICAgdGVtcGxhdGVWaXNpdEFsbCh0aGlzLCBhc3Qub3V0cHV0cyk7XG4gICAgdGVtcGxhdGVWaXNpdEFsbCh0aGlzLCBhc3QuZXhwb3J0QXNWYXJzKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFzdC5kaXJlY3RpdmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhc3QuZGlyZWN0aXZlc1tpXS52aXNpdCh0aGlzLCBpKTtcbiAgICB9XG4gICAgdGVtcGxhdGVWaXNpdEFsbCh0aGlzLCBhc3QuY2hpbGRyZW4pO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmlzaXROZ0NvbnRlbnQoYXN0OiBOZ0NvbnRlbnRBc3QsIGNvbnRleHQ6IGFueSk6IGFueSB7IHJldHVybiBudWxsOyB9XG5cbiAgdmlzaXRWYXJpYWJsZShhc3Q6IFZhcmlhYmxlQXN0LCBjb250ZXh0OiBhbnkpOiBhbnkge1xuICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKGFzdC5uYW1lKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZpc2l0RXZlbnQoYXN0OiBCb3VuZEV2ZW50QXN0LCBkaXJlY3RpdmVSZWNvcmQ6IERpcmVjdGl2ZVJlY29yZCk6IGFueSB7XG4gICAgdmFyIGJpbmRpbmdSZWNvcmQgPVxuICAgICAgICBpc1ByZXNlbnQoZGlyZWN0aXZlUmVjb3JkKSA/XG4gICAgICAgICAgICBCaW5kaW5nUmVjb3JkLmNyZWF0ZUZvckhvc3RFdmVudChhc3QuaGFuZGxlciwgYXN0LmZ1bGxOYW1lLCBkaXJlY3RpdmVSZWNvcmQpIDpcbiAgICAgICAgICAgIEJpbmRpbmdSZWNvcmQuY3JlYXRlRm9yRXZlbnQoYXN0LmhhbmRsZXIsIGFzdC5mdWxsTmFtZSwgdGhpcy5ib3VuZEVsZW1lbnRDb3VudCAtIDEpO1xuICAgIHRoaXMuZXZlbnRSZWNvcmRzLnB1c2goYmluZGluZ1JlY29yZCk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2aXNpdEVsZW1lbnRQcm9wZXJ0eShhc3Q6IEJvdW5kRWxlbWVudFByb3BlcnR5QXN0LCBkaXJlY3RpdmVSZWNvcmQ6IERpcmVjdGl2ZVJlY29yZCk6IGFueSB7XG4gICAgdmFyIGJvdW5kRWxlbWVudEluZGV4ID0gdGhpcy5ib3VuZEVsZW1lbnRDb3VudCAtIDE7XG4gICAgdmFyIGRpckluZGV4ID0gaXNQcmVzZW50KGRpcmVjdGl2ZVJlY29yZCkgPyBkaXJlY3RpdmVSZWNvcmQuZGlyZWN0aXZlSW5kZXggOiBudWxsO1xuICAgIHZhciBiaW5kaW5nUmVjb3JkO1xuICAgIGlmIChhc3QudHlwZSA9PT0gUHJvcGVydHlCaW5kaW5nVHlwZS5Qcm9wZXJ0eSkge1xuICAgICAgYmluZGluZ1JlY29yZCA9XG4gICAgICAgICAgaXNQcmVzZW50KGRpckluZGV4KSA/XG4gICAgICAgICAgICAgIEJpbmRpbmdSZWNvcmQuY3JlYXRlRm9ySG9zdFByb3BlcnR5KGRpckluZGV4LCBhc3QudmFsdWUsIGFzdC5uYW1lKSA6XG4gICAgICAgICAgICAgIEJpbmRpbmdSZWNvcmQuY3JlYXRlRm9yRWxlbWVudFByb3BlcnR5KGFzdC52YWx1ZSwgYm91bmRFbGVtZW50SW5kZXgsIGFzdC5uYW1lKTtcbiAgICB9IGVsc2UgaWYgKGFzdC50eXBlID09PSBQcm9wZXJ0eUJpbmRpbmdUeXBlLkF0dHJpYnV0ZSkge1xuICAgICAgYmluZGluZ1JlY29yZCA9XG4gICAgICAgICAgaXNQcmVzZW50KGRpckluZGV4KSA/XG4gICAgICAgICAgICAgIEJpbmRpbmdSZWNvcmQuY3JlYXRlRm9ySG9zdEF0dHJpYnV0ZShkaXJJbmRleCwgYXN0LnZhbHVlLCBhc3QubmFtZSkgOlxuICAgICAgICAgICAgICBCaW5kaW5nUmVjb3JkLmNyZWF0ZUZvckVsZW1lbnRBdHRyaWJ1dGUoYXN0LnZhbHVlLCBib3VuZEVsZW1lbnRJbmRleCwgYXN0Lm5hbWUpO1xuICAgIH0gZWxzZSBpZiAoYXN0LnR5cGUgPT09IFByb3BlcnR5QmluZGluZ1R5cGUuQ2xhc3MpIHtcbiAgICAgIGJpbmRpbmdSZWNvcmQgPVxuICAgICAgICAgIGlzUHJlc2VudChkaXJJbmRleCkgP1xuICAgICAgICAgICAgICBCaW5kaW5nUmVjb3JkLmNyZWF0ZUZvckhvc3RDbGFzcyhkaXJJbmRleCwgYXN0LnZhbHVlLCBhc3QubmFtZSkgOlxuICAgICAgICAgICAgICBCaW5kaW5nUmVjb3JkLmNyZWF0ZUZvckVsZW1lbnRDbGFzcyhhc3QudmFsdWUsIGJvdW5kRWxlbWVudEluZGV4LCBhc3QubmFtZSk7XG4gICAgfSBlbHNlIGlmIChhc3QudHlwZSA9PT0gUHJvcGVydHlCaW5kaW5nVHlwZS5TdHlsZSkge1xuICAgICAgYmluZGluZ1JlY29yZCA9XG4gICAgICAgICAgaXNQcmVzZW50KGRpckluZGV4KSA/XG4gICAgICAgICAgICAgIEJpbmRpbmdSZWNvcmQuY3JlYXRlRm9ySG9zdFN0eWxlKGRpckluZGV4LCBhc3QudmFsdWUsIGFzdC5uYW1lLCBhc3QudW5pdCkgOlxuICAgICAgICAgICAgICBCaW5kaW5nUmVjb3JkLmNyZWF0ZUZvckVsZW1lbnRTdHlsZShhc3QudmFsdWUsIGJvdW5kRWxlbWVudEluZGV4LCBhc3QubmFtZSwgYXN0LnVuaXQpO1xuICAgIH1cbiAgICB0aGlzLmJpbmRpbmdSZWNvcmRzLnB1c2goYmluZGluZ1JlY29yZCk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmlzaXRBdHRyKGFzdDogQXR0ckFzdCwgY29udGV4dDogYW55KTogYW55IHsgcmV0dXJuIG51bGw7IH1cbiAgdmlzaXRCb3VuZFRleHQoYXN0OiBCb3VuZFRleHRBc3QsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgdmFyIGJvdW5kVGV4dEluZGV4ID0gdGhpcy5ib3VuZFRleHRDb3VudCsrO1xuICAgIHRoaXMuYmluZGluZ1JlY29yZHMucHVzaChCaW5kaW5nUmVjb3JkLmNyZWF0ZUZvclRleHROb2RlKGFzdC52YWx1ZSwgYm91bmRUZXh0SW5kZXgpKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2aXNpdFRleHQoYXN0OiBUZXh0QXN0LCBjb250ZXh0OiBhbnkpOiBhbnkgeyByZXR1cm4gbnVsbDsgfVxuICB2aXNpdERpcmVjdGl2ZShhc3Q6IERpcmVjdGl2ZUFzdCwgZGlyZWN0aXZlSW5kZXhBc051bWJlcjogbnVtYmVyKTogYW55IHtcbiAgICB2YXIgZGlyZWN0aXZlSW5kZXggPSBuZXcgRGlyZWN0aXZlSW5kZXgodGhpcy5ib3VuZEVsZW1lbnRDb3VudCAtIDEsIGRpcmVjdGl2ZUluZGV4QXNOdW1iZXIpO1xuICAgIHZhciBkaXJlY3RpdmVNZXRhZGF0YSA9IGFzdC5kaXJlY3RpdmU7XG4gICAgdmFyIGRpcmVjdGl2ZVJlY29yZCA9IG5ldyBEaXJlY3RpdmVSZWNvcmQoe1xuICAgICAgZGlyZWN0aXZlSW5kZXg6IGRpcmVjdGl2ZUluZGV4LFxuICAgICAgY2FsbEFmdGVyQ29udGVudEluaXQ6XG4gICAgICAgICAgZGlyZWN0aXZlTWV0YWRhdGEubGlmZWN5Y2xlSG9va3MuaW5kZXhPZihMaWZlY3ljbGVIb29rcy5BZnRlckNvbnRlbnRJbml0KSAhPT0gLTEsXG4gICAgICBjYWxsQWZ0ZXJDb250ZW50Q2hlY2tlZDpcbiAgICAgICAgICBkaXJlY3RpdmVNZXRhZGF0YS5saWZlY3ljbGVIb29rcy5pbmRleE9mKExpZmVjeWNsZUhvb2tzLkFmdGVyQ29udGVudENoZWNrZWQpICE9PSAtMSxcbiAgICAgIGNhbGxBZnRlclZpZXdJbml0OlxuICAgICAgICAgIGRpcmVjdGl2ZU1ldGFkYXRhLmxpZmVjeWNsZUhvb2tzLmluZGV4T2YoTGlmZWN5Y2xlSG9va3MuQWZ0ZXJWaWV3SW5pdCkgIT09IC0xLFxuICAgICAgY2FsbEFmdGVyVmlld0NoZWNrZWQ6XG4gICAgICAgICAgZGlyZWN0aXZlTWV0YWRhdGEubGlmZWN5Y2xlSG9va3MuaW5kZXhPZihMaWZlY3ljbGVIb29rcy5BZnRlclZpZXdDaGVja2VkKSAhPT0gLTEsXG4gICAgICBjYWxsT25DaGFuZ2VzOiBkaXJlY3RpdmVNZXRhZGF0YS5saWZlY3ljbGVIb29rcy5pbmRleE9mKExpZmVjeWNsZUhvb2tzLk9uQ2hhbmdlcykgIT09IC0xLFxuICAgICAgY2FsbERvQ2hlY2s6IGRpcmVjdGl2ZU1ldGFkYXRhLmxpZmVjeWNsZUhvb2tzLmluZGV4T2YoTGlmZWN5Y2xlSG9va3MuRG9DaGVjaykgIT09IC0xLFxuICAgICAgY2FsbE9uSW5pdDogZGlyZWN0aXZlTWV0YWRhdGEubGlmZWN5Y2xlSG9va3MuaW5kZXhPZihMaWZlY3ljbGVIb29rcy5PbkluaXQpICE9PSAtMSxcbiAgICAgIGNoYW5nZURldGVjdGlvbjogZGlyZWN0aXZlTWV0YWRhdGEuY2hhbmdlRGV0ZWN0aW9uXG4gICAgfSk7XG4gICAgdGhpcy5kaXJlY3RpdmVSZWNvcmRzLnB1c2goZGlyZWN0aXZlUmVjb3JkKTtcblxuICAgIHRlbXBsYXRlVmlzaXRBbGwodGhpcywgYXN0LmlucHV0cywgZGlyZWN0aXZlUmVjb3JkKTtcbiAgICB2YXIgYmluZGluZ1JlY29yZHMgPSB0aGlzLmJpbmRpbmdSZWNvcmRzO1xuICAgIGlmIChkaXJlY3RpdmVSZWNvcmQuY2FsbE9uQ2hhbmdlcykge1xuICAgICAgYmluZGluZ1JlY29yZHMucHVzaChCaW5kaW5nUmVjb3JkLmNyZWF0ZURpcmVjdGl2ZU9uQ2hhbmdlcyhkaXJlY3RpdmVSZWNvcmQpKTtcbiAgICB9XG4gICAgaWYgKGRpcmVjdGl2ZVJlY29yZC5jYWxsT25Jbml0KSB7XG4gICAgICBiaW5kaW5nUmVjb3Jkcy5wdXNoKEJpbmRpbmdSZWNvcmQuY3JlYXRlRGlyZWN0aXZlT25Jbml0KGRpcmVjdGl2ZVJlY29yZCkpO1xuICAgIH1cbiAgICBpZiAoZGlyZWN0aXZlUmVjb3JkLmNhbGxEb0NoZWNrKSB7XG4gICAgICBiaW5kaW5nUmVjb3Jkcy5wdXNoKEJpbmRpbmdSZWNvcmQuY3JlYXRlRGlyZWN0aXZlRG9DaGVjayhkaXJlY3RpdmVSZWNvcmQpKTtcbiAgICB9XG4gICAgdGVtcGxhdGVWaXNpdEFsbCh0aGlzLCBhc3QuaG9zdFByb3BlcnRpZXMsIGRpcmVjdGl2ZVJlY29yZCk7XG4gICAgdGVtcGxhdGVWaXNpdEFsbCh0aGlzLCBhc3QuaG9zdEV2ZW50cywgZGlyZWN0aXZlUmVjb3JkKTtcbiAgICB0ZW1wbGF0ZVZpc2l0QWxsKHRoaXMsIGFzdC5leHBvcnRBc1ZhcnMpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZpc2l0RGlyZWN0aXZlUHJvcGVydHkoYXN0OiBCb3VuZERpcmVjdGl2ZVByb3BlcnR5QXN0LCBkaXJlY3RpdmVSZWNvcmQ6IERpcmVjdGl2ZVJlY29yZCk6IGFueSB7XG4gICAgLy8gVE9ETzogdGhlc2Ugc2V0dGVycyBzaG91bGQgZXZlbnR1YWxseSBiZSBjcmVhdGVkIGJ5IGNoYW5nZSBkZXRlY3Rpb24sIHRvIG1ha2VcbiAgICAvLyBpdCBtb25vbW9ycGhpYyFcbiAgICB2YXIgc2V0dGVyID0gcmVmbGVjdG9yLnNldHRlcihhc3QuZGlyZWN0aXZlTmFtZSk7XG4gICAgdGhpcy5iaW5kaW5nUmVjb3Jkcy5wdXNoKFxuICAgICAgICBCaW5kaW5nUmVjb3JkLmNyZWF0ZUZvckRpcmVjdGl2ZShhc3QudmFsdWUsIGFzdC5kaXJlY3RpdmVOYW1lLCBzZXR0ZXIsIGRpcmVjdGl2ZVJlY29yZCkpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cblxuZnVuY3Rpb24gY3JlYXRlQ2hhbmdlRGVmaW5pdGlvbnMocHZWaXNpdG9yczogUHJvdG9WaWV3VmlzaXRvcltdLCBjb21wb25lbnRUeXBlOiBDb21waWxlVHlwZU1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuQ29uZmlnOiBDaGFuZ2VEZXRlY3RvckdlbkNvbmZpZyk6IENoYW5nZURldGVjdG9yRGVmaW5pdGlvbltdIHtcbiAgdmFyIHB2VmFyaWFibGVOYW1lcyA9IF9jb2xsZWN0TmVzdGVkUHJvdG9WaWV3c1ZhcmlhYmxlTmFtZXMocHZWaXNpdG9ycyk7XG4gIHJldHVybiBwdlZpc2l0b3JzLm1hcChwdlZpc2l0b3IgPT4ge1xuICAgIHZhciBpZCA9IGAke2NvbXBvbmVudFR5cGUubmFtZX1fJHtwdlZpc2l0b3Iudmlld0luZGV4fWA7XG4gICAgcmV0dXJuIG5ldyBDaGFuZ2VEZXRlY3RvckRlZmluaXRpb24oXG4gICAgICAgIGlkLCBwdlZpc2l0b3Iuc3RyYXRlZ3ksIHB2VmFyaWFibGVOYW1lc1twdlZpc2l0b3Iudmlld0luZGV4XSwgcHZWaXNpdG9yLmJpbmRpbmdSZWNvcmRzLFxuICAgICAgICBwdlZpc2l0b3IuZXZlbnRSZWNvcmRzLCBwdlZpc2l0b3IuZGlyZWN0aXZlUmVjb3JkcywgZ2VuQ29uZmlnKTtcblxuICB9KTtcbn1cblxuZnVuY3Rpb24gX2NvbGxlY3ROZXN0ZWRQcm90b1ZpZXdzVmFyaWFibGVOYW1lcyhwdlZpc2l0b3JzOiBQcm90b1ZpZXdWaXNpdG9yW10pOiBzdHJpbmdbXVtdIHtcbiAgdmFyIG5lc3RlZFB2VmFyaWFibGVOYW1lczogc3RyaW5nW11bXSA9IExpc3RXcmFwcGVyLmNyZWF0ZUZpeGVkU2l6ZShwdlZpc2l0b3JzLmxlbmd0aCk7XG4gIHB2VmlzaXRvcnMuZm9yRWFjaCgocHYpID0+IHtcbiAgICB2YXIgcGFyZW50VmFyaWFibGVOYW1lczogc3RyaW5nW10gPVxuICAgICAgICBpc1ByZXNlbnQocHYucGFyZW50KSA/IG5lc3RlZFB2VmFyaWFibGVOYW1lc1twdi5wYXJlbnQudmlld0luZGV4XSA6IFtdO1xuICAgIG5lc3RlZFB2VmFyaWFibGVOYW1lc1twdi52aWV3SW5kZXhdID0gcGFyZW50VmFyaWFibGVOYW1lcy5jb25jYXQocHYudmFyaWFibGVOYW1lcyk7XG4gIH0pO1xuICByZXR1cm4gbmVzdGVkUHZWYXJpYWJsZU5hbWVzO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbXBpbGVyL2NoYW5nZV9kZWZpbml0aW9uX2ZhY3RvcnkudHNcbiAqKi8iLCJpbXBvcnQge0FTVH0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9jaGFuZ2VfZGV0ZWN0aW9uJztcbmltcG9ydCB7aXNQcmVzZW50fSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtDb21waWxlRGlyZWN0aXZlTWV0YWRhdGF9IGZyb20gJy4vZGlyZWN0aXZlX21ldGFkYXRhJztcbmltcG9ydCB7UGFyc2VTb3VyY2VTcGFufSBmcm9tICcuL3BhcnNlX3V0aWwnO1xuXG4vKipcbiAqIEFuIEFic3RyYWN0IFN5bnRheCBUcmVlIG5vZGUgcmVwcmVzZW50aW5nIHBhcnQgb2YgYSBwYXJzZWQgQW5ndWxhciB0ZW1wbGF0ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUZW1wbGF0ZUFzdCB7XG4gIC8qKlxuICAgKiBUaGUgc291cmNlIHNwYW4gZnJvbSB3aGljaCB0aGlzIG5vZGUgd2FzIHBhcnNlZC5cbiAgICovXG4gIHNvdXJjZVNwYW46IFBhcnNlU291cmNlU3BhbjtcblxuICAvKipcbiAgICogVmlzaXQgdGhpcyBub2RlIGFuZCBwb3NzaWJseSB0cmFuc2Zvcm0gaXQuXG4gICAqL1xuICB2aXNpdCh2aXNpdG9yOiBUZW1wbGF0ZUFzdFZpc2l0b3IsIGNvbnRleHQ6IGFueSk6IGFueTtcbn1cblxuLyoqXG4gKiBBIHNlZ21lbnQgb2YgdGV4dCB3aXRoaW4gdGhlIHRlbXBsYXRlLlxuICovXG5leHBvcnQgY2xhc3MgVGV4dEFzdCBpbXBsZW1lbnRzIFRlbXBsYXRlQXN0IHtcbiAgY29uc3RydWN0b3IocHVibGljIHZhbHVlOiBzdHJpbmcsIHB1YmxpYyBuZ0NvbnRlbnRJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICBwdWJsaWMgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuKSB7fVxuICB2aXNpdCh2aXNpdG9yOiBUZW1wbGF0ZUFzdFZpc2l0b3IsIGNvbnRleHQ6IGFueSk6IGFueSB7IHJldHVybiB2aXNpdG9yLnZpc2l0VGV4dCh0aGlzLCBjb250ZXh0KTsgfVxufVxuXG4vKipcbiAqIEEgYm91bmQgZXhwcmVzc2lvbiB3aXRoaW4gdGhlIHRleHQgb2YgYSB0ZW1wbGF0ZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEJvdW5kVGV4dEFzdCBpbXBsZW1lbnRzIFRlbXBsYXRlQXN0IHtcbiAgY29uc3RydWN0b3IocHVibGljIHZhbHVlOiBBU1QsIHB1YmxpYyBuZ0NvbnRlbnRJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICBwdWJsaWMgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuKSB7fVxuICB2aXNpdCh2aXNpdG9yOiBUZW1wbGF0ZUFzdFZpc2l0b3IsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHZpc2l0b3IudmlzaXRCb3VuZFRleHQodGhpcywgY29udGV4dCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHBsYWluIGF0dHJpYnV0ZSBvbiBhbiBlbGVtZW50LlxuICovXG5leHBvcnQgY2xhc3MgQXR0ckFzdCBpbXBsZW1lbnRzIFRlbXBsYXRlQXN0IHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZywgcHVibGljIHZhbHVlOiBzdHJpbmcsIHB1YmxpYyBzb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4pIHt9XG4gIHZpc2l0KHZpc2l0b3I6IFRlbXBsYXRlQXN0VmlzaXRvciwgY29udGV4dDogYW55KTogYW55IHsgcmV0dXJuIHZpc2l0b3IudmlzaXRBdHRyKHRoaXMsIGNvbnRleHQpOyB9XG59XG5cbi8qKlxuICogQSBiaW5kaW5nIGZvciBhbiBlbGVtZW50IHByb3BlcnR5IChlLmcuIGBbcHJvcGVydHldPVwiZXhwcmVzc2lvblwiYCkuXG4gKi9cbmV4cG9ydCBjbGFzcyBCb3VuZEVsZW1lbnRQcm9wZXJ0eUFzdCBpbXBsZW1lbnRzIFRlbXBsYXRlQXN0IHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZywgcHVibGljIHR5cGU6IFByb3BlcnR5QmluZGluZ1R5cGUsIHB1YmxpYyB2YWx1ZTogQVNULFxuICAgICAgICAgICAgICBwdWJsaWMgdW5pdDogc3RyaW5nLCBwdWJsaWMgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuKSB7fVxuICB2aXNpdCh2aXNpdG9yOiBUZW1wbGF0ZUFzdFZpc2l0b3IsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHZpc2l0b3IudmlzaXRFbGVtZW50UHJvcGVydHkodGhpcywgY29udGV4dCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBIGJpbmRpbmcgZm9yIGFuIGVsZW1lbnQgZXZlbnQgKGUuZy4gYChldmVudCk9XCJoYW5kbGVyKClcImApLlxuICovXG5leHBvcnQgY2xhc3MgQm91bmRFdmVudEFzdCBpbXBsZW1lbnRzIFRlbXBsYXRlQXN0IHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZywgcHVibGljIHRhcmdldDogc3RyaW5nLCBwdWJsaWMgaGFuZGxlcjogQVNULFxuICAgICAgICAgICAgICBwdWJsaWMgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuKSB7fVxuICB2aXNpdCh2aXNpdG9yOiBUZW1wbGF0ZUFzdFZpc2l0b3IsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHZpc2l0b3IudmlzaXRFdmVudCh0aGlzLCBjb250ZXh0KTtcbiAgfVxuICBnZXQgZnVsbE5hbWUoKSB7XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLnRhcmdldCkpIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLnRhcmdldH06JHt0aGlzLm5hbWV9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBIHZhcmlhYmxlIGRlY2xhcmF0aW9uIG9uIGFuIGVsZW1lbnQgKGUuZy4gYCN2YXI9XCJleHByZXNzaW9uXCJgKS5cbiAqL1xuZXhwb3J0IGNsYXNzIFZhcmlhYmxlQXN0IGltcGxlbWVudHMgVGVtcGxhdGVBc3Qge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nLCBwdWJsaWMgdmFsdWU6IHN0cmluZywgcHVibGljIHNvdXJjZVNwYW46IFBhcnNlU291cmNlU3Bhbikge31cbiAgdmlzaXQodmlzaXRvcjogVGVtcGxhdGVBc3RWaXNpdG9yLCBjb250ZXh0OiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB2aXNpdG9yLnZpc2l0VmFyaWFibGUodGhpcywgY29udGV4dCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBbiBlbGVtZW50IGRlY2xhcmF0aW9uIGluIGEgdGVtcGxhdGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBFbGVtZW50QXN0IGltcGxlbWVudHMgVGVtcGxhdGVBc3Qge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nLCBwdWJsaWMgYXR0cnM6IEF0dHJBc3RbXSxcbiAgICAgICAgICAgICAgcHVibGljIGlucHV0czogQm91bmRFbGVtZW50UHJvcGVydHlBc3RbXSwgcHVibGljIG91dHB1dHM6IEJvdW5kRXZlbnRBc3RbXSxcbiAgICAgICAgICAgICAgcHVibGljIGV4cG9ydEFzVmFyczogVmFyaWFibGVBc3RbXSwgcHVibGljIGRpcmVjdGl2ZXM6IERpcmVjdGl2ZUFzdFtdLFxuICAgICAgICAgICAgICBwdWJsaWMgY2hpbGRyZW46IFRlbXBsYXRlQXN0W10sIHB1YmxpYyBuZ0NvbnRlbnRJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICBwdWJsaWMgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuKSB7fVxuICB2aXNpdCh2aXNpdG9yOiBUZW1wbGF0ZUFzdFZpc2l0b3IsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHZpc2l0b3IudmlzaXRFbGVtZW50KHRoaXMsIGNvbnRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGVsZW1lbnQgaGFzIGFueSBhY3RpdmUgYmluZGluZ3MgKGlucHV0cywgb3V0cHV0cywgdmFycywgb3IgZGlyZWN0aXZlcykuXG4gICAqL1xuICBpc0JvdW5kKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy5pbnB1dHMubGVuZ3RoID4gMCB8fCB0aGlzLm91dHB1dHMubGVuZ3RoID4gMCB8fCB0aGlzLmV4cG9ydEFzVmFycy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZXMubGVuZ3RoID4gMCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjb21wb25lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZWxlbWVudCwgaWYgYW55LlxuICAgKi9cbiAgZ2V0Q29tcG9uZW50KCk6IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YSB7XG4gICAgcmV0dXJuIHRoaXMuZGlyZWN0aXZlcy5sZW5ndGggPiAwICYmIHRoaXMuZGlyZWN0aXZlc1swXS5kaXJlY3RpdmUuaXNDb21wb25lbnQgP1xuICAgICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVzWzBdLmRpcmVjdGl2ZSA6XG4gICAgICAgICAgICAgICBudWxsO1xuICB9XG59XG5cbi8qKlxuICogQSBgPHRlbXBsYXRlPmAgZWxlbWVudCBpbmNsdWRlZCBpbiBhbiBBbmd1bGFyIHRlbXBsYXRlLlxuICovXG5leHBvcnQgY2xhc3MgRW1iZWRkZWRUZW1wbGF0ZUFzdCBpbXBsZW1lbnRzIFRlbXBsYXRlQXN0IHtcbiAgY29uc3RydWN0b3IocHVibGljIGF0dHJzOiBBdHRyQXN0W10sIHB1YmxpYyBvdXRwdXRzOiBCb3VuZEV2ZW50QXN0W10sIHB1YmxpYyB2YXJzOiBWYXJpYWJsZUFzdFtdLFxuICAgICAgICAgICAgICBwdWJsaWMgZGlyZWN0aXZlczogRGlyZWN0aXZlQXN0W10sIHB1YmxpYyBjaGlsZHJlbjogVGVtcGxhdGVBc3RbXSxcbiAgICAgICAgICAgICAgcHVibGljIG5nQ29udGVudEluZGV4OiBudW1iZXIsIHB1YmxpYyBzb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4pIHt9XG4gIHZpc2l0KHZpc2l0b3I6IFRlbXBsYXRlQXN0VmlzaXRvciwgY29udGV4dDogYW55KTogYW55IHtcbiAgICByZXR1cm4gdmlzaXRvci52aXNpdEVtYmVkZGVkVGVtcGxhdGUodGhpcywgY29udGV4dCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBIGRpcmVjdGl2ZSBwcm9wZXJ0eSB3aXRoIGEgYm91bmQgdmFsdWUgKGUuZy4gYCpuZ0lmPVwiY29uZGl0aW9uXCIpLlxuICovXG5leHBvcnQgY2xhc3MgQm91bmREaXJlY3RpdmVQcm9wZXJ0eUFzdCBpbXBsZW1lbnRzIFRlbXBsYXRlQXN0IHtcbiAgY29uc3RydWN0b3IocHVibGljIGRpcmVjdGl2ZU5hbWU6IHN0cmluZywgcHVibGljIHRlbXBsYXRlTmFtZTogc3RyaW5nLCBwdWJsaWMgdmFsdWU6IEFTVCxcbiAgICAgICAgICAgICAgcHVibGljIHNvdXJjZVNwYW46IFBhcnNlU291cmNlU3Bhbikge31cbiAgdmlzaXQodmlzaXRvcjogVGVtcGxhdGVBc3RWaXNpdG9yLCBjb250ZXh0OiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB2aXNpdG9yLnZpc2l0RGlyZWN0aXZlUHJvcGVydHkodGhpcywgY29udGV4dCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBIGRpcmVjdGl2ZSBkZWNsYXJlZCBvbiBhbiBlbGVtZW50LlxuICovXG5leHBvcnQgY2xhc3MgRGlyZWN0aXZlQXN0IGltcGxlbWVudHMgVGVtcGxhdGVBc3Qge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZGlyZWN0aXZlOiBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGEsXG4gICAgICAgICAgICAgIHB1YmxpYyBpbnB1dHM6IEJvdW5kRGlyZWN0aXZlUHJvcGVydHlBc3RbXSxcbiAgICAgICAgICAgICAgcHVibGljIGhvc3RQcm9wZXJ0aWVzOiBCb3VuZEVsZW1lbnRQcm9wZXJ0eUFzdFtdLCBwdWJsaWMgaG9zdEV2ZW50czogQm91bmRFdmVudEFzdFtdLFxuICAgICAgICAgICAgICBwdWJsaWMgZXhwb3J0QXNWYXJzOiBWYXJpYWJsZUFzdFtdLCBwdWJsaWMgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuKSB7fVxuICB2aXNpdCh2aXNpdG9yOiBUZW1wbGF0ZUFzdFZpc2l0b3IsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHZpc2l0b3IudmlzaXREaXJlY3RpdmUodGhpcywgY29udGV4dCk7XG4gIH1cbn1cblxuLyoqXG4gKiBQb3NpdGlvbiB3aGVyZSBjb250ZW50IGlzIHRvIGJlIHByb2plY3RlZCAoaW5zdGFuY2Ugb2YgYDxuZy1jb250ZW50PmAgaW4gYSB0ZW1wbGF0ZSkuXG4gKi9cbmV4cG9ydCBjbGFzcyBOZ0NvbnRlbnRBc3QgaW1wbGVtZW50cyBUZW1wbGF0ZUFzdCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBpbmRleDogbnVtYmVyLCBwdWJsaWMgbmdDb250ZW50SW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgcHVibGljIHNvdXJjZVNwYW46IFBhcnNlU291cmNlU3Bhbikge31cbiAgdmlzaXQodmlzaXRvcjogVGVtcGxhdGVBc3RWaXNpdG9yLCBjb250ZXh0OiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB2aXNpdG9yLnZpc2l0TmdDb250ZW50KHRoaXMsIGNvbnRleHQpO1xuICB9XG59XG5cbi8qKlxuICogRW51bWVyYXRpb24gb2YgdHlwZXMgb2YgcHJvcGVydHkgYmluZGluZ3MuXG4gKi9cbmV4cG9ydCBlbnVtIFByb3BlcnR5QmluZGluZ1R5cGUge1xuXG4gIC8qKlxuICAgKiBBIG5vcm1hbCBiaW5kaW5nIHRvIGEgcHJvcGVydHkgKGUuZy4gYFtwcm9wZXJ0eV09XCJleHByZXNzaW9uXCJgKS5cbiAgICovXG4gIFByb3BlcnR5LFxuXG4gIC8qKlxuICAgKiBBIGJpbmRpbmcgdG8gYW4gZWxlbWVudCBhdHRyaWJ1dGUgKGUuZy4gYFthdHRyLm5hbWVdPVwiZXhwcmVzc2lvblwiYCkuXG4gICAqL1xuICBBdHRyaWJ1dGUsXG5cbiAgLyoqXG4gICAqIEEgYmluZGluZyB0byBhIENTUyBjbGFzcyAoZS5nLiBgW2NsYXNzLm5hbWVdPVwiY29uZGl0aW9uXCJgKS5cbiAgICovXG4gIENsYXNzLFxuXG4gIC8qKlxuICAgKiBBIGJpbmRpbmcgdG8gYSBzdHlsZSBydWxlIChlLmcuIGBbc3R5bGUucnVsZV09XCJleHByZXNzaW9uXCJgKS5cbiAgICovXG4gIFN0eWxlXG59XG5cbi8qKlxuICogQSB2aXNpdG9yIGZvciB7QGxpbmsgVGVtcGxhdGVBc3R9IHRyZWVzIHRoYXQgd2lsbCBwcm9jZXNzIGVhY2ggbm9kZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUZW1wbGF0ZUFzdFZpc2l0b3Ige1xuICB2aXNpdE5nQ29udGVudChhc3Q6IE5nQ29udGVudEFzdCwgY29udGV4dDogYW55KTogYW55O1xuICB2aXNpdEVtYmVkZGVkVGVtcGxhdGUoYXN0OiBFbWJlZGRlZFRlbXBsYXRlQXN0LCBjb250ZXh0OiBhbnkpOiBhbnk7XG4gIHZpc2l0RWxlbWVudChhc3Q6IEVsZW1lbnRBc3QsIGNvbnRleHQ6IGFueSk6IGFueTtcbiAgdmlzaXRWYXJpYWJsZShhc3Q6IFZhcmlhYmxlQXN0LCBjb250ZXh0OiBhbnkpOiBhbnk7XG4gIHZpc2l0RXZlbnQoYXN0OiBCb3VuZEV2ZW50QXN0LCBjb250ZXh0OiBhbnkpOiBhbnk7XG4gIHZpc2l0RWxlbWVudFByb3BlcnR5KGFzdDogQm91bmRFbGVtZW50UHJvcGVydHlBc3QsIGNvbnRleHQ6IGFueSk6IGFueTtcbiAgdmlzaXRBdHRyKGFzdDogQXR0ckFzdCwgY29udGV4dDogYW55KTogYW55O1xuICB2aXNpdEJvdW5kVGV4dChhc3Q6IEJvdW5kVGV4dEFzdCwgY29udGV4dDogYW55KTogYW55O1xuICB2aXNpdFRleHQoYXN0OiBUZXh0QXN0LCBjb250ZXh0OiBhbnkpOiBhbnk7XG4gIHZpc2l0RGlyZWN0aXZlKGFzdDogRGlyZWN0aXZlQXN0LCBjb250ZXh0OiBhbnkpOiBhbnk7XG4gIHZpc2l0RGlyZWN0aXZlUHJvcGVydHkoYXN0OiBCb3VuZERpcmVjdGl2ZVByb3BlcnR5QXN0LCBjb250ZXh0OiBhbnkpOiBhbnk7XG59XG5cbi8qKlxuICogVmlzaXQgZXZlcnkgbm9kZSBpbiBhIGxpc3Qgb2Yge0BsaW5rIFRlbXBsYXRlQXN0fXMgd2l0aCB0aGUgZ2l2ZW4ge0BsaW5rIFRlbXBsYXRlQXN0VmlzaXRvcn0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZW1wbGF0ZVZpc2l0QWxsKHZpc2l0b3I6IFRlbXBsYXRlQXN0VmlzaXRvciwgYXN0czogVGVtcGxhdGVBc3RbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IGFueSA9IG51bGwpOiBhbnlbXSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgYXN0cy5mb3JFYWNoKGFzdCA9PiB7XG4gICAgdmFyIGFzdFJlc3VsdCA9IGFzdC52aXNpdCh2aXNpdG9yLCBjb250ZXh0KTtcbiAgICBpZiAoaXNQcmVzZW50KGFzdFJlc3VsdCkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGFzdFJlc3VsdCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21waWxlci90ZW1wbGF0ZV9hc3QudHNcbiAqKi8iLCJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvckRlZmluaXRpb24sXG59IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vY2hhbmdlX2RldGVjdGlvbic7XG5cbi8vIE5vdGU6IFRoaXMgY2xhc3MgaXMgb25seSBoZXJlIHNvIHRoYXQgd2UgY2FuIHJlZmVyZW5jZSBpdCBmcm9tIFR5cGVTY3JpcHQgY29kZS5cbi8vIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gbGl2ZXMgdW5kZXIgbW9kdWxlc19kYXJ0LlxuLy8gVE9ETyh0Ym9zY2gpOiBNb3ZlIHRoZSBjb3JyZXNwb25kaW5nIGNvZGUgaW50byBhbmd1bGFyMi9zcmMvY29tcGlsZXIgb25jZVxuLy8gdGhlIG5ldyBjb21waWxlciBpcyBkb25lLlxuZXhwb3J0IGNsYXNzIENvZGVnZW4ge1xuICBjb25zdHJ1Y3Rvcihtb2R1bGVBbGlhczogc3RyaW5nKSB7fVxuICBnZW5lcmF0ZSh0eXBlTmFtZTogc3RyaW5nLCBjaGFuZ2VEZXRlY3RvclR5cGVOYW1lOiBzdHJpbmcsIGRlZjogQ2hhbmdlRGV0ZWN0b3JEZWZpbml0aW9uKTogdm9pZCB7XG4gICAgdGhyb3cgXCJOb3QgaW1wbGVtZW50ZWQgaW4gSlNcIjtcbiAgfVxuICB0b1N0cmluZygpOiBzdHJpbmcgeyB0aHJvdyBcIk5vdCBpbXBsZW1lbnRlZCBpbiBKU1wiOyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvdHJhbnNmb3JtL3RlbXBsYXRlX2NvbXBpbGVyL2NoYW5nZV9kZXRlY3Rvcl9jb2RlZ2VuLnRzXG4gKiovIiwiaW1wb3J0IHtDb21waWxlVHlwZU1ldGFkYXRhLCBDb21waWxlVGVtcGxhdGVNZXRhZGF0YX0gZnJvbSAnLi9kaXJlY3RpdmVfbWV0YWRhdGEnO1xuaW1wb3J0IHtTb3VyY2VNb2R1bGUsIFNvdXJjZUV4cHJlc3Npb24sIG1vZHVsZVJlZn0gZnJvbSAnLi9zb3VyY2VfbW9kdWxlJztcbmltcG9ydCB7Vmlld0VuY2Fwc3VsYXRpb259IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL21ldGFkYXRhL3ZpZXcnO1xuaW1wb3J0IHtYSFJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb21waWxlci94aHInO1xuaW1wb3J0IHtJU19EQVJULCBTdHJpbmdXcmFwcGVyLCBpc0JsYW5rfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtQcm9taXNlV3JhcHBlciwgUHJvbWlzZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9hc3luYyc7XG5pbXBvcnQge1NoYWRvd0Nzc30gZnJvbSAnYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3NoYWRvd19jc3MnO1xuaW1wb3J0IHtVcmxSZXNvbHZlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3VybF9yZXNvbHZlcic7XG5pbXBvcnQge2V4dHJhY3RTdHlsZVVybHN9IGZyb20gJy4vc3R5bGVfdXJsX3Jlc29sdmVyJztcbmltcG9ydCB7XG4gIGVzY2FwZVNpbmdsZVF1b3RlU3RyaW5nLFxuICBjb2RlR2VuRXhwb3J0VmFyaWFibGUsXG4gIGNvZGVHZW5Ub1N0cmluZyxcbiAgTU9EVUxFX1NVRkZJWFxufSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5pbXBvcnQge0NPTVBPTkVOVF9WQVJJQUJMRSwgSE9TVF9BVFRSLCBDT05URU5UX0FUVFJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL3JlbmRlci92aWV3X2ZhY3RvcnknO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgU3R5bGVDb21waWxlciB7XG4gIHByaXZhdGUgX3N0eWxlQ2FjaGU6IE1hcDxzdHJpbmcsIFByb21pc2U8c3RyaW5nW10+PiA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHN0cmluZ1tdPj4oKTtcbiAgcHJpdmF0ZSBfc2hhZG93Q3NzOiBTaGFkb3dDc3MgPSBuZXcgU2hhZG93Q3NzKCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfeGhyOiBYSFIsIHByaXZhdGUgX3VybFJlc29sdmVyOiBVcmxSZXNvbHZlcikge31cblxuICBjb21waWxlQ29tcG9uZW50UnVudGltZSh0ZW1wbGF0ZTogQ29tcGlsZVRlbXBsYXRlTWV0YWRhdGEpOiBQcm9taXNlPEFycmF5PHN0cmluZyB8IGFueVtdPj4ge1xuICAgIHZhciBzdHlsZXMgPSB0ZW1wbGF0ZS5zdHlsZXM7XG4gICAgdmFyIHN0eWxlQWJzVXJscyA9IHRlbXBsYXRlLnN0eWxlVXJscztcbiAgICByZXR1cm4gdGhpcy5fbG9hZFN0eWxlcyhzdHlsZXMsIHN0eWxlQWJzVXJscyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZS5lbmNhcHN1bGF0aW9uID09PSBWaWV3RW5jYXBzdWxhdGlvbi5FbXVsYXRlZCk7XG4gIH1cblxuICBjb21waWxlQ29tcG9uZW50Q29kZUdlbih0ZW1wbGF0ZTogQ29tcGlsZVRlbXBsYXRlTWV0YWRhdGEpOiBTb3VyY2VFeHByZXNzaW9uIHtcbiAgICB2YXIgc2hpbSA9IHRlbXBsYXRlLmVuY2Fwc3VsYXRpb24gPT09IFZpZXdFbmNhcHN1bGF0aW9uLkVtdWxhdGVkO1xuICAgIHJldHVybiB0aGlzLl9zdHlsZUNvZGVHZW4odGVtcGxhdGUuc3R5bGVzLCB0ZW1wbGF0ZS5zdHlsZVVybHMsIHNoaW0pO1xuICB9XG5cbiAgY29tcGlsZVN0eWxlc2hlZXRDb2RlR2VuKHN0eWxlc2hlZXRVcmw6IHN0cmluZywgY3NzVGV4dDogc3RyaW5nKTogU291cmNlTW9kdWxlW10ge1xuICAgIHZhciBzdHlsZVdpdGhJbXBvcnRzID0gZXh0cmFjdFN0eWxlVXJscyh0aGlzLl91cmxSZXNvbHZlciwgc3R5bGVzaGVldFVybCwgY3NzVGV4dCk7XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMuX3N0eWxlTW9kdWxlKFxuICAgICAgICAgIHN0eWxlc2hlZXRVcmwsIGZhbHNlLFxuICAgICAgICAgIHRoaXMuX3N0eWxlQ29kZUdlbihbc3R5bGVXaXRoSW1wb3J0cy5zdHlsZV0sIHN0eWxlV2l0aEltcG9ydHMuc3R5bGVVcmxzLCBmYWxzZSkpLFxuICAgICAgdGhpcy5fc3R5bGVNb2R1bGUoc3R5bGVzaGVldFVybCwgdHJ1ZSwgdGhpcy5fc3R5bGVDb2RlR2VuKFtzdHlsZVdpdGhJbXBvcnRzLnN0eWxlXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZVdpdGhJbXBvcnRzLnN0eWxlVXJscywgdHJ1ZSkpXG4gICAgXTtcbiAgfVxuXG4gIGNsZWFyQ2FjaGUoKSB7IHRoaXMuX3N0eWxlQ2FjaGUuY2xlYXIoKTsgfVxuXG4gIHByaXZhdGUgX2xvYWRTdHlsZXMocGxhaW5TdHlsZXM6IHN0cmluZ1tdLCBhYnNVcmxzOiBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICAgICAgICBlbmNhcHN1bGF0ZTogYm9vbGVhbik6IFByb21pc2U8QXJyYXk8c3RyaW5nIHwgYW55W10+PiB7XG4gICAgdmFyIHByb21pc2VzID0gYWJzVXJscy5tYXAoKGFic1VybCkgPT4ge1xuICAgICAgdmFyIGNhY2hlS2V5ID0gYCR7YWJzVXJsfSR7ZW5jYXBzdWxhdGUgPyAnLnNoaW0nIDogJyd9YDtcbiAgICAgIHZhciByZXN1bHQgPSB0aGlzLl9zdHlsZUNhY2hlLmdldChjYWNoZUtleSk7XG4gICAgICBpZiAoaXNCbGFuayhyZXN1bHQpKSB7XG4gICAgICAgIHJlc3VsdCA9IHRoaXMuX3hoci5nZXQoYWJzVXJsKS50aGVuKChzdHlsZSkgPT4ge1xuICAgICAgICAgIHZhciBzdHlsZVdpdGhJbXBvcnRzID0gZXh0cmFjdFN0eWxlVXJscyh0aGlzLl91cmxSZXNvbHZlciwgYWJzVXJsLCBzdHlsZSk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRTdHlsZXMoW3N0eWxlV2l0aEltcG9ydHMuc3R5bGVdLCBzdHlsZVdpdGhJbXBvcnRzLnN0eWxlVXJscyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNhcHN1bGF0ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9zdHlsZUNhY2hlLnNldChjYWNoZUtleSwgcmVzdWx0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIFByb21pc2VXcmFwcGVyLmFsbChwcm9taXNlcykudGhlbigobmVzdGVkU3R5bGVzOiBzdHJpbmdbXVtdKSA9PiB7XG4gICAgICB2YXIgcmVzdWx0OiBBcnJheTxzdHJpbmcgfCBhbnlbXT4gPVxuICAgICAgICAgIHBsYWluU3R5bGVzLm1hcChwbGFpblN0eWxlID0+IHRoaXMuX3NoaW1JZk5lZWRlZChwbGFpblN0eWxlLCBlbmNhcHN1bGF0ZSkpO1xuICAgICAgbmVzdGVkU3R5bGVzLmZvckVhY2goc3R5bGVzID0+IHJlc3VsdC5wdXNoKHN0eWxlcykpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3N0eWxlQ29kZUdlbihwbGFpblN0eWxlczogc3RyaW5nW10sIGFic1VybHM6IHN0cmluZ1tdLCBzaGltOiBib29sZWFuKTogU291cmNlRXhwcmVzc2lvbiB7XG4gICAgdmFyIGFycmF5UHJlZml4ID0gSVNfREFSVCA/IGBjb25zdGAgOiAnJztcbiAgICB2YXIgc3R5bGVFeHByZXNzaW9ucyA9IHBsYWluU3R5bGVzLm1hcChcbiAgICAgICAgcGxhaW5TdHlsZSA9PiBlc2NhcGVTaW5nbGVRdW90ZVN0cmluZyh0aGlzLl9zaGltSWZOZWVkZWQocGxhaW5TdHlsZSwgc2hpbSkpKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWJzVXJscy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG1vZHVsZVVybCA9IHRoaXMuX2NyZWF0ZU1vZHVsZVVybChhYnNVcmxzW2ldLCBzaGltKTtcbiAgICAgIHN0eWxlRXhwcmVzc2lvbnMucHVzaChgJHttb2R1bGVSZWYobW9kdWxlVXJsKX1TVFlMRVNgKTtcbiAgICB9XG4gICAgdmFyIGV4cHJlc3Npb25Tb3VyY2UgPSBgJHthcnJheVByZWZpeH0gWyR7c3R5bGVFeHByZXNzaW9ucy5qb2luKCcsJyl9XWA7XG4gICAgcmV0dXJuIG5ldyBTb3VyY2VFeHByZXNzaW9uKFtdLCBleHByZXNzaW9uU291cmNlKTtcbiAgfVxuXG4gIHByaXZhdGUgX3N0eWxlTW9kdWxlKHN0eWxlc2hlZXRVcmw6IHN0cmluZywgc2hpbTogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogU291cmNlRXhwcmVzc2lvbik6IFNvdXJjZU1vZHVsZSB7XG4gICAgdmFyIG1vZHVsZVNvdXJjZSA9IGBcbiAgICAgICR7ZXhwcmVzc2lvbi5kZWNsYXJhdGlvbnMuam9pbignXFxuJyl9XG4gICAgICAke2NvZGVHZW5FeHBvcnRWYXJpYWJsZSgnU1RZTEVTJyl9JHtleHByZXNzaW9uLmV4cHJlc3Npb259O1xuICAgIGA7XG4gICAgcmV0dXJuIG5ldyBTb3VyY2VNb2R1bGUodGhpcy5fY3JlYXRlTW9kdWxlVXJsKHN0eWxlc2hlZXRVcmwsIHNoaW0pLCBtb2R1bGVTb3VyY2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2hpbUlmTmVlZGVkKHN0eWxlOiBzdHJpbmcsIHNoaW06IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIHJldHVybiBzaGltID8gdGhpcy5fc2hhZG93Q3NzLnNoaW1Dc3NUZXh0KHN0eWxlLCBDT05URU5UX0FUVFIsIEhPU1RfQVRUUikgOiBzdHlsZTtcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZU1vZHVsZVVybChzdHlsZXNoZWV0VXJsOiBzdHJpbmcsIHNoaW06IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIHJldHVybiBzaGltID8gYCR7c3R5bGVzaGVldFVybH0uc2hpbSR7TU9EVUxFX1NVRkZJWH1gIDogYCR7c3R5bGVzaGVldFVybH0ke01PRFVMRV9TVUZGSVh9YDtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3N0eWxlX2NvbXBpbGVyLnRzXG4gKiovIiwiaW1wb3J0IHtMaXN0V3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcbmltcG9ydCB7XG4gIFN0cmluZ1dyYXBwZXIsXG4gIFJlZ0V4cCxcbiAgUmVnRXhwV3JhcHBlcixcbiAgUmVnRXhwTWF0Y2hlcldyYXBwZXIsXG4gIGlzUHJlc2VudCxcbiAgaXNCbGFua1xufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuXG4vKipcbiAqIFRoaXMgZmlsZSBpcyBhIHBvcnQgb2Ygc2hhZG93Q1NTIGZyb20gd2ViY29tcG9uZW50cy5qcyB0byBUeXBlU2NyaXB0LlxuICpcbiAqIFBsZWFzZSBtYWtlIHN1cmUgdG8ga2VlcCB0byBlZGl0cyBpbiBzeW5jIHdpdGggdGhlIHNvdXJjZSBmaWxlLlxuICpcbiAqIFNvdXJjZTpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJjb21wb25lbnRzL3dlYmNvbXBvbmVudHNqcy9ibG9iLzRlZmVjZDdlMGUvc3JjL1NoYWRvd0NTUy9TaGFkb3dDU1MuanNcbiAqXG4gKiBUaGUgb3JpZ2luYWwgZmlsZSBsZXZlbCBjb21tZW50IGlzIHJlcHJvZHVjZWQgYmVsb3dcbiAqL1xuXG4vKlxuICBUaGlzIGlzIGEgbGltaXRlZCBzaGltIGZvciBTaGFkb3dET00gY3NzIHN0eWxpbmcuXG4gIGh0dHBzOi8vZHZjcy53My5vcmcvaGcvd2ViY29tcG9uZW50cy9yYXctZmlsZS90aXAvc3BlYy9zaGFkb3cvaW5kZXguaHRtbCNzdHlsZXNcblxuICBUaGUgaW50ZW50aW9uIGhlcmUgaXMgdG8gc3VwcG9ydCBvbmx5IHRoZSBzdHlsaW5nIGZlYXR1cmVzIHdoaWNoIGNhbiBiZVxuICByZWxhdGl2ZWx5IHNpbXBseSBpbXBsZW1lbnRlZC4gVGhlIGdvYWwgaXMgdG8gYWxsb3cgdXNlcnMgdG8gYXZvaWQgdGhlXG4gIG1vc3Qgb2J2aW91cyBwaXRmYWxscyBhbmQgZG8gc28gd2l0aG91dCBjb21wcm9taXNpbmcgcGVyZm9ybWFuY2Ugc2lnbmlmaWNhbnRseS5cbiAgRm9yIFNoYWRvd0RPTSBzdHlsaW5nIHRoYXQncyBub3QgY292ZXJlZCBoZXJlLCBhIHNldCBvZiBiZXN0IHByYWN0aWNlc1xuICBjYW4gYmUgcHJvdmlkZWQgdGhhdCBzaG91bGQgYWxsb3cgdXNlcnMgdG8gYWNjb21wbGlzaCBtb3JlIGNvbXBsZXggc3R5bGluZy5cblxuICBUaGUgZm9sbG93aW5nIGlzIGEgbGlzdCBvZiBzcGVjaWZpYyBTaGFkb3dET00gc3R5bGluZyBmZWF0dXJlcyBhbmQgYSBicmllZlxuICBkaXNjdXNzaW9uIG9mIHRoZSBhcHByb2FjaCB1c2VkIHRvIHNoaW0uXG5cbiAgU2hpbW1lZCBmZWF0dXJlczpcblxuICAqIDpob3N0LCA6aG9zdC1jb250ZXh0OiBTaGFkb3dET00gYWxsb3dzIHN0eWxpbmcgb2YgdGhlIHNoYWRvd1Jvb3QncyBob3N0XG4gIGVsZW1lbnQgdXNpbmcgdGhlIDpob3N0IHJ1bGUuIFRvIHNoaW0gdGhpcyBmZWF0dXJlLCB0aGUgOmhvc3Qgc3R5bGVzIGFyZVxuICByZWZvcm1hdHRlZCBhbmQgcHJlZml4ZWQgd2l0aCBhIGdpdmVuIHNjb3BlIG5hbWUgYW5kIHByb21vdGVkIHRvIGFcbiAgZG9jdW1lbnQgbGV2ZWwgc3R5bGVzaGVldC5cbiAgRm9yIGV4YW1wbGUsIGdpdmVuIGEgc2NvcGUgbmFtZSBvZiAuZm9vLCBhIHJ1bGUgbGlrZSB0aGlzOlxuXG4gICAgOmhvc3Qge1xuICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gIGJlY29tZXM6XG5cbiAgICAuZm9vIHtcbiAgICAgIGJhY2tncm91bmQ6IHJlZDtcbiAgICB9XG5cbiAgKiBlbmNhcHN1bHRpb246IFN0eWxlcyBkZWZpbmVkIHdpdGhpbiBTaGFkb3dET00sIGFwcGx5IG9ubHkgdG9cbiAgZG9tIGluc2lkZSB0aGUgU2hhZG93RE9NLiBQb2x5bWVyIHVzZXMgb25lIG9mIHR3byB0ZWNobmlxdWVzIHRvIGltbGVtZW50XG4gIHRoaXMgZmVhdHVyZS5cblxuICBCeSBkZWZhdWx0LCBydWxlcyBhcmUgcHJlZml4ZWQgd2l0aCB0aGUgaG9zdCBlbGVtZW50IHRhZyBuYW1lXG4gIGFzIGEgZGVzY2VuZGFudCBzZWxlY3Rvci4gVGhpcyBlbnN1cmVzIHN0eWxpbmcgZG9lcyBub3QgbGVhayBvdXQgb2YgdGhlICd0b3AnXG4gIG9mIHRoZSBlbGVtZW50J3MgU2hhZG93RE9NLiBGb3IgZXhhbXBsZSxcblxuICBkaXYge1xuICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgfVxuXG4gIGJlY29tZXM6XG5cbiAgeC1mb28gZGl2IHtcbiAgICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuICAgIH1cblxuICBiZWNvbWVzOlxuXG5cbiAgQWx0ZXJuYXRpdmVseSwgaWYgV2ViQ29tcG9uZW50cy5TaGFkb3dDU1Muc3RyaWN0U3R5bGluZyBpcyBzZXQgdG8gdHJ1ZSB0aGVuXG4gIHNlbGVjdG9ycyBhcmUgc2NvcGVkIGJ5IGFkZGluZyBhbiBhdHRyaWJ1dGUgc2VsZWN0b3Igc3VmZml4IHRvIGVhY2hcbiAgc2ltcGxlIHNlbGVjdG9yIHRoYXQgY29udGFpbnMgdGhlIGhvc3QgZWxlbWVudCB0YWcgbmFtZS4gRWFjaCBlbGVtZW50XG4gIGluIHRoZSBlbGVtZW50J3MgU2hhZG93RE9NIHRlbXBsYXRlIGlzIGFsc28gZ2l2ZW4gdGhlIHNjb3BlIGF0dHJpYnV0ZS5cbiAgVGh1cywgdGhlc2UgcnVsZXMgbWF0Y2ggb25seSBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHNjb3BlIGF0dHJpYnV0ZS5cbiAgRm9yIGV4YW1wbGUsIGdpdmVuIGEgc2NvcGUgbmFtZSBvZiB4LWZvbywgYSBydWxlIGxpa2UgdGhpczpcblxuICAgIGRpdiB7XG4gICAgICBmb250LXdlaWdodDogYm9sZDtcbiAgICB9XG5cbiAgYmVjb21lczpcblxuICAgIGRpdlt4LWZvb10ge1xuICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgfVxuXG4gIE5vdGUgdGhhdCBlbGVtZW50cyB0aGF0IGFyZSBkeW5hbWljYWxseSBhZGRlZCB0byBhIHNjb3BlIG11c3QgaGF2ZSB0aGUgc2NvcGVcbiAgc2VsZWN0b3IgYWRkZWQgdG8gdGhlbSBtYW51YWxseS5cblxuICAqIHVwcGVyL2xvd2VyIGJvdW5kIGVuY2Fwc3VsYXRpb246IFN0eWxlcyB3aGljaCBhcmUgZGVmaW5lZCBvdXRzaWRlIGFcbiAgc2hhZG93Um9vdCBzaG91bGQgbm90IGNyb3NzIHRoZSBTaGFkb3dET00gYm91bmRhcnkgYW5kIHNob3VsZCBub3QgYXBwbHlcbiAgaW5zaWRlIGEgc2hhZG93Um9vdC5cblxuICBUaGlzIHN0eWxpbmcgYmVoYXZpb3IgaXMgbm90IGVtdWxhdGVkLiBTb21lIHBvc3NpYmxlIHdheXMgdG8gZG8gdGhpcyB0aGF0XG4gIHdlcmUgcmVqZWN0ZWQgZHVlIHRvIGNvbXBsZXhpdHkgYW5kL29yIHBlcmZvcm1hbmNlIGNvbmNlcm5zIGluY2x1ZGU6ICgxKSByZXNldFxuICBldmVyeSBwb3NzaWJsZSBwcm9wZXJ0eSBmb3IgZXZlcnkgcG9zc2libGUgc2VsZWN0b3IgZm9yIGEgZ2l2ZW4gc2NvcGUgbmFtZTtcbiAgKDIpIHJlLWltcGxlbWVudCBjc3MgaW4gamF2YXNjcmlwdC5cblxuICBBcyBhbiBhbHRlcm5hdGl2ZSwgdXNlcnMgc2hvdWxkIG1ha2Ugc3VyZSB0byB1c2Ugc2VsZWN0b3JzXG4gIHNwZWNpZmljIHRvIHRoZSBzY29wZSBpbiB3aGljaCB0aGV5IGFyZSB3b3JraW5nLlxuXG4gICogOjpkaXN0cmlidXRlZDogVGhpcyBiZWhhdmlvciBpcyBub3QgZW11bGF0ZWQuIEl0J3Mgb2Z0ZW4gbm90IG5lY2Vzc2FyeVxuICB0byBzdHlsZSB0aGUgY29udGVudHMgb2YgYSBzcGVjaWZpYyBpbnNlcnRpb24gcG9pbnQgYW5kIGluc3RlYWQsIGRlc2NlbmRhbnRzXG4gIG9mIHRoZSBob3N0IGVsZW1lbnQgY2FuIGJlIHN0eWxlZCBzZWxlY3RpdmVseS4gVXNlcnMgY2FuIGFsc28gY3JlYXRlIGFuXG4gIGV4dHJhIG5vZGUgYXJvdW5kIGFuIGluc2VydGlvbiBwb2ludCBhbmQgc3R5bGUgdGhhdCBub2RlJ3MgY29udGVudHNcbiAgdmlhIGRlc2NlbmRlbnQgc2VsZWN0b3JzLiBGb3IgZXhhbXBsZSwgd2l0aCBhIHNoYWRvd1Jvb3QgbGlrZSB0aGlzOlxuXG4gICAgPHN0eWxlPlxuICAgICAgOjpjb250ZW50KGRpdikge1xuICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7XG4gICAgICB9XG4gICAgPC9zdHlsZT5cbiAgICA8Y29udGVudD48L2NvbnRlbnQ+XG5cbiAgY291bGQgYmVjb21lOlxuXG4gICAgPHN0eWxlPlxuICAgICAgLyAqQHBvbHlmaWxsIC5jb250ZW50LWNvbnRhaW5lciBkaXYgKiAvXG4gICAgICA6OmNvbnRlbnQoZGl2KSB7XG4gICAgICAgIGJhY2tncm91bmQ6IHJlZDtcbiAgICAgIH1cbiAgICA8L3N0eWxlPlxuICAgIDxkaXYgY2xhc3M9XCJjb250ZW50LWNvbnRhaW5lclwiPlxuICAgICAgPGNvbnRlbnQ+PC9jb250ZW50PlxuICAgIDwvZGl2PlxuXG4gIE5vdGUgdGhlIHVzZSBvZiBAcG9seWZpbGwgaW4gdGhlIGNvbW1lbnQgYWJvdmUgYSBTaGFkb3dET00gc3BlY2lmaWMgc3R5bGVcbiAgZGVjbGFyYXRpb24uIFRoaXMgaXMgYSBkaXJlY3RpdmUgdG8gdGhlIHN0eWxpbmcgc2hpbSB0byB1c2UgdGhlIHNlbGVjdG9yXG4gIGluIGNvbW1lbnRzIGluIGxpZXUgb2YgdGhlIG5leHQgc2VsZWN0b3Igd2hlbiBydW5uaW5nIHVuZGVyIHBvbHlmaWxsLlxuKi9cblxuZXhwb3J0IGNsYXNzIFNoYWRvd0NzcyB7XG4gIHN0cmljdFN0eWxpbmc6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICAvKlxuICAqIFNoaW0gc29tZSBjc3NUZXh0IHdpdGggdGhlIGdpdmVuIHNlbGVjdG9yLiBSZXR1cm5zIGNzc1RleHQgdGhhdCBjYW5cbiAgKiBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnQgdmlhIFdlYkNvbXBvbmVudHMuU2hhZG93Q1NTLmFkZENzc1RvRG9jdW1lbnQoY3NzKS5cbiAgKlxuICAqIFdoZW4gc3RyaWN0U3R5bGluZyBpcyB0cnVlOlxuICAqIC0gc2VsZWN0b3IgaXMgdGhlIGF0dHJpYnV0ZSBhZGRlZCB0byBhbGwgZWxlbWVudHMgaW5zaWRlIHRoZSBob3N0LFxuICAqIC0gaG9zdFNlbGVjdG9yIGlzIHRoZSBhdHRyaWJ1dGUgYWRkZWQgdG8gdGhlIGhvc3QgaXRzZWxmLlxuICAqL1xuICBzaGltQ3NzVGV4dChjc3NUZXh0OiBzdHJpbmcsIHNlbGVjdG9yOiBzdHJpbmcsIGhvc3RTZWxlY3Rvcjogc3RyaW5nID0gJycpOiBzdHJpbmcge1xuICAgIGNzc1RleHQgPSBzdHJpcENvbW1lbnRzKGNzc1RleHQpO1xuICAgIGNzc1RleHQgPSB0aGlzLl9pbnNlcnREaXJlY3RpdmVzKGNzc1RleHQpO1xuICAgIHJldHVybiB0aGlzLl9zY29wZUNzc1RleHQoY3NzVGV4dCwgc2VsZWN0b3IsIGhvc3RTZWxlY3Rvcik7XG4gIH1cblxuICBwcml2YXRlIF9pbnNlcnREaXJlY3RpdmVzKGNzc1RleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY3NzVGV4dCA9IHRoaXMuX2luc2VydFBvbHlmaWxsRGlyZWN0aXZlc0luQ3NzVGV4dChjc3NUZXh0KTtcbiAgICByZXR1cm4gdGhpcy5faW5zZXJ0UG9seWZpbGxSdWxlc0luQ3NzVGV4dChjc3NUZXh0KTtcbiAgfVxuXG4gIC8qXG4gICAqIFByb2Nlc3Mgc3R5bGVzIHRvIGNvbnZlcnQgbmF0aXZlIFNoYWRvd0RPTSBydWxlcyB0aGF0IHdpbGwgdHJpcFxuICAgKiB1cCB0aGUgY3NzIHBhcnNlcjsgd2UgcmVseSBvbiBkZWNvcmF0aW5nIHRoZSBzdHlsZXNoZWV0IHdpdGggaW5lcnQgcnVsZXMuXG4gICAqXG4gICAqIEZvciBleGFtcGxlLCB3ZSBjb252ZXJ0IHRoaXMgcnVsZTpcbiAgICpcbiAgICogcG9seWZpbGwtbmV4dC1zZWxlY3RvciB7IGNvbnRlbnQ6ICc6aG9zdCBtZW51LWl0ZW0nOyB9XG4gICAqIDo6Y29udGVudCBtZW51LWl0ZW0ge1xuICAgKlxuICAgKiB0byB0aGlzOlxuICAgKlxuICAgKiBzY29wZU5hbWUgbWVudS1pdGVtIHtcbiAgICpcbiAgKiovXG4gIHByaXZhdGUgX2luc2VydFBvbHlmaWxsRGlyZWN0aXZlc0luQ3NzVGV4dChjc3NUZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIERpZmZlcmVuY2Ugd2l0aCB3ZWJjb21wb25lbnRzLmpzOiBkb2VzIG5vdCBoYW5kbGUgY29tbWVudHNcbiAgICByZXR1cm4gU3RyaW5nV3JhcHBlci5yZXBsYWNlQWxsTWFwcGVkKGNzc1RleHQsIF9jc3NDb250ZW50TmV4dFNlbGVjdG9yUmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihtKSB7IHJldHVybiBtWzFdICsgJ3snOyB9KTtcbiAgfVxuXG4gIC8qXG4gICAqIFByb2Nlc3Mgc3R5bGVzIHRvIGFkZCBydWxlcyB3aGljaCB3aWxsIG9ubHkgYXBwbHkgdW5kZXIgdGhlIHBvbHlmaWxsXG4gICAqXG4gICAqIEZvciBleGFtcGxlLCB3ZSBjb252ZXJ0IHRoaXMgcnVsZTpcbiAgICpcbiAgICogcG9seWZpbGwtcnVsZSB7XG4gICAqICAgY29udGVudDogJzpob3N0IG1lbnUtaXRlbSc7XG4gICAqIC4uLlxuICAgKiB9XG4gICAqXG4gICAqIHRvIHRoaXM6XG4gICAqXG4gICAqIHNjb3BlTmFtZSBtZW51LWl0ZW0gey4uLn1cbiAgICpcbiAgKiovXG4gIHByaXZhdGUgX2luc2VydFBvbHlmaWxsUnVsZXNJbkNzc1RleHQoY3NzVGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBEaWZmZXJlbmNlIHdpdGggd2ViY29tcG9uZW50cy5qczogZG9lcyBub3QgaGFuZGxlIGNvbW1lbnRzXG4gICAgcmV0dXJuIFN0cmluZ1dyYXBwZXIucmVwbGFjZUFsbE1hcHBlZChjc3NUZXh0LCBfY3NzQ29udGVudFJ1bGVSZSwgZnVuY3Rpb24obSkge1xuICAgICAgdmFyIHJ1bGUgPSBtWzBdO1xuICAgICAgcnVsZSA9IFN0cmluZ1dyYXBwZXIucmVwbGFjZShydWxlLCBtWzFdLCAnJyk7XG4gICAgICBydWxlID0gU3RyaW5nV3JhcHBlci5yZXBsYWNlKHJ1bGUsIG1bMl0sICcnKTtcbiAgICAgIHJldHVybiBtWzNdICsgcnVsZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qIEVuc3VyZSBzdHlsZXMgYXJlIHNjb3BlZC4gUHNldWRvLXNjb3BpbmcgdGFrZXMgYSBydWxlIGxpa2U6XG4gICAqXG4gICAqICAuZm9vIHsuLi4gfVxuICAgKlxuICAgKiAgYW5kIGNvbnZlcnRzIHRoaXMgdG9cbiAgICpcbiAgICogIHNjb3BlTmFtZSAuZm9vIHsgLi4uIH1cbiAgKi9cbiAgcHJpdmF0ZSBfc2NvcGVDc3NUZXh0KGNzc1RleHQ6IHN0cmluZywgc2NvcGVTZWxlY3Rvcjogc3RyaW5nLCBob3N0U2VsZWN0b3I6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdmFyIHVuc2NvcGVkID0gdGhpcy5fZXh0cmFjdFVuc2NvcGVkUnVsZXNGcm9tQ3NzVGV4dChjc3NUZXh0KTtcbiAgICBjc3NUZXh0ID0gdGhpcy5faW5zZXJ0UG9seWZpbGxIb3N0SW5Dc3NUZXh0KGNzc1RleHQpO1xuICAgIGNzc1RleHQgPSB0aGlzLl9jb252ZXJ0Q29sb25Ib3N0KGNzc1RleHQpO1xuICAgIGNzc1RleHQgPSB0aGlzLl9jb252ZXJ0Q29sb25Ib3N0Q29udGV4dChjc3NUZXh0KTtcbiAgICBjc3NUZXh0ID0gdGhpcy5fY29udmVydFNoYWRvd0RPTVNlbGVjdG9ycyhjc3NUZXh0KTtcbiAgICBpZiAoaXNQcmVzZW50KHNjb3BlU2VsZWN0b3IpKSB7XG4gICAgICBjc3NUZXh0ID0gdGhpcy5fc2NvcGVTZWxlY3RvcnMoY3NzVGV4dCwgc2NvcGVTZWxlY3RvciwgaG9zdFNlbGVjdG9yKTtcbiAgICB9XG4gICAgY3NzVGV4dCA9IGNzc1RleHQgKyAnXFxuJyArIHVuc2NvcGVkO1xuICAgIHJldHVybiBjc3NUZXh0LnRyaW0oKTtcbiAgfVxuXG4gIC8qXG4gICAqIFByb2Nlc3Mgc3R5bGVzIHRvIGFkZCBydWxlcyB3aGljaCB3aWxsIG9ubHkgYXBwbHkgdW5kZXIgdGhlIHBvbHlmaWxsXG4gICAqIGFuZCBkbyBub3QgcHJvY2VzcyB2aWEgQ1NTT00uIChDU1NPTSBpcyBkZXN0cnVjdGl2ZSB0byBydWxlcyBvbiByYXJlXG4gICAqIG9jY2FzaW9ucywgZS5nLiAtd2Via2l0LWNhbGMgb24gU2FmYXJpLilcbiAgICogRm9yIGV4YW1wbGUsIHdlIGNvbnZlcnQgdGhpcyBydWxlOlxuICAgKlxuICAgKiBAcG9seWZpbGwtdW5zY29wZWQtcnVsZSB7XG4gICAqICAgY29udGVudDogJ21lbnUtaXRlbSc7XG4gICAqIC4uLiB9XG4gICAqXG4gICAqIHRvIHRoaXM6XG4gICAqXG4gICAqIG1lbnUtaXRlbSB7Li4ufVxuICAgKlxuICAqKi9cbiAgcHJpdmF0ZSBfZXh0cmFjdFVuc2NvcGVkUnVsZXNGcm9tQ3NzVGV4dChjc3NUZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIERpZmZlcmVuY2Ugd2l0aCB3ZWJjb21wb25lbnRzLmpzOiBkb2VzIG5vdCBoYW5kbGUgY29tbWVudHNcbiAgICB2YXIgciA9ICcnLCBtO1xuICAgIHZhciBtYXRjaGVyID0gUmVnRXhwV3JhcHBlci5tYXRjaGVyKF9jc3NDb250ZW50VW5zY29wZWRSdWxlUmUsIGNzc1RleHQpO1xuICAgIHdoaWxlIChpc1ByZXNlbnQobSA9IFJlZ0V4cE1hdGNoZXJXcmFwcGVyLm5leHQobWF0Y2hlcikpKSB7XG4gICAgICB2YXIgcnVsZSA9IG1bMF07XG4gICAgICBydWxlID0gU3RyaW5nV3JhcHBlci5yZXBsYWNlKHJ1bGUsIG1bMl0sICcnKTtcbiAgICAgIHJ1bGUgPSBTdHJpbmdXcmFwcGVyLnJlcGxhY2UocnVsZSwgbVsxXSwgbVszXSk7XG4gICAgICByICs9IHJ1bGUgKyAnXFxuXFxuJztcbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH1cblxuICAvKlxuICAgKiBjb252ZXJ0IGEgcnVsZSBsaWtlIDpob3N0KC5mb28pID4gLmJhciB7IH1cbiAgICpcbiAgICogdG9cbiAgICpcbiAgICogc2NvcGVOYW1lLmZvbyA+IC5iYXJcbiAgKi9cbiAgcHJpdmF0ZSBfY29udmVydENvbG9uSG9zdChjc3NUZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb252ZXJ0Q29sb25SdWxlKGNzc1RleHQsIF9jc3NDb2xvbkhvc3RSZSwgdGhpcy5fY29sb25Ib3N0UGFydFJlcGxhY2VyKTtcbiAgfVxuXG4gIC8qXG4gICAqIGNvbnZlcnQgYSBydWxlIGxpa2UgOmhvc3QtY29udGV4dCguZm9vKSA+IC5iYXIgeyB9XG4gICAqXG4gICAqIHRvXG4gICAqXG4gICAqIHNjb3BlTmFtZS5mb28gPiAuYmFyLCAuZm9vIHNjb3BlTmFtZSA+IC5iYXIgeyB9XG4gICAqXG4gICAqIGFuZFxuICAgKlxuICAgKiA6aG9zdC1jb250ZXh0KC5mb286aG9zdCkgLmJhciB7IC4uLiB9XG4gICAqXG4gICAqIHRvXG4gICAqXG4gICAqIHNjb3BlTmFtZS5mb28gLmJhciB7IC4uLiB9XG4gICovXG4gIHByaXZhdGUgX2NvbnZlcnRDb2xvbkhvc3RDb250ZXh0KGNzc1RleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRDb2xvblJ1bGUoY3NzVGV4dCwgX2Nzc0NvbG9uSG9zdENvbnRleHRSZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb2xvbkhvc3RDb250ZXh0UGFydFJlcGxhY2VyKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbnZlcnRDb2xvblJ1bGUoY3NzVGV4dDogc3RyaW5nLCByZWdFeHA6IFJlZ0V4cCwgcGFydFJlcGxhY2VyOiBGdW5jdGlvbik6IHN0cmluZyB7XG4gICAgLy8gcDEgPSA6aG9zdCwgcDIgPSBjb250ZW50cyBvZiAoKSwgcDMgcmVzdCBvZiBydWxlXG4gICAgcmV0dXJuIFN0cmluZ1dyYXBwZXIucmVwbGFjZUFsbE1hcHBlZChjc3NUZXh0LCByZWdFeHAsIGZ1bmN0aW9uKG0pIHtcbiAgICAgIGlmIChpc1ByZXNlbnQobVsyXSkpIHtcbiAgICAgICAgdmFyIHBhcnRzID0gbVsyXS5zcGxpdCgnLCcpLCByID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgcCA9IHBhcnRzW2ldO1xuICAgICAgICAgIGlmIChpc0JsYW5rKHApKSBicmVhaztcbiAgICAgICAgICBwID0gcC50cmltKCk7XG4gICAgICAgICAgci5wdXNoKHBhcnRSZXBsYWNlcihfcG9seWZpbGxIb3N0Tm9Db21iaW5hdG9yLCBwLCBtWzNdKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHIuam9pbignLCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIF9wb2x5ZmlsbEhvc3ROb0NvbWJpbmF0b3IgKyBtWzNdO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29sb25Ib3N0Q29udGV4dFBhcnRSZXBsYWNlcihob3N0OiBzdHJpbmcsIHBhcnQ6IHN0cmluZywgc3VmZml4OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChTdHJpbmdXcmFwcGVyLmNvbnRhaW5zKHBhcnQsIF9wb2x5ZmlsbEhvc3QpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY29sb25Ib3N0UGFydFJlcGxhY2VyKGhvc3QsIHBhcnQsIHN1ZmZpeCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBob3N0ICsgcGFydCArIHN1ZmZpeCArICcsICcgKyBwYXJ0ICsgJyAnICsgaG9zdCArIHN1ZmZpeDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jb2xvbkhvc3RQYXJ0UmVwbGFjZXIoaG9zdDogc3RyaW5nLCBwYXJ0OiBzdHJpbmcsIHN1ZmZpeDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gaG9zdCArIFN0cmluZ1dyYXBwZXIucmVwbGFjZShwYXJ0LCBfcG9seWZpbGxIb3N0LCAnJykgKyBzdWZmaXg7XG4gIH1cblxuICAvKlxuICAgKiBDb252ZXJ0IGNvbWJpbmF0b3JzIGxpa2UgOjpzaGFkb3cgYW5kIHBzZXVkby1lbGVtZW50cyBsaWtlIDo6Y29udGVudFxuICAgKiBieSByZXBsYWNpbmcgd2l0aCBzcGFjZS5cbiAgKi9cbiAgcHJpdmF0ZSBfY29udmVydFNoYWRvd0RPTVNlbGVjdG9ycyhjc3NUZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgX3NoYWRvd0RPTVNlbGVjdG9yc1JlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjc3NUZXh0ID0gU3RyaW5nV3JhcHBlci5yZXBsYWNlQWxsKGNzc1RleHQsIF9zaGFkb3dET01TZWxlY3RvcnNSZVtpXSwgJyAnKTtcbiAgICB9XG4gICAgcmV0dXJuIGNzc1RleHQ7XG4gIH1cblxuICAvLyBjaGFuZ2UgYSBzZWxlY3RvciBsaWtlICdkaXYnIHRvICduYW1lIGRpdidcbiAgcHJpdmF0ZSBfc2NvcGVTZWxlY3RvcnMoY3NzVGV4dDogc3RyaW5nLCBzY29wZVNlbGVjdG9yOiBzdHJpbmcsIGhvc3RTZWxlY3Rvcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcHJvY2Vzc1J1bGVzKGNzc1RleHQsIChydWxlOiBDc3NSdWxlKSA9PiB7XG4gICAgICB2YXIgc2VsZWN0b3IgPSBydWxlLnNlbGVjdG9yO1xuICAgICAgdmFyIGNvbnRlbnQgPSBydWxlLmNvbnRlbnQ7XG4gICAgICBpZiAocnVsZS5zZWxlY3RvclswXSAhPSAnQCcgfHwgcnVsZS5zZWxlY3Rvci5zdGFydHNXaXRoKCdAcGFnZScpKSB7XG4gICAgICAgIHNlbGVjdG9yID1cbiAgICAgICAgICAgIHRoaXMuX3Njb3BlU2VsZWN0b3IocnVsZS5zZWxlY3Rvciwgc2NvcGVTZWxlY3RvciwgaG9zdFNlbGVjdG9yLCB0aGlzLnN0cmljdFN0eWxpbmcpO1xuICAgICAgfSBlbHNlIGlmIChydWxlLnNlbGVjdG9yLnN0YXJ0c1dpdGgoJ0BtZWRpYScpKSB7XG4gICAgICAgIGNvbnRlbnQgPSB0aGlzLl9zY29wZVNlbGVjdG9ycyhydWxlLmNvbnRlbnQsIHNjb3BlU2VsZWN0b3IsIGhvc3RTZWxlY3Rvcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IENzc1J1bGUoc2VsZWN0b3IsIGNvbnRlbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2NvcGVTZWxlY3RvcihzZWxlY3Rvcjogc3RyaW5nLCBzY29wZVNlbGVjdG9yOiBzdHJpbmcsIGhvc3RTZWxlY3Rvcjogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmljdDogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgdmFyIHIgPSBbXSwgcGFydHMgPSBzZWxlY3Rvci5zcGxpdCgnLCcpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwID0gcGFydHNbaV07XG4gICAgICBwID0gcC50cmltKCk7XG4gICAgICBpZiAodGhpcy5fc2VsZWN0b3JOZWVkc1Njb3BpbmcocCwgc2NvcGVTZWxlY3RvcikpIHtcbiAgICAgICAgcCA9IHN0cmljdCAmJiAhU3RyaW5nV3JhcHBlci5jb250YWlucyhwLCBfcG9seWZpbGxIb3N0Tm9Db21iaW5hdG9yKSA/XG4gICAgICAgICAgICAgICAgdGhpcy5fYXBwbHlTdHJpY3RTZWxlY3RvclNjb3BlKHAsIHNjb3BlU2VsZWN0b3IpIDpcbiAgICAgICAgICAgICAgICB0aGlzLl9hcHBseVNlbGVjdG9yU2NvcGUocCwgc2NvcGVTZWxlY3RvciwgaG9zdFNlbGVjdG9yKTtcbiAgICAgIH1cbiAgICAgIHIucHVzaChwKTtcbiAgICB9XG4gICAgcmV0dXJuIHIuam9pbignLCAnKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NlbGVjdG9yTmVlZHNTY29waW5nKHNlbGVjdG9yOiBzdHJpbmcsIHNjb3BlU2VsZWN0b3I6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHZhciByZSA9IHRoaXMuX21ha2VTY29wZU1hdGNoZXIoc2NvcGVTZWxlY3Rvcik7XG4gICAgcmV0dXJuICFpc1ByZXNlbnQoUmVnRXhwV3JhcHBlci5maXJzdE1hdGNoKHJlLCBzZWxlY3RvcikpO1xuICB9XG5cbiAgcHJpdmF0ZSBfbWFrZVNjb3BlTWF0Y2hlcihzY29wZVNlbGVjdG9yOiBzdHJpbmcpOiBSZWdFeHAge1xuICAgIHZhciBscmUgPSAvXFxbL2c7XG4gICAgdmFyIHJyZSA9IC9cXF0vZztcbiAgICBzY29wZVNlbGVjdG9yID0gU3RyaW5nV3JhcHBlci5yZXBsYWNlQWxsKHNjb3BlU2VsZWN0b3IsIGxyZSwgJ1xcXFxbJyk7XG4gICAgc2NvcGVTZWxlY3RvciA9IFN0cmluZ1dyYXBwZXIucmVwbGFjZUFsbChzY29wZVNlbGVjdG9yLCBycmUsICdcXFxcXScpO1xuICAgIHJldHVybiBSZWdFeHBXcmFwcGVyLmNyZWF0ZSgnXignICsgc2NvcGVTZWxlY3RvciArICcpJyArIF9zZWxlY3RvclJlU3VmZml4LCAnbScpO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXBwbHlTZWxlY3RvclNjb3BlKHNlbGVjdG9yOiBzdHJpbmcsIHNjb3BlU2VsZWN0b3I6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RTZWxlY3Rvcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBEaWZmZXJlbmNlIGZyb20gd2ViY29tcG9uZW50c2pzOiBzY29wZVNlbGVjdG9yIGNvdWxkIG5vdCBiZSBhbiBhcnJheVxuICAgIHJldHVybiB0aGlzLl9hcHBseVNpbXBsZVNlbGVjdG9yU2NvcGUoc2VsZWN0b3IsIHNjb3BlU2VsZWN0b3IsIGhvc3RTZWxlY3Rvcik7XG4gIH1cblxuICAvLyBzY29wZSB2aWEgbmFtZSBhbmQgW2lzPW5hbWVdXG4gIHByaXZhdGUgX2FwcGx5U2ltcGxlU2VsZWN0b3JTY29wZShzZWxlY3Rvcjogc3RyaW5nLCBzY29wZVNlbGVjdG9yOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0U2VsZWN0b3I6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGlzUHJlc2VudChSZWdFeHBXcmFwcGVyLmZpcnN0TWF0Y2goX3BvbHlmaWxsSG9zdFJlLCBzZWxlY3RvcikpKSB7XG4gICAgICB2YXIgcmVwbGFjZUJ5ID0gdGhpcy5zdHJpY3RTdHlsaW5nID8gYFske2hvc3RTZWxlY3Rvcn1dYCA6IHNjb3BlU2VsZWN0b3I7XG4gICAgICBzZWxlY3RvciA9IFN0cmluZ1dyYXBwZXIucmVwbGFjZShzZWxlY3RvciwgX3BvbHlmaWxsSG9zdE5vQ29tYmluYXRvciwgcmVwbGFjZUJ5KTtcbiAgICAgIHJldHVybiBTdHJpbmdXcmFwcGVyLnJlcGxhY2VBbGwoc2VsZWN0b3IsIF9wb2x5ZmlsbEhvc3RSZSwgcmVwbGFjZUJ5ICsgJyAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHNjb3BlU2VsZWN0b3IgKyAnICcgKyBzZWxlY3RvcjtcbiAgICB9XG4gIH1cblxuICAvLyByZXR1cm4gYSBzZWxlY3RvciB3aXRoIFtuYW1lXSBzdWZmaXggb24gZWFjaCBzaW1wbGUgc2VsZWN0b3JcbiAgLy8gZS5nLiAuZm9vLmJhciA+IC56b3QgYmVjb21lcyAuZm9vW25hbWVdLmJhcltuYW1lXSA+IC56b3RbbmFtZV0gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSBfYXBwbHlTdHJpY3RTZWxlY3RvclNjb3BlKHNlbGVjdG9yOiBzdHJpbmcsIHNjb3BlU2VsZWN0b3I6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdmFyIGlzUmUgPSAvXFxbaXM9KFteXFxdXSopXFxdL2c7XG4gICAgc2NvcGVTZWxlY3RvciA9IFN0cmluZ1dyYXBwZXIucmVwbGFjZUFsbE1hcHBlZChzY29wZVNlbGVjdG9yLCBpc1JlLCAobSkgPT4gbVsxXSk7XG4gICAgdmFyIHNwbGl0cyA9IFsnICcsICc+JywgJysnLCAnfiddLCBzY29wZWQgPSBzZWxlY3RvciwgYXR0ck5hbWUgPSAnWycgKyBzY29wZVNlbGVjdG9yICsgJ10nO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3BsaXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc2VwID0gc3BsaXRzW2ldO1xuICAgICAgdmFyIHBhcnRzID0gc2NvcGVkLnNwbGl0KHNlcCk7XG4gICAgICBzY29wZWQgPSBwYXJ0cy5tYXAocCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIDpob3N0IHNpbmNlIGl0IHNob3VsZCBiZSB1bm5lY2Vzc2FyeVxuICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gU3RyaW5nV3JhcHBlci5yZXBsYWNlQWxsKHAudHJpbSgpLCBfcG9seWZpbGxIb3N0UmUsICcnKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAodC5sZW5ndGggPiAwICYmICFMaXN0V3JhcHBlci5jb250YWlucyhzcGxpdHMsIHQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFTdHJpbmdXcmFwcGVyLmNvbnRhaW5zKHQsIGF0dHJOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlID0gLyhbXjpdKikoOiopKC4qKS9nO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG0gPSBSZWdFeHBXcmFwcGVyLmZpcnN0TWF0Y2gocmUsIHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUHJlc2VudChtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBwID0gbVsxXSArIGF0dHJOYW1lICsgbVsyXSArIG1bM107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgIC5qb2luKHNlcCk7XG4gICAgfVxuICAgIHJldHVybiBzY29wZWQ7XG4gIH1cblxuICBwcml2YXRlIF9pbnNlcnRQb2x5ZmlsbEhvc3RJbkNzc1RleHQoc2VsZWN0b3I6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgc2VsZWN0b3IgPSBTdHJpbmdXcmFwcGVyLnJlcGxhY2VBbGwoc2VsZWN0b3IsIF9jb2xvbkhvc3RDb250ZXh0UmUsIF9wb2x5ZmlsbEhvc3RDb250ZXh0KTtcbiAgICBzZWxlY3RvciA9IFN0cmluZ1dyYXBwZXIucmVwbGFjZUFsbChzZWxlY3RvciwgX2NvbG9uSG9zdFJlLCBfcG9seWZpbGxIb3N0KTtcbiAgICByZXR1cm4gc2VsZWN0b3I7XG4gIH1cbn1cbnZhciBfY3NzQ29udGVudE5leHRTZWxlY3RvclJlID1cbiAgICAvcG9seWZpbGwtbmV4dC1zZWxlY3RvcltefV0qY29udGVudDpbXFxzXSo/WydcIl0oLio/KVsnXCJdWztcXHNdKn0oW157XSo/KXsvZ2ltO1xudmFyIF9jc3NDb250ZW50UnVsZVJlID0gLyhwb2x5ZmlsbC1ydWxlKVtefV0qKGNvbnRlbnQ6W1xcc10qWydcIl0oLio/KVsnXCJdKVs7XFxzXSpbXn1dKn0vZ2ltO1xudmFyIF9jc3NDb250ZW50VW5zY29wZWRSdWxlUmUgPVxuICAgIC8ocG9seWZpbGwtdW5zY29wZWQtcnVsZSlbXn1dKihjb250ZW50OltcXHNdKlsnXCJdKC4qPylbJ1wiXSlbO1xcc10qW159XSp9L2dpbTtcbnZhciBfcG9seWZpbGxIb3N0ID0gJy1zaGFkb3djc3Nob3N0Jztcbi8vIG5vdGU6IDpob3N0LWNvbnRleHQgcHJlLXByb2Nlc3NlZCB0byAtc2hhZG93Y3NzaG9zdGNvbnRleHQuXG52YXIgX3BvbHlmaWxsSG9zdENvbnRleHQgPSAnLXNoYWRvd2Nzc2NvbnRleHQnO1xudmFyIF9wYXJlblN1ZmZpeCA9ICcpKD86XFxcXCgoJyArXG4gICAgICAgICAgICAgICAgICAgJyg/OlxcXFwoW14pKF0qXFxcXCl8W14pKF0qKSs/JyArXG4gICAgICAgICAgICAgICAgICAgJylcXFxcKSk/KFteLHtdKiknO1xudmFyIF9jc3NDb2xvbkhvc3RSZSA9IFJlZ0V4cFdyYXBwZXIuY3JlYXRlKCcoJyArIF9wb2x5ZmlsbEhvc3QgKyBfcGFyZW5TdWZmaXgsICdpbScpO1xudmFyIF9jc3NDb2xvbkhvc3RDb250ZXh0UmUgPSBSZWdFeHBXcmFwcGVyLmNyZWF0ZSgnKCcgKyBfcG9seWZpbGxIb3N0Q29udGV4dCArIF9wYXJlblN1ZmZpeCwgJ2ltJyk7XG52YXIgX3BvbHlmaWxsSG9zdE5vQ29tYmluYXRvciA9IF9wb2x5ZmlsbEhvc3QgKyAnLW5vLWNvbWJpbmF0b3InO1xudmFyIF9zaGFkb3dET01TZWxlY3RvcnNSZSA9IFtcbiAgLz4+Pi9nLFxuICAvOjpzaGFkb3cvZyxcbiAgLzo6Y29udGVudC9nLFxuICAvLyBEZXByZWNhdGVkIHNlbGVjdG9yc1xuICAvLyBUT0RPKHZpY2IpOiBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY2xhbmctZm9ybWF0L2lzc3Vlcy8xNlxuICAvLyBjbGFuZy1mb3JtYXQgb2ZmXG4gIC9cXC9kZWVwXFwvL2csICAgICAgICAgLy8gZm9ybWVyID4+PlxuICAvXFwvc2hhZG93LWRlZXBcXC8vZywgIC8vIGZvcm1lciAvZGVlcC9cbiAgL1xcL3NoYWRvd1xcLy9nLCAgICAgICAvLyBmb3JtZXIgOjpzaGFkb3dcbiAgLy8gY2xhbmYtZm9ybWF0IG9uXG5dO1xudmFyIF9zZWxlY3RvclJlU3VmZml4ID0gJyhbPlxcXFxzfitcXFsuLHs6XVtcXFxcc1xcXFxTXSopPyQnO1xudmFyIF9wb2x5ZmlsbEhvc3RSZSA9IFJlZ0V4cFdyYXBwZXIuY3JlYXRlKF9wb2x5ZmlsbEhvc3QsICdpbScpO1xudmFyIF9jb2xvbkhvc3RSZSA9IC86aG9zdC9naW07XG52YXIgX2NvbG9uSG9zdENvbnRleHRSZSA9IC86aG9zdC1jb250ZXh0L2dpbTtcblxudmFyIF9jb21tZW50UmUgPSAvXFwvXFwqW1xcc1xcU10qP1xcKlxcLy9nO1xuXG5mdW5jdGlvbiBzdHJpcENvbW1lbnRzKGlucHV0OnN0cmluZyk6c3RyaW5nIHtcbiAgcmV0dXJuIFN0cmluZ1dyYXBwZXIucmVwbGFjZUFsbE1hcHBlZChpbnB1dCwgX2NvbW1lbnRSZSwgKF8pID0+ICcnKTtcbn1cblxudmFyIF9ydWxlUmUgPSAvKFxccyopKFteO1xce1xcfV0rPykoXFxzKikoKD86eyVCTE9DSyV9P1xccyo7Pyl8KD86XFxzKjspKS9nO1xudmFyIF9jdXJseVJlID0gLyhbe31dKS9nO1xuY29uc3QgT1BFTl9DVVJMWSA9ICd7JztcbmNvbnN0IENMT1NFX0NVUkxZID0gJ30nO1xuY29uc3QgQkxPQ0tfUExBQ0VIT0xERVIgPSAnJUJMT0NLJSc7XG5cbmV4cG9ydCBjbGFzcyBDc3NSdWxlIHtcbiAgY29uc3RydWN0b3IocHVibGljIHNlbGVjdG9yOnN0cmluZywgcHVibGljIGNvbnRlbnQ6c3RyaW5nKSB7fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc1J1bGVzKGlucHV0OnN0cmluZywgcnVsZUNhbGxiYWNrOkZ1bmN0aW9uKTpzdHJpbmcge1xuICB2YXIgaW5wdXRXaXRoRXNjYXBlZEJsb2NrcyA9IGVzY2FwZUJsb2NrcyhpbnB1dCk7XG4gIHZhciBuZXh0QmxvY2tJbmRleCA9IDA7XG4gIHJldHVybiBTdHJpbmdXcmFwcGVyLnJlcGxhY2VBbGxNYXBwZWQoaW5wdXRXaXRoRXNjYXBlZEJsb2Nrcy5lc2NhcGVkU3RyaW5nLCBfcnVsZVJlLCBmdW5jdGlvbihtKSB7XG4gICAgdmFyIHNlbGVjdG9yID0gbVsyXTtcbiAgICB2YXIgY29udGVudCA9ICcnO1xuICAgIHZhciBzdWZmaXggPSBtWzRdO1xuICAgIHZhciBjb250ZW50UHJlZml4ID0gJyc7XG4gICAgaWYgKGlzUHJlc2VudChtWzRdKSAmJiBtWzRdLnN0YXJ0c1dpdGgoJ3snK0JMT0NLX1BMQUNFSE9MREVSKSkge1xuICAgICAgY29udGVudCA9IGlucHV0V2l0aEVzY2FwZWRCbG9ja3MuYmxvY2tzW25leHRCbG9ja0luZGV4KytdO1xuICAgICAgc3VmZml4ID0gbVs0XS5zdWJzdHJpbmcoQkxPQ0tfUExBQ0VIT0xERVIubGVuZ3RoKzEpO1xuICAgICAgY29udGVudFByZWZpeCA9ICd7JztcbiAgICB9XG4gICAgdmFyIHJ1bGUgPSBydWxlQ2FsbGJhY2sobmV3IENzc1J1bGUoc2VsZWN0b3IsIGNvbnRlbnQpKTtcbiAgICByZXR1cm4gYCR7bVsxXX0ke3J1bGUuc2VsZWN0b3J9JHttWzNdfSR7Y29udGVudFByZWZpeH0ke3J1bGUuY29udGVudH0ke3N1ZmZpeH1gO1xuICB9KTtcbn1cblxuY2xhc3MgU3RyaW5nV2l0aEVzY2FwZWRCbG9ja3Mge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZXNjYXBlZFN0cmluZzpzdHJpbmcsIHB1YmxpYyBibG9ja3M6c3RyaW5nW10pIHt9XG59XG5cbmZ1bmN0aW9uIGVzY2FwZUJsb2NrcyhpbnB1dDpzdHJpbmcpOlN0cmluZ1dpdGhFc2NhcGVkQmxvY2tzIHtcbiAgdmFyIGlucHV0UGFydHMgPSBTdHJpbmdXcmFwcGVyLnNwbGl0KGlucHV0LCBfY3VybHlSZSk7XG4gIHZhciByZXN1bHRQYXJ0cyA9IFtdO1xuICB2YXIgZXNjYXBlZEJsb2NrcyA9IFtdO1xuICB2YXIgYnJhY2tldENvdW50ID0gMDtcbiAgdmFyIGN1cnJlbnRCbG9ja1BhcnRzID0gW107XG4gIGZvciAodmFyIHBhcnRJbmRleCA9IDA7IHBhcnRJbmRleDxpbnB1dFBhcnRzLmxlbmd0aDsgcGFydEluZGV4KyspIHtcbiAgICB2YXIgcGFydCA9IGlucHV0UGFydHNbcGFydEluZGV4XTtcbiAgICBpZiAocGFydCA9PSBDTE9TRV9DVVJMWSkge1xuICAgICAgYnJhY2tldENvdW50LS07XG4gICAgfVxuICAgIGlmIChicmFja2V0Q291bnQgPiAwKSB7XG4gICAgICBjdXJyZW50QmxvY2tQYXJ0cy5wdXNoKHBhcnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY3VycmVudEJsb2NrUGFydHMubGVuZ3RoID4gMCkge1xuICAgICAgICBlc2NhcGVkQmxvY2tzLnB1c2goY3VycmVudEJsb2NrUGFydHMuam9pbignJykpO1xuICAgICAgICByZXN1bHRQYXJ0cy5wdXNoKEJMT0NLX1BMQUNFSE9MREVSKTtcbiAgICAgICAgY3VycmVudEJsb2NrUGFydHMgPSBbXTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdFBhcnRzLnB1c2gocGFydCk7XG4gICAgfVxuICAgIGlmIChwYXJ0ID09IE9QRU5fQ1VSTFkpIHtcbiAgICAgIGJyYWNrZXRDb3VudCsrO1xuICAgIH1cbiAgfVxuICBpZiAoY3VycmVudEJsb2NrUGFydHMubGVuZ3RoID4gMCkge1xuICAgIGVzY2FwZWRCbG9ja3MucHVzaChjdXJyZW50QmxvY2tQYXJ0cy5qb2luKCcnKSk7XG4gICAgcmVzdWx0UGFydHMucHVzaChCTE9DS19QTEFDRUhPTERFUik7XG4gIH1cbiAgcmV0dXJuIG5ldyBTdHJpbmdXaXRoRXNjYXBlZEJsb2NrcyhyZXN1bHRQYXJ0cy5qb2luKCcnKSwgZXNjYXBlZEJsb2Nrcyk7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tcGlsZXIvc2hhZG93X2Nzcy50c1xuICoqLyIsIi8vIFNvbWUgb2YgdGhlIGNvZGUgY29tZXMgZnJvbSBXZWJDb21wb25lbnRzLkpTXG4vLyBodHRwczovL2dpdGh1Yi5jb20vd2ViY29tcG9uZW50cy93ZWJjb21wb25lbnRzanMvYmxvYi9tYXN0ZXIvc3JjL0hUTUxJbXBvcnRzL3BhdGguanNcblxuaW1wb3J0IHtSZWdFeHAsIFJlZ0V4cFdyYXBwZXIsIFN0cmluZ1dyYXBwZXIsIGlzUHJlc2VudCwgaXNCbGFua30gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7VXJsUmVzb2x2ZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb21waWxlci91cmxfcmVzb2x2ZXInO1xuXG5leHBvcnQgY2xhc3MgU3R5bGVXaXRoSW1wb3J0cyB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBzdHlsZTogc3RyaW5nLCBwdWJsaWMgc3R5bGVVcmxzOiBzdHJpbmdbXSkge31cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3R5bGVVcmxSZXNvbHZhYmxlKHVybDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChpc0JsYW5rKHVybCkgfHwgdXJsLmxlbmd0aCA9PT0gMCB8fCB1cmxbMF0gPT0gJy8nKSByZXR1cm4gZmFsc2U7XG4gIHZhciBzY2hlbWVNYXRjaCA9IFJlZ0V4cFdyYXBwZXIuZmlyc3RNYXRjaChfdXJsV2l0aFNjaGVtYVJlLCB1cmwpO1xuICByZXR1cm4gaXNCbGFuayhzY2hlbWVNYXRjaCkgfHwgc2NoZW1lTWF0Y2hbMV0gPT0gJ3BhY2thZ2UnIHx8IHNjaGVtZU1hdGNoWzFdID09ICdhc3NldCc7XG59XG5cbi8qKlxuICogUmV3cml0ZXMgc3R5bGVzaGVldHMgYnkgcmVzb2x2aW5nIGFuZCByZW1vdmluZyB0aGUgQGltcG9ydCB1cmxzIHRoYXRcbiAqIGFyZSBlaXRoZXIgcmVsYXRpdmUgb3IgZG9uJ3QgaGF2ZSBhIGBwYWNrYWdlOmAgc2NoZW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0U3R5bGVVcmxzKHJlc29sdmVyOiBVcmxSZXNvbHZlciwgYmFzZVVybDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NzVGV4dDogc3RyaW5nKTogU3R5bGVXaXRoSW1wb3J0cyB7XG4gIHZhciBmb3VuZFVybHMgPSBbXTtcbiAgdmFyIG1vZGlmaWVkQ3NzVGV4dCA9IFN0cmluZ1dyYXBwZXIucmVwbGFjZUFsbE1hcHBlZChjc3NUZXh0LCBfY3NzSW1wb3J0UmUsIChtKSA9PiB7XG4gICAgdmFyIHVybCA9IGlzUHJlc2VudChtWzFdKSA/IG1bMV0gOiBtWzJdO1xuICAgIGlmICghaXNTdHlsZVVybFJlc29sdmFibGUodXJsKSkge1xuICAgICAgLy8gRG8gbm90IGF0dGVtcHQgdG8gcmVzb2x2ZSBub24tcGFja2FnZSBhYnNvbHV0ZSBVUkxzIHdpdGggVVJJIHNjaGVtZVxuICAgICAgcmV0dXJuIG1bMF07XG4gICAgfVxuICAgIGZvdW5kVXJscy5wdXNoKHJlc29sdmVyLnJlc29sdmUoYmFzZVVybCwgdXJsKSk7XG4gICAgcmV0dXJuICcnO1xuICB9KTtcbiAgcmV0dXJuIG5ldyBTdHlsZVdpdGhJbXBvcnRzKG1vZGlmaWVkQ3NzVGV4dCwgZm91bmRVcmxzKTtcbn1cblxudmFyIF9jc3NJbXBvcnRSZSA9IC9AaW1wb3J0XFxzKyg/OnVybFxcKCk/XFxzKig/Oig/OlsnXCJdKFteJ1wiXSopKXwoW147XFwpXFxzXSopKVteO10qOz8vZztcbi8vIFRPRE86IGNhbid0IHVzZSAvXlteOi8/Iy5dKzovZyBkdWUgdG8gY2xhbmctZm9ybWF0IGJ1Zzpcbi8vICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzQ1OTZcbnZhciBfdXJsV2l0aFNjaGVtYVJlID0gL14oW2EtekEtWlxcLVxcK1xcLl0rKTovZztcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21waWxlci9zdHlsZV91cmxfcmVzb2x2ZXIudHNcbiAqKi8iLCJpbXBvcnQge2lzQmxhbmssIGlzUHJlc2VudCwgU3RyaW5nV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7XG4gIFJlbmRlckV2ZW50RGlzcGF0Y2hlcixcbiAgUmVuZGVyVGVtcGxhdGVDbWQsXG4gIFJlbmRlckNvbW1hbmRWaXNpdG9yLFxuICBSZW5kZXJCZWdpbkVsZW1lbnRDbWQsXG4gIFJlbmRlckJlZ2luQ29tcG9uZW50Q21kLFxuICBSZW5kZXJOZ0NvbnRlbnRDbWQsXG4gIFJlbmRlclRleHRDbWQsXG4gIFJlbmRlckVtYmVkZGVkVGVtcGxhdGVDbWQsXG4gIFJlbmRlckNvbXBvbmVudFRlbXBsYXRlXG59IGZyb20gJy4vYXBpJztcbmltcG9ydCB7RGVmYXVsdFJlbmRlclZpZXcsIERlZmF1bHRSZW5kZXJGcmFnbWVudFJlZn0gZnJvbSAnLi92aWV3JztcbmltcG9ydCB7Vmlld0VuY2Fwc3VsYXRpb259IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL21ldGFkYXRhJztcbmltcG9ydCB7TGlzdFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGVuY2Fwc3VsYXRlU3R5bGVzKGNvbXBvbmVudFRlbXBsYXRlOiBSZW5kZXJDb21wb25lbnRUZW1wbGF0ZSk6IHN0cmluZ1tdIHtcbiAgdmFyIHByb2Nlc3NlZFN0eWxlcyA9IGNvbXBvbmVudFRlbXBsYXRlLnN0eWxlcztcbiAgaWYgKGNvbXBvbmVudFRlbXBsYXRlLmVuY2Fwc3VsYXRpb24gPT09IFZpZXdFbmNhcHN1bGF0aW9uLkVtdWxhdGVkKSB7XG4gICAgcHJvY2Vzc2VkU3R5bGVzID0gTGlzdFdyYXBwZXIuY3JlYXRlRml4ZWRTaXplKGNvbXBvbmVudFRlbXBsYXRlLnN0eWxlcy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tcG9uZW50VGVtcGxhdGUuc3R5bGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBwcm9jZXNzZWRTdHlsZXNbaV0gPSBTdHJpbmdXcmFwcGVyLnJlcGxhY2VBbGwoY29tcG9uZW50VGVtcGxhdGUuc3R5bGVzW2ldLCBDT01QT05FTlRfUkVHRVgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50VGVtcGxhdGUuc2hvcnRJZCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBwcm9jZXNzZWRTdHlsZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZW5kZXJWaWV3KGNvbXBvbmVudFRlbXBsYXRlOiBSZW5kZXJDb21wb25lbnRUZW1wbGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZHM6IFJlbmRlclRlbXBsYXRlQ21kW10sIGlucGxhY2VFbGVtZW50OiBhbnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlRmFjdG9yeTogTm9kZUZhY3Rvcnk8YW55Pik6IERlZmF1bHRSZW5kZXJWaWV3PGFueT4ge1xuICB2YXIgdmlldzogRGVmYXVsdFJlbmRlclZpZXc8YW55PjtcbiAgdmFyIGV2ZW50RGlzcGF0Y2hlciA9IChib3VuZEVsZW1lbnRJbmRleDogbnVtYmVyLCBldmVudE5hbWU6IHN0cmluZywgZXZlbnQ6IGFueSkgPT5cbiAgICAgIHZpZXcuZGlzcGF0Y2hSZW5kZXJFdmVudChib3VuZEVsZW1lbnRJbmRleCwgZXZlbnROYW1lLCBldmVudCk7XG4gIHZhciBjb250ZXh0ID0gbmV3IEJ1aWxkQ29udGV4dChldmVudERpc3BhdGNoZXIsIG5vZGVGYWN0b3J5LCBpbnBsYWNlRWxlbWVudCk7XG4gIGNvbnRleHQuYnVpbGQoY29tcG9uZW50VGVtcGxhdGUsIGNtZHMpO1xuICB2YXIgZnJhZ21lbnRzOiBEZWZhdWx0UmVuZGVyRnJhZ21lbnRSZWY8YW55PltdID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY29udGV4dC5mcmFnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBmcmFnbWVudHMucHVzaChuZXcgRGVmYXVsdFJlbmRlckZyYWdtZW50UmVmKGNvbnRleHQuZnJhZ21lbnRzW2ldKSk7XG4gIH1cbiAgdmlldyA9IG5ldyBEZWZhdWx0UmVuZGVyVmlldzxhbnk+KGZyYWdtZW50cywgY29udGV4dC5ib3VuZFRleHROb2RlcywgY29udGV4dC5ib3VuZEVsZW1lbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5uYXRpdmVTaGFkb3dSb290cywgY29udGV4dC5nbG9iYWxFdmVudEFkZGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQucm9vdENvbnRlbnRJbnNlcnRpb25Qb2ludHMpO1xuICByZXR1cm4gdmlldztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOb2RlRmFjdG9yeTxOPiB7XG4gIHJlc29sdmVDb21wb25lbnRUZW1wbGF0ZSh0ZW1wbGF0ZUlkOiBzdHJpbmcpOiBSZW5kZXJDb21wb25lbnRUZW1wbGF0ZTtcbiAgY3JlYXRlVGVtcGxhdGVBbmNob3IoYXR0ck5hbWVBbmRWYWx1ZXM6IHN0cmluZ1tdKTogTjtcbiAgY3JlYXRlRWxlbWVudChuYW1lOiBzdHJpbmcsIGF0dHJOYW1lQW5kVmFsdWVzOiBzdHJpbmdbXSk6IE47XG4gIGNyZWF0ZVJvb3RDb250ZW50SW5zZXJ0aW9uUG9pbnQoKTogTjtcbiAgbWVyZ2VFbGVtZW50KGV4aXN0aW5nOiBOLCBhdHRyTmFtZUFuZFZhbHVlczogc3RyaW5nW10pO1xuICBjcmVhdGVTaGFkb3dSb290KGhvc3Q6IE4sIHRlbXBsYXRlSWQ6IHN0cmluZyk6IE47XG4gIGNyZWF0ZVRleHQodmFsdWU6IHN0cmluZyk6IE47XG4gIGFwcGVuZENoaWxkKHBhcmVudDogTiwgY2hpbGQ6IE4pO1xuICBvbihlbGVtZW50OiBOLCBldmVudE5hbWU6IHN0cmluZywgY2FsbGJhY2s6IEZ1bmN0aW9uKTtcbiAgZ2xvYmFsT24odGFyZ2V0OiBzdHJpbmcsIGV2ZW50TmFtZTogc3RyaW5nLCBjYWxsYmFjazogRnVuY3Rpb24pOiBGdW5jdGlvbjtcbn1cblxuY2xhc3MgQnVpbGRDb250ZXh0PE4+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZXZlbnREaXNwYXRjaGVyOiBGdW5jdGlvbiwgcHVibGljIGZhY3Rvcnk6IE5vZGVGYWN0b3J5PE4+LFxuICAgICAgICAgICAgICBwcml2YXRlIF9pbnBsYWNlRWxlbWVudDogTikge1xuICAgIHRoaXMuaXNIb3N0ID0gaXNQcmVzZW50KChfaW5wbGFjZUVsZW1lbnQpKTtcbiAgfVxuICBwcml2YXRlIF9idWlsZGVyczogUmVuZGVyVmlld0J1aWxkZXI8Tj5bXSA9IFtdO1xuXG4gIGdsb2JhbEV2ZW50QWRkZXJzOiBGdW5jdGlvbltdID0gW107XG4gIGJvdW5kRWxlbWVudHM6IE5bXSA9IFtdO1xuICBib3VuZFRleHROb2RlczogTltdID0gW107XG4gIG5hdGl2ZVNoYWRvd1Jvb3RzOiBOW10gPSBbXTtcbiAgZnJhZ21lbnRzOiBOW11bXSA9IFtdO1xuICByb290Q29udGVudEluc2VydGlvblBvaW50czogTltdID0gW107XG4gIGNvbXBvbmVudENvdW50OiBudW1iZXIgPSAwO1xuICBpc0hvc3Q6IGJvb2xlYW47XG5cbiAgYnVpbGQodGVtcGxhdGU6IFJlbmRlckNvbXBvbmVudFRlbXBsYXRlLCBjbWRzOiBSZW5kZXJUZW1wbGF0ZUNtZFtdKSB7XG4gICAgdGhpcy5lbnF1ZXVlUm9vdEJ1aWxkZXIodGVtcGxhdGUsIGNtZHMpO1xuICAgIHRoaXMuX2J1aWxkKHRoaXMuX2J1aWxkZXJzWzBdKTtcbiAgfVxuXG4gIHByaXZhdGUgX2J1aWxkKGJ1aWxkZXI6IFJlbmRlclZpZXdCdWlsZGVyPE4+KSB7XG4gICAgdGhpcy5fYnVpbGRlcnMgPSBbXTtcbiAgICBidWlsZGVyLmJ1aWxkKHRoaXMpO1xuICAgIHZhciBlbnF1ZXVlZEJ1aWxkZXJzID0gdGhpcy5fYnVpbGRlcnM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbnF1ZXVlZEJ1aWxkZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLl9idWlsZChlbnF1ZXVlZEJ1aWxkZXJzW2ldKTtcbiAgICB9XG4gIH1cblxuICBlbnF1ZXVlQ29tcG9uZW50QnVpbGRlcihjb21wb25lbnQ6IENvbXBvbmVudDxOPikge1xuICAgIHRoaXMuY29tcG9uZW50Q291bnQrKztcbiAgICB0aGlzLl9idWlsZGVycy5wdXNoKFxuICAgICAgICBuZXcgUmVuZGVyVmlld0J1aWxkZXI8Tj4oY29tcG9uZW50LCBudWxsLCBjb21wb25lbnQudGVtcGxhdGUsIGNvbXBvbmVudC50ZW1wbGF0ZS5jb21tYW5kcykpO1xuICB9XG5cbiAgZW5xdWV1ZUZyYWdtZW50QnVpbGRlcihwYXJlbnRDb21wb25lbnQ6IENvbXBvbmVudDxOPiwgcGFyZW50VGVtcGxhdGU6IFJlbmRlckNvbXBvbmVudFRlbXBsYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRzOiBSZW5kZXJUZW1wbGF0ZUNtZFtdKSB7XG4gICAgdmFyIHJvb3ROb2RlcyA9IFtdO1xuICAgIHRoaXMuZnJhZ21lbnRzLnB1c2gocm9vdE5vZGVzKTtcbiAgICB0aGlzLl9idWlsZGVycy5wdXNoKFxuICAgICAgICBuZXcgUmVuZGVyVmlld0J1aWxkZXI8Tj4ocGFyZW50Q29tcG9uZW50LCByb290Tm9kZXMsIHBhcmVudFRlbXBsYXRlLCBjb21tYW5kcykpO1xuICB9XG5cbiAgZW5xdWV1ZVJvb3RCdWlsZGVyKHRlbXBsYXRlOiBSZW5kZXJDb21wb25lbnRUZW1wbGF0ZSwgY21kczogUmVuZGVyVGVtcGxhdGVDbWRbXSkge1xuICAgIHZhciByb290Tm9kZXMgPSBbXTtcbiAgICB0aGlzLmZyYWdtZW50cy5wdXNoKHJvb3ROb2Rlcyk7XG4gICAgdGhpcy5fYnVpbGRlcnMucHVzaChuZXcgUmVuZGVyVmlld0J1aWxkZXI8Tj4obnVsbCwgcm9vdE5vZGVzLCB0ZW1wbGF0ZSwgY21kcykpO1xuICB9XG5cbiAgY29uc3VtZUlucGxhY2VFbGVtZW50KCk6IE4ge1xuICAgIHZhciByZXN1bHQgPSB0aGlzLl9pbnBsYWNlRWxlbWVudDtcbiAgICB0aGlzLl9pbnBsYWNlRWxlbWVudCA9IG51bGw7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGFkZEV2ZW50TGlzdGVuZXIoYm91bmRFbGVtZW50SW5kZXg6IG51bWJlciwgdGFyZ2V0OiBzdHJpbmcsIGV2ZW50TmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKGlzUHJlc2VudCh0YXJnZXQpKSB7XG4gICAgICB2YXIgaGFuZGxlciA9XG4gICAgICAgICAgY3JlYXRlRXZlbnRIYW5kbGVyKGJvdW5kRWxlbWVudEluZGV4LCBgJHt0YXJnZXR9OiR7ZXZlbnROYW1lfWAsIHRoaXMuX2V2ZW50RGlzcGF0Y2hlcik7XG4gICAgICB0aGlzLmdsb2JhbEV2ZW50QWRkZXJzLnB1c2goY3JlYXRlR2xvYmFsRXZlbnRBZGRlcih0YXJnZXQsIGV2ZW50TmFtZSwgaGFuZGxlciwgdGhpcy5mYWN0b3J5KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBoYW5kbGVyID0gY3JlYXRlRXZlbnRIYW5kbGVyKGJvdW5kRWxlbWVudEluZGV4LCBldmVudE5hbWUsIHRoaXMuX2V2ZW50RGlzcGF0Y2hlcik7XG4gICAgICB0aGlzLmZhY3Rvcnkub24odGhpcy5ib3VuZEVsZW1lbnRzW2JvdW5kRWxlbWVudEluZGV4XSwgZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgICB9XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBjcmVhdGVFdmVudEhhbmRsZXIoYm91bmRFbGVtZW50SW5kZXg6IG51bWJlciwgZXZlbnROYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREaXNwYXRjaGVyOiBGdW5jdGlvbik6IEZ1bmN0aW9uIHtcbiAgcmV0dXJuICgkZXZlbnQpID0+IGV2ZW50RGlzcGF0Y2hlcihib3VuZEVsZW1lbnRJbmRleCwgZXZlbnROYW1lLCAkZXZlbnQpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVHbG9iYWxFdmVudEFkZGVyKHRhcmdldDogc3RyaW5nLCBldmVudE5hbWU6IHN0cmluZywgZXZlbnRIYW5kbGVyOiBGdW5jdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUZhY3Rvcnk6IE5vZGVGYWN0b3J5PGFueT4pOiBGdW5jdGlvbiB7XG4gIHJldHVybiAoKSA9PiBub2RlRmFjdG9yeS5nbG9iYWxPbih0YXJnZXQsIGV2ZW50TmFtZSwgZXZlbnRIYW5kbGVyKTtcbn1cblxuY2xhc3MgUmVuZGVyVmlld0J1aWxkZXI8Tj4gaW1wbGVtZW50cyBSZW5kZXJDb21tYW5kVmlzaXRvciB7XG4gIHBhcmVudFN0YWNrOiBBcnJheTxOIHwgQ29tcG9uZW50PE4+PjtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcGFyZW50Q29tcG9uZW50OiBDb21wb25lbnQ8Tj4sIHB1YmxpYyBmcmFnbWVudFJvb3ROb2RlczogTltdLFxuICAgICAgICAgICAgICBwdWJsaWMgdGVtcGxhdGU6IFJlbmRlckNvbXBvbmVudFRlbXBsYXRlLCBwdWJsaWMgY21kczogUmVuZGVyVGVtcGxhdGVDbWRbXSkge1xuICAgIHZhciByb290Tm9kZXNQYXJlbnQgPSBpc1ByZXNlbnQoZnJhZ21lbnRSb290Tm9kZXMpID8gbnVsbCA6IHBhcmVudENvbXBvbmVudC5zaGFkb3dSb290O1xuICAgIHRoaXMucGFyZW50U3RhY2sgPSBbcm9vdE5vZGVzUGFyZW50XTtcbiAgfVxuXG4gIGJ1aWxkKGNvbnRleHQ6IEJ1aWxkQ29udGV4dDxOPikge1xuICAgIHZhciBjbWRzID0gdGhpcy5jbWRzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY21kcy5sZW5ndGg7IGkrKykge1xuICAgICAgY21kc1tpXS52aXNpdCh0aGlzLCBjb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICBnZXQgcGFyZW50KCk6IE4gfCBDb21wb25lbnQ8Tj4geyByZXR1cm4gdGhpcy5wYXJlbnRTdGFja1t0aGlzLnBhcmVudFN0YWNrLmxlbmd0aCAtIDFdOyB9XG5cbiAgdmlzaXRUZXh0KGNtZDogUmVuZGVyVGV4dENtZCwgY29udGV4dDogQnVpbGRDb250ZXh0PE4+KTogYW55IHtcbiAgICB2YXIgdGV4dCA9IGNvbnRleHQuZmFjdG9yeS5jcmVhdGVUZXh0KGNtZC52YWx1ZSk7XG4gICAgdGhpcy5fYWRkQ2hpbGQodGV4dCwgY21kLm5nQ29udGVudEluZGV4LCBjb250ZXh0KTtcbiAgICBpZiAoY21kLmlzQm91bmQpIHtcbiAgICAgIGNvbnRleHQuYm91bmRUZXh0Tm9kZXMucHVzaCh0ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmlzaXROZ0NvbnRlbnQoY21kOiBSZW5kZXJOZ0NvbnRlbnRDbWQsIGNvbnRleHQ6IEJ1aWxkQ29udGV4dDxOPik6IGFueSB7XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLnBhcmVudENvbXBvbmVudCkpIHtcbiAgICAgIGlmICh0aGlzLnBhcmVudENvbXBvbmVudC5pc1Jvb3QpIHtcbiAgICAgICAgdmFyIGluc2VydGlvblBvaW50ID0gY29udGV4dC5mYWN0b3J5LmNyZWF0ZVJvb3RDb250ZW50SW5zZXJ0aW9uUG9pbnQoKTtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50IGluc3RhbmNlb2YgQ29tcG9uZW50KSB7XG4gICAgICAgICAgY29udGV4dC5mYWN0b3J5LmFwcGVuZENoaWxkKCg8Q29tcG9uZW50PE4+PnRoaXMucGFyZW50KS5zaGFkb3dSb290LCBpbnNlcnRpb25Qb2ludCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udGV4dC5mYWN0b3J5LmFwcGVuZENoaWxkKDxOPnRoaXMucGFyZW50LCBpbnNlcnRpb25Qb2ludCk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5yb290Q29udGVudEluc2VydGlvblBvaW50cy5wdXNoKGluc2VydGlvblBvaW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBwcm9qZWN0ZWROb2RlcyA9IHRoaXMucGFyZW50Q29tcG9uZW50LnByb2plY3QoY21kLmluZGV4KTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9qZWN0ZWROb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBub2RlID0gcHJvamVjdGVkTm9kZXNbaV07XG4gICAgICAgICAgdGhpcy5fYWRkQ2hpbGQobm9kZSwgY21kLm5nQ29udGVudEluZGV4LCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2aXNpdEJlZ2luRWxlbWVudChjbWQ6IFJlbmRlckJlZ2luRWxlbWVudENtZCwgY29udGV4dDogQnVpbGRDb250ZXh0PE4+KTogYW55IHtcbiAgICB0aGlzLnBhcmVudFN0YWNrLnB1c2godGhpcy5fYmVnaW5FbGVtZW50KGNtZCwgY29udGV4dCwgbnVsbCkpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZpc2l0RW5kRWxlbWVudChjb250ZXh0OiBCdWlsZENvbnRleHQ8Tj4pOiBhbnkge1xuICAgIHRoaXMuX2VuZEVsZW1lbnQoKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2aXNpdEJlZ2luQ29tcG9uZW50KGNtZDogUmVuZGVyQmVnaW5Db21wb25lbnRDbWQsIGNvbnRleHQ6IEJ1aWxkQ29udGV4dDxOPik6IGFueSB7XG4gICAgdmFyIHRlbXBsYXRlSWQgPSBjbWQudGVtcGxhdGVJZDtcbiAgICB2YXIgdHBsID0gY29udGV4dC5mYWN0b3J5LnJlc29sdmVDb21wb25lbnRUZW1wbGF0ZSh0ZW1wbGF0ZUlkKTtcbiAgICB2YXIgZWwgPSB0aGlzLl9iZWdpbkVsZW1lbnQoY21kLCBjb250ZXh0LCB0cGwpO1xuICAgIHZhciByb290ID0gZWw7XG5cbiAgICBpZiAodHBsLmVuY2Fwc3VsYXRpb24gPT09IFZpZXdFbmNhcHN1bGF0aW9uLk5hdGl2ZSkge1xuICAgICAgcm9vdCA9IGNvbnRleHQuZmFjdG9yeS5jcmVhdGVTaGFkb3dSb290KGVsLCB0ZW1wbGF0ZUlkKTtcbiAgICAgIGNvbnRleHQubmF0aXZlU2hhZG93Um9vdHMucHVzaChyb290KTtcbiAgICB9XG4gICAgdmFyIGlzUm9vdCA9IGNvbnRleHQuY29tcG9uZW50Q291bnQgPT09IDAgJiYgY29udGV4dC5pc0hvc3Q7XG4gICAgdmFyIGNvbXBvbmVudCA9IG5ldyBDb21wb25lbnQoZWwsIHJvb3QsIGlzUm9vdCwgdHBsKTtcbiAgICBjb250ZXh0LmVucXVldWVDb21wb25lbnRCdWlsZGVyKGNvbXBvbmVudCk7XG4gICAgdGhpcy5wYXJlbnRTdGFjay5wdXNoKGNvbXBvbmVudCk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmlzaXRFbmRDb21wb25lbnQoY29udGV4dDogQnVpbGRDb250ZXh0PE4+KTogYW55IHtcbiAgICB0aGlzLl9lbmRFbGVtZW50KCk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmlzaXRFbWJlZGRlZFRlbXBsYXRlKGNtZDogUmVuZGVyRW1iZWRkZWRUZW1wbGF0ZUNtZCwgY29udGV4dDogQnVpbGRDb250ZXh0PE4+KTogYW55IHtcbiAgICB2YXIgZWwgPSBjb250ZXh0LmZhY3RvcnkuY3JlYXRlVGVtcGxhdGVBbmNob3IoY21kLmF0dHJOYW1lQW5kVmFsdWVzKTtcbiAgICB0aGlzLl9hZGRDaGlsZChlbCwgY21kLm5nQ29udGVudEluZGV4LCBjb250ZXh0KTtcbiAgICBjb250ZXh0LmJvdW5kRWxlbWVudHMucHVzaChlbCk7XG4gICAgaWYgKGNtZC5pc01lcmdlZCkge1xuICAgICAgY29udGV4dC5lbnF1ZXVlRnJhZ21lbnRCdWlsZGVyKHRoaXMucGFyZW50Q29tcG9uZW50LCB0aGlzLnRlbXBsYXRlLCBjbWQuY2hpbGRyZW4pO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgX2JlZ2luRWxlbWVudChjbWQ6IFJlbmRlckJlZ2luRWxlbWVudENtZCwgY29udGV4dDogQnVpbGRDb250ZXh0PE4+LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50VGVtcGxhdGU6IFJlbmRlckNvbXBvbmVudFRlbXBsYXRlKTogTiB7XG4gICAgdmFyIGVsOiBOID0gY29udGV4dC5jb25zdW1lSW5wbGFjZUVsZW1lbnQoKTtcbiAgICB2YXIgYXR0ck5hbWVBbmRWYWx1ZXMgPSBjbWQuYXR0ck5hbWVBbmRWYWx1ZXM7XG4gICAgdmFyIHRlbXBsYXRlRW11bGF0ZWRFbmNhcHN1bGF0aW9uID0gdGhpcy50ZW1wbGF0ZS5lbmNhcHN1bGF0aW9uID09PSBWaWV3RW5jYXBzdWxhdGlvbi5FbXVsYXRlZDtcbiAgICB2YXIgY29tcG9uZW50RW11bGF0ZWRFbmNhcHN1bGF0aW9uID1cbiAgICAgICAgaXNQcmVzZW50KGNvbXBvbmVudFRlbXBsYXRlKSAmJlxuICAgICAgICBjb21wb25lbnRUZW1wbGF0ZS5lbmNhcHN1bGF0aW9uID09PSBWaWV3RW5jYXBzdWxhdGlvbi5FbXVsYXRlZDtcbiAgICB2YXIgbmV3QXR0ckxlbmd0aCA9IGF0dHJOYW1lQW5kVmFsdWVzLmxlbmd0aCArICh0ZW1wbGF0ZUVtdWxhdGVkRW5jYXBzdWxhdGlvbiA/IDIgOiAwKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAoY29tcG9uZW50RW11bGF0ZWRFbmNhcHN1bGF0aW9uID8gMiA6IDApO1xuICAgIGlmIChuZXdBdHRyTGVuZ3RoID4gYXR0ck5hbWVBbmRWYWx1ZXMubGVuZ3RoKSB7XG4gICAgICAvLyBOb3RlOiBOZWVkIHRvIGNsb25lIGF0dHJOYW1lQW5kVmFsdWVzIHRvIG1ha2UgaXQgd3JpdGFibGUhXG4gICAgICB2YXIgbmV3QXR0ck5hbWVBbmRWYWx1ZXMgPSBMaXN0V3JhcHBlci5jcmVhdGVGaXhlZFNpemUobmV3QXR0ckxlbmd0aCk7XG4gICAgICB2YXIgYXR0ckluZGV4O1xuICAgICAgZm9yIChhdHRySW5kZXggPSAwOyBhdHRySW5kZXggPCBhdHRyTmFtZUFuZFZhbHVlcy5sZW5ndGg7IGF0dHJJbmRleCsrKSB7XG4gICAgICAgIG5ld0F0dHJOYW1lQW5kVmFsdWVzW2F0dHJJbmRleF0gPSBhdHRyTmFtZUFuZFZhbHVlc1thdHRySW5kZXhdO1xuICAgICAgfVxuICAgICAgaWYgKHRlbXBsYXRlRW11bGF0ZWRFbmNhcHN1bGF0aW9uKSB7XG4gICAgICAgIG5ld0F0dHJOYW1lQW5kVmFsdWVzW2F0dHJJbmRleCsrXSA9IF9zaGltQ29udGVudEF0dHJpYnV0ZSh0aGlzLnRlbXBsYXRlLnNob3J0SWQpO1xuICAgICAgICBuZXdBdHRyTmFtZUFuZFZhbHVlc1thdHRySW5kZXgrK10gPSAnJztcbiAgICAgIH1cbiAgICAgIGlmIChjb21wb25lbnRFbXVsYXRlZEVuY2Fwc3VsYXRpb24pIHtcbiAgICAgICAgbmV3QXR0ck5hbWVBbmRWYWx1ZXNbYXR0ckluZGV4KytdID0gX3NoaW1Ib3N0QXR0cmlidXRlKGNvbXBvbmVudFRlbXBsYXRlLnNob3J0SWQpO1xuICAgICAgICBuZXdBdHRyTmFtZUFuZFZhbHVlc1thdHRySW5kZXgrK10gPSAnJztcbiAgICAgIH1cbiAgICAgIGF0dHJOYW1lQW5kVmFsdWVzID0gbmV3QXR0ck5hbWVBbmRWYWx1ZXM7XG4gICAgfVxuICAgIGlmIChpc1ByZXNlbnQoZWwpKSB7XG4gICAgICBjb250ZXh0LmZhY3RvcnkubWVyZ2VFbGVtZW50KGVsLCBhdHRyTmFtZUFuZFZhbHVlcyk7XG4gICAgICB0aGlzLmZyYWdtZW50Um9vdE5vZGVzLnB1c2goZWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbCA9IGNvbnRleHQuZmFjdG9yeS5jcmVhdGVFbGVtZW50KGNtZC5uYW1lLCBhdHRyTmFtZUFuZFZhbHVlcyk7XG4gICAgICB0aGlzLl9hZGRDaGlsZChlbCwgY21kLm5nQ29udGVudEluZGV4LCBjb250ZXh0KTtcbiAgICB9XG4gICAgaWYgKGNtZC5pc0JvdW5kKSB7XG4gICAgICB2YXIgYm91bmRFbGVtZW50SW5kZXggPSBjb250ZXh0LmJvdW5kRWxlbWVudHMubGVuZ3RoO1xuICAgICAgY29udGV4dC5ib3VuZEVsZW1lbnRzLnB1c2goZWwpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbWQuZXZlbnRUYXJnZXRBbmROYW1lcy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICB2YXIgdGFyZ2V0ID0gY21kLmV2ZW50VGFyZ2V0QW5kTmFtZXNbaV07XG4gICAgICAgIHZhciBldmVudE5hbWUgPSBjbWQuZXZlbnRUYXJnZXRBbmROYW1lc1tpICsgMV07XG4gICAgICAgIGNvbnRleHQuYWRkRXZlbnRMaXN0ZW5lcihib3VuZEVsZW1lbnRJbmRleCwgdGFyZ2V0LCBldmVudE5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZWw7XG4gIH1cblxuICBwcml2YXRlIF9lbmRFbGVtZW50KCkgeyB0aGlzLnBhcmVudFN0YWNrLnBvcCgpOyB9XG5cbiAgcHJpdmF0ZSBfYWRkQ2hpbGQobm9kZTogTiwgbmdDb250ZW50SW5kZXg6IG51bWJlciwgY29udGV4dDogQnVpbGRDb250ZXh0PE4+KSB7XG4gICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50O1xuICAgIGlmIChpc1ByZXNlbnQocGFyZW50KSkge1xuICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIENvbXBvbmVudCkge1xuICAgICAgICBwYXJlbnQuYWRkQ29udGVudE5vZGUobmdDb250ZW50SW5kZXgsIG5vZGUsIGNvbnRleHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGV4dC5mYWN0b3J5LmFwcGVuZENoaWxkKDxOPnBhcmVudCwgbm9kZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZnJhZ21lbnRSb290Tm9kZXMucHVzaChub2RlKTtcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgQ29tcG9uZW50PE4+IHtcbiAgcHJpdmF0ZSBjb250ZW50Tm9kZXNCeU5nQ29udGVudEluZGV4OiBOW11bXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBob3N0RWxlbWVudDogTiwgcHVibGljIHNoYWRvd1Jvb3Q6IE4sIHB1YmxpYyBpc1Jvb3Q6IGJvb2xlYW4sXG4gICAgICAgICAgICAgIHB1YmxpYyB0ZW1wbGF0ZTogUmVuZGVyQ29tcG9uZW50VGVtcGxhdGUpIHt9XG4gIGFkZENvbnRlbnROb2RlKG5nQ29udGVudEluZGV4OiBudW1iZXIsIG5vZGU6IE4sIGNvbnRleHQ6IEJ1aWxkQ29udGV4dDxOPikge1xuICAgIGlmIChpc0JsYW5rKG5nQ29udGVudEluZGV4KSkge1xuICAgICAgaWYgKHRoaXMudGVtcGxhdGUuZW5jYXBzdWxhdGlvbiA9PT0gVmlld0VuY2Fwc3VsYXRpb24uTmF0aXZlKSB7XG4gICAgICAgIGNvbnRleHQuZmFjdG9yeS5hcHBlbmRDaGlsZCh0aGlzLmhvc3RFbGVtZW50LCBub2RlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgd2hpbGUgKHRoaXMuY29udGVudE5vZGVzQnlOZ0NvbnRlbnRJbmRleC5sZW5ndGggPD0gbmdDb250ZW50SW5kZXgpIHtcbiAgICAgICAgdGhpcy5jb250ZW50Tm9kZXNCeU5nQ29udGVudEluZGV4LnB1c2goW10pO1xuICAgICAgfVxuICAgICAgdGhpcy5jb250ZW50Tm9kZXNCeU5nQ29udGVudEluZGV4W25nQ29udGVudEluZGV4XS5wdXNoKG5vZGUpO1xuICAgIH1cbiAgfVxuICBwcm9qZWN0KG5nQ29udGVudEluZGV4OiBudW1iZXIpOiBOW10ge1xuICAgIHJldHVybiBuZ0NvbnRlbnRJbmRleCA8IHRoaXMuY29udGVudE5vZGVzQnlOZ0NvbnRlbnRJbmRleC5sZW5ndGggP1xuICAgICAgICAgICAgICAgdGhpcy5jb250ZW50Tm9kZXNCeU5nQ29udGVudEluZGV4W25nQ29udGVudEluZGV4XSA6XG4gICAgICAgICAgICAgICBbXTtcbiAgfVxufVxuXG52YXIgQ09NUE9ORU5UX1JFR0VYID0gLyVDT01QJS9nO1xuZXhwb3J0IGNvbnN0IENPTVBPTkVOVF9WQVJJQUJMRSA9ICclQ09NUCUnO1xuZXhwb3J0IGNvbnN0IEhPU1RfQVRUUiA9IGBfbmdob3N0LSR7Q09NUE9ORU5UX1ZBUklBQkxFfWA7XG5leHBvcnQgY29uc3QgQ09OVEVOVF9BVFRSID0gYF9uZ2NvbnRlbnQtJHtDT01QT05FTlRfVkFSSUFCTEV9YDtcblxuZnVuY3Rpb24gX3NoaW1Db250ZW50QXR0cmlidXRlKGNvbXBvbmVudFNob3J0SWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBTdHJpbmdXcmFwcGVyLnJlcGxhY2VBbGwoQ09OVEVOVF9BVFRSLCBDT01QT05FTlRfUkVHRVgsIGNvbXBvbmVudFNob3J0SWQpO1xufVxuXG5mdW5jdGlvbiBfc2hpbUhvc3RBdHRyaWJ1dGUoY29tcG9uZW50U2hvcnRJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIFN0cmluZ1dyYXBwZXIucmVwbGFjZUFsbChIT1NUX0FUVFIsIENPTVBPTkVOVF9SRUdFWCwgY29tcG9uZW50U2hvcnRJZCk7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9yZW5kZXIvdmlld19mYWN0b3J5LnRzXG4gKiovIiwiaW1wb3J0IHtCYXNlRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtMaXN0V3JhcHBlciwgTWFwV3JhcHBlciwgTWFwLCBTdHJpbmdNYXBXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtpc1ByZXNlbnQsIGlzQmxhbmssIHN0cmluZ2lmeX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxuaW1wb3J0IHtcbiAgUmVuZGVyQ29tcG9uZW50VGVtcGxhdGUsXG4gIFJlbmRlclZpZXdSZWYsXG4gIFJlbmRlckV2ZW50RGlzcGF0Y2hlcixcbiAgUmVuZGVyVGVtcGxhdGVDbWQsXG4gIFJlbmRlclByb3RvVmlld1JlZixcbiAgUmVuZGVyRnJhZ21lbnRSZWZcbn0gZnJvbSAnLi9hcGknO1xuXG5leHBvcnQgY2xhc3MgRGVmYXVsdFByb3RvVmlld1JlZiBleHRlbmRzIFJlbmRlclByb3RvVmlld1JlZiB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZW1wbGF0ZTogUmVuZGVyQ29tcG9uZW50VGVtcGxhdGUsIHB1YmxpYyBjbWRzOiBSZW5kZXJUZW1wbGF0ZUNtZFtdKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGVmYXVsdFJlbmRlckZyYWdtZW50UmVmPE4+IGV4dGVuZHMgUmVuZGVyRnJhZ21lbnRSZWYge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbm9kZXM6IE5bXSkgeyBzdXBlcigpOyB9XG59XG5cbmV4cG9ydCBjbGFzcyBEZWZhdWx0UmVuZGVyVmlldzxOPiBleHRlbmRzIFJlbmRlclZpZXdSZWYge1xuICBoeWRyYXRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBldmVudERpc3BhdGNoZXI6IFJlbmRlckV2ZW50RGlzcGF0Y2hlciA9IG51bGw7XG4gIGdsb2JhbEV2ZW50UmVtb3ZlcnM6IEZ1bmN0aW9uW10gPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBmcmFnbWVudHM6IERlZmF1bHRSZW5kZXJGcmFnbWVudFJlZjxOPltdLCBwdWJsaWMgYm91bmRUZXh0Tm9kZXM6IE5bXSxcbiAgICAgICAgICAgICAgcHVibGljIGJvdW5kRWxlbWVudHM6IE5bXSwgcHVibGljIG5hdGl2ZVNoYWRvd1Jvb3RzOiBOW10sXG4gICAgICAgICAgICAgIHB1YmxpYyBnbG9iYWxFdmVudEFkZGVyczogRnVuY3Rpb25bXSwgcHVibGljIHJvb3RDb250ZW50SW5zZXJ0aW9uUG9pbnRzOiBOW10pIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgaHlkcmF0ZSgpIHtcbiAgICBpZiAodGhpcy5oeWRyYXRlZCkgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ1RoZSB2aWV3IGlzIGFscmVhZHkgaHlkcmF0ZWQuJyk7XG4gICAgdGhpcy5oeWRyYXRlZCA9IHRydWU7XG4gICAgdGhpcy5nbG9iYWxFdmVudFJlbW92ZXJzID0gTGlzdFdyYXBwZXIuY3JlYXRlRml4ZWRTaXplKHRoaXMuZ2xvYmFsRXZlbnRBZGRlcnMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZ2xvYmFsRXZlbnRBZGRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuZ2xvYmFsRXZlbnRSZW1vdmVyc1tpXSA9IHRoaXMuZ2xvYmFsRXZlbnRBZGRlcnNbaV0oKTtcbiAgICB9XG4gIH1cblxuICBkZWh5ZHJhdGUoKSB7XG4gICAgaWYgKCF0aGlzLmh5ZHJhdGVkKSB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignVGhlIHZpZXcgaXMgYWxyZWFkeSBkZWh5ZHJhdGVkLicpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5nbG9iYWxFdmVudFJlbW92ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmdsb2JhbEV2ZW50UmVtb3ZlcnNbaV0oKTtcbiAgICB9XG4gICAgdGhpcy5nbG9iYWxFdmVudFJlbW92ZXJzID0gbnVsbDtcbiAgICB0aGlzLmh5ZHJhdGVkID0gZmFsc2U7XG4gIH1cblxuICBzZXRFdmVudERpc3BhdGNoZXIoZGlzcGF0Y2hlcjogUmVuZGVyRXZlbnREaXNwYXRjaGVyKSB7IHRoaXMuZXZlbnREaXNwYXRjaGVyID0gZGlzcGF0Y2hlcjsgfVxuXG4gIGRpc3BhdGNoUmVuZGVyRXZlbnQoYm91bmRFbGVtZW50SW5kZXg6IG51bWJlciwgZXZlbnROYW1lOiBzdHJpbmcsIGV2ZW50OiBhbnkpOiBib29sZWFuIHtcbiAgICB2YXIgYWxsb3dEZWZhdWx0QmVoYXZpb3IgPSB0cnVlO1xuICAgIGlmIChpc1ByZXNlbnQodGhpcy5ldmVudERpc3BhdGNoZXIpKSB7XG4gICAgICB2YXIgbG9jYWxzID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbiAgICAgIGxvY2Fscy5zZXQoJyRldmVudCcsIGV2ZW50KTtcbiAgICAgIGFsbG93RGVmYXVsdEJlaGF2aW9yID1cbiAgICAgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5kaXNwYXRjaFJlbmRlckV2ZW50KGJvdW5kRWxlbWVudEluZGV4LCBldmVudE5hbWUsIGxvY2Fscyk7XG4gICAgfVxuICAgIHJldHVybiBhbGxvd0RlZmF1bHRCZWhhdmlvcjtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvcmVuZGVyL3ZpZXcudHNcbiAqKi8iLCJpbXBvcnQge2lzUHJlc2VudCwgaXNCbGFuaywgVHlwZSwgaXNTdHJpbmcsIFN0cmluZ1dyYXBwZXIsIElTX0RBUlR9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge1NldFdyYXBwZXIsIFN0cmluZ01hcFdyYXBwZXIsIExpc3RXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtcbiAgVGVtcGxhdGVDbWQsXG4gIFRleHRDbWQsXG4gIE5nQ29udGVudENtZCxcbiAgQmVnaW5FbGVtZW50Q21kLFxuICBFbmRFbGVtZW50Q21kLFxuICBCZWdpbkNvbXBvbmVudENtZCxcbiAgRW5kQ29tcG9uZW50Q21kLFxuICBFbWJlZGRlZFRlbXBsYXRlQ21kLFxuICBDb21waWxlZENvbXBvbmVudFRlbXBsYXRlXG59IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci90ZW1wbGF0ZV9jb21tYW5kcyc7XG5pbXBvcnQge1xuICBUZW1wbGF0ZUFzdCxcbiAgVGVtcGxhdGVBc3RWaXNpdG9yLFxuICBOZ0NvbnRlbnRBc3QsXG4gIEVtYmVkZGVkVGVtcGxhdGVBc3QsXG4gIEVsZW1lbnRBc3QsXG4gIFZhcmlhYmxlQXN0LFxuICBCb3VuZEV2ZW50QXN0LFxuICBCb3VuZEVsZW1lbnRQcm9wZXJ0eUFzdCxcbiAgQXR0ckFzdCxcbiAgQm91bmRUZXh0QXN0LFxuICBUZXh0QXN0LFxuICBEaXJlY3RpdmVBc3QsXG4gIEJvdW5kRGlyZWN0aXZlUHJvcGVydHlBc3QsXG4gIHRlbXBsYXRlVmlzaXRBbGxcbn0gZnJvbSAnLi90ZW1wbGF0ZV9hc3QnO1xuaW1wb3J0IHtDb21waWxlVHlwZU1ldGFkYXRhLCBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGF9IGZyb20gJy4vZGlyZWN0aXZlX21ldGFkYXRhJztcbmltcG9ydCB7U291cmNlRXhwcmVzc2lvbnMsIFNvdXJjZUV4cHJlc3Npb24sIG1vZHVsZVJlZn0gZnJvbSAnLi9zb3VyY2VfbW9kdWxlJztcblxuaW1wb3J0IHtWaWV3RW5jYXBzdWxhdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvbWV0YWRhdGEvdmlldyc7XG5pbXBvcnQge1xuICBlc2NhcGVTaW5nbGVRdW90ZVN0cmluZyxcbiAgY29kZUdlbkNvbnN0Q29uc3RydWN0b3JDYWxsLFxuICBjb2RlR2VuVmFsdWVGbixcbiAgTU9EVUxFX1NVRkZJWFxufSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5cbmV4cG9ydCB2YXIgVEVNUExBVEVfQ09NTUFORFNfTU9EVUxFX1JFRiA9XG4gICAgbW9kdWxlUmVmKGBwYWNrYWdlOmFuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci90ZW1wbGF0ZV9jb21tYW5kcyR7TU9EVUxFX1NVRkZJWH1gKTtcblxuY29uc3QgSU1QTElDSVRfVEVNUExBVEVfVkFSID0gJ1xcJGltcGxpY2l0JztcbmNvbnN0IENMQVNTX0FUVFIgPSAnY2xhc3MnO1xuY29uc3QgU1RZTEVfQVRUUiA9ICdzdHlsZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDb21tYW5kQ29tcGlsZXIge1xuICBjb21waWxlQ29tcG9uZW50UnVudGltZShjb21wb25lbnQ6IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YSwgdGVtcGxhdGU6IFRlbXBsYXRlQXN0W10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdG9yRmFjdG9yaWVzOiBGdW5jdGlvbltdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRUZW1wbGF0ZUZhY3Rvcnk6IEZ1bmN0aW9uKTogVGVtcGxhdGVDbWRbXSB7XG4gICAgdmFyIHZpc2l0b3IgPSBuZXcgQ29tbWFuZEJ1aWxkZXJWaXNpdG9yKFxuICAgICAgICBuZXcgUnVudGltZUNvbW1hbmRGYWN0b3J5KGNvbXBvbmVudCwgY29tcG9uZW50VGVtcGxhdGVGYWN0b3J5LCBjaGFuZ2VEZXRlY3RvckZhY3RvcmllcyksIDApO1xuICAgIHRlbXBsYXRlVmlzaXRBbGwodmlzaXRvciwgdGVtcGxhdGUpO1xuICAgIHJldHVybiB2aXNpdG9yLnJlc3VsdDtcbiAgfVxuXG4gIGNvbXBpbGVDb21wb25lbnRDb2RlR2VuKGNvbXBvbmVudDogQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhLCB0ZW1wbGF0ZTogVGVtcGxhdGVBc3RbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0b3JGYWN0b3J5RXhwcmVzc2lvbnM6IHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRUZW1wbGF0ZUZhY3Rvcnk6IEZ1bmN0aW9uKTogU291cmNlRXhwcmVzc2lvbiB7XG4gICAgdmFyIHZpc2l0b3IgPVxuICAgICAgICBuZXcgQ29tbWFuZEJ1aWxkZXJWaXNpdG9yKG5ldyBDb2RlZ2VuQ29tbWFuZEZhY3RvcnkoY29tcG9uZW50LCBjb21wb25lbnRUZW1wbGF0ZUZhY3RvcnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3RvckZhY3RvcnlFeHByZXNzaW9ucyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7XG4gICAgdGVtcGxhdGVWaXNpdEFsbCh2aXNpdG9yLCB0ZW1wbGF0ZSk7XG4gICAgcmV0dXJuIG5ldyBTb3VyY2VFeHByZXNzaW9uKFtdLCBjb2RlR2VuQXJyYXkodmlzaXRvci5yZXN1bHQpKTtcbiAgfVxufVxuXG5pbnRlcmZhY2UgQ29tbWFuZEZhY3Rvcnk8Uj4ge1xuICBjcmVhdGVUZXh0KHZhbHVlOiBzdHJpbmcsIGlzQm91bmQ6IGJvb2xlYW4sIG5nQ29udGVudEluZGV4OiBudW1iZXIpOiBSO1xuICBjcmVhdGVOZ0NvbnRlbnQoaW5kZXg6IG51bWJlciwgbmdDb250ZW50SW5kZXg6IG51bWJlcik6IFI7XG4gIGNyZWF0ZUJlZ2luRWxlbWVudChuYW1lOiBzdHJpbmcsIGF0dHJOYW1lQW5kVmFsdWVzOiBzdHJpbmdbXSwgZXZlbnRUYXJnZXRBbmROYW1lczogc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZU5hbWVBbmRWYWx1ZXM6IHN0cmluZ1tdLCBkaXJlY3RpdmVzOiBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGFbXSxcbiAgICAgICAgICAgICAgICAgICAgIGlzQm91bmQ6IGJvb2xlYW4sIG5nQ29udGVudEluZGV4OiBudW1iZXIpOiBSO1xuICBjcmVhdGVFbmRFbGVtZW50KCk6IFI7XG4gIGNyZWF0ZUJlZ2luQ29tcG9uZW50KG5hbWU6IHN0cmluZywgYXR0ck5hbWVBbmRWYWx1ZXM6IHN0cmluZ1tdLCBldmVudFRhcmdldEFuZE5hbWVzOiBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVOYW1lQW5kVmFsdWVzOiBzdHJpbmdbXSwgZGlyZWN0aXZlczogQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhW10sXG4gICAgICAgICAgICAgICAgICAgICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLCBuZ0NvbnRlbnRJbmRleDogbnVtYmVyKTogUjtcbiAgY3JlYXRlRW5kQ29tcG9uZW50KCk6IFI7XG4gIGNyZWF0ZUVtYmVkZGVkVGVtcGxhdGUoZW1iZWRkZWRUZW1wbGF0ZUluZGV4OiBudW1iZXIsIGF0dHJOYW1lQW5kVmFsdWVzOiBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZU5hbWVBbmRWYWx1ZXM6IHN0cmluZ1tdLCBkaXJlY3RpdmVzOiBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGFbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICBpc01lcmdlZDogYm9vbGVhbiwgbmdDb250ZW50SW5kZXg6IG51bWJlciwgY2hpbGRyZW46IFJbXSk6IFI7XG59XG5cbmNsYXNzIFJ1bnRpbWVDb21tYW5kRmFjdG9yeSBpbXBsZW1lbnRzIENvbW1hbmRGYWN0b3J5PFRlbXBsYXRlQ21kPiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY29tcG9uZW50OiBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGEsXG4gICAgICAgICAgICAgIHByaXZhdGUgY29tcG9uZW50VGVtcGxhdGVGYWN0b3J5OiBGdW5jdGlvbixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvckZhY3RvcmllczogRnVuY3Rpb25bXSkge31cbiAgcHJpdmF0ZSBfbWFwRGlyZWN0aXZlcyhkaXJlY3RpdmVzOiBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGFbXSk6IFR5cGVbXSB7XG4gICAgcmV0dXJuIGRpcmVjdGl2ZXMubWFwKGRpcmVjdGl2ZSA9PiBkaXJlY3RpdmUudHlwZS5ydW50aW1lKTtcbiAgfVxuXG4gIGNyZWF0ZVRleHQodmFsdWU6IHN0cmluZywgaXNCb3VuZDogYm9vbGVhbiwgbmdDb250ZW50SW5kZXg6IG51bWJlcik6IFRlbXBsYXRlQ21kIHtcbiAgICByZXR1cm4gbmV3IFRleHRDbWQodmFsdWUsIGlzQm91bmQsIG5nQ29udGVudEluZGV4KTtcbiAgfVxuICBjcmVhdGVOZ0NvbnRlbnQoaW5kZXg6IG51bWJlciwgbmdDb250ZW50SW5kZXg6IG51bWJlcik6IFRlbXBsYXRlQ21kIHtcbiAgICByZXR1cm4gbmV3IE5nQ29udGVudENtZChpbmRleCwgbmdDb250ZW50SW5kZXgpO1xuICB9XG4gIGNyZWF0ZUJlZ2luRWxlbWVudChuYW1lOiBzdHJpbmcsIGF0dHJOYW1lQW5kVmFsdWVzOiBzdHJpbmdbXSwgZXZlbnRUYXJnZXRBbmROYW1lczogc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZU5hbWVBbmRWYWx1ZXM6IHN0cmluZ1tdLCBkaXJlY3RpdmVzOiBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGFbXSxcbiAgICAgICAgICAgICAgICAgICAgIGlzQm91bmQ6IGJvb2xlYW4sIG5nQ29udGVudEluZGV4OiBudW1iZXIpOiBUZW1wbGF0ZUNtZCB7XG4gICAgcmV0dXJuIG5ldyBCZWdpbkVsZW1lbnRDbWQobmFtZSwgYXR0ck5hbWVBbmRWYWx1ZXMsIGV2ZW50VGFyZ2V0QW5kTmFtZXMsIHZhcmlhYmxlTmFtZUFuZFZhbHVlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXBEaXJlY3RpdmVzKGRpcmVjdGl2ZXMpLCBpc0JvdW5kLCBuZ0NvbnRlbnRJbmRleCk7XG4gIH1cbiAgY3JlYXRlRW5kRWxlbWVudCgpOiBUZW1wbGF0ZUNtZCB7IHJldHVybiBuZXcgRW5kRWxlbWVudENtZCgpOyB9XG4gIGNyZWF0ZUJlZ2luQ29tcG9uZW50KG5hbWU6IHN0cmluZywgYXR0ck5hbWVBbmRWYWx1ZXM6IHN0cmluZ1tdLCBldmVudFRhcmdldEFuZE5hbWVzOiBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVOYW1lQW5kVmFsdWVzOiBzdHJpbmdbXSwgZGlyZWN0aXZlczogQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhW10sXG4gICAgICAgICAgICAgICAgICAgICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLCBuZ0NvbnRlbnRJbmRleDogbnVtYmVyKTogVGVtcGxhdGVDbWQge1xuICAgIHZhciBuZXN0ZWRUZW1wbGF0ZUFjY2Vzc29yID0gdGhpcy5jb21wb25lbnRUZW1wbGF0ZUZhY3RvcnkoZGlyZWN0aXZlc1swXSk7XG4gICAgcmV0dXJuIG5ldyBCZWdpbkNvbXBvbmVudENtZChuYW1lLCBhdHRyTmFtZUFuZFZhbHVlcywgZXZlbnRUYXJnZXRBbmROYW1lcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlTmFtZUFuZFZhbHVlcywgdGhpcy5fbWFwRGlyZWN0aXZlcyhkaXJlY3RpdmVzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY2Fwc3VsYXRpb24sIG5nQ29udGVudEluZGV4LCBuZXN0ZWRUZW1wbGF0ZUFjY2Vzc29yKTtcbiAgfVxuICBjcmVhdGVFbmRDb21wb25lbnQoKTogVGVtcGxhdGVDbWQgeyByZXR1cm4gbmV3IEVuZENvbXBvbmVudENtZCgpOyB9XG4gIGNyZWF0ZUVtYmVkZGVkVGVtcGxhdGUoZW1iZWRkZWRUZW1wbGF0ZUluZGV4OiBudW1iZXIsIGF0dHJOYW1lQW5kVmFsdWVzOiBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZU5hbWVBbmRWYWx1ZXM6IHN0cmluZ1tdLCBkaXJlY3RpdmVzOiBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGFbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICBpc01lcmdlZDogYm9vbGVhbiwgbmdDb250ZW50SW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogVGVtcGxhdGVDbWRbXSk6IFRlbXBsYXRlQ21kIHtcbiAgICByZXR1cm4gbmV3IEVtYmVkZGVkVGVtcGxhdGVDbWQoYXR0ck5hbWVBbmRWYWx1ZXMsIHZhcmlhYmxlTmFtZUFuZFZhbHVlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFwRGlyZWN0aXZlcyhkaXJlY3RpdmVzKSwgaXNNZXJnZWQsIG5nQ29udGVudEluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yRmFjdG9yaWVzW2VtYmVkZGVkVGVtcGxhdGVJbmRleF0sIGNoaWxkcmVuKTtcbiAgfVxufVxuXG5jbGFzcyBDb2RlZ2VuQ29tbWFuZEZhY3RvcnkgaW1wbGVtZW50cyBDb21tYW5kRmFjdG9yeTxFeHByZXNzaW9uPiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY29tcG9uZW50OiBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGEsXG4gICAgICAgICAgICAgIHByaXZhdGUgY29tcG9uZW50VGVtcGxhdGVGYWN0b3J5OiBGdW5jdGlvbixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvckZhY3RvcnlFeHByZXNzaW9uczogc3RyaW5nW10pIHt9XG5cbiAgY3JlYXRlVGV4dCh2YWx1ZTogc3RyaW5nLCBpc0JvdW5kOiBib29sZWFuLCBuZ0NvbnRlbnRJbmRleDogbnVtYmVyKTogRXhwcmVzc2lvbiB7XG4gICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uKFxuICAgICAgICBgJHtjb2RlR2VuQ29uc3RDb25zdHJ1Y3RvckNhbGwoVEVNUExBVEVfQ09NTUFORFNfTU9EVUxFX1JFRisnVGV4dENtZCcpfSgke2VzY2FwZVNpbmdsZVF1b3RlU3RyaW5nKHZhbHVlKX0sICR7aXNCb3VuZH0sICR7bmdDb250ZW50SW5kZXh9KWApO1xuICB9XG4gIGNyZWF0ZU5nQ29udGVudChpbmRleDogbnVtYmVyLCBuZ0NvbnRlbnRJbmRleDogbnVtYmVyKTogRXhwcmVzc2lvbiB7XG4gICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uKFxuICAgICAgICBgJHtjb2RlR2VuQ29uc3RDb25zdHJ1Y3RvckNhbGwoVEVNUExBVEVfQ09NTUFORFNfTU9EVUxFX1JFRisnTmdDb250ZW50Q21kJyl9KCR7aW5kZXh9LCAke25nQ29udGVudEluZGV4fSlgKTtcbiAgfVxuICBjcmVhdGVCZWdpbkVsZW1lbnQobmFtZTogc3RyaW5nLCBhdHRyTmFtZUFuZFZhbHVlczogc3RyaW5nW10sIGV2ZW50VGFyZ2V0QW5kTmFtZXM6IHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVOYW1lQW5kVmFsdWVzOiBzdHJpbmdbXSwgZGlyZWN0aXZlczogQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhW10sXG4gICAgICAgICAgICAgICAgICAgICBpc0JvdW5kOiBib29sZWFuLCBuZ0NvbnRlbnRJbmRleDogbnVtYmVyKTogRXhwcmVzc2lvbiB7XG4gICAgdmFyIGF0dHJzRXhwcmVzc2lvbiA9IGNvZGVHZW5BcnJheShhdHRyTmFtZUFuZFZhbHVlcyk7XG4gICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uKFxuICAgICAgICBgJHtjb2RlR2VuQ29uc3RDb25zdHJ1Y3RvckNhbGwoVEVNUExBVEVfQ09NTUFORFNfTU9EVUxFX1JFRisnQmVnaW5FbGVtZW50Q21kJyl9KCR7ZXNjYXBlU2luZ2xlUXVvdGVTdHJpbmcobmFtZSl9LCAke2F0dHJzRXhwcmVzc2lvbn0sIGAgK1xuICAgICAgICBgJHtjb2RlR2VuQXJyYXkoZXZlbnRUYXJnZXRBbmROYW1lcyl9LCAke2NvZGVHZW5BcnJheSh2YXJpYWJsZU5hbWVBbmRWYWx1ZXMpfSwgJHtjb2RlR2VuRGlyZWN0aXZlc0FycmF5KGRpcmVjdGl2ZXMpfSwgJHtpc0JvdW5kfSwgJHtuZ0NvbnRlbnRJbmRleH0pYCk7XG4gIH1cbiAgY3JlYXRlRW5kRWxlbWVudCgpOiBFeHByZXNzaW9uIHtcbiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb24oXG4gICAgICAgIGAke2NvZGVHZW5Db25zdENvbnN0cnVjdG9yQ2FsbChURU1QTEFURV9DT01NQU5EU19NT0RVTEVfUkVGKydFbmRFbGVtZW50Q21kJyl9KClgKTtcbiAgfVxuICBjcmVhdGVCZWdpbkNvbXBvbmVudChuYW1lOiBzdHJpbmcsIGF0dHJOYW1lQW5kVmFsdWVzOiBzdHJpbmdbXSwgZXZlbnRUYXJnZXRBbmROYW1lczogc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlTmFtZUFuZFZhbHVlczogc3RyaW5nW10sIGRpcmVjdGl2ZXM6IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YVtdLFxuICAgICAgICAgICAgICAgICAgICAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbiwgbmdDb250ZW50SW5kZXg6IG51bWJlcik6IEV4cHJlc3Npb24ge1xuICAgIHZhciBhdHRyc0V4cHJlc3Npb24gPSBjb2RlR2VuQXJyYXkoYXR0ck5hbWVBbmRWYWx1ZXMpO1xuICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbihcbiAgICAgICAgYCR7Y29kZUdlbkNvbnN0Q29uc3RydWN0b3JDYWxsKFRFTVBMQVRFX0NPTU1BTkRTX01PRFVMRV9SRUYrJ0JlZ2luQ29tcG9uZW50Q21kJyl9KCR7ZXNjYXBlU2luZ2xlUXVvdGVTdHJpbmcobmFtZSl9LCAke2F0dHJzRXhwcmVzc2lvbn0sIGAgK1xuICAgICAgICBgJHtjb2RlR2VuQXJyYXkoZXZlbnRUYXJnZXRBbmROYW1lcyl9LCAke2NvZGVHZW5BcnJheSh2YXJpYWJsZU5hbWVBbmRWYWx1ZXMpfSwgJHtjb2RlR2VuRGlyZWN0aXZlc0FycmF5KGRpcmVjdGl2ZXMpfSwgJHtjb2RlR2VuVmlld0VuY2Fwc3VsYXRpb24oZW5jYXBzdWxhdGlvbil9LCAke25nQ29udGVudEluZGV4fSwgJHt0aGlzLmNvbXBvbmVudFRlbXBsYXRlRmFjdG9yeShkaXJlY3RpdmVzWzBdKX0pYCk7XG4gIH1cbiAgY3JlYXRlRW5kQ29tcG9uZW50KCk6IEV4cHJlc3Npb24ge1xuICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbihcbiAgICAgICAgYCR7Y29kZUdlbkNvbnN0Q29uc3RydWN0b3JDYWxsKFRFTVBMQVRFX0NPTU1BTkRTX01PRFVMRV9SRUYrJ0VuZENvbXBvbmVudENtZCcpfSgpYCk7XG4gIH1cbiAgY3JlYXRlRW1iZWRkZWRUZW1wbGF0ZShlbWJlZGRlZFRlbXBsYXRlSW5kZXg6IG51bWJlciwgYXR0ck5hbWVBbmRWYWx1ZXM6IHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlTmFtZUFuZFZhbHVlczogc3RyaW5nW10sIGRpcmVjdGl2ZXM6IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YVtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGlzTWVyZ2VkOiBib29sZWFuLCBuZ0NvbnRlbnRJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBFeHByZXNzaW9uW10pOiBFeHByZXNzaW9uIHtcbiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb24oXG4gICAgICAgIGAke2NvZGVHZW5Db25zdENvbnN0cnVjdG9yQ2FsbChURU1QTEFURV9DT01NQU5EU19NT0RVTEVfUkVGKydFbWJlZGRlZFRlbXBsYXRlQ21kJyl9KCR7Y29kZUdlbkFycmF5KGF0dHJOYW1lQW5kVmFsdWVzKX0sICR7Y29kZUdlbkFycmF5KHZhcmlhYmxlTmFtZUFuZFZhbHVlcyl9LCBgICtcbiAgICAgICAgYCR7Y29kZUdlbkRpcmVjdGl2ZXNBcnJheShkaXJlY3RpdmVzKX0sICR7aXNNZXJnZWR9LCAke25nQ29udGVudEluZGV4fSwgJHt0aGlzLmNoYW5nZURldGVjdG9yRmFjdG9yeUV4cHJlc3Npb25zW2VtYmVkZGVkVGVtcGxhdGVJbmRleF19LCAke2NvZGVHZW5BcnJheShjaGlsZHJlbil9KWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIHZpc2l0QW5kUmV0dXJuQ29udGV4dCh2aXNpdG9yOiBUZW1wbGF0ZUFzdFZpc2l0b3IsIGFzdHM6IFRlbXBsYXRlQXN0W10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogYW55KTogYW55IHtcbiAgdGVtcGxhdGVWaXNpdEFsbCh2aXNpdG9yLCBhc3RzLCBjb250ZXh0KTtcbiAgcmV0dXJuIGNvbnRleHQ7XG59XG5cbmNsYXNzIENvbW1hbmRCdWlsZGVyVmlzaXRvcjxSPiBpbXBsZW1lbnRzIFRlbXBsYXRlQXN0VmlzaXRvciB7XG4gIHJlc3VsdDogUltdID0gW107XG4gIHRyYW5zaXRpdmVOZ0NvbnRlbnRDb3VudDogbnVtYmVyID0gMDtcbiAgY29uc3RydWN0b3IocHVibGljIGNvbW1hbmRGYWN0b3J5OiBDb21tYW5kRmFjdG9yeTxSPiwgcHVibGljIGVtYmVkZGVkVGVtcGxhdGVJbmRleDogbnVtYmVyKSB7fVxuXG4gIHByaXZhdGUgX3JlYWRBdHRyTmFtZUFuZFZhbHVlcyhkaXJlY3RpdmVzOiBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGFbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJBc3RzOiBUZW1wbGF0ZUFzdFtdKTogc3RyaW5nW10ge1xuICAgIHZhciBhdHRycyA9IGtleVZhbHVlQXJyYXlUb01hcCh2aXNpdEFuZFJldHVybkNvbnRleHQodGhpcywgYXR0ckFzdHMsIFtdKSk7XG4gICAgZGlyZWN0aXZlcy5mb3JFYWNoKGRpcmVjdGl2ZU1ldGEgPT4ge1xuICAgICAgU3RyaW5nTWFwV3JhcHBlci5mb3JFYWNoKGRpcmVjdGl2ZU1ldGEuaG9zdEF0dHJpYnV0ZXMsICh2YWx1ZSwgbmFtZSkgPT4ge1xuICAgICAgICB2YXIgcHJldlZhbHVlID0gYXR0cnNbbmFtZV07XG4gICAgICAgIGF0dHJzW25hbWVdID0gaXNQcmVzZW50KHByZXZWYWx1ZSkgPyBtZXJnZUF0dHJpYnV0ZVZhbHVlKG5hbWUsIHByZXZWYWx1ZSwgdmFsdWUpIDogdmFsdWU7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gbWFwVG9LZXlWYWx1ZUFycmF5KGF0dHJzKTtcbiAgfVxuXG4gIHZpc2l0TmdDb250ZW50KGFzdDogTmdDb250ZW50QXN0LCBjb250ZXh0OiBhbnkpOiBhbnkge1xuICAgIHRoaXMudHJhbnNpdGl2ZU5nQ29udGVudENvdW50Kys7XG4gICAgdGhpcy5yZXN1bHQucHVzaCh0aGlzLmNvbW1hbmRGYWN0b3J5LmNyZWF0ZU5nQ29udGVudChhc3QuaW5kZXgsIGFzdC5uZ0NvbnRlbnRJbmRleCkpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZpc2l0RW1iZWRkZWRUZW1wbGF0ZShhc3Q6IEVtYmVkZGVkVGVtcGxhdGVBc3QsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgdGhpcy5lbWJlZGRlZFRlbXBsYXRlSW5kZXgrKztcbiAgICB2YXIgY2hpbGRWaXNpdG9yID0gbmV3IENvbW1hbmRCdWlsZGVyVmlzaXRvcih0aGlzLmNvbW1hbmRGYWN0b3J5LCB0aGlzLmVtYmVkZGVkVGVtcGxhdGVJbmRleCk7XG4gICAgdGVtcGxhdGVWaXNpdEFsbChjaGlsZFZpc2l0b3IsIGFzdC5jaGlsZHJlbik7XG4gICAgdmFyIGlzTWVyZ2VkID0gY2hpbGRWaXNpdG9yLnRyYW5zaXRpdmVOZ0NvbnRlbnRDb3VudCA+IDA7XG4gICAgdmFyIHZhcmlhYmxlTmFtZUFuZFZhbHVlcyA9IFtdO1xuICAgIGFzdC52YXJzLmZvckVhY2goKHZhckFzdCkgPT4ge1xuICAgICAgdmFyaWFibGVOYW1lQW5kVmFsdWVzLnB1c2godmFyQXN0Lm5hbWUpO1xuICAgICAgdmFyaWFibGVOYW1lQW5kVmFsdWVzLnB1c2godmFyQXN0LnZhbHVlLmxlbmd0aCA+IDAgPyB2YXJBc3QudmFsdWUgOiBJTVBMSUNJVF9URU1QTEFURV9WQVIpO1xuICAgIH0pO1xuICAgIHZhciBkaXJlY3RpdmVzID0gW107XG4gICAgTGlzdFdyYXBwZXIuZm9yRWFjaFdpdGhJbmRleChhc3QuZGlyZWN0aXZlcywgKGRpcmVjdGl2ZUFzdDogRGlyZWN0aXZlQXN0LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICBkaXJlY3RpdmVBc3QudmlzaXQodGhpcywgbmV3IERpcmVjdGl2ZUNvbnRleHQoaW5kZXgsIFtdLCBbXSwgZGlyZWN0aXZlcykpO1xuICAgIH0pO1xuICAgIHRoaXMucmVzdWx0LnB1c2godGhpcy5jb21tYW5kRmFjdG9yeS5jcmVhdGVFbWJlZGRlZFRlbXBsYXRlKFxuICAgICAgICB0aGlzLmVtYmVkZGVkVGVtcGxhdGVJbmRleCwgdGhpcy5fcmVhZEF0dHJOYW1lQW5kVmFsdWVzKGRpcmVjdGl2ZXMsIGFzdC5hdHRycyksXG4gICAgICAgIHZhcmlhYmxlTmFtZUFuZFZhbHVlcywgZGlyZWN0aXZlcywgaXNNZXJnZWQsIGFzdC5uZ0NvbnRlbnRJbmRleCwgY2hpbGRWaXNpdG9yLnJlc3VsdCkpO1xuICAgIHRoaXMudHJhbnNpdGl2ZU5nQ29udGVudENvdW50ICs9IGNoaWxkVmlzaXRvci50cmFuc2l0aXZlTmdDb250ZW50Q291bnQ7XG4gICAgdGhpcy5lbWJlZGRlZFRlbXBsYXRlSW5kZXggPSBjaGlsZFZpc2l0b3IuZW1iZWRkZWRUZW1wbGF0ZUluZGV4O1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZpc2l0RWxlbWVudChhc3Q6IEVsZW1lbnRBc3QsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgdmFyIGNvbXBvbmVudCA9IGFzdC5nZXRDb21wb25lbnQoKTtcbiAgICB2YXIgZXZlbnRUYXJnZXRBbmROYW1lcyA9IHZpc2l0QW5kUmV0dXJuQ29udGV4dCh0aGlzLCBhc3Qub3V0cHV0cywgW10pO1xuICAgIHZhciB2YXJpYWJsZU5hbWVBbmRWYWx1ZXMgPSBbXTtcbiAgICBpZiAoaXNCbGFuayhjb21wb25lbnQpKSB7XG4gICAgICBhc3QuZXhwb3J0QXNWYXJzLmZvckVhY2goKHZhckFzdCkgPT4ge1xuICAgICAgICB2YXJpYWJsZU5hbWVBbmRWYWx1ZXMucHVzaCh2YXJBc3QubmFtZSk7XG4gICAgICAgIHZhcmlhYmxlTmFtZUFuZFZhbHVlcy5wdXNoKG51bGwpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHZhciBkaXJlY3RpdmVzID0gW107XG4gICAgTGlzdFdyYXBwZXIuZm9yRWFjaFdpdGhJbmRleChhc3QuZGlyZWN0aXZlcywgKGRpcmVjdGl2ZUFzdDogRGlyZWN0aXZlQXN0LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICBkaXJlY3RpdmVBc3QudmlzaXQodGhpcywgbmV3IERpcmVjdGl2ZUNvbnRleHQoaW5kZXgsIGV2ZW50VGFyZ2V0QW5kTmFtZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVOYW1lQW5kVmFsdWVzLCBkaXJlY3RpdmVzKSk7XG4gICAgfSk7XG4gICAgZXZlbnRUYXJnZXRBbmROYW1lcyA9IHJlbW92ZUtleVZhbHVlQXJyYXlEdXBsaWNhdGVzKGV2ZW50VGFyZ2V0QW5kTmFtZXMpO1xuXG4gICAgdmFyIGF0dHJOYW1lQW5kVmFsdWVzID0gdGhpcy5fcmVhZEF0dHJOYW1lQW5kVmFsdWVzKGRpcmVjdGl2ZXMsIGFzdC5hdHRycyk7XG4gICAgaWYgKGlzUHJlc2VudChjb21wb25lbnQpKSB7XG4gICAgICB0aGlzLnJlc3VsdC5wdXNoKHRoaXMuY29tbWFuZEZhY3RvcnkuY3JlYXRlQmVnaW5Db21wb25lbnQoXG4gICAgICAgICAgYXN0Lm5hbWUsIGF0dHJOYW1lQW5kVmFsdWVzLCBldmVudFRhcmdldEFuZE5hbWVzLCB2YXJpYWJsZU5hbWVBbmRWYWx1ZXMsIGRpcmVjdGl2ZXMsXG4gICAgICAgICAgY29tcG9uZW50LnRlbXBsYXRlLmVuY2Fwc3VsYXRpb24sIGFzdC5uZ0NvbnRlbnRJbmRleCkpO1xuICAgICAgdGVtcGxhdGVWaXNpdEFsbCh0aGlzLCBhc3QuY2hpbGRyZW4pO1xuICAgICAgdGhpcy5yZXN1bHQucHVzaCh0aGlzLmNvbW1hbmRGYWN0b3J5LmNyZWF0ZUVuZENvbXBvbmVudCgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZXN1bHQucHVzaCh0aGlzLmNvbW1hbmRGYWN0b3J5LmNyZWF0ZUJlZ2luRWxlbWVudChcbiAgICAgICAgICBhc3QubmFtZSwgYXR0ck5hbWVBbmRWYWx1ZXMsIGV2ZW50VGFyZ2V0QW5kTmFtZXMsIHZhcmlhYmxlTmFtZUFuZFZhbHVlcywgZGlyZWN0aXZlcyxcbiAgICAgICAgICBhc3QuaXNCb3VuZCgpLCBhc3QubmdDb250ZW50SW5kZXgpKTtcbiAgICAgIHRlbXBsYXRlVmlzaXRBbGwodGhpcywgYXN0LmNoaWxkcmVuKTtcbiAgICAgIHRoaXMucmVzdWx0LnB1c2godGhpcy5jb21tYW5kRmFjdG9yeS5jcmVhdGVFbmRFbGVtZW50KCkpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2aXNpdFZhcmlhYmxlKGFzdDogVmFyaWFibGVBc3QsIGN0eDogYW55KTogYW55IHsgcmV0dXJuIG51bGw7IH1cbiAgdmlzaXRBdHRyKGFzdDogQXR0ckFzdCwgYXR0ck5hbWVBbmRWYWx1ZXM6IHN0cmluZ1tdKTogYW55IHtcbiAgICBhdHRyTmFtZUFuZFZhbHVlcy5wdXNoKGFzdC5uYW1lKTtcbiAgICBhdHRyTmFtZUFuZFZhbHVlcy5wdXNoKGFzdC52YWx1ZSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmlzaXRCb3VuZFRleHQoYXN0OiBCb3VuZFRleHRBc3QsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgdGhpcy5yZXN1bHQucHVzaCh0aGlzLmNvbW1hbmRGYWN0b3J5LmNyZWF0ZVRleHQobnVsbCwgdHJ1ZSwgYXN0Lm5nQ29udGVudEluZGV4KSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmlzaXRUZXh0KGFzdDogVGV4dEFzdCwgY29udGV4dDogYW55KTogYW55IHtcbiAgICB0aGlzLnJlc3VsdC5wdXNoKHRoaXMuY29tbWFuZEZhY3RvcnkuY3JlYXRlVGV4dChhc3QudmFsdWUsIGZhbHNlLCBhc3QubmdDb250ZW50SW5kZXgpKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2aXNpdERpcmVjdGl2ZShhc3Q6IERpcmVjdGl2ZUFzdCwgY3R4OiBEaXJlY3RpdmVDb250ZXh0KTogYW55IHtcbiAgICBjdHgudGFyZ2V0RGlyZWN0aXZlcy5wdXNoKGFzdC5kaXJlY3RpdmUpO1xuICAgIHRlbXBsYXRlVmlzaXRBbGwodGhpcywgYXN0Lmhvc3RFdmVudHMsIGN0eC5ldmVudFRhcmdldEFuZE5hbWVzKTtcbiAgICBhc3QuZXhwb3J0QXNWYXJzLmZvckVhY2godmFyQXN0ID0+IHtcbiAgICAgIGN0eC50YXJnZXRWYXJpYWJsZU5hbWVBbmRWYWx1ZXMucHVzaCh2YXJBc3QubmFtZSk7XG4gICAgICBjdHgudGFyZ2V0VmFyaWFibGVOYW1lQW5kVmFsdWVzLnB1c2goY3R4LmluZGV4KTtcbiAgICB9KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2aXNpdEV2ZW50KGFzdDogQm91bmRFdmVudEFzdCwgZXZlbnRUYXJnZXRBbmROYW1lczogc3RyaW5nW10pOiBhbnkge1xuICAgIGV2ZW50VGFyZ2V0QW5kTmFtZXMucHVzaChhc3QudGFyZ2V0KTtcbiAgICBldmVudFRhcmdldEFuZE5hbWVzLnB1c2goYXN0Lm5hbWUpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZpc2l0RGlyZWN0aXZlUHJvcGVydHkoYXN0OiBCb3VuZERpcmVjdGl2ZVByb3BlcnR5QXN0LCBjb250ZXh0OiBhbnkpOiBhbnkgeyByZXR1cm4gbnVsbDsgfVxuICB2aXNpdEVsZW1lbnRQcm9wZXJ0eShhc3Q6IEJvdW5kRWxlbWVudFByb3BlcnR5QXN0LCBjb250ZXh0OiBhbnkpOiBhbnkgeyByZXR1cm4gbnVsbDsgfVxufVxuXG5mdW5jdGlvbiByZW1vdmVLZXlWYWx1ZUFycmF5RHVwbGljYXRlcyhrZXlWYWx1ZUFycmF5OiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgdmFyIGtub3duUGFpcnMgPSBuZXcgU2V0KCk7XG4gIHZhciByZXN1bHRLZXlWYWx1ZUFycmF5ID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5VmFsdWVBcnJheS5sZW5ndGg7IGkgKz0gMikge1xuICAgIHZhciBrZXkgPSBrZXlWYWx1ZUFycmF5W2ldO1xuICAgIHZhciB2YWx1ZSA9IGtleVZhbHVlQXJyYXlbaSArIDFdO1xuICAgIHZhciBwYWlySWQgPSBgJHtrZXl9OiR7dmFsdWV9YDtcbiAgICBpZiAoIVNldFdyYXBwZXIuaGFzKGtub3duUGFpcnMsIHBhaXJJZCkpIHtcbiAgICAgIHJlc3VsdEtleVZhbHVlQXJyYXkucHVzaChrZXkpO1xuICAgICAgcmVzdWx0S2V5VmFsdWVBcnJheS5wdXNoKHZhbHVlKTtcbiAgICAgIGtub3duUGFpcnMuYWRkKHBhaXJJZCk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHRLZXlWYWx1ZUFycmF5O1xufVxuXG5mdW5jdGlvbiBrZXlWYWx1ZUFycmF5VG9NYXAoa2V5VmFsdWVBcnI6IHN0cmluZ1tdKToge1trZXk6IHN0cmluZ106IHN0cmluZ30ge1xuICB2YXIgZGF0YToge1trZXk6IHN0cmluZ106IHN0cmluZ30gPSB7fTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlWYWx1ZUFyci5sZW5ndGg7IGkgKz0gMikge1xuICAgIGRhdGFba2V5VmFsdWVBcnJbaV1dID0ga2V5VmFsdWVBcnJbaSArIDFdO1xuICB9XG4gIHJldHVybiBkYXRhO1xufVxuXG5mdW5jdGlvbiBtYXBUb0tleVZhbHVlQXJyYXkoZGF0YToge1trZXk6IHN0cmluZ106IHN0cmluZ30pOiBzdHJpbmdbXSB7XG4gIHZhciBlbnRyeUFycmF5ID0gW107XG4gIFN0cmluZ01hcFdyYXBwZXIuZm9yRWFjaChkYXRhLCAodmFsdWUsIG5hbWUpID0+IHsgZW50cnlBcnJheS5wdXNoKFtuYW1lLCB2YWx1ZV0pOyB9KTtcbiAgLy8gV2UgbmVlZCB0byBzb3J0IHRvIGdldCBhIGRlZmluZWQgb3V0cHV0IG9yZGVyXG4gIC8vIGZvciB0ZXN0cyBhbmQgZm9yIGNhY2hpbmcgZ2VuZXJhdGVkIGFydGlmYWN0cy4uLlxuICBMaXN0V3JhcHBlci5zb3J0KGVudHJ5QXJyYXksIChlbnRyeTEsIGVudHJ5MikgPT4gU3RyaW5nV3JhcHBlci5jb21wYXJlKGVudHJ5MVswXSwgZW50cnkyWzBdKSk7XG4gIHZhciBrZXlWYWx1ZUFycmF5ID0gW107XG4gIGVudHJ5QXJyYXkuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICBrZXlWYWx1ZUFycmF5LnB1c2goZW50cnlbMF0pO1xuICAgIGtleVZhbHVlQXJyYXkucHVzaChlbnRyeVsxXSk7XG4gIH0pO1xuICByZXR1cm4ga2V5VmFsdWVBcnJheTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VBdHRyaWJ1dGVWYWx1ZShhdHRyTmFtZTogc3RyaW5nLCBhdHRyVmFsdWUxOiBzdHJpbmcsIGF0dHJWYWx1ZTI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChhdHRyTmFtZSA9PSBDTEFTU19BVFRSIHx8IGF0dHJOYW1lID09IFNUWUxFX0FUVFIpIHtcbiAgICByZXR1cm4gYCR7YXR0clZhbHVlMX0gJHthdHRyVmFsdWUyfWA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGF0dHJWYWx1ZTI7XG4gIH1cbn1cblxuY2xhc3MgRGlyZWN0aXZlQ29udGV4dCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBpbmRleDogbnVtYmVyLCBwdWJsaWMgZXZlbnRUYXJnZXRBbmROYW1lczogc3RyaW5nW10sXG4gICAgICAgICAgICAgIHB1YmxpYyB0YXJnZXRWYXJpYWJsZU5hbWVBbmRWYWx1ZXM6IGFueVtdLFxuICAgICAgICAgICAgICBwdWJsaWMgdGFyZ2V0RGlyZWN0aXZlczogQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhW10pIHt9XG59XG5cbmNsYXNzIEV4cHJlc3Npb24ge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdmFsdWU6IHN0cmluZykge31cbn1cblxuZnVuY3Rpb24gZXNjYXBlVmFsdWUodmFsdWU6IGFueSk6IHN0cmluZyB7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEV4cHJlc3Npb24pIHtcbiAgICByZXR1cm4gdmFsdWUudmFsdWU7XG4gIH0gZWxzZSBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgcmV0dXJuIGVzY2FwZVNpbmdsZVF1b3RlU3RyaW5nKHZhbHVlKTtcbiAgfSBlbHNlIGlmIChpc0JsYW5rKHZhbHVlKSkge1xuICAgIHJldHVybiAnbnVsbCc7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGAke3ZhbHVlfWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29kZUdlbkFycmF5KGRhdGE6IGFueVtdKTogc3RyaW5nIHtcbiAgdmFyIGJhc2UgPSBgWyR7ZGF0YS5tYXAoZXNjYXBlVmFsdWUpLmpvaW4oJywnKX1dYDtcbiAgcmV0dXJuIElTX0RBUlQgPyBgY29uc3QgJHtiYXNlfWAgOiBiYXNlO1xufVxuXG5mdW5jdGlvbiBjb2RlR2VuRGlyZWN0aXZlc0FycmF5KGRpcmVjdGl2ZXM6IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YVtdKTogc3RyaW5nIHtcbiAgdmFyIGV4cHJlc3Npb25zID0gZGlyZWN0aXZlcy5tYXAoXG4gICAgICBkaXJlY3RpdmVUeXBlID0+IGAke21vZHVsZVJlZihkaXJlY3RpdmVUeXBlLnR5cGUubW9kdWxlVXJsKX0ke2RpcmVjdGl2ZVR5cGUudHlwZS5uYW1lfWApO1xuICB2YXIgYmFzZSA9IGBbJHtleHByZXNzaW9ucy5qb2luKCcsJyl9XWA7XG4gIHJldHVybiBJU19EQVJUID8gYGNvbnN0ICR7YmFzZX1gIDogYmFzZTtcbn1cblxuZnVuY3Rpb24gY29kZUdlblZpZXdFbmNhcHN1bGF0aW9uKHZhbHVlOiBWaWV3RW5jYXBzdWxhdGlvbik6IHN0cmluZyB7XG4gIGlmIChJU19EQVJUKSB7XG4gICAgcmV0dXJuIGAke1RFTVBMQVRFX0NPTU1BTkRTX01PRFVMRV9SRUZ9JHt2YWx1ZX1gO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tcGlsZXIvY29tbWFuZF9jb21waWxlci50c1xuICoqLyIsImltcG9ydCB7TGlzdFdyYXBwZXIsIFN0cmluZ01hcFdyYXBwZXIsIFNldFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge1JlZ0V4cFdyYXBwZXIsIGlzUHJlc2VudCwgU3RyaW5nV3JhcHBlciwgaXNCbGFua30gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7SW5qZWN0YWJsZSwgSW5qZWN0LCBPcGFxdWVUb2tlbiwgT3B0aW9uYWx9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuaW1wb3J0IHtDT05TVF9FWFBSfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtQYXJzZXIsIEFTVCwgQVNUV2l0aFNvdXJjZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9jaGFuZ2VfZGV0ZWN0aW9uJztcbmltcG9ydCB7VGVtcGxhdGVCaW5kaW5nfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL3BhcnNlci9hc3QnO1xuaW1wb3J0IHtDb21waWxlRGlyZWN0aXZlTWV0YWRhdGF9IGZyb20gJy4vZGlyZWN0aXZlX21ldGFkYXRhJztcbmltcG9ydCB7SHRtbFBhcnNlcn0gZnJvbSAnLi9odG1sX3BhcnNlcic7XG5pbXBvcnQge3NwbGl0TnNOYW1lfSBmcm9tICcuL2h0bWxfdGFncyc7XG5pbXBvcnQge1BhcnNlU291cmNlU3BhbiwgUGFyc2VFcnJvciwgUGFyc2VMb2NhdGlvbn0gZnJvbSAnLi9wYXJzZV91dGlsJztcblxuXG5pbXBvcnQge1xuICBFbGVtZW50QXN0LFxuICBCb3VuZEVsZW1lbnRQcm9wZXJ0eUFzdCxcbiAgQm91bmRFdmVudEFzdCxcbiAgVmFyaWFibGVBc3QsXG4gIFRlbXBsYXRlQXN0LFxuICBUZW1wbGF0ZUFzdFZpc2l0b3IsXG4gIHRlbXBsYXRlVmlzaXRBbGwsXG4gIFRleHRBc3QsXG4gIEJvdW5kVGV4dEFzdCxcbiAgRW1iZWRkZWRUZW1wbGF0ZUFzdCxcbiAgQXR0ckFzdCxcbiAgTmdDb250ZW50QXN0LFxuICBQcm9wZXJ0eUJpbmRpbmdUeXBlLFxuICBEaXJlY3RpdmVBc3QsXG4gIEJvdW5kRGlyZWN0aXZlUHJvcGVydHlBc3Rcbn0gZnJvbSAnLi90ZW1wbGF0ZV9hc3QnO1xuaW1wb3J0IHtDc3NTZWxlY3RvciwgU2VsZWN0b3JNYXRjaGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvY29tcGlsZXIvc2VsZWN0b3InO1xuXG5pbXBvcnQge0VsZW1lbnRTY2hlbWFSZWdpc3RyeX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3NjaGVtYS9lbGVtZW50X3NjaGVtYV9yZWdpc3RyeSc7XG5pbXBvcnQge3ByZXBhcnNlRWxlbWVudCwgUHJlcGFyc2VkRWxlbWVudCwgUHJlcGFyc2VkRWxlbWVudFR5cGV9IGZyb20gJy4vdGVtcGxhdGVfcHJlcGFyc2VyJztcblxuaW1wb3J0IHtpc1N0eWxlVXJsUmVzb2x2YWJsZX0gZnJvbSAnLi9zdHlsZV91cmxfcmVzb2x2ZXInO1xuXG5pbXBvcnQge1xuICBIdG1sQXN0VmlzaXRvcixcbiAgSHRtbEFzdCxcbiAgSHRtbEVsZW1lbnRBc3QsXG4gIEh0bWxBdHRyQXN0LFxuICBIdG1sVGV4dEFzdCxcbiAgaHRtbFZpc2l0QWxsXG59IGZyb20gJy4vaHRtbF9hc3QnO1xuXG5pbXBvcnQge3NwbGl0QXRDb2xvbn0gZnJvbSAnLi91dGlsJztcblxuLy8gR3JvdXAgMSA9IFwiYmluZC1cIlxuLy8gR3JvdXAgMiA9IFwidmFyLVwiIG9yIFwiI1wiXG4vLyBHcm91cCAzID0gXCJvbi1cIlxuLy8gR3JvdXAgNCA9IFwiYmluZG9uLVwiXG4vLyBHcm91cCA1ID0gdGhlIGlkZW50aWZpZXIgYWZ0ZXIgXCJiaW5kLVwiLCBcInZhci0vI1wiLCBvciBcIm9uLVwiXG4vLyBHcm91cCA2ID0gaWRlbml0aWZlciBpbnNpZGUgWygpXVxuLy8gR3JvdXAgNyA9IGlkZW5pdGlmZXIgaW5zaWRlIFtdXG4vLyBHcm91cCA4ID0gaWRlbnRpZmllciBpbnNpZGUgKClcbnZhciBCSU5EX05BTUVfUkVHRVhQID1cbiAgICAvXig/Oig/Oig/OihiaW5kLSl8KHZhci18Iyl8KG9uLSl8KGJpbmRvbi0pKSguKykpfFxcW1xcKChbXlxcKV0rKVxcKVxcXXxcXFsoW15cXF1dKylcXF18XFwoKFteXFwpXSspXFwpKSQvZztcblxuY29uc3QgVEVNUExBVEVfRUxFTUVOVCA9ICd0ZW1wbGF0ZSc7XG5jb25zdCBURU1QTEFURV9BVFRSID0gJ3RlbXBsYXRlJztcbmNvbnN0IFRFTVBMQVRFX0FUVFJfUFJFRklYID0gJyonO1xuY29uc3QgQ0xBU1NfQVRUUiA9ICdjbGFzcyc7XG5cbnZhciBQUk9QRVJUWV9QQVJUU19TRVBBUkFUT1IgPSAnLic7XG5jb25zdCBBVFRSSUJVVEVfUFJFRklYID0gJ2F0dHInO1xuY29uc3QgQ0xBU1NfUFJFRklYID0gJ2NsYXNzJztcbmNvbnN0IFNUWUxFX1BSRUZJWCA9ICdzdHlsZSc7XG5cbnZhciBURVhUX0NTU19TRUxFQ1RPUiA9IENzc1NlbGVjdG9yLnBhcnNlKCcqJylbMF07XG5cbi8qKlxuICogUHJvdmlkZXMgYW4gYXJyYXkgb2Yge0BsaW5rIFRlbXBsYXRlQXN0VmlzaXRvcn1zIHdoaWNoIHdpbGwgYmUgdXNlZCB0byB0cmFuc2Zvcm1cbiAqIHBhcnNlZCB0ZW1wbGF0ZXMgYmVmb3JlIGNvbXBpbGF0aW9uIGlzIGludm9rZWQsIGFsbG93aW5nIGN1c3RvbSBleHByZXNzaW9uIHN5bnRheFxuICogYW5kIG90aGVyIGFkdmFuY2VkIHRyYW5zZm9ybWF0aW9ucy5cbiAqXG4gKiBUaGlzIGlzIGN1cnJlbnRseSBhbiBpbnRlcm5hbC1vbmx5IGZlYXR1cmUgYW5kIG5vdCBtZWFudCBmb3IgZ2VuZXJhbCB1c2UuXG4gKi9cbmV4cG9ydCBjb25zdCBURU1QTEFURV9UUkFOU0ZPUk1TID0gQ09OU1RfRVhQUihuZXcgT3BhcXVlVG9rZW4oJ1RlbXBsYXRlVHJhbnNmb3JtcycpKTtcblxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlUGFyc2VFcnJvciBleHRlbmRzIFBhcnNlRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGxvY2F0aW9uOiBQYXJzZUxvY2F0aW9uKSB7IHN1cGVyKGxvY2F0aW9uLCBtZXNzYWdlKTsgfVxufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVQYXJzZXIge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9leHByUGFyc2VyOiBQYXJzZXIsIHByaXZhdGUgX3NjaGVtYVJlZ2lzdHJ5OiBFbGVtZW50U2NoZW1hUmVnaXN0cnksXG4gICAgICAgICAgICAgIHByaXZhdGUgX2h0bWxQYXJzZXI6IEh0bWxQYXJzZXIsXG4gICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoVEVNUExBVEVfVFJBTlNGT1JNUykgcHVibGljIHRyYW5zZm9ybXM6IFRlbXBsYXRlQXN0VmlzaXRvcltdKSB7fVxuXG4gIHBhcnNlKHRlbXBsYXRlOiBzdHJpbmcsIGRpcmVjdGl2ZXM6IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YVtdLFxuICAgICAgICB0ZW1wbGF0ZVVybDogc3RyaW5nKTogVGVtcGxhdGVBc3RbXSB7XG4gICAgdmFyIHBhcnNlVmlzaXRvciA9IG5ldyBUZW1wbGF0ZVBhcnNlVmlzaXRvcihkaXJlY3RpdmVzLCB0aGlzLl9leHByUGFyc2VyLCB0aGlzLl9zY2hlbWFSZWdpc3RyeSk7XG4gICAgdmFyIGh0bWxBc3RXaXRoRXJyb3JzID0gdGhpcy5faHRtbFBhcnNlci5wYXJzZSh0ZW1wbGF0ZSwgdGVtcGxhdGVVcmwpO1xuICAgIHZhciByZXN1bHQgPSBodG1sVmlzaXRBbGwocGFyc2VWaXNpdG9yLCBodG1sQXN0V2l0aEVycm9ycy5yb290Tm9kZXMsIEVNUFRZX0NPTVBPTkVOVCk7XG4gICAgdmFyIGVycm9yczogUGFyc2VFcnJvcltdID0gaHRtbEFzdFdpdGhFcnJvcnMuZXJyb3JzLmNvbmNhdChwYXJzZVZpc2l0b3IuZXJyb3JzKTtcbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBlcnJvclN0cmluZyA9IGVycm9ycy5qb2luKCdcXG4nKTtcbiAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBUZW1wbGF0ZSBwYXJzZSBlcnJvcnM6XFxuJHtlcnJvclN0cmluZ31gKTtcbiAgICB9XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLnRyYW5zZm9ybXMpKSB7XG4gICAgICB0aGlzLnRyYW5zZm9ybXMuZm9yRWFjaChcbiAgICAgICAgICAodHJhbnNmb3JtOiBUZW1wbGF0ZUFzdFZpc2l0b3IpID0+IHsgcmVzdWx0ID0gdGVtcGxhdGVWaXNpdEFsbCh0cmFuc2Zvcm0sIHJlc3VsdCk7IH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbmNsYXNzIFRlbXBsYXRlUGFyc2VWaXNpdG9yIGltcGxlbWVudHMgSHRtbEFzdFZpc2l0b3Ige1xuICBzZWxlY3Rvck1hdGNoZXI6IFNlbGVjdG9yTWF0Y2hlcjtcbiAgZXJyb3JzOiBUZW1wbGF0ZVBhcnNlRXJyb3JbXSA9IFtdO1xuICBkaXJlY3RpdmVzSW5kZXggPSBuZXcgTWFwPENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YSwgbnVtYmVyPigpO1xuICBuZ0NvbnRlbnRDb3VudDogbnVtYmVyID0gMDtcblxuICBjb25zdHJ1Y3RvcihkaXJlY3RpdmVzOiBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGFbXSwgcHJpdmF0ZSBfZXhwclBhcnNlcjogUGFyc2VyLFxuICAgICAgICAgICAgICBwcml2YXRlIF9zY2hlbWFSZWdpc3RyeTogRWxlbWVudFNjaGVtYVJlZ2lzdHJ5KSB7XG4gICAgdGhpcy5zZWxlY3Rvck1hdGNoZXIgPSBuZXcgU2VsZWN0b3JNYXRjaGVyKCk7XG4gICAgTGlzdFdyYXBwZXIuZm9yRWFjaFdpdGhJbmRleChkaXJlY3RpdmVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpcmVjdGl2ZTogQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvciA9IENzc1NlbGVjdG9yLnBhcnNlKGRpcmVjdGl2ZS5zZWxlY3Rvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0b3JNYXRjaGVyLmFkZFNlbGVjdGFibGVzKHNlbGVjdG9yLCBkaXJlY3RpdmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZXNJbmRleC5zZXQoZGlyZWN0aXZlLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlcG9ydEVycm9yKG1lc3NhZ2U6IHN0cmluZywgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuKSB7XG4gICAgdGhpcy5lcnJvcnMucHVzaChuZXcgVGVtcGxhdGVQYXJzZUVycm9yKG1lc3NhZ2UsIHNvdXJjZVNwYW4uc3RhcnQpKTtcbiAgfVxuXG4gIHByaXZhdGUgX3BhcnNlSW50ZXJwb2xhdGlvbih2YWx1ZTogc3RyaW5nLCBzb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4pOiBBU1RXaXRoU291cmNlIHtcbiAgICB2YXIgc291cmNlSW5mbyA9IHNvdXJjZVNwYW4uc3RhcnQudG9TdHJpbmcoKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMuX2V4cHJQYXJzZXIucGFyc2VJbnRlcnBvbGF0aW9uKHZhbHVlLCBzb3VyY2VJbmZvKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLl9yZXBvcnRFcnJvcihgJHtlfWAsIHNvdXJjZVNwYW4pO1xuICAgICAgcmV0dXJuIHRoaXMuX2V4cHJQYXJzZXIud3JhcExpdGVyYWxQcmltaXRpdmUoJ0VSUk9SJywgc291cmNlSW5mbyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcGFyc2VBY3Rpb24odmFsdWU6IHN0cmluZywgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuKTogQVNUV2l0aFNvdXJjZSB7XG4gICAgdmFyIHNvdXJjZUluZm8gPSBzb3VyY2VTcGFuLnN0YXJ0LnRvU3RyaW5nKCk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLl9leHByUGFyc2VyLnBhcnNlQWN0aW9uKHZhbHVlLCBzb3VyY2VJbmZvKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLl9yZXBvcnRFcnJvcihgJHtlfWAsIHNvdXJjZVNwYW4pO1xuICAgICAgcmV0dXJuIHRoaXMuX2V4cHJQYXJzZXIud3JhcExpdGVyYWxQcmltaXRpdmUoJ0VSUk9SJywgc291cmNlSW5mbyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcGFyc2VCaW5kaW5nKHZhbHVlOiBzdHJpbmcsIHNvdXJjZVNwYW46IFBhcnNlU291cmNlU3Bhbik6IEFTVFdpdGhTb3VyY2Uge1xuICAgIHZhciBzb3VyY2VJbmZvID0gc291cmNlU3Bhbi5zdGFydC50b1N0cmluZygpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5fZXhwclBhcnNlci5wYXJzZUJpbmRpbmcodmFsdWUsIHNvdXJjZUluZm8pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuX3JlcG9ydEVycm9yKGAke2V9YCwgc291cmNlU3Bhbik7XG4gICAgICByZXR1cm4gdGhpcy5fZXhwclBhcnNlci53cmFwTGl0ZXJhbFByaW1pdGl2ZSgnRVJST1InLCBzb3VyY2VJbmZvKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9wYXJzZVRlbXBsYXRlQmluZGluZ3ModmFsdWU6IHN0cmluZywgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuKTogVGVtcGxhdGVCaW5kaW5nW10ge1xuICAgIHZhciBzb3VyY2VJbmZvID0gc291cmNlU3Bhbi5zdGFydC50b1N0cmluZygpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5fZXhwclBhcnNlci5wYXJzZVRlbXBsYXRlQmluZGluZ3ModmFsdWUsIHNvdXJjZUluZm8pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuX3JlcG9ydEVycm9yKGAke2V9YCwgc291cmNlU3Bhbik7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgdmlzaXRUZXh0KGFzdDogSHRtbFRleHRBc3QsIGNvbXBvbmVudDogQ29tcG9uZW50KTogYW55IHtcbiAgICB2YXIgbmdDb250ZW50SW5kZXggPSBjb21wb25lbnQuZmluZE5nQ29udGVudEluZGV4KFRFWFRfQ1NTX1NFTEVDVE9SKTtcbiAgICB2YXIgZXhwciA9IHRoaXMuX3BhcnNlSW50ZXJwb2xhdGlvbihhc3QudmFsdWUsIGFzdC5zb3VyY2VTcGFuKTtcbiAgICBpZiAoaXNQcmVzZW50KGV4cHIpKSB7XG4gICAgICByZXR1cm4gbmV3IEJvdW5kVGV4dEFzdChleHByLCBuZ0NvbnRlbnRJbmRleCwgYXN0LnNvdXJjZVNwYW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IFRleHRBc3QoYXN0LnZhbHVlLCBuZ0NvbnRlbnRJbmRleCwgYXN0LnNvdXJjZVNwYW4pO1xuICAgIH1cbiAgfVxuXG4gIHZpc2l0QXR0cihhc3Q6IEh0bWxBdHRyQXN0LCBjb250ZXg6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIG5ldyBBdHRyQXN0KGFzdC5uYW1lLCBhc3QudmFsdWUsIGFzdC5zb3VyY2VTcGFuKTtcbiAgfVxuXG4gIHZpc2l0RWxlbWVudChlbGVtZW50OiBIdG1sRWxlbWVudEFzdCwgY29tcG9uZW50OiBDb21wb25lbnQpOiBhbnkge1xuICAgIHZhciBub2RlTmFtZSA9IGVsZW1lbnQubmFtZTtcbiAgICB2YXIgcHJlcGFyc2VkRWxlbWVudCA9IHByZXBhcnNlRWxlbWVudChlbGVtZW50KTtcbiAgICBpZiAocHJlcGFyc2VkRWxlbWVudC50eXBlID09PSBQcmVwYXJzZWRFbGVtZW50VHlwZS5TQ1JJUFQgfHxcbiAgICAgICAgcHJlcGFyc2VkRWxlbWVudC50eXBlID09PSBQcmVwYXJzZWRFbGVtZW50VHlwZS5TVFlMRSkge1xuICAgICAgLy8gU2tpcHBpbmcgPHNjcmlwdD4gZm9yIHNlY3VyaXR5IHJlYXNvbnNcbiAgICAgIC8vIFNraXBwaW5nIDxzdHlsZT4gYXMgd2UgYWxyZWFkeSBwcm9jZXNzZWQgdGhlbVxuICAgICAgLy8gaW4gdGhlIFN0eWxlQ29tcGlsZXJcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAocHJlcGFyc2VkRWxlbWVudC50eXBlID09PSBQcmVwYXJzZWRFbGVtZW50VHlwZS5TVFlMRVNIRUVUICYmXG4gICAgICAgIGlzU3R5bGVVcmxSZXNvbHZhYmxlKHByZXBhcnNlZEVsZW1lbnQuaHJlZkF0dHIpKSB7XG4gICAgICAvLyBTa2lwcGluZyBzdHlsZXNoZWV0cyB3aXRoIGVpdGhlciByZWxhdGl2ZSB1cmxzIG9yIHBhY2thZ2Ugc2NoZW1lIGFzIHdlIGFscmVhZHkgcHJvY2Vzc2VkXG4gICAgICAvLyB0aGVtIGluIHRoZSBTdHlsZUNvbXBpbGVyXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgbWF0Y2hhYmxlQXR0cnM6IHN0cmluZ1tdW10gPSBbXTtcbiAgICB2YXIgZWxlbWVudE9yRGlyZWN0aXZlUHJvcHM6IEJvdW5kRWxlbWVudE9yRGlyZWN0aXZlUHJvcGVydHlbXSA9IFtdO1xuICAgIHZhciB2YXJzOiBWYXJpYWJsZUFzdFtdID0gW107XG4gICAgdmFyIGV2ZW50czogQm91bmRFdmVudEFzdFtdID0gW107XG5cbiAgICB2YXIgdGVtcGxhdGVFbGVtZW50T3JEaXJlY3RpdmVQcm9wczogQm91bmRFbGVtZW50T3JEaXJlY3RpdmVQcm9wZXJ0eVtdID0gW107XG4gICAgdmFyIHRlbXBsYXRlVmFyczogVmFyaWFibGVBc3RbXSA9IFtdO1xuICAgIHZhciB0ZW1wbGF0ZU1hdGNoYWJsZUF0dHJzOiBzdHJpbmdbXVtdID0gW107XG4gICAgdmFyIGhhc0lubGluZVRlbXBsYXRlcyA9IGZhbHNlO1xuICAgIHZhciBhdHRycyA9IFtdO1xuXG4gICAgZWxlbWVudC5hdHRycy5mb3JFYWNoKGF0dHIgPT4ge1xuICAgICAgbWF0Y2hhYmxlQXR0cnMucHVzaChbYXR0ci5uYW1lLCBhdHRyLnZhbHVlXSk7XG4gICAgICB2YXIgaGFzQmluZGluZyA9IHRoaXMuX3BhcnNlQXR0cihhdHRyLCBtYXRjaGFibGVBdHRycywgZWxlbWVudE9yRGlyZWN0aXZlUHJvcHMsIGV2ZW50cywgdmFycyk7XG4gICAgICB2YXIgaGFzVGVtcGxhdGVCaW5kaW5nID0gdGhpcy5fcGFyc2VJbmxpbmVUZW1wbGF0ZUJpbmRpbmcoXG4gICAgICAgICAgYXR0ciwgdGVtcGxhdGVNYXRjaGFibGVBdHRycywgdGVtcGxhdGVFbGVtZW50T3JEaXJlY3RpdmVQcm9wcywgdGVtcGxhdGVWYXJzKTtcbiAgICAgIGlmICghaGFzQmluZGluZyAmJiAhaGFzVGVtcGxhdGVCaW5kaW5nKSB7XG4gICAgICAgIC8vIGRvbid0IGluY2x1ZGUgdGhlIGJpbmRpbmdzIGFzIGF0dHJpYnV0ZXMgYXMgd2VsbCBpbiB0aGUgQVNUXG4gICAgICAgIGF0dHJzLnB1c2godGhpcy52aXNpdEF0dHIoYXR0ciwgbnVsbCkpO1xuICAgICAgfVxuICAgICAgaWYgKGhhc1RlbXBsYXRlQmluZGluZykge1xuICAgICAgICBoYXNJbmxpbmVUZW1wbGF0ZXMgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdmFyIGxjRWxOYW1lID0gc3BsaXROc05hbWUobm9kZU5hbWUudG9Mb3dlckNhc2UoKSlbMV07XG4gICAgdmFyIGlzVGVtcGxhdGVFbGVtZW50ID0gbGNFbE5hbWUgPT0gVEVNUExBVEVfRUxFTUVOVDtcbiAgICB2YXIgZWxlbWVudENzc1NlbGVjdG9yID0gY3JlYXRlRWxlbWVudENzc1NlbGVjdG9yKG5vZGVOYW1lLCBtYXRjaGFibGVBdHRycyk7XG4gICAgdmFyIGRpcmVjdGl2ZXMgPSB0aGlzLl9jcmVhdGVEaXJlY3RpdmVBc3RzKFxuICAgICAgICBlbGVtZW50Lm5hbWUsIHRoaXMuX3BhcnNlRGlyZWN0aXZlcyh0aGlzLnNlbGVjdG9yTWF0Y2hlciwgZWxlbWVudENzc1NlbGVjdG9yKSxcbiAgICAgICAgZWxlbWVudE9yRGlyZWN0aXZlUHJvcHMsIGlzVGVtcGxhdGVFbGVtZW50ID8gW10gOiB2YXJzLCBlbGVtZW50LnNvdXJjZVNwYW4pO1xuICAgIHZhciBlbGVtZW50UHJvcHM6IEJvdW5kRWxlbWVudFByb3BlcnR5QXN0W10gPVxuICAgICAgICB0aGlzLl9jcmVhdGVFbGVtZW50UHJvcGVydHlBc3RzKGVsZW1lbnQubmFtZSwgZWxlbWVudE9yRGlyZWN0aXZlUHJvcHMsIGRpcmVjdGl2ZXMpO1xuICAgIHZhciBjaGlsZHJlbiA9IGh0bWxWaXNpdEFsbChwcmVwYXJzZWRFbGVtZW50Lm5vbkJpbmRhYmxlID8gTk9OX0JJTkRBQkxFX1ZJU0lUT1IgOiB0aGlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmNoaWxkcmVuLCBDb21wb25lbnQuY3JlYXRlKGRpcmVjdGl2ZXMpKTtcbiAgICB2YXIgZWxlbWVudE5nQ29udGVudEluZGV4ID1cbiAgICAgICAgaGFzSW5saW5lVGVtcGxhdGVzID8gbnVsbCA6IGNvbXBvbmVudC5maW5kTmdDb250ZW50SW5kZXgoZWxlbWVudENzc1NlbGVjdG9yKTtcbiAgICB2YXIgcGFyc2VkRWxlbWVudDtcbiAgICBpZiAocHJlcGFyc2VkRWxlbWVudC50eXBlID09PSBQcmVwYXJzZWRFbGVtZW50VHlwZS5OR19DT05URU5UKSB7XG4gICAgICBpZiAoaXNQcmVzZW50KGVsZW1lbnQuY2hpbGRyZW4pICYmIGVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihcbiAgICAgICAgICAgIGA8bmctY29udGVudD4gZWxlbWVudCBjYW5ub3QgaGF2ZSBjb250ZW50LiA8bmctY29udGVudD4gbXVzdCBiZSBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSA8L25nLWNvbnRlbnQ+YCxcbiAgICAgICAgICAgIGVsZW1lbnQuc291cmNlU3Bhbik7XG4gICAgICB9XG4gICAgICBwYXJzZWRFbGVtZW50ID1cbiAgICAgICAgICBuZXcgTmdDb250ZW50QXN0KHRoaXMubmdDb250ZW50Q291bnQrKywgZWxlbWVudE5nQ29udGVudEluZGV4LCBlbGVtZW50LnNvdXJjZVNwYW4pO1xuICAgIH0gZWxzZSBpZiAoaXNUZW1wbGF0ZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuX2Fzc2VydEFsbEV2ZW50c1B1Ymxpc2hlZEJ5RGlyZWN0aXZlcyhkaXJlY3RpdmVzLCBldmVudHMpO1xuICAgICAgdGhpcy5fYXNzZXJ0Tm9Db21wb25lbnRzTm9yRWxlbWVudEJpbmRpbmdzT25UZW1wbGF0ZShkaXJlY3RpdmVzLCBlbGVtZW50UHJvcHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuc291cmNlU3Bhbik7XG4gICAgICBwYXJzZWRFbGVtZW50ID0gbmV3IEVtYmVkZGVkVGVtcGxhdGVBc3QoYXR0cnMsIGV2ZW50cywgdmFycywgZGlyZWN0aXZlcywgY2hpbGRyZW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudE5nQ29udGVudEluZGV4LCBlbGVtZW50LnNvdXJjZVNwYW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9hc3NlcnRPbmx5T25lQ29tcG9uZW50KGRpcmVjdGl2ZXMsIGVsZW1lbnQuc291cmNlU3Bhbik7XG4gICAgICB2YXIgZWxlbWVudEV4cG9ydEFzVmFycyA9IHZhcnMuZmlsdGVyKHZhckFzdCA9PiB2YXJBc3QudmFsdWUubGVuZ3RoID09PSAwKTtcbiAgICAgIHBhcnNlZEVsZW1lbnQgPVxuICAgICAgICAgIG5ldyBFbGVtZW50QXN0KG5vZGVOYW1lLCBhdHRycywgZWxlbWVudFByb3BzLCBldmVudHMsIGVsZW1lbnRFeHBvcnRBc1ZhcnMsIGRpcmVjdGl2ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4sIGVsZW1lbnROZ0NvbnRlbnRJbmRleCwgZWxlbWVudC5zb3VyY2VTcGFuKTtcbiAgICB9XG4gICAgaWYgKGhhc0lubGluZVRlbXBsYXRlcykge1xuICAgICAgdmFyIHRlbXBsYXRlQ3NzU2VsZWN0b3IgPSBjcmVhdGVFbGVtZW50Q3NzU2VsZWN0b3IoVEVNUExBVEVfRUxFTUVOVCwgdGVtcGxhdGVNYXRjaGFibGVBdHRycyk7XG4gICAgICB2YXIgdGVtcGxhdGVEaXJlY3RpdmVzID0gdGhpcy5fY3JlYXRlRGlyZWN0aXZlQXN0cyhcbiAgICAgICAgICBlbGVtZW50Lm5hbWUsIHRoaXMuX3BhcnNlRGlyZWN0aXZlcyh0aGlzLnNlbGVjdG9yTWF0Y2hlciwgdGVtcGxhdGVDc3NTZWxlY3RvciksXG4gICAgICAgICAgdGVtcGxhdGVFbGVtZW50T3JEaXJlY3RpdmVQcm9wcywgW10sIGVsZW1lbnQuc291cmNlU3Bhbik7XG4gICAgICB2YXIgdGVtcGxhdGVFbGVtZW50UHJvcHM6IEJvdW5kRWxlbWVudFByb3BlcnR5QXN0W10gPSB0aGlzLl9jcmVhdGVFbGVtZW50UHJvcGVydHlBc3RzKFxuICAgICAgICAgIGVsZW1lbnQubmFtZSwgdGVtcGxhdGVFbGVtZW50T3JEaXJlY3RpdmVQcm9wcywgdGVtcGxhdGVEaXJlY3RpdmVzKTtcbiAgICAgIHRoaXMuX2Fzc2VydE5vQ29tcG9uZW50c05vckVsZW1lbnRCaW5kaW5nc09uVGVtcGxhdGUodGVtcGxhdGVEaXJlY3RpdmVzLCB0ZW1wbGF0ZUVsZW1lbnRQcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zb3VyY2VTcGFuKTtcbiAgICAgIHBhcnNlZEVsZW1lbnQgPSBuZXcgRW1iZWRkZWRUZW1wbGF0ZUFzdChcbiAgICAgICAgICBbXSwgW10sIHRlbXBsYXRlVmFycywgdGVtcGxhdGVEaXJlY3RpdmVzLCBbcGFyc2VkRWxlbWVudF0sXG4gICAgICAgICAgY29tcG9uZW50LmZpbmROZ0NvbnRlbnRJbmRleCh0ZW1wbGF0ZUNzc1NlbGVjdG9yKSwgZWxlbWVudC5zb3VyY2VTcGFuKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlZEVsZW1lbnQ7XG4gIH1cblxuICBwcml2YXRlIF9wYXJzZUlubGluZVRlbXBsYXRlQmluZGluZyhhdHRyOiBIdG1sQXR0ckFzdCwgdGFyZ2V0TWF0Y2hhYmxlQXR0cnM6IHN0cmluZ1tdW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFByb3BzOiBCb3VuZEVsZW1lbnRPckRpcmVjdGl2ZVByb3BlcnR5W10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFZhcnM6IFZhcmlhYmxlQXN0W10pOiBib29sZWFuIHtcbiAgICB2YXIgdGVtcGxhdGVCaW5kaW5nc1NvdXJjZSA9IG51bGw7XG4gICAgaWYgKGF0dHIubmFtZSA9PSBURU1QTEFURV9BVFRSKSB7XG4gICAgICB0ZW1wbGF0ZUJpbmRpbmdzU291cmNlID0gYXR0ci52YWx1ZTtcbiAgICB9IGVsc2UgaWYgKGF0dHIubmFtZS5zdGFydHNXaXRoKFRFTVBMQVRFX0FUVFJfUFJFRklYKSkge1xuICAgICAgdmFyIGtleSA9IGF0dHIubmFtZS5zdWJzdHJpbmcoVEVNUExBVEVfQVRUUl9QUkVGSVgubGVuZ3RoKTsgIC8vIHJlbW92ZSB0aGUgc3RhclxuICAgICAgdGVtcGxhdGVCaW5kaW5nc1NvdXJjZSA9IChhdHRyLnZhbHVlLmxlbmd0aCA9PSAwKSA/IGtleSA6IGtleSArICcgJyArIGF0dHIudmFsdWU7XG4gICAgfVxuICAgIGlmIChpc1ByZXNlbnQodGVtcGxhdGVCaW5kaW5nc1NvdXJjZSkpIHtcbiAgICAgIHZhciBiaW5kaW5ncyA9IHRoaXMuX3BhcnNlVGVtcGxhdGVCaW5kaW5ncyh0ZW1wbGF0ZUJpbmRpbmdzU291cmNlLCBhdHRyLnNvdXJjZVNwYW4pO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiaW5kaW5ncy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYmluZGluZyA9IGJpbmRpbmdzW2ldO1xuICAgICAgICBpZiAoYmluZGluZy5rZXlJc1Zhcikge1xuICAgICAgICAgIHRhcmdldFZhcnMucHVzaChuZXcgVmFyaWFibGVBc3QoYmluZGluZy5rZXksIGJpbmRpbmcubmFtZSwgYXR0ci5zb3VyY2VTcGFuKSk7XG4gICAgICAgICAgdGFyZ2V0TWF0Y2hhYmxlQXR0cnMucHVzaChbYmluZGluZy5rZXksIGJpbmRpbmcubmFtZV0pO1xuICAgICAgICB9IGVsc2UgaWYgKGlzUHJlc2VudChiaW5kaW5nLmV4cHJlc3Npb24pKSB7XG4gICAgICAgICAgdGhpcy5fcGFyc2VQcm9wZXJ0eUFzdChiaW5kaW5nLmtleSwgYmluZGluZy5leHByZXNzaW9uLCBhdHRyLnNvdXJjZVNwYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRNYXRjaGFibGVBdHRycywgdGFyZ2V0UHJvcHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRhcmdldE1hdGNoYWJsZUF0dHJzLnB1c2goW2JpbmRpbmcua2V5LCAnJ10pO1xuICAgICAgICAgIHRoaXMuX3BhcnNlTGl0ZXJhbEF0dHIoYmluZGluZy5rZXksIG51bGwsIGF0dHIuc291cmNlU3BhbiwgdGFyZ2V0UHJvcHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBfcGFyc2VBdHRyKGF0dHI6IEh0bWxBdHRyQXN0LCB0YXJnZXRNYXRjaGFibGVBdHRyczogc3RyaW5nW11bXSxcbiAgICAgICAgICAgICAgICAgICAgIHRhcmdldFByb3BzOiBCb3VuZEVsZW1lbnRPckRpcmVjdGl2ZVByb3BlcnR5W10sIHRhcmdldEV2ZW50czogQm91bmRFdmVudEFzdFtdLFxuICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0VmFyczogVmFyaWFibGVBc3RbXSk6IGJvb2xlYW4ge1xuICAgIHZhciBhdHRyTmFtZSA9IHRoaXMuX25vcm1hbGl6ZUF0dHJpYnV0ZU5hbWUoYXR0ci5uYW1lKTtcbiAgICB2YXIgYXR0clZhbHVlID0gYXR0ci52YWx1ZTtcbiAgICB2YXIgYmluZFBhcnRzID0gUmVnRXhwV3JhcHBlci5maXJzdE1hdGNoKEJJTkRfTkFNRV9SRUdFWFAsIGF0dHJOYW1lKTtcbiAgICB2YXIgaGFzQmluZGluZyA9IGZhbHNlO1xuICAgIGlmIChpc1ByZXNlbnQoYmluZFBhcnRzKSkge1xuICAgICAgaGFzQmluZGluZyA9IHRydWU7XG4gICAgICBpZiAoaXNQcmVzZW50KGJpbmRQYXJ0c1sxXSkpIHsgIC8vIG1hdGNoOiBiaW5kLXByb3BcbiAgICAgICAgdGhpcy5fcGFyc2VQcm9wZXJ0eShiaW5kUGFydHNbNV0sIGF0dHJWYWx1ZSwgYXR0ci5zb3VyY2VTcGFuLCB0YXJnZXRNYXRjaGFibGVBdHRycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRQcm9wcyk7XG5cbiAgICAgIH0gZWxzZSBpZiAoaXNQcmVzZW50KFxuICAgICAgICAgICAgICAgICAgICAgYmluZFBhcnRzWzJdKSkgeyAgLy8gbWF0Y2g6IHZhci1uYW1lIC8gdmFyLW5hbWU9XCJpZGVuXCIgLyAjbmFtZSAvICNuYW1lPVwiaWRlblwiXG4gICAgICAgIHZhciBpZGVudGlmaWVyID0gYmluZFBhcnRzWzVdO1xuICAgICAgICB0aGlzLl9wYXJzZVZhcmlhYmxlKGlkZW50aWZpZXIsIGF0dHJWYWx1ZSwgYXR0ci5zb3VyY2VTcGFuLCB0YXJnZXRWYXJzKTtcblxuICAgICAgfSBlbHNlIGlmIChpc1ByZXNlbnQoYmluZFBhcnRzWzNdKSkgeyAgLy8gbWF0Y2g6IG9uLWV2ZW50XG4gICAgICAgIHRoaXMuX3BhcnNlRXZlbnQoYmluZFBhcnRzWzVdLCBhdHRyVmFsdWUsIGF0dHIuc291cmNlU3BhbiwgdGFyZ2V0TWF0Y2hhYmxlQXR0cnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RXZlbnRzKTtcblxuICAgICAgfSBlbHNlIGlmIChpc1ByZXNlbnQoYmluZFBhcnRzWzRdKSkgeyAgLy8gbWF0Y2g6IGJpbmRvbi1wcm9wXG4gICAgICAgIHRoaXMuX3BhcnNlUHJvcGVydHkoYmluZFBhcnRzWzVdLCBhdHRyVmFsdWUsIGF0dHIuc291cmNlU3BhbiwgdGFyZ2V0TWF0Y2hhYmxlQXR0cnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UHJvcHMpO1xuICAgICAgICB0aGlzLl9wYXJzZUFzc2lnbm1lbnRFdmVudChiaW5kUGFydHNbNV0sIGF0dHJWYWx1ZSwgYXR0ci5zb3VyY2VTcGFuLCB0YXJnZXRNYXRjaGFibGVBdHRycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RXZlbnRzKTtcblxuICAgICAgfSBlbHNlIGlmIChpc1ByZXNlbnQoYmluZFBhcnRzWzZdKSkgeyAgLy8gbWF0Y2g6IFsoZXhwcildXG4gICAgICAgIHRoaXMuX3BhcnNlUHJvcGVydHkoYmluZFBhcnRzWzZdLCBhdHRyVmFsdWUsIGF0dHIuc291cmNlU3BhbiwgdGFyZ2V0TWF0Y2hhYmxlQXR0cnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UHJvcHMpO1xuICAgICAgICB0aGlzLl9wYXJzZUFzc2lnbm1lbnRFdmVudChiaW5kUGFydHNbNl0sIGF0dHJWYWx1ZSwgYXR0ci5zb3VyY2VTcGFuLCB0YXJnZXRNYXRjaGFibGVBdHRycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RXZlbnRzKTtcblxuICAgICAgfSBlbHNlIGlmIChpc1ByZXNlbnQoYmluZFBhcnRzWzddKSkgeyAgLy8gbWF0Y2g6IFtleHByXVxuICAgICAgICB0aGlzLl9wYXJzZVByb3BlcnR5KGJpbmRQYXJ0c1s3XSwgYXR0clZhbHVlLCBhdHRyLnNvdXJjZVNwYW4sIHRhcmdldE1hdGNoYWJsZUF0dHJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFByb3BzKTtcblxuICAgICAgfSBlbHNlIGlmIChpc1ByZXNlbnQoYmluZFBhcnRzWzhdKSkgeyAgLy8gbWF0Y2g6IChldmVudClcbiAgICAgICAgdGhpcy5fcGFyc2VFdmVudChiaW5kUGFydHNbOF0sIGF0dHJWYWx1ZSwgYXR0ci5zb3VyY2VTcGFuLCB0YXJnZXRNYXRjaGFibGVBdHRycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRFdmVudHMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBoYXNCaW5kaW5nID0gdGhpcy5fcGFyc2VQcm9wZXJ0eUludGVycG9sYXRpb24oYXR0ck5hbWUsIGF0dHJWYWx1ZSwgYXR0ci5zb3VyY2VTcGFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE1hdGNoYWJsZUF0dHJzLCB0YXJnZXRQcm9wcyk7XG4gICAgfVxuICAgIGlmICghaGFzQmluZGluZykge1xuICAgICAgdGhpcy5fcGFyc2VMaXRlcmFsQXR0cihhdHRyTmFtZSwgYXR0clZhbHVlLCBhdHRyLnNvdXJjZVNwYW4sIHRhcmdldFByb3BzKTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0JpbmRpbmc7XG4gIH1cblxuICBwcml2YXRlIF9ub3JtYWxpemVBdHRyaWJ1dGVOYW1lKGF0dHJOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBhdHRyTmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ2RhdGEtJykgPyBhdHRyTmFtZS5zdWJzdHJpbmcoNSkgOiBhdHRyTmFtZTtcbiAgfVxuXG4gIHByaXZhdGUgX3BhcnNlVmFyaWFibGUoaWRlbnRpZmllcjogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBzb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0VmFyczogVmFyaWFibGVBc3RbXSkge1xuICAgIGlmIChpZGVudGlmaWVyLmluZGV4T2YoJy0nKSA+IC0xKSB7XG4gICAgICB0aGlzLl9yZXBvcnRFcnJvcihgXCItXCIgaXMgbm90IGFsbG93ZWQgaW4gdmFyaWFibGUgbmFtZXNgLCBzb3VyY2VTcGFuKTtcbiAgICB9XG4gICAgdGFyZ2V0VmFycy5wdXNoKG5ldyBWYXJpYWJsZUFzdChpZGVudGlmaWVyLCB2YWx1ZSwgc291cmNlU3BhbikpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcGFyc2VQcm9wZXJ0eShuYW1lOiBzdHJpbmcsIGV4cHJlc3Npb246IHN0cmluZywgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE1hdGNoYWJsZUF0dHJzOiBzdHJpbmdbXVtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFByb3BzOiBCb3VuZEVsZW1lbnRPckRpcmVjdGl2ZVByb3BlcnR5W10pIHtcbiAgICB0aGlzLl9wYXJzZVByb3BlcnR5QXN0KG5hbWUsIHRoaXMuX3BhcnNlQmluZGluZyhleHByZXNzaW9uLCBzb3VyY2VTcGFuKSwgc291cmNlU3BhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE1hdGNoYWJsZUF0dHJzLCB0YXJnZXRQcm9wcyk7XG4gIH1cblxuICBwcml2YXRlIF9wYXJzZVByb3BlcnR5SW50ZXJwb2xhdGlvbihuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIHNvdXJjZVNwYW46IFBhcnNlU291cmNlU3BhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TWF0Y2hhYmxlQXR0cnM6IHN0cmluZ1tdW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFByb3BzOiBCb3VuZEVsZW1lbnRPckRpcmVjdGl2ZVByb3BlcnR5W10pOiBib29sZWFuIHtcbiAgICB2YXIgZXhwciA9IHRoaXMuX3BhcnNlSW50ZXJwb2xhdGlvbih2YWx1ZSwgc291cmNlU3Bhbik7XG4gICAgaWYgKGlzUHJlc2VudChleHByKSkge1xuICAgICAgdGhpcy5fcGFyc2VQcm9wZXJ0eUFzdChuYW1lLCBleHByLCBzb3VyY2VTcGFuLCB0YXJnZXRNYXRjaGFibGVBdHRycywgdGFyZ2V0UHJvcHMpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgX3BhcnNlUHJvcGVydHlBc3QobmFtZTogc3RyaW5nLCBhc3Q6IEFTVFdpdGhTb3VyY2UsIHNvdXJjZVNwYW46IFBhcnNlU291cmNlU3BhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRNYXRjaGFibGVBdHRyczogc3RyaW5nW11bXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRQcm9wczogQm91bmRFbGVtZW50T3JEaXJlY3RpdmVQcm9wZXJ0eVtdKSB7XG4gICAgdGFyZ2V0TWF0Y2hhYmxlQXR0cnMucHVzaChbbmFtZSwgYXN0LnNvdXJjZV0pO1xuICAgIHRhcmdldFByb3BzLnB1c2gobmV3IEJvdW5kRWxlbWVudE9yRGlyZWN0aXZlUHJvcGVydHkobmFtZSwgYXN0LCBmYWxzZSwgc291cmNlU3BhbikpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcGFyc2VBc3NpZ25tZW50RXZlbnQobmFtZTogc3RyaW5nLCBleHByZXNzaW9uOiBzdHJpbmcsIHNvdXJjZVNwYW46IFBhcnNlU291cmNlU3BhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TWF0Y2hhYmxlQXR0cnM6IHN0cmluZ1tdW10sIHRhcmdldEV2ZW50czogQm91bmRFdmVudEFzdFtdKSB7XG4gICAgdGhpcy5fcGFyc2VFdmVudChgJHtuYW1lfUNoYW5nZWAsIGAke2V4cHJlc3Npb259PSRldmVudGAsIHNvdXJjZVNwYW4sIHRhcmdldE1hdGNoYWJsZUF0dHJzLFxuICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RXZlbnRzKTtcbiAgfVxuXG4gIHByaXZhdGUgX3BhcnNlRXZlbnQobmFtZTogc3RyaW5nLCBleHByZXNzaW9uOiBzdHJpbmcsIHNvdXJjZVNwYW46IFBhcnNlU291cmNlU3BhbixcbiAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRNYXRjaGFibGVBdHRyczogc3RyaW5nW11bXSwgdGFyZ2V0RXZlbnRzOiBCb3VuZEV2ZW50QXN0W10pIHtcbiAgICAvLyBsb25nIGZvcm1hdDogJ3RhcmdldDogZXZlbnROYW1lJ1xuICAgIHZhciBwYXJ0cyA9IHNwbGl0QXRDb2xvbihuYW1lLCBbbnVsbCwgbmFtZV0pO1xuICAgIHZhciB0YXJnZXQgPSBwYXJ0c1swXTtcbiAgICB2YXIgZXZlbnROYW1lID0gcGFydHNbMV07XG4gICAgdGFyZ2V0RXZlbnRzLnB1c2gobmV3IEJvdW5kRXZlbnRBc3QoZXZlbnROYW1lLCB0YXJnZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGFyc2VBY3Rpb24oZXhwcmVzc2lvbiwgc291cmNlU3BhbiksIHNvdXJjZVNwYW4pKTtcbiAgICAvLyBEb24ndCBkZXRlY3QgZGlyZWN0aXZlcyBmb3IgZXZlbnQgbmFtZXMgZm9yIG5vdyxcbiAgICAvLyBzbyBkb24ndCBhZGQgdGhlIGV2ZW50IG5hbWUgdG8gdGhlIG1hdGNoYWJsZUF0dHJzXG4gIH1cblxuICBwcml2YXRlIF9wYXJzZUxpdGVyYWxBdHRyKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZywgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFByb3BzOiBCb3VuZEVsZW1lbnRPckRpcmVjdGl2ZVByb3BlcnR5W10pIHtcbiAgICB0YXJnZXRQcm9wcy5wdXNoKG5ldyBCb3VuZEVsZW1lbnRPckRpcmVjdGl2ZVByb3BlcnR5KFxuICAgICAgICBuYW1lLCB0aGlzLl9leHByUGFyc2VyLndyYXBMaXRlcmFsUHJpbWl0aXZlKHZhbHVlLCAnJyksIHRydWUsIHNvdXJjZVNwYW4pKTtcbiAgfVxuXG4gIHByaXZhdGUgX3BhcnNlRGlyZWN0aXZlcyhzZWxlY3Rvck1hdGNoZXI6IFNlbGVjdG9yTWF0Y2hlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRDc3NTZWxlY3RvcjogQ3NzU2VsZWN0b3IpOiBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGFbXSB7XG4gICAgdmFyIGRpcmVjdGl2ZXMgPSBbXTtcbiAgICBzZWxlY3Rvck1hdGNoZXIubWF0Y2goZWxlbWVudENzc1NlbGVjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0b3IsIGRpcmVjdGl2ZSkgPT4geyBkaXJlY3RpdmVzLnB1c2goZGlyZWN0aXZlKTsgfSk7XG4gICAgLy8gTmVlZCB0byBzb3J0IHRoZSBkaXJlY3RpdmVzIHNvIHRoYXQgd2UgZ2V0IGNvbnNpc3RlbnQgcmVzdWx0cyB0aHJvdWdob3V0LFxuICAgIC8vIGFzIHNlbGVjdG9yTWF0Y2hlciB1c2VzIE1hcHMgaW5zaWRlLlxuICAgIC8vIEFsc28gbmVlZCB0byBtYWtlIGNvbXBvbmVudHMgdGhlIGZpcnN0IGRpcmVjdGl2ZSBpbiB0aGUgYXJyYXlcbiAgICBMaXN0V3JhcHBlci5zb3J0KGRpcmVjdGl2ZXMsXG4gICAgICAgICAgICAgICAgICAgICAoZGlyMTogQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhLCBkaXIyOiBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRpcjFDb21wID0gZGlyMS5pc0NvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRpcjJDb21wID0gZGlyMi5pc0NvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpcjFDb21wICYmICFkaXIyQ29tcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZGlyMUNvbXAgJiYgZGlyMkNvbXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kaXJlY3RpdmVzSW5kZXguZ2V0KGRpcjEpIC0gdGhpcy5kaXJlY3RpdmVzSW5kZXguZ2V0KGRpcjIpO1xuICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICByZXR1cm4gZGlyZWN0aXZlcztcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZURpcmVjdGl2ZUFzdHMoZWxlbWVudE5hbWU6IHN0cmluZywgZGlyZWN0aXZlczogQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHM6IEJvdW5kRWxlbWVudE9yRGlyZWN0aXZlUHJvcGVydHlbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZUV4cG9ydEFzVmFyczogVmFyaWFibGVBc3RbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4pOiBEaXJlY3RpdmVBc3RbXSB7XG4gICAgdmFyIG1hdGNoZWRWYXJpYWJsZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICB2YXIgZGlyZWN0aXZlQXN0cyA9IGRpcmVjdGl2ZXMubWFwKChkaXJlY3RpdmU6IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YSkgPT4ge1xuICAgICAgdmFyIGhvc3RQcm9wZXJ0aWVzOiBCb3VuZEVsZW1lbnRQcm9wZXJ0eUFzdFtdID0gW107XG4gICAgICB2YXIgaG9zdEV2ZW50czogQm91bmRFdmVudEFzdFtdID0gW107XG4gICAgICB2YXIgZGlyZWN0aXZlUHJvcGVydGllczogQm91bmREaXJlY3RpdmVQcm9wZXJ0eUFzdFtdID0gW107XG4gICAgICB0aGlzLl9jcmVhdGVEaXJlY3RpdmVIb3N0UHJvcGVydHlBc3RzKGVsZW1lbnROYW1lLCBkaXJlY3RpdmUuaG9zdFByb3BlcnRpZXMsIHNvdXJjZVNwYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RQcm9wZXJ0aWVzKTtcbiAgICAgIHRoaXMuX2NyZWF0ZURpcmVjdGl2ZUhvc3RFdmVudEFzdHMoZGlyZWN0aXZlLmhvc3RMaXN0ZW5lcnMsIHNvdXJjZVNwYW4sIGhvc3RFdmVudHMpO1xuICAgICAgdGhpcy5fY3JlYXRlRGlyZWN0aXZlUHJvcGVydHlBc3RzKGRpcmVjdGl2ZS5pbnB1dHMsIHByb3BzLCBkaXJlY3RpdmVQcm9wZXJ0aWVzKTtcbiAgICAgIHZhciBleHBvcnRBc1ZhcnMgPSBbXTtcbiAgICAgIHBvc3NpYmxlRXhwb3J0QXNWYXJzLmZvckVhY2goKHZhckFzdCkgPT4ge1xuICAgICAgICBpZiAoKHZhckFzdC52YWx1ZS5sZW5ndGggPT09IDAgJiYgZGlyZWN0aXZlLmlzQ29tcG9uZW50KSB8fFxuICAgICAgICAgICAgKGRpcmVjdGl2ZS5leHBvcnRBcyA9PSB2YXJBc3QudmFsdWUpKSB7XG4gICAgICAgICAgZXhwb3J0QXNWYXJzLnB1c2godmFyQXN0KTtcbiAgICAgICAgICBtYXRjaGVkVmFyaWFibGVzLmFkZCh2YXJBc3QubmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyBEaXJlY3RpdmVBc3QoZGlyZWN0aXZlLCBkaXJlY3RpdmVQcm9wZXJ0aWVzLCBob3N0UHJvcGVydGllcywgaG9zdEV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydEFzVmFycywgc291cmNlU3Bhbik7XG4gICAgfSk7XG4gICAgcG9zc2libGVFeHBvcnRBc1ZhcnMuZm9yRWFjaCgodmFyQXN0KSA9PiB7XG4gICAgICBpZiAodmFyQXN0LnZhbHVlLmxlbmd0aCA+IDAgJiYgIVNldFdyYXBwZXIuaGFzKG1hdGNoZWRWYXJpYWJsZXMsIHZhckFzdC5uYW1lKSkge1xuICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihgVGhlcmUgaXMgbm8gZGlyZWN0aXZlIHdpdGggXCJleHBvcnRBc1wiIHNldCB0byBcIiR7dmFyQXN0LnZhbHVlfVwiYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyQXN0LnNvdXJjZVNwYW4pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBkaXJlY3RpdmVBc3RzO1xuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlRGlyZWN0aXZlSG9zdFByb3BlcnR5QXN0cyhlbGVtZW50TmFtZTogc3RyaW5nLCBob3N0UHJvcHM6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZVNwYW46IFBhcnNlU291cmNlU3BhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRQcm9wZXJ0eUFzdHM6IEJvdW5kRWxlbWVudFByb3BlcnR5QXN0W10pIHtcbiAgICBpZiAoaXNQcmVzZW50KGhvc3RQcm9wcykpIHtcbiAgICAgIFN0cmluZ01hcFdyYXBwZXIuZm9yRWFjaChob3N0UHJvcHMsIChleHByZXNzaW9uLCBwcm9wTmFtZSkgPT4ge1xuICAgICAgICB2YXIgZXhwckFzdCA9IHRoaXMuX3BhcnNlQmluZGluZyhleHByZXNzaW9uLCBzb3VyY2VTcGFuKTtcbiAgICAgICAgdGFyZ2V0UHJvcGVydHlBc3RzLnB1c2goXG4gICAgICAgICAgICB0aGlzLl9jcmVhdGVFbGVtZW50UHJvcGVydHlBc3QoZWxlbWVudE5hbWUsIHByb3BOYW1lLCBleHByQXN0LCBzb3VyY2VTcGFuKSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVEaXJlY3RpdmVIb3N0RXZlbnRBc3RzKGhvc3RMaXN0ZW5lcnM6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZVNwYW46IFBhcnNlU291cmNlU3BhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRFdmVudEFzdHM6IEJvdW5kRXZlbnRBc3RbXSkge1xuICAgIGlmIChpc1ByZXNlbnQoaG9zdExpc3RlbmVycykpIHtcbiAgICAgIFN0cmluZ01hcFdyYXBwZXIuZm9yRWFjaChob3N0TGlzdGVuZXJzLCAoZXhwcmVzc2lvbiwgcHJvcE5hbWUpID0+IHtcbiAgICAgICAgdGhpcy5fcGFyc2VFdmVudChwcm9wTmFtZSwgZXhwcmVzc2lvbiwgc291cmNlU3BhbiwgW10sIHRhcmdldEV2ZW50QXN0cyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVEaXJlY3RpdmVQcm9wZXJ0eUFzdHMoZGlyZWN0aXZlUHJvcGVydGllczoge1trZXk6IHN0cmluZ106IHN0cmluZ30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZFByb3BzOiBCb3VuZEVsZW1lbnRPckRpcmVjdGl2ZVByb3BlcnR5W10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRCb3VuZERpcmVjdGl2ZVByb3BzOiBCb3VuZERpcmVjdGl2ZVByb3BlcnR5QXN0W10pIHtcbiAgICBpZiAoaXNQcmVzZW50KGRpcmVjdGl2ZVByb3BlcnRpZXMpKSB7XG4gICAgICB2YXIgYm91bmRQcm9wc0J5TmFtZSA9IG5ldyBNYXA8c3RyaW5nLCBCb3VuZEVsZW1lbnRPckRpcmVjdGl2ZVByb3BlcnR5PigpO1xuICAgICAgYm91bmRQcm9wcy5mb3JFYWNoKGJvdW5kUHJvcCA9PiB7XG4gICAgICAgIHZhciBwcmV2VmFsdWUgPSBib3VuZFByb3BzQnlOYW1lLmdldChib3VuZFByb3AubmFtZSk7XG4gICAgICAgIGlmIChpc0JsYW5rKHByZXZWYWx1ZSkgfHwgcHJldlZhbHVlLmlzTGl0ZXJhbCkge1xuICAgICAgICAgIC8vIGdpdmUgW2FdPVwiYlwiIGEgaGlnaGVyIHByZWNlZGVuY2UgdGhhbiBhPVwiYlwiIG9uIHRoZSBzYW1lIGVsZW1lbnRcbiAgICAgICAgICBib3VuZFByb3BzQnlOYW1lLnNldChib3VuZFByb3AubmFtZSwgYm91bmRQcm9wKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIFN0cmluZ01hcFdyYXBwZXIuZm9yRWFjaChkaXJlY3RpdmVQcm9wZXJ0aWVzLCAoZWxQcm9wOiBzdHJpbmcsIGRpclByb3A6IHN0cmluZykgPT4ge1xuICAgICAgICB2YXIgYm91bmRQcm9wID0gYm91bmRQcm9wc0J5TmFtZS5nZXQoZWxQcm9wKTtcblxuICAgICAgICAvLyBCaW5kaW5ncyBhcmUgb3B0aW9uYWwsIHNvIHRoaXMgYmluZGluZyBvbmx5IG5lZWRzIHRvIGJlIHNldCB1cCBpZiBhbiBleHByZXNzaW9uIGlzIGdpdmVuLlxuICAgICAgICBpZiAoaXNQcmVzZW50KGJvdW5kUHJvcCkpIHtcbiAgICAgICAgICB0YXJnZXRCb3VuZERpcmVjdGl2ZVByb3BzLnB1c2gobmV3IEJvdW5kRGlyZWN0aXZlUHJvcGVydHlBc3QoXG4gICAgICAgICAgICAgIGRpclByb3AsIGJvdW5kUHJvcC5uYW1lLCBib3VuZFByb3AuZXhwcmVzc2lvbiwgYm91bmRQcm9wLnNvdXJjZVNwYW4pKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlRWxlbWVudFByb3BlcnR5QXN0cyhlbGVtZW50TmFtZTogc3RyaW5nLCBwcm9wczogQm91bmRFbGVtZW50T3JEaXJlY3RpdmVQcm9wZXJ0eVtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZXM6IERpcmVjdGl2ZUFzdFtdKTogQm91bmRFbGVtZW50UHJvcGVydHlBc3RbXSB7XG4gICAgdmFyIGJvdW5kRWxlbWVudFByb3BzOiBCb3VuZEVsZW1lbnRQcm9wZXJ0eUFzdFtdID0gW107XG4gICAgdmFyIGJvdW5kRGlyZWN0aXZlUHJvcHNJbmRleCA9IG5ldyBNYXA8c3RyaW5nLCBCb3VuZERpcmVjdGl2ZVByb3BlcnR5QXN0PigpO1xuICAgIGRpcmVjdGl2ZXMuZm9yRWFjaCgoZGlyZWN0aXZlOiBEaXJlY3RpdmVBc3QpID0+IHtcbiAgICAgIGRpcmVjdGl2ZS5pbnB1dHMuZm9yRWFjaCgocHJvcDogQm91bmREaXJlY3RpdmVQcm9wZXJ0eUFzdCkgPT4ge1xuICAgICAgICBib3VuZERpcmVjdGl2ZVByb3BzSW5kZXguc2V0KHByb3AudGVtcGxhdGVOYW1lLCBwcm9wKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHByb3BzLmZvckVhY2goKHByb3A6IEJvdW5kRWxlbWVudE9yRGlyZWN0aXZlUHJvcGVydHkpID0+IHtcbiAgICAgIGlmICghcHJvcC5pc0xpdGVyYWwgJiYgaXNCbGFuayhib3VuZERpcmVjdGl2ZVByb3BzSW5kZXguZ2V0KHByb3AubmFtZSkpKSB7XG4gICAgICAgIGJvdW5kRWxlbWVudFByb3BzLnB1c2godGhpcy5fY3JlYXRlRWxlbWVudFByb3BlcnR5QXN0KGVsZW1lbnROYW1lLCBwcm9wLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3AuZXhwcmVzc2lvbiwgcHJvcC5zb3VyY2VTcGFuKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGJvdW5kRWxlbWVudFByb3BzO1xuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlRWxlbWVudFByb3BlcnR5QXN0KGVsZW1lbnROYW1lOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgYXN0OiBBU1QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4pOiBCb3VuZEVsZW1lbnRQcm9wZXJ0eUFzdCB7XG4gICAgdmFyIHVuaXQgPSBudWxsO1xuICAgIHZhciBiaW5kaW5nVHlwZTtcbiAgICB2YXIgYm91bmRQcm9wZXJ0eU5hbWU7XG4gICAgdmFyIHBhcnRzID0gbmFtZS5zcGxpdChQUk9QRVJUWV9QQVJUU19TRVBBUkFUT1IpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGJvdW5kUHJvcGVydHlOYW1lID0gdGhpcy5fc2NoZW1hUmVnaXN0cnkuZ2V0TWFwcGVkUHJvcE5hbWUocGFydHNbMF0pO1xuICAgICAgYmluZGluZ1R5cGUgPSBQcm9wZXJ0eUJpbmRpbmdUeXBlLlByb3BlcnR5O1xuICAgICAgaWYgKCF0aGlzLl9zY2hlbWFSZWdpc3RyeS5oYXNQcm9wZXJ0eShlbGVtZW50TmFtZSwgYm91bmRQcm9wZXJ0eU5hbWUpKSB7XG4gICAgICAgIHRoaXMuX3JlcG9ydEVycm9yKFxuICAgICAgICAgICAgYENhbid0IGJpbmQgdG8gJyR7Ym91bmRQcm9wZXJ0eU5hbWV9JyBzaW5jZSBpdCBpc24ndCBhIGtub3duIG5hdGl2ZSBwcm9wZXJ0eWAsXG4gICAgICAgICAgICBzb3VyY2VTcGFuKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHBhcnRzWzBdID09IEFUVFJJQlVURV9QUkVGSVgpIHtcbiAgICAgICAgYm91bmRQcm9wZXJ0eU5hbWUgPSBwYXJ0c1sxXTtcbiAgICAgICAgYmluZGluZ1R5cGUgPSBQcm9wZXJ0eUJpbmRpbmdUeXBlLkF0dHJpYnV0ZTtcbiAgICAgIH0gZWxzZSBpZiAocGFydHNbMF0gPT0gQ0xBU1NfUFJFRklYKSB7XG4gICAgICAgIGJvdW5kUHJvcGVydHlOYW1lID0gcGFydHNbMV07XG4gICAgICAgIGJpbmRpbmdUeXBlID0gUHJvcGVydHlCaW5kaW5nVHlwZS5DbGFzcztcbiAgICAgIH0gZWxzZSBpZiAocGFydHNbMF0gPT0gU1RZTEVfUFJFRklYKSB7XG4gICAgICAgIHVuaXQgPSBwYXJ0cy5sZW5ndGggPiAyID8gcGFydHNbMl0gOiBudWxsO1xuICAgICAgICBib3VuZFByb3BlcnR5TmFtZSA9IHBhcnRzWzFdO1xuICAgICAgICBiaW5kaW5nVHlwZSA9IFByb3BlcnR5QmluZGluZ1R5cGUuU3R5bGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihgSW52YWxpZCBwcm9wZXJ0eSBuYW1lICcke25hbWV9J2AsIHNvdXJjZVNwYW4pO1xuICAgICAgICBiaW5kaW5nVHlwZSA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBCb3VuZEVsZW1lbnRQcm9wZXJ0eUFzdChib3VuZFByb3BlcnR5TmFtZSwgYmluZGluZ1R5cGUsIGFzdCwgdW5pdCwgc291cmNlU3Bhbik7XG4gIH1cblxuXG4gIHByaXZhdGUgX2ZpbmRDb21wb25lbnREaXJlY3RpdmVOYW1lcyhkaXJlY3RpdmVzOiBEaXJlY3RpdmVBc3RbXSk6IHN0cmluZ1tdIHtcbiAgICB2YXIgY29tcG9uZW50VHlwZU5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGRpcmVjdGl2ZXMuZm9yRWFjaChkaXJlY3RpdmUgPT4ge1xuICAgICAgdmFyIHR5cGVOYW1lID0gZGlyZWN0aXZlLmRpcmVjdGl2ZS50eXBlLm5hbWU7XG4gICAgICBpZiAoZGlyZWN0aXZlLmRpcmVjdGl2ZS5pc0NvbXBvbmVudCkge1xuICAgICAgICBjb21wb25lbnRUeXBlTmFtZXMucHVzaCh0eXBlTmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbXBvbmVudFR5cGVOYW1lcztcbiAgfVxuXG4gIHByaXZhdGUgX2Fzc2VydE9ubHlPbmVDb21wb25lbnQoZGlyZWN0aXZlczogRGlyZWN0aXZlQXN0W10sIHNvdXJjZVNwYW46IFBhcnNlU291cmNlU3Bhbikge1xuICAgIHZhciBjb21wb25lbnRUeXBlTmFtZXMgPSB0aGlzLl9maW5kQ29tcG9uZW50RGlyZWN0aXZlTmFtZXMoZGlyZWN0aXZlcyk7XG4gICAgaWYgKGNvbXBvbmVudFR5cGVOYW1lcy5sZW5ndGggPiAxKSB7XG4gICAgICB0aGlzLl9yZXBvcnRFcnJvcihgTW9yZSB0aGFuIG9uZSBjb21wb25lbnQ6ICR7Y29tcG9uZW50VHlwZU5hbWVzLmpvaW4oJywnKX1gLCBzb3VyY2VTcGFuKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9hc3NlcnROb0NvbXBvbmVudHNOb3JFbGVtZW50QmluZGluZ3NPblRlbXBsYXRlKGRpcmVjdGl2ZXM6IERpcmVjdGl2ZUFzdFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRQcm9wczogQm91bmRFbGVtZW50UHJvcGVydHlBc3RbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4pIHtcbiAgICB2YXIgY29tcG9uZW50VHlwZU5hbWVzOiBzdHJpbmdbXSA9IHRoaXMuX2ZpbmRDb21wb25lbnREaXJlY3RpdmVOYW1lcyhkaXJlY3RpdmVzKTtcbiAgICBpZiAoY29tcG9uZW50VHlwZU5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuX3JlcG9ydEVycm9yKGBDb21wb25lbnRzIG9uIGFuIGVtYmVkZGVkIHRlbXBsYXRlOiAke2NvbXBvbmVudFR5cGVOYW1lcy5qb2luKCcsJyl9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZVNwYW4pO1xuICAgIH1cbiAgICBlbGVtZW50UHJvcHMuZm9yRWFjaChwcm9wID0+IHtcbiAgICAgIHRoaXMuX3JlcG9ydEVycm9yKFxuICAgICAgICAgIGBQcm9wZXJ0eSBiaW5kaW5nICR7cHJvcC5uYW1lfSBub3QgdXNlZCBieSBhbnkgZGlyZWN0aXZlIG9uIGFuIGVtYmVkZGVkIHRlbXBsYXRlYCxcbiAgICAgICAgICBzb3VyY2VTcGFuKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2Fzc2VydEFsbEV2ZW50c1B1Ymxpc2hlZEJ5RGlyZWN0aXZlcyhkaXJlY3RpdmVzOiBEaXJlY3RpdmVBc3RbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogQm91bmRFdmVudEFzdFtdKSB7XG4gICAgdmFyIGFsbERpcmVjdGl2ZUV2ZW50cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGRpcmVjdGl2ZXMuZm9yRWFjaChkaXJlY3RpdmUgPT4ge1xuICAgICAgU3RyaW5nTWFwV3JhcHBlci5mb3JFYWNoKGRpcmVjdGl2ZS5kaXJlY3RpdmUub3V0cHV0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXZlbnROYW1lLCBfKSA9PiB7IGFsbERpcmVjdGl2ZUV2ZW50cy5hZGQoZXZlbnROYW1lKTsgfSk7XG4gICAgfSk7XG4gICAgZXZlbnRzLmZvckVhY2goZXZlbnQgPT4ge1xuICAgICAgaWYgKGlzUHJlc2VudChldmVudC50YXJnZXQpIHx8ICFTZXRXcmFwcGVyLmhhcyhhbGxEaXJlY3RpdmVFdmVudHMsIGV2ZW50Lm5hbWUpKSB7XG4gICAgICAgIHRoaXMuX3JlcG9ydEVycm9yKFxuICAgICAgICAgICAgYEV2ZW50IGJpbmRpbmcgJHtldmVudC5mdWxsTmFtZX0gbm90IGVtaXR0ZWQgYnkgYW55IGRpcmVjdGl2ZSBvbiBhbiBlbWJlZGRlZCB0ZW1wbGF0ZWAsXG4gICAgICAgICAgICBldmVudC5zb3VyY2VTcGFuKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG5jbGFzcyBOb25CaW5kYWJsZVZpc2l0b3IgaW1wbGVtZW50cyBIdG1sQXN0VmlzaXRvciB7XG4gIHZpc2l0RWxlbWVudChhc3Q6IEh0bWxFbGVtZW50QXN0LCBjb21wb25lbnQ6IENvbXBvbmVudCk6IEVsZW1lbnRBc3Qge1xuICAgIHZhciBwcmVwYXJzZWRFbGVtZW50ID0gcHJlcGFyc2VFbGVtZW50KGFzdCk7XG4gICAgaWYgKHByZXBhcnNlZEVsZW1lbnQudHlwZSA9PT0gUHJlcGFyc2VkRWxlbWVudFR5cGUuU0NSSVBUIHx8XG4gICAgICAgIHByZXBhcnNlZEVsZW1lbnQudHlwZSA9PT0gUHJlcGFyc2VkRWxlbWVudFR5cGUuU1RZTEUgfHxcbiAgICAgICAgcHJlcGFyc2VkRWxlbWVudC50eXBlID09PSBQcmVwYXJzZWRFbGVtZW50VHlwZS5TVFlMRVNIRUVUKSB7XG4gICAgICAvLyBTa2lwcGluZyA8c2NyaXB0PiBmb3Igc2VjdXJpdHkgcmVhc29uc1xuICAgICAgLy8gU2tpcHBpbmcgPHN0eWxlPiBhbmQgc3R5bGVzaGVldHMgYXMgd2UgYWxyZWFkeSBwcm9jZXNzZWQgdGhlbVxuICAgICAgLy8gaW4gdGhlIFN0eWxlQ29tcGlsZXJcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBhdHRyTmFtZUFuZFZhbHVlcyA9IGFzdC5hdHRycy5tYXAoYXR0ckFzdCA9PiBbYXR0ckFzdC5uYW1lLCBhdHRyQXN0LnZhbHVlXSk7XG4gICAgdmFyIHNlbGVjdG9yID0gY3JlYXRlRWxlbWVudENzc1NlbGVjdG9yKGFzdC5uYW1lLCBhdHRyTmFtZUFuZFZhbHVlcyk7XG4gICAgdmFyIG5nQ29udGVudEluZGV4ID0gY29tcG9uZW50LmZpbmROZ0NvbnRlbnRJbmRleChzZWxlY3Rvcik7XG4gICAgdmFyIGNoaWxkcmVuID0gaHRtbFZpc2l0QWxsKHRoaXMsIGFzdC5jaGlsZHJlbiwgRU1QVFlfQ09NUE9ORU5UKTtcbiAgICByZXR1cm4gbmV3IEVsZW1lbnRBc3QoYXN0Lm5hbWUsIGh0bWxWaXNpdEFsbCh0aGlzLCBhc3QuYXR0cnMpLCBbXSwgW10sIFtdLCBbXSwgY2hpbGRyZW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5nQ29udGVudEluZGV4LCBhc3Quc291cmNlU3Bhbik7XG4gIH1cbiAgdmlzaXRBdHRyKGFzdDogSHRtbEF0dHJBc3QsIGNvbnRleHQ6IGFueSk6IEF0dHJBc3Qge1xuICAgIHJldHVybiBuZXcgQXR0ckFzdChhc3QubmFtZSwgYXN0LnZhbHVlLCBhc3Quc291cmNlU3Bhbik7XG4gIH1cbiAgdmlzaXRUZXh0KGFzdDogSHRtbFRleHRBc3QsIGNvbXBvbmVudDogQ29tcG9uZW50KTogVGV4dEFzdCB7XG4gICAgdmFyIG5nQ29udGVudEluZGV4ID0gY29tcG9uZW50LmZpbmROZ0NvbnRlbnRJbmRleChURVhUX0NTU19TRUxFQ1RPUik7XG4gICAgcmV0dXJuIG5ldyBUZXh0QXN0KGFzdC52YWx1ZSwgbmdDb250ZW50SW5kZXgsIGFzdC5zb3VyY2VTcGFuKTtcbiAgfVxufVxuXG5jbGFzcyBCb3VuZEVsZW1lbnRPckRpcmVjdGl2ZVByb3BlcnR5IHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZywgcHVibGljIGV4cHJlc3Npb246IEFTVCwgcHVibGljIGlzTGl0ZXJhbDogYm9vbGVhbixcbiAgICAgICAgICAgICAgcHVibGljIHNvdXJjZVNwYW46IFBhcnNlU291cmNlU3Bhbikge31cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0Q2xhc3NlcyhjbGFzc0F0dHJWYWx1ZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gU3RyaW5nV3JhcHBlci5zcGxpdChjbGFzc0F0dHJWYWx1ZS50cmltKCksIC9cXHMrL2cpO1xufVxuXG5jbGFzcyBDb21wb25lbnQge1xuICBzdGF0aWMgY3JlYXRlKGRpcmVjdGl2ZXM6IERpcmVjdGl2ZUFzdFtdKTogQ29tcG9uZW50IHtcbiAgICBpZiAoZGlyZWN0aXZlcy5sZW5ndGggPT09IDAgfHwgIWRpcmVjdGl2ZXNbMF0uZGlyZWN0aXZlLmlzQ29tcG9uZW50KSB7XG4gICAgICByZXR1cm4gRU1QVFlfQ09NUE9ORU5UO1xuICAgIH1cbiAgICB2YXIgbWF0Y2hlciA9IG5ldyBTZWxlY3Rvck1hdGNoZXIoKTtcbiAgICB2YXIgbmdDb250ZW50U2VsZWN0b3JzID0gZGlyZWN0aXZlc1swXS5kaXJlY3RpdmUudGVtcGxhdGUubmdDb250ZW50U2VsZWN0b3JzO1xuICAgIHZhciB3aWxkY2FyZE5nQ29udGVudEluZGV4ID0gbnVsbDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5nQ29udGVudFNlbGVjdG9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNlbGVjdG9yID0gbmdDb250ZW50U2VsZWN0b3JzW2ldO1xuICAgICAgaWYgKFN0cmluZ1dyYXBwZXIuZXF1YWxzKHNlbGVjdG9yLCAnKicpKSB7XG4gICAgICAgIHdpbGRjYXJkTmdDb250ZW50SW5kZXggPSBpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWF0Y2hlci5hZGRTZWxlY3RhYmxlcyhDc3NTZWxlY3Rvci5wYXJzZShuZ0NvbnRlbnRTZWxlY3RvcnNbaV0pLCBpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBDb21wb25lbnQobWF0Y2hlciwgd2lsZGNhcmROZ0NvbnRlbnRJbmRleCk7XG4gIH1cbiAgY29uc3RydWN0b3IocHVibGljIG5nQ29udGVudEluZGV4TWF0Y2hlcjogU2VsZWN0b3JNYXRjaGVyLFxuICAgICAgICAgICAgICBwdWJsaWMgd2lsZGNhcmROZ0NvbnRlbnRJbmRleDogbnVtYmVyKSB7fVxuXG4gIGZpbmROZ0NvbnRlbnRJbmRleChzZWxlY3RvcjogQ3NzU2VsZWN0b3IpOiBudW1iZXIge1xuICAgIHZhciBuZ0NvbnRlbnRJbmRpY2VzID0gW107XG4gICAgdGhpcy5uZ0NvbnRlbnRJbmRleE1hdGNoZXIubWF0Y2goXG4gICAgICAgIHNlbGVjdG9yLCAoc2VsZWN0b3IsIG5nQ29udGVudEluZGV4KSA9PiB7IG5nQ29udGVudEluZGljZXMucHVzaChuZ0NvbnRlbnRJbmRleCk7IH0pO1xuICAgIExpc3RXcmFwcGVyLnNvcnQobmdDb250ZW50SW5kaWNlcyk7XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLndpbGRjYXJkTmdDb250ZW50SW5kZXgpKSB7XG4gICAgICBuZ0NvbnRlbnRJbmRpY2VzLnB1c2godGhpcy53aWxkY2FyZE5nQ29udGVudEluZGV4KTtcbiAgICB9XG4gICAgcmV0dXJuIG5nQ29udGVudEluZGljZXMubGVuZ3RoID4gMCA/IG5nQ29udGVudEluZGljZXNbMF0gOiBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRDc3NTZWxlY3RvcihlbGVtZW50TmFtZTogc3RyaW5nLCBtYXRjaGFibGVBdHRyczogc3RyaW5nW11bXSk6IENzc1NlbGVjdG9yIHtcbiAgdmFyIGNzc1NlbGVjdG9yID0gbmV3IENzc1NlbGVjdG9yKCk7XG4gIGxldCBlbE5hbWVOb05zID0gc3BsaXROc05hbWUoZWxlbWVudE5hbWUpWzFdO1xuXG4gIGNzc1NlbGVjdG9yLnNldEVsZW1lbnQoZWxOYW1lTm9Ocyk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXRjaGFibGVBdHRycy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBhdHRyTmFtZSA9IG1hdGNoYWJsZUF0dHJzW2ldWzBdO1xuICAgIGxldCBhdHRyTmFtZU5vTnMgPSBzcGxpdE5zTmFtZShhdHRyTmFtZSlbMV07XG4gICAgbGV0IGF0dHJWYWx1ZSA9IG1hdGNoYWJsZUF0dHJzW2ldWzFdO1xuXG4gICAgY3NzU2VsZWN0b3IuYWRkQXR0cmlidXRlKGF0dHJOYW1lTm9OcywgYXR0clZhbHVlKTtcbiAgICBpZiAoYXR0ck5hbWUudG9Mb3dlckNhc2UoKSA9PSBDTEFTU19BVFRSKSB7XG4gICAgICB2YXIgY2xhc3NlcyA9IHNwbGl0Q2xhc3NlcyhhdHRyVmFsdWUpO1xuICAgICAgY2xhc3Nlcy5mb3JFYWNoKGNsYXNzTmFtZSA9PiBjc3NTZWxlY3Rvci5hZGRDbGFzc05hbWUoY2xhc3NOYW1lKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBjc3NTZWxlY3Rvcjtcbn1cblxudmFyIEVNUFRZX0NPTVBPTkVOVCA9IG5ldyBDb21wb25lbnQobmV3IFNlbGVjdG9yTWF0Y2hlcigpLCBudWxsKTtcbnZhciBOT05fQklOREFCTEVfVklTSVRPUiA9IG5ldyBOb25CaW5kYWJsZVZpc2l0b3IoKTtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21waWxlci90ZW1wbGF0ZV9wYXJzZXIudHNcbiAqKi8iLCJpbXBvcnQge1xuICBpc1ByZXNlbnQsXG4gIGlzQmxhbmssXG4gIFN0cmluZ1dyYXBwZXIsXG4gIHN0cmluZ2lmeSxcbiAgYXNzZXJ0aW9uc0VuYWJsZWQsXG4gIFN0cmluZ0pvaW5lcixcbiAgc2VyaWFsaXplRW51bSxcbiAgQ09OU1RfRVhQUlxufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuXG5pbXBvcnQge0xpc3RXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuXG5pbXBvcnQge0h0bWxBc3QsIEh0bWxBdHRyQXN0LCBIdG1sVGV4dEFzdCwgSHRtbEVsZW1lbnRBc3R9IGZyb20gJy4vaHRtbF9hc3QnO1xuXG5pbXBvcnQge0luamVjdGFibGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpJztcbmltcG9ydCB7SHRtbFRva2VuLCBIdG1sVG9rZW5UeXBlLCB0b2tlbml6ZUh0bWx9IGZyb20gJy4vaHRtbF9sZXhlcic7XG5pbXBvcnQge1BhcnNlRXJyb3IsIFBhcnNlTG9jYXRpb24sIFBhcnNlU291cmNlU3Bhbn0gZnJvbSAnLi9wYXJzZV91dGlsJztcbmltcG9ydCB7SHRtbFRhZ0RlZmluaXRpb24sIGdldEh0bWxUYWdEZWZpbml0aW9uLCBnZXROc1ByZWZpeH0gZnJvbSAnLi9odG1sX3RhZ3MnO1xuXG5leHBvcnQgY2xhc3MgSHRtbFRyZWVFcnJvciBleHRlbmRzIFBhcnNlRXJyb3Ige1xuICBzdGF0aWMgY3JlYXRlKGVsZW1lbnROYW1lOiBzdHJpbmcsIGxvY2F0aW9uOiBQYXJzZUxvY2F0aW9uLCBtc2c6IHN0cmluZyk6IEh0bWxUcmVlRXJyb3Ige1xuICAgIHJldHVybiBuZXcgSHRtbFRyZWVFcnJvcihlbGVtZW50TmFtZSwgbG9jYXRpb24sIG1zZyk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgZWxlbWVudE5hbWU6IHN0cmluZywgbG9jYXRpb246IFBhcnNlTG9jYXRpb24sIG1zZzogc3RyaW5nKSB7XG4gICAgc3VwZXIobG9jYXRpb24sIG1zZyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEh0bWxQYXJzZVRyZWVSZXN1bHQge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcm9vdE5vZGVzOiBIdG1sQXN0W10sIHB1YmxpYyBlcnJvcnM6IFBhcnNlRXJyb3JbXSkge31cbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEh0bWxQYXJzZXIge1xuICBwYXJzZShzb3VyY2VDb250ZW50OiBzdHJpbmcsIHNvdXJjZVVybDogc3RyaW5nKTogSHRtbFBhcnNlVHJlZVJlc3VsdCB7XG4gICAgdmFyIHRva2Vuc0FuZEVycm9ycyA9IHRva2VuaXplSHRtbChzb3VyY2VDb250ZW50LCBzb3VyY2VVcmwpO1xuICAgIHZhciB0cmVlQW5kRXJyb3JzID0gbmV3IFRyZWVCdWlsZGVyKHRva2Vuc0FuZEVycm9ycy50b2tlbnMpLmJ1aWxkKCk7XG4gICAgcmV0dXJuIG5ldyBIdG1sUGFyc2VUcmVlUmVzdWx0KHRyZWVBbmRFcnJvcnMucm9vdE5vZGVzLCAoPFBhcnNlRXJyb3JbXT50b2tlbnNBbmRFcnJvcnMuZXJyb3JzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb25jYXQodHJlZUFuZEVycm9ycy5lcnJvcnMpKTtcbiAgfVxufVxuXG5jbGFzcyBUcmVlQnVpbGRlciB7XG4gIHByaXZhdGUgaW5kZXg6IG51bWJlciA9IC0xO1xuICBwcml2YXRlIHBlZWs6IEh0bWxUb2tlbjtcblxuICBwcml2YXRlIHJvb3ROb2RlczogSHRtbEFzdFtdID0gW107XG4gIHByaXZhdGUgZXJyb3JzOiBIdG1sVHJlZUVycm9yW10gPSBbXTtcblxuICBwcml2YXRlIGVsZW1lbnRTdGFjazogSHRtbEVsZW1lbnRBc3RbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdG9rZW5zOiBIdG1sVG9rZW5bXSkgeyB0aGlzLl9hZHZhbmNlKCk7IH1cblxuICBidWlsZCgpOiBIdG1sUGFyc2VUcmVlUmVzdWx0IHtcbiAgICB3aGlsZSAodGhpcy5wZWVrLnR5cGUgIT09IEh0bWxUb2tlblR5cGUuRU9GKSB7XG4gICAgICBpZiAodGhpcy5wZWVrLnR5cGUgPT09IEh0bWxUb2tlblR5cGUuVEFHX09QRU5fU1RBUlQpIHtcbiAgICAgICAgdGhpcy5fY29uc3VtZVN0YXJ0VGFnKHRoaXMuX2FkdmFuY2UoKSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMucGVlay50eXBlID09PSBIdG1sVG9rZW5UeXBlLlRBR19DTE9TRSkge1xuICAgICAgICB0aGlzLl9jb25zdW1lRW5kVGFnKHRoaXMuX2FkdmFuY2UoKSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMucGVlay50eXBlID09PSBIdG1sVG9rZW5UeXBlLkNEQVRBX1NUQVJUKSB7XG4gICAgICAgIHRoaXMuX2Nsb3NlVm9pZEVsZW1lbnQoKTtcbiAgICAgICAgdGhpcy5fY29uc3VtZUNkYXRhKHRoaXMuX2FkdmFuY2UoKSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMucGVlay50eXBlID09PSBIdG1sVG9rZW5UeXBlLkNPTU1FTlRfU1RBUlQpIHtcbiAgICAgICAgdGhpcy5fY2xvc2VWb2lkRWxlbWVudCgpO1xuICAgICAgICB0aGlzLl9jb25zdW1lQ29tbWVudCh0aGlzLl9hZHZhbmNlKCkpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnBlZWsudHlwZSA9PT0gSHRtbFRva2VuVHlwZS5URVhUIHx8XG4gICAgICAgICAgICAgICAgIHRoaXMucGVlay50eXBlID09PSBIdG1sVG9rZW5UeXBlLlJBV19URVhUIHx8XG4gICAgICAgICAgICAgICAgIHRoaXMucGVlay50eXBlID09PSBIdG1sVG9rZW5UeXBlLkVTQ0FQQUJMRV9SQVdfVEVYVCkge1xuICAgICAgICB0aGlzLl9jbG9zZVZvaWRFbGVtZW50KCk7XG4gICAgICAgIHRoaXMuX2NvbnN1bWVUZXh0KHRoaXMuX2FkdmFuY2UoKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBTa2lwIGFsbCBvdGhlciB0b2tlbnMuLi5cbiAgICAgICAgdGhpcy5fYWR2YW5jZSgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IEh0bWxQYXJzZVRyZWVSZXN1bHQodGhpcy5yb290Tm9kZXMsIHRoaXMuZXJyb3JzKTtcbiAgfVxuXG4gIHByaXZhdGUgX2FkdmFuY2UoKTogSHRtbFRva2VuIHtcbiAgICB2YXIgcHJldiA9IHRoaXMucGVlaztcbiAgICBpZiAodGhpcy5pbmRleCA8IHRoaXMudG9rZW5zLmxlbmd0aCAtIDEpIHtcbiAgICAgIC8vIE5vdGU6IHRoZXJlIGlzIGFsd2F5cyBhbiBFT0YgdG9rZW4gYXQgdGhlIGVuZFxuICAgICAgdGhpcy5pbmRleCsrO1xuICAgIH1cbiAgICB0aGlzLnBlZWsgPSB0aGlzLnRva2Vuc1t0aGlzLmluZGV4XTtcbiAgICByZXR1cm4gcHJldjtcbiAgfVxuXG4gIHByaXZhdGUgX2FkdmFuY2VJZih0eXBlOiBIdG1sVG9rZW5UeXBlKTogSHRtbFRva2VuIHtcbiAgICBpZiAodGhpcy5wZWVrLnR5cGUgPT09IHR5cGUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9hZHZhbmNlKCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29uc3VtZUNkYXRhKHN0YXJ0VG9rZW46IEh0bWxUb2tlbikge1xuICAgIHRoaXMuX2NvbnN1bWVUZXh0KHRoaXMuX2FkdmFuY2UoKSk7XG4gICAgdGhpcy5fYWR2YW5jZUlmKEh0bWxUb2tlblR5cGUuQ0RBVEFfRU5EKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbnN1bWVDb21tZW50KHN0YXJ0VG9rZW46IEh0bWxUb2tlbikge1xuICAgIHRoaXMuX2FkdmFuY2VJZihIdG1sVG9rZW5UeXBlLlJBV19URVhUKTtcbiAgICB0aGlzLl9hZHZhbmNlSWYoSHRtbFRva2VuVHlwZS5DT01NRU5UX0VORCk7XG4gIH1cblxuICBwcml2YXRlIF9jb25zdW1lVGV4dCh0b2tlbjogSHRtbFRva2VuKSB7XG4gICAgbGV0IHRleHQgPSB0b2tlbi5wYXJ0c1swXTtcbiAgICBpZiAodGV4dC5sZW5ndGggPiAwICYmIHRleHRbMF0gPT0gJ1xcbicpIHtcbiAgICAgIGxldCBwYXJlbnQgPSB0aGlzLl9nZXRQYXJlbnRFbGVtZW50KCk7XG4gICAgICBpZiAoaXNQcmVzZW50KHBhcmVudCkgJiYgcGFyZW50LmNoaWxkcmVuLmxlbmd0aCA9PSAwICYmXG4gICAgICAgICAgZ2V0SHRtbFRhZ0RlZmluaXRpb24ocGFyZW50Lm5hbWUpLmlnbm9yZUZpcnN0TGYpIHtcbiAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0ZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuX2FkZFRvUGFyZW50KG5ldyBIdG1sVGV4dEFzdCh0ZXh0LCB0b2tlbi5zb3VyY2VTcGFuKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY2xvc2VWb2lkRWxlbWVudCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5lbGVtZW50U3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgbGV0IGVsID0gTGlzdFdyYXBwZXIubGFzdCh0aGlzLmVsZW1lbnRTdGFjayk7XG5cbiAgICAgIGlmIChnZXRIdG1sVGFnRGVmaW5pdGlvbihlbC5uYW1lKS5pc1ZvaWQpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50U3RhY2sucG9wKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY29uc3VtZVN0YXJ0VGFnKHN0YXJ0VGFnVG9rZW46IEh0bWxUb2tlbikge1xuICAgIHZhciBwcmVmaXggPSBzdGFydFRhZ1Rva2VuLnBhcnRzWzBdO1xuICAgIHZhciBuYW1lID0gc3RhcnRUYWdUb2tlbi5wYXJ0c1sxXTtcbiAgICB2YXIgYXR0cnMgPSBbXTtcbiAgICB3aGlsZSAodGhpcy5wZWVrLnR5cGUgPT09IEh0bWxUb2tlblR5cGUuQVRUUl9OQU1FKSB7XG4gICAgICBhdHRycy5wdXNoKHRoaXMuX2NvbnN1bWVBdHRyKHRoaXMuX2FkdmFuY2UoKSkpO1xuICAgIH1cbiAgICB2YXIgZnVsbE5hbWUgPSBnZXRFbGVtZW50RnVsbE5hbWUocHJlZml4LCBuYW1lLCB0aGlzLl9nZXRQYXJlbnRFbGVtZW50KCkpO1xuICAgIHZhciBzZWxmQ2xvc2luZyA9IGZhbHNlO1xuICAgIC8vIE5vdGU6IFRoZXJlIGNvdWxkIGhhdmUgYmVlbiBhIHRva2VuaXplciBlcnJvclxuICAgIC8vIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IGEgdG9rZW4gZm9yIHRoZSBlbmQgdGFnLi4uXG4gICAgaWYgKHRoaXMucGVlay50eXBlID09PSBIdG1sVG9rZW5UeXBlLlRBR19PUEVOX0VORF9WT0lEKSB7XG4gICAgICB0aGlzLl9hZHZhbmNlKCk7XG4gICAgICBzZWxmQ2xvc2luZyA9IHRydWU7XG4gICAgICBpZiAoZ2V0TnNQcmVmaXgoZnVsbE5hbWUpID09IG51bGwgJiYgIWdldEh0bWxUYWdEZWZpbml0aW9uKGZ1bGxOYW1lKS5pc1ZvaWQpIHtcbiAgICAgICAgdGhpcy5lcnJvcnMucHVzaChIdG1sVHJlZUVycm9yLmNyZWF0ZShcbiAgICAgICAgICAgIGZ1bGxOYW1lLCBzdGFydFRhZ1Rva2VuLnNvdXJjZVNwYW4uc3RhcnQsXG4gICAgICAgICAgICBgT25seSB2b2lkIGFuZCBmb3JlaWduIGVsZW1lbnRzIGNhbiBiZSBzZWxmIGNsb3NlZCBcIiR7c3RhcnRUYWdUb2tlbi5wYXJ0c1sxXX1cImApKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMucGVlay50eXBlID09PSBIdG1sVG9rZW5UeXBlLlRBR19PUEVOX0VORCkge1xuICAgICAgdGhpcy5fYWR2YW5jZSgpO1xuICAgICAgc2VsZkNsb3NpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgdmFyIGVuZCA9IHRoaXMucGVlay5zb3VyY2VTcGFuLnN0YXJ0O1xuICAgIHZhciBlbCA9IG5ldyBIdG1sRWxlbWVudEFzdChmdWxsTmFtZSwgYXR0cnMsIFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUGFyc2VTb3VyY2VTcGFuKHN0YXJ0VGFnVG9rZW4uc291cmNlU3Bhbi5zdGFydCwgZW5kKSk7XG4gICAgdGhpcy5fcHVzaEVsZW1lbnQoZWwpO1xuICAgIGlmIChzZWxmQ2xvc2luZykge1xuICAgICAgdGhpcy5fcG9wRWxlbWVudChmdWxsTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcHVzaEVsZW1lbnQoZWw6IEh0bWxFbGVtZW50QXN0KSB7XG4gICAgaWYgKHRoaXMuZWxlbWVudFN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBwYXJlbnRFbCA9IExpc3RXcmFwcGVyLmxhc3QodGhpcy5lbGVtZW50U3RhY2spO1xuICAgICAgaWYgKGdldEh0bWxUYWdEZWZpbml0aW9uKHBhcmVudEVsLm5hbWUpLmlzQ2xvc2VkQnlDaGlsZChlbC5uYW1lKSkge1xuICAgICAgICB0aGlzLmVsZW1lbnRTdGFjay5wb3AoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgdGFnRGVmID0gZ2V0SHRtbFRhZ0RlZmluaXRpb24oZWwubmFtZSk7XG4gICAgdmFyIHBhcmVudEVsID0gdGhpcy5fZ2V0UGFyZW50RWxlbWVudCgpO1xuICAgIGlmICh0YWdEZWYucmVxdWlyZUV4dHJhUGFyZW50KGlzUHJlc2VudChwYXJlbnRFbCkgPyBwYXJlbnRFbC5uYW1lIDogbnVsbCkpIHtcbiAgICAgIHZhciBuZXdQYXJlbnQgPSBuZXcgSHRtbEVsZW1lbnRBc3QodGFnRGVmLnBhcmVudFRvQWRkLCBbXSwgW2VsXSwgZWwuc291cmNlU3Bhbik7XG4gICAgICB0aGlzLl9hZGRUb1BhcmVudChuZXdQYXJlbnQpO1xuICAgICAgdGhpcy5lbGVtZW50U3RhY2sucHVzaChuZXdQYXJlbnQpO1xuICAgICAgdGhpcy5lbGVtZW50U3RhY2sucHVzaChlbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2FkZFRvUGFyZW50KGVsKTtcbiAgICAgIHRoaXMuZWxlbWVudFN0YWNrLnB1c2goZWwpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2NvbnN1bWVFbmRUYWcoZW5kVGFnVG9rZW46IEh0bWxUb2tlbikge1xuICAgIHZhciBmdWxsTmFtZSA9XG4gICAgICAgIGdldEVsZW1lbnRGdWxsTmFtZShlbmRUYWdUb2tlbi5wYXJ0c1swXSwgZW5kVGFnVG9rZW4ucGFydHNbMV0sIHRoaXMuX2dldFBhcmVudEVsZW1lbnQoKSk7XG5cbiAgICBpZiAoZ2V0SHRtbFRhZ0RlZmluaXRpb24oZnVsbE5hbWUpLmlzVm9pZCkge1xuICAgICAgdGhpcy5lcnJvcnMucHVzaChcbiAgICAgICAgICBIdG1sVHJlZUVycm9yLmNyZWF0ZShmdWxsTmFtZSwgZW5kVGFnVG9rZW4uc291cmNlU3Bhbi5zdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVm9pZCBlbGVtZW50cyBkbyBub3QgaGF2ZSBlbmQgdGFncyBcIiR7ZW5kVGFnVG9rZW4ucGFydHNbMV19XCJgKSk7XG4gICAgfSBlbHNlIGlmICghdGhpcy5fcG9wRWxlbWVudChmdWxsTmFtZSkpIHtcbiAgICAgIHRoaXMuZXJyb3JzLnB1c2goSHRtbFRyZWVFcnJvci5jcmVhdGUoZnVsbE5hbWUsIGVuZFRhZ1Rva2VuLnNvdXJjZVNwYW4uc3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBVbmV4cGVjdGVkIGNsb3NpbmcgdGFnIFwiJHtlbmRUYWdUb2tlbi5wYXJ0c1sxXX1cImApKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9wb3BFbGVtZW50KGZ1bGxOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBmb3IgKGxldCBzdGFja0luZGV4ID0gdGhpcy5lbGVtZW50U3RhY2subGVuZ3RoIC0gMTsgc3RhY2tJbmRleCA+PSAwOyBzdGFja0luZGV4LS0pIHtcbiAgICAgIGxldCBlbCA9IHRoaXMuZWxlbWVudFN0YWNrW3N0YWNrSW5kZXhdO1xuICAgICAgaWYgKGVsLm5hbWUgPT0gZnVsbE5hbWUpIHtcbiAgICAgICAgTGlzdFdyYXBwZXIuc3BsaWNlKHRoaXMuZWxlbWVudFN0YWNrLCBzdGFja0luZGV4LCB0aGlzLmVsZW1lbnRTdGFjay5sZW5ndGggLSBzdGFja0luZGV4KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghZ2V0SHRtbFRhZ0RlZmluaXRpb24oZWwubmFtZSkuY2xvc2VkQnlQYXJlbnQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIF9jb25zdW1lQXR0cihhdHRyTmFtZTogSHRtbFRva2VuKTogSHRtbEF0dHJBc3Qge1xuICAgIHZhciBmdWxsTmFtZSA9IG1lcmdlTnNBbmROYW1lKGF0dHJOYW1lLnBhcnRzWzBdLCBhdHRyTmFtZS5wYXJ0c1sxXSk7XG4gICAgdmFyIGVuZCA9IGF0dHJOYW1lLnNvdXJjZVNwYW4uZW5kO1xuICAgIHZhciB2YWx1ZSA9ICcnO1xuICAgIGlmICh0aGlzLnBlZWsudHlwZSA9PT0gSHRtbFRva2VuVHlwZS5BVFRSX1ZBTFVFKSB7XG4gICAgICB2YXIgdmFsdWVUb2tlbiA9IHRoaXMuX2FkdmFuY2UoKTtcbiAgICAgIHZhbHVlID0gdmFsdWVUb2tlbi5wYXJ0c1swXTtcbiAgICAgIGVuZCA9IHZhbHVlVG9rZW4uc291cmNlU3Bhbi5lbmQ7XG4gICAgfVxuICAgIHJldHVybiBuZXcgSHRtbEF0dHJBc3QoZnVsbE5hbWUsIHZhbHVlLCBuZXcgUGFyc2VTb3VyY2VTcGFuKGF0dHJOYW1lLnNvdXJjZVNwYW4uc3RhcnQsIGVuZCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0UGFyZW50RWxlbWVudCgpOiBIdG1sRWxlbWVudEFzdCB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudFN0YWNrLmxlbmd0aCA+IDAgPyBMaXN0V3JhcHBlci5sYXN0KHRoaXMuZWxlbWVudFN0YWNrKSA6IG51bGw7XG4gIH1cblxuICBwcml2YXRlIF9hZGRUb1BhcmVudChub2RlOiBIdG1sQXN0KSB7XG4gICAgdmFyIHBhcmVudCA9IHRoaXMuX2dldFBhcmVudEVsZW1lbnQoKTtcbiAgICBpZiAoaXNQcmVzZW50KHBhcmVudCkpIHtcbiAgICAgIHBhcmVudC5jaGlsZHJlbi5wdXNoKG5vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJvb3ROb2Rlcy5wdXNoKG5vZGUpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBtZXJnZU5zQW5kTmFtZShwcmVmaXg6IHN0cmluZywgbG9jYWxOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gaXNQcmVzZW50KHByZWZpeCkgPyBgQCR7cHJlZml4fToke2xvY2FsTmFtZX1gIDogbG9jYWxOYW1lO1xufVxuXG5mdW5jdGlvbiBnZXRFbGVtZW50RnVsbE5hbWUocHJlZml4OiBzdHJpbmcsIGxvY2FsTmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudEVsZW1lbnQ6IEh0bWxFbGVtZW50QXN0KTogc3RyaW5nIHtcbiAgaWYgKGlzQmxhbmsocHJlZml4KSkge1xuICAgIHByZWZpeCA9IGdldEh0bWxUYWdEZWZpbml0aW9uKGxvY2FsTmFtZSkuaW1wbGljaXROYW1lc3BhY2VQcmVmaXg7XG4gICAgaWYgKGlzQmxhbmsocHJlZml4KSAmJiBpc1ByZXNlbnQocGFyZW50RWxlbWVudCkpIHtcbiAgICAgIHByZWZpeCA9IGdldE5zUHJlZml4KHBhcmVudEVsZW1lbnQubmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1lcmdlTnNBbmROYW1lKHByZWZpeCwgbG9jYWxOYW1lKTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21waWxlci9odG1sX3BhcnNlci50c1xuICoqLyIsImltcG9ydCB7aXNQcmVzZW50fSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuXG5pbXBvcnQge1BhcnNlU291cmNlU3Bhbn0gZnJvbSAnLi9wYXJzZV91dGlsJztcblxuZXhwb3J0IGludGVyZmFjZSBIdG1sQXN0IHtcbiAgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuO1xuICB2aXNpdCh2aXNpdG9yOiBIdG1sQXN0VmlzaXRvciwgY29udGV4dDogYW55KTogYW55O1xufVxuXG5leHBvcnQgY2xhc3MgSHRtbFRleHRBc3QgaW1wbGVtZW50cyBIdG1sQXN0IHtcbiAgY29uc3RydWN0b3IocHVibGljIHZhbHVlOiBzdHJpbmcsIHB1YmxpYyBzb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4pIHt9XG4gIHZpc2l0KHZpc2l0b3I6IEh0bWxBc3RWaXNpdG9yLCBjb250ZXh0OiBhbnkpOiBhbnkgeyByZXR1cm4gdmlzaXRvci52aXNpdFRleHQodGhpcywgY29udGV4dCk7IH1cbn1cblxuZXhwb3J0IGNsYXNzIEh0bWxBdHRyQXN0IGltcGxlbWVudHMgSHRtbEFzdCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcsIHB1YmxpYyB2YWx1ZTogc3RyaW5nLCBwdWJsaWMgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuKSB7fVxuICB2aXNpdCh2aXNpdG9yOiBIdG1sQXN0VmlzaXRvciwgY29udGV4dDogYW55KTogYW55IHsgcmV0dXJuIHZpc2l0b3IudmlzaXRBdHRyKHRoaXMsIGNvbnRleHQpOyB9XG59XG5cbmV4cG9ydCBjbGFzcyBIdG1sRWxlbWVudEFzdCBpbXBsZW1lbnRzIEh0bWxBc3Qge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nLCBwdWJsaWMgYXR0cnM6IEh0bWxBdHRyQXN0W10sIHB1YmxpYyBjaGlsZHJlbjogSHRtbEFzdFtdLFxuICAgICAgICAgICAgICBwdWJsaWMgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuKSB7fVxuICB2aXNpdCh2aXNpdG9yOiBIdG1sQXN0VmlzaXRvciwgY29udGV4dDogYW55KTogYW55IHsgcmV0dXJuIHZpc2l0b3IudmlzaXRFbGVtZW50KHRoaXMsIGNvbnRleHQpOyB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSHRtbEFzdFZpc2l0b3Ige1xuICB2aXNpdEVsZW1lbnQoYXN0OiBIdG1sRWxlbWVudEFzdCwgY29udGV4dDogYW55KTogYW55O1xuICB2aXNpdEF0dHIoYXN0OiBIdG1sQXR0ckFzdCwgY29udGV4dDogYW55KTogYW55O1xuICB2aXNpdFRleHQoYXN0OiBIdG1sVGV4dEFzdCwgY29udGV4dDogYW55KTogYW55O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaHRtbFZpc2l0QWxsKHZpc2l0b3I6IEh0bWxBc3RWaXNpdG9yLCBhc3RzOiBIdG1sQXN0W10sIGNvbnRleHQ6IGFueSA9IG51bGwpOiBhbnlbXSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgYXN0cy5mb3JFYWNoKGFzdCA9PiB7XG4gICAgdmFyIGFzdFJlc3VsdCA9IGFzdC52aXNpdCh2aXNpdG9yLCBjb250ZXh0KTtcbiAgICBpZiAoaXNQcmVzZW50KGFzdFJlc3VsdCkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGFzdFJlc3VsdCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21waWxlci9odG1sX2FzdC50c1xuICoqLyIsImltcG9ydCB7XG4gIFN0cmluZ1dyYXBwZXIsXG4gIE51bWJlcldyYXBwZXIsXG4gIGlzUHJlc2VudCxcbiAgaXNCbGFuayxcbiAgQ09OU1RfRVhQUixcbiAgc2VyaWFsaXplRW51bVxufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtMaXN0V3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcbmltcG9ydCB7UGFyc2VMb2NhdGlvbiwgUGFyc2VFcnJvciwgUGFyc2VTb3VyY2VGaWxlLCBQYXJzZVNvdXJjZVNwYW59IGZyb20gJy4vcGFyc2VfdXRpbCc7XG5pbXBvcnQge2dldEh0bWxUYWdEZWZpbml0aW9uLCBIdG1sVGFnQ29udGVudFR5cGUsIE5BTUVEX0VOVElUSUVTfSBmcm9tICcuL2h0bWxfdGFncyc7XG5cbmV4cG9ydCBlbnVtIEh0bWxUb2tlblR5cGUge1xuICBUQUdfT1BFTl9TVEFSVCxcbiAgVEFHX09QRU5fRU5ELFxuICBUQUdfT1BFTl9FTkRfVk9JRCxcbiAgVEFHX0NMT1NFLFxuICBURVhULFxuICBFU0NBUEFCTEVfUkFXX1RFWFQsXG4gIFJBV19URVhULFxuICBDT01NRU5UX1NUQVJULFxuICBDT01NRU5UX0VORCxcbiAgQ0RBVEFfU1RBUlQsXG4gIENEQVRBX0VORCxcbiAgQVRUUl9OQU1FLFxuICBBVFRSX1ZBTFVFLFxuICBET0NfVFlQRSxcbiAgRU9GXG59XG5cbmV4cG9ydCBjbGFzcyBIdG1sVG9rZW4ge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdHlwZTogSHRtbFRva2VuVHlwZSwgcHVibGljIHBhcnRzOiBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgcHVibGljIHNvdXJjZVNwYW46IFBhcnNlU291cmNlU3Bhbikge31cbn1cblxuZXhwb3J0IGNsYXNzIEh0bWxUb2tlbkVycm9yIGV4dGVuZHMgUGFyc2VFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGVycm9yTXNnOiBzdHJpbmcsIHB1YmxpYyB0b2tlblR5cGU6IEh0bWxUb2tlblR5cGUsIGxvY2F0aW9uOiBQYXJzZUxvY2F0aW9uKSB7XG4gICAgc3VwZXIobG9jYXRpb24sIGVycm9yTXNnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSHRtbFRva2VuaXplUmVzdWx0IHtcbiAgY29uc3RydWN0b3IocHVibGljIHRva2VuczogSHRtbFRva2VuW10sIHB1YmxpYyBlcnJvcnM6IEh0bWxUb2tlbkVycm9yW10pIHt9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b2tlbml6ZUh0bWwoc291cmNlQ29udGVudDogc3RyaW5nLCBzb3VyY2VVcmw6IHN0cmluZyk6IEh0bWxUb2tlbml6ZVJlc3VsdCB7XG4gIHJldHVybiBuZXcgX0h0bWxUb2tlbml6ZXIobmV3IFBhcnNlU291cmNlRmlsZShzb3VyY2VDb250ZW50LCBzb3VyY2VVcmwpKS50b2tlbml6ZSgpO1xufVxuXG5jb25zdCAkRU9GID0gMDtcbmNvbnN0ICRUQUIgPSA5O1xuY29uc3QgJExGID0gMTA7XG5jb25zdCAkRkYgPSAxMjtcbmNvbnN0ICRDUiA9IDEzO1xuXG5jb25zdCAkU1BBQ0UgPSAzMjtcblxuY29uc3QgJEJBTkcgPSAzMztcbmNvbnN0ICREUSA9IDM0O1xuY29uc3QgJEhBU0ggPSAzNTtcbmNvbnN0ICQkID0gMzY7XG5jb25zdCAkQU1QRVJTQU5EID0gMzg7XG5jb25zdCAkU1EgPSAzOTtcbmNvbnN0ICRNSU5VUyA9IDQ1O1xuY29uc3QgJFNMQVNIID0gNDc7XG5jb25zdCAkMCA9IDQ4O1xuXG5jb25zdCAkU0VNSUNPTE9OID0gNTk7XG5cbmNvbnN0ICQ5ID0gNTc7XG5jb25zdCAkQ09MT04gPSA1ODtcbmNvbnN0ICRMVCA9IDYwO1xuY29uc3QgJEVRID0gNjE7XG5jb25zdCAkR1QgPSA2MjtcbmNvbnN0ICRRVUVTVElPTiA9IDYzO1xuY29uc3QgJEEgPSA2NTtcbmNvbnN0ICRaID0gOTA7XG5jb25zdCAkTEJSQUNLRVQgPSA5MTtcbmNvbnN0ICRSQlJBQ0tFVCA9IDkzO1xuY29uc3QgJGEgPSA5NztcbmNvbnN0ICRmID0gMTAyO1xuY29uc3QgJHogPSAxMjI7XG5jb25zdCAkeCA9IDEyMDtcblxuY29uc3QgJE5CU1AgPSAxNjA7XG5cbnZhciBDUl9PUl9DUkxGX1JFR0VYUCA9IC9cXHJcXG4/L2c7XG5cbmZ1bmN0aW9uIHVuZXhwZWN0ZWRDaGFyYWN0ZXJFcnJvck1zZyhjaGFyQ29kZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgdmFyIGNoYXIgPSBjaGFyQ29kZSA9PT0gJEVPRiA/ICdFT0YnIDogU3RyaW5nV3JhcHBlci5mcm9tQ2hhckNvZGUoY2hhckNvZGUpO1xuICByZXR1cm4gYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIFwiJHtjaGFyfVwiYDtcbn1cblxuZnVuY3Rpb24gdW5rbm93bkVudGl0eUVycm9yTXNnKGVudGl0eVNyYzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBVbmtub3duIGVudGl0eSBcIiR7ZW50aXR5U3JjfVwiIC0gdXNlIHRoZSBcIiYjPGRlY2ltYWw+O1wiIG9yICBcIiYjeDxoZXg+O1wiIHN5bnRheGA7XG59XG5cbmNsYXNzIENvbnRyb2xGbG93RXJyb3Ige1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZXJyb3I6IEh0bWxUb2tlbkVycm9yKSB7fVxufVxuXG4vLyBTZWUgaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDUxL3N5bnRheC5odG1sI3dyaXRpbmdcbmNsYXNzIF9IdG1sVG9rZW5pemVyIHtcbiAgcHJpdmF0ZSBpbnB1dDogc3RyaW5nO1xuICBwcml2YXRlIGlucHV0TG93ZXJjYXNlOiBzdHJpbmc7XG4gIHByaXZhdGUgbGVuZ3RoOiBudW1iZXI7XG4gIC8vIE5vdGU6IHRoaXMgaXMgYWx3YXlzIGxvd2VyY2FzZSFcbiAgcHJpdmF0ZSBwZWVrOiBudW1iZXIgPSAtMTtcbiAgcHJpdmF0ZSBpbmRleDogbnVtYmVyID0gLTE7XG4gIHByaXZhdGUgbGluZTogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBjb2x1bW46IG51bWJlciA9IC0xO1xuICBwcml2YXRlIGN1cnJlbnRUb2tlblN0YXJ0OiBQYXJzZUxvY2F0aW9uO1xuICBwcml2YXRlIGN1cnJlbnRUb2tlblR5cGU6IEh0bWxUb2tlblR5cGU7XG5cbiAgdG9rZW5zOiBIdG1sVG9rZW5bXSA9IFtdO1xuICBlcnJvcnM6IEh0bWxUb2tlbkVycm9yW10gPSBbXTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZpbGU6IFBhcnNlU291cmNlRmlsZSkge1xuICAgIHRoaXMuaW5wdXQgPSBmaWxlLmNvbnRlbnQ7XG4gICAgdGhpcy5pbnB1dExvd2VyY2FzZSA9IGZpbGUuY29udGVudC50b0xvd2VyQ2FzZSgpO1xuICAgIHRoaXMubGVuZ3RoID0gZmlsZS5jb250ZW50Lmxlbmd0aDtcbiAgICB0aGlzLl9hZHZhbmNlKCk7XG4gIH1cblxuICBwcml2YXRlIF9wcm9jZXNzQ2FycmlhZ2VSZXR1cm5zKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDUvc3ludGF4Lmh0bWwjcHJlcHJvY2Vzc2luZy10aGUtaW5wdXQtc3RyZWFtXG4gICAgLy8gSW4gb3JkZXIgdG8ga2VlcCB0aGUgb3JpZ2luYWwgcG9zaXRpb24gaW4gdGhlIHNvdXJjZSwgd2UgY2FuIG5vdCBwcmUtcHJvY2VzcyBpdC5cbiAgICAvLyBJbnN0ZWFkIENScyBhcmUgcHJvY2Vzc2VkIHJpZ2h0IGJlZm9yZSBpbnN0YW50aWF0aW5nIHRoZSB0b2tlbnMuXG4gICAgcmV0dXJuIFN0cmluZ1dyYXBwZXIucmVwbGFjZUFsbChjb250ZW50LCBDUl9PUl9DUkxGX1JFR0VYUCwgJ1xcbicpO1xuICB9XG5cbiAgdG9rZW5pemUoKTogSHRtbFRva2VuaXplUmVzdWx0IHtcbiAgICB3aGlsZSAodGhpcy5wZWVrICE9PSAkRU9GKSB7XG4gICAgICB2YXIgc3RhcnQgPSB0aGlzLl9nZXRMb2NhdGlvbigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHRoaXMuX2F0dGVtcHRDaGFyKCRMVCkpIHtcbiAgICAgICAgICBpZiAodGhpcy5fYXR0ZW1wdENoYXIoJEJBTkcpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fYXR0ZW1wdENoYXIoJExCUkFDS0VUKSkge1xuICAgICAgICAgICAgICB0aGlzLl9jb25zdW1lQ2RhdGEoc3RhcnQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9hdHRlbXB0Q2hhcigkTUlOVVMpKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2NvbnN1bWVDb21tZW50KHN0YXJ0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuX2NvbnN1bWVEb2NUeXBlKHN0YXJ0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2F0dGVtcHRDaGFyKCRTTEFTSCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnN1bWVUYWdDbG9zZShzdGFydCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnN1bWVUYWdPcGVuKHN0YXJ0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fY29uc3VtZVRleHQoKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIENvbnRyb2xGbG93RXJyb3IpIHtcbiAgICAgICAgICB0aGlzLmVycm9ycy5wdXNoKGUuZXJyb3IpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fYmVnaW5Ub2tlbihIdG1sVG9rZW5UeXBlLkVPRik7XG4gICAgdGhpcy5fZW5kVG9rZW4oW10pO1xuICAgIHJldHVybiBuZXcgSHRtbFRva2VuaXplUmVzdWx0KG1lcmdlVGV4dFRva2Vucyh0aGlzLnRva2VucyksIHRoaXMuZXJyb3JzKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldExvY2F0aW9uKCk6IFBhcnNlTG9jYXRpb24ge1xuICAgIHJldHVybiBuZXcgUGFyc2VMb2NhdGlvbih0aGlzLmZpbGUsIHRoaXMuaW5kZXgsIHRoaXMubGluZSwgdGhpcy5jb2x1bW4pO1xuICB9XG5cbiAgcHJpdmF0ZSBfYmVnaW5Ub2tlbih0eXBlOiBIdG1sVG9rZW5UeXBlLCBzdGFydDogUGFyc2VMb2NhdGlvbiA9IG51bGwpIHtcbiAgICBpZiAoaXNCbGFuayhzdGFydCkpIHtcbiAgICAgIHN0YXJ0ID0gdGhpcy5fZ2V0TG9jYXRpb24oKTtcbiAgICB9XG4gICAgdGhpcy5jdXJyZW50VG9rZW5TdGFydCA9IHN0YXJ0O1xuICAgIHRoaXMuY3VycmVudFRva2VuVHlwZSA9IHR5cGU7XG4gIH1cblxuICBwcml2YXRlIF9lbmRUb2tlbihwYXJ0czogc3RyaW5nW10sIGVuZDogUGFyc2VMb2NhdGlvbiA9IG51bGwpOiBIdG1sVG9rZW4ge1xuICAgIGlmIChpc0JsYW5rKGVuZCkpIHtcbiAgICAgIGVuZCA9IHRoaXMuX2dldExvY2F0aW9uKCk7XG4gICAgfVxuICAgIHZhciB0b2tlbiA9IG5ldyBIdG1sVG9rZW4odGhpcy5jdXJyZW50VG9rZW5UeXBlLCBwYXJ0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQYXJzZVNvdXJjZVNwYW4odGhpcy5jdXJyZW50VG9rZW5TdGFydCwgZW5kKSk7XG4gICAgdGhpcy50b2tlbnMucHVzaCh0b2tlbik7XG4gICAgdGhpcy5jdXJyZW50VG9rZW5TdGFydCA9IG51bGw7XG4gICAgdGhpcy5jdXJyZW50VG9rZW5UeXBlID0gbnVsbDtcbiAgICByZXR1cm4gdG9rZW47XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVFcnJvcihtc2c6IHN0cmluZywgcG9zaXRpb246IFBhcnNlTG9jYXRpb24pOiBDb250cm9sRmxvd0Vycm9yIHtcbiAgICB2YXIgZXJyb3IgPSBuZXcgSHRtbFRva2VuRXJyb3IobXNnLCB0aGlzLmN1cnJlbnRUb2tlblR5cGUsIHBvc2l0aW9uKTtcbiAgICB0aGlzLmN1cnJlbnRUb2tlblN0YXJ0ID0gbnVsbDtcbiAgICB0aGlzLmN1cnJlbnRUb2tlblR5cGUgPSBudWxsO1xuICAgIHJldHVybiBuZXcgQ29udHJvbEZsb3dFcnJvcihlcnJvcik7XG4gIH1cblxuICBwcml2YXRlIF9hZHZhbmNlKCkge1xuICAgIGlmICh0aGlzLmluZGV4ID49IHRoaXMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyB0aGlzLl9jcmVhdGVFcnJvcih1bmV4cGVjdGVkQ2hhcmFjdGVyRXJyb3JNc2coJEVPRiksIHRoaXMuX2dldExvY2F0aW9uKCkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wZWVrID09PSAkTEYpIHtcbiAgICAgIHRoaXMubGluZSsrO1xuICAgICAgdGhpcy5jb2x1bW4gPSAwO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wZWVrICE9PSAkTEYgJiYgdGhpcy5wZWVrICE9PSAkQ1IpIHtcbiAgICAgIHRoaXMuY29sdW1uKys7XG4gICAgfVxuICAgIHRoaXMuaW5kZXgrKztcbiAgICB0aGlzLnBlZWsgPSB0aGlzLmluZGV4ID49IHRoaXMubGVuZ3RoID8gJEVPRiA6IFN0cmluZ1dyYXBwZXIuY2hhckNvZGVBdCh0aGlzLmlucHV0TG93ZXJjYXNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZXgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXR0ZW1wdENoYXIoY2hhckNvZGU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnBlZWsgPT09IGNoYXJDb2RlKSB7XG4gICAgICB0aGlzLl9hZHZhbmNlKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVxdWlyZUNoYXIoY2hhckNvZGU6IG51bWJlcikge1xuICAgIHZhciBsb2NhdGlvbiA9IHRoaXMuX2dldExvY2F0aW9uKCk7XG4gICAgaWYgKCF0aGlzLl9hdHRlbXB0Q2hhcihjaGFyQ29kZSkpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUVycm9yKHVuZXhwZWN0ZWRDaGFyYWN0ZXJFcnJvck1zZyh0aGlzLnBlZWspLCBsb2NhdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYXR0ZW1wdENoYXJzKGNoYXJzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIXRoaXMuX2F0dGVtcHRDaGFyKFN0cmluZ1dyYXBwZXIuY2hhckNvZGVBdChjaGFycywgaSkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIF9yZXF1aXJlQ2hhcnMoY2hhcnM6IHN0cmluZykge1xuICAgIHZhciBsb2NhdGlvbiA9IHRoaXMuX2dldExvY2F0aW9uKCk7XG4gICAgaWYgKCF0aGlzLl9hdHRlbXB0Q2hhcnMoY2hhcnMpKSB7XG4gICAgICB0aHJvdyB0aGlzLl9jcmVhdGVFcnJvcih1bmV4cGVjdGVkQ2hhcmFjdGVyRXJyb3JNc2codGhpcy5wZWVrKSwgbG9jYXRpb24pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2F0dGVtcHRVbnRpbEZuKHByZWRpY2F0ZTogRnVuY3Rpb24pIHtcbiAgICB3aGlsZSAoIXByZWRpY2F0ZSh0aGlzLnBlZWspKSB7XG4gICAgICB0aGlzLl9hZHZhbmNlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVxdWlyZVVudGlsRm4ocHJlZGljYXRlOiBGdW5jdGlvbiwgbGVuOiBudW1iZXIpIHtcbiAgICB2YXIgc3RhcnQgPSB0aGlzLl9nZXRMb2NhdGlvbigpO1xuICAgIHRoaXMuX2F0dGVtcHRVbnRpbEZuKHByZWRpY2F0ZSk7XG4gICAgaWYgKHRoaXMuaW5kZXggLSBzdGFydC5vZmZzZXQgPCBsZW4pIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUVycm9yKHVuZXhwZWN0ZWRDaGFyYWN0ZXJFcnJvck1zZyh0aGlzLnBlZWspLCBzdGFydCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYXR0ZW1wdFVudGlsQ2hhcihjaGFyOiBudW1iZXIpIHtcbiAgICB3aGlsZSAodGhpcy5wZWVrICE9PSBjaGFyKSB7XG4gICAgICB0aGlzLl9hZHZhbmNlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVhZENoYXIoZGVjb2RlRW50aXRpZXM6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIGlmIChkZWNvZGVFbnRpdGllcyAmJiB0aGlzLnBlZWsgPT09ICRBTVBFUlNBTkQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9kZWNvZGVFbnRpdHkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGluZGV4ID0gdGhpcy5pbmRleDtcbiAgICAgIHRoaXMuX2FkdmFuY2UoKTtcbiAgICAgIHJldHVybiB0aGlzLmlucHV0W2luZGV4XTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9kZWNvZGVFbnRpdHkoKTogc3RyaW5nIHtcbiAgICB2YXIgc3RhcnQgPSB0aGlzLl9nZXRMb2NhdGlvbigpO1xuICAgIHRoaXMuX2FkdmFuY2UoKTtcbiAgICBpZiAodGhpcy5fYXR0ZW1wdENoYXIoJEhBU0gpKSB7XG4gICAgICBsZXQgaXNIZXggPSB0aGlzLl9hdHRlbXB0Q2hhcigkeCk7XG4gICAgICBsZXQgbnVtYmVyU3RhcnQgPSB0aGlzLl9nZXRMb2NhdGlvbigpLm9mZnNldDtcbiAgICAgIHRoaXMuX2F0dGVtcHRVbnRpbEZuKGlzRGlnaXRFbnRpdHlFbmQpO1xuICAgICAgaWYgKHRoaXMucGVlayAhPSAkU0VNSUNPTE9OKSB7XG4gICAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUVycm9yKHVuZXhwZWN0ZWRDaGFyYWN0ZXJFcnJvck1zZyh0aGlzLnBlZWspLCB0aGlzLl9nZXRMb2NhdGlvbigpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2FkdmFuY2UoKTtcbiAgICAgIGxldCBzdHJOdW0gPSB0aGlzLmlucHV0LnN1YnN0cmluZyhudW1iZXJTdGFydCwgdGhpcy5pbmRleCAtIDEpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbGV0IGNoYXJDb2RlID0gTnVtYmVyV3JhcHBlci5wYXJzZUludChzdHJOdW0sIGlzSGV4ID8gMTYgOiAxMCk7XG4gICAgICAgIHJldHVybiBTdHJpbmdXcmFwcGVyLmZyb21DaGFyQ29kZShjaGFyQ29kZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxldCBlbnRpdHkgPSB0aGlzLmlucHV0LnN1YnN0cmluZyhzdGFydC5vZmZzZXQgKyAxLCB0aGlzLmluZGV4IC0gMSk7XG4gICAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUVycm9yKHVua25vd25FbnRpdHlFcnJvck1zZyhlbnRpdHkpLCBzdGFydCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBzdGFydFBvc2l0aW9uID0gdGhpcy5fc2F2ZVBvc2l0aW9uKCk7XG4gICAgICB0aGlzLl9hdHRlbXB0VW50aWxGbihpc05hbWVkRW50aXR5RW5kKTtcbiAgICAgIGlmICh0aGlzLnBlZWsgIT0gJFNFTUlDT0xPTikge1xuICAgICAgICB0aGlzLl9yZXN0b3JlUG9zaXRpb24oc3RhcnRQb3NpdGlvbik7XG4gICAgICAgIHJldHVybiAnJic7XG4gICAgICB9XG4gICAgICB0aGlzLl9hZHZhbmNlKCk7XG4gICAgICBsZXQgbmFtZSA9IHRoaXMuaW5wdXQuc3Vic3RyaW5nKHN0YXJ0Lm9mZnNldCArIDEsIHRoaXMuaW5kZXggLSAxKTtcbiAgICAgIGxldCBjaGFyID0gTkFNRURfRU5USVRJRVNbbmFtZV07XG4gICAgICBpZiAoaXNCbGFuayhjaGFyKSkge1xuICAgICAgICB0aHJvdyB0aGlzLl9jcmVhdGVFcnJvcih1bmtub3duRW50aXR5RXJyb3JNc2cobmFtZSksIHN0YXJ0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjaGFyO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2NvbnN1bWVSYXdUZXh0KGRlY29kZUVudGl0aWVzOiBib29sZWFuLCBmaXJzdENoYXJPZkVuZDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRlbXB0RW5kUmVzdDogRnVuY3Rpb24pOiBIdG1sVG9rZW4ge1xuICAgIHZhciB0YWdDbG9zZVN0YXJ0O1xuICAgIHZhciB0ZXh0U3RhcnQgPSB0aGlzLl9nZXRMb2NhdGlvbigpO1xuICAgIHRoaXMuX2JlZ2luVG9rZW4oZGVjb2RlRW50aXRpZXMgPyBIdG1sVG9rZW5UeXBlLkVTQ0FQQUJMRV9SQVdfVEVYVCA6IEh0bWxUb2tlblR5cGUuUkFXX1RFWFQsXG4gICAgICAgICAgICAgICAgICAgICB0ZXh0U3RhcnQpO1xuICAgIHZhciBwYXJ0cyA9IFtdO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB0YWdDbG9zZVN0YXJ0ID0gdGhpcy5fZ2V0TG9jYXRpb24oKTtcbiAgICAgIGlmICh0aGlzLl9hdHRlbXB0Q2hhcihmaXJzdENoYXJPZkVuZCkgJiYgYXR0ZW1wdEVuZFJlc3QoKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmluZGV4ID4gdGFnQ2xvc2VTdGFydC5vZmZzZXQpIHtcbiAgICAgICAgcGFydHMucHVzaCh0aGlzLmlucHV0LnN1YnN0cmluZyh0YWdDbG9zZVN0YXJ0Lm9mZnNldCwgdGhpcy5pbmRleCkpO1xuICAgICAgfVxuICAgICAgd2hpbGUgKHRoaXMucGVlayAhPT0gZmlyc3RDaGFyT2ZFbmQpIHtcbiAgICAgICAgcGFydHMucHVzaCh0aGlzLl9yZWFkQ2hhcihkZWNvZGVFbnRpdGllcykpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZW5kVG9rZW4oW3RoaXMuX3Byb2Nlc3NDYXJyaWFnZVJldHVybnMocGFydHMuam9pbignJykpXSwgdGFnQ2xvc2VTdGFydCk7XG4gIH1cblxuICBwcml2YXRlIF9jb25zdW1lQ29tbWVudChzdGFydDogUGFyc2VMb2NhdGlvbikge1xuICAgIHRoaXMuX2JlZ2luVG9rZW4oSHRtbFRva2VuVHlwZS5DT01NRU5UX1NUQVJULCBzdGFydCk7XG4gICAgdGhpcy5fcmVxdWlyZUNoYXIoJE1JTlVTKTtcbiAgICB0aGlzLl9lbmRUb2tlbihbXSk7XG4gICAgdmFyIHRleHRUb2tlbiA9IHRoaXMuX2NvbnN1bWVSYXdUZXh0KGZhbHNlLCAkTUlOVVMsICgpID0+IHRoaXMuX2F0dGVtcHRDaGFycygnLT4nKSk7XG4gICAgdGhpcy5fYmVnaW5Ub2tlbihIdG1sVG9rZW5UeXBlLkNPTU1FTlRfRU5ELCB0ZXh0VG9rZW4uc291cmNlU3Bhbi5lbmQpO1xuICAgIHRoaXMuX2VuZFRva2VuKFtdKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbnN1bWVDZGF0YShzdGFydDogUGFyc2VMb2NhdGlvbikge1xuICAgIHRoaXMuX2JlZ2luVG9rZW4oSHRtbFRva2VuVHlwZS5DREFUQV9TVEFSVCwgc3RhcnQpO1xuICAgIHRoaXMuX3JlcXVpcmVDaGFycygnY2RhdGFbJyk7XG4gICAgdGhpcy5fZW5kVG9rZW4oW10pO1xuICAgIHZhciB0ZXh0VG9rZW4gPSB0aGlzLl9jb25zdW1lUmF3VGV4dChmYWxzZSwgJFJCUkFDS0VULCAoKSA9PiB0aGlzLl9hdHRlbXB0Q2hhcnMoJ10+JykpO1xuICAgIHRoaXMuX2JlZ2luVG9rZW4oSHRtbFRva2VuVHlwZS5DREFUQV9FTkQsIHRleHRUb2tlbi5zb3VyY2VTcGFuLmVuZCk7XG4gICAgdGhpcy5fZW5kVG9rZW4oW10pO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29uc3VtZURvY1R5cGUoc3RhcnQ6IFBhcnNlTG9jYXRpb24pIHtcbiAgICB0aGlzLl9iZWdpblRva2VuKEh0bWxUb2tlblR5cGUuRE9DX1RZUEUsIHN0YXJ0KTtcbiAgICB0aGlzLl9hdHRlbXB0VW50aWxDaGFyKCRHVCk7XG4gICAgdGhpcy5fYWR2YW5jZSgpO1xuICAgIHRoaXMuX2VuZFRva2VuKFt0aGlzLmlucHV0LnN1YnN0cmluZyhzdGFydC5vZmZzZXQgKyAyLCB0aGlzLmluZGV4IC0gMSldKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbnN1bWVQcmVmaXhBbmROYW1lKCk6IHN0cmluZ1tdIHtcbiAgICB2YXIgbmFtZU9yUHJlZml4U3RhcnQgPSB0aGlzLmluZGV4O1xuICAgIHZhciBwcmVmaXggPSBudWxsO1xuICAgIHdoaWxlICh0aGlzLnBlZWsgIT09ICRDT0xPTiAmJiAhaXNQcmVmaXhFbmQodGhpcy5wZWVrKSkge1xuICAgICAgdGhpcy5fYWR2YW5jZSgpO1xuICAgIH1cbiAgICB2YXIgbmFtZVN0YXJ0O1xuICAgIGlmICh0aGlzLnBlZWsgPT09ICRDT0xPTikge1xuICAgICAgdGhpcy5fYWR2YW5jZSgpO1xuICAgICAgcHJlZml4ID0gdGhpcy5pbnB1dC5zdWJzdHJpbmcobmFtZU9yUHJlZml4U3RhcnQsIHRoaXMuaW5kZXggLSAxKTtcbiAgICAgIG5hbWVTdGFydCA9IHRoaXMuaW5kZXg7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWVTdGFydCA9IG5hbWVPclByZWZpeFN0YXJ0O1xuICAgIH1cbiAgICB0aGlzLl9yZXF1aXJlVW50aWxGbihpc05hbWVFbmQsIHRoaXMuaW5kZXggPT09IG5hbWVTdGFydCA/IDEgOiAwKTtcbiAgICB2YXIgbmFtZSA9IHRoaXMuaW5wdXQuc3Vic3RyaW5nKG5hbWVTdGFydCwgdGhpcy5pbmRleCk7XG4gICAgcmV0dXJuIFtwcmVmaXgsIG5hbWVdO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29uc3VtZVRhZ09wZW4oc3RhcnQ6IFBhcnNlTG9jYXRpb24pIHtcbiAgICBsZXQgc2F2ZWRQb3MgPSB0aGlzLl9zYXZlUG9zaXRpb24oKTtcbiAgICBsZXQgbG93ZXJjYXNlVGFnTmFtZTtcbiAgICB0cnkge1xuICAgICAgaWYgKCFpc0FzY2lpTGV0dGVyKHRoaXMucGVlaykpIHtcbiAgICAgICAgdGhyb3cgdGhpcy5fY3JlYXRlRXJyb3IodW5leHBlY3RlZENoYXJhY3RlckVycm9yTXNnKHRoaXMucGVlayksIHRoaXMuX2dldExvY2F0aW9uKCkpO1xuICAgICAgfVxuICAgICAgdmFyIG5hbWVTdGFydCA9IHRoaXMuaW5kZXg7XG4gICAgICB0aGlzLl9jb25zdW1lVGFnT3BlblN0YXJ0KHN0YXJ0KTtcbiAgICAgIGxvd2VyY2FzZVRhZ05hbWUgPSB0aGlzLmlucHV0TG93ZXJjYXNlLnN1YnN0cmluZyhuYW1lU3RhcnQsIHRoaXMuaW5kZXgpO1xuICAgICAgdGhpcy5fYXR0ZW1wdFVudGlsRm4oaXNOb3RXaGl0ZXNwYWNlKTtcbiAgICAgIHdoaWxlICh0aGlzLnBlZWsgIT09ICRTTEFTSCAmJiB0aGlzLnBlZWsgIT09ICRHVCkge1xuICAgICAgICB0aGlzLl9jb25zdW1lQXR0cmlidXRlTmFtZSgpO1xuICAgICAgICB0aGlzLl9hdHRlbXB0VW50aWxGbihpc05vdFdoaXRlc3BhY2UpO1xuICAgICAgICBpZiAodGhpcy5fYXR0ZW1wdENoYXIoJEVRKSkge1xuICAgICAgICAgIHRoaXMuX2F0dGVtcHRVbnRpbEZuKGlzTm90V2hpdGVzcGFjZSk7XG4gICAgICAgICAgdGhpcy5fY29uc3VtZUF0dHJpYnV0ZVZhbHVlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fYXR0ZW1wdFVudGlsRm4oaXNOb3RXaGl0ZXNwYWNlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2NvbnN1bWVUYWdPcGVuRW5kKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBDb250cm9sRmxvd0Vycm9yKSB7XG4gICAgICAgIC8vIFdoZW4gdGhlIHN0YXJ0IHRhZyBpcyBpbnZhbGlkLCBhc3N1bWUgd2Ugd2FudCBhIFwiPFwiXG4gICAgICAgIHRoaXMuX3Jlc3RvcmVQb3NpdGlvbihzYXZlZFBvcyk7XG4gICAgICAgIC8vIEJhY2sgdG8gYmFjayB0ZXh0IHRva2VucyBhcmUgbWVyZ2VkIGF0IHRoZSBlbmRcbiAgICAgICAgdGhpcy5fYmVnaW5Ub2tlbihIdG1sVG9rZW5UeXBlLlRFWFQsIHN0YXJ0KTtcbiAgICAgICAgdGhpcy5fZW5kVG9rZW4oWyc8J10pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRocm93IGU7XG4gICAgfVxuXG4gICAgdmFyIGNvbnRlbnRUb2tlblR5cGUgPSBnZXRIdG1sVGFnRGVmaW5pdGlvbihsb3dlcmNhc2VUYWdOYW1lKS5jb250ZW50VHlwZTtcbiAgICBpZiAoY29udGVudFRva2VuVHlwZSA9PT0gSHRtbFRhZ0NvbnRlbnRUeXBlLlJBV19URVhUKSB7XG4gICAgICB0aGlzLl9jb25zdW1lUmF3VGV4dFdpdGhUYWdDbG9zZShsb3dlcmNhc2VUYWdOYW1lLCBmYWxzZSk7XG4gICAgfSBlbHNlIGlmIChjb250ZW50VG9rZW5UeXBlID09PSBIdG1sVGFnQ29udGVudFR5cGUuRVNDQVBBQkxFX1JBV19URVhUKSB7XG4gICAgICB0aGlzLl9jb25zdW1lUmF3VGV4dFdpdGhUYWdDbG9zZShsb3dlcmNhc2VUYWdOYW1lLCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jb25zdW1lUmF3VGV4dFdpdGhUYWdDbG9zZShsb3dlcmNhc2VUYWdOYW1lOiBzdHJpbmcsIGRlY29kZUVudGl0aWVzOiBib29sZWFuKSB7XG4gICAgdmFyIHRleHRUb2tlbiA9IHRoaXMuX2NvbnN1bWVSYXdUZXh0KGRlY29kZUVudGl0aWVzLCAkTFQsICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5fYXR0ZW1wdENoYXIoJFNMQVNIKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgdGhpcy5fYXR0ZW1wdFVudGlsRm4oaXNOb3RXaGl0ZXNwYWNlKTtcbiAgICAgIGlmICghdGhpcy5fYXR0ZW1wdENoYXJzKGxvd2VyY2FzZVRhZ05hbWUpKSByZXR1cm4gZmFsc2U7XG4gICAgICB0aGlzLl9hdHRlbXB0VW50aWxGbihpc05vdFdoaXRlc3BhY2UpO1xuICAgICAgaWYgKCF0aGlzLl9hdHRlbXB0Q2hhcigkR1QpKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgICB0aGlzLl9iZWdpblRva2VuKEh0bWxUb2tlblR5cGUuVEFHX0NMT1NFLCB0ZXh0VG9rZW4uc291cmNlU3Bhbi5lbmQpO1xuICAgIHRoaXMuX2VuZFRva2VuKFtudWxsLCBsb3dlcmNhc2VUYWdOYW1lXSk7XG4gIH1cblxuICBwcml2YXRlIF9jb25zdW1lVGFnT3BlblN0YXJ0KHN0YXJ0OiBQYXJzZUxvY2F0aW9uKSB7XG4gICAgdGhpcy5fYmVnaW5Ub2tlbihIdG1sVG9rZW5UeXBlLlRBR19PUEVOX1NUQVJULCBzdGFydCk7XG4gICAgdmFyIHBhcnRzID0gdGhpcy5fY29uc3VtZVByZWZpeEFuZE5hbWUoKTtcbiAgICB0aGlzLl9lbmRUb2tlbihwYXJ0cyk7XG4gIH1cblxuICBwcml2YXRlIF9jb25zdW1lQXR0cmlidXRlTmFtZSgpIHtcbiAgICB0aGlzLl9iZWdpblRva2VuKEh0bWxUb2tlblR5cGUuQVRUUl9OQU1FKTtcbiAgICB2YXIgcHJlZml4QW5kTmFtZSA9IHRoaXMuX2NvbnN1bWVQcmVmaXhBbmROYW1lKCk7XG4gICAgdGhpcy5fZW5kVG9rZW4ocHJlZml4QW5kTmFtZSk7XG4gIH1cblxuICBwcml2YXRlIF9jb25zdW1lQXR0cmlidXRlVmFsdWUoKSB7XG4gICAgdGhpcy5fYmVnaW5Ub2tlbihIdG1sVG9rZW5UeXBlLkFUVFJfVkFMVUUpO1xuICAgIHZhciB2YWx1ZTtcbiAgICBpZiAodGhpcy5wZWVrID09PSAkU1EgfHwgdGhpcy5wZWVrID09PSAkRFEpIHtcbiAgICAgIHZhciBxdW90ZUNoYXIgPSB0aGlzLnBlZWs7XG4gICAgICB0aGlzLl9hZHZhbmNlKCk7XG4gICAgICB2YXIgcGFydHMgPSBbXTtcbiAgICAgIHdoaWxlICh0aGlzLnBlZWsgIT09IHF1b3RlQ2hhcikge1xuICAgICAgICBwYXJ0cy5wdXNoKHRoaXMuX3JlYWRDaGFyKHRydWUpKTtcbiAgICAgIH1cbiAgICAgIHZhbHVlID0gcGFydHMuam9pbignJyk7XG4gICAgICB0aGlzLl9hZHZhbmNlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB2YWx1ZVN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICAgIHRoaXMuX3JlcXVpcmVVbnRpbEZuKGlzTmFtZUVuZCwgMSk7XG4gICAgICB2YWx1ZSA9IHRoaXMuaW5wdXQuc3Vic3RyaW5nKHZhbHVlU3RhcnQsIHRoaXMuaW5kZXgpO1xuICAgIH1cbiAgICB0aGlzLl9lbmRUb2tlbihbdGhpcy5fcHJvY2Vzc0NhcnJpYWdlUmV0dXJucyh2YWx1ZSldKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbnN1bWVUYWdPcGVuRW5kKCkge1xuICAgIHZhciB0b2tlblR5cGUgPVxuICAgICAgICB0aGlzLl9hdHRlbXB0Q2hhcigkU0xBU0gpID8gSHRtbFRva2VuVHlwZS5UQUdfT1BFTl9FTkRfVk9JRCA6IEh0bWxUb2tlblR5cGUuVEFHX09QRU5fRU5EO1xuICAgIHRoaXMuX2JlZ2luVG9rZW4odG9rZW5UeXBlKTtcbiAgICB0aGlzLl9yZXF1aXJlQ2hhcigkR1QpO1xuICAgIHRoaXMuX2VuZFRva2VuKFtdKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbnN1bWVUYWdDbG9zZShzdGFydDogUGFyc2VMb2NhdGlvbikge1xuICAgIHRoaXMuX2JlZ2luVG9rZW4oSHRtbFRva2VuVHlwZS5UQUdfQ0xPU0UsIHN0YXJ0KTtcbiAgICB0aGlzLl9hdHRlbXB0VW50aWxGbihpc05vdFdoaXRlc3BhY2UpO1xuICAgIHZhciBwcmVmaXhBbmROYW1lO1xuICAgIHByZWZpeEFuZE5hbWUgPSB0aGlzLl9jb25zdW1lUHJlZml4QW5kTmFtZSgpO1xuICAgIHRoaXMuX2F0dGVtcHRVbnRpbEZuKGlzTm90V2hpdGVzcGFjZSk7XG4gICAgdGhpcy5fcmVxdWlyZUNoYXIoJEdUKTtcbiAgICB0aGlzLl9lbmRUb2tlbihwcmVmaXhBbmROYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbnN1bWVUZXh0KCkge1xuICAgIHZhciBzdGFydCA9IHRoaXMuX2dldExvY2F0aW9uKCk7XG4gICAgdGhpcy5fYmVnaW5Ub2tlbihIdG1sVG9rZW5UeXBlLlRFWFQsIHN0YXJ0KTtcbiAgICB2YXIgcGFydHMgPSBbdGhpcy5fcmVhZENoYXIodHJ1ZSldO1xuICAgIHdoaWxlICghaXNUZXh0RW5kKHRoaXMucGVlaykpIHtcbiAgICAgIHBhcnRzLnB1c2godGhpcy5fcmVhZENoYXIodHJ1ZSkpO1xuICAgIH1cbiAgICB0aGlzLl9lbmRUb2tlbihbdGhpcy5fcHJvY2Vzc0NhcnJpYWdlUmV0dXJucyhwYXJ0cy5qb2luKCcnKSldKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NhdmVQb3NpdGlvbigpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIFt0aGlzLnBlZWssIHRoaXMuaW5kZXgsIHRoaXMuY29sdW1uLCB0aGlzLmxpbmUsIHRoaXMudG9rZW5zLmxlbmd0aF07XG4gIH1cblxuICBwcml2YXRlIF9yZXN0b3JlUG9zaXRpb24ocG9zaXRpb246IG51bWJlcltdKTogdm9pZCB7XG4gICAgdGhpcy5wZWVrID0gcG9zaXRpb25bMF07XG4gICAgdGhpcy5pbmRleCA9IHBvc2l0aW9uWzFdO1xuICAgIHRoaXMuY29sdW1uID0gcG9zaXRpb25bMl07XG4gICAgdGhpcy5saW5lID0gcG9zaXRpb25bM107XG4gICAgbGV0IG5iVG9rZW5zID0gcG9zaXRpb25bNF07XG4gICAgaWYgKG5iVG9rZW5zIDwgdGhpcy50b2tlbnMubGVuZ3RoKSB7XG4gICAgICAvLyByZW1vdmUgYW55IGV4dHJhIHRva2Vuc1xuICAgICAgdGhpcy50b2tlbnMgPSBMaXN0V3JhcHBlci5zbGljZSh0aGlzLnRva2VucywgMCwgbmJUb2tlbnMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc05vdFdoaXRlc3BhY2UoY29kZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiAhaXNXaGl0ZXNwYWNlKGNvZGUpIHx8IGNvZGUgPT09ICRFT0Y7XG59XG5cbmZ1bmN0aW9uIGlzV2hpdGVzcGFjZShjb2RlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIChjb2RlID49ICRUQUIgJiYgY29kZSA8PSAkU1BBQ0UpIHx8IChjb2RlID09PSAkTkJTUCk7XG59XG5cbmZ1bmN0aW9uIGlzTmFtZUVuZChjb2RlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzV2hpdGVzcGFjZShjb2RlKSB8fCBjb2RlID09PSAkR1QgfHwgY29kZSA9PT0gJFNMQVNIIHx8IGNvZGUgPT09ICRTUSB8fCBjb2RlID09PSAkRFEgfHxcbiAgICAgICAgIGNvZGUgPT09ICRFUTtcbn1cblxuZnVuY3Rpb24gaXNQcmVmaXhFbmQoY29kZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiAoY29kZSA8ICRhIHx8ICR6IDwgY29kZSkgJiYgKGNvZGUgPCAkQSB8fCAkWiA8IGNvZGUpICYmIChjb2RlIDwgJDAgfHwgY29kZSA+ICQ5KTtcbn1cblxuZnVuY3Rpb24gaXNEaWdpdEVudGl0eUVuZChjb2RlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvZGUgPT0gJFNFTUlDT0xPTiB8fCBjb2RlID09ICRFT0YgfHwgIWlzQXNjaWlIZXhEaWdpdChjb2RlKTtcbn1cblxuZnVuY3Rpb24gaXNOYW1lZEVudGl0eUVuZChjb2RlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvZGUgPT0gJFNFTUlDT0xPTiB8fCBjb2RlID09ICRFT0YgfHwgIWlzQXNjaWlMZXR0ZXIoY29kZSk7XG59XG5cbmZ1bmN0aW9uIGlzVGV4dEVuZChjb2RlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvZGUgPT09ICRMVCB8fCBjb2RlID09PSAkRU9GO1xufVxuXG5mdW5jdGlvbiBpc0FzY2lpTGV0dGVyKGNvZGU6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gY29kZSA+PSAkYSAmJiBjb2RlIDw9ICR6O1xufVxuXG5mdW5jdGlvbiBpc0FzY2lpSGV4RGlnaXQoY29kZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb2RlID49ICRhICYmIGNvZGUgPD0gJGYgfHwgY29kZSA+PSAkMCAmJiBjb2RlIDw9ICQ5O1xufVxuXG5mdW5jdGlvbiBtZXJnZVRleHRUb2tlbnMoc3JjVG9rZW5zOiBIdG1sVG9rZW5bXSk6IEh0bWxUb2tlbltdIHtcbiAgbGV0IGRzdFRva2VucyA9IFtdO1xuICBsZXQgbGFzdERzdFRva2VuOiBIdG1sVG9rZW47XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3JjVG9rZW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IHRva2VuID0gc3JjVG9rZW5zW2ldO1xuICAgIGlmIChpc1ByZXNlbnQobGFzdERzdFRva2VuKSAmJiBsYXN0RHN0VG9rZW4udHlwZSA9PSBIdG1sVG9rZW5UeXBlLlRFWFQgJiZcbiAgICAgICAgdG9rZW4udHlwZSA9PSBIdG1sVG9rZW5UeXBlLlRFWFQpIHtcbiAgICAgIGxhc3REc3RUb2tlbi5wYXJ0c1swXSArPSB0b2tlbi5wYXJ0c1swXTtcbiAgICAgIGxhc3REc3RUb2tlbi5zb3VyY2VTcGFuLmVuZCA9IHRva2VuLnNvdXJjZVNwYW4uZW5kO1xuICAgIH0gZWxzZSB7XG4gICAgICBsYXN0RHN0VG9rZW4gPSB0b2tlbjtcbiAgICAgIGRzdFRva2Vucy5wdXNoKGxhc3REc3RUb2tlbik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRzdFRva2Vucztcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21waWxlci9odG1sX2xleGVyLnRzXG4gKiovIiwiZXhwb3J0IGNsYXNzIFBhcnNlTG9jYXRpb24ge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZmlsZTogUGFyc2VTb3VyY2VGaWxlLCBwdWJsaWMgb2Zmc2V0OiBudW1iZXIsIHB1YmxpYyBsaW5lOiBudW1iZXIsXG4gICAgICAgICAgICAgIHB1YmxpYyBjb2w6IG51bWJlcikge31cblxuICB0b1N0cmluZygpOiBzdHJpbmcgeyByZXR1cm4gYCR7dGhpcy5maWxlLnVybH1AJHt0aGlzLmxpbmV9OiR7dGhpcy5jb2x9YDsgfVxufVxuXG5leHBvcnQgY2xhc3MgUGFyc2VTb3VyY2VGaWxlIHtcbiAgY29uc3RydWN0b3IocHVibGljIGNvbnRlbnQ6IHN0cmluZywgcHVibGljIHVybDogc3RyaW5nKSB7fVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUGFyc2VFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBsb2NhdGlvbjogUGFyc2VMb2NhdGlvbiwgcHVibGljIG1zZzogc3RyaW5nKSB7fVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgdmFyIHNvdXJjZSA9IHRoaXMubG9jYXRpb24uZmlsZS5jb250ZW50O1xuICAgIHZhciBjdHhTdGFydCA9IHRoaXMubG9jYXRpb24ub2Zmc2V0O1xuICAgIGlmIChjdHhTdGFydCA+IHNvdXJjZS5sZW5ndGggLSAxKSB7XG4gICAgICBjdHhTdGFydCA9IHNvdXJjZS5sZW5ndGggLSAxO1xuICAgIH1cbiAgICB2YXIgY3R4RW5kID0gY3R4U3RhcnQ7XG4gICAgdmFyIGN0eExlbiA9IDA7XG4gICAgdmFyIGN0eExpbmVzID0gMDtcblxuICAgIHdoaWxlIChjdHhMZW4gPCAxMDAgJiYgY3R4U3RhcnQgPiAwKSB7XG4gICAgICBjdHhTdGFydC0tO1xuICAgICAgY3R4TGVuKys7XG4gICAgICBpZiAoc291cmNlW2N0eFN0YXJ0XSA9PSBcIlxcblwiKSB7XG4gICAgICAgIGlmICgrK2N0eExpbmVzID09IDMpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGN0eExlbiA9IDA7XG4gICAgY3R4TGluZXMgPSAwO1xuICAgIHdoaWxlIChjdHhMZW4gPCAxMDAgJiYgY3R4RW5kIDwgc291cmNlLmxlbmd0aCAtIDEpIHtcbiAgICAgIGN0eEVuZCsrO1xuICAgICAgY3R4TGVuKys7XG4gICAgICBpZiAoc291cmNlW2N0eEVuZF0gPT0gXCJcXG5cIikge1xuICAgICAgICBpZiAoKytjdHhMaW5lcyA9PSAzKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgY29udGV4dCA9IHNvdXJjZS5zdWJzdHJpbmcoY3R4U3RhcnQsIHRoaXMubG9jYXRpb24ub2Zmc2V0KSArICdbRVJST1IgLT5dJyArXG4gICAgICAgICAgICAgICAgICBzb3VyY2Uuc3Vic3RyaW5nKHRoaXMubG9jYXRpb24ub2Zmc2V0LCBjdHhFbmQgKyAxKTtcblxuICAgIHJldHVybiBgJHt0aGlzLm1zZ30gKFwiJHtjb250ZXh0fVwiKTogJHt0aGlzLmxvY2F0aW9ufWA7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBhcnNlU291cmNlU3BhbiB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBzdGFydDogUGFyc2VMb2NhdGlvbiwgcHVibGljIGVuZDogUGFyc2VMb2NhdGlvbikge31cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnN0YXJ0LmZpbGUuY29udGVudC5zdWJzdHJpbmcodGhpcy5zdGFydC5vZmZzZXQsIHRoaXMuZW5kLm9mZnNldCk7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21waWxlci9wYXJzZV91dGlsLnRzXG4gKiovIiwiaW1wb3J0IHtcbiAgaXNQcmVzZW50LFxuICBpc0JsYW5rLFxuICBub3JtYWxpemVCb29sLFxuICBSZWdFeHBXcmFwcGVyLFxuICBDT05TVF9FWFBSXG59IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5cbi8vIHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNTEvc3ludGF4Lmh0bWwjbmFtZWQtY2hhcmFjdGVyLXJlZmVyZW5jZXNcbi8vIHNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9lbnRpdGllcy5qc29uXG4vLyBUaGlzIGxpc3QgaXMgbm90IGV4aGF1c3RpdmUgdG8ga2VlcCB0aGUgY29tcGlsZXIgZm9vdHByaW50IGxvdy5cbi8vIFRoZSBgJiMxMjM7YCAvIGAmI3gxYWI7YCBzeW50YXggc2hvdWxkIGJlIHVzZWQgd2hlbiB0aGUgbmFtZWQgY2hhcmFjdGVyIHJlZmVyZW5jZSBkb2VzIG5vdCBleGlzdC5cbmV4cG9ydCBjb25zdCBOQU1FRF9FTlRJVElFUyA9IENPTlNUX0VYUFIoe1xuICAnQWFjdXRlJzogJ1xcdTAwQzEnLFxuICAnYWFjdXRlJzogJ1xcdTAwRTEnLFxuICAnQWNpcmMnOiAnXFx1MDBDMicsXG4gICdhY2lyYyc6ICdcXHUwMEUyJyxcbiAgJ2FjdXRlJzogJ1xcdTAwQjQnLFxuICAnQUVsaWcnOiAnXFx1MDBDNicsXG4gICdhZWxpZyc6ICdcXHUwMEU2JyxcbiAgJ0FncmF2ZSc6ICdcXHUwMEMwJyxcbiAgJ2FncmF2ZSc6ICdcXHUwMEUwJyxcbiAgJ2FsZWZzeW0nOiAnXFx1MjEzNScsXG4gICdBbHBoYSc6ICdcXHUwMzkxJyxcbiAgJ2FscGhhJzogJ1xcdTAzQjEnLFxuICAnYW1wJzogJyYnLFxuICAnYW5kJzogJ1xcdTIyMjcnLFxuICAnYW5nJzogJ1xcdTIyMjAnLFxuICAnYXBvcyc6ICdcXHUwMDI3JyxcbiAgJ0FyaW5nJzogJ1xcdTAwQzUnLFxuICAnYXJpbmcnOiAnXFx1MDBFNScsXG4gICdhc3ltcCc6ICdcXHUyMjQ4JyxcbiAgJ0F0aWxkZSc6ICdcXHUwMEMzJyxcbiAgJ2F0aWxkZSc6ICdcXHUwMEUzJyxcbiAgJ0F1bWwnOiAnXFx1MDBDNCcsXG4gICdhdW1sJzogJ1xcdTAwRTQnLFxuICAnYmRxdW8nOiAnXFx1MjAxRScsXG4gICdCZXRhJzogJ1xcdTAzOTInLFxuICAnYmV0YSc6ICdcXHUwM0IyJyxcbiAgJ2JydmJhcic6ICdcXHUwMEE2JyxcbiAgJ2J1bGwnOiAnXFx1MjAyMicsXG4gICdjYXAnOiAnXFx1MjIyOScsXG4gICdDY2VkaWwnOiAnXFx1MDBDNycsXG4gICdjY2VkaWwnOiAnXFx1MDBFNycsXG4gICdjZWRpbCc6ICdcXHUwMEI4JyxcbiAgJ2NlbnQnOiAnXFx1MDBBMicsXG4gICdDaGknOiAnXFx1MDNBNycsXG4gICdjaGknOiAnXFx1MDNDNycsXG4gICdjaXJjJzogJ1xcdTAyQzYnLFxuICAnY2x1YnMnOiAnXFx1MjY2MycsXG4gICdjb25nJzogJ1xcdTIyNDUnLFxuICAnY29weSc6ICdcXHUwMEE5JyxcbiAgJ2NyYXJyJzogJ1xcdTIxQjUnLFxuICAnY3VwJzogJ1xcdTIyMkEnLFxuICAnY3VycmVuJzogJ1xcdTAwQTQnLFxuICAnZGFnZ2VyJzogJ1xcdTIwMjAnLFxuICAnRGFnZ2VyJzogJ1xcdTIwMjEnLFxuICAnZGFycic6ICdcXHUyMTkzJyxcbiAgJ2RBcnInOiAnXFx1MjFEMycsXG4gICdkZWcnOiAnXFx1MDBCMCcsXG4gICdEZWx0YSc6ICdcXHUwMzk0JyxcbiAgJ2RlbHRhJzogJ1xcdTAzQjQnLFxuICAnZGlhbXMnOiAnXFx1MjY2NicsXG4gICdkaXZpZGUnOiAnXFx1MDBGNycsXG4gICdFYWN1dGUnOiAnXFx1MDBDOScsXG4gICdlYWN1dGUnOiAnXFx1MDBFOScsXG4gICdFY2lyYyc6ICdcXHUwMENBJyxcbiAgJ2VjaXJjJzogJ1xcdTAwRUEnLFxuICAnRWdyYXZlJzogJ1xcdTAwQzgnLFxuICAnZWdyYXZlJzogJ1xcdTAwRTgnLFxuICAnZW1wdHknOiAnXFx1MjIwNScsXG4gICdlbXNwJzogJ1xcdTIwMDMnLFxuICAnZW5zcCc6ICdcXHUyMDAyJyxcbiAgJ0Vwc2lsb24nOiAnXFx1MDM5NScsXG4gICdlcHNpbG9uJzogJ1xcdTAzQjUnLFxuICAnZXF1aXYnOiAnXFx1MjI2MScsXG4gICdFdGEnOiAnXFx1MDM5NycsXG4gICdldGEnOiAnXFx1MDNCNycsXG4gICdFVEgnOiAnXFx1MDBEMCcsXG4gICdldGgnOiAnXFx1MDBGMCcsXG4gICdFdW1sJzogJ1xcdTAwQ0InLFxuICAnZXVtbCc6ICdcXHUwMEVCJyxcbiAgJ2V1cm8nOiAnXFx1MjBBQycsXG4gICdleGlzdCc6ICdcXHUyMjAzJyxcbiAgJ2Zub2YnOiAnXFx1MDE5MicsXG4gICdmb3JhbGwnOiAnXFx1MjIwMCcsXG4gICdmcmFjMTInOiAnXFx1MDBCRCcsXG4gICdmcmFjMTQnOiAnXFx1MDBCQycsXG4gICdmcmFjMzQnOiAnXFx1MDBCRScsXG4gICdmcmFzbCc6ICdcXHUyMDQ0JyxcbiAgJ0dhbW1hJzogJ1xcdTAzOTMnLFxuICAnZ2FtbWEnOiAnXFx1MDNCMycsXG4gICdnZSc6ICdcXHUyMjY1JyxcbiAgJ2d0JzogJz4nLFxuICAnaGFycic6ICdcXHUyMTk0JyxcbiAgJ2hBcnInOiAnXFx1MjFENCcsXG4gICdoZWFydHMnOiAnXFx1MjY2NScsXG4gICdoZWxsaXAnOiAnXFx1MjAyNicsXG4gICdJYWN1dGUnOiAnXFx1MDBDRCcsXG4gICdpYWN1dGUnOiAnXFx1MDBFRCcsXG4gICdJY2lyYyc6ICdcXHUwMENFJyxcbiAgJ2ljaXJjJzogJ1xcdTAwRUUnLFxuICAnaWV4Y2wnOiAnXFx1MDBBMScsXG4gICdJZ3JhdmUnOiAnXFx1MDBDQycsXG4gICdpZ3JhdmUnOiAnXFx1MDBFQycsXG4gICdpbWFnZSc6ICdcXHUyMTExJyxcbiAgJ2luZmluJzogJ1xcdTIyMUUnLFxuICAnaW50JzogJ1xcdTIyMkInLFxuICAnSW90YSc6ICdcXHUwMzk5JyxcbiAgJ2lvdGEnOiAnXFx1MDNCOScsXG4gICdpcXVlc3QnOiAnXFx1MDBCRicsXG4gICdpc2luJzogJ1xcdTIyMDgnLFxuICAnSXVtbCc6ICdcXHUwMENGJyxcbiAgJ2l1bWwnOiAnXFx1MDBFRicsXG4gICdLYXBwYSc6ICdcXHUwMzlBJyxcbiAgJ2thcHBhJzogJ1xcdTAzQkEnLFxuICAnTGFtYmRhJzogJ1xcdTAzOUInLFxuICAnbGFtYmRhJzogJ1xcdTAzQkInLFxuICAnbGFuZyc6ICdcXHUyN0U4JyxcbiAgJ2xhcXVvJzogJ1xcdTAwQUInLFxuICAnbGFycic6ICdcXHUyMTkwJyxcbiAgJ2xBcnInOiAnXFx1MjFEMCcsXG4gICdsY2VpbCc6ICdcXHUyMzA4JyxcbiAgJ2xkcXVvJzogJ1xcdTIwMUMnLFxuICAnbGUnOiAnXFx1MjI2NCcsXG4gICdsZmxvb3InOiAnXFx1MjMwQScsXG4gICdsb3dhc3QnOiAnXFx1MjIxNycsXG4gICdsb3onOiAnXFx1MjVDQScsXG4gICdscm0nOiAnXFx1MjAwRScsXG4gICdsc2FxdW8nOiAnXFx1MjAzOScsXG4gICdsc3F1byc6ICdcXHUyMDE4JyxcbiAgJ2x0JzogJzwnLFxuICAnbWFjcic6ICdcXHUwMEFGJyxcbiAgJ21kYXNoJzogJ1xcdTIwMTQnLFxuICAnbWljcm8nOiAnXFx1MDBCNScsXG4gICdtaWRkb3QnOiAnXFx1MDBCNycsXG4gICdtaW51cyc6ICdcXHUyMjEyJyxcbiAgJ011JzogJ1xcdTAzOUMnLFxuICAnbXUnOiAnXFx1MDNCQycsXG4gICduYWJsYSc6ICdcXHUyMjA3JyxcbiAgJ25ic3AnOiAnXFx1MDBBMCcsXG4gICduZGFzaCc6ICdcXHUyMDEzJyxcbiAgJ25lJzogJ1xcdTIyNjAnLFxuICAnbmknOiAnXFx1MjIwQicsXG4gICdub3QnOiAnXFx1MDBBQycsXG4gICdub3Rpbic6ICdcXHUyMjA5JyxcbiAgJ25zdWInOiAnXFx1MjI4NCcsXG4gICdOdGlsZGUnOiAnXFx1MDBEMScsXG4gICdudGlsZGUnOiAnXFx1MDBGMScsXG4gICdOdSc6ICdcXHUwMzlEJyxcbiAgJ251JzogJ1xcdTAzQkQnLFxuICAnT2FjdXRlJzogJ1xcdTAwRDMnLFxuICAnb2FjdXRlJzogJ1xcdTAwRjMnLFxuICAnT2NpcmMnOiAnXFx1MDBENCcsXG4gICdvY2lyYyc6ICdcXHUwMEY0JyxcbiAgJ09FbGlnJzogJ1xcdTAxNTInLFxuICAnb2VsaWcnOiAnXFx1MDE1MycsXG4gICdPZ3JhdmUnOiAnXFx1MDBEMicsXG4gICdvZ3JhdmUnOiAnXFx1MDBGMicsXG4gICdvbGluZSc6ICdcXHUyMDNFJyxcbiAgJ09tZWdhJzogJ1xcdTAzQTknLFxuICAnb21lZ2EnOiAnXFx1MDNDOScsXG4gICdPbWljcm9uJzogJ1xcdTAzOUYnLFxuICAnb21pY3Jvbic6ICdcXHUwM0JGJyxcbiAgJ29wbHVzJzogJ1xcdTIyOTUnLFxuICAnb3InOiAnXFx1MjIyOCcsXG4gICdvcmRmJzogJ1xcdTAwQUEnLFxuICAnb3JkbSc6ICdcXHUwMEJBJyxcbiAgJ09zbGFzaCc6ICdcXHUwMEQ4JyxcbiAgJ29zbGFzaCc6ICdcXHUwMEY4JyxcbiAgJ090aWxkZSc6ICdcXHUwMEQ1JyxcbiAgJ290aWxkZSc6ICdcXHUwMEY1JyxcbiAgJ290aW1lcyc6ICdcXHUyMjk3JyxcbiAgJ091bWwnOiAnXFx1MDBENicsXG4gICdvdW1sJzogJ1xcdTAwRjYnLFxuICAncGFyYSc6ICdcXHUwMEI2JyxcbiAgJ3Blcm1pbCc6ICdcXHUyMDMwJyxcbiAgJ3BlcnAnOiAnXFx1MjJBNScsXG4gICdQaGknOiAnXFx1MDNBNicsXG4gICdwaGknOiAnXFx1MDNDNicsXG4gICdQaSc6ICdcXHUwM0EwJyxcbiAgJ3BpJzogJ1xcdTAzQzAnLFxuICAncGl2JzogJ1xcdTAzRDYnLFxuICAncGx1c21uJzogJ1xcdTAwQjEnLFxuICAncG91bmQnOiAnXFx1MDBBMycsXG4gICdwcmltZSc6ICdcXHUyMDMyJyxcbiAgJ1ByaW1lJzogJ1xcdTIwMzMnLFxuICAncHJvZCc6ICdcXHUyMjBGJyxcbiAgJ3Byb3AnOiAnXFx1MjIxRCcsXG4gICdQc2knOiAnXFx1MDNBOCcsXG4gICdwc2knOiAnXFx1MDNDOCcsXG4gICdxdW90JzogJ1xcdTAwMjInLFxuICAncmFkaWMnOiAnXFx1MjIxQScsXG4gICdyYW5nJzogJ1xcdTI3RTknLFxuICAncmFxdW8nOiAnXFx1MDBCQicsXG4gICdyYXJyJzogJ1xcdTIxOTInLFxuICAnckFycic6ICdcXHUyMUQyJyxcbiAgJ3JjZWlsJzogJ1xcdTIzMDknLFxuICAncmRxdW8nOiAnXFx1MjAxRCcsXG4gICdyZWFsJzogJ1xcdTIxMUMnLFxuICAncmVnJzogJ1xcdTAwQUUnLFxuICAncmZsb29yJzogJ1xcdTIzMEInLFxuICAnUmhvJzogJ1xcdTAzQTEnLFxuICAncmhvJzogJ1xcdTAzQzEnLFxuICAncmxtJzogJ1xcdTIwMEYnLFxuICAncnNhcXVvJzogJ1xcdTIwM0EnLFxuICAncnNxdW8nOiAnXFx1MjAxOScsXG4gICdzYnF1byc6ICdcXHUyMDFBJyxcbiAgJ1NjYXJvbic6ICdcXHUwMTYwJyxcbiAgJ3NjYXJvbic6ICdcXHUwMTYxJyxcbiAgJ3Nkb3QnOiAnXFx1MjJDNScsXG4gICdzZWN0JzogJ1xcdTAwQTcnLFxuICAnc2h5JzogJ1xcdTAwQUQnLFxuICAnU2lnbWEnOiAnXFx1MDNBMycsXG4gICdzaWdtYSc6ICdcXHUwM0MzJyxcbiAgJ3NpZ21hZic6ICdcXHUwM0MyJyxcbiAgJ3NpbSc6ICdcXHUyMjNDJyxcbiAgJ3NwYWRlcyc6ICdcXHUyNjYwJyxcbiAgJ3N1Yic6ICdcXHUyMjgyJyxcbiAgJ3N1YmUnOiAnXFx1MjI4NicsXG4gICdzdW0nOiAnXFx1MjIxMScsXG4gICdzdXAnOiAnXFx1MjI4MycsXG4gICdzdXAxJzogJ1xcdTAwQjknLFxuICAnc3VwMic6ICdcXHUwMEIyJyxcbiAgJ3N1cDMnOiAnXFx1MDBCMycsXG4gICdzdXBlJzogJ1xcdTIyODcnLFxuICAnc3psaWcnOiAnXFx1MDBERicsXG4gICdUYXUnOiAnXFx1MDNBNCcsXG4gICd0YXUnOiAnXFx1MDNDNCcsXG4gICd0aGVyZTQnOiAnXFx1MjIzNCcsXG4gICdUaGV0YSc6ICdcXHUwMzk4JyxcbiAgJ3RoZXRhJzogJ1xcdTAzQjgnLFxuICAndGhldGFzeW0nOiAnXFx1MDNEMScsXG4gICd0aGluc3AnOiAnXFx1MjAwOScsXG4gICdUSE9STic6ICdcXHUwMERFJyxcbiAgJ3Rob3JuJzogJ1xcdTAwRkUnLFxuICAndGlsZGUnOiAnXFx1MDJEQycsXG4gICd0aW1lcyc6ICdcXHUwMEQ3JyxcbiAgJ3RyYWRlJzogJ1xcdTIxMjInLFxuICAnVWFjdXRlJzogJ1xcdTAwREEnLFxuICAndWFjdXRlJzogJ1xcdTAwRkEnLFxuICAndWFycic6ICdcXHUyMTkxJyxcbiAgJ3VBcnInOiAnXFx1MjFEMScsXG4gICdVY2lyYyc6ICdcXHUwMERCJyxcbiAgJ3VjaXJjJzogJ1xcdTAwRkInLFxuICAnVWdyYXZlJzogJ1xcdTAwRDknLFxuICAndWdyYXZlJzogJ1xcdTAwRjknLFxuICAndW1sJzogJ1xcdTAwQTgnLFxuICAndXBzaWgnOiAnXFx1MDNEMicsXG4gICdVcHNpbG9uJzogJ1xcdTAzQTUnLFxuICAndXBzaWxvbic6ICdcXHUwM0M1JyxcbiAgJ1V1bWwnOiAnXFx1MDBEQycsXG4gICd1dW1sJzogJ1xcdTAwRkMnLFxuICAnd2VpZXJwJzogJ1xcdTIxMTgnLFxuICAnWGknOiAnXFx1MDM5RScsXG4gICd4aSc6ICdcXHUwM0JFJyxcbiAgJ1lhY3V0ZSc6ICdcXHUwMEREJyxcbiAgJ3lhY3V0ZSc6ICdcXHUwMEZEJyxcbiAgJ3llbic6ICdcXHUwMEE1JyxcbiAgJ3l1bWwnOiAnXFx1MDBGRicsXG4gICdZdW1sJzogJ1xcdTAxNzgnLFxuICAnWmV0YSc6ICdcXHUwMzk2JyxcbiAgJ3pldGEnOiAnXFx1MDNCNicsXG4gICd6d2onOiAnXFx1MjAwRCcsXG4gICd6d25qJzogJ1xcdTIwMEMnLFxufSk7XG5cbmV4cG9ydCBlbnVtIEh0bWxUYWdDb250ZW50VHlwZSB7XG4gIFJBV19URVhULFxuICBFU0NBUEFCTEVfUkFXX1RFWFQsXG4gIFBBUlNBQkxFX0RBVEFcbn1cblxuZXhwb3J0IGNsYXNzIEh0bWxUYWdEZWZpbml0aW9uIHtcbiAgcHJpdmF0ZSBjbG9zZWRCeUNoaWxkcmVuOiB7W2tleTogc3RyaW5nXTogYm9vbGVhbn0gPSB7fTtcbiAgcHVibGljIGNsb3NlZEJ5UGFyZW50OiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyByZXF1aXJlZFBhcmVudHM6IHtba2V5OiBzdHJpbmddOiBib29sZWFufTtcbiAgcHVibGljIHBhcmVudFRvQWRkOiBzdHJpbmc7XG4gIHB1YmxpYyBpbXBsaWNpdE5hbWVzcGFjZVByZWZpeDogc3RyaW5nO1xuICBwdWJsaWMgY29udGVudFR5cGU6IEh0bWxUYWdDb250ZW50VHlwZTtcbiAgcHVibGljIGlzVm9pZDogYm9vbGVhbjtcbiAgcHVibGljIGlnbm9yZUZpcnN0TGY6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3Ioe2Nsb3NlZEJ5Q2hpbGRyZW4sIHJlcXVpcmVkUGFyZW50cywgaW1wbGljaXROYW1lc3BhY2VQcmVmaXgsIGNvbnRlbnRUeXBlLFxuICAgICAgICAgICAgICAgY2xvc2VkQnlQYXJlbnQsIGlzVm9pZCwgaWdub3JlRmlyc3RMZn06IHtcbiAgICBjbG9zZWRCeUNoaWxkcmVuPzogc3RyaW5nW10sXG4gICAgY2xvc2VkQnlQYXJlbnQ/OiBib29sZWFuLFxuICAgIHJlcXVpcmVkUGFyZW50cz86IHN0cmluZ1tdLFxuICAgIGltcGxpY2l0TmFtZXNwYWNlUHJlZml4Pzogc3RyaW5nLFxuICAgIGNvbnRlbnRUeXBlPzogSHRtbFRhZ0NvbnRlbnRUeXBlLFxuICAgIGlzVm9pZD86IGJvb2xlYW4sXG4gICAgaWdub3JlRmlyc3RMZj86IGJvb2xlYW5cbiAgfSA9IHt9KSB7XG4gICAgaWYgKGlzUHJlc2VudChjbG9zZWRCeUNoaWxkcmVuKSAmJiBjbG9zZWRCeUNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgIGNsb3NlZEJ5Q2hpbGRyZW4uZm9yRWFjaCh0YWdOYW1lID0+IHRoaXMuY2xvc2VkQnlDaGlsZHJlblt0YWdOYW1lXSA9IHRydWUpO1xuICAgIH1cbiAgICB0aGlzLmlzVm9pZCA9IG5vcm1hbGl6ZUJvb2woaXNWb2lkKTtcbiAgICB0aGlzLmNsb3NlZEJ5UGFyZW50ID0gbm9ybWFsaXplQm9vbChjbG9zZWRCeVBhcmVudCkgfHwgdGhpcy5pc1ZvaWQ7XG4gICAgaWYgKGlzUHJlc2VudChyZXF1aXJlZFBhcmVudHMpICYmIHJlcXVpcmVkUGFyZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnJlcXVpcmVkUGFyZW50cyA9IHt9O1xuICAgICAgdGhpcy5wYXJlbnRUb0FkZCA9IHJlcXVpcmVkUGFyZW50c1swXTtcbiAgICAgIHJlcXVpcmVkUGFyZW50cy5mb3JFYWNoKHRhZ05hbWUgPT4gdGhpcy5yZXF1aXJlZFBhcmVudHNbdGFnTmFtZV0gPSB0cnVlKTtcbiAgICB9XG4gICAgdGhpcy5pbXBsaWNpdE5hbWVzcGFjZVByZWZpeCA9IGltcGxpY2l0TmFtZXNwYWNlUHJlZml4O1xuICAgIHRoaXMuY29udGVudFR5cGUgPSBpc1ByZXNlbnQoY29udGVudFR5cGUpID8gY29udGVudFR5cGUgOiBIdG1sVGFnQ29udGVudFR5cGUuUEFSU0FCTEVfREFUQTtcbiAgICB0aGlzLmlnbm9yZUZpcnN0TGYgPSBub3JtYWxpemVCb29sKGlnbm9yZUZpcnN0TGYpO1xuICB9XG5cbiAgcmVxdWlyZUV4dHJhUGFyZW50KGN1cnJlbnRQYXJlbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmIChpc0JsYW5rKHRoaXMucmVxdWlyZWRQYXJlbnRzKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChpc0JsYW5rKGN1cnJlbnRQYXJlbnQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBsZXQgbGNQYXJlbnQgPSBjdXJyZW50UGFyZW50LnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIHRoaXMucmVxdWlyZWRQYXJlbnRzW2xjUGFyZW50XSAhPSB0cnVlICYmIGxjUGFyZW50ICE9ICd0ZW1wbGF0ZSc7XG4gIH1cblxuICBpc0Nsb3NlZEJ5Q2hpbGQobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNWb2lkIHx8IG5vcm1hbGl6ZUJvb2wodGhpcy5jbG9zZWRCeUNoaWxkcmVuW25hbWUudG9Mb3dlckNhc2UoKV0pO1xuICB9XG59XG5cbi8vIHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNTEvc3ludGF4Lmh0bWwjb3B0aW9uYWwtdGFnc1xuLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBmdWxseSBjb25mb3JtIHRvIHRoZSBIVE1MNSBzcGVjLlxudmFyIFRBR19ERUZJTklUSU9OUzoge1trZXk6IHN0cmluZ106IEh0bWxUYWdEZWZpbml0aW9ufSA9IHtcbiAgJ2FyZWEnOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oe2lzVm9pZDogdHJ1ZX0pLFxuICAnZW1iZWQnOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oe2lzVm9pZDogdHJ1ZX0pLFxuICAnbGluayc6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7aXNWb2lkOiB0cnVlfSksXG4gICdpbWcnOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oe2lzVm9pZDogdHJ1ZX0pLFxuICAnaW5wdXQnOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oe2lzVm9pZDogdHJ1ZX0pLFxuICAncGFyYW0nOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oe2lzVm9pZDogdHJ1ZX0pLFxuICAnaHInOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oe2lzVm9pZDogdHJ1ZX0pLFxuICAnYnInOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oe2lzVm9pZDogdHJ1ZX0pLFxuICAnc291cmNlJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHtpc1ZvaWQ6IHRydWV9KSxcbiAgJ3RyYWNrJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHtpc1ZvaWQ6IHRydWV9KSxcbiAgJ3dicic6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7aXNWb2lkOiB0cnVlfSksXG4gICdwJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHtcbiAgICBjbG9zZWRCeUNoaWxkcmVuOiBbXG4gICAgICAnYWRkcmVzcycsXG4gICAgICAnYXJ0aWNsZScsXG4gICAgICAnYXNpZGUnLFxuICAgICAgJ2Jsb2NrcXVvdGUnLFxuICAgICAgJ2RpdicsXG4gICAgICAnZGwnLFxuICAgICAgJ2ZpZWxkc2V0JyxcbiAgICAgICdmb290ZXInLFxuICAgICAgJ2Zvcm0nLFxuICAgICAgJ2gxJyxcbiAgICAgICdoMicsXG4gICAgICAnaDMnLFxuICAgICAgJ2g0JyxcbiAgICAgICdoNScsXG4gICAgICAnaDYnLFxuICAgICAgJ2hlYWRlcicsXG4gICAgICAnaGdyb3VwJyxcbiAgICAgICdocicsXG4gICAgICAnbWFpbicsXG4gICAgICAnbmF2JyxcbiAgICAgICdvbCcsXG4gICAgICAncCcsXG4gICAgICAncHJlJyxcbiAgICAgICdzZWN0aW9uJyxcbiAgICAgICd0YWJsZScsXG4gICAgICAndWwnXG4gICAgXSxcbiAgICBjbG9zZWRCeVBhcmVudDogdHJ1ZVxuICB9KSxcbiAgJ3RoZWFkJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHtjbG9zZWRCeUNoaWxkcmVuOiBbJ3Rib2R5JywgJ3Rmb290J119KSxcbiAgJ3Rib2R5JzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHtjbG9zZWRCeUNoaWxkcmVuOiBbJ3Rib2R5JywgJ3Rmb290J10sIGNsb3NlZEJ5UGFyZW50OiB0cnVlfSksXG4gICd0Zm9vdCc6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7Y2xvc2VkQnlDaGlsZHJlbjogWyd0Ym9keSddLCBjbG9zZWRCeVBhcmVudDogdHJ1ZX0pLFxuICAndHInOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oe1xuICAgIGNsb3NlZEJ5Q2hpbGRyZW46IFsndHInXSxcbiAgICByZXF1aXJlZFBhcmVudHM6IFsndGJvZHknLCAndGZvb3QnLCAndGhlYWQnXSxcbiAgICBjbG9zZWRCeVBhcmVudDogdHJ1ZVxuICB9KSxcbiAgJ3RkJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHtjbG9zZWRCeUNoaWxkcmVuOiBbJ3RkJywgJ3RoJ10sIGNsb3NlZEJ5UGFyZW50OiB0cnVlfSksXG4gICd0aCc6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7Y2xvc2VkQnlDaGlsZHJlbjogWyd0ZCcsICd0aCddLCBjbG9zZWRCeVBhcmVudDogdHJ1ZX0pLFxuICAnY29sJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHtyZXF1aXJlZFBhcmVudHM6IFsnY29sZ3JvdXAnXSwgaXNWb2lkOiB0cnVlfSksXG4gICdzdmcnOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oe2ltcGxpY2l0TmFtZXNwYWNlUHJlZml4OiAnc3ZnJ30pLFxuICAnbWF0aCc6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7aW1wbGljaXROYW1lc3BhY2VQcmVmaXg6ICdtYXRoJ30pLFxuICAnbGknOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oe2Nsb3NlZEJ5Q2hpbGRyZW46IFsnbGknXSwgY2xvc2VkQnlQYXJlbnQ6IHRydWV9KSxcbiAgJ2R0JzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHtjbG9zZWRCeUNoaWxkcmVuOiBbJ2R0JywgJ2RkJ119KSxcbiAgJ2RkJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHtjbG9zZWRCeUNoaWxkcmVuOiBbJ2R0JywgJ2RkJ10sIGNsb3NlZEJ5UGFyZW50OiB0cnVlfSksXG4gICdyYic6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7Y2xvc2VkQnlDaGlsZHJlbjogWydyYicsICdydCcsICdydGMnLCAncnAnXSwgY2xvc2VkQnlQYXJlbnQ6IHRydWV9KSxcbiAgJ3J0JzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHtjbG9zZWRCeUNoaWxkcmVuOiBbJ3JiJywgJ3J0JywgJ3J0YycsICdycCddLCBjbG9zZWRCeVBhcmVudDogdHJ1ZX0pLFxuICAncnRjJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHtjbG9zZWRCeUNoaWxkcmVuOiBbJ3JiJywgJ3J0YycsICdycCddLCBjbG9zZWRCeVBhcmVudDogdHJ1ZX0pLFxuICAncnAnOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oe2Nsb3NlZEJ5Q2hpbGRyZW46IFsncmInLCAncnQnLCAncnRjJywgJ3JwJ10sIGNsb3NlZEJ5UGFyZW50OiB0cnVlfSksXG4gICdvcHRncm91cCc6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7Y2xvc2VkQnlDaGlsZHJlbjogWydvcHRncm91cCddLCBjbG9zZWRCeVBhcmVudDogdHJ1ZX0pLFxuICAnb3B0aW9uJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHtjbG9zZWRCeUNoaWxkcmVuOiBbJ29wdGlvbicsICdvcHRncm91cCddLCBjbG9zZWRCeVBhcmVudDogdHJ1ZX0pLFxuICAncHJlJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHtpZ25vcmVGaXJzdExmOiB0cnVlfSksXG4gICdsaXN0aW5nJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHtpZ25vcmVGaXJzdExmOiB0cnVlfSksXG4gICdzdHlsZSc6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7Y29udGVudFR5cGU6IEh0bWxUYWdDb250ZW50VHlwZS5SQVdfVEVYVH0pLFxuICAnc2NyaXB0JzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHtjb250ZW50VHlwZTogSHRtbFRhZ0NvbnRlbnRUeXBlLlJBV19URVhUfSksXG4gICd0aXRsZSc6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7Y29udGVudFR5cGU6IEh0bWxUYWdDb250ZW50VHlwZS5FU0NBUEFCTEVfUkFXX1RFWFR9KSxcbiAgJ3RleHRhcmVhJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKFxuICAgICAge2NvbnRlbnRUeXBlOiBIdG1sVGFnQ29udGVudFR5cGUuRVNDQVBBQkxFX1JBV19URVhULCBpZ25vcmVGaXJzdExmOiB0cnVlfSksXG59O1xuXG52YXIgREVGQVVMVF9UQUdfREVGSU5JVElPTiA9IG5ldyBIdG1sVGFnRGVmaW5pdGlvbigpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SHRtbFRhZ0RlZmluaXRpb24odGFnTmFtZTogc3RyaW5nKTogSHRtbFRhZ0RlZmluaXRpb24ge1xuICB2YXIgcmVzdWx0ID0gVEFHX0RFRklOSVRJT05TW3RhZ05hbWUudG9Mb3dlckNhc2UoKV07XG4gIHJldHVybiBpc1ByZXNlbnQocmVzdWx0KSA/IHJlc3VsdCA6IERFRkFVTFRfVEFHX0RFRklOSVRJT047XG59XG5cbnZhciBOU19QUkVGSVhfUkUgPSAvXkAoW146XSspOiguKykvZztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0TnNOYW1lKGVsZW1lbnROYW1lOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGlmIChlbGVtZW50TmFtZVswXSAhPSAnQCcpIHtcbiAgICByZXR1cm4gW251bGwsIGVsZW1lbnROYW1lXTtcbiAgfVxuICBsZXQgbWF0Y2ggPSBSZWdFeHBXcmFwcGVyLmZpcnN0TWF0Y2goTlNfUFJFRklYX1JFLCBlbGVtZW50TmFtZSk7XG4gIHJldHVybiBbbWF0Y2hbMV0sIG1hdGNoWzJdXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE5zUHJlZml4KGVsZW1lbnROYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc3BsaXROc05hbWUoZWxlbWVudE5hbWUpWzBdO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbXBpbGVyL2h0bWxfdGFncy50c1xuICoqLyIsImV4cG9ydCBjbGFzcyBFbGVtZW50U2NoZW1hUmVnaXN0cnkge1xuICBoYXNQcm9wZXJ0eSh0YWdOYW1lOiBzdHJpbmcsIHByb3BOYW1lOiBzdHJpbmcpOiBib29sZWFuIHsgcmV0dXJuIHRydWU7IH1cbiAgZ2V0TWFwcGVkUHJvcE5hbWUocHJvcE5hbWU6IHN0cmluZyk6IHN0cmluZyB7IHJldHVybiBwcm9wTmFtZTsgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3NjaGVtYS9lbGVtZW50X3NjaGVtYV9yZWdpc3RyeS50c1xuICoqLyIsImltcG9ydCB7SHRtbEVsZW1lbnRBc3R9IGZyb20gJy4vaHRtbF9hc3QnO1xuaW1wb3J0IHtpc0JsYW5rLCBpc1ByZXNlbnR9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge3NwbGl0TnNOYW1lfSBmcm9tICcuL2h0bWxfdGFncyc7XG5cbmNvbnN0IE5HX0NPTlRFTlRfU0VMRUNUX0FUVFIgPSAnc2VsZWN0JztcbmNvbnN0IE5HX0NPTlRFTlRfRUxFTUVOVCA9ICduZy1jb250ZW50JztcbmNvbnN0IExJTktfRUxFTUVOVCA9ICdsaW5rJztcbmNvbnN0IExJTktfU1RZTEVfUkVMX0FUVFIgPSAncmVsJztcbmNvbnN0IExJTktfU1RZTEVfSFJFRl9BVFRSID0gJ2hyZWYnO1xuY29uc3QgTElOS19TVFlMRV9SRUxfVkFMVUUgPSAnc3R5bGVzaGVldCc7XG5jb25zdCBTVFlMRV9FTEVNRU5UID0gJ3N0eWxlJztcbmNvbnN0IFNDUklQVF9FTEVNRU5UID0gJ3NjcmlwdCc7XG5jb25zdCBOR19OT05fQklOREFCTEVfQVRUUiA9ICduZ05vbkJpbmRhYmxlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcnNlRWxlbWVudChhc3Q6IEh0bWxFbGVtZW50QXN0KTogUHJlcGFyc2VkRWxlbWVudCB7XG4gIHZhciBzZWxlY3RBdHRyID0gbnVsbDtcbiAgdmFyIGhyZWZBdHRyID0gbnVsbDtcbiAgdmFyIHJlbEF0dHIgPSBudWxsO1xuICB2YXIgbm9uQmluZGFibGUgPSBmYWxzZTtcbiAgYXN0LmF0dHJzLmZvckVhY2goYXR0ciA9PiB7XG4gICAgbGV0IGxjQXR0ck5hbWUgPSBhdHRyLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAobGNBdHRyTmFtZSA9PSBOR19DT05URU5UX1NFTEVDVF9BVFRSKSB7XG4gICAgICBzZWxlY3RBdHRyID0gYXR0ci52YWx1ZTtcbiAgICB9IGVsc2UgaWYgKGxjQXR0ck5hbWUgPT0gTElOS19TVFlMRV9IUkVGX0FUVFIpIHtcbiAgICAgIGhyZWZBdHRyID0gYXR0ci52YWx1ZTtcbiAgICB9IGVsc2UgaWYgKGxjQXR0ck5hbWUgPT0gTElOS19TVFlMRV9SRUxfQVRUUikge1xuICAgICAgcmVsQXR0ciA9IGF0dHIudmFsdWU7XG4gICAgfSBlbHNlIGlmIChhdHRyLm5hbWUgPT0gTkdfTk9OX0JJTkRBQkxFX0FUVFIpIHtcbiAgICAgIG5vbkJpbmRhYmxlID0gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuICBzZWxlY3RBdHRyID0gbm9ybWFsaXplTmdDb250ZW50U2VsZWN0KHNlbGVjdEF0dHIpO1xuICB2YXIgbm9kZU5hbWUgPSBhc3QubmFtZS50b0xvd2VyQ2FzZSgpO1xuICB2YXIgdHlwZSA9IFByZXBhcnNlZEVsZW1lbnRUeXBlLk9USEVSO1xuICBpZiAoc3BsaXROc05hbWUobm9kZU5hbWUpWzFdID09IE5HX0NPTlRFTlRfRUxFTUVOVCkge1xuICAgIHR5cGUgPSBQcmVwYXJzZWRFbGVtZW50VHlwZS5OR19DT05URU5UO1xuICB9IGVsc2UgaWYgKG5vZGVOYW1lID09IFNUWUxFX0VMRU1FTlQpIHtcbiAgICB0eXBlID0gUHJlcGFyc2VkRWxlbWVudFR5cGUuU1RZTEU7XG4gIH0gZWxzZSBpZiAobm9kZU5hbWUgPT0gU0NSSVBUX0VMRU1FTlQpIHtcbiAgICB0eXBlID0gUHJlcGFyc2VkRWxlbWVudFR5cGUuU0NSSVBUO1xuICB9IGVsc2UgaWYgKG5vZGVOYW1lID09IExJTktfRUxFTUVOVCAmJiByZWxBdHRyID09IExJTktfU1RZTEVfUkVMX1ZBTFVFKSB7XG4gICAgdHlwZSA9IFByZXBhcnNlZEVsZW1lbnRUeXBlLlNUWUxFU0hFRVQ7XG4gIH1cbiAgcmV0dXJuIG5ldyBQcmVwYXJzZWRFbGVtZW50KHR5cGUsIHNlbGVjdEF0dHIsIGhyZWZBdHRyLCBub25CaW5kYWJsZSk7XG59XG5cbmV4cG9ydCBlbnVtIFByZXBhcnNlZEVsZW1lbnRUeXBlIHtcbiAgTkdfQ09OVEVOVCxcbiAgU1RZTEUsXG4gIFNUWUxFU0hFRVQsXG4gIFNDUklQVCxcbiAgT1RIRVJcbn1cblxuZXhwb3J0IGNsYXNzIFByZXBhcnNlZEVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdHlwZTogUHJlcGFyc2VkRWxlbWVudFR5cGUsIHB1YmxpYyBzZWxlY3RBdHRyOiBzdHJpbmcsIHB1YmxpYyBocmVmQXR0cjogc3RyaW5nLFxuICAgICAgICAgICAgICBwdWJsaWMgbm9uQmluZGFibGU6IGJvb2xlYW4pIHt9XG59XG5cblxuZnVuY3Rpb24gbm9ybWFsaXplTmdDb250ZW50U2VsZWN0KHNlbGVjdEF0dHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChpc0JsYW5rKHNlbGVjdEF0dHIpIHx8IHNlbGVjdEF0dHIubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICcqJztcbiAgfVxuICByZXR1cm4gc2VsZWN0QXR0cjtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21waWxlci90ZW1wbGF0ZV9wcmVwYXJzZXIudHNcbiAqKi8iLCJpbXBvcnQge1xuICBDb21waWxlVHlwZU1ldGFkYXRhLFxuICBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGEsXG4gIENvbXBpbGVUZW1wbGF0ZU1ldGFkYXRhXG59IGZyb20gJy4vZGlyZWN0aXZlX21ldGFkYXRhJztcbmltcG9ydCB7aXNQcmVzZW50LCBpc0JsYW5rfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtQcm9taXNlLCBQcm9taXNlV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9hc3luYyc7XG5cbmltcG9ydCB7WEhSfSBmcm9tICdhbmd1bGFyMi9zcmMvY29tcGlsZXIveGhyJztcbmltcG9ydCB7VXJsUmVzb2x2ZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb21waWxlci91cmxfcmVzb2x2ZXInO1xuaW1wb3J0IHtleHRyYWN0U3R5bGVVcmxzLCBpc1N0eWxlVXJsUmVzb2x2YWJsZX0gZnJvbSAnLi9zdHlsZV91cmxfcmVzb2x2ZXInO1xuaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5pbXBvcnQge1ZpZXdFbmNhcHN1bGF0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9tZXRhZGF0YS92aWV3JztcblxuXG5pbXBvcnQge1xuICBIdG1sQXN0VmlzaXRvcixcbiAgSHRtbEVsZW1lbnRBc3QsXG4gIEh0bWxUZXh0QXN0LFxuICBIdG1sQXR0ckFzdCxcbiAgSHRtbEFzdCxcbiAgaHRtbFZpc2l0QWxsXG59IGZyb20gJy4vaHRtbF9hc3QnO1xuaW1wb3J0IHtIdG1sUGFyc2VyfSBmcm9tICcuL2h0bWxfcGFyc2VyJztcblxuaW1wb3J0IHtwcmVwYXJzZUVsZW1lbnQsIFByZXBhcnNlZEVsZW1lbnQsIFByZXBhcnNlZEVsZW1lbnRUeXBlfSBmcm9tICcuL3RlbXBsYXRlX3ByZXBhcnNlcic7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZU5vcm1hbGl6ZXIge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF94aHI6IFhIUiwgcHJpdmF0ZSBfdXJsUmVzb2x2ZXI6IFVybFJlc29sdmVyLFxuICAgICAgICAgICAgICBwcml2YXRlIF9odG1sUGFyc2VyOiBIdG1sUGFyc2VyKSB7fVxuXG4gIG5vcm1hbGl6ZVRlbXBsYXRlKGRpcmVjdGl2ZVR5cGU6IENvbXBpbGVUeXBlTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBDb21waWxlVGVtcGxhdGVNZXRhZGF0YSk6IFByb21pc2U8Q29tcGlsZVRlbXBsYXRlTWV0YWRhdGE+IHtcbiAgICBpZiAoaXNQcmVzZW50KHRlbXBsYXRlLnRlbXBsYXRlKSkge1xuICAgICAgcmV0dXJuIFByb21pc2VXcmFwcGVyLnJlc29sdmUodGhpcy5ub3JtYWxpemVMb2FkZWRUZW1wbGF0ZShcbiAgICAgICAgICBkaXJlY3RpdmVUeXBlLCB0ZW1wbGF0ZSwgdGVtcGxhdGUudGVtcGxhdGUsIGRpcmVjdGl2ZVR5cGUubW9kdWxlVXJsKSk7XG4gICAgfSBlbHNlIGlmIChpc1ByZXNlbnQodGVtcGxhdGUudGVtcGxhdGVVcmwpKSB7XG4gICAgICB2YXIgc291cmNlQWJzVXJsID0gdGhpcy5fdXJsUmVzb2x2ZXIucmVzb2x2ZShkaXJlY3RpdmVUeXBlLm1vZHVsZVVybCwgdGVtcGxhdGUudGVtcGxhdGVVcmwpO1xuICAgICAgcmV0dXJuIHRoaXMuX3hoci5nZXQoc291cmNlQWJzVXJsKVxuICAgICAgICAgIC50aGVuKHRlbXBsYXRlQ29udGVudCA9PiB0aGlzLm5vcm1hbGl6ZUxvYWRlZFRlbXBsYXRlKGRpcmVjdGl2ZVR5cGUsIHRlbXBsYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlQ29udGVudCwgc291cmNlQWJzVXJsKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBObyB0ZW1wbGF0ZSBzcGVjaWZpZWQgZm9yIGNvbXBvbmVudCAke2RpcmVjdGl2ZVR5cGUubmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICBub3JtYWxpemVMb2FkZWRUZW1wbGF0ZShkaXJlY3RpdmVUeXBlOiBDb21waWxlVHlwZU1ldGFkYXRhLCB0ZW1wbGF0ZU1ldGE6IENvbXBpbGVUZW1wbGF0ZU1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogc3RyaW5nLCB0ZW1wbGF0ZUFic1VybDogc3RyaW5nKTogQ29tcGlsZVRlbXBsYXRlTWV0YWRhdGEge1xuICAgIHZhciByb290Tm9kZXNBbmRFcnJvcnMgPSB0aGlzLl9odG1sUGFyc2VyLnBhcnNlKHRlbXBsYXRlLCBkaXJlY3RpdmVUeXBlLm5hbWUpO1xuICAgIGlmIChyb290Tm9kZXNBbmRFcnJvcnMuZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBlcnJvclN0cmluZyA9IHJvb3ROb2Rlc0FuZEVycm9ycy5lcnJvcnMuam9pbignXFxuJyk7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgVGVtcGxhdGUgcGFyc2UgZXJyb3JzOlxcbiR7ZXJyb3JTdHJpbmd9YCk7XG4gICAgfVxuXG4gICAgdmFyIHZpc2l0b3IgPSBuZXcgVGVtcGxhdGVQcmVwYXJzZVZpc2l0b3IoKTtcbiAgICBodG1sVmlzaXRBbGwodmlzaXRvciwgcm9vdE5vZGVzQW5kRXJyb3JzLnJvb3ROb2Rlcyk7XG4gICAgdmFyIGFsbFN0eWxlcyA9IHRlbXBsYXRlTWV0YS5zdHlsZXMuY29uY2F0KHZpc2l0b3Iuc3R5bGVzKTtcblxuICAgIHZhciBhbGxTdHlsZUFic1VybHMgPVxuICAgICAgICB2aXNpdG9yLnN0eWxlVXJscy5maWx0ZXIoaXNTdHlsZVVybFJlc29sdmFibGUpXG4gICAgICAgICAgICAubWFwKHVybCA9PiB0aGlzLl91cmxSZXNvbHZlci5yZXNvbHZlKHRlbXBsYXRlQWJzVXJsLCB1cmwpKVxuICAgICAgICAgICAgLmNvbmNhdCh0ZW1wbGF0ZU1ldGEuc3R5bGVVcmxzLmZpbHRlcihpc1N0eWxlVXJsUmVzb2x2YWJsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAodXJsID0+IHRoaXMuX3VybFJlc29sdmVyLnJlc29sdmUoZGlyZWN0aXZlVHlwZS5tb2R1bGVVcmwsIHVybCkpKTtcblxuICAgIHZhciBhbGxSZXNvbHZlZFN0eWxlcyA9IGFsbFN0eWxlcy5tYXAoc3R5bGUgPT4ge1xuICAgICAgdmFyIHN0eWxlV2l0aEltcG9ydHMgPSBleHRyYWN0U3R5bGVVcmxzKHRoaXMuX3VybFJlc29sdmVyLCB0ZW1wbGF0ZUFic1VybCwgc3R5bGUpO1xuICAgICAgc3R5bGVXaXRoSW1wb3J0cy5zdHlsZVVybHMuZm9yRWFjaChzdHlsZVVybCA9PiBhbGxTdHlsZUFic1VybHMucHVzaChzdHlsZVVybCkpO1xuICAgICAgcmV0dXJuIHN0eWxlV2l0aEltcG9ydHMuc3R5bGU7XG4gICAgfSk7XG5cbiAgICB2YXIgZW5jYXBzdWxhdGlvbiA9IHRlbXBsYXRlTWV0YS5lbmNhcHN1bGF0aW9uO1xuICAgIGlmIChlbmNhcHN1bGF0aW9uID09PSBWaWV3RW5jYXBzdWxhdGlvbi5FbXVsYXRlZCAmJiBhbGxSZXNvbHZlZFN0eWxlcy5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgYWxsU3R5bGVBYnNVcmxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZW5jYXBzdWxhdGlvbiA9IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmU7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQ29tcGlsZVRlbXBsYXRlTWV0YWRhdGEoe1xuICAgICAgZW5jYXBzdWxhdGlvbjogZW5jYXBzdWxhdGlvbixcbiAgICAgIHRlbXBsYXRlOiB0ZW1wbGF0ZSxcbiAgICAgIHRlbXBsYXRlVXJsOiB0ZW1wbGF0ZUFic1VybCxcbiAgICAgIHN0eWxlczogYWxsUmVzb2x2ZWRTdHlsZXMsXG4gICAgICBzdHlsZVVybHM6IGFsbFN0eWxlQWJzVXJscyxcbiAgICAgIG5nQ29udGVudFNlbGVjdG9yczogdmlzaXRvci5uZ0NvbnRlbnRTZWxlY3RvcnNcbiAgICB9KTtcbiAgfVxufVxuXG5jbGFzcyBUZW1wbGF0ZVByZXBhcnNlVmlzaXRvciBpbXBsZW1lbnRzIEh0bWxBc3RWaXNpdG9yIHtcbiAgbmdDb250ZW50U2VsZWN0b3JzOiBzdHJpbmdbXSA9IFtdO1xuICBzdHlsZXM6IHN0cmluZ1tdID0gW107XG4gIHN0eWxlVXJsczogc3RyaW5nW10gPSBbXTtcbiAgbmdOb25CaW5kYWJsZVN0YWNrQ291bnQ6IG51bWJlciA9IDA7XG5cbiAgdmlzaXRFbGVtZW50KGFzdDogSHRtbEVsZW1lbnRBc3QsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgdmFyIHByZXBhcnNlZEVsZW1lbnQgPSBwcmVwYXJzZUVsZW1lbnQoYXN0KTtcbiAgICBzd2l0Y2ggKHByZXBhcnNlZEVsZW1lbnQudHlwZSkge1xuICAgICAgY2FzZSBQcmVwYXJzZWRFbGVtZW50VHlwZS5OR19DT05URU5UOlxuICAgICAgICBpZiAodGhpcy5uZ05vbkJpbmRhYmxlU3RhY2tDb3VudCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMubmdDb250ZW50U2VsZWN0b3JzLnB1c2gocHJlcGFyc2VkRWxlbWVudC5zZWxlY3RBdHRyKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJlcGFyc2VkRWxlbWVudFR5cGUuU1RZTEU6XG4gICAgICAgIHZhciB0ZXh0Q29udGVudCA9ICcnO1xuICAgICAgICBhc3QuY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgSHRtbFRleHRBc3QpIHtcbiAgICAgICAgICAgIHRleHRDb250ZW50ICs9ICg8SHRtbFRleHRBc3Q+Y2hpbGQpLnZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc3R5bGVzLnB1c2godGV4dENvbnRlbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJlcGFyc2VkRWxlbWVudFR5cGUuU1RZTEVTSEVFVDpcbiAgICAgICAgdGhpcy5zdHlsZVVybHMucHVzaChwcmVwYXJzZWRFbGVtZW50LmhyZWZBdHRyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmIChwcmVwYXJzZWRFbGVtZW50Lm5vbkJpbmRhYmxlKSB7XG4gICAgICB0aGlzLm5nTm9uQmluZGFibGVTdGFja0NvdW50Kys7XG4gICAgfVxuICAgIGh0bWxWaXNpdEFsbCh0aGlzLCBhc3QuY2hpbGRyZW4pO1xuICAgIGlmIChwcmVwYXJzZWRFbGVtZW50Lm5vbkJpbmRhYmxlKSB7XG4gICAgICB0aGlzLm5nTm9uQmluZGFibGVTdGFja0NvdW50LS07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZpc2l0QXR0cihhc3Q6IEh0bWxBdHRyQXN0LCBjb250ZXh0OiBhbnkpOiBhbnkgeyByZXR1cm4gbnVsbDsgfVxuICB2aXNpdFRleHQoYXN0OiBIdG1sVGV4dEFzdCwgY29udGV4dDogYW55KTogYW55IHsgcmV0dXJuIG51bGw7IH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21waWxlci90ZW1wbGF0ZV9ub3JtYWxpemVyLnRzXG4gKiovIiwiaW1wb3J0IHtyZXNvbHZlRm9yd2FyZFJlZn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvZGknO1xuaW1wb3J0IHtcbiAgVHlwZSxcbiAgaXNCbGFuayxcbiAgaXNQcmVzZW50LFxuICBpc0FycmF5LFxuICBzdHJpbmdpZnksXG4gIFJlZ0V4cFdyYXBwZXJcbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCAqIGFzIGNwbCBmcm9tICcuL2RpcmVjdGl2ZV9tZXRhZGF0YSc7XG5pbXBvcnQgKiBhcyBtZCBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9tZXRhZGF0YS9kaXJlY3RpdmVzJztcbmltcG9ydCB7RGlyZWN0aXZlUmVzb2x2ZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9kaXJlY3RpdmVfcmVzb2x2ZXInO1xuaW1wb3J0IHtWaWV3UmVzb2x2ZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci92aWV3X3Jlc29sdmVyJztcbmltcG9ydCB7Vmlld01ldGFkYXRhfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9tZXRhZGF0YS92aWV3JztcbmltcG9ydCB7aGFzTGlmZWN5Y2xlSG9va30gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL2RpcmVjdGl2ZV9saWZlY3ljbGVfcmVmbGVjdG9yJztcbmltcG9ydCB7TGlmZWN5Y2xlSG9va3MsIExJRkVDWUNMRV9IT09LU19WQUxVRVN9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9pbnRlcmZhY2VzJztcbmltcG9ydCB7cmVmbGVjdG9yfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9yZWZsZWN0aW9uL3JlZmxlY3Rpb24nO1xuaW1wb3J0IHtJbmplY3RhYmxlLCBJbmplY3QsIE9wdGlvbmFsfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5pbXBvcnQge1BMQVRGT1JNX0RJUkVDVElWRVN9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL3BsYXRmb3JtX2RpcmVjdGl2ZXNfYW5kX3BpcGVzJztcbmltcG9ydCB7TU9EVUxFX1NVRkZJWH0gZnJvbSAnLi91dGlsJztcbmltcG9ydCB7Z2V0VXJsU2NoZW1lfSBmcm9tICdhbmd1bGFyMi9zcmMvY29tcGlsZXIvdXJsX3Jlc29sdmVyJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJ1bnRpbWVNZXRhZGF0YVJlc29sdmVyIHtcbiAgcHJpdmF0ZSBfY2FjaGUgPSBuZXcgTWFwPFR5cGUsIGNwbC5Db21waWxlRGlyZWN0aXZlTWV0YWRhdGE+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZGlyZWN0aXZlUmVzb2x2ZXI6IERpcmVjdGl2ZVJlc29sdmVyLCBwcml2YXRlIF92aWV3UmVzb2x2ZXI6IFZpZXdSZXNvbHZlcixcbiAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChQTEFURk9STV9ESVJFQ1RJVkVTKSBwcml2YXRlIF9wbGF0Zm9ybURpcmVjdGl2ZXM6IFR5cGVbXSkge31cblxuICBnZXRNZXRhZGF0YShkaXJlY3RpdmVUeXBlOiBUeXBlKTogY3BsLkNvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YSB7XG4gICAgdmFyIG1ldGEgPSB0aGlzLl9jYWNoZS5nZXQoZGlyZWN0aXZlVHlwZSk7XG4gICAgaWYgKGlzQmxhbmsobWV0YSkpIHtcbiAgICAgIHZhciBkaXJNZXRhID0gdGhpcy5fZGlyZWN0aXZlUmVzb2x2ZXIucmVzb2x2ZShkaXJlY3RpdmVUeXBlKTtcbiAgICAgIHZhciBtb2R1bGVVcmwgPSBudWxsO1xuICAgICAgdmFyIHRlbXBsYXRlTWV0YSA9IG51bGw7XG4gICAgICB2YXIgY2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kgPSBudWxsO1xuXG4gICAgICBpZiAoZGlyTWV0YSBpbnN0YW5jZW9mIG1kLkNvbXBvbmVudE1ldGFkYXRhKSB7XG4gICAgICAgIHZhciBjbXBNZXRhID0gPG1kLkNvbXBvbmVudE1ldGFkYXRhPmRpck1ldGE7XG4gICAgICAgIG1vZHVsZVVybCA9IGNhbGNNb2R1bGVVcmwoZGlyZWN0aXZlVHlwZSwgY21wTWV0YSk7XG4gICAgICAgIHZhciB2aWV3TWV0YSA9IHRoaXMuX3ZpZXdSZXNvbHZlci5yZXNvbHZlKGRpcmVjdGl2ZVR5cGUpO1xuICAgICAgICB0ZW1wbGF0ZU1ldGEgPSBuZXcgY3BsLkNvbXBpbGVUZW1wbGF0ZU1ldGFkYXRhKHtcbiAgICAgICAgICBlbmNhcHN1bGF0aW9uOiB2aWV3TWV0YS5lbmNhcHN1bGF0aW9uLFxuICAgICAgICAgIHRlbXBsYXRlOiB2aWV3TWV0YS50ZW1wbGF0ZSxcbiAgICAgICAgICB0ZW1wbGF0ZVVybDogdmlld01ldGEudGVtcGxhdGVVcmwsXG4gICAgICAgICAgc3R5bGVzOiB2aWV3TWV0YS5zdHlsZXMsXG4gICAgICAgICAgc3R5bGVVcmxzOiB2aWV3TWV0YS5zdHlsZVVybHNcbiAgICAgICAgfSk7XG4gICAgICAgIGNoYW5nZURldGVjdGlvblN0cmF0ZWd5ID0gY21wTWV0YS5jaGFuZ2VEZXRlY3Rpb247XG4gICAgICB9XG4gICAgICBtZXRhID0gY3BsLkNvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YS5jcmVhdGUoe1xuICAgICAgICBzZWxlY3RvcjogZGlyTWV0YS5zZWxlY3RvcixcbiAgICAgICAgZXhwb3J0QXM6IGRpck1ldGEuZXhwb3J0QXMsXG4gICAgICAgIGlzQ29tcG9uZW50OiBpc1ByZXNlbnQodGVtcGxhdGVNZXRhKSxcbiAgICAgICAgZHluYW1pY0xvYWRhYmxlOiB0cnVlLFxuICAgICAgICB0eXBlOiBuZXcgY3BsLkNvbXBpbGVUeXBlTWV0YWRhdGEoXG4gICAgICAgICAgICB7bmFtZTogc3RyaW5naWZ5KGRpcmVjdGl2ZVR5cGUpLCBtb2R1bGVVcmw6IG1vZHVsZVVybCwgcnVudGltZTogZGlyZWN0aXZlVHlwZX0pLFxuICAgICAgICB0ZW1wbGF0ZTogdGVtcGxhdGVNZXRhLFxuICAgICAgICBjaGFuZ2VEZXRlY3Rpb246IGNoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgICAgICBpbnB1dHM6IGRpck1ldGEuaW5wdXRzLFxuICAgICAgICBvdXRwdXRzOiBkaXJNZXRhLm91dHB1dHMsXG4gICAgICAgIGhvc3Q6IGRpck1ldGEuaG9zdCxcbiAgICAgICAgbGlmZWN5Y2xlSG9va3M6IExJRkVDWUNMRV9IT09LU19WQUxVRVMuZmlsdGVyKGhvb2sgPT4gaGFzTGlmZWN5Y2xlSG9vayhob29rLCBkaXJlY3RpdmVUeXBlKSlcbiAgICAgIH0pO1xuICAgICAgdGhpcy5fY2FjaGUuc2V0KGRpcmVjdGl2ZVR5cGUsIG1ldGEpO1xuICAgIH1cbiAgICByZXR1cm4gbWV0YTtcbiAgfVxuXG4gIGdldFZpZXdEaXJlY3RpdmVzTWV0YWRhdGEoY29tcG9uZW50OiBUeXBlKTogY3BsLkNvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YVtdIHtcbiAgICB2YXIgdmlldyA9IHRoaXMuX3ZpZXdSZXNvbHZlci5yZXNvbHZlKGNvbXBvbmVudCk7XG4gICAgdmFyIGRpcmVjdGl2ZXMgPSBmbGF0dGVuRGlyZWN0aXZlcyh2aWV3LCB0aGlzLl9wbGF0Zm9ybURpcmVjdGl2ZXMpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGlyZWN0aXZlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFpc1ZhbGlkRGlyZWN0aXZlKGRpcmVjdGl2ZXNbaV0pKSB7XG4gICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKFxuICAgICAgICAgICAgYFVuZXhwZWN0ZWQgZGlyZWN0aXZlIHZhbHVlICcke3N0cmluZ2lmeShkaXJlY3RpdmVzW2ldKX0nIG9uIHRoZSBWaWV3IG9mIGNvbXBvbmVudCAnJHtzdHJpbmdpZnkoY29tcG9uZW50KX0nYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRpcmVjdGl2ZXMubWFwKHR5cGUgPT4gdGhpcy5nZXRNZXRhZGF0YSh0eXBlKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmxhdHRlbkRpcmVjdGl2ZXModmlldzogVmlld01ldGFkYXRhLCBwbGF0Zm9ybURpcmVjdGl2ZXM6IGFueVtdKTogVHlwZVtdIHtcbiAgbGV0IGRpcmVjdGl2ZXMgPSBbXTtcbiAgaWYgKGlzUHJlc2VudChwbGF0Zm9ybURpcmVjdGl2ZXMpKSB7XG4gICAgZmxhdHRlbkFycmF5KHBsYXRmb3JtRGlyZWN0aXZlcywgZGlyZWN0aXZlcyk7XG4gIH1cbiAgaWYgKGlzUHJlc2VudCh2aWV3LmRpcmVjdGl2ZXMpKSB7XG4gICAgZmxhdHRlbkFycmF5KHZpZXcuZGlyZWN0aXZlcywgZGlyZWN0aXZlcyk7XG4gIH1cbiAgcmV0dXJuIGRpcmVjdGl2ZXM7XG59XG5cbmZ1bmN0aW9uIGZsYXR0ZW5BcnJheSh0cmVlOiBhbnlbXSwgb3V0OiBBcnJheTxUeXBlIHwgYW55W10+KTogdm9pZCB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdHJlZS5sZW5ndGg7IGkrKykge1xuICAgIHZhciBpdGVtID0gcmVzb2x2ZUZvcndhcmRSZWYodHJlZVtpXSk7XG4gICAgaWYgKGlzQXJyYXkoaXRlbSkpIHtcbiAgICAgIGZsYXR0ZW5BcnJheShpdGVtLCBvdXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNWYWxpZERpcmVjdGl2ZSh2YWx1ZTogVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNQcmVzZW50KHZhbHVlKSAmJiAodmFsdWUgaW5zdGFuY2VvZiBUeXBlKTtcbn1cblxuZnVuY3Rpb24gY2FsY01vZHVsZVVybCh0eXBlOiBUeXBlLCBjbXBNZXRhZGF0YTogbWQuQ29tcG9uZW50TWV0YWRhdGEpOiBzdHJpbmcge1xuICB2YXIgbW9kdWxlSWQgPSBjbXBNZXRhZGF0YS5tb2R1bGVJZDtcbiAgaWYgKGlzUHJlc2VudChtb2R1bGVJZCkpIHtcbiAgICB2YXIgc2NoZW1lID0gZ2V0VXJsU2NoZW1lKG1vZHVsZUlkKTtcbiAgICByZXR1cm4gaXNQcmVzZW50KHNjaGVtZSkgJiYgc2NoZW1lLmxlbmd0aCA+IDAgPyBtb2R1bGVJZCA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYHBhY2thZ2U6JHttb2R1bGVJZH0ke01PRFVMRV9TVUZGSVh9YDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcmVmbGVjdG9yLmltcG9ydFVyaSh0eXBlKTtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3J1bnRpbWVfbWV0YWRhdGEudHNcbiAqKi8iLCJpbXBvcnQge0luamVjdGFibGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpJztcbmltcG9ydCB7aXNQcmVzZW50LCBpc0JsYW5rLCBDT05TVF9FWFBSfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtTdHJpbmdNYXBXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtET019IGZyb20gJ2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZG9tX2FkYXB0ZXInO1xuaW1wb3J0IHtzcGxpdE5zTmFtZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvbXBpbGVyL2h0bWxfdGFncyc7XG5cbmltcG9ydCB7RWxlbWVudFNjaGVtYVJlZ2lzdHJ5fSBmcm9tICcuL2VsZW1lbnRfc2NoZW1hX3JlZ2lzdHJ5JztcblxuY29uc3QgTkFNRVNQQUNFX1VSSVMgPVxuICAgIENPTlNUX0VYUFIoeyd4bGluayc6ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJywgJ3N2Zyc6ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyd9KTtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERvbUVsZW1lbnRTY2hlbWFSZWdpc3RyeSBleHRlbmRzIEVsZW1lbnRTY2hlbWFSZWdpc3RyeSB7XG4gIHByaXZhdGUgX3Byb3RvRWxlbWVudHMgPSBuZXcgTWFwPHN0cmluZywgRWxlbWVudD4oKTtcblxuICBwcml2YXRlIF9nZXRQcm90b0VsZW1lbnQodGFnTmFtZTogc3RyaW5nKTogRWxlbWVudCB7XG4gICAgdmFyIGVsZW1lbnQgPSB0aGlzLl9wcm90b0VsZW1lbnRzLmdldCh0YWdOYW1lKTtcbiAgICBpZiAoaXNCbGFuayhlbGVtZW50KSkge1xuICAgICAgdmFyIG5zQW5kTmFtZSA9IHNwbGl0TnNOYW1lKHRhZ05hbWUpO1xuICAgICAgZWxlbWVudCA9IGlzUHJlc2VudChuc0FuZE5hbWVbMF0pID9cbiAgICAgICAgICAgICAgICAgICAgRE9NLmNyZWF0ZUVsZW1lbnROUyhOQU1FU1BBQ0VfVVJJU1tuc0FuZE5hbWVbMF1dLCBuc0FuZE5hbWVbMV0pIDpcbiAgICAgICAgICAgICAgICAgICAgRE9NLmNyZWF0ZUVsZW1lbnQobnNBbmROYW1lWzFdKTtcbiAgICAgIHRoaXMuX3Byb3RvRWxlbWVudHMuc2V0KHRhZ05hbWUsIGVsZW1lbnQpO1xuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIGhhc1Byb3BlcnR5KHRhZ05hbWU6IHN0cmluZywgcHJvcE5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0YWdOYW1lLmluZGV4T2YoJy0nKSAhPT0gLTEpIHtcbiAgICAgIC8vIGNhbid0IHRlbGwgbm93IGFzIHdlIGRvbid0IGtub3cgd2hpY2ggcHJvcGVydGllcyBhIGN1c3RvbSBlbGVtZW50IHdpbGwgZ2V0XG4gICAgICAvLyBvbmNlIGl0IGlzIGluc3RhbnRpYXRlZFxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBlbG0gPSB0aGlzLl9nZXRQcm90b0VsZW1lbnQodGFnTmFtZSk7XG4gICAgICByZXR1cm4gRE9NLmhhc1Byb3BlcnR5KGVsbSwgcHJvcE5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIGdldE1hcHBlZFByb3BOYW1lKHByb3BOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHZhciBtYXBwZWRQcm9wTmFtZSA9IFN0cmluZ01hcFdyYXBwZXIuZ2V0KERPTS5hdHRyVG9Qcm9wTWFwLCBwcm9wTmFtZSk7XG4gICAgcmV0dXJuIGlzUHJlc2VudChtYXBwZWRQcm9wTmFtZSkgPyBtYXBwZWRQcm9wTmFtZSA6IHByb3BOYW1lO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tcGlsZXIvc2NoZW1hL2RvbV9lbGVtZW50X3NjaGVtYV9yZWdpc3RyeS50c1xuICoqLyIsImltcG9ydCB7aXNCbGFuaywgVHlwZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxuZXhwb3J0IHZhciBET006IERvbUFkYXB0ZXIgPSBudWxsO1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0Um9vdERvbUFkYXB0ZXIoYWRhcHRlcjogRG9tQWRhcHRlcikge1xuICBpZiAoaXNCbGFuayhET00pKSB7XG4gICAgRE9NID0gYWRhcHRlcjtcbiAgfVxufVxuXG4vKiB0c2xpbnQ6ZGlzYWJsZTpyZXF1aXJlUGFyYW1ldGVyVHlwZSAqL1xuLyoqXG4gKiBQcm92aWRlcyBET00gb3BlcmF0aW9ucyBpbiBhbiBlbnZpcm9ubWVudC1hZ25vc3RpYyB3YXkuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEb21BZGFwdGVyIHtcbiAgYWJzdHJhY3QgaGFzUHJvcGVydHkoZWxlbWVudCwgbmFtZTogc3RyaW5nKTogYm9vbGVhbjtcbiAgYWJzdHJhY3Qgc2V0UHJvcGVydHkoZWw6IEVsZW1lbnQsIG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk7XG4gIGFic3RyYWN0IGdldFByb3BlcnR5KGVsOiBFbGVtZW50LCBuYW1lOiBzdHJpbmcpOiBhbnk7XG4gIGFic3RyYWN0IGludm9rZShlbDogRWxlbWVudCwgbWV0aG9kTmFtZTogc3RyaW5nLCBhcmdzOiBhbnlbXSk6IGFueTtcblxuICBhYnN0cmFjdCBsb2dFcnJvcihlcnJvcik7XG4gIGFic3RyYWN0IGxvZyhlcnJvcik7XG4gIGFic3RyYWN0IGxvZ0dyb3VwKGVycm9yKTtcbiAgYWJzdHJhY3QgbG9nR3JvdXBFbmQoKTtcblxuICBhYnN0cmFjdCBnZXRYSFIoKTogVHlwZTtcblxuICAvKipcbiAgICogTWFwcyBhdHRyaWJ1dGUgbmFtZXMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSBuYW1lcyBmb3IgY2FzZXNcbiAgICogd2hlcmUgYXR0cmlidXRlIG5hbWUgZG9lc24ndCBtYXRjaCBwcm9wZXJ0eSBuYW1lLlxuICAgKi9cbiAgYXR0clRvUHJvcE1hcDoge1trZXk6IHN0cmluZ106IHN0cmluZ307XG5cbiAgYWJzdHJhY3QgcGFyc2UodGVtcGxhdGVIdG1sOiBzdHJpbmcpO1xuICBhYnN0cmFjdCBxdWVyeShzZWxlY3Rvcjogc3RyaW5nKTogYW55O1xuICBhYnN0cmFjdCBxdWVyeVNlbGVjdG9yKGVsLCBzZWxlY3Rvcjogc3RyaW5nKTogSFRNTEVsZW1lbnQ7XG4gIGFic3RyYWN0IHF1ZXJ5U2VsZWN0b3JBbGwoZWwsIHNlbGVjdG9yOiBzdHJpbmcpOiBhbnlbXTtcbiAgYWJzdHJhY3Qgb24oZWwsIGV2dCwgbGlzdGVuZXIpO1xuICBhYnN0cmFjdCBvbkFuZENhbmNlbChlbCwgZXZ0LCBsaXN0ZW5lcik6IEZ1bmN0aW9uO1xuICBhYnN0cmFjdCBkaXNwYXRjaEV2ZW50KGVsLCBldnQpO1xuICBhYnN0cmFjdCBjcmVhdGVNb3VzZUV2ZW50KGV2ZW50VHlwZSk6IGFueTtcbiAgYWJzdHJhY3QgY3JlYXRlRXZlbnQoZXZlbnRUeXBlOiBzdHJpbmcpOiBhbnk7XG4gIGFic3RyYWN0IHByZXZlbnREZWZhdWx0KGV2dCk7XG4gIGFic3RyYWN0IGlzUHJldmVudGVkKGV2dCk6IGJvb2xlYW47XG4gIGFic3RyYWN0IGdldElubmVySFRNTChlbCk6IHN0cmluZztcbiAgYWJzdHJhY3QgZ2V0T3V0ZXJIVE1MKGVsKTogc3RyaW5nO1xuICBhYnN0cmFjdCBub2RlTmFtZShub2RlKTogc3RyaW5nO1xuICBhYnN0cmFjdCBub2RlVmFsdWUobm9kZSk6IHN0cmluZztcbiAgYWJzdHJhY3QgdHlwZShub2RlKTogc3RyaW5nO1xuICBhYnN0cmFjdCBjb250ZW50KG5vZGUpOiBhbnk7XG4gIGFic3RyYWN0IGZpcnN0Q2hpbGQoZWwpOiBOb2RlO1xuICBhYnN0cmFjdCBuZXh0U2libGluZyhlbCk6IE5vZGU7XG4gIGFic3RyYWN0IHBhcmVudEVsZW1lbnQoZWwpOiBOb2RlO1xuICBhYnN0cmFjdCBjaGlsZE5vZGVzKGVsKTogTm9kZVtdO1xuICBhYnN0cmFjdCBjaGlsZE5vZGVzQXNMaXN0KGVsKTogTm9kZVtdO1xuICBhYnN0cmFjdCBjbGVhck5vZGVzKGVsKTtcbiAgYWJzdHJhY3QgYXBwZW5kQ2hpbGQoZWwsIG5vZGUpO1xuICBhYnN0cmFjdCByZW1vdmVDaGlsZChlbCwgbm9kZSk7XG4gIGFic3RyYWN0IHJlcGxhY2VDaGlsZChlbCwgbmV3Tm9kZSwgb2xkTm9kZSk7XG4gIGFic3RyYWN0IHJlbW92ZShlbCk6IE5vZGU7XG4gIGFic3RyYWN0IGluc2VydEJlZm9yZShlbCwgbm9kZSk7XG4gIGFic3RyYWN0IGluc2VydEFsbEJlZm9yZShlbCwgbm9kZXMpO1xuICBhYnN0cmFjdCBpbnNlcnRBZnRlcihlbCwgbm9kZSk7XG4gIGFic3RyYWN0IHNldElubmVySFRNTChlbCwgdmFsdWUpO1xuICBhYnN0cmFjdCBnZXRUZXh0KGVsKTogc3RyaW5nO1xuICBhYnN0cmFjdCBzZXRUZXh0KGVsLCB2YWx1ZTogc3RyaW5nKTtcbiAgYWJzdHJhY3QgZ2V0VmFsdWUoZWwpOiBzdHJpbmc7XG4gIGFic3RyYWN0IHNldFZhbHVlKGVsLCB2YWx1ZTogc3RyaW5nKTtcbiAgYWJzdHJhY3QgZ2V0Q2hlY2tlZChlbCk6IGJvb2xlYW47XG4gIGFic3RyYWN0IHNldENoZWNrZWQoZWwsIHZhbHVlOiBib29sZWFuKTtcbiAgYWJzdHJhY3QgY3JlYXRlQ29tbWVudCh0ZXh0OiBzdHJpbmcpOiBhbnk7XG4gIGFic3RyYWN0IGNyZWF0ZVRlbXBsYXRlKGh0bWwpOiBIVE1MRWxlbWVudDtcbiAgYWJzdHJhY3QgY3JlYXRlRWxlbWVudCh0YWdOYW1lLCBkb2M/KTogSFRNTEVsZW1lbnQ7XG4gIGFic3RyYWN0IGNyZWF0ZUVsZW1lbnROUyhuczogc3RyaW5nLCB0YWdOYW1lOiBzdHJpbmcsIGRvYz8pOiBFbGVtZW50O1xuICBhYnN0cmFjdCBjcmVhdGVUZXh0Tm9kZSh0ZXh0OiBzdHJpbmcsIGRvYz8pOiBUZXh0O1xuICBhYnN0cmFjdCBjcmVhdGVTY3JpcHRUYWcoYXR0ck5hbWU6IHN0cmluZywgYXR0clZhbHVlOiBzdHJpbmcsIGRvYz8pOiBIVE1MRWxlbWVudDtcbiAgYWJzdHJhY3QgY3JlYXRlU3R5bGVFbGVtZW50KGNzczogc3RyaW5nLCBkb2M/KTogSFRNTFN0eWxlRWxlbWVudDtcbiAgYWJzdHJhY3QgY3JlYXRlU2hhZG93Um9vdChlbCk6IGFueTtcbiAgYWJzdHJhY3QgZ2V0U2hhZG93Um9vdChlbCk6IGFueTtcbiAgYWJzdHJhY3QgZ2V0SG9zdChlbCk6IGFueTtcbiAgYWJzdHJhY3QgZ2V0RGlzdHJpYnV0ZWROb2RlcyhlbCk6IE5vZGVbXTtcbiAgYWJzdHJhY3QgY2xvbmUgLyo8VCBleHRlbmRzIE5vZGU+Ki8gKG5vZGU6IE5vZGUgLypUKi8pOiBOb2RlIC8qVCovO1xuICBhYnN0cmFjdCBnZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGVsZW1lbnQsIG5hbWU6IHN0cmluZyk6IEhUTUxFbGVtZW50W107XG4gIGFic3RyYWN0IGdldEVsZW1lbnRzQnlUYWdOYW1lKGVsZW1lbnQsIG5hbWU6IHN0cmluZyk6IEhUTUxFbGVtZW50W107XG4gIGFic3RyYWN0IGNsYXNzTGlzdChlbGVtZW50KTogYW55W107XG4gIGFic3RyYWN0IGFkZENsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZTogc3RyaW5nKTtcbiAgYWJzdHJhY3QgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgY2xhc3NOYW1lOiBzdHJpbmcpO1xuICBhYnN0cmFjdCBoYXNDbGFzcyhlbGVtZW50LCBjbGFzc05hbWU6IHN0cmluZyk6IGJvb2xlYW47XG4gIGFic3RyYWN0IHNldFN0eWxlKGVsZW1lbnQsIHN0eWxlTmFtZTogc3RyaW5nLCBzdHlsZVZhbHVlOiBzdHJpbmcpO1xuICBhYnN0cmFjdCByZW1vdmVTdHlsZShlbGVtZW50LCBzdHlsZU5hbWU6IHN0cmluZyk7XG4gIGFic3RyYWN0IGdldFN0eWxlKGVsZW1lbnQsIHN0eWxlTmFtZTogc3RyaW5nKTogc3RyaW5nO1xuICBhYnN0cmFjdCBoYXNTdHlsZShlbGVtZW50LCBzdHlsZU5hbWU6IHN0cmluZywgc3R5bGVWYWx1ZT86IHN0cmluZyk6IGJvb2xlYW47XG4gIGFic3RyYWN0IHRhZ05hbWUoZWxlbWVudCk6IHN0cmluZztcbiAgYWJzdHJhY3QgYXR0cmlidXRlTWFwKGVsZW1lbnQpOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xuICBhYnN0cmFjdCBoYXNBdHRyaWJ1dGUoZWxlbWVudCwgYXR0cmlidXRlOiBzdHJpbmcpOiBib29sZWFuO1xuICBhYnN0cmFjdCBnZXRBdHRyaWJ1dGUoZWxlbWVudCwgYXR0cmlidXRlOiBzdHJpbmcpOiBzdHJpbmc7XG4gIGFic3RyYWN0IHNldEF0dHJpYnV0ZShlbGVtZW50LCBuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpO1xuICBhYnN0cmFjdCBzZXRBdHRyaWJ1dGVOUyhlbGVtZW50LCBuczogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpO1xuICBhYnN0cmFjdCByZW1vdmVBdHRyaWJ1dGUoZWxlbWVudCwgYXR0cmlidXRlOiBzdHJpbmcpO1xuICBhYnN0cmFjdCB0ZW1wbGF0ZUF3YXJlUm9vdChlbCk7XG4gIGFic3RyYWN0IGNyZWF0ZUh0bWxEb2N1bWVudCgpOiBIVE1MRG9jdW1lbnQ7XG4gIGFic3RyYWN0IGRlZmF1bHREb2MoKTogSFRNTERvY3VtZW50O1xuICBhYnN0cmFjdCBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWwpO1xuICBhYnN0cmFjdCBnZXRUaXRsZSgpOiBzdHJpbmc7XG4gIGFic3RyYWN0IHNldFRpdGxlKG5ld1RpdGxlOiBzdHJpbmcpO1xuICBhYnN0cmFjdCBlbGVtZW50TWF0Y2hlcyhuLCBzZWxlY3Rvcjogc3RyaW5nKTogYm9vbGVhbjtcbiAgYWJzdHJhY3QgaXNUZW1wbGF0ZUVsZW1lbnQoZWw6IGFueSk6IGJvb2xlYW47XG4gIGFic3RyYWN0IGlzVGV4dE5vZGUobm9kZSk6IGJvb2xlYW47XG4gIGFic3RyYWN0IGlzQ29tbWVudE5vZGUobm9kZSk6IGJvb2xlYW47XG4gIGFic3RyYWN0IGlzRWxlbWVudE5vZGUobm9kZSk6IGJvb2xlYW47XG4gIGFic3RyYWN0IGhhc1NoYWRvd1Jvb3Qobm9kZSk6IGJvb2xlYW47XG4gIGFic3RyYWN0IGlzU2hhZG93Um9vdChub2RlKTogYm9vbGVhbjtcbiAgYWJzdHJhY3QgaW1wb3J0SW50b0RvYyAvKjxUIGV4dGVuZHMgTm9kZT4qLyAobm9kZTogTm9kZSAvKlQqLyk6IE5vZGUgLypUKi87XG4gIGFic3RyYWN0IGFkb3B0Tm9kZSAvKjxUIGV4dGVuZHMgTm9kZT4qLyAobm9kZTogTm9kZSAvKlQqLyk6IE5vZGUgLypUKi87XG4gIGFic3RyYWN0IGdldEhyZWYoZWxlbWVudCk6IHN0cmluZztcbiAgYWJzdHJhY3QgZ2V0RXZlbnRLZXkoZXZlbnQpOiBzdHJpbmc7XG4gIGFic3RyYWN0IHJlc29sdmVBbmRTZXRIcmVmKGVsZW1lbnQsIGJhc2VVcmw6IHN0cmluZywgaHJlZjogc3RyaW5nKTtcbiAgYWJzdHJhY3Qgc3VwcG9ydHNET01FdmVudHMoKTogYm9vbGVhbjtcbiAgYWJzdHJhY3Qgc3VwcG9ydHNOYXRpdmVTaGFkb3dET00oKTogYm9vbGVhbjtcbiAgYWJzdHJhY3QgZ2V0R2xvYmFsRXZlbnRUYXJnZXQodGFyZ2V0OiBzdHJpbmcpOiBhbnk7XG4gIGFic3RyYWN0IGdldEhpc3RvcnkoKTogSGlzdG9yeTtcbiAgYWJzdHJhY3QgZ2V0TG9jYXRpb24oKTogTG9jYXRpb247XG4gIGFic3RyYWN0IGdldEJhc2VIcmVmKCk6IHN0cmluZztcbiAgYWJzdHJhY3QgcmVzZXRCYXNlRWxlbWVudCgpOiB2b2lkO1xuICBhYnN0cmFjdCBnZXRVc2VyQWdlbnQoKTogc3RyaW5nO1xuICBhYnN0cmFjdCBzZXREYXRhKGVsZW1lbnQsIG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk7XG4gIGFic3RyYWN0IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk6IGFueTtcbiAgYWJzdHJhY3QgZ2V0RGF0YShlbGVtZW50LCBuYW1lOiBzdHJpbmcpOiBzdHJpbmc7XG4gIGFic3RyYWN0IHNldEdsb2JhbFZhcihuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpO1xuICBhYnN0cmFjdCByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoY2FsbGJhY2spOiBudW1iZXI7XG4gIGFic3RyYWN0IGNhbmNlbEFuaW1hdGlvbkZyYW1lKGlkKTtcbiAgYWJzdHJhY3QgcGVyZm9ybWFuY2VOb3coKTogbnVtYmVyO1xuICBhYnN0cmFjdCBnZXRBbmltYXRpb25QcmVmaXgoKTogc3RyaW5nO1xuICBhYnN0cmFjdCBnZXRUcmFuc2l0aW9uRW5kKCk6IHN0cmluZztcbiAgYWJzdHJhY3Qgc3VwcG9ydHNBbmltYXRpb24oKTogYm9vbGVhbjtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZG9tX2FkYXB0ZXIudHNcbiAqKi8iLCJleHBvcnQge0FuZ3VsYXJFbnRyeXBvaW50fSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9hbmd1bGFyX2VudHJ5cG9pbnQnO1xuZXhwb3J0IHtcbiAgQlJPV1NFUl9QUk9WSURFUlMsXG4gIEVMRU1FTlRfUFJPQkVfQklORElOR1MsXG4gIEVMRU1FTlRfUFJPQkVfUFJPVklERVJTLFxuICBpbnNwZWN0TmF0aXZlRWxlbWVudCxcbiAgQnJvd3NlckRvbUFkYXB0ZXIsXG4gIEJ5LFxuICBUaXRsZSxcbiAgRE9DVU1FTlQsXG4gIGVuYWJsZURlYnVnVG9vbHMsXG4gIGRpc2FibGVEZWJ1Z1Rvb2xzXG59IGZyb20gJ2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9icm93c2VyX2NvbW1vbic7XG5cbmltcG9ydCB7VHlwZSwgaXNQcmVzZW50LCBDT05TVF9FWFBSfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtQcm9taXNlfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL3Byb21pc2UnO1xuaW1wb3J0IHtcbiAgQlJPV1NFUl9QUk9WSURFUlMsXG4gIEJST1dTRVJfQVBQX0NPTU1PTl9QUk9WSURFUlNcbn0gZnJvbSAnYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2Jyb3dzZXJfY29tbW9uJztcbmltcG9ydCB7Q09NUElMRVJfUFJPVklERVJTfSBmcm9tICdhbmd1bGFyMi9jb21waWxlcic7XG5pbXBvcnQge0NvbXBvbmVudFJlZiwgcGxhdGZvcm0sIHJlZmxlY3Rvcn0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5pbXBvcnQge1JlZmxlY3Rpb25DYXBhYmlsaXRpZXN9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL3JlZmxlY3Rpb24vcmVmbGVjdGlvbl9jYXBhYmlsaXRpZXMnO1xuaW1wb3J0IHtYSFJJbXBsfSBmcm9tIFwiYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2Jyb3dzZXIveGhyX2ltcGxcIjtcbmltcG9ydCB7WEhSfSBmcm9tICdhbmd1bGFyMi9jb21waWxlcic7XG5pbXBvcnQge1Byb3ZpZGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5cbi8qKlxuICogQW4gYXJyYXkgb2YgcHJvdmlkZXJzIHRoYXQgc2hvdWxkIGJlIHBhc3NlZCBpbnRvIGBhcHBsaWNhdGlvbigpYCB3aGVuIGJvb3RzdHJhcHBpbmcgYSBjb21wb25lbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBCUk9XU0VSX0FQUF9QUk9WSURFUlM6IEFycmF5PGFueSAvKlR5cGUgfCBQcm92aWRlciB8IGFueVtdKi8+ID0gQ09OU1RfRVhQUihbXG4gIEJST1dTRVJfQVBQX0NPTU1PTl9QUk9WSURFUlMsXG4gIENPTVBJTEVSX1BST1ZJREVSUyxcbiAgbmV3IFByb3ZpZGVyKFhIUiwge3VzZUNsYXNzOiBYSFJJbXBsfSksXG5dKTtcblxuLyoqXG4gKiBCb290c3RyYXBwaW5nIGZvciBBbmd1bGFyIGFwcGxpY2F0aW9ucy5cbiAqXG4gKiBZb3UgaW5zdGFudGlhdGUgYW4gQW5ndWxhciBhcHBsaWNhdGlvbiBieSBleHBsaWNpdGx5IHNwZWNpZnlpbmcgYSBjb21wb25lbnQgdG8gdXNlXG4gKiBhcyB0aGUgcm9vdCBjb21wb25lbnQgZm9yIHlvdXIgYXBwbGljYXRpb24gdmlhIHRoZSBgYm9vdHN0cmFwKClgIG1ldGhvZC5cbiAqXG4gKiAjIyBTaW1wbGUgRXhhbXBsZVxuICpcbiAqIEFzc3VtaW5nIHRoaXMgYGluZGV4Lmh0bWxgOlxuICpcbiAqIGBgYGh0bWxcbiAqIDxodG1sPlxuICogICA8IS0tIGxvYWQgQW5ndWxhciBzY3JpcHQgdGFncyBoZXJlLiAtLT5cbiAqICAgPGJvZHk+XG4gKiAgICAgPG15LWFwcD5sb2FkaW5nLi4uPC9teS1hcHA+XG4gKiAgIDwvYm9keT5cbiAqIDwvaHRtbD5cbiAqIGBgYFxuICpcbiAqIEFuIGFwcGxpY2F0aW9uIGlzIGJvb3RzdHJhcHBlZCBpbnNpZGUgYW4gZXhpc3RpbmcgYnJvd3NlciBET00sIHR5cGljYWxseSBgaW5kZXguaHRtbGAuXG4gKiBVbmxpa2UgQW5ndWxhciAxLCBBbmd1bGFyIDIgZG9lcyBub3QgY29tcGlsZS9wcm9jZXNzIHByb3ZpZGVycyBpbiBgaW5kZXguaHRtbGAuIFRoaXMgaXNcbiAqIG1haW5seSBmb3Igc2VjdXJpdHkgcmVhc29ucywgYXMgd2VsbCBhcyBhcmNoaXRlY3R1cmFsIGNoYW5nZXMgaW4gQW5ndWxhciAyLiBUaGlzIG1lYW5zXG4gKiB0aGF0IGBpbmRleC5odG1sYCBjYW4gc2FmZWx5IGJlIHByb2Nlc3NlZCB1c2luZyBzZXJ2ZXItc2lkZSB0ZWNobm9sb2dpZXMgc3VjaCBhc1xuICogcHJvdmlkZXJzLiBCaW5kaW5ncyBjYW4gdGh1cyB1c2UgZG91YmxlLWN1cmx5IGB7eyBzeW50YXggfX1gIHdpdGhvdXQgY29sbGlzaW9uIGZyb21cbiAqIEFuZ3VsYXIgMiBjb21wb25lbnQgZG91YmxlLWN1cmx5IGB7eyBzeW50YXggfX1gLlxuICpcbiAqIFdlIGNhbiB1c2UgdGhpcyBzY3JpcHQgY29kZTpcbiAqXG4gKiB7QGV4YW1wbGUgY29yZS90cy9ib290c3RyYXAvYm9vdHN0cmFwLnRzIHJlZ2lvbj0nYm9vdHN0cmFwJ31cbiAqXG4gKiBXaGVuIHRoZSBhcHAgZGV2ZWxvcGVyIGludm9rZXMgYGJvb3RzdHJhcCgpYCB3aXRoIHRoZSByb290IGNvbXBvbmVudCBgTXlBcHBgIGFzIGl0c1xuICogYXJndW1lbnQsIEFuZ3VsYXIgcGVyZm9ybXMgdGhlIGZvbGxvd2luZyB0YXNrczpcbiAqXG4gKiAgMS4gSXQgdXNlcyB0aGUgY29tcG9uZW50J3MgYHNlbGVjdG9yYCBwcm9wZXJ0eSB0byBsb2NhdGUgdGhlIERPTSBlbGVtZW50IHdoaWNoIG5lZWRzXG4gKiAgICAgdG8gYmUgdXBncmFkZWQgaW50byB0aGUgYW5ndWxhciBjb21wb25lbnQuXG4gKiAgMi4gSXQgY3JlYXRlcyBhIG5ldyBjaGlsZCBpbmplY3RvciAoZnJvbSB0aGUgcGxhdGZvcm0gaW5qZWN0b3IpLiBPcHRpb25hbGx5LCB5b3UgY2FuXG4gKiAgICAgYWxzbyBvdmVycmlkZSB0aGUgaW5qZWN0b3IgY29uZmlndXJhdGlvbiBmb3IgYW4gYXBwIGJ5IGludm9raW5nIGBib290c3RyYXBgIHdpdGggdGhlXG4gKiAgICAgYGNvbXBvbmVudEluamVjdGFibGVCaW5kaW5nc2AgYXJndW1lbnQuXG4gKiAgMy4gSXQgY3JlYXRlcyBhIG5ldyBgWm9uZWAgYW5kIGNvbm5lY3RzIGl0IHRvIHRoZSBhbmd1bGFyIGFwcGxpY2F0aW9uJ3MgY2hhbmdlIGRldGVjdGlvblxuICogICAgIGRvbWFpbiBpbnN0YW5jZS5cbiAqICA0LiBJdCBjcmVhdGVzIGFuIGVtdWxhdGVkIG9yIHNoYWRvdyBET00gb24gdGhlIHNlbGVjdGVkIGNvbXBvbmVudCdzIGhvc3QgZWxlbWVudCBhbmQgbG9hZHMgdGhlXG4gKiAgICAgdGVtcGxhdGUgaW50byBpdC5cbiAqICA1LiBJdCBpbnN0YW50aWF0ZXMgdGhlIHNwZWNpZmllZCBjb21wb25lbnQuXG4gKiAgNi4gRmluYWxseSwgQW5ndWxhciBwZXJmb3JtcyBjaGFuZ2UgZGV0ZWN0aW9uIHRvIGFwcGx5IHRoZSBpbml0aWFsIGRhdGEgcHJvdmlkZXJzIGZvciB0aGVcbiAqICAgICBhcHBsaWNhdGlvbi5cbiAqXG4gKlxuICogIyMgQm9vdHN0cmFwcGluZyBNdWx0aXBsZSBBcHBsaWNhdGlvbnNcbiAqXG4gKiBXaGVuIHdvcmtpbmcgd2l0aGluIGEgYnJvd3NlciB3aW5kb3csIHRoZXJlIGFyZSBtYW55IHNpbmdsZXRvbiByZXNvdXJjZXM6IGNvb2tpZXMsIHRpdGxlLFxuICogbG9jYXRpb24sIGFuZCBvdGhlcnMuIEFuZ3VsYXIgc2VydmljZXMgdGhhdCByZXByZXNlbnQgdGhlc2UgcmVzb3VyY2VzIG11c3QgbGlrZXdpc2UgYmVcbiAqIHNoYXJlZCBhY3Jvc3MgYWxsIEFuZ3VsYXIgYXBwbGljYXRpb25zIHRoYXQgb2NjdXB5IHRoZSBzYW1lIGJyb3dzZXIgd2luZG93LiBGb3IgdGhpc1xuICogcmVhc29uLCBBbmd1bGFyIGNyZWF0ZXMgZXhhY3RseSBvbmUgZ2xvYmFsIHBsYXRmb3JtIG9iamVjdCB3aGljaCBzdG9yZXMgYWxsIHNoYXJlZFxuICogc2VydmljZXMsIGFuZCBlYWNoIGFuZ3VsYXIgYXBwbGljYXRpb24gaW5qZWN0b3IgaGFzIHRoZSBwbGF0Zm9ybSBpbmplY3RvciBhcyBpdHMgcGFyZW50LlxuICpcbiAqIEVhY2ggYXBwbGljYXRpb24gaGFzIGl0cyBvd24gcHJpdmF0ZSBpbmplY3RvciBhcyB3ZWxsLiBXaGVuIHRoZXJlIGFyZSBtdWx0aXBsZVxuICogYXBwbGljYXRpb25zIG9uIGEgcGFnZSwgQW5ndWxhciB0cmVhdHMgZWFjaCBhcHBsaWNhdGlvbiBpbmplY3RvcidzIHNlcnZpY2VzIGFzIHByaXZhdGVcbiAqIHRvIHRoYXQgYXBwbGljYXRpb24uXG4gKlxuICogIyMgQVBJXG4gKlxuICogLSBgYXBwQ29tcG9uZW50VHlwZWA6IFRoZSByb290IGNvbXBvbmVudCB3aGljaCBzaG91bGQgYWN0IGFzIHRoZSBhcHBsaWNhdGlvbi4gVGhpcyBpc1xuICogICBhIHJlZmVyZW5jZSB0byBhIGBUeXBlYCB3aGljaCBpcyBhbm5vdGF0ZWQgd2l0aCBgQENvbXBvbmVudCguLi4pYC5cbiAqIC0gYGN1c3RvbVByb3ZpZGVyc2A6IEFuIGFkZGl0aW9uYWwgc2V0IG9mIHByb3ZpZGVycyB0aGF0IGNhbiBiZSBhZGRlZCB0byB0aGVcbiAqICAgYXBwIGluamVjdG9yIHRvIG92ZXJyaWRlIGRlZmF1bHQgaW5qZWN0aW9uIGJlaGF2aW9yLlxuICpcbiAqIFJldHVybnMgYSBgUHJvbWlzZWAgb2Yge0BsaW5rIENvbXBvbmVudFJlZn0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBib290c3RyYXAoXG4gICAgYXBwQ29tcG9uZW50VHlwZTogVHlwZSxcbiAgICBjdXN0b21Qcm92aWRlcnM/OiBBcnJheTxhbnkgLypUeXBlIHwgUHJvdmlkZXIgfCBhbnlbXSovPik6IFByb21pc2U8Q29tcG9uZW50UmVmPiB7XG4gIHJlZmxlY3Rvci5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzID0gbmV3IFJlZmxlY3Rpb25DYXBhYmlsaXRpZXMoKTtcbiAgbGV0IGFwcFByb3ZpZGVycyA9XG4gICAgICBpc1ByZXNlbnQoY3VzdG9tUHJvdmlkZXJzKSA/IFtCUk9XU0VSX0FQUF9QUk9WSURFUlMsIGN1c3RvbVByb3ZpZGVyc10gOiBCUk9XU0VSX0FQUF9QUk9WSURFUlM7XG4gIHJldHVybiBwbGF0Zm9ybShCUk9XU0VSX1BST1ZJREVSUykuYXBwbGljYXRpb24oYXBwUHJvdmlkZXJzKS5ib290c3RyYXAoYXBwQ29tcG9uZW50VHlwZSk7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9wbGF0Zm9ybS9icm93c2VyLnRzXG4gKiovIiwiaW1wb3J0IHtDT05TVH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxuLyoqXG4gKiBNYXJrcyBhIGZ1bmN0aW9uIG9yIG1ldGhvZCBhcyBhbiBBbmd1bGFyIDIgZW50cnlwb2ludC4gT25seSBuZWNlc3NhcnkgaW4gRGFydCBjb2RlLlxuICpcbiAqIFRoZSBvcHRpb25hbCBgbmFtZWAgcGFyYW1ldGVyIHdpbGwgYmUgcmVmbGVjdGVkIGluIGxvZ3Mgd2hlbiB0aGUgZW50cnkgcG9pbnQgaXMgcHJvY2Vzc2VkLlxuICpcbiAqIFNlZSBbdGhlIHdpa2ldW10gZm9yIGRldGFpbGVkIGRvY3VtZW50YXRpb24uXG4gKiBbdGhlIHdpa2ldOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL3dpa2kvQW5ndWxhci0yLURhcnQtVHJhbnNmb3JtZXIjZW50cnlfcG9pbnRzXG4gKlxuICogIyMgRXhhbXBsZVxuICpcbiAqIGBgYFxuICogQEFuZ3VsYXJFbnRyeXBvaW50KFwibmFtZS1mb3ItZGVidWdcIilcbiAqIHZvaWQgbWFpbigpIHtcbiAqICAgYm9vdHN0cmFwKE15Q29tcG9uZW50KTtcbiAqIH1cbiAqIGBgYFxuICovXG5AQ09OU1QoKVxuZXhwb3J0IGNsYXNzIEFuZ3VsYXJFbnRyeXBvaW50IHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU/OiBTdHJpbmcpIHt9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9hbmd1bGFyX2VudHJ5cG9pbnQudHNcbiAqKi8iLCJpbXBvcnQge0NPTlNUX0VYUFIsIElTX0RBUlR9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge3Byb3ZpZGUsIFByb3ZpZGVyLCBJbmplY3RvciwgT3BhcXVlVG9rZW59IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpJztcblxuaW1wb3J0IHtcbiAgUExBVEZPUk1fSU5JVElBTElaRVIsXG4gIFBMQVRGT1JNX0RJUkVDVElWRVMsXG4gIFBMQVRGT1JNX1BJUEVTLFxuICBDb21wb25lbnRSZWYsXG4gIHBsYXRmb3JtLFxuICBFeGNlcHRpb25IYW5kbGVyLFxuICBSZWZsZWN0b3IsXG4gIFJlbmRlcmVyLFxuICByZWZsZWN0b3IsXG4gIEFQUExJQ0FUSU9OX0NPTU1PTl9QUk9WSURFUlMsXG4gIFBMQVRGT1JNX0NPTU1PTl9QUk9WSURFUlNcbn0gZnJvbSBcImFuZ3VsYXIyL2NvcmVcIjtcbmltcG9ydCB7Q09NTU9OX0RJUkVDVElWRVMsIENPTU1PTl9QSVBFUywgRk9STV9QUk9WSURFUlN9IGZyb20gXCJhbmd1bGFyMi9jb21tb25cIjtcbmltcG9ydCB7VGVzdGFiaWxpdHl9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL3Rlc3RhYmlsaXR5L3Rlc3RhYmlsaXR5JztcbmltcG9ydCB7RE9NfSBmcm9tICdhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2RvbV9hZGFwdGVyJztcbmltcG9ydCB7RG9tRXZlbnRzUGx1Z2lufSBmcm9tICdhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2V2ZW50cy9kb21fZXZlbnRzJztcbmltcG9ydCB7S2V5RXZlbnRzUGx1Z2lufSBmcm9tICdhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2V2ZW50cy9rZXlfZXZlbnRzJztcbmltcG9ydCB7SGFtbWVyR2VzdHVyZXNQbHVnaW59IGZyb20gJ2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZXZlbnRzL2hhbW1lcl9nZXN0dXJlcyc7XG5pbXBvcnQge0RPQ1VNRU5UfSBmcm9tICdhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2RvbV90b2tlbnMnO1xuaW1wb3J0IHtEb21SZW5kZXJlciwgRG9tUmVuZGVyZXJffSBmcm9tICdhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2RvbV9yZW5kZXJlcic7XG5pbXBvcnQge0RvbVNoYXJlZFN0eWxlc0hvc3R9IGZyb20gJ2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vc2hhcmVkX3N0eWxlc19ob3N0JztcbmltcG9ydCB7U2hhcmVkU3R5bGVzSG9zdH0gZnJvbSBcImFuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vc2hhcmVkX3N0eWxlc19ob3N0XCI7XG5pbXBvcnQge0Jyb3dzZXJEZXRhaWxzfSBmcm9tIFwiYW5ndWxhcjIvc3JjL2FuaW1hdGUvYnJvd3Nlcl9kZXRhaWxzXCI7XG5pbXBvcnQge0FuaW1hdGlvbkJ1aWxkZXJ9IGZyb20gXCJhbmd1bGFyMi9zcmMvYW5pbWF0ZS9hbmltYXRpb25fYnVpbGRlclwiO1xuaW1wb3J0IHtCcm93c2VyRG9tQWRhcHRlcn0gZnJvbSAnLi9icm93c2VyL2Jyb3dzZXJfYWRhcHRlcic7XG5pbXBvcnQge0Jyb3dzZXJHZXRUZXN0YWJpbGl0eX0gZnJvbSAnYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2Jyb3dzZXIvdGVzdGFiaWxpdHknO1xuaW1wb3J0IHt3dGZJbml0fSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9wcm9maWxlL3d0Zl9pbml0JztcbmltcG9ydCB7RXZlbnRNYW5hZ2VyLCBFVkVOVF9NQU5BR0VSX1BMVUdJTlN9IGZyb20gXCJhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2V2ZW50cy9ldmVudF9tYW5hZ2VyXCI7XG5leHBvcnQge0RPQ1VNRU5UfSBmcm9tICdhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2RvbV90b2tlbnMnO1xuZXhwb3J0IHtUaXRsZX0gZnJvbSAnYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2Jyb3dzZXIvdGl0bGUnO1xuZXhwb3J0IHtcbiAgRGVidWdFbGVtZW50Vmlld0xpc3RlbmVyLFxuICBFTEVNRU5UX1BST0JFX1BST1ZJREVSUyxcbiAgRUxFTUVOVF9QUk9CRV9CSU5ESU5HUyxcbiAgaW5zcGVjdE5hdGl2ZUVsZW1lbnQsXG4gIEJ5XG59IGZyb20gJ2FuZ3VsYXIyL3BsYXRmb3JtL2NvbW1vbl9kb20nO1xuZXhwb3J0IHtCcm93c2VyRG9tQWRhcHRlcn0gZnJvbSAnLi9icm93c2VyL2Jyb3dzZXJfYWRhcHRlcic7XG5leHBvcnQge2VuYWJsZURlYnVnVG9vbHMsIGRpc2FibGVEZWJ1Z1Rvb2xzfSBmcm9tICdhbmd1bGFyMi9zcmMvcGxhdGZvcm0vYnJvd3Nlci90b29scy90b29scyc7XG5cbi8qKlxuICogQSBzZXQgb2YgcHJvdmlkZXJzIHRvIGluaXRpYWxpemUgdGhlIEFuZ3VsYXIgcGxhdGZvcm0gaW4gYSB3ZWIgYnJvd3Nlci5cbiAqXG4gKiBVc2VkIGF1dG9tYXRpY2FsbHkgYnkgYGJvb3RzdHJhcGAsIG9yIGNhbiBiZSBwYXNzZWQgdG8ge0BsaW5rIHBsYXRmb3JtfS5cbiAqL1xuZXhwb3J0IGNvbnN0IEJST1dTRVJfUFJPVklERVJTOiBBcnJheTxhbnkgLypUeXBlIHwgUHJvdmlkZXIgfCBhbnlbXSovPiA9IENPTlNUX0VYUFIoW1xuICBQTEFURk9STV9DT01NT05fUFJPVklERVJTLFxuICBuZXcgUHJvdmlkZXIoUExBVEZPUk1fSU5JVElBTElaRVIsIHt1c2VWYWx1ZTogaW5pdERvbUFkYXB0ZXIsIG11bHRpOiB0cnVlfSksXG5dKTtcblxuZnVuY3Rpb24gX2V4Y2VwdGlvbkhhbmRsZXIoKTogRXhjZXB0aW9uSGFuZGxlciB7XG4gIC8vICFJU19EQVJUIGlzIHJlcXVpcmVkIGJlY2F1c2Ugd2UgbXVzdCByZXRocm93IGV4Y2VwdGlvbnMgaW4gSlMsXG4gIC8vIGJ1dCBtdXN0IG5vdCByZXRocm93IGV4Y2VwdGlvbnMgaW4gRGFydFxuICByZXR1cm4gbmV3IEV4Y2VwdGlvbkhhbmRsZXIoRE9NLCAhSVNfREFSVCk7XG59XG5cbmZ1bmN0aW9uIF9kb2N1bWVudCgpOiBhbnkge1xuICByZXR1cm4gRE9NLmRlZmF1bHREb2MoKTtcbn1cblxuLyoqXG4gKiBBIHNldCBvZiBwcm92aWRlcnMgdG8gaW5pdGlhbGl6ZSBhbiBBbmd1bGFyIGFwcGxpY2F0aW9uIGluIGEgd2ViIGJyb3dzZXIuXG4gKlxuICogVXNlZCBhdXRvbWF0aWNhbGx5IGJ5IGBib290c3RyYXBgLCBvciBjYW4gYmUgcGFzc2VkIHRvIHtAbGluayBQbGF0Zm9ybVJlZi5hcHBsaWNhdGlvbn0uXG4gKi9cbmV4cG9ydCBjb25zdCBCUk9XU0VSX0FQUF9DT01NT05fUFJPVklERVJTOiBBcnJheTxhbnkgLypUeXBlIHwgUHJvdmlkZXIgfCBhbnlbXSovPiA9IENPTlNUX0VYUFIoW1xuICBBUFBMSUNBVElPTl9DT01NT05fUFJPVklERVJTLFxuICBGT1JNX1BST1ZJREVSUyxcbiAgbmV3IFByb3ZpZGVyKFBMQVRGT1JNX1BJUEVTLCB7dXNlVmFsdWU6IENPTU1PTl9QSVBFUywgbXVsdGk6IHRydWV9KSxcbiAgbmV3IFByb3ZpZGVyKFBMQVRGT1JNX0RJUkVDVElWRVMsIHt1c2VWYWx1ZTogQ09NTU9OX0RJUkVDVElWRVMsIG11bHRpOiB0cnVlfSksXG4gIG5ldyBQcm92aWRlcihFeGNlcHRpb25IYW5kbGVyLCB7dXNlRmFjdG9yeTogX2V4Y2VwdGlvbkhhbmRsZXIsIGRlcHM6IFtdfSksXG4gIG5ldyBQcm92aWRlcihET0NVTUVOVCwge3VzZUZhY3Rvcnk6IF9kb2N1bWVudCwgZGVwczogW119KSxcbiAgbmV3IFByb3ZpZGVyKEVWRU5UX01BTkFHRVJfUExVR0lOUywge3VzZUNsYXNzOiBEb21FdmVudHNQbHVnaW4sIG11bHRpOiB0cnVlfSksXG4gIG5ldyBQcm92aWRlcihFVkVOVF9NQU5BR0VSX1BMVUdJTlMsIHt1c2VDbGFzczogS2V5RXZlbnRzUGx1Z2luLCBtdWx0aTogdHJ1ZX0pLFxuICBuZXcgUHJvdmlkZXIoRVZFTlRfTUFOQUdFUl9QTFVHSU5TLCB7dXNlQ2xhc3M6IEhhbW1lckdlc3R1cmVzUGx1Z2luLCBtdWx0aTogdHJ1ZX0pLFxuICBuZXcgUHJvdmlkZXIoRG9tUmVuZGVyZXIsIHt1c2VDbGFzczogRG9tUmVuZGVyZXJffSksXG4gIG5ldyBQcm92aWRlcihSZW5kZXJlciwge3VzZUV4aXN0aW5nOiBEb21SZW5kZXJlcn0pLFxuICBuZXcgUHJvdmlkZXIoU2hhcmVkU3R5bGVzSG9zdCwge3VzZUV4aXN0aW5nOiBEb21TaGFyZWRTdHlsZXNIb3N0fSksXG4gIERvbVNoYXJlZFN0eWxlc0hvc3QsXG4gIFRlc3RhYmlsaXR5LFxuICBCcm93c2VyRGV0YWlscyxcbiAgQW5pbWF0aW9uQnVpbGRlcixcbiAgRXZlbnRNYW5hZ2VyXG5dKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGluaXREb21BZGFwdGVyKCkge1xuICBCcm93c2VyRG9tQWRhcHRlci5tYWtlQ3VycmVudCgpO1xuICB3dGZJbml0KCk7XG4gIEJyb3dzZXJHZXRUZXN0YWJpbGl0eS5pbml0KCk7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvcGxhdGZvcm0vYnJvd3Nlcl9jb21tb24udHNcbiAqKi8iLCJpbXBvcnQge0RPTX0gZnJvbSAnYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9kb21fYWRhcHRlcic7XG5pbXBvcnQge0luamVjdGFibGV9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuaW1wb3J0IHtFdmVudE1hbmFnZXJQbHVnaW4sIEV2ZW50TWFuYWdlcn0gZnJvbSAnLi9ldmVudF9tYW5hZ2VyJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERvbUV2ZW50c1BsdWdpbiBleHRlbmRzIEV2ZW50TWFuYWdlclBsdWdpbiB7XG4gIG1hbmFnZXI6IEV2ZW50TWFuYWdlcjtcblxuICAvLyBUaGlzIHBsdWdpbiBzaG91bGQgY29tZSBsYXN0IGluIHRoZSBsaXN0IG9mIHBsdWdpbnMsIGJlY2F1c2UgaXQgYWNjZXB0cyBhbGxcbiAgLy8gZXZlbnRzLlxuICBzdXBwb3J0cyhldmVudE5hbWU6IHN0cmluZyk6IGJvb2xlYW4geyByZXR1cm4gdHJ1ZTsgfVxuXG4gIGFkZEV2ZW50TGlzdGVuZXIoZWxlbWVudDogSFRNTEVsZW1lbnQsIGV2ZW50TmFtZTogc3RyaW5nLCBoYW5kbGVyOiBGdW5jdGlvbikge1xuICAgIHZhciB6b25lID0gdGhpcy5tYW5hZ2VyLmdldFpvbmUoKTtcbiAgICB2YXIgb3V0c2lkZUhhbmRsZXIgPSAoZXZlbnQpID0+IHpvbmUucnVuKCgpID0+IGhhbmRsZXIoZXZlbnQpKTtcbiAgICB0aGlzLm1hbmFnZXIuZ2V0Wm9uZSgpLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHsgRE9NLm9uKGVsZW1lbnQsIGV2ZW50TmFtZSwgb3V0c2lkZUhhbmRsZXIpOyB9KTtcbiAgfVxuXG4gIGFkZEdsb2JhbEV2ZW50TGlzdGVuZXIodGFyZ2V0OiBzdHJpbmcsIGV2ZW50TmFtZTogc3RyaW5nLCBoYW5kbGVyOiBGdW5jdGlvbik6IEZ1bmN0aW9uIHtcbiAgICB2YXIgZWxlbWVudCA9IERPTS5nZXRHbG9iYWxFdmVudFRhcmdldCh0YXJnZXQpO1xuICAgIHZhciB6b25lID0gdGhpcy5tYW5hZ2VyLmdldFpvbmUoKTtcbiAgICB2YXIgb3V0c2lkZUhhbmRsZXIgPSAoZXZlbnQpID0+IHpvbmUucnVuKCgpID0+IGhhbmRsZXIoZXZlbnQpKTtcbiAgICByZXR1cm4gdGhpcy5tYW5hZ2VyLmdldFpvbmUoKS5ydW5PdXRzaWRlQW5ndWxhcihcbiAgICAgICAgKCkgPT4geyByZXR1cm4gRE9NLm9uQW5kQ2FuY2VsKGVsZW1lbnQsIGV2ZW50TmFtZSwgb3V0c2lkZUhhbmRsZXIpOyB9KTtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9ldmVudHMvZG9tX2V2ZW50cy50c1xuICoqLyIsImltcG9ydCB7Q09OU1RfRVhQUn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbiwgV3JhcHBlZEV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7SW5qZWN0YWJsZSwgSW5qZWN0LCBPcGFxdWVUb2tlbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvZGknO1xuaW1wb3J0IHtOZ1pvbmV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL3pvbmUvbmdfem9uZSc7XG5pbXBvcnQge0xpc3RXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuXG5leHBvcnQgY29uc3QgRVZFTlRfTUFOQUdFUl9QTFVHSU5TOiBPcGFxdWVUb2tlbiA9XG4gICAgQ09OU1RfRVhQUihuZXcgT3BhcXVlVG9rZW4oXCJFdmVudE1hbmFnZXJQbHVnaW5zXCIpKTtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEV2ZW50TWFuYWdlciB7XG4gIHByaXZhdGUgX3BsdWdpbnM6IEV2ZW50TWFuYWdlclBsdWdpbltdO1xuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoRVZFTlRfTUFOQUdFUl9QTFVHSU5TKSBwbHVnaW5zOiBFdmVudE1hbmFnZXJQbHVnaW5bXSwgcHJpdmF0ZSBfem9uZTogTmdab25lKSB7XG4gICAgcGx1Z2lucy5mb3JFYWNoKHAgPT4gcC5tYW5hZ2VyID0gdGhpcyk7XG4gICAgdGhpcy5fcGx1Z2lucyA9IExpc3RXcmFwcGVyLnJldmVyc2VkKHBsdWdpbnMpO1xuICB9XG5cbiAgYWRkRXZlbnRMaXN0ZW5lcihlbGVtZW50OiBIVE1MRWxlbWVudCwgZXZlbnROYW1lOiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKSB7XG4gICAgdmFyIHBsdWdpbiA9IHRoaXMuX2ZpbmRQbHVnaW5Gb3IoZXZlbnROYW1lKTtcbiAgICBwbHVnaW4uYWRkRXZlbnRMaXN0ZW5lcihlbGVtZW50LCBldmVudE5hbWUsIGhhbmRsZXIpO1xuICB9XG5cbiAgYWRkR2xvYmFsRXZlbnRMaXN0ZW5lcih0YXJnZXQ6IHN0cmluZywgZXZlbnROYW1lOiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKTogRnVuY3Rpb24ge1xuICAgIHZhciBwbHVnaW4gPSB0aGlzLl9maW5kUGx1Z2luRm9yKGV2ZW50TmFtZSk7XG4gICAgcmV0dXJuIHBsdWdpbi5hZGRHbG9iYWxFdmVudExpc3RlbmVyKHRhcmdldCwgZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgfVxuXG4gIGdldFpvbmUoKTogTmdab25lIHsgcmV0dXJuIHRoaXMuX3pvbmU7IH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9maW5kUGx1Z2luRm9yKGV2ZW50TmFtZTogc3RyaW5nKTogRXZlbnRNYW5hZ2VyUGx1Z2luIHtcbiAgICB2YXIgcGx1Z2lucyA9IHRoaXMuX3BsdWdpbnM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcGx1Z2luID0gcGx1Z2luc1tpXTtcbiAgICAgIGlmIChwbHVnaW4uc3VwcG9ydHMoZXZlbnROYW1lKSkge1xuICAgICAgICByZXR1cm4gcGx1Z2luO1xuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgTm8gZXZlbnQgbWFuYWdlciBwbHVnaW4gZm91bmQgZm9yIGV2ZW50ICR7ZXZlbnROYW1lfWApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFdmVudE1hbmFnZXJQbHVnaW4ge1xuICBtYW5hZ2VyOiBFdmVudE1hbmFnZXI7XG5cbiAgLy8gVGhhdCBpcyBlcXVpdmFsZW50IHRvIGhhdmluZyBzdXBwb3J0aW5nICRldmVudC50YXJnZXRcbiAgc3VwcG9ydHMoZXZlbnROYW1lOiBzdHJpbmcpOiBib29sZWFuIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgYWRkRXZlbnRMaXN0ZW5lcihlbGVtZW50OiBIVE1MRWxlbWVudCwgZXZlbnROYW1lOiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKSB7XG4gICAgdGhyb3cgXCJub3QgaW1wbGVtZW50ZWRcIjtcbiAgfVxuXG4gIGFkZEdsb2JhbEV2ZW50TGlzdGVuZXIoZWxlbWVudDogc3RyaW5nLCBldmVudE5hbWU6IHN0cmluZywgaGFuZGxlcjogRnVuY3Rpb24pOiBGdW5jdGlvbiB7XG4gICAgdGhyb3cgXCJub3QgaW1wbGVtZW50ZWRcIjtcbiAgfVxufVxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZXZlbnRzL2V2ZW50X21hbmFnZXIudHNcbiAqKi8iLCJpbXBvcnQge0RPTX0gZnJvbSAnYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9kb21fYWRhcHRlcic7XG5pbXBvcnQge1xuICBpc1ByZXNlbnQsXG4gIGlzQmxhbmssXG4gIFN0cmluZ1dyYXBwZXIsXG4gIFJlZ0V4cFdyYXBwZXIsXG4gIE51bWJlcldyYXBwZXJcbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7U3RyaW5nTWFwV3JhcHBlciwgTGlzdFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge0V2ZW50TWFuYWdlclBsdWdpbn0gZnJvbSAnLi9ldmVudF9tYW5hZ2VyJztcbmltcG9ydCB7Tmdab25lfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS96b25lL25nX3pvbmUnO1xuaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5cbnZhciBtb2RpZmllcktleXMgPSBbJ2FsdCcsICdjb250cm9sJywgJ21ldGEnLCAnc2hpZnQnXTtcbnZhciBtb2RpZmllcktleUdldHRlcnM6IHtba2V5OiBzdHJpbmddOiAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IGJvb2xlYW59ID0ge1xuICAnYWx0JzogKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiBldmVudC5hbHRLZXksXG4gICdjb250cm9sJzogKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiBldmVudC5jdHJsS2V5LFxuICAnbWV0YSc6IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4gZXZlbnQubWV0YUtleSxcbiAgJ3NoaWZ0JzogKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiBldmVudC5zaGlmdEtleVxufTtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEtleUV2ZW50c1BsdWdpbiBleHRlbmRzIEV2ZW50TWFuYWdlclBsdWdpbiB7XG4gIGNvbnN0cnVjdG9yKCkgeyBzdXBlcigpOyB9XG5cbiAgc3VwcG9ydHMoZXZlbnROYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNQcmVzZW50KEtleUV2ZW50c1BsdWdpbi5wYXJzZUV2ZW50TmFtZShldmVudE5hbWUpKTtcbiAgfVxuXG4gIGFkZEV2ZW50TGlzdGVuZXIoZWxlbWVudDogSFRNTEVsZW1lbnQsIGV2ZW50TmFtZTogc3RyaW5nLCBoYW5kbGVyOiAoRXZlbnQ6IGFueSkgPT4gYW55KSB7XG4gICAgdmFyIHBhcnNlZEV2ZW50ID0gS2V5RXZlbnRzUGx1Z2luLnBhcnNlRXZlbnROYW1lKGV2ZW50TmFtZSk7XG5cbiAgICB2YXIgb3V0c2lkZUhhbmRsZXIgPSBLZXlFdmVudHNQbHVnaW4uZXZlbnRDYWxsYmFjayhcbiAgICAgICAgZWxlbWVudCwgU3RyaW5nTWFwV3JhcHBlci5nZXQocGFyc2VkRXZlbnQsICdmdWxsS2V5JyksIGhhbmRsZXIsIHRoaXMubWFuYWdlci5nZXRab25lKCkpO1xuXG4gICAgdGhpcy5tYW5hZ2VyLmdldFpvbmUoKS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBET00ub24oZWxlbWVudCwgU3RyaW5nTWFwV3JhcHBlci5nZXQocGFyc2VkRXZlbnQsICdkb21FdmVudE5hbWUnKSwgb3V0c2lkZUhhbmRsZXIpO1xuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIHBhcnNlRXZlbnROYW1lKGV2ZW50TmFtZTogc3RyaW5nKToge1trZXk6IHN0cmluZ106IHN0cmluZ30ge1xuICAgIHZhciBwYXJ0czogc3RyaW5nW10gPSBldmVudE5hbWUudG9Mb3dlckNhc2UoKS5zcGxpdCgnLicpO1xuXG4gICAgdmFyIGRvbUV2ZW50TmFtZSA9IHBhcnRzLnNoaWZ0KCk7XG4gICAgaWYgKChwYXJ0cy5sZW5ndGggPT09IDApIHx8XG4gICAgICAgICEoU3RyaW5nV3JhcHBlci5lcXVhbHMoZG9tRXZlbnROYW1lLCAna2V5ZG93bicpIHx8XG4gICAgICAgICAgU3RyaW5nV3JhcHBlci5lcXVhbHMoZG9tRXZlbnROYW1lLCAna2V5dXAnKSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBrZXkgPSBLZXlFdmVudHNQbHVnaW4uX25vcm1hbGl6ZUtleShwYXJ0cy5wb3AoKSk7XG5cbiAgICB2YXIgZnVsbEtleSA9ICcnO1xuICAgIG1vZGlmaWVyS2V5cy5mb3JFYWNoKG1vZGlmaWVyTmFtZSA9PiB7XG4gICAgICBpZiAoTGlzdFdyYXBwZXIuY29udGFpbnMocGFydHMsIG1vZGlmaWVyTmFtZSkpIHtcbiAgICAgICAgTGlzdFdyYXBwZXIucmVtb3ZlKHBhcnRzLCBtb2RpZmllck5hbWUpO1xuICAgICAgICBmdWxsS2V5ICs9IG1vZGlmaWVyTmFtZSArICcuJztcbiAgICAgIH1cbiAgICB9KTtcbiAgICBmdWxsS2V5ICs9IGtleTtcblxuICAgIGlmIChwYXJ0cy5sZW5ndGggIT0gMCB8fCBrZXkubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyByZXR1cm5pbmcgbnVsbCBpbnN0ZWFkIG9mIHRocm93aW5nIHRvIGxldCBhbm90aGVyIHBsdWdpbiBwcm9jZXNzIHRoZSBldmVudFxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciByZXN1bHQgPSBTdHJpbmdNYXBXcmFwcGVyLmNyZWF0ZSgpO1xuICAgIFN0cmluZ01hcFdyYXBwZXIuc2V0KHJlc3VsdCwgJ2RvbUV2ZW50TmFtZScsIGRvbUV2ZW50TmFtZSk7XG4gICAgU3RyaW5nTWFwV3JhcHBlci5zZXQocmVzdWx0LCAnZnVsbEtleScsIGZ1bGxLZXkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBzdGF0aWMgZ2V0RXZlbnRGdWxsS2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogc3RyaW5nIHtcbiAgICB2YXIgZnVsbEtleSA9ICcnO1xuICAgIHZhciBrZXkgPSBET00uZ2V0RXZlbnRLZXkoZXZlbnQpO1xuICAgIGtleSA9IGtleS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChTdHJpbmdXcmFwcGVyLmVxdWFscyhrZXksICcgJykpIHtcbiAgICAgIGtleSA9ICdzcGFjZSc7ICAvLyBmb3IgcmVhZGFiaWxpdHlcbiAgICB9IGVsc2UgaWYgKFN0cmluZ1dyYXBwZXIuZXF1YWxzKGtleSwgJy4nKSkge1xuICAgICAga2V5ID0gJ2RvdCc7ICAvLyBiZWNhdXNlICcuJyBpcyB1c2VkIGFzIGEgc2VwYXJhdG9yIGluIGV2ZW50IG5hbWVzXG4gICAgfVxuICAgIG1vZGlmaWVyS2V5cy5mb3JFYWNoKG1vZGlmaWVyTmFtZSA9PiB7XG4gICAgICBpZiAobW9kaWZpZXJOYW1lICE9IGtleSkge1xuICAgICAgICB2YXIgbW9kaWZpZXJHZXR0ZXIgPSBTdHJpbmdNYXBXcmFwcGVyLmdldChtb2RpZmllcktleUdldHRlcnMsIG1vZGlmaWVyTmFtZSk7XG4gICAgICAgIGlmIChtb2RpZmllckdldHRlcihldmVudCkpIHtcbiAgICAgICAgICBmdWxsS2V5ICs9IG1vZGlmaWVyTmFtZSArICcuJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGZ1bGxLZXkgKz0ga2V5O1xuICAgIHJldHVybiBmdWxsS2V5O1xuICB9XG5cbiAgc3RhdGljIGV2ZW50Q2FsbGJhY2soZWxlbWVudDogSFRNTEVsZW1lbnQsIGZ1bGxLZXk6IGFueSwgaGFuZGxlcjogKGU6IEV2ZW50KSA9PiBhbnksXG4gICAgICAgICAgICAgICAgICAgICAgIHpvbmU6IE5nWm9uZSk6IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4gdm9pZCB7XG4gICAgcmV0dXJuIChldmVudCkgPT4ge1xuICAgICAgaWYgKFN0cmluZ1dyYXBwZXIuZXF1YWxzKEtleUV2ZW50c1BsdWdpbi5nZXRFdmVudEZ1bGxLZXkoZXZlbnQpLCBmdWxsS2V5KSkge1xuICAgICAgICB6b25lLnJ1bigoKSA9PiBoYW5kbGVyKGV2ZW50KSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgc3RhdGljIF9ub3JtYWxpemVLZXkoa2V5TmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBUT0RPOiBzd2l0Y2ggdG8gYSBTdHJpbmdNYXAgaWYgdGhlIG1hcHBpbmcgZ3Jvd3MgdG9vIG11Y2hcbiAgICBzd2l0Y2ggKGtleU5hbWUpIHtcbiAgICAgIGNhc2UgJ2VzYyc6XG4gICAgICAgIHJldHVybiAnZXNjYXBlJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBrZXlOYW1lO1xuICAgIH1cbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9ldmVudHMva2V5X2V2ZW50cy50c1xuICoqLyIsImltcG9ydCB7SGFtbWVyR2VzdHVyZXNQbHVnaW5Db21tb259IGZyb20gJy4vaGFtbWVyX2NvbW1vbic7XG5pbXBvcnQge2lzUHJlc2VudH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbiwgV3JhcHBlZEV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvZGknO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSGFtbWVyR2VzdHVyZXNQbHVnaW4gZXh0ZW5kcyBIYW1tZXJHZXN0dXJlc1BsdWdpbkNvbW1vbiB7XG4gIHN1cHBvcnRzKGV2ZW50TmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCFzdXBlci5zdXBwb3J0cyhldmVudE5hbWUpKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAoIWlzUHJlc2VudCh3aW5kb3dbJ0hhbW1lciddKSkge1xuICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYEhhbW1lci5qcyBpcyBub3QgbG9hZGVkLCBjYW4gbm90IGJpbmQgJHtldmVudE5hbWV9IGV2ZW50YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBhZGRFdmVudExpc3RlbmVyKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBldmVudE5hbWU6IHN0cmluZywgaGFuZGxlcjogRnVuY3Rpb24pIHtcbiAgICB2YXIgem9uZSA9IHRoaXMubWFuYWdlci5nZXRab25lKCk7XG4gICAgZXZlbnROYW1lID0gZXZlbnROYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICB6b25lLnJ1bk91dHNpZGVBbmd1bGFyKGZ1bmN0aW9uKCkge1xuICAgICAgLy8gQ3JlYXRpbmcgdGhlIG1hbmFnZXIgYmluZCBldmVudHMsIG11c3QgYmUgZG9uZSBvdXRzaWRlIG9mIGFuZ3VsYXJcbiAgICAgIHZhciBtYyA9IG5ldyBIYW1tZXIoZWxlbWVudCk7XG4gICAgICBtYy5nZXQoJ3BpbmNoJykuc2V0KHtlbmFibGU6IHRydWV9KTtcbiAgICAgIG1jLmdldCgncm90YXRlJykuc2V0KHtlbmFibGU6IHRydWV9KTtcblxuICAgICAgbWMub24oZXZlbnROYW1lLCBmdW5jdGlvbihldmVudE9iaikgeyB6b25lLnJ1bihmdW5jdGlvbigpIHsgaGFuZGxlcihldmVudE9iaik7IH0pOyB9KTtcbiAgICB9KTtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9ldmVudHMvaGFtbWVyX2dlc3R1cmVzLnRzXG4gKiovIiwiaW1wb3J0IHtFdmVudE1hbmFnZXJQbHVnaW59IGZyb20gJy4vZXZlbnRfbWFuYWdlcic7XG5pbXBvcnQge1N0cmluZ01hcFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5cbnZhciBfZXZlbnROYW1lcyA9IHtcbiAgLy8gcGFuXG4gICdwYW4nOiB0cnVlLFxuICAncGFuc3RhcnQnOiB0cnVlLFxuICAncGFubW92ZSc6IHRydWUsXG4gICdwYW5lbmQnOiB0cnVlLFxuICAncGFuY2FuY2VsJzogdHJ1ZSxcbiAgJ3BhbmxlZnQnOiB0cnVlLFxuICAncGFucmlnaHQnOiB0cnVlLFxuICAncGFudXAnOiB0cnVlLFxuICAncGFuZG93bic6IHRydWUsXG4gIC8vIHBpbmNoXG4gICdwaW5jaCc6IHRydWUsXG4gICdwaW5jaHN0YXJ0JzogdHJ1ZSxcbiAgJ3BpbmNobW92ZSc6IHRydWUsXG4gICdwaW5jaGVuZCc6IHRydWUsXG4gICdwaW5jaGNhbmNlbCc6IHRydWUsXG4gICdwaW5jaGluJzogdHJ1ZSxcbiAgJ3BpbmNob3V0JzogdHJ1ZSxcbiAgLy8gcHJlc3NcbiAgJ3ByZXNzJzogdHJ1ZSxcbiAgJ3ByZXNzdXAnOiB0cnVlLFxuICAvLyByb3RhdGVcbiAgJ3JvdGF0ZSc6IHRydWUsXG4gICdyb3RhdGVzdGFydCc6IHRydWUsXG4gICdyb3RhdGVtb3ZlJzogdHJ1ZSxcbiAgJ3JvdGF0ZWVuZCc6IHRydWUsXG4gICdyb3RhdGVjYW5jZWwnOiB0cnVlLFxuICAvLyBzd2lwZVxuICAnc3dpcGUnOiB0cnVlLFxuICAnc3dpcGVsZWZ0JzogdHJ1ZSxcbiAgJ3N3aXBlcmlnaHQnOiB0cnVlLFxuICAnc3dpcGV1cCc6IHRydWUsXG4gICdzd2lwZWRvd24nOiB0cnVlLFxuICAvLyB0YXBcbiAgJ3RhcCc6IHRydWUsXG59O1xuXG5cbmV4cG9ydCBjbGFzcyBIYW1tZXJHZXN0dXJlc1BsdWdpbkNvbW1vbiBleHRlbmRzIEV2ZW50TWFuYWdlclBsdWdpbiB7XG4gIGNvbnN0cnVjdG9yKCkgeyBzdXBlcigpOyB9XG5cbiAgc3VwcG9ydHMoZXZlbnROYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBldmVudE5hbWUgPSBldmVudE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gU3RyaW5nTWFwV3JhcHBlci5jb250YWlucyhfZXZlbnROYW1lcywgZXZlbnROYW1lKTtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9ldmVudHMvaGFtbWVyX2NvbW1vbi50c1xuICoqLyIsImltcG9ydCB7T3BhcXVlVG9rZW59IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpJztcbmltcG9ydCB7Q09OU1RfRVhQUn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxuLyoqXG4gKiBBIERJIFRva2VuIHJlcHJlc2VudGluZyB0aGUgbWFpbiByZW5kZXJpbmcgY29udGV4dC4gSW4gYSBicm93c2VyIHRoaXMgaXMgdGhlIERPTSBEb2N1bWVudC5cbiAqXG4gKiBOb3RlOiBEb2N1bWVudCBtaWdodCBub3QgYmUgYXZhaWxhYmxlIGluIHRoZSBBcHBsaWNhdGlvbiBDb250ZXh0IHdoZW4gQXBwbGljYXRpb24gYW5kIFJlbmRlcmluZ1xuICogQ29udGV4dHMgYXJlIG5vdCB0aGUgc2FtZSAoZS5nLiB3aGVuIHJ1bm5pbmcgdGhlIGFwcGxpY2F0aW9uIGludG8gYSBXZWIgV29ya2VyKS5cbiAqL1xuZXhwb3J0IGNvbnN0IERPQ1VNRU5UOiBPcGFxdWVUb2tlbiA9IENPTlNUX0VYUFIobmV3IE9wYXF1ZVRva2VuKCdEb2N1bWVudFRva2VuJykpO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9kb21fdG9rZW5zLnRzXG4gKiovIiwiaW1wb3J0IHtJbmplY3QsIEluamVjdGFibGUsIE9wYXF1ZVRva2VufSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5pbXBvcnQge0FuaW1hdGlvbkJ1aWxkZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9hbmltYXRlL2FuaW1hdGlvbl9idWlsZGVyJztcbmltcG9ydCB7XG4gIGlzUHJlc2VudCxcbiAgaXNCbGFuayxcbiAgSnNvbixcbiAgUmVnRXhwV3JhcHBlcixcbiAgQ09OU1RfRVhQUixcbiAgc3RyaW5naWZ5LFxuICBTdHJpbmdXcmFwcGVyXG59IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5cbmltcG9ydCB7QmFzZUV4Y2VwdGlvbiwgV3JhcHBlZEV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7RG9tU2hhcmVkU3R5bGVzSG9zdH0gZnJvbSAnLi9zaGFyZWRfc3R5bGVzX2hvc3QnO1xuaW1wb3J0IHtXdGZTY29wZUZuLCB3dGZMZWF2ZSwgd3RmQ3JlYXRlU2NvcGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL3Byb2ZpbGUvcHJvZmlsZSc7XG5cbmltcG9ydCB7XG4gIFJlbmRlcmVyLFxuICBSZW5kZXJQcm90b1ZpZXdSZWYsXG4gIFJlbmRlclZpZXdSZWYsXG4gIFJlbmRlckVsZW1lbnRSZWYsXG4gIFJlbmRlckZyYWdtZW50UmVmLFxuICBSZW5kZXJWaWV3V2l0aEZyYWdtZW50cyxcbiAgUmVuZGVyVGVtcGxhdGVDbWQsXG4gIFJlbmRlckV2ZW50RGlzcGF0Y2hlcixcbiAgUmVuZGVyQ29tcG9uZW50VGVtcGxhdGVcbn0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5cbmltcG9ydCB7RXZlbnRNYW5hZ2VyfSBmcm9tICcuL2V2ZW50cy9ldmVudF9tYW5hZ2VyJztcblxuaW1wb3J0IHtET0NVTUVOVH0gZnJvbSAnLi9kb21fdG9rZW5zJztcbmltcG9ydCB7XG4gIGNyZWF0ZVJlbmRlclZpZXcsXG4gIE5vZGVGYWN0b3J5LFxuICBlbmNhcHN1bGF0ZVN0eWxlc1xufSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9yZW5kZXIvdmlld19mYWN0b3J5JztcbmltcG9ydCB7XG4gIERlZmF1bHRSZW5kZXJWaWV3LFxuICBEZWZhdWx0UmVuZGVyRnJhZ21lbnRSZWYsXG4gIERlZmF1bHRQcm90b1ZpZXdSZWZcbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvcmVuZGVyL3ZpZXcnO1xuaW1wb3J0IHtWaWV3RW5jYXBzdWxhdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvbWV0YWRhdGEnO1xuaW1wb3J0IHtET019IGZyb20gJ2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZG9tX2FkYXB0ZXInO1xuaW1wb3J0IHtjYW1lbENhc2VUb0Rhc2hDYXNlfSBmcm9tICcuL3V0aWwnO1xuXG5jb25zdCBOQU1FU1BBQ0VfVVJJUyA9XG4gICAgQ09OU1RfRVhQUih7J3hsaW5rJzogJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsnLCAnc3ZnJzogJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJ30pO1xuY29uc3QgVEVNUExBVEVfQ09NTUVOVF9URVhUID0gJ3RlbXBsYXRlIGJpbmRpbmdzPXt9JztcbnZhciBURU1QTEFURV9CSU5ESU5HU19FWFAgPSAvXnRlbXBsYXRlIGJpbmRpbmdzPSguKikkL2c7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEb21SZW5kZXJlciBleHRlbmRzIFJlbmRlcmVyIGltcGxlbWVudHMgTm9kZUZhY3Rvcnk8Tm9kZT4ge1xuICBhYnN0cmFjdCByZWdpc3RlckNvbXBvbmVudFRlbXBsYXRlKHRlbXBsYXRlOiBSZW5kZXJDb21wb25lbnRUZW1wbGF0ZSk7XG5cbiAgYWJzdHJhY3QgcmVzb2x2ZUNvbXBvbmVudFRlbXBsYXRlKHRlbXBsYXRlSWQ6IHN0cmluZyk6IFJlbmRlckNvbXBvbmVudFRlbXBsYXRlO1xuXG4gIGFic3RyYWN0IGNyZWF0ZVByb3RvVmlldyhjb21wb25lbnRUZW1wbGF0ZUlkOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBjbWRzOiBSZW5kZXJUZW1wbGF0ZUNtZFtdKTogUmVuZGVyUHJvdG9WaWV3UmVmO1xuXG4gIGFic3RyYWN0IGNyZWF0ZVJvb3RIb3N0Vmlldyhob3N0UHJvdG9WaWV3UmVmOiBSZW5kZXJQcm90b1ZpZXdSZWYsIGZyYWdtZW50Q291bnQ6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RFbGVtZW50U2VsZWN0b3I6IHN0cmluZyk6IFJlbmRlclZpZXdXaXRoRnJhZ21lbnRzO1xuXG4gIGFic3RyYWN0IGNyZWF0ZVZpZXcocHJvdG9WaWV3UmVmOiBSZW5kZXJQcm90b1ZpZXdSZWYsXG4gICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnRDb3VudDogbnVtYmVyKTogUmVuZGVyVmlld1dpdGhGcmFnbWVudHM7XG5cbiAgYWJzdHJhY3QgZGVzdHJveVZpZXcodmlld1JlZjogUmVuZGVyVmlld1JlZik7XG5cbiAgYWJzdHJhY3QgY3JlYXRlUm9vdENvbnRlbnRJbnNlcnRpb25Qb2ludCgpO1xuXG4gIGdldE5hdGl2ZUVsZW1lbnRTeW5jKGxvY2F0aW9uOiBSZW5kZXJFbGVtZW50UmVmKTogYW55IHtcbiAgICByZXR1cm4gcmVzb2x2ZUludGVybmFsRG9tVmlldyhsb2NhdGlvbi5yZW5kZXJWaWV3KS5ib3VuZEVsZW1lbnRzW2xvY2F0aW9uLmJvdW5kRWxlbWVudEluZGV4XTtcbiAgfVxuXG4gIGdldFJvb3ROb2RlcyhmcmFnbWVudDogUmVuZGVyRnJhZ21lbnRSZWYpOiBOb2RlW10geyByZXR1cm4gcmVzb2x2ZUludGVybmFsRG9tRnJhZ21lbnQoZnJhZ21lbnQpOyB9XG5cbiAgYXR0YWNoRnJhZ21lbnRBZnRlckZyYWdtZW50KHByZXZpb3VzRnJhZ21lbnRSZWY6IFJlbmRlckZyYWdtZW50UmVmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnRSZWY6IFJlbmRlckZyYWdtZW50UmVmKSB7XG4gICAgdmFyIHByZXZpb3VzRnJhZ21lbnROb2RlcyA9IHJlc29sdmVJbnRlcm5hbERvbUZyYWdtZW50KHByZXZpb3VzRnJhZ21lbnRSZWYpO1xuICAgIGlmIChwcmV2aW91c0ZyYWdtZW50Tm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgdmFyIHNpYmxpbmcgPSBwcmV2aW91c0ZyYWdtZW50Tm9kZXNbcHJldmlvdXNGcmFnbWVudE5vZGVzLmxlbmd0aCAtIDFdO1xuICAgICAgbGV0IG5vZGVzID0gcmVzb2x2ZUludGVybmFsRG9tRnJhZ21lbnQoZnJhZ21lbnRSZWYpO1xuICAgICAgbW92ZU5vZGVzQWZ0ZXJTaWJsaW5nKHNpYmxpbmcsIG5vZGVzKTtcbiAgICAgIHRoaXMuYW5pbWF0ZU5vZGVzRW50ZXIobm9kZXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRlcyB0aHJvdWdoIGFsbCBub2RlcyBiZWluZyBhZGRlZCB0byB0aGUgRE9NIGFuZCBhbmltYXRlcyB0aGVtIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gbm9kZXNcbiAgICovXG4gIGFuaW1hdGVOb2Rlc0VudGVyKG5vZGVzOiBOb2RlW10pIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB0aGlzLmFuaW1hdGVOb2RlRW50ZXIobm9kZXNbaV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIGFuaW1hdGlvbnMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBub2RlXG4gICAqL1xuICBhYnN0cmFjdCBhbmltYXRlTm9kZUVudGVyKG5vZGU6IE5vZGUpO1xuXG4gIC8qKlxuICAgKiBJZiBhbmltYXRpb25zIGFyZSBuZWNlc3NhcnksIHBlcmZvcm1zIGFuaW1hdGlvbnMgdGhlbiByZW1vdmVzIHRoZSBlbGVtZW50OyBvdGhlcndpc2UsIGl0IGp1c3RcbiAgICogcmVtb3ZlcyB0aGUgZWxlbWVudC5cbiAgICogQHBhcmFtIG5vZGVcbiAgICovXG4gIGFic3RyYWN0IGFuaW1hdGVOb2RlTGVhdmUobm9kZTogTm9kZSk7XG5cbiAgYXR0YWNoRnJhZ21lbnRBZnRlckVsZW1lbnQoZWxlbWVudFJlZjogUmVuZGVyRWxlbWVudFJlZiwgZnJhZ21lbnRSZWY6IFJlbmRlckZyYWdtZW50UmVmKSB7XG4gICAgdmFyIHBhcmVudFZpZXcgPSByZXNvbHZlSW50ZXJuYWxEb21WaWV3KGVsZW1lbnRSZWYucmVuZGVyVmlldyk7XG4gICAgdmFyIGVsZW1lbnQgPSBwYXJlbnRWaWV3LmJvdW5kRWxlbWVudHNbZWxlbWVudFJlZi5ib3VuZEVsZW1lbnRJbmRleF07XG4gICAgdmFyIG5vZGVzID0gcmVzb2x2ZUludGVybmFsRG9tRnJhZ21lbnQoZnJhZ21lbnRSZWYpO1xuICAgIG1vdmVOb2Rlc0FmdGVyU2libGluZyhlbGVtZW50LCBub2Rlcyk7XG4gICAgdGhpcy5hbmltYXRlTm9kZXNFbnRlcihub2Rlcyk7XG4gIH1cblxuICBhYnN0cmFjdCBkZXRhY2hGcmFnbWVudChmcmFnbWVudFJlZjogUmVuZGVyRnJhZ21lbnRSZWYpO1xuXG4gIGh5ZHJhdGVWaWV3KHZpZXdSZWY6IFJlbmRlclZpZXdSZWYpIHsgcmVzb2x2ZUludGVybmFsRG9tVmlldyh2aWV3UmVmKS5oeWRyYXRlKCk7IH1cblxuICBkZWh5ZHJhdGVWaWV3KHZpZXdSZWY6IFJlbmRlclZpZXdSZWYpIHsgcmVzb2x2ZUludGVybmFsRG9tVmlldyh2aWV3UmVmKS5kZWh5ZHJhdGUoKTsgfVxuXG4gIGNyZWF0ZVRlbXBsYXRlQW5jaG9yKGF0dHJOYW1lQW5kVmFsdWVzOiBzdHJpbmdbXSk6IE5vZGUge1xuICAgIHJldHVybiBET00uY3JlYXRlQ29tbWVudChURU1QTEFURV9DT01NRU5UX1RFWFQpO1xuICB9XG4gIGFic3RyYWN0IGNyZWF0ZUVsZW1lbnQobmFtZTogc3RyaW5nLCBhdHRyTmFtZUFuZFZhbHVlczogc3RyaW5nW10pOiBOb2RlO1xuICBhYnN0cmFjdCBtZXJnZUVsZW1lbnQoZXhpc3Rpbmc6IE5vZGUsIGF0dHJOYW1lQW5kVmFsdWVzOiBzdHJpbmdbXSk7XG4gIGFic3RyYWN0IGNyZWF0ZVNoYWRvd1Jvb3QoaG9zdDogTm9kZSwgdGVtcGxhdGVJZDogc3RyaW5nKTogTm9kZTtcbiAgY3JlYXRlVGV4dCh2YWx1ZTogc3RyaW5nKTogTm9kZSB7IHJldHVybiBET00uY3JlYXRlVGV4dE5vZGUoaXNQcmVzZW50KHZhbHVlKSA/IHZhbHVlIDogJycpOyB9XG4gIGFwcGVuZENoaWxkKHBhcmVudDogTm9kZSwgY2hpbGQ6IE5vZGUpIHsgRE9NLmFwcGVuZENoaWxkKHBhcmVudCwgY2hpbGQpOyB9XG4gIGFic3RyYWN0IG9uKGVsZW1lbnQ6IE5vZGUsIGV2ZW50TmFtZTogc3RyaW5nLCBjYWxsYmFjazogRnVuY3Rpb24pO1xuICBhYnN0cmFjdCBnbG9iYWxPbih0YXJnZXQ6IHN0cmluZywgZXZlbnROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiBGdW5jdGlvbik6IEZ1bmN0aW9uO1xuXG4gIHNldEVsZW1lbnRQcm9wZXJ0eShsb2NhdGlvbjogUmVuZGVyRWxlbWVudFJlZiwgcHJvcGVydHlOYW1lOiBzdHJpbmcsIHByb3BlcnR5VmFsdWU6IGFueSk6IHZvaWQge1xuICAgIHZhciB2aWV3ID0gcmVzb2x2ZUludGVybmFsRG9tVmlldyhsb2NhdGlvbi5yZW5kZXJWaWV3KTtcbiAgICBET00uc2V0UHJvcGVydHkoPEVsZW1lbnQ+dmlldy5ib3VuZEVsZW1lbnRzW2xvY2F0aW9uLmJvdW5kRWxlbWVudEluZGV4XSwgcHJvcGVydHlOYW1lLFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlKTtcbiAgfVxuXG4gIHNldEVsZW1lbnRBdHRyaWJ1dGUobG9jYXRpb246IFJlbmRlckVsZW1lbnRSZWYsIGF0dHJpYnV0ZU5hbWU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdmFyIHZpZXcgPSByZXNvbHZlSW50ZXJuYWxEb21WaWV3KGxvY2F0aW9uLnJlbmRlclZpZXcpO1xuICAgIHZhciBlbGVtZW50ID0gdmlldy5ib3VuZEVsZW1lbnRzW2xvY2F0aW9uLmJvdW5kRWxlbWVudEluZGV4XTtcbiAgICBpZiAoaXNQcmVzZW50KGF0dHJpYnV0ZVZhbHVlKSkge1xuICAgICAgRE9NLnNldEF0dHJpYnV0ZShlbGVtZW50LCBhdHRyaWJ1dGVOYW1lLCBzdHJpbmdpZnkoYXR0cmlidXRlVmFsdWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgRE9NLnJlbW92ZUF0dHJpYnV0ZShlbGVtZW50LCBhdHRyaWJ1dGVOYW1lKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBvbmx5IGluIGRlYnVnIG1vZGUgdG8gc2VyaWFsaXplIHByb3BlcnR5IGNoYW5nZXMgdG8gY29tbWVudCBub2RlcyxcbiAgICogc3VjaCBhcyA8dGVtcGxhdGU+IHBsYWNlaG9sZGVycy5cbiAgICovXG4gIHNldEJpbmRpbmdEZWJ1Z0luZm8obG9jYXRpb246IFJlbmRlckVsZW1lbnRSZWYsIHByb3BlcnR5TmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHZhciB2aWV3OiBEZWZhdWx0UmVuZGVyVmlldzxOb2RlPiA9IHJlc29sdmVJbnRlcm5hbERvbVZpZXcobG9jYXRpb24ucmVuZGVyVmlldyk7XG4gICAgdmFyIGVsZW1lbnQgPSB2aWV3LmJvdW5kRWxlbWVudHNbbG9jYXRpb24uYm91bmRFbGVtZW50SW5kZXhdO1xuICAgIHZhciBkYXNoQ2FzZWRQcm9wZXJ0eU5hbWUgPSBjYW1lbENhc2VUb0Rhc2hDYXNlKHByb3BlcnR5TmFtZSk7XG4gICAgaWYgKERPTS5pc0NvbW1lbnROb2RlKGVsZW1lbnQpKSB7XG4gICAgICB2YXIgZXhpc3RpbmdCaW5kaW5ncyA9IFJlZ0V4cFdyYXBwZXIuZmlyc3RNYXRjaChcbiAgICAgICAgICBURU1QTEFURV9CSU5ESU5HU19FWFAsIFN0cmluZ1dyYXBwZXIucmVwbGFjZUFsbChET00uZ2V0VGV4dChlbGVtZW50KSwgL1xcbi9nLCAnJykpO1xuICAgICAgdmFyIHBhcnNlZEJpbmRpbmdzID0gSnNvbi5wYXJzZShleGlzdGluZ0JpbmRpbmdzWzFdKTtcbiAgICAgIHBhcnNlZEJpbmRpbmdzW2Rhc2hDYXNlZFByb3BlcnR5TmFtZV0gPSBwcm9wZXJ0eVZhbHVlO1xuICAgICAgRE9NLnNldFRleHQoZWxlbWVudCwgU3RyaW5nV3JhcHBlci5yZXBsYWNlKFRFTVBMQVRFX0NPTU1FTlRfVEVYVCwgJ3t9JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKc29uLnN0cmluZ2lmeShwYXJzZWRCaW5kaW5ncykpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRFbGVtZW50QXR0cmlidXRlKGxvY2F0aW9uLCBwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHNldEVsZW1lbnRDbGFzcyhsb2NhdGlvbjogUmVuZGVyRWxlbWVudFJlZiwgY2xhc3NOYW1lOiBzdHJpbmcsIGlzQWRkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdmFyIHZpZXcgPSByZXNvbHZlSW50ZXJuYWxEb21WaWV3KGxvY2F0aW9uLnJlbmRlclZpZXcpO1xuICAgIHZhciBlbGVtZW50ID0gdmlldy5ib3VuZEVsZW1lbnRzW2xvY2F0aW9uLmJvdW5kRWxlbWVudEluZGV4XTtcbiAgICBpZiAoaXNBZGQpIHtcbiAgICAgIERPTS5hZGRDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBET00ucmVtb3ZlQ2xhc3MoZWxlbWVudCwgY2xhc3NOYW1lKTtcbiAgICB9XG4gIH1cblxuICBzZXRFbGVtZW50U3R5bGUobG9jYXRpb246IFJlbmRlckVsZW1lbnRSZWYsIHN0eWxlTmFtZTogc3RyaW5nLCBzdHlsZVZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB2YXIgdmlldyA9IHJlc29sdmVJbnRlcm5hbERvbVZpZXcobG9jYXRpb24ucmVuZGVyVmlldyk7XG4gICAgdmFyIGVsZW1lbnQgPSB2aWV3LmJvdW5kRWxlbWVudHNbbG9jYXRpb24uYm91bmRFbGVtZW50SW5kZXhdO1xuICAgIGlmIChpc1ByZXNlbnQoc3R5bGVWYWx1ZSkpIHtcbiAgICAgIERPTS5zZXRTdHlsZShlbGVtZW50LCBzdHlsZU5hbWUsIHN0cmluZ2lmeShzdHlsZVZhbHVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIERPTS5yZW1vdmVTdHlsZShlbGVtZW50LCBzdHlsZU5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIGludm9rZUVsZW1lbnRNZXRob2QobG9jYXRpb246IFJlbmRlckVsZW1lbnRSZWYsIG1ldGhvZE5hbWU6IHN0cmluZywgYXJnczogYW55W10pOiB2b2lkIHtcbiAgICB2YXIgdmlldyA9IHJlc29sdmVJbnRlcm5hbERvbVZpZXcobG9jYXRpb24ucmVuZGVyVmlldyk7XG4gICAgdmFyIGVsZW1lbnQgPSA8RWxlbWVudD52aWV3LmJvdW5kRWxlbWVudHNbbG9jYXRpb24uYm91bmRFbGVtZW50SW5kZXhdO1xuICAgIERPTS5pbnZva2UoZWxlbWVudCwgbWV0aG9kTmFtZSwgYXJncyk7XG4gIH1cblxuICBzZXRUZXh0KHZpZXdSZWY6IFJlbmRlclZpZXdSZWYsIHRleHROb2RlSW5kZXg6IG51bWJlciwgdGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgdmFyIHZpZXcgPSByZXNvbHZlSW50ZXJuYWxEb21WaWV3KHZpZXdSZWYpO1xuICAgIERPTS5zZXRUZXh0KHZpZXcuYm91bmRUZXh0Tm9kZXNbdGV4dE5vZGVJbmRleF0sIHRleHQpO1xuICB9XG5cbiAgc2V0RXZlbnREaXNwYXRjaGVyKHZpZXdSZWY6IFJlbmRlclZpZXdSZWYsIGRpc3BhdGNoZXI6IFJlbmRlckV2ZW50RGlzcGF0Y2hlcik6IHZvaWQge1xuICAgIHJlc29sdmVJbnRlcm5hbERvbVZpZXcodmlld1JlZikuc2V0RXZlbnREaXNwYXRjaGVyKGRpc3BhdGNoZXIpO1xuICB9XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEb21SZW5kZXJlcl8gZXh0ZW5kcyBEb21SZW5kZXJlciB7XG4gIHByaXZhdGUgX2NvbXBvbmVudFRwbHM6IE1hcDxzdHJpbmcsIFJlbmRlckNvbXBvbmVudFRlbXBsYXRlPiA9XG4gICAgICBuZXcgTWFwPHN0cmluZywgUmVuZGVyQ29tcG9uZW50VGVtcGxhdGU+KCk7XG4gIHByaXZhdGUgX2RvY3VtZW50O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2V2ZW50TWFuYWdlcjogRXZlbnRNYW5hZ2VyLFxuICAgICAgICAgICAgICBwcml2YXRlIF9kb21TaGFyZWRTdHlsZXNIb3N0OiBEb21TaGFyZWRTdHlsZXNIb3N0LCBwcml2YXRlIF9hbmltYXRlOiBBbmltYXRpb25CdWlsZGVyLFxuICAgICAgICAgICAgICBASW5qZWN0KERPQ1VNRU5UKSBkb2N1bWVudCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fZG9jdW1lbnQgPSBkb2N1bWVudDtcbiAgfVxuXG4gIHJlZ2lzdGVyQ29tcG9uZW50VGVtcGxhdGUodGVtcGxhdGU6IFJlbmRlckNvbXBvbmVudFRlbXBsYXRlKSB7XG4gICAgdGhpcy5fY29tcG9uZW50VHBscy5zZXQodGVtcGxhdGUuaWQsIHRlbXBsYXRlKTtcbiAgICBpZiAodGVtcGxhdGUuZW5jYXBzdWxhdGlvbiAhPT0gVmlld0VuY2Fwc3VsYXRpb24uTmF0aXZlKSB7XG4gICAgICB2YXIgZW5jYXBzdWxhdGVkU3R5bGVzID0gZW5jYXBzdWxhdGVTdHlsZXModGVtcGxhdGUpO1xuICAgICAgdGhpcy5fZG9tU2hhcmVkU3R5bGVzSG9zdC5hZGRTdHlsZXMoZW5jYXBzdWxhdGVkU3R5bGVzKTtcbiAgICB9XG4gIH1cblxuICBjcmVhdGVQcm90b1ZpZXcoY29tcG9uZW50VGVtcGxhdGVJZDogc3RyaW5nLCBjbWRzOiBSZW5kZXJUZW1wbGF0ZUNtZFtdKTogUmVuZGVyUHJvdG9WaWV3UmVmIHtcbiAgICByZXR1cm4gbmV3IERlZmF1bHRQcm90b1ZpZXdSZWYodGhpcy5fY29tcG9uZW50VHBscy5nZXQoY29tcG9uZW50VGVtcGxhdGVJZCksIGNtZHMpO1xuICB9XG5cbiAgcmVzb2x2ZUNvbXBvbmVudFRlbXBsYXRlKHRlbXBsYXRlSWQ6IHN0cmluZyk6IFJlbmRlckNvbXBvbmVudFRlbXBsYXRlIHtcbiAgICByZXR1cm4gdGhpcy5fY29tcG9uZW50VHBscy5nZXQodGVtcGxhdGVJZCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9jcmVhdGVSb290SG9zdFZpZXdTY29wZTogV3RmU2NvcGVGbiA9IHd0ZkNyZWF0ZVNjb3BlKCdEb21SZW5kZXJlciNjcmVhdGVSb290SG9zdFZpZXcoKScpO1xuICBjcmVhdGVSb290SG9zdFZpZXcoaG9zdFByb3RvVmlld1JlZjogUmVuZGVyUHJvdG9WaWV3UmVmLCBmcmFnbWVudENvdW50OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICBob3N0RWxlbWVudFNlbGVjdG9yOiBzdHJpbmcpOiBSZW5kZXJWaWV3V2l0aEZyYWdtZW50cyB7XG4gICAgdmFyIHMgPSB0aGlzLl9jcmVhdGVSb290SG9zdFZpZXdTY29wZSgpO1xuICAgIHZhciBlbGVtZW50ID0gRE9NLnF1ZXJ5U2VsZWN0b3IodGhpcy5fZG9jdW1lbnQsIGhvc3RFbGVtZW50U2VsZWN0b3IpO1xuICAgIGlmIChpc0JsYW5rKGVsZW1lbnQpKSB7XG4gICAgICB3dGZMZWF2ZShzKTtcbiAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBUaGUgc2VsZWN0b3IgXCIke2hvc3RFbGVtZW50U2VsZWN0b3J9XCIgZGlkIG5vdCBtYXRjaCBhbnkgZWxlbWVudHNgKTtcbiAgICB9XG4gICAgcmV0dXJuIHd0ZkxlYXZlKHMsIHRoaXMuX2NyZWF0ZVZpZXcoaG9zdFByb3RvVmlld1JlZiwgZWxlbWVudCkpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfY3JlYXRlVmlld1Njb3BlID0gd3RmQ3JlYXRlU2NvcGUoJ0RvbVJlbmRlcmVyI2NyZWF0ZVZpZXcoKScpO1xuICBjcmVhdGVWaWV3KHByb3RvVmlld1JlZjogUmVuZGVyUHJvdG9WaWV3UmVmLCBmcmFnbWVudENvdW50OiBudW1iZXIpOiBSZW5kZXJWaWV3V2l0aEZyYWdtZW50cyB7XG4gICAgdmFyIHMgPSB0aGlzLl9jcmVhdGVWaWV3U2NvcGUoKTtcbiAgICByZXR1cm4gd3RmTGVhdmUocywgdGhpcy5fY3JlYXRlVmlldyhwcm90b1ZpZXdSZWYsIG51bGwpKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZVZpZXcocHJvdG9WaWV3UmVmOiBSZW5kZXJQcm90b1ZpZXdSZWYsXG4gICAgICAgICAgICAgICAgICAgICAgaW5wbGFjZUVsZW1lbnQ6IEhUTUxFbGVtZW50KTogUmVuZGVyVmlld1dpdGhGcmFnbWVudHMge1xuICAgIHZhciBkcHZyID0gPERlZmF1bHRQcm90b1ZpZXdSZWY+cHJvdG9WaWV3UmVmO1xuICAgIHZhciB2aWV3ID0gY3JlYXRlUmVuZGVyVmlldyhkcHZyLnRlbXBsYXRlLCBkcHZyLmNtZHMsIGlucGxhY2VFbGVtZW50LCB0aGlzKTtcbiAgICB2YXIgc2RSb290cyA9IHZpZXcubmF0aXZlU2hhZG93Um9vdHM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZFJvb3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLl9kb21TaGFyZWRTdHlsZXNIb3N0LmFkZEhvc3Qoc2RSb290c1tpXSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgUmVuZGVyVmlld1dpdGhGcmFnbWVudHModmlldywgdmlldy5mcmFnbWVudHMpO1xuICB9XG5cbiAgZGVzdHJveVZpZXcodmlld1JlZjogUmVuZGVyVmlld1JlZikge1xuICAgIHZhciB2aWV3ID0gPERlZmF1bHRSZW5kZXJWaWV3PE5vZGU+PnZpZXdSZWY7XG4gICAgdmFyIHNkUm9vdHMgPSB2aWV3Lm5hdGl2ZVNoYWRvd1Jvb3RzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2RSb290cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5fZG9tU2hhcmVkU3R5bGVzSG9zdC5yZW1vdmVIb3N0KHNkUm9vdHNbaV0pO1xuICAgIH1cbiAgfVxuXG4gIGFuaW1hdGVOb2RlRW50ZXIobm9kZTogTm9kZSkge1xuICAgIGlmIChET00uaXNFbGVtZW50Tm9kZShub2RlKSAmJiBET00uaGFzQ2xhc3Mobm9kZSwgJ25nLWFuaW1hdGUnKSkge1xuICAgICAgRE9NLmFkZENsYXNzKG5vZGUsICduZy1lbnRlcicpO1xuICAgICAgdGhpcy5fYW5pbWF0ZS5jc3MoKVxuICAgICAgICAgIC5hZGRBbmltYXRpb25DbGFzcygnbmctZW50ZXItYWN0aXZlJylcbiAgICAgICAgICAuc3RhcnQoPEhUTUxFbGVtZW50Pm5vZGUpXG4gICAgICAgICAgLm9uQ29tcGxldGUoKCkgPT4geyBET00ucmVtb3ZlQ2xhc3Mobm9kZSwgJ25nLWVudGVyJyk7IH0pO1xuICAgIH1cbiAgfVxuXG4gIGFuaW1hdGVOb2RlTGVhdmUobm9kZTogTm9kZSkge1xuICAgIGlmIChET00uaXNFbGVtZW50Tm9kZShub2RlKSAmJiBET00uaGFzQ2xhc3Mobm9kZSwgJ25nLWFuaW1hdGUnKSkge1xuICAgICAgRE9NLmFkZENsYXNzKG5vZGUsICduZy1sZWF2ZScpO1xuICAgICAgdGhpcy5fYW5pbWF0ZS5jc3MoKVxuICAgICAgICAgIC5hZGRBbmltYXRpb25DbGFzcygnbmctbGVhdmUtYWN0aXZlJylcbiAgICAgICAgICAuc3RhcnQoPEhUTUxFbGVtZW50Pm5vZGUpXG4gICAgICAgICAgLm9uQ29tcGxldGUoKCkgPT4ge1xuICAgICAgICAgICAgRE9NLnJlbW92ZUNsYXNzKG5vZGUsICduZy1sZWF2ZScpO1xuICAgICAgICAgICAgRE9NLnJlbW92ZShub2RlKTtcbiAgICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgRE9NLnJlbW92ZShub2RlKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9kZXRhY2hGcmFnbWVudFNjb3BlID0gd3RmQ3JlYXRlU2NvcGUoJ0RvbVJlbmRlcmVyI2RldGFjaEZyYWdtZW50KCknKTtcbiAgZGV0YWNoRnJhZ21lbnQoZnJhZ21lbnRSZWY6IFJlbmRlckZyYWdtZW50UmVmKSB7XG4gICAgdmFyIHMgPSB0aGlzLl9kZXRhY2hGcmFnbWVudFNjb3BlKCk7XG4gICAgdmFyIGZyYWdtZW50Tm9kZXMgPSByZXNvbHZlSW50ZXJuYWxEb21GcmFnbWVudChmcmFnbWVudFJlZik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmcmFnbWVudE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmFuaW1hdGVOb2RlTGVhdmUoZnJhZ21lbnROb2Rlc1tpXSk7XG4gICAgfVxuICAgIHd0ZkxlYXZlKHMpO1xuICB9XG4gIGNyZWF0ZUVsZW1lbnQobmFtZTogc3RyaW5nLCBhdHRyTmFtZUFuZFZhbHVlczogc3RyaW5nW10pOiBOb2RlIHtcbiAgICB2YXIgbnNBbmROYW1lID0gc3BsaXROYW1lc3BhY2UobmFtZSk7XG4gICAgdmFyIGVsID0gaXNQcmVzZW50KG5zQW5kTmFtZVswXSkgP1xuICAgICAgICAgICAgICAgICBET00uY3JlYXRlRWxlbWVudE5TKE5BTUVTUEFDRV9VUklTW25zQW5kTmFtZVswXV0sIG5zQW5kTmFtZVsxXSkgOlxuICAgICAgICAgICAgICAgICBET00uY3JlYXRlRWxlbWVudChuc0FuZE5hbWVbMV0pO1xuICAgIHRoaXMuX3NldEF0dHJpYnV0ZXMoZWwsIGF0dHJOYW1lQW5kVmFsdWVzKTtcbiAgICByZXR1cm4gZWw7XG4gIH1cbiAgbWVyZ2VFbGVtZW50KGV4aXN0aW5nOiBOb2RlLCBhdHRyTmFtZUFuZFZhbHVlczogc3RyaW5nW10pIHtcbiAgICBET00uY2xlYXJOb2RlcyhleGlzdGluZyk7XG4gICAgdGhpcy5fc2V0QXR0cmlidXRlcyhleGlzdGluZywgYXR0ck5hbWVBbmRWYWx1ZXMpO1xuICB9XG4gIHByaXZhdGUgX3NldEF0dHJpYnV0ZXMobm9kZTogTm9kZSwgYXR0ck5hbWVBbmRWYWx1ZXM6IHN0cmluZ1tdKSB7XG4gICAgZm9yICh2YXIgYXR0cklkeCA9IDA7IGF0dHJJZHggPCBhdHRyTmFtZUFuZFZhbHVlcy5sZW5ndGg7IGF0dHJJZHggKz0gMikge1xuICAgICAgdmFyIGF0dHJOcztcbiAgICAgIHZhciBhdHRyTmFtZSA9IGF0dHJOYW1lQW5kVmFsdWVzW2F0dHJJZHhdO1xuICAgICAgdmFyIG5zQW5kTmFtZSA9IHNwbGl0TmFtZXNwYWNlKGF0dHJOYW1lKTtcbiAgICAgIGlmIChpc1ByZXNlbnQobnNBbmROYW1lWzBdKSkge1xuICAgICAgICBhdHRyTmFtZSA9IG5zQW5kTmFtZVswXSArICc6JyArIG5zQW5kTmFtZVsxXTtcbiAgICAgICAgYXR0ck5zID0gTkFNRVNQQUNFX1VSSVNbbnNBbmROYW1lWzBdXTtcbiAgICAgIH1cbiAgICAgIHZhciBhdHRyVmFsdWUgPSBhdHRyTmFtZUFuZFZhbHVlc1thdHRySWR4ICsgMV07XG4gICAgICBpZiAoaXNQcmVzZW50KGF0dHJOcykpIHtcbiAgICAgICAgRE9NLnNldEF0dHJpYnV0ZU5TKG5vZGUsIGF0dHJOcywgYXR0ck5hbWUsIGF0dHJWYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBET00uc2V0QXR0cmlidXRlKG5vZGUsIG5zQW5kTmFtZVsxXSwgYXR0clZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY3JlYXRlUm9vdENvbnRlbnRJbnNlcnRpb25Qb2ludCgpOiBOb2RlIHtcbiAgICByZXR1cm4gRE9NLmNyZWF0ZUNvbW1lbnQoJ3Jvb3QtY29udGVudC1pbnNlcnRpb24tcG9pbnQnKTtcbiAgfVxuICBjcmVhdGVTaGFkb3dSb290KGhvc3Q6IE5vZGUsIHRlbXBsYXRlSWQ6IHN0cmluZyk6IE5vZGUge1xuICAgIHZhciBzciA9IERPTS5jcmVhdGVTaGFkb3dSb290KGhvc3QpO1xuICAgIHZhciB0cGwgPSB0aGlzLl9jb21wb25lbnRUcGxzLmdldCh0ZW1wbGF0ZUlkKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRwbC5zdHlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIERPTS5hcHBlbmRDaGlsZChzciwgRE9NLmNyZWF0ZVN0eWxlRWxlbWVudCh0cGwuc3R5bGVzW2ldKSk7XG4gICAgfVxuICAgIHJldHVybiBzcjtcbiAgfVxuICBvbihlbGVtZW50OiBOb2RlLCBldmVudE5hbWU6IHN0cmluZywgY2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG4gICAgdGhpcy5fZXZlbnRNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoPEhUTUxFbGVtZW50PmVsZW1lbnQsIGV2ZW50TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvcmF0ZVByZXZlbnREZWZhdWx0KGNhbGxiYWNrKSk7XG4gIH1cbiAgZ2xvYmFsT24odGFyZ2V0OiBzdHJpbmcsIGV2ZW50TmFtZTogc3RyaW5nLCBjYWxsYmFjazogRnVuY3Rpb24pOiBGdW5jdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50TWFuYWdlci5hZGRHbG9iYWxFdmVudExpc3RlbmVyKHRhcmdldCwgZXZlbnROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvcmF0ZVByZXZlbnREZWZhdWx0KGNhbGxiYWNrKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUludGVybmFsRG9tVmlldyh2aWV3UmVmOiBSZW5kZXJWaWV3UmVmKTogRGVmYXVsdFJlbmRlclZpZXc8Tm9kZT4ge1xuICByZXR1cm4gPERlZmF1bHRSZW5kZXJWaWV3PE5vZGU+PnZpZXdSZWY7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVJbnRlcm5hbERvbUZyYWdtZW50KGZyYWdtZW50UmVmOiBSZW5kZXJGcmFnbWVudFJlZik6IE5vZGVbXSB7XG4gIHJldHVybiAoPERlZmF1bHRSZW5kZXJGcmFnbWVudFJlZjxOb2RlPj5mcmFnbWVudFJlZikubm9kZXM7XG59XG5cbmZ1bmN0aW9uIG1vdmVOb2Rlc0FmdGVyU2libGluZyhzaWJsaW5nLCBub2Rlcykge1xuICB2YXIgcGFyZW50ID0gRE9NLnBhcmVudEVsZW1lbnQoc2libGluZyk7XG4gIGlmIChub2Rlcy5sZW5ndGggPiAwICYmIGlzUHJlc2VudChwYXJlbnQpKSB7XG4gICAgdmFyIG5leHRTaWJsaW5nID0gRE9NLm5leHRTaWJsaW5nKHNpYmxpbmcpO1xuICAgIGlmIChpc1ByZXNlbnQobmV4dFNpYmxpbmcpKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIERPTS5pbnNlcnRCZWZvcmUobmV4dFNpYmxpbmcsIG5vZGVzW2ldKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBET00uYXBwZW5kQ2hpbGQocGFyZW50LCBub2Rlc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRlY29yYXRlUHJldmVudERlZmF1bHQoZXZlbnRIYW5kbGVyOiBGdW5jdGlvbik6IEZ1bmN0aW9uIHtcbiAgcmV0dXJuIChldmVudCkgPT4ge1xuICAgIHZhciBhbGxvd0RlZmF1bHRCZWhhdmlvciA9IGV2ZW50SGFuZGxlcihldmVudCk7XG4gICAgaWYgKCFhbGxvd0RlZmF1bHRCZWhhdmlvcikge1xuICAgICAgLy8gVE9ETyh0Ym9zY2gpOiBtb3ZlIHByZXZlbnREZWZhdWx0IGludG8gZXZlbnQgcGx1Z2lucy4uLlxuICAgICAgRE9NLnByZXZlbnREZWZhdWx0KGV2ZW50KTtcbiAgICB9XG4gIH07XG59XG5cbnZhciBOU19QUkVGSVhfUkUgPSAvXkAoW146XSspOiguKykvZztcblxuZnVuY3Rpb24gc3BsaXROYW1lc3BhY2UobmFtZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICBpZiAobmFtZVswXSAhPSAnQCcpIHtcbiAgICByZXR1cm4gW251bGwsIG5hbWVdO1xuICB9XG4gIGxldCBtYXRjaCA9IFJlZ0V4cFdyYXBwZXIuZmlyc3RNYXRjaChOU19QUkVGSVhfUkUsIG5hbWUpO1xuICByZXR1cm4gW21hdGNoWzFdLCBtYXRjaFsyXV07XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2RvbV9yZW5kZXJlci50c1xuICoqLyIsImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvZGknO1xuXG5pbXBvcnQge0Nzc0FuaW1hdGlvbkJ1aWxkZXJ9IGZyb20gJy4vY3NzX2FuaW1hdGlvbl9idWlsZGVyJztcbmltcG9ydCB7QnJvd3NlckRldGFpbHN9IGZyb20gJy4vYnJvd3Nlcl9kZXRhaWxzJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEFuaW1hdGlvbkJ1aWxkZXIge1xuICAvKipcbiAgICogVXNlZCBmb3IgRElcbiAgICogQHBhcmFtIGJyb3dzZXJEZXRhaWxzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgYnJvd3NlckRldGFpbHM6IEJyb3dzZXJEZXRhaWxzKSB7fVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IENTUyBBbmltYXRpb25cbiAgICogQHJldHVybnMge0Nzc0FuaW1hdGlvbkJ1aWxkZXJ9XG4gICAqL1xuICBjc3MoKTogQ3NzQW5pbWF0aW9uQnVpbGRlciB7IHJldHVybiBuZXcgQ3NzQW5pbWF0aW9uQnVpbGRlcih0aGlzLmJyb3dzZXJEZXRhaWxzKTsgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2FuaW1hdGUvYW5pbWF0aW9uX2J1aWxkZXIudHNcbiAqKi8iLCJpbXBvcnQge0Nzc0FuaW1hdGlvbk9wdGlvbnN9IGZyb20gJy4vY3NzX2FuaW1hdGlvbl9vcHRpb25zJztcbmltcG9ydCB7QW5pbWF0aW9ufSBmcm9tICcuL2FuaW1hdGlvbic7XG5pbXBvcnQge0Jyb3dzZXJEZXRhaWxzfSBmcm9tICcuL2Jyb3dzZXJfZGV0YWlscyc7XG5cbmV4cG9ydCBjbGFzcyBDc3NBbmltYXRpb25CdWlsZGVyIHtcbiAgLyoqIEB0eXBlIHtDc3NBbmltYXRpb25PcHRpb25zfSAqL1xuICBkYXRhOiBDc3NBbmltYXRpb25PcHRpb25zID0gbmV3IENzc0FuaW1hdGlvbk9wdGlvbnMoKTtcblxuICAvKipcbiAgICogQWNjZXB0cyBwdWJsaWMgcHJvcGVydGllcyBmb3IgQ3NzQW5pbWF0aW9uQnVpbGRlclxuICAgKi9cbiAgY29uc3RydWN0b3IocHVibGljIGJyb3dzZXJEZXRhaWxzOiBCcm93c2VyRGV0YWlscykge31cblxuICAvKipcbiAgICogQWRkcyBhIHRlbXBvcmFyeSBjbGFzcyB0aGF0IHdpbGwgYmUgcmVtb3ZlZCBhdCB0aGUgZW5kIG9mIHRoZSBhbmltYXRpb25cbiAgICogQHBhcmFtIGNsYXNzTmFtZVxuICAgKi9cbiAgYWRkQW5pbWF0aW9uQ2xhc3MoY2xhc3NOYW1lOiBzdHJpbmcpOiBDc3NBbmltYXRpb25CdWlsZGVyIHtcbiAgICB0aGlzLmRhdGEuYW5pbWF0aW9uQ2xhc3Nlcy5wdXNoKGNsYXNzTmFtZSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNsYXNzIHRoYXQgd2lsbCByZW1haW4gb24gdGhlIGVsZW1lbnQgYWZ0ZXIgdGhlIGFuaW1hdGlvbiBoYXMgZmluaXNoZWRcbiAgICogQHBhcmFtIGNsYXNzTmFtZVxuICAgKi9cbiAgYWRkQ2xhc3MoY2xhc3NOYW1lOiBzdHJpbmcpOiBDc3NBbmltYXRpb25CdWlsZGVyIHtcbiAgICB0aGlzLmRhdGEuY2xhc3Nlc1RvQWRkLnB1c2goY2xhc3NOYW1lKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgY2xhc3MgZnJvbSB0aGUgZWxlbWVudFxuICAgKiBAcGFyYW0gY2xhc3NOYW1lXG4gICAqL1xuICByZW1vdmVDbGFzcyhjbGFzc05hbWU6IHN0cmluZyk6IENzc0FuaW1hdGlvbkJ1aWxkZXIge1xuICAgIHRoaXMuZGF0YS5jbGFzc2VzVG9SZW1vdmUucHVzaChjbGFzc05hbWUpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGFuaW1hdGlvbiBkdXJhdGlvbiAoYW5kIG92ZXJyaWRlcyBhbnkgZGVmaW5lZCB0aHJvdWdoIENTUylcbiAgICogQHBhcmFtIGR1cmF0aW9uXG4gICAqL1xuICBzZXREdXJhdGlvbihkdXJhdGlvbjogbnVtYmVyKTogQ3NzQW5pbWF0aW9uQnVpbGRlciB7XG4gICAgdGhpcy5kYXRhLmR1cmF0aW9uID0gZHVyYXRpb247XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgYW5pbWF0aW9uIGRlbGF5IChhbmQgb3ZlcnJpZGVzIGFueSBkZWZpbmVkIHRocm91Z2ggQ1NTKVxuICAgKiBAcGFyYW0gZGVsYXlcbiAgICovXG4gIHNldERlbGF5KGRlbGF5OiBudW1iZXIpOiBDc3NBbmltYXRpb25CdWlsZGVyIHtcbiAgICB0aGlzLmRhdGEuZGVsYXkgPSBkZWxheTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHN0eWxlcyBmb3IgYm90aCB0aGUgaW5pdGlhbCBzdGF0ZSBhbmQgdGhlIGRlc3RpbmF0aW9uIHN0YXRlXG4gICAqIEBwYXJhbSBmcm9tXG4gICAqIEBwYXJhbSB0b1xuICAgKi9cbiAgc2V0U3R5bGVzKGZyb206IHtba2V5OiBzdHJpbmddOiBhbnl9LCB0bzoge1trZXk6IHN0cmluZ106IGFueX0pOiBDc3NBbmltYXRpb25CdWlsZGVyIHtcbiAgICByZXR1cm4gdGhpcy5zZXRGcm9tU3R5bGVzKGZyb20pLnNldFRvU3R5bGVzKHRvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBpbml0aWFsIHN0eWxlcyBmb3IgdGhlIGFuaW1hdGlvblxuICAgKiBAcGFyYW0gZnJvbVxuICAgKi9cbiAgc2V0RnJvbVN0eWxlcyhmcm9tOiB7W2tleTogc3RyaW5nXTogYW55fSk6IENzc0FuaW1hdGlvbkJ1aWxkZXIge1xuICAgIHRoaXMuZGF0YS5mcm9tU3R5bGVzID0gZnJvbTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBkZXN0aW5hdGlvbiBzdHlsZXMgZm9yIHRoZSBhbmltYXRpb25cbiAgICogQHBhcmFtIHRvXG4gICAqL1xuICBzZXRUb1N0eWxlcyh0bzoge1trZXk6IHN0cmluZ106IGFueX0pOiBDc3NBbmltYXRpb25CdWlsZGVyIHtcbiAgICB0aGlzLmRhdGEudG9TdHlsZXMgPSB0bztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIGFuaW1hdGlvbiBhbmQgcmV0dXJucyBhIHByb21pc2VcbiAgICogQHBhcmFtIGVsZW1lbnRcbiAgICovXG4gIHN0YXJ0KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogQW5pbWF0aW9uIHtcbiAgICByZXR1cm4gbmV3IEFuaW1hdGlvbihlbGVtZW50LCB0aGlzLmRhdGEsIHRoaXMuYnJvd3NlckRldGFpbHMpO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvYW5pbWF0ZS9jc3NfYW5pbWF0aW9uX2J1aWxkZXIudHNcbiAqKi8iLCJleHBvcnQgY2xhc3MgQ3NzQW5pbWF0aW9uT3B0aW9ucyB7XG4gIC8qKiBpbml0aWFsIHN0eWxlcyBmb3IgdGhlIGVsZW1lbnQgKi9cbiAgZnJvbVN0eWxlczoge1trZXk6IHN0cmluZ106IGFueX07XG5cbiAgLyoqIGRlc3RpbmF0aW9uIHN0eWxlcyBmb3IgdGhlIGVsZW1lbnQgKi9cbiAgdG9TdHlsZXM6IHtba2V5OiBzdHJpbmddOiBhbnl9O1xuXG4gIC8qKiBjbGFzc2VzIHRvIGJlIGFkZGVkIHRvIHRoZSBlbGVtZW50ICovXG4gIGNsYXNzZXNUb0FkZDogc3RyaW5nW10gPSBbXTtcblxuICAvKiogY2xhc3NlcyB0byBiZSByZW1vdmVkIGZyb20gdGhlIGVsZW1lbnQgKi9cbiAgY2xhc3Nlc1RvUmVtb3ZlOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8qKiBjbGFzc2VzIHRvIGJlIGFkZGVkIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGFuaW1hdGlvbiAqL1xuICBhbmltYXRpb25DbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8qKiBvdmVycmlkZSB0aGUgZHVyYXRpb24gb2YgdGhlIGFuaW1hdGlvbiAoaW4gbWlsbGlzZWNvbmRzKSAqL1xuICBkdXJhdGlvbjogbnVtYmVyO1xuXG4gIC8qKiBvdmVycmlkZSB0aGUgdHJhbnNpdGlvbiBkZWxheSAoaW4gbWlsbGlzZWNvbmRzKSAqL1xuICBkZWxheTogbnVtYmVyO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2FuaW1hdGUvY3NzX2FuaW1hdGlvbl9vcHRpb25zLnRzXG4gKiovIiwiaW1wb3J0IHtcbiAgRGF0ZVdyYXBwZXIsXG4gIFN0cmluZ1dyYXBwZXIsXG4gIFJlZ0V4cFdyYXBwZXIsXG4gIE51bWJlcldyYXBwZXIsXG4gIGlzUHJlc2VudFxufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtNYXRofSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL21hdGgnO1xuaW1wb3J0IHtjYW1lbENhc2VUb0Rhc2hDYXNlfSBmcm9tICdhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL3V0aWwnO1xuaW1wb3J0IHtTdHJpbmdNYXBXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtET019IGZyb20gJ2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZG9tX2FkYXB0ZXInO1xuXG5pbXBvcnQge0Jyb3dzZXJEZXRhaWxzfSBmcm9tICcuL2Jyb3dzZXJfZGV0YWlscyc7XG5pbXBvcnQge0Nzc0FuaW1hdGlvbk9wdGlvbnN9IGZyb20gJy4vY3NzX2FuaW1hdGlvbl9vcHRpb25zJztcblxuZXhwb3J0IGNsYXNzIEFuaW1hdGlvbiB7XG4gIC8qKiBmdW5jdGlvbnMgdG8gYmUgY2FsbGVkIHVwb24gY29tcGxldGlvbiAqL1xuICBjYWxsYmFja3M6IEZ1bmN0aW9uW10gPSBbXTtcblxuICAvKiogdGhlIGR1cmF0aW9uIChtcykgb2YgdGhlIGFuaW1hdGlvbiAod2hldGhlciBmcm9tIENTUyBvciBtYW51YWxseSBzZXQpICovXG4gIGNvbXB1dGVkRHVyYXRpb246IG51bWJlcjtcblxuICAvKiogdGhlIGFuaW1hdGlvbiBkZWxheSAobXMpICh3aGV0aGVyIGZyb20gQ1NTIG9yIG1hbnVhbGx5IHNldCkgKi9cbiAgY29tcHV0ZWREZWxheTogbnVtYmVyO1xuXG4gIC8qKiB0aW1lc3RhbXAgb2Ygd2hlbiB0aGUgYW5pbWF0aW9uIHN0YXJ0ZWQgKi9cbiAgc3RhcnRUaW1lOiBudW1iZXI7XG5cbiAgLyoqIGZ1bmN0aW9ucyBmb3IgcmVtb3ZpbmcgZXZlbnQgbGlzdGVuZXJzICovXG4gIGV2ZW50Q2xlYXJGdW5jdGlvbnM6IEZ1bmN0aW9uW10gPSBbXTtcblxuICAvKiogZmxhZyB1c2VkIHRvIHRyYWNrIHdoZXRoZXIgb3Igbm90IHRoZSBhbmltYXRpb24gaGFzIGZpbmlzaGVkICovXG4gIGNvbXBsZXRlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX3N0cmluZ1ByZWZpeDogc3RyaW5nID0gJyc7XG5cbiAgLyoqIHRvdGFsIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIGFuaW1hdGlvbiBzaG91bGQgdGFrZSBpbmNsdWRpbmcgZGVsYXkgKi9cbiAgZ2V0IHRvdGFsVGltZSgpOiBudW1iZXIge1xuICAgIGxldCBkZWxheSA9IHRoaXMuY29tcHV0ZWREZWxheSAhPSBudWxsID8gdGhpcy5jb21wdXRlZERlbGF5IDogMDtcbiAgICBsZXQgZHVyYXRpb24gPSB0aGlzLmNvbXB1dGVkRHVyYXRpb24gIT0gbnVsbCA/IHRoaXMuY29tcHV0ZWREdXJhdGlvbiA6IDA7XG4gICAgcmV0dXJuIGRlbGF5ICsgZHVyYXRpb247XG4gIH1cblxuICAvKipcbiAgICogU3RvcmVzIHRoZSBzdGFydCB0aW1lIGFuZCBzdGFydHMgdGhlIGFuaW1hdGlvblxuICAgKiBAcGFyYW0gZWxlbWVudFxuICAgKiBAcGFyYW0gZGF0YVxuICAgKiBAcGFyYW0gYnJvd3NlckRldGFpbHNcbiAgICovXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50OiBIVE1MRWxlbWVudCwgcHVibGljIGRhdGE6IENzc0FuaW1hdGlvbk9wdGlvbnMsXG4gICAgICAgICAgICAgIHB1YmxpYyBicm93c2VyRGV0YWlsczogQnJvd3NlckRldGFpbHMpIHtcbiAgICB0aGlzLnN0YXJ0VGltZSA9IERhdGVXcmFwcGVyLnRvTWlsbGlzKERhdGVXcmFwcGVyLm5vdygpKTtcbiAgICB0aGlzLl9zdHJpbmdQcmVmaXggPSBET00uZ2V0QW5pbWF0aW9uUHJlZml4KCk7XG4gICAgdGhpcy5zZXR1cCgpO1xuICAgIHRoaXMud2FpdCh0aW1lc3RhbXAgPT4gdGhpcy5zdGFydCgpKTtcbiAgfVxuXG4gIHdhaXQoY2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG4gICAgLy8gRmlyZWZveCByZXF1aXJlcyAyIGZyYW1lcyBmb3Igc29tZSByZWFzb25cbiAgICB0aGlzLmJyb3dzZXJEZXRhaWxzLnJhZihjYWxsYmFjaywgMik7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1cCB0aGUgaW5pdGlhbCBzdHlsZXMgYmVmb3JlIHRoZSBhbmltYXRpb24gaXMgc3RhcnRlZFxuICAgKi9cbiAgc2V0dXAoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGF0YS5mcm9tU3R5bGVzICE9IG51bGwpIHRoaXMuYXBwbHlTdHlsZXModGhpcy5kYXRhLmZyb21TdHlsZXMpO1xuICAgIGlmICh0aGlzLmRhdGEuZHVyYXRpb24gIT0gbnVsbClcbiAgICAgIHRoaXMuYXBwbHlTdHlsZXMoeyd0cmFuc2l0aW9uRHVyYXRpb24nOiB0aGlzLmRhdGEuZHVyYXRpb24udG9TdHJpbmcoKSArICdtcyd9KTtcbiAgICBpZiAodGhpcy5kYXRhLmRlbGF5ICE9IG51bGwpXG4gICAgICB0aGlzLmFwcGx5U3R5bGVzKHsndHJhbnNpdGlvbkRlbGF5JzogdGhpcy5kYXRhLmRlbGF5LnRvU3RyaW5nKCkgKyAnbXMnfSk7XG4gIH1cblxuICAvKipcbiAgICogQWZ0ZXIgdGhlIGluaXRpYWwgc2V0dXAgaGFzIG9jY3VycmVkLCB0aGlzIG1ldGhvZCBhZGRzIHRoZSBhbmltYXRpb24gc3R5bGVzXG4gICAqL1xuICBzdGFydCgpOiB2b2lkIHtcbiAgICB0aGlzLmFkZENsYXNzZXModGhpcy5kYXRhLmNsYXNzZXNUb0FkZCk7XG4gICAgdGhpcy5hZGRDbGFzc2VzKHRoaXMuZGF0YS5hbmltYXRpb25DbGFzc2VzKTtcbiAgICB0aGlzLnJlbW92ZUNsYXNzZXModGhpcy5kYXRhLmNsYXNzZXNUb1JlbW92ZSk7XG4gICAgaWYgKHRoaXMuZGF0YS50b1N0eWxlcyAhPSBudWxsKSB0aGlzLmFwcGx5U3R5bGVzKHRoaXMuZGF0YS50b1N0eWxlcyk7XG4gICAgdmFyIGNvbXB1dGVkU3R5bGVzID0gRE9NLmdldENvbXB1dGVkU3R5bGUodGhpcy5lbGVtZW50KTtcbiAgICB0aGlzLmNvbXB1dGVkRGVsYXkgPVxuICAgICAgICBNYXRoLm1heCh0aGlzLnBhcnNlRHVyYXRpb25TdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICBjb21wdXRlZFN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuX3N0cmluZ1ByZWZpeCArICd0cmFuc2l0aW9uLWRlbGF5JykpLFxuICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlRHVyYXRpb25TdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLl9zdHJpbmdQcmVmaXggKyAndHJhbnNpdGlvbi1kZWxheScpKSk7XG4gICAgdGhpcy5jb21wdXRlZER1cmF0aW9uID0gTWF0aC5tYXgodGhpcy5wYXJzZUR1cmF0aW9uU3RyaW5nKGNvbXB1dGVkU3R5bGVzLmdldFByb3BlcnR5VmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0cmluZ1ByZWZpeCArICd0cmFuc2l0aW9uLWR1cmF0aW9uJykpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2VEdXJhdGlvblN0cmluZyh0aGlzLmVsZW1lbnQuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RyaW5nUHJlZml4ICsgJ3RyYW5zaXRpb24tZHVyYXRpb24nKSkpO1xuICAgIHRoaXMuYWRkRXZlbnRzKCk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyB0aGUgcHJvdmlkZWQgc3R5bGVzIHRvIHRoZSBlbGVtZW50XG4gICAqIEBwYXJhbSBzdHlsZXNcbiAgICovXG4gIGFwcGx5U3R5bGVzKHN0eWxlczoge1trZXk6IHN0cmluZ106IGFueX0pOiB2b2lkIHtcbiAgICBTdHJpbmdNYXBXcmFwcGVyLmZvckVhY2goc3R5bGVzLCAodmFsdWUsIGtleSkgPT4ge1xuICAgICAgdmFyIGRhc2hDYXNlS2V5ID0gY2FtZWxDYXNlVG9EYXNoQ2FzZShrZXkpO1xuICAgICAgaWYgKGlzUHJlc2VudChET00uZ2V0U3R5bGUodGhpcy5lbGVtZW50LCBkYXNoQ2FzZUtleSkpKSB7XG4gICAgICAgIERPTS5zZXRTdHlsZSh0aGlzLmVsZW1lbnQsIGRhc2hDYXNlS2V5LCB2YWx1ZS50b1N0cmluZygpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIERPTS5zZXRTdHlsZSh0aGlzLmVsZW1lbnQsIHRoaXMuX3N0cmluZ1ByZWZpeCArIGRhc2hDYXNlS2V5LCB2YWx1ZS50b1N0cmluZygpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHRoZSBwcm92aWRlZCBjbGFzc2VzIHRvIHRoZSBlbGVtZW50XG4gICAqIEBwYXJhbSBjbGFzc2VzXG4gICAqL1xuICBhZGRDbGFzc2VzKGNsYXNzZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNsYXNzZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIERPTS5hZGRDbGFzcyh0aGlzLmVsZW1lbnQsIGNsYXNzZXNbaV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIHByb3ZpZGVkIGNsYXNzZXMgZnJvbSB0aGUgZWxlbWVudFxuICAgKiBAcGFyYW0gY2xhc3Nlc1xuICAgKi9cbiAgcmVtb3ZlQ2xhc3NlcyhjbGFzc2VzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBjbGFzc2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSBET00ucmVtb3ZlQ2xhc3ModGhpcy5lbGVtZW50LCBjbGFzc2VzW2ldKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGV2ZW50cyB0byB0cmFjayB3aGVuIGFuaW1hdGlvbnMgaGF2ZSBmaW5pc2hlZFxuICAgKi9cbiAgYWRkRXZlbnRzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRvdGFsVGltZSA+IDApIHtcbiAgICAgIHRoaXMuZXZlbnRDbGVhckZ1bmN0aW9ucy5wdXNoKERPTS5vbkFuZENhbmNlbChcbiAgICAgICAgICB0aGlzLmVsZW1lbnQsIERPTS5nZXRUcmFuc2l0aW9uRW5kKCksIChldmVudDogYW55KSA9PiB0aGlzLmhhbmRsZUFuaW1hdGlvbkV2ZW50KGV2ZW50KSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhhbmRsZUFuaW1hdGlvbkNvbXBsZXRlZCgpO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZUFuaW1hdGlvbkV2ZW50KGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBsZXQgZWxhcHNlZFRpbWUgPSBNYXRoLnJvdW5kKGV2ZW50LmVsYXBzZWRUaW1lICogMTAwMCk7XG4gICAgaWYgKCF0aGlzLmJyb3dzZXJEZXRhaWxzLmVsYXBzZWRUaW1lSW5jbHVkZXNEZWxheSkgZWxhcHNlZFRpbWUgKz0gdGhpcy5jb21wdXRlZERlbGF5O1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmIChlbGFwc2VkVGltZSA+PSB0aGlzLnRvdGFsVGltZSkgdGhpcy5oYW5kbGVBbmltYXRpb25Db21wbGV0ZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGFsbCBhbmltYXRpb24gY2FsbGJhY2tzIGFuZCByZW1vdmVzIHRlbXBvcmFyeSBjbGFzc2VzXG4gICAqL1xuICBoYW5kbGVBbmltYXRpb25Db21wbGV0ZWQoKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVDbGFzc2VzKHRoaXMuZGF0YS5hbmltYXRpb25DbGFzc2VzKTtcbiAgICB0aGlzLmNhbGxiYWNrcy5mb3JFYWNoKGNhbGxiYWNrID0+IGNhbGxiYWNrKCkpO1xuICAgIHRoaXMuY2FsbGJhY2tzID0gW107XG4gICAgdGhpcy5ldmVudENsZWFyRnVuY3Rpb25zLmZvckVhY2goZm4gPT4gZm4oKSk7XG4gICAgdGhpcy5ldmVudENsZWFyRnVuY3Rpb25zID0gW107XG4gICAgdGhpcy5jb21wbGV0ZWQgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW5pbWF0aW9uIGNhbGxiYWNrcyB0byBiZSBjYWxsZWQgdXBvbiBjb21wbGV0aW9uXG4gICAqIEBwYXJhbSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyB7QW5pbWF0aW9ufVxuICAgKi9cbiAgb25Db21wbGV0ZShjYWxsYmFjazogRnVuY3Rpb24pOiBBbmltYXRpb24ge1xuICAgIGlmICh0aGlzLmNvbXBsZXRlZCkge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIHRoZSBkdXJhdGlvbiBzdHJpbmcgdG8gdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHNcbiAgICogQHBhcmFtIGR1cmF0aW9uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBwYXJzZUR1cmF0aW9uU3RyaW5nKGR1cmF0aW9uOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHZhciBtYXhWYWx1ZSA9IDA7XG4gICAgLy8gZHVyYXRpb24gbXVzdCBoYXZlIGF0IGxlYXN0IDIgY2hhcmFjdGVycyB0byBiZSB2YWxpZC4gKG51bWJlciArIHR5cGUpXG4gICAgaWYgKGR1cmF0aW9uID09IG51bGwgfHwgZHVyYXRpb24ubGVuZ3RoIDwgMikge1xuICAgICAgcmV0dXJuIG1heFZhbHVlO1xuICAgIH0gZWxzZSBpZiAoZHVyYXRpb24uc3Vic3RyaW5nKGR1cmF0aW9uLmxlbmd0aCAtIDIpID09ICdtcycpIHtcbiAgICAgIGxldCB2YWx1ZSA9IE51bWJlcldyYXBwZXIucGFyc2VJbnQodGhpcy5zdHJpcExldHRlcnMoZHVyYXRpb24pLCAxMCk7XG4gICAgICBpZiAodmFsdWUgPiBtYXhWYWx1ZSkgbWF4VmFsdWUgPSB2YWx1ZTtcbiAgICB9IGVsc2UgaWYgKGR1cmF0aW9uLnN1YnN0cmluZyhkdXJhdGlvbi5sZW5ndGggLSAxKSA9PSAncycpIHtcbiAgICAgIGxldCBtcyA9IE51bWJlcldyYXBwZXIucGFyc2VGbG9hdCh0aGlzLnN0cmlwTGV0dGVycyhkdXJhdGlvbikpICogMTAwMDtcbiAgICAgIGxldCB2YWx1ZSA9IE1hdGguZmxvb3IobXMpO1xuICAgICAgaWYgKHZhbHVlID4gbWF4VmFsdWUpIG1heFZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBtYXhWYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJpcHMgdGhlIGxldHRlcnMgZnJvbSB0aGUgZHVyYXRpb24gc3RyaW5nXG4gICAqIEBwYXJhbSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIHN0cmlwTGV0dGVycyhzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFN0cmluZ1dyYXBwZXIucmVwbGFjZUFsbChzdHIsIFJlZ0V4cFdyYXBwZXIuY3JlYXRlKCdbXjAtOV0rJCcsICcnKSwgJycpO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvYW5pbWF0ZS9hbmltYXRpb24udHNcbiAqKi8iLCJpbXBvcnQge2dsb2JhbH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxuZXhwb3J0IHZhciBNYXRoID0gZ2xvYmFsLk1hdGg7XG5leHBvcnQgdmFyIE5hTiA9IHR5cGVvZiBOYU47XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvZmFjYWRlL21hdGgudHNcbiAqKi8iLCJpbXBvcnQge1N0cmluZ1dyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5cbnZhciBDQU1FTF9DQVNFX1JFR0VYUCA9IC8oW0EtWl0pL2c7XG52YXIgREFTSF9DQVNFX1JFR0VYUCA9IC8tKFthLXpdKS9nO1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBjYW1lbENhc2VUb0Rhc2hDYXNlKGlucHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gU3RyaW5nV3JhcHBlci5yZXBsYWNlQWxsTWFwcGVkKGlucHV0LCBDQU1FTF9DQVNFX1JFR0VYUCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobSkgPT4geyByZXR1cm4gJy0nICsgbVsxXS50b0xvd2VyQ2FzZSgpOyB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRhc2hDYXNlVG9DYW1lbENhc2UoaW5wdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBTdHJpbmdXcmFwcGVyLnJlcGxhY2VBbGxNYXBwZWQoaW5wdXQsIERBU0hfQ0FTRV9SRUdFWFAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG0pID0+IHsgcmV0dXJuIG1bMV0udG9VcHBlckNhc2UoKTsgfSk7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL3V0aWwudHNcbiAqKi8iLCJpbXBvcnQge0luamVjdGFibGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpJztcbmltcG9ydCB7TWF0aH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9tYXRoJztcbmltcG9ydCB7RE9NfSBmcm9tICdhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2RvbV9hZGFwdGVyJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEJyb3dzZXJEZXRhaWxzIHtcbiAgZWxhcHNlZFRpbWVJbmNsdWRlc0RlbGF5ID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoKSB7IHRoaXMuZG9lc0VsYXBzZWRUaW1lSW5jbHVkZXNEZWxheSgpOyB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgYGV2ZW50LmVsYXBzZWRUaW1lYCBpbmNsdWRlcyB0cmFuc2l0aW9uIGRlbGF5IGluIHRoZSBjdXJyZW50IGJyb3dzZXIuICBBdCB0aGlzXG4gICAqIHRpbWUsIENocm9tZSBhbmQgT3BlcmEgc2VlbSB0byBiZSB0aGUgb25seSBicm93c2VycyB0aGF0IGluY2x1ZGUgdGhpcy5cbiAgICovXG4gIGRvZXNFbGFwc2VkVGltZUluY2x1ZGVzRGVsYXkoKTogdm9pZCB7XG4gICAgdmFyIGRpdiA9IERPTS5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBET00uc2V0QXR0cmlidXRlKGRpdiwgJ3N0eWxlJywgYHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAtOTk5OXB4OyBsZWZ0OiAtOTk5OXB4OyB3aWR0aDogMXB4O1xuICAgICAgaGVpZ2h0OiAxcHg7IHRyYW5zaXRpb246IGFsbCAxbXMgbGluZWFyIDFtcztgKTtcbiAgICAvLyBGaXJlZm94IHJlcXVpcmVzIHRoYXQgd2Ugd2FpdCBmb3IgMiBmcmFtZXMgZm9yIHNvbWUgcmVhc29uXG4gICAgdGhpcy5yYWYodGltZXN0YW1wID0+IHtcbiAgICAgIERPTS5vbihkaXYsICd0cmFuc2l0aW9uZW5kJywgKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgdmFyIGVsYXBzZWQgPSBNYXRoLnJvdW5kKGV2ZW50LmVsYXBzZWRUaW1lICogMTAwMCk7XG4gICAgICAgIHRoaXMuZWxhcHNlZFRpbWVJbmNsdWRlc0RlbGF5ID0gZWxhcHNlZCA9PSAyO1xuICAgICAgICBET00ucmVtb3ZlKGRpdik7XG4gICAgICB9KTtcbiAgICAgIERPTS5zZXRTdHlsZShkaXYsICd3aWR0aCcsICcycHgnKTtcbiAgICB9LCAyKTtcbiAgfVxuXG4gIHJhZihjYWxsYmFjazogRnVuY3Rpb24sIGZyYW1lczogbnVtYmVyID0gMSk6IEZ1bmN0aW9uIHtcbiAgICB2YXIgcXVldWU6IFJhZlF1ZXVlID0gbmV3IFJhZlF1ZXVlKGNhbGxiYWNrLCBmcmFtZXMpO1xuICAgIHJldHVybiAoKSA9PiBxdWV1ZS5jYW5jZWwoKTtcbiAgfVxufVxuXG5jbGFzcyBSYWZRdWV1ZSB7XG4gIGN1cnJlbnRGcmFtZUlkOiBudW1iZXI7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBjYWxsYmFjazogRnVuY3Rpb24sIHB1YmxpYyBmcmFtZXM6IG51bWJlcikgeyB0aGlzLl9yYWYoKTsgfVxuICBwcml2YXRlIF9yYWYoKSB7XG4gICAgdGhpcy5jdXJyZW50RnJhbWVJZCA9IERPTS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGltZXN0YW1wID0+IHRoaXMuX25leHRGcmFtZSh0aW1lc3RhbXApKTtcbiAgfVxuICBwcml2YXRlIF9uZXh0RnJhbWUodGltZXN0YW1wOiBudW1iZXIpIHtcbiAgICB0aGlzLmZyYW1lcy0tO1xuICAgIGlmICh0aGlzLmZyYW1lcyA+IDApIHtcbiAgICAgIHRoaXMuX3JhZigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNhbGxiYWNrKHRpbWVzdGFtcCk7XG4gICAgfVxuICB9XG4gIGNhbmNlbCgpIHtcbiAgICBET00uY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5jdXJyZW50RnJhbWVJZCk7XG4gICAgdGhpcy5jdXJyZW50RnJhbWVJZCA9IG51bGw7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9hbmltYXRlL2Jyb3dzZXJfZGV0YWlscy50c1xuICoqLyIsImltcG9ydCB7RE9NfSBmcm9tICdhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2RvbV9hZGFwdGVyJztcbmltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5pbXBvcnQge1NldFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge0RPQ1VNRU5UfSBmcm9tICcuL2RvbV90b2tlbnMnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgU2hhcmVkU3R5bGVzSG9zdCB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3N0eWxlczogc3RyaW5nW10gPSBbXTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfc3R5bGVzU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIGFkZFN0eWxlcyhzdHlsZXM6IHN0cmluZ1tdKSB7XG4gICAgdmFyIGFkZGl0aW9ucyA9IFtdO1xuICAgIHN0eWxlcy5mb3JFYWNoKHN0eWxlID0+IHtcbiAgICAgIGlmICghU2V0V3JhcHBlci5oYXModGhpcy5fc3R5bGVzU2V0LCBzdHlsZSkpIHtcbiAgICAgICAgdGhpcy5fc3R5bGVzU2V0LmFkZChzdHlsZSk7XG4gICAgICAgIHRoaXMuX3N0eWxlcy5wdXNoKHN0eWxlKTtcbiAgICAgICAgYWRkaXRpb25zLnB1c2goc3R5bGUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMub25TdHlsZXNBZGRlZChhZGRpdGlvbnMpO1xuICB9XG5cbiAgb25TdHlsZXNBZGRlZChhZGRpdGlvbnM6IHN0cmluZ1tdKSB7fVxuXG4gIGdldEFsbFN0eWxlcygpOiBzdHJpbmdbXSB7IHJldHVybiB0aGlzLl9zdHlsZXM7IH1cbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERvbVNoYXJlZFN0eWxlc0hvc3QgZXh0ZW5kcyBTaGFyZWRTdHlsZXNIb3N0IHtcbiAgcHJpdmF0ZSBfaG9zdE5vZGVzID0gbmV3IFNldDxOb2RlPigpO1xuICBjb25zdHJ1Y3RvcihASW5qZWN0KERPQ1VNRU5UKSBkb2M6IGFueSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5faG9zdE5vZGVzLmFkZChkb2MuaGVhZCk7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfYWRkU3R5bGVzVG9Ib3N0KHN0eWxlczogc3RyaW5nW10sIGhvc3Q6IE5vZGUpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0eWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHN0eWxlID0gc3R5bGVzW2ldO1xuICAgICAgRE9NLmFwcGVuZENoaWxkKGhvc3QsIERPTS5jcmVhdGVTdHlsZUVsZW1lbnQoc3R5bGUpKTtcbiAgICB9XG4gIH1cbiAgYWRkSG9zdChob3N0Tm9kZTogTm9kZSkge1xuICAgIHRoaXMuX2FkZFN0eWxlc1RvSG9zdCh0aGlzLl9zdHlsZXMsIGhvc3ROb2RlKTtcbiAgICB0aGlzLl9ob3N0Tm9kZXMuYWRkKGhvc3ROb2RlKTtcbiAgfVxuICByZW1vdmVIb3N0KGhvc3ROb2RlOiBOb2RlKSB7IFNldFdyYXBwZXIuZGVsZXRlKHRoaXMuX2hvc3ROb2RlcywgaG9zdE5vZGUpOyB9XG5cbiAgb25TdHlsZXNBZGRlZChhZGRpdGlvbnM6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5faG9zdE5vZGVzLmZvckVhY2goKGhvc3ROb2RlKSA9PiB7IHRoaXMuX2FkZFN0eWxlc1RvSG9zdChhZGRpdGlvbnMsIGhvc3ROb2RlKTsgfSk7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vc2hhcmVkX3N0eWxlc19ob3N0LnRzXG4gKiovIiwiaW1wb3J0IHtNYXBXcmFwcGVyLCBMaXN0V3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcbmltcG9ydCB7aXNCbGFuaywgaXNQcmVzZW50LCBnbG9iYWwsIHNldFZhbHVlT25QYXRoLCBEYXRlV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7c2V0Um9vdERvbUFkYXB0ZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZG9tX2FkYXB0ZXInO1xuaW1wb3J0IHtHZW5lcmljQnJvd3NlckRvbUFkYXB0ZXJ9IGZyb20gJy4vZ2VuZXJpY19icm93c2VyX2FkYXB0ZXInO1xuXG52YXIgX2F0dHJUb1Byb3BNYXAgPSB7XG4gICdjbGFzcyc6ICdjbGFzc05hbWUnLFxuICAnaW5uZXJIdG1sJzogJ2lubmVySFRNTCcsXG4gICdyZWFkb25seSc6ICdyZWFkT25seScsXG4gICd0YWJpbmRleCc6ICd0YWJJbmRleCdcbn07XG5cbmNvbnN0IERPTV9LRVlfTE9DQVRJT05fTlVNUEFEID0gMztcblxuLy8gTWFwIHRvIGNvbnZlcnQgc29tZSBrZXkgb3Iga2V5SWRlbnRpZmllciB2YWx1ZXMgdG8gd2hhdCB3aWxsIGJlIHJldHVybmVkIGJ5IGdldEV2ZW50S2V5XG52YXIgX2tleU1hcCA9IHtcbiAgLy8gVGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIGhlcmUgZm9yIGNyb3NzLWJyb3dzZXIgY29tcGF0aWJpbGl0eSBhbmQgdG8gbWF0Y2ggdGhlIFczQyBzdGFuZGFyZFxuICAvLyBjZiBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMta2V5L1xuICAnXFxiJzogJ0JhY2tzcGFjZScsXG4gICdcXHQnOiAnVGFiJyxcbiAgJ1xceDdGJzogJ0RlbGV0ZScsXG4gICdcXHgxQic6ICdFc2NhcGUnLFxuICAnRGVsJzogJ0RlbGV0ZScsXG4gICdFc2MnOiAnRXNjYXBlJyxcbiAgJ0xlZnQnOiAnQXJyb3dMZWZ0JyxcbiAgJ1JpZ2h0JzogJ0Fycm93UmlnaHQnLFxuICAnVXAnOiAnQXJyb3dVcCcsXG4gICdEb3duJzogJ0Fycm93RG93bicsXG4gICdNZW51JzogJ0NvbnRleHRNZW51JyxcbiAgJ1Njcm9sbCc6ICdTY3JvbGxMb2NrJyxcbiAgJ1dpbic6ICdPUydcbn07XG5cbi8vIFRoZXJlIGlzIGEgYnVnIGluIENocm9tZSBmb3IgbnVtZXJpYyBrZXlwYWQga2V5czpcbi8vIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0xNTU2NTRcbi8vIDEsIDIsIDMgLi4uIGFyZSByZXBvcnRlZCBhcyBBLCBCLCBDIC4uLlxudmFyIF9jaHJvbWVOdW1LZXlQYWRNYXAgPSB7XG4gICdBJzogJzEnLFxuICAnQic6ICcyJyxcbiAgJ0MnOiAnMycsXG4gICdEJzogJzQnLFxuICAnRSc6ICc1JyxcbiAgJ0YnOiAnNicsXG4gICdHJzogJzcnLFxuICAnSCc6ICc4JyxcbiAgJ0knOiAnOScsXG4gICdKJzogJyonLFxuICAnSyc6ICcrJyxcbiAgJ00nOiAnLScsXG4gICdOJzogJy4nLFxuICAnTyc6ICcvJyxcbiAgJ1xceDYwJzogJzAnLFxuICAnXFx4OTAnOiAnTnVtTG9jaydcbn07XG5cbi8qKlxuICogQSBgRG9tQWRhcHRlcmAgcG93ZXJlZCBieSBmdWxsIGJyb3dzZXIgRE9NIEFQSXMuXG4gKi9cbi8qIHRzbGludDpkaXNhYmxlOnJlcXVpcmVQYXJhbWV0ZXJUeXBlICovXG5leHBvcnQgY2xhc3MgQnJvd3NlckRvbUFkYXB0ZXIgZXh0ZW5kcyBHZW5lcmljQnJvd3NlckRvbUFkYXB0ZXIge1xuICBwYXJzZSh0ZW1wbGF0ZUh0bWw6IHN0cmluZykgeyB0aHJvdyBuZXcgRXJyb3IoXCJwYXJzZSBub3QgaW1wbGVtZW50ZWRcIik7IH1cbiAgc3RhdGljIG1ha2VDdXJyZW50KCkgeyBzZXRSb290RG9tQWRhcHRlcihuZXcgQnJvd3NlckRvbUFkYXB0ZXIoKSk7IH1cbiAgaGFzUHJvcGVydHkoZWxlbWVudCwgbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7IHJldHVybiBuYW1lIGluIGVsZW1lbnQ7IH1cbiAgc2V0UHJvcGVydHkoZWw6IC8qZWxlbWVudCovIGFueSwgbmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KSB7IGVsW25hbWVdID0gdmFsdWU7IH1cbiAgZ2V0UHJvcGVydHkoZWw6IC8qZWxlbWVudCovIGFueSwgbmFtZTogc3RyaW5nKTogYW55IHsgcmV0dXJuIGVsW25hbWVdOyB9XG4gIGludm9rZShlbDogLyplbGVtZW50Ki8gYW55LCBtZXRob2ROYW1lOiBzdHJpbmcsIGFyZ3M6IGFueVtdKTogYW55IHtcbiAgICBlbFttZXRob2ROYW1lXS5hcHBseShlbCwgYXJncyk7XG4gIH1cblxuICAvLyBUT0RPKHRib3NjaCk6IG1vdmUgdGhpcyBpbnRvIGEgc2VwYXJhdGUgZW52aXJvbm1lbnQgY2xhc3Mgb25jZSB3ZSBoYXZlIGl0XG4gIGxvZ0Vycm9yKGVycm9yKSB7XG4gICAgaWYgKHdpbmRvdy5jb25zb2xlLmVycm9yKSB7XG4gICAgICB3aW5kb3cuY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5jb25zb2xlLmxvZyhlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgbG9nKGVycm9yKSB7IHdpbmRvdy5jb25zb2xlLmxvZyhlcnJvcik7IH1cblxuICBsb2dHcm91cChlcnJvcikge1xuICAgIGlmICh3aW5kb3cuY29uc29sZS5ncm91cCkge1xuICAgICAgd2luZG93LmNvbnNvbGUuZ3JvdXAoZXJyb3IpO1xuICAgICAgdGhpcy5sb2dFcnJvcihlcnJvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5jb25zb2xlLmxvZyhlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgbG9nR3JvdXBFbmQoKSB7XG4gICAgaWYgKHdpbmRvdy5jb25zb2xlLmdyb3VwRW5kKSB7XG4gICAgICB3aW5kb3cuY29uc29sZS5ncm91cEVuZCgpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBhdHRyVG9Qcm9wTWFwKCk6IGFueSB7IHJldHVybiBfYXR0clRvUHJvcE1hcDsgfVxuXG4gIHF1ZXJ5KHNlbGVjdG9yOiBzdHJpbmcpOiBhbnkgeyByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7IH1cbiAgcXVlcnlTZWxlY3RvcihlbCwgc2VsZWN0b3I6IHN0cmluZyk6IEhUTUxFbGVtZW50IHsgcmV0dXJuIGVsLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpOyB9XG4gIHF1ZXJ5U2VsZWN0b3JBbGwoZWwsIHNlbGVjdG9yOiBzdHJpbmcpOiBhbnlbXSB7IHJldHVybiBlbC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsgfVxuICBvbihlbCwgZXZ0LCBsaXN0ZW5lcikgeyBlbC5hZGRFdmVudExpc3RlbmVyKGV2dCwgbGlzdGVuZXIsIGZhbHNlKTsgfVxuICBvbkFuZENhbmNlbChlbCwgZXZ0LCBsaXN0ZW5lcik6IEZ1bmN0aW9uIHtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKGV2dCwgbGlzdGVuZXIsIGZhbHNlKTtcbiAgICAvLyBOZWVkZWQgdG8gZm9sbG93IERhcnQncyBzdWJzY3JpcHRpb24gc2VtYW50aWMsIHVudGlsIGZpeCBvZlxuICAgIC8vIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZGFydC9pc3N1ZXMvZGV0YWlsP2lkPTE3NDA2XG4gICAgcmV0dXJuICgpID0+IHsgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihldnQsIGxpc3RlbmVyLCBmYWxzZSk7IH07XG4gIH1cbiAgZGlzcGF0Y2hFdmVudChlbCwgZXZ0KSB7IGVsLmRpc3BhdGNoRXZlbnQoZXZ0KTsgfVxuICBjcmVhdGVNb3VzZUV2ZW50KGV2ZW50VHlwZTogc3RyaW5nKTogTW91c2VFdmVudCB7XG4gICAgdmFyIGV2dDogTW91c2VFdmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdNb3VzZUV2ZW50Jyk7XG4gICAgZXZ0LmluaXRFdmVudChldmVudFR5cGUsIHRydWUsIHRydWUpO1xuICAgIHJldHVybiBldnQ7XG4gIH1cbiAgY3JlYXRlRXZlbnQoZXZlbnRUeXBlKTogRXZlbnQge1xuICAgIHZhciBldnQ6IEV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgZXZ0LmluaXRFdmVudChldmVudFR5cGUsIHRydWUsIHRydWUpO1xuICAgIHJldHVybiBldnQ7XG4gIH1cbiAgcHJldmVudERlZmF1bHQoZXZ0OiBFdmVudCkge1xuICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2dC5yZXR1cm5WYWx1ZSA9IGZhbHNlO1xuICB9XG4gIGlzUHJldmVudGVkKGV2dDogRXZlbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZXZ0LmRlZmF1bHRQcmV2ZW50ZWQgfHwgaXNQcmVzZW50KGV2dC5yZXR1cm5WYWx1ZSkgJiYgIWV2dC5yZXR1cm5WYWx1ZTtcbiAgfVxuICBnZXRJbm5lckhUTUwoZWwpOiBzdHJpbmcgeyByZXR1cm4gZWwuaW5uZXJIVE1MOyB9XG4gIGdldE91dGVySFRNTChlbCk6IHN0cmluZyB7IHJldHVybiBlbC5vdXRlckhUTUw7IH1cbiAgbm9kZU5hbWUobm9kZTogTm9kZSk6IHN0cmluZyB7IHJldHVybiBub2RlLm5vZGVOYW1lOyB9XG4gIG5vZGVWYWx1ZShub2RlOiBOb2RlKTogc3RyaW5nIHsgcmV0dXJuIG5vZGUubm9kZVZhbHVlOyB9XG4gIHR5cGUobm9kZTogSFRNTElucHV0RWxlbWVudCk6IHN0cmluZyB7IHJldHVybiBub2RlLnR5cGU7IH1cbiAgY29udGVudChub2RlOiBOb2RlKTogTm9kZSB7XG4gICAgaWYgKHRoaXMuaGFzUHJvcGVydHkobm9kZSwgXCJjb250ZW50XCIpKSB7XG4gICAgICByZXR1cm4gKDxhbnk+bm9kZSkuY29udGVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICB9XG4gIGZpcnN0Q2hpbGQoZWwpOiBOb2RlIHsgcmV0dXJuIGVsLmZpcnN0Q2hpbGQ7IH1cbiAgbmV4dFNpYmxpbmcoZWwpOiBOb2RlIHsgcmV0dXJuIGVsLm5leHRTaWJsaW5nOyB9XG4gIHBhcmVudEVsZW1lbnQoZWwpOiBOb2RlIHsgcmV0dXJuIGVsLnBhcmVudE5vZGU7IH1cbiAgY2hpbGROb2RlcyhlbCk6IE5vZGVbXSB7IHJldHVybiBlbC5jaGlsZE5vZGVzOyB9XG4gIGNoaWxkTm9kZXNBc0xpc3QoZWwpOiBhbnlbXSB7XG4gICAgdmFyIGNoaWxkTm9kZXMgPSBlbC5jaGlsZE5vZGVzO1xuICAgIHZhciByZXMgPSBMaXN0V3JhcHBlci5jcmVhdGVGaXhlZFNpemUoY2hpbGROb2Rlcy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzW2ldID0gY2hpbGROb2Rlc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBjbGVhck5vZGVzKGVsKSB7XG4gICAgd2hpbGUgKGVsLmZpcnN0Q2hpbGQpIHtcbiAgICAgIGVsLnJlbW92ZUNoaWxkKGVsLmZpcnN0Q2hpbGQpO1xuICAgIH1cbiAgfVxuICBhcHBlbmRDaGlsZChlbCwgbm9kZSkgeyBlbC5hcHBlbmRDaGlsZChub2RlKTsgfVxuICByZW1vdmVDaGlsZChlbCwgbm9kZSkgeyBlbC5yZW1vdmVDaGlsZChub2RlKTsgfVxuICByZXBsYWNlQ2hpbGQoZWw6IE5vZGUsIG5ld0NoaWxkLCBvbGRDaGlsZCkgeyBlbC5yZXBsYWNlQ2hpbGQobmV3Q2hpbGQsIG9sZENoaWxkKTsgfVxuICByZW1vdmUobm9kZSk6IE5vZGUge1xuICAgIGlmIChub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgIG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cbiAgaW5zZXJ0QmVmb3JlKGVsLCBub2RlKSB7IGVsLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIGVsKTsgfVxuICBpbnNlcnRBbGxCZWZvcmUoZWwsIG5vZGVzKSB7IG5vZGVzLmZvckVhY2gobiA9PiBlbC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShuLCBlbCkpOyB9XG4gIGluc2VydEFmdGVyKGVsLCBub2RlKSB7IGVsLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIGVsLm5leHRTaWJsaW5nKTsgfVxuICBzZXRJbm5lckhUTUwoZWwsIHZhbHVlKSB7IGVsLmlubmVySFRNTCA9IHZhbHVlOyB9XG4gIGdldFRleHQoZWwpOiBzdHJpbmcgeyByZXR1cm4gZWwudGV4dENvbnRlbnQ7IH1cbiAgLy8gVE9ETyh2aWNiKTogcmVtb3ZlZCBFbGVtZW50IHR5cGUgYmVjYXVzZSBpdCBkb2VzIG5vdCBzdXBwb3J0IFN0eWxlRWxlbWVudFxuICBzZXRUZXh0KGVsLCB2YWx1ZTogc3RyaW5nKSB7IGVsLnRleHRDb250ZW50ID0gdmFsdWU7IH1cbiAgZ2V0VmFsdWUoZWwpOiBzdHJpbmcgeyByZXR1cm4gZWwudmFsdWU7IH1cbiAgc2V0VmFsdWUoZWwsIHZhbHVlOiBzdHJpbmcpIHsgZWwudmFsdWUgPSB2YWx1ZTsgfVxuICBnZXRDaGVja2VkKGVsKTogYm9vbGVhbiB7IHJldHVybiBlbC5jaGVja2VkOyB9XG4gIHNldENoZWNrZWQoZWwsIHZhbHVlOiBib29sZWFuKSB7IGVsLmNoZWNrZWQgPSB2YWx1ZTsgfVxuICBjcmVhdGVDb21tZW50KHRleHQ6IHN0cmluZyk6IENvbW1lbnQgeyByZXR1cm4gZG9jdW1lbnQuY3JlYXRlQ29tbWVudCh0ZXh0KTsgfVxuICBjcmVhdGVUZW1wbGF0ZShodG1sKTogSFRNTEVsZW1lbnQge1xuICAgIHZhciB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTtcbiAgICB0LmlubmVySFRNTCA9IGh0bWw7XG4gICAgcmV0dXJuIHQ7XG4gIH1cbiAgY3JlYXRlRWxlbWVudCh0YWdOYW1lLCBkb2MgPSBkb2N1bWVudCk6IEhUTUxFbGVtZW50IHsgcmV0dXJuIGRvYy5jcmVhdGVFbGVtZW50KHRhZ05hbWUpOyB9XG4gIGNyZWF0ZUVsZW1lbnROUyhucywgdGFnTmFtZSwgZG9jID0gZG9jdW1lbnQpOiBFbGVtZW50IHsgcmV0dXJuIGRvYy5jcmVhdGVFbGVtZW50TlMobnMsIHRhZ05hbWUpOyB9XG4gIGNyZWF0ZVRleHROb2RlKHRleHQ6IHN0cmluZywgZG9jID0gZG9jdW1lbnQpOiBUZXh0IHsgcmV0dXJuIGRvYy5jcmVhdGVUZXh0Tm9kZSh0ZXh0KTsgfVxuICBjcmVhdGVTY3JpcHRUYWcoYXR0ck5hbWU6IHN0cmluZywgYXR0clZhbHVlOiBzdHJpbmcsIGRvYyA9IGRvY3VtZW50KTogSFRNTFNjcmlwdEVsZW1lbnQge1xuICAgIHZhciBlbCA9IDxIVE1MU2NyaXB0RWxlbWVudD5kb2MuY3JlYXRlRWxlbWVudCgnU0NSSVBUJyk7XG4gICAgZWwuc2V0QXR0cmlidXRlKGF0dHJOYW1lLCBhdHRyVmFsdWUpO1xuICAgIHJldHVybiBlbDtcbiAgfVxuICBjcmVhdGVTdHlsZUVsZW1lbnQoY3NzOiBzdHJpbmcsIGRvYyA9IGRvY3VtZW50KTogSFRNTFN0eWxlRWxlbWVudCB7XG4gICAgdmFyIHN0eWxlID0gPEhUTUxTdHlsZUVsZW1lbnQ+ZG9jLmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgdGhpcy5hcHBlbmRDaGlsZChzdHlsZSwgdGhpcy5jcmVhdGVUZXh0Tm9kZShjc3MpKTtcbiAgICByZXR1cm4gc3R5bGU7XG4gIH1cbiAgY3JlYXRlU2hhZG93Um9vdChlbDogSFRNTEVsZW1lbnQpOiBEb2N1bWVudEZyYWdtZW50IHsgcmV0dXJuICg8YW55PmVsKS5jcmVhdGVTaGFkb3dSb290KCk7IH1cbiAgZ2V0U2hhZG93Um9vdChlbDogSFRNTEVsZW1lbnQpOiBEb2N1bWVudEZyYWdtZW50IHsgcmV0dXJuICg8YW55PmVsKS5zaGFkb3dSb290OyB9XG4gIGdldEhvc3QoZWw6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQgeyByZXR1cm4gKDxhbnk+ZWwpLmhvc3Q7IH1cbiAgY2xvbmUobm9kZTogTm9kZSk6IE5vZGUgeyByZXR1cm4gbm9kZS5jbG9uZU5vZGUodHJ1ZSk7IH1cbiAgZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShlbGVtZW50LCBuYW1lOiBzdHJpbmcpOiBIVE1MRWxlbWVudFtdIHtcbiAgICByZXR1cm4gZWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKG5hbWUpO1xuICB9XG4gIGdldEVsZW1lbnRzQnlUYWdOYW1lKGVsZW1lbnQsIG5hbWU6IHN0cmluZyk6IEhUTUxFbGVtZW50W10ge1xuICAgIHJldHVybiBlbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKG5hbWUpO1xuICB9XG4gIGNsYXNzTGlzdChlbGVtZW50KTogYW55W10geyByZXR1cm4gPGFueVtdPkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGVsZW1lbnQuY2xhc3NMaXN0LCAwKTsgfVxuICBhZGRDbGFzcyhlbGVtZW50LCBjbGFzc05hbWU6IHN0cmluZykgeyBlbGVtZW50LmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTsgfVxuICByZW1vdmVDbGFzcyhlbGVtZW50LCBjbGFzc05hbWU6IHN0cmluZykgeyBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTsgfVxuICBoYXNDbGFzcyhlbGVtZW50LCBjbGFzc05hbWU6IHN0cmluZyk6IGJvb2xlYW4geyByZXR1cm4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKTsgfVxuICBzZXRTdHlsZShlbGVtZW50LCBzdHlsZU5hbWU6IHN0cmluZywgc3R5bGVWYWx1ZTogc3RyaW5nKSB7XG4gICAgZWxlbWVudC5zdHlsZVtzdHlsZU5hbWVdID0gc3R5bGVWYWx1ZTtcbiAgfVxuICByZW1vdmVTdHlsZShlbGVtZW50LCBzdHlsZW5hbWU6IHN0cmluZykgeyBlbGVtZW50LnN0eWxlW3N0eWxlbmFtZV0gPSBudWxsOyB9XG4gIGdldFN0eWxlKGVsZW1lbnQsIHN0eWxlbmFtZTogc3RyaW5nKTogc3RyaW5nIHsgcmV0dXJuIGVsZW1lbnQuc3R5bGVbc3R5bGVuYW1lXTsgfVxuICBoYXNTdHlsZShlbGVtZW50LCBzdHlsZU5hbWU6IHN0cmluZywgc3R5bGVWYWx1ZTogc3RyaW5nID0gbnVsbCk6IGJvb2xlYW4ge1xuICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0U3R5bGUoZWxlbWVudCwgc3R5bGVOYW1lKSB8fCAnJztcbiAgICByZXR1cm4gc3R5bGVWYWx1ZSA/IHZhbHVlID09IHN0eWxlVmFsdWUgOiB2YWx1ZS5sZW5ndGggPiAwO1xuICB9XG4gIHRhZ05hbWUoZWxlbWVudCk6IHN0cmluZyB7IHJldHVybiBlbGVtZW50LnRhZ05hbWU7IH1cbiAgYXR0cmlidXRlTWFwKGVsZW1lbnQpOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICB2YXIgcmVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICB2YXIgZWxBdHRycyA9IGVsZW1lbnQuYXR0cmlidXRlcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsQXR0cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBhdHRyaWIgPSBlbEF0dHJzW2ldO1xuICAgICAgcmVzLnNldChhdHRyaWIubmFtZSwgYXR0cmliLnZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBoYXNBdHRyaWJ1dGUoZWxlbWVudCwgYXR0cmlidXRlOiBzdHJpbmcpOiBib29sZWFuIHsgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZSk7IH1cbiAgZ2V0QXR0cmlidXRlKGVsZW1lbnQsIGF0dHJpYnV0ZTogc3RyaW5nKTogc3RyaW5nIHsgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZSk7IH1cbiAgc2V0QXR0cmlidXRlKGVsZW1lbnQsIG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZykgeyBlbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7IH1cbiAgc2V0QXR0cmlidXRlTlMoZWxlbWVudCwgbnM6IHN0cmluZywgbmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhucywgbmFtZSwgdmFsdWUpO1xuICB9XG4gIHJlbW92ZUF0dHJpYnV0ZShlbGVtZW50LCBhdHRyaWJ1dGU6IHN0cmluZykgeyBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGUpOyB9XG4gIHRlbXBsYXRlQXdhcmVSb290KGVsKTogYW55IHsgcmV0dXJuIHRoaXMuaXNUZW1wbGF0ZUVsZW1lbnQoZWwpID8gdGhpcy5jb250ZW50KGVsKSA6IGVsOyB9XG4gIGNyZWF0ZUh0bWxEb2N1bWVudCgpOiBIVE1MRG9jdW1lbnQge1xuICAgIHJldHVybiBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoJ2Zha2VUaXRsZScpO1xuICB9XG4gIGRlZmF1bHREb2MoKTogSFRNTERvY3VtZW50IHsgcmV0dXJuIGRvY3VtZW50OyB9XG4gIGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbCk6IGFueSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4ge3RvcDogMCwgYm90dG9tOiAwLCBsZWZ0OiAwLCByaWdodDogMCwgd2lkdGg6IDAsIGhlaWdodDogMH07XG4gICAgfVxuICB9XG4gIGdldFRpdGxlKCk6IHN0cmluZyB7IHJldHVybiBkb2N1bWVudC50aXRsZTsgfVxuICBzZXRUaXRsZShuZXdUaXRsZTogc3RyaW5nKSB7IGRvY3VtZW50LnRpdGxlID0gbmV3VGl0bGUgfHwgJyc7IH1cbiAgZWxlbWVudE1hdGNoZXMobiwgc2VsZWN0b3I6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHZhciBtYXRjaGVzID0gZmFsc2U7XG4gICAgaWYgKG4gaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgaWYgKG4ubWF0Y2hlcykge1xuICAgICAgICBtYXRjaGVzID0gbi5tYXRjaGVzKHNlbGVjdG9yKTtcbiAgICAgIH0gZWxzZSBpZiAobi5tc01hdGNoZXNTZWxlY3Rvcikge1xuICAgICAgICBtYXRjaGVzID0gbi5tc01hdGNoZXNTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICB9IGVsc2UgaWYgKG4ud2Via2l0TWF0Y2hlc1NlbGVjdG9yKSB7XG4gICAgICAgIG1hdGNoZXMgPSBuLndlYmtpdE1hdGNoZXNTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXRjaGVzO1xuICB9XG4gIGlzVGVtcGxhdGVFbGVtZW50KGVsOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZWwgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBlbC5ub2RlTmFtZSA9PSBcIlRFTVBMQVRFXCI7XG4gIH1cbiAgaXNUZXh0Tm9kZShub2RlOiBOb2RlKTogYm9vbGVhbiB7IHJldHVybiBub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERTsgfVxuICBpc0NvbW1lbnROb2RlKG5vZGU6IE5vZGUpOiBib29sZWFuIHsgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT09IE5vZGUuQ09NTUVOVF9OT0RFOyB9XG4gIGlzRWxlbWVudE5vZGUobm9kZTogTm9kZSk6IGJvb2xlYW4geyByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREU7IH1cbiAgaGFzU2hhZG93Um9vdChub2RlKTogYm9vbGVhbiB7IHJldHVybiBub2RlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgaXNQcmVzZW50KG5vZGUuc2hhZG93Um9vdCk7IH1cbiAgaXNTaGFkb3dSb290KG5vZGUpOiBib29sZWFuIHsgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50OyB9XG4gIGltcG9ydEludG9Eb2Mobm9kZTogTm9kZSk6IGFueSB7XG4gICAgdmFyIHRvSW1wb3J0ID0gbm9kZTtcbiAgICBpZiAodGhpcy5pc1RlbXBsYXRlRWxlbWVudChub2RlKSkge1xuICAgICAgdG9JbXBvcnQgPSB0aGlzLmNvbnRlbnQobm9kZSk7XG4gICAgfVxuICAgIHJldHVybiBkb2N1bWVudC5pbXBvcnROb2RlKHRvSW1wb3J0LCB0cnVlKTtcbiAgfVxuICBhZG9wdE5vZGUobm9kZTogTm9kZSk6IGFueSB7IHJldHVybiBkb2N1bWVudC5hZG9wdE5vZGUobm9kZSk7IH1cbiAgZ2V0SHJlZihlbDogRWxlbWVudCk6IHN0cmluZyB7IHJldHVybiAoPGFueT5lbCkuaHJlZjsgfVxuICBnZXRFdmVudEtleShldmVudCk6IHN0cmluZyB7XG4gICAgdmFyIGtleSA9IGV2ZW50LmtleTtcbiAgICBpZiAoaXNCbGFuayhrZXkpKSB7XG4gICAgICBrZXkgPSBldmVudC5rZXlJZGVudGlmaWVyO1xuICAgICAgLy8ga2V5SWRlbnRpZmllciBpcyBkZWZpbmVkIGluIHRoZSBvbGQgZHJhZnQgb2YgRE9NIExldmVsIDMgRXZlbnRzIGltcGxlbWVudGVkIGJ5IENocm9tZSBhbmRcbiAgICAgIC8vIFNhZmFyaVxuICAgICAgLy8gY2ZcbiAgICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDcvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMDcxMjIxL2V2ZW50cy5odG1sI0V2ZW50cy1LZXlib2FyZEV2ZW50cy1JbnRlcmZhY2VzXG4gICAgICBpZiAoaXNCbGFuayhrZXkpKSB7XG4gICAgICAgIHJldHVybiAnVW5pZGVudGlmaWVkJztcbiAgICAgIH1cbiAgICAgIGlmIChrZXkuc3RhcnRzV2l0aCgnVSsnKSkge1xuICAgICAgICBrZXkgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGtleS5zdWJzdHJpbmcoMiksIDE2KSk7XG4gICAgICAgIGlmIChldmVudC5sb2NhdGlvbiA9PT0gRE9NX0tFWV9MT0NBVElPTl9OVU1QQUQgJiYgX2Nocm9tZU51bUtleVBhZE1hcC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgLy8gVGhlcmUgaXMgYSBidWcgaW4gQ2hyb21lIGZvciBudW1lcmljIGtleXBhZCBrZXlzOlxuICAgICAgICAgIC8vIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0xNTU2NTRcbiAgICAgICAgICAvLyAxLCAyLCAzIC4uLiBhcmUgcmVwb3J0ZWQgYXMgQSwgQiwgQyAuLi5cbiAgICAgICAgICBrZXkgPSBfY2hyb21lTnVtS2V5UGFkTWFwW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKF9rZXlNYXAuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAga2V5ID0gX2tleU1hcFtrZXldO1xuICAgIH1cbiAgICByZXR1cm4ga2V5O1xuICB9XG4gIGdldEdsb2JhbEV2ZW50VGFyZ2V0KHRhcmdldDogc3RyaW5nKTogRXZlbnRUYXJnZXQge1xuICAgIGlmICh0YXJnZXQgPT0gXCJ3aW5kb3dcIikge1xuICAgICAgcmV0dXJuIHdpbmRvdztcbiAgICB9IGVsc2UgaWYgKHRhcmdldCA9PSBcImRvY3VtZW50XCIpIHtcbiAgICAgIHJldHVybiBkb2N1bWVudDtcbiAgICB9IGVsc2UgaWYgKHRhcmdldCA9PSBcImJvZHlcIikge1xuICAgICAgcmV0dXJuIGRvY3VtZW50LmJvZHk7XG4gICAgfVxuICB9XG4gIGdldEhpc3RvcnkoKTogSGlzdG9yeSB7IHJldHVybiB3aW5kb3cuaGlzdG9yeTsgfVxuICBnZXRMb2NhdGlvbigpOiBMb2NhdGlvbiB7IHJldHVybiB3aW5kb3cubG9jYXRpb247IH1cbiAgZ2V0QmFzZUhyZWYoKTogc3RyaW5nIHtcbiAgICB2YXIgaHJlZiA9IGdldEJhc2VFbGVtZW50SHJlZigpO1xuICAgIGlmIChpc0JsYW5rKGhyZWYpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHJlbGF0aXZlUGF0aChocmVmKTtcbiAgfVxuICByZXNldEJhc2VFbGVtZW50KCk6IHZvaWQgeyBiYXNlRWxlbWVudCA9IG51bGw7IH1cbiAgZ2V0VXNlckFnZW50KCk6IHN0cmluZyB7IHJldHVybiB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudDsgfVxuICBzZXREYXRhKGVsZW1lbnQsIG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKGVsZW1lbnQsICdkYXRhLScgKyBuYW1lLCB2YWx1ZSk7XG4gIH1cbiAgZ2V0RGF0YShlbGVtZW50LCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGUoZWxlbWVudCwgJ2RhdGEtJyArIG5hbWUpOyB9XG4gIGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk6IGFueSB7IHJldHVybiBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpOyB9XG4gIC8vIFRPRE8odGJvc2NoKTogbW92ZSB0aGlzIGludG8gYSBzZXBhcmF0ZSBlbnZpcm9ubWVudCBjbGFzcyBvbmNlIHdlIGhhdmUgaXRcbiAgc2V0R2xvYmFsVmFyKHBhdGg6IHN0cmluZywgdmFsdWU6IGFueSkgeyBzZXRWYWx1ZU9uUGF0aChnbG9iYWwsIHBhdGgsIHZhbHVlKTsgfVxuICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoY2FsbGJhY2spOiBudW1iZXIgeyByZXR1cm4gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShjYWxsYmFjayk7IH1cbiAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoaWQ6IG51bWJlcikgeyB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUoaWQpOyB9XG4gIHBlcmZvcm1hbmNlTm93KCk6IG51bWJlciB7XG4gICAgLy8gcGVyZm9ybWFuY2Uubm93KCkgaXMgbm90IGF2YWlsYWJsZSBpbiBhbGwgYnJvd3NlcnMsIHNlZVxuICAgIC8vIGh0dHA6Ly9jYW5pdXNlLmNvbS8jc2VhcmNoPXBlcmZvcm1hbmNlLm5vd1xuICAgIGlmIChpc1ByZXNlbnQod2luZG93LnBlcmZvcm1hbmNlKSAmJiBpc1ByZXNlbnQod2luZG93LnBlcmZvcm1hbmNlLm5vdykpIHtcbiAgICAgIHJldHVybiB3aW5kb3cucGVyZm9ybWFuY2Uubm93KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBEYXRlV3JhcHBlci50b01pbGxpcyhEYXRlV3JhcHBlci5ub3coKSk7XG4gICAgfVxuICB9XG59XG5cblxudmFyIGJhc2VFbGVtZW50ID0gbnVsbDtcbmZ1bmN0aW9uIGdldEJhc2VFbGVtZW50SHJlZigpOiBzdHJpbmcge1xuICBpZiAoaXNCbGFuayhiYXNlRWxlbWVudCkpIHtcbiAgICBiYXNlRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2Jhc2UnKTtcbiAgICBpZiAoaXNCbGFuayhiYXNlRWxlbWVudCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYmFzZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdocmVmJyk7XG59XG5cbi8vIGJhc2VkIG9uIHVybFV0aWxzLmpzIGluIEFuZ3VsYXJKUyAxXG52YXIgdXJsUGFyc2luZ05vZGUgPSBudWxsO1xuZnVuY3Rpb24gcmVsYXRpdmVQYXRoKHVybCk6IHN0cmluZyB7XG4gIGlmIChpc0JsYW5rKHVybFBhcnNpbmdOb2RlKSkge1xuICAgIHVybFBhcnNpbmdOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XG4gIH1cbiAgdXJsUGFyc2luZ05vZGUuc2V0QXR0cmlidXRlKCdocmVmJywgdXJsKTtcbiAgcmV0dXJuICh1cmxQYXJzaW5nTm9kZS5wYXRobmFtZS5jaGFyQXQoMCkgPT09ICcvJykgPyB1cmxQYXJzaW5nTm9kZS5wYXRobmFtZSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nICsgdXJsUGFyc2luZ05vZGUucGF0aG5hbWU7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvcGxhdGZvcm0vYnJvd3Nlci9icm93c2VyX2FkYXB0ZXIudHNcbiAqKi8iLCJpbXBvcnQge0xpc3RXcmFwcGVyLCBTdHJpbmdNYXBXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtpc1ByZXNlbnQsIGlzRnVuY3Rpb24sIFR5cGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge0RvbUFkYXB0ZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZG9tX2FkYXB0ZXInO1xuaW1wb3J0IHtYSFJJbXBsfSBmcm9tICdhbmd1bGFyMi9zcmMvcGxhdGZvcm0vYnJvd3Nlci94aHJfaW1wbCc7XG5cblxuLyoqXG4gKiBQcm92aWRlcyBET00gb3BlcmF0aW9ucyBpbiBhbnkgYnJvd3NlciBlbnZpcm9ubWVudC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEdlbmVyaWNCcm93c2VyRG9tQWRhcHRlciBleHRlbmRzIERvbUFkYXB0ZXIge1xuICBwcml2YXRlIF9hbmltYXRpb25QcmVmaXg6IHN0cmluZyA9IG51bGw7XG4gIHByaXZhdGUgX3RyYW5zaXRpb25FbmQ6IHN0cmluZyA9IG51bGw7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBlbGVtZW50ID0gdGhpcy5jcmVhdGVFbGVtZW50KCdkaXYnLCB0aGlzLmRlZmF1bHREb2MoKSk7XG4gICAgICBpZiAoaXNQcmVzZW50KHRoaXMuZ2V0U3R5bGUoZWxlbWVudCwgJ2FuaW1hdGlvbk5hbWUnKSkpIHtcbiAgICAgICAgdGhpcy5fYW5pbWF0aW9uUHJlZml4ID0gJyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgZG9tUHJlZml4ZXMgPSBbJ1dlYmtpdCcsICdNb3onLCAnTycsICdtcyddO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRvbVByZWZpeGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGlzUHJlc2VudCh0aGlzLmdldFN0eWxlKGVsZW1lbnQsIGRvbVByZWZpeGVzW2ldICsgJ0FuaW1hdGlvbk5hbWUnKSkpIHtcbiAgICAgICAgICAgIHRoaXMuX2FuaW1hdGlvblByZWZpeCA9ICctJyArIGRvbVByZWZpeGVzW2ldLnRvTG93ZXJDYXNlKCkgKyAnLSc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciB0cmFuc0VuZEV2ZW50TmFtZXM6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9ID0ge1xuICAgICAgICBXZWJraXRUcmFuc2l0aW9uOiAnd2Via2l0VHJhbnNpdGlvbkVuZCcsXG4gICAgICAgIE1velRyYW5zaXRpb246ICd0cmFuc2l0aW9uZW5kJyxcbiAgICAgICAgT1RyYW5zaXRpb246ICdvVHJhbnNpdGlvbkVuZCBvdHJhbnNpdGlvbmVuZCcsXG4gICAgICAgIHRyYW5zaXRpb246ICd0cmFuc2l0aW9uZW5kJ1xuICAgICAgfTtcbiAgICAgIFN0cmluZ01hcFdyYXBwZXIuZm9yRWFjaCh0cmFuc0VuZEV2ZW50TmFtZXMsICh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgIGlmIChpc1ByZXNlbnQodGhpcy5nZXRTdHlsZShlbGVtZW50LCBrZXkpKSkge1xuICAgICAgICAgIHRoaXMuX3RyYW5zaXRpb25FbmQgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5fYW5pbWF0aW9uUHJlZml4ID0gbnVsbDtcbiAgICAgIHRoaXMuX3RyYW5zaXRpb25FbmQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGdldFhIUigpOiBUeXBlIHsgcmV0dXJuIFhIUkltcGw7IH1cbiAgZ2V0RGlzdHJpYnV0ZWROb2RlcyhlbDogSFRNTEVsZW1lbnQpOiBOb2RlW10geyByZXR1cm4gKDxhbnk+ZWwpLmdldERpc3RyaWJ1dGVkTm9kZXMoKTsgfVxuICByZXNvbHZlQW5kU2V0SHJlZihlbDogSFRNTEFuY2hvckVsZW1lbnQsIGJhc2VVcmw6IHN0cmluZywgaHJlZjogc3RyaW5nKSB7XG4gICAgZWwuaHJlZiA9IGhyZWYgPT0gbnVsbCA/IGJhc2VVcmwgOiBiYXNlVXJsICsgJy8uLi8nICsgaHJlZjtcbiAgfVxuICBzdXBwb3J0c0RPTUV2ZW50cygpOiBib29sZWFuIHsgcmV0dXJuIHRydWU7IH1cbiAgc3VwcG9ydHNOYXRpdmVTaGFkb3dET00oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzRnVuY3Rpb24oKDxhbnk+dGhpcy5kZWZhdWx0RG9jKCkuYm9keSkuY3JlYXRlU2hhZG93Um9vdCk7XG4gIH1cbiAgZ2V0QW5pbWF0aW9uUHJlZml4KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGlzUHJlc2VudCh0aGlzLl9hbmltYXRpb25QcmVmaXgpID8gdGhpcy5fYW5pbWF0aW9uUHJlZml4IDogXCJcIjtcbiAgfVxuICBnZXRUcmFuc2l0aW9uRW5kKCk6IHN0cmluZyB7IHJldHVybiBpc1ByZXNlbnQodGhpcy5fdHJhbnNpdGlvbkVuZCkgPyB0aGlzLl90cmFuc2l0aW9uRW5kIDogXCJcIjsgfVxuICBzdXBwb3J0c0FuaW1hdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNQcmVzZW50KHRoaXMuX2FuaW1hdGlvblByZWZpeCkgJiYgaXNQcmVzZW50KHRoaXMuX3RyYW5zaXRpb25FbmQpO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvcGxhdGZvcm0vYnJvd3Nlci9nZW5lcmljX2Jyb3dzZXJfYWRhcHRlci50c1xuICoqLyIsImltcG9ydCB7UHJvbWlzZSwgUHJvbWlzZVdyYXBwZXIsIFByb21pc2VDb21wbGV0ZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvcHJvbWlzZSc7XG5pbXBvcnQge2lzUHJlc2VudH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7WEhSfSBmcm9tICdhbmd1bGFyMi9zcmMvY29tcGlsZXIveGhyJztcblxuZXhwb3J0IGNsYXNzIFhIUkltcGwgZXh0ZW5kcyBYSFIge1xuICBnZXQodXJsOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHZhciBjb21wbGV0ZXI6IFByb21pc2VDb21wbGV0ZXIgPCBzdHJpbmcgPj0gUHJvbWlzZVdyYXBwZXIuY29tcGxldGVyKCk7XG4gICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIHhoci5vcGVuKCdHRVQnLCB1cmwsIHRydWUpO1xuICAgIHhoci5yZXNwb25zZVR5cGUgPSAndGV4dCc7XG5cbiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICAvLyByZXNwb25zZVRleHQgaXMgdGhlIG9sZC1zY2hvb2wgd2F5IG9mIHJldHJpZXZpbmcgcmVzcG9uc2UgKHN1cHBvcnRlZCBieSBJRTggJiA5KVxuICAgICAgLy8gcmVzcG9uc2UvcmVzcG9uc2VUeXBlIHByb3BlcnRpZXMgd2VyZSBpbnRyb2R1Y2VkIGluIFhIUiBMZXZlbDIgc3BlYyAoc3VwcG9ydGVkIGJ5IElFMTApXG4gICAgICB2YXIgcmVzcG9uc2UgPSBpc1ByZXNlbnQoeGhyLnJlc3BvbnNlKSA/IHhoci5yZXNwb25zZSA6IHhoci5yZXNwb25zZVRleHQ7XG5cbiAgICAgIC8vIG5vcm1hbGl6ZSBJRTkgYnVnIChodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xNDUwKVxuICAgICAgdmFyIHN0YXR1cyA9IHhoci5zdGF0dXMgPT09IDEyMjMgPyAyMDQgOiB4aHIuc3RhdHVzO1xuXG4gICAgICAvLyBmaXggc3RhdHVzIGNvZGUgd2hlbiBpdCBpcyAwICgwIHN0YXR1cyBpcyB1bmRvY3VtZW50ZWQpLlxuICAgICAgLy8gT2NjdXJzIHdoZW4gYWNjZXNzaW5nIGZpbGUgcmVzb3VyY2VzIG9yIG9uIEFuZHJvaWQgNC4xIHN0b2NrIGJyb3dzZXJcbiAgICAgIC8vIHdoaWxlIHJldHJpZXZpbmcgZmlsZXMgZnJvbSBhcHBsaWNhdGlvbiBjYWNoZS5cbiAgICAgIGlmIChzdGF0dXMgPT09IDApIHtcbiAgICAgICAgc3RhdHVzID0gcmVzcG9uc2UgPyAyMDAgOiAwO1xuICAgICAgfVxuXG4gICAgICBpZiAoMjAwIDw9IHN0YXR1cyAmJiBzdGF0dXMgPD0gMzAwKSB7XG4gICAgICAgIGNvbXBsZXRlci5yZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXBsZXRlci5yZWplY3QoYEZhaWxlZCB0byBsb2FkICR7dXJsfWAsIG51bGwpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uKCkgeyBjb21wbGV0ZXIucmVqZWN0KGBGYWlsZWQgdG8gbG9hZCAke3VybH1gLCBudWxsKTsgfTtcblxuICAgIHhoci5zZW5kKCk7XG4gICAgcmV0dXJuIGNvbXBsZXRlci5wcm9taXNlO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvcGxhdGZvcm0vYnJvd3Nlci94aHJfaW1wbC50c1xuICoqLyIsImltcG9ydCB7TWFwLCBNYXBXcmFwcGVyLCBMaXN0V3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcbmltcG9ydCB7Q09OU1QsIENPTlNUX0VYUFIsIGdsb2JhbCwgaXNQcmVzZW50fSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9uLCBXcmFwcGVkRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtQcm9taXNlV3JhcHBlciwgT2JzZXJ2YWJsZVdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvYXN5bmMnO1xuXG5pbXBvcnQge0RPTX0gZnJvbSAnYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9kb21fYWRhcHRlcic7XG5cbmltcG9ydCB7XG4gIEluamVjdGFibGUsXG4gIFRlc3RhYmlsaXR5UmVnaXN0cnksXG4gIFRlc3RhYmlsaXR5LFxuICBHZXRUZXN0YWJpbGl0eSxcbiAgc2V0VGVzdGFiaWxpdHlHZXR0ZXJcbn0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5cbmNsYXNzIFB1YmxpY1Rlc3RhYmlsaXR5IHtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfdGVzdGFiaWxpdHk6IFRlc3RhYmlsaXR5O1xuXG4gIGNvbnN0cnVjdG9yKHRlc3RhYmlsaXR5OiBUZXN0YWJpbGl0eSkgeyB0aGlzLl90ZXN0YWJpbGl0eSA9IHRlc3RhYmlsaXR5OyB9XG5cbiAgaXNTdGFibGUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl90ZXN0YWJpbGl0eS5pc1N0YWJsZSgpOyB9XG5cbiAgd2hlblN0YWJsZShjYWxsYmFjazogRnVuY3Rpb24pIHsgdGhpcy5fdGVzdGFiaWxpdHkud2hlblN0YWJsZShjYWxsYmFjayk7IH1cblxuICBmaW5kQmluZGluZ3ModXNpbmc6IGFueSwgcHJvdmlkZXI6IHN0cmluZywgZXhhY3RNYXRjaDogYm9vbGVhbik6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5maW5kUHJvdmlkZXJzKHVzaW5nLCBwcm92aWRlciwgZXhhY3RNYXRjaCk7XG4gIH1cblxuICBmaW5kUHJvdmlkZXJzKHVzaW5nOiBhbnksIHByb3ZpZGVyOiBzdHJpbmcsIGV4YWN0TWF0Y2g6IGJvb2xlYW4pOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3Rlc3RhYmlsaXR5LmZpbmRCaW5kaW5ncyh1c2luZywgcHJvdmlkZXIsIGV4YWN0TWF0Y2gpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCcm93c2VyR2V0VGVzdGFiaWxpdHkgaW1wbGVtZW50cyBHZXRUZXN0YWJpbGl0eSB7XG4gIHN0YXRpYyBpbml0KCkgeyBzZXRUZXN0YWJpbGl0eUdldHRlcihuZXcgQnJvd3NlckdldFRlc3RhYmlsaXR5KCkpOyB9XG5cbiAgYWRkVG9XaW5kb3cocmVnaXN0cnk6IFRlc3RhYmlsaXR5UmVnaXN0cnkpOiB2b2lkIHtcbiAgICBnbG9iYWwuZ2V0QW5ndWxhclRlc3RhYmlsaXR5ID0gKGVsZW06IGFueSwgZmluZEluQW5jZXN0b3JzOiBib29sZWFuID0gdHJ1ZSkgPT4ge1xuICAgICAgdmFyIHRlc3RhYmlsaXR5ID0gcmVnaXN0cnkuZmluZFRlc3RhYmlsaXR5SW5UcmVlKGVsZW0sIGZpbmRJbkFuY2VzdG9ycyk7XG4gICAgICBpZiAodGVzdGFiaWxpdHkgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHRlc3RhYmlsaXR5IGZvciBlbGVtZW50LicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBQdWJsaWNUZXN0YWJpbGl0eSh0ZXN0YWJpbGl0eSk7XG4gICAgfTtcblxuICAgIGdsb2JhbC5nZXRBbGxBbmd1bGFyVGVzdGFiaWxpdGllcyA9ICgpID0+IHtcbiAgICAgIHZhciB0ZXN0YWJpbGl0aWVzID0gcmVnaXN0cnkuZ2V0QWxsVGVzdGFiaWxpdGllcygpO1xuICAgICAgcmV0dXJuIHRlc3RhYmlsaXRpZXMubWFwKCh0ZXN0YWJpbGl0eSkgPT4geyByZXR1cm4gbmV3IFB1YmxpY1Rlc3RhYmlsaXR5KHRlc3RhYmlsaXR5KTsgfSk7XG4gICAgfTtcbiAgfVxuXG4gIGZpbmRUZXN0YWJpbGl0eUluVHJlZShyZWdpc3RyeTogVGVzdGFiaWxpdHlSZWdpc3RyeSwgZWxlbTogYW55LFxuICAgICAgICAgICAgICAgICAgICAgICAgZmluZEluQW5jZXN0b3JzOiBib29sZWFuKTogVGVzdGFiaWxpdHkge1xuICAgIGlmIChlbGVtID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgdCA9IHJlZ2lzdHJ5LmdldFRlc3RhYmlsaXR5KGVsZW0pO1xuICAgIGlmIChpc1ByZXNlbnQodCkpIHtcbiAgICAgIHJldHVybiB0O1xuICAgIH0gZWxzZSBpZiAoIWZpbmRJbkFuY2VzdG9ycykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChET00uaXNTaGFkb3dSb290KGVsZW0pKSB7XG4gICAgICByZXR1cm4gdGhpcy5maW5kVGVzdGFiaWxpdHlJblRyZWUocmVnaXN0cnksIERPTS5nZXRIb3N0KGVsZW0pLCB0cnVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmluZFRlc3RhYmlsaXR5SW5UcmVlKHJlZ2lzdHJ5LCBET00ucGFyZW50RWxlbWVudChlbGVtKSwgdHJ1ZSk7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9icm93c2VyL3Rlc3RhYmlsaXR5LnRzXG4gKiovIiwiLyoqXG4gKiBUaGlzIGlzIGhlcmUgYmVjYXVzZSBEQVJUIHJlcXVpcmVzIGl0LiBJdCBpcyBub29wIGluIEpTLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd3RmSW5pdCgpIHt9XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9wcm9maWxlL3d0Zl9pbml0LnRzXG4gKiovIiwiaW1wb3J0IHtET019IGZyb20gJ2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZG9tX2FkYXB0ZXInO1xuXG4vKipcbiAqIEEgc2VydmljZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGdldCBhbmQgc2V0IHRoZSB0aXRsZSBvZiBhIGN1cnJlbnQgSFRNTCBkb2N1bWVudC5cbiAqXG4gKiBTaW5jZSBhbiBBbmd1bGFyIDIgYXBwbGljYXRpb24gY2FuJ3QgYmUgYm9vdHN0cmFwcGVkIG9uIHRoZSBlbnRpcmUgSFRNTCBkb2N1bWVudCAoYDxodG1sPmAgdGFnKVxuICogaXQgaXMgbm90IHBvc3NpYmxlIHRvIGJpbmQgdG8gdGhlIGB0ZXh0YCBwcm9wZXJ0eSBvZiB0aGUgYEhUTUxUaXRsZUVsZW1lbnRgIGVsZW1lbnRzXG4gKiAocmVwcmVzZW50aW5nIHRoZSBgPHRpdGxlPmAgdGFnKS4gSW5zdGVhZCwgdGhpcyBzZXJ2aWNlIGNhbiBiZSB1c2VkIHRvIHNldCBhbmQgZ2V0IHRoZSBjdXJyZW50XG4gKiB0aXRsZSB2YWx1ZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFRpdGxlIHtcbiAgLyoqXG4gICAqIEdldCB0aGUgdGl0bGUgb2YgdGhlIGN1cnJlbnQgSFRNTCBkb2N1bWVudC5cbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldFRpdGxlKCk6IHN0cmluZyB7IHJldHVybiBET00uZ2V0VGl0bGUoKTsgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHRpdGxlIG9mIHRoZSBjdXJyZW50IEhUTUwgZG9jdW1lbnQuXG4gICAqIEBwYXJhbSBuZXdUaXRsZVxuICAgKi9cbiAgc2V0VGl0bGUobmV3VGl0bGU6IHN0cmluZykgeyBET00uc2V0VGl0bGUobmV3VGl0bGUpOyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvcGxhdGZvcm0vYnJvd3Nlci90aXRsZS50c1xuICoqLyIsIi8qKlxuICogVGhpcyBpcyBhIHNldCBvZiBjbGFzc2VzIGFuZCBvYmplY3RzIHRoYXQgY2FuIGJlIHVzZWQgYm90aCBpbiB0aGUgYnJvd3NlciBhbmQgb24gdGhlIHNlcnZlci5cbiAqL1xuZXhwb3J0IHtET00sIHNldFJvb3REb21BZGFwdGVyLCBEb21BZGFwdGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2RvbV9hZGFwdGVyJztcbmV4cG9ydCB7RG9tUmVuZGVyZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZG9tX3JlbmRlcmVyJztcbmV4cG9ydCB7RE9DVU1FTlR9IGZyb20gJ2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZG9tX3Rva2Vucyc7XG5leHBvcnQge1NoYXJlZFN0eWxlc0hvc3QsIERvbVNoYXJlZFN0eWxlc0hvc3R9IGZyb20gJ2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vc2hhcmVkX3N0eWxlc19ob3N0JztcbmV4cG9ydCB7RG9tRXZlbnRzUGx1Z2lufSBmcm9tICdhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2V2ZW50cy9kb21fZXZlbnRzJztcbmV4cG9ydCB7XG4gIEVWRU5UX01BTkFHRVJfUExVR0lOUyxcbiAgRXZlbnRNYW5hZ2VyLFxuICBFdmVudE1hbmFnZXJQbHVnaW5cbn0gZnJvbSAnYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9ldmVudHMvZXZlbnRfbWFuYWdlcic7XG5leHBvcnQgKiBmcm9tICdhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2RlYnVnL2J5JztcbmV4cG9ydCAqIGZyb20gJ2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZGVidWcvZGVidWdfZWxlbWVudF92aWV3X2xpc3RlbmVyJztcblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9wbGF0Zm9ybS9jb21tb25fZG9tLnRzXG4gKiovIiwiaW1wb3J0IHtUeXBlLCBpc1ByZXNlbnQsIGlzQmxhbmt9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge1ByZWRpY2F0ZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcbmltcG9ydCB7RE9NfSBmcm9tICdhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2RvbV9hZGFwdGVyJztcbmltcG9ydCB7RGVidWdFbGVtZW50fSBmcm9tICdhbmd1bGFyMi9jb3JlJztcblxuLyoqXG4gKiBQcmVkaWNhdGVzIGZvciB1c2Ugd2l0aCB7QGxpbmsgRGVidWdFbGVtZW50fSdzIHF1ZXJ5IGZ1bmN0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIEJ5IHtcbiAgLyoqXG4gICAqIE1hdGNoIGFsbCBlbGVtZW50cy5cbiAgICpcbiAgICogIyMgRXhhbXBsZVxuICAgKlxuICAgKiB7QGV4YW1wbGUgcGxhdGZvcm0vZG9tL2RlYnVnL3RzL2J5L2J5LnRzIHJlZ2lvbj0nYnlfYWxsJ31cbiAgICovXG4gIHN0YXRpYyBhbGwoKTogUHJlZGljYXRlPERlYnVnRWxlbWVudD4geyByZXR1cm4gKGRlYnVnRWxlbWVudCkgPT4gdHJ1ZTsgfVxuXG4gIC8qKlxuICAgKiBNYXRjaCBlbGVtZW50cyBieSB0aGUgZ2l2ZW4gQ1NTIHNlbGVjdG9yLlxuICAgKlxuICAgKiAjIyBFeGFtcGxlXG4gICAqXG4gICAqIHtAZXhhbXBsZSBwbGF0Zm9ybS9kb20vZGVidWcvdHMvYnkvYnkudHMgcmVnaW9uPSdieV9jc3MnfVxuICAgKi9cbiAgc3RhdGljIGNzcyhzZWxlY3Rvcjogc3RyaW5nKTogUHJlZGljYXRlPERlYnVnRWxlbWVudD4ge1xuICAgIHJldHVybiAoZGVidWdFbGVtZW50KSA9PiB7XG4gICAgICByZXR1cm4gaXNQcmVzZW50KGRlYnVnRWxlbWVudC5uYXRpdmVFbGVtZW50KSA/XG4gICAgICAgICAgICAgICAgIERPTS5lbGVtZW50TWF0Y2hlcyhkZWJ1Z0VsZW1lbnQubmF0aXZlRWxlbWVudCwgc2VsZWN0b3IpIDpcbiAgICAgICAgICAgICAgICAgZmFsc2U7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXRjaCBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIGdpdmVuIGRpcmVjdGl2ZSBwcmVzZW50LlxuICAgKlxuICAgKiAjIyBFeGFtcGxlXG4gICAqXG4gICAqIHtAZXhhbXBsZSBwbGF0Zm9ybS9kb20vZGVidWcvdHMvYnkvYnkudHMgcmVnaW9uPSdieV9kaXJlY3RpdmUnfVxuICAgKi9cbiAgc3RhdGljIGRpcmVjdGl2ZSh0eXBlOiBUeXBlKTogUHJlZGljYXRlPERlYnVnRWxlbWVudD4ge1xuICAgIHJldHVybiAoZGVidWdFbGVtZW50KSA9PiB7IHJldHVybiBkZWJ1Z0VsZW1lbnQuaGFzRGlyZWN0aXZlKHR5cGUpOyB9O1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2RlYnVnL2J5LnRzXG4gKiovIiwiaW1wb3J0IHtDT05TVF9FWFBSLCBpc1ByZXNlbnQsIE51bWJlcldyYXBwZXIsIFN0cmluZ1dyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge01hcFdyYXBwZXIsIE1hcCwgTGlzdFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge0luamVjdGFibGUsIHByb3ZpZGUsIFByb3ZpZGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5pbXBvcnQge0FwcFZpZXdMaXN0ZW5lcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL3ZpZXdfbGlzdGVuZXInO1xuaW1wb3J0IHtBcHBWaWV3fSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvdmlldyc7XG5pbXBvcnQge0RPTX0gZnJvbSAnYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9kb21fYWRhcHRlcic7XG5pbXBvcnQge1JlbmRlcmVyfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9yZW5kZXIvYXBpJztcbmltcG9ydCB7RGVidWdFbGVtZW50LCBEZWJ1Z0VsZW1lbnRffSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kZWJ1Zy9kZWJ1Z19lbGVtZW50JztcblxuY29uc3QgTkdfSURfUFJPUEVSVFkgPSAnbmdpZCc7XG5jb25zdCBJTlNQRUNUX0dMT0JBTF9OQU1FID0gJ25nLnByb2JlJztcblxuY29uc3QgTkdfSURfU0VQQVJBVE9SID0gJyMnO1xuXG4vLyBOZWVkIHRvIGtlZXAgdGhlIHZpZXdzIGluIGEgZ2xvYmFsIE1hcCBzbyB0aGF0IG11bHRpcGxlIGFuZ3VsYXIgYXBwcyBhcmUgc3VwcG9ydGVkXG52YXIgX2FsbElkc0J5VmlldyA9IG5ldyBNYXA8QXBwVmlldywgbnVtYmVyPigpO1xudmFyIF9hbGxWaWV3c0J5SWQgPSBuZXcgTWFwPG51bWJlciwgQXBwVmlldz4oKTtcblxudmFyIF9uZXh0SWQgPSAwO1xuXG5mdW5jdGlvbiBfc2V0RWxlbWVudElkKGVsZW1lbnQsIGluZGljZXM6IG51bWJlcltdKSB7XG4gIGlmIChpc1ByZXNlbnQoZWxlbWVudCkgJiYgRE9NLmlzRWxlbWVudE5vZGUoZWxlbWVudCkpIHtcbiAgICBET00uc2V0RGF0YShlbGVtZW50LCBOR19JRF9QUk9QRVJUWSwgaW5kaWNlcy5qb2luKE5HX0lEX1NFUEFSQVRPUikpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9nZXRFbGVtZW50SWQoZWxlbWVudCk6IG51bWJlcltdIHtcbiAgdmFyIGVsSWQgPSBET00uZ2V0RGF0YShlbGVtZW50LCBOR19JRF9QUk9QRVJUWSk7XG4gIGlmIChpc1ByZXNlbnQoZWxJZCkpIHtcbiAgICByZXR1cm4gZWxJZC5zcGxpdChOR19JRF9TRVBBUkFUT1IpLm1hcChwYXJ0U3RyID0+IE51bWJlcldyYXBwZXIucGFyc2VJbnQocGFydFN0ciwgMTApKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYSB7QGxpbmsgRGVidWdFbGVtZW50fSBmb3IgdGhlIGdpdmVuIG5hdGl2ZSBET00gZWxlbWVudCwgb3JcbiAqIG51bGwgaWYgdGhlIGdpdmVuIG5hdGl2ZSBlbGVtZW50IGRvZXMgbm90IGhhdmUgYW4gQW5ndWxhciB2aWV3IGFzc29jaWF0ZWRcbiAqIHdpdGggaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnNwZWN0TmF0aXZlRWxlbWVudChlbGVtZW50KTogRGVidWdFbGVtZW50IHtcbiAgdmFyIGVsSWQgPSBfZ2V0RWxlbWVudElkKGVsZW1lbnQpO1xuICBpZiAoaXNQcmVzZW50KGVsSWQpKSB7XG4gICAgdmFyIHZpZXcgPSBfYWxsVmlld3NCeUlkLmdldChlbElkWzBdKTtcbiAgICBpZiAoaXNQcmVzZW50KHZpZXcpKSB7XG4gICAgICByZXR1cm4gbmV3IERlYnVnRWxlbWVudF8odmlldywgZWxJZFsxXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRGVidWdFbGVtZW50Vmlld0xpc3RlbmVyIGltcGxlbWVudHMgQXBwVmlld0xpc3RlbmVyIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfcmVuZGVyZXI6IFJlbmRlcmVyKSB7XG4gICAgRE9NLnNldEdsb2JhbFZhcihJTlNQRUNUX0dMT0JBTF9OQU1FLCBpbnNwZWN0TmF0aXZlRWxlbWVudCk7XG4gIH1cblxuICBvblZpZXdDcmVhdGVkKHZpZXc6IEFwcFZpZXcpIHtcbiAgICB2YXIgdmlld0lkID0gX25leHRJZCsrO1xuICAgIF9hbGxWaWV3c0J5SWQuc2V0KHZpZXdJZCwgdmlldyk7XG4gICAgX2FsbElkc0J5Vmlldy5zZXQodmlldywgdmlld0lkKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZpZXcuZWxlbWVudFJlZnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbCA9IHZpZXcuZWxlbWVudFJlZnNbaV07XG4gICAgICBfc2V0RWxlbWVudElkKHRoaXMuX3JlbmRlcmVyLmdldE5hdGl2ZUVsZW1lbnRTeW5jKGVsKSwgW3ZpZXdJZCwgaV0pO1xuICAgIH1cbiAgfVxuXG4gIG9uVmlld0Rlc3Ryb3llZCh2aWV3OiBBcHBWaWV3KSB7XG4gICAgdmFyIHZpZXdJZCA9IF9hbGxJZHNCeVZpZXcuZ2V0KHZpZXcpO1xuICAgIF9hbGxJZHNCeVZpZXcuZGVsZXRlKHZpZXcpO1xuICAgIF9hbGxWaWV3c0J5SWQuZGVsZXRlKHZpZXdJZCk7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm92aWRlcnMgd2hpY2ggc3VwcG9ydCBkZWJ1Z2dpbmcgQW5ndWxhciBhcHBsaWNhdGlvbnMgKGUuZy4gdmlhIGBuZy5wcm9iZWApLlxuICpcbiAqICMjIEV4YW1wbGVcbiAqXG4gKiB7QGV4YW1wbGUgcGxhdGZvcm0vZG9tL2RlYnVnL3RzL2RlYnVnX2VsZW1lbnRfdmlld19saXN0ZW5lci9wcm92aWRlcnMudHMgcmVnaW9uPSdwcm92aWRlcnMnfVxuICovXG5leHBvcnQgY29uc3QgRUxFTUVOVF9QUk9CRV9QUk9WSURFUlM6IGFueVtdID0gQ09OU1RfRVhQUihbXG4gIERlYnVnRWxlbWVudFZpZXdMaXN0ZW5lcixcbiAgQ09OU1RfRVhQUihuZXcgUHJvdmlkZXIoQXBwVmlld0xpc3RlbmVyLCB7dXNlRXhpc3Rpbmc6IERlYnVnRWxlbWVudFZpZXdMaXN0ZW5lcn0pKSxcbl0pO1xuXG4vKipcbiAqIFVzZSB7QGxpbmsgRUxFTUVOVF9QUk9CRV9QUk9WSURFUlN9LlxuICpcbiAqIEBkZXByZWNhdGVkXG4gKi9cbmV4cG9ydCBjb25zdCBFTEVNRU5UX1BST0JFX0JJTkRJTkdTID0gRUxFTUVOVF9QUk9CRV9QUk9WSURFUlM7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2RlYnVnL2RlYnVnX2VsZW1lbnRfdmlld19saXN0ZW5lci50c1xuICoqLyIsImltcG9ydCB7Z2xvYmFsfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtDb21wb25lbnRSZWZ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9keW5hbWljX2NvbXBvbmVudF9sb2FkZXInO1xuaW1wb3J0IHtBbmd1bGFyVG9vbHN9IGZyb20gJy4vY29tbW9uX3Rvb2xzJztcblxudmFyIGNvbnRleHQgPSA8YW55Pmdsb2JhbDtcblxuLyoqXG4gKiBFbmFibGVkIEFuZ3VsYXIgMiBkZWJ1ZyB0b29scyB0aGF0IGFyZSBhY2Nlc3NpYmxlIHZpYSB5b3VyIGJyb3dzZXInc1xuICogZGV2ZWxvcGVyIGNvbnNvbGUuXG4gKlxuICogVXNhZ2U6XG4gKlxuICogMS4gT3BlbiBkZXZlbG9wZXIgY29uc29sZSAoZS5nLiBpbiBDaHJvbWUgQ3RybCArIFNoaWZ0ICsgailcbiAqIDEuIFR5cGUgYG5nLmAgKHVzdWFsbHkgdGhlIGNvbnNvbGUgd2lsbCBzaG93IGF1dG8tY29tcGxldGUgc3VnZ2VzdGlvbilcbiAqIDEuIFRyeSB0aGUgY2hhbmdlIGRldGVjdGlvbiBwcm9maWxlciBgbmcucHJvZmlsZXIudGltZUNoYW5nZURldGVjdGlvbigpYFxuICogICAgdGhlbiBoaXQgRW50ZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmFibGVEZWJ1Z1Rvb2xzKHJlZjogQ29tcG9uZW50UmVmKTogdm9pZCB7XG4gIGNvbnRleHQubmcgPSBuZXcgQW5ndWxhclRvb2xzKHJlZik7XG59XG5cbi8qKlxuICogRGlzYWJsZXMgQW5ndWxhciAyIHRvb2xzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzYWJsZURlYnVnVG9vbHMoKTogdm9pZCB7XG4gIGRlbGV0ZSBjb250ZXh0Lm5nO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2Jyb3dzZXIvdG9vbHMvdG9vbHMudHNcbiAqKi8iLCJpbXBvcnQge0FwcGxpY2F0aW9uUmVmfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9hcHBsaWNhdGlvbl9yZWYnO1xuaW1wb3J0IHtDb21wb25lbnRSZWYsIENvbXBvbmVudFJlZl99IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9keW5hbWljX2NvbXBvbmVudF9sb2FkZXInO1xuaW1wb3J0IHtpc1ByZXNlbnQsIE51bWJlcldyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge3dpbmRvd30gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9icm93c2VyJztcbmltcG9ydCB7RE9NfSBmcm9tICdhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2RvbV9hZGFwdGVyJztcblxuLyoqXG4gKiBFbnRyeSBwb2ludCBmb3IgYWxsIEFuZ3VsYXIgZGVidWcgdG9vbHMuIFRoaXMgb2JqZWN0IGNvcnJlc3BvbmRzIHRvIHRoZSBgbmdgXG4gKiBnbG9iYWwgdmFyaWFibGUgYWNjZXNzaWJsZSBpbiB0aGUgZGV2IGNvbnNvbGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBBbmd1bGFyVG9vbHMge1xuICBwcm9maWxlcjogQW5ndWxhclByb2ZpbGVyO1xuXG4gIGNvbnN0cnVjdG9yKHJlZjogQ29tcG9uZW50UmVmKSB7IHRoaXMucHJvZmlsZXIgPSBuZXcgQW5ndWxhclByb2ZpbGVyKHJlZik7IH1cbn1cblxuLyoqXG4gKiBFbnRyeSBwb2ludCBmb3IgYWxsIEFuZ3VsYXIgcHJvZmlsaW5nLXJlbGF0ZWQgZGVidWcgdG9vbHMuIFRoaXMgb2JqZWN0XG4gKiBjb3JyZXNwb25kcyB0byB0aGUgYG5nLnByb2ZpbGVyYCBpbiB0aGUgZGV2IGNvbnNvbGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBBbmd1bGFyUHJvZmlsZXIge1xuICBhcHBSZWY6IEFwcGxpY2F0aW9uUmVmO1xuXG4gIGNvbnN0cnVjdG9yKHJlZjogQ29tcG9uZW50UmVmKSB7XG4gICAgdGhpcy5hcHBSZWYgPSAoPENvbXBvbmVudFJlZl8+cmVmKS5pbmplY3Rvci5nZXQoQXBwbGljYXRpb25SZWYpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZXJjaXNlcyBjaGFuZ2UgZGV0ZWN0aW9uIGluIGEgbG9vcCBhbmQgdGhlbiBwcmludHMgdGhlIGF2ZXJhZ2UgYW1vdW50IG9mXG4gICAqIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGhvdyBsb25nIGEgc2luZ2xlIHJvdW5kIG9mIGNoYW5nZSBkZXRlY3Rpb24gdGFrZXMgZm9yXG4gICAqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBVSS4gSXQgcnVucyBhIG1pbmltdW0gb2YgNSByb3VuZHMgZm9yIGEgbWluaW11bVxuICAgKiBvZiA1MDAgbWlsbGlzZWNvbmRzLlxuICAgKlxuICAgKiBPcHRpb25hbGx5LCBhIHVzZXIgbWF5IHBhc3MgYSBgY29uZmlnYCBwYXJhbWV0ZXIgY29udGFpbmluZyBhIG1hcCBvZlxuICAgKiBvcHRpb25zLiBTdXBwb3J0ZWQgb3B0aW9ucyBhcmU6XG4gICAqXG4gICAqIGByZWNvcmRgIChib29sZWFuKSAtIGNhdXNlcyB0aGUgcHJvZmlsZXIgdG8gcmVjb3JkIGEgQ1BVIHByb2ZpbGUgd2hpbGVcbiAgICogaXQgZXhlcmNpc2VzIHRoZSBjaGFuZ2UgZGV0ZWN0b3IuIEV4YW1wbGU6XG4gICAqXG4gICAqIGBgYFxuICAgKiBuZy5wcm9maWxlci50aW1lQ2hhbmdlRGV0ZWN0aW9uKHtyZWNvcmQ6IHRydWV9KVxuICAgKiBgYGBcbiAgICovXG4gIHRpbWVDaGFuZ2VEZXRlY3Rpb24oY29uZmlnOiBhbnkpIHtcbiAgICB2YXIgcmVjb3JkID0gaXNQcmVzZW50KGNvbmZpZykgJiYgY29uZmlnWydyZWNvcmQnXTtcbiAgICB2YXIgcHJvZmlsZU5hbWUgPSAnQ2hhbmdlIERldGVjdGlvbic7XG4gICAgLy8gUHJvZmlsZXIgaXMgbm90IGF2YWlsYWJsZSBpbiBBbmRyb2lkIGJyb3dzZXJzLCBub3IgaW4gSUUgOSB3aXRob3V0IGRldiB0b29scyBvcGVuZWRcbiAgICB2YXIgaXNQcm9maWxlckF2YWlsYWJsZSA9IGlzUHJlc2VudCh3aW5kb3cuY29uc29sZS5wcm9maWxlKTtcbiAgICBpZiAocmVjb3JkICYmIGlzUHJvZmlsZXJBdmFpbGFibGUpIHtcbiAgICAgIHdpbmRvdy5jb25zb2xlLnByb2ZpbGUocHJvZmlsZU5hbWUpO1xuICAgIH1cbiAgICB2YXIgc3RhcnQgPSBET00ucGVyZm9ybWFuY2VOb3coKTtcbiAgICB2YXIgbnVtVGlja3MgPSAwO1xuICAgIHdoaWxlIChudW1UaWNrcyA8IDUgfHwgKERPTS5wZXJmb3JtYW5jZU5vdygpIC0gc3RhcnQpIDwgNTAwKSB7XG4gICAgICB0aGlzLmFwcFJlZi50aWNrKCk7XG4gICAgICBudW1UaWNrcysrO1xuICAgIH1cbiAgICB2YXIgZW5kID0gRE9NLnBlcmZvcm1hbmNlTm93KCk7XG4gICAgaWYgKHJlY29yZCAmJiBpc1Byb2ZpbGVyQXZhaWxhYmxlKSB7XG4gICAgICAvLyBuZWVkIHRvIGNhc3QgdG8gPGFueT4gYmVjYXVzZSB0eXBlIGNoZWNrZXIgdGhpbmtzIHRoZXJlJ3Mgbm8gYXJndW1lbnRcbiAgICAgIC8vIHdoaWxlIGluIGZhY3QgdGhlcmUgaXM6XG4gICAgICAvL1xuICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0NvbnNvbGUvcHJvZmlsZUVuZFxuICAgICAgKDxhbnk+d2luZG93LmNvbnNvbGUucHJvZmlsZUVuZCkocHJvZmlsZU5hbWUpO1xuICAgIH1cbiAgICB2YXIgbXNQZXJUaWNrID0gKGVuZCAtIHN0YXJ0KSAvIG51bVRpY2tzO1xuICAgIHdpbmRvdy5jb25zb2xlLmxvZyhgcmFuICR7bnVtVGlja3N9IGNoYW5nZSBkZXRlY3Rpb24gY3ljbGVzYCk7XG4gICAgd2luZG93LmNvbnNvbGUubG9nKGAke051bWJlcldyYXBwZXIudG9GaXhlZChtc1BlclRpY2ssIDIpfSBtcyBwZXIgY2hlY2tgKTtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2Jyb3dzZXIvdG9vbHMvY29tbW9uX3Rvb2xzLnRzXG4gKiovIiwiLyoqXG4gKiBKUyB2ZXJzaW9uIG9mIGJyb3dzZXIgQVBJcy4gVGhpcyBsaWJyYXJ5IGNhbiBvbmx5IHJ1biBpbiB0aGUgYnJvd3Nlci5cbiAqL1xudmFyIHdpbiA9IHdpbmRvdztcblxuZXhwb3J0IHt3aW4gYXMgd2luZG93fTtcbmV4cG9ydCB2YXIgZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQ7XG5leHBvcnQgdmFyIGxvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uO1xuZXhwb3J0IHZhciBnYyA9IHdpbmRvd1snZ2MnXSA/ICgpID0+IHdpbmRvd1snZ2MnXSgpIDogKCkgPT4gbnVsbDtcbmV4cG9ydCB2YXIgcGVyZm9ybWFuY2UgPSB3aW5kb3dbJ3BlcmZvcm1hbmNlJ10gPyB3aW5kb3dbJ3BlcmZvcm1hbmNlJ10gOiBudWxsO1xuZXhwb3J0IGNvbnN0IEV2ZW50ID0gd2luZG93WydFdmVudCddO1xuZXhwb3J0IGNvbnN0IE1vdXNlRXZlbnQgPSB3aW5kb3dbJ01vdXNlRXZlbnQnXTtcbmV4cG9ydCBjb25zdCBLZXlib2FyZEV2ZW50ID0gd2luZG93WydLZXlib2FyZEV2ZW50J107XG5leHBvcnQgY29uc3QgRXZlbnRUYXJnZXQgPSB3aW5kb3dbJ0V2ZW50VGFyZ2V0J107XG5leHBvcnQgY29uc3QgSGlzdG9yeSA9IHdpbmRvd1snSGlzdG9yeSddO1xuZXhwb3J0IGNvbnN0IExvY2F0aW9uID0gd2luZG93WydMb2NhdGlvbiddO1xuZXhwb3J0IGNvbnN0IEV2ZW50TGlzdGVuZXIgPSB3aW5kb3dbJ0V2ZW50TGlzdGVuZXInXTtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9mYWNhZGUvYnJvd3Nlci50c1xuICoqLyIsIi8qKlxuICogQG1vZHVsZVxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGUgaHR0cCBtb2R1bGUgcHJvdmlkZXMgc2VydmljZXMgdG8gcGVyZm9ybSBodHRwIHJlcXVlc3RzLiBUbyBnZXQgc3RhcnRlZCwgc2VlIHRoZSB7QGxpbmsgSHR0cH1cbiAqIGNsYXNzLlxuICovXG5pbXBvcnQge3Byb3ZpZGUsIFByb3ZpZGVyfSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbmltcG9ydCB7SHR0cCwgSnNvbnB9IGZyb20gJy4vc3JjL2h0dHAvaHR0cCc7XG5pbXBvcnQge1hIUkJhY2tlbmQsIFhIUkNvbm5lY3Rpb259IGZyb20gJy4vc3JjL2h0dHAvYmFja2VuZHMveGhyX2JhY2tlbmQnO1xuaW1wb3J0IHtKU09OUEJhY2tlbmQsIEpTT05QQmFja2VuZF8sIEpTT05QQ29ubmVjdGlvbn0gZnJvbSAnLi9zcmMvaHR0cC9iYWNrZW5kcy9qc29ucF9iYWNrZW5kJztcbmltcG9ydCB7QnJvd3Nlclhocn0gZnJvbSAnLi9zcmMvaHR0cC9iYWNrZW5kcy9icm93c2VyX3hocic7XG5pbXBvcnQge0Jyb3dzZXJKc29ucH0gZnJvbSAnLi9zcmMvaHR0cC9iYWNrZW5kcy9icm93c2VyX2pzb25wJztcbmltcG9ydCB7QmFzZVJlcXVlc3RPcHRpb25zLCBSZXF1ZXN0T3B0aW9uc30gZnJvbSAnLi9zcmMvaHR0cC9iYXNlX3JlcXVlc3Rfb3B0aW9ucyc7XG5pbXBvcnQge0Nvbm5lY3Rpb25CYWNrZW5kfSBmcm9tICcuL3NyYy9odHRwL2ludGVyZmFjZXMnO1xuaW1wb3J0IHtCYXNlUmVzcG9uc2VPcHRpb25zLCBSZXNwb25zZU9wdGlvbnN9IGZyb20gJy4vc3JjL2h0dHAvYmFzZV9yZXNwb25zZV9vcHRpb25zJztcbmV4cG9ydCB7UmVxdWVzdH0gZnJvbSAnLi9zcmMvaHR0cC9zdGF0aWNfcmVxdWVzdCc7XG5leHBvcnQge1Jlc3BvbnNlfSBmcm9tICcuL3NyYy9odHRwL3N0YXRpY19yZXNwb25zZSc7XG5cbmV4cG9ydCB7XG4gIFJlcXVlc3RPcHRpb25zQXJncyxcbiAgUmVzcG9uc2VPcHRpb25zQXJncyxcbiAgQ29ubmVjdGlvbixcbiAgQ29ubmVjdGlvbkJhY2tlbmRcbn0gZnJvbSAnLi9zcmMvaHR0cC9pbnRlcmZhY2VzJztcblxuZXhwb3J0IHtCcm93c2VyWGhyfSBmcm9tICcuL3NyYy9odHRwL2JhY2tlbmRzL2Jyb3dzZXJfeGhyJztcbmV4cG9ydCB7QmFzZVJlcXVlc3RPcHRpb25zLCBSZXF1ZXN0T3B0aW9uc30gZnJvbSAnLi9zcmMvaHR0cC9iYXNlX3JlcXVlc3Rfb3B0aW9ucyc7XG5leHBvcnQge0Jhc2VSZXNwb25zZU9wdGlvbnMsIFJlc3BvbnNlT3B0aW9uc30gZnJvbSAnLi9zcmMvaHR0cC9iYXNlX3Jlc3BvbnNlX29wdGlvbnMnO1xuZXhwb3J0IHtYSFJCYWNrZW5kLCBYSFJDb25uZWN0aW9ufSBmcm9tICcuL3NyYy9odHRwL2JhY2tlbmRzL3hocl9iYWNrZW5kJztcbmV4cG9ydCB7SlNPTlBCYWNrZW5kLCBKU09OUENvbm5lY3Rpb259IGZyb20gJy4vc3JjL2h0dHAvYmFja2VuZHMvanNvbnBfYmFja2VuZCc7XG5leHBvcnQge0h0dHAsIEpzb25wfSBmcm9tICcuL3NyYy9odHRwL2h0dHAnO1xuXG5leHBvcnQge0hlYWRlcnN9IGZyb20gJy4vc3JjL2h0dHAvaGVhZGVycyc7XG5cbmV4cG9ydCB7UmVzcG9uc2VUeXBlLCBSZWFkeVN0YXRlLCBSZXF1ZXN0TWV0aG9kfSBmcm9tICcuL3NyYy9odHRwL2VudW1zJztcbmV4cG9ydCB7VVJMU2VhcmNoUGFyYW1zfSBmcm9tICcuL3NyYy9odHRwL3VybF9zZWFyY2hfcGFyYW1zJztcblxuLyoqXG4gKiBQcm92aWRlcyBhIGJhc2ljIHNldCBvZiBpbmplY3RhYmxlcyB0byB1c2UgdGhlIHtAbGluayBIdHRwfSBzZXJ2aWNlIGluIGFueSBhcHBsaWNhdGlvbi5cbiAqXG4gKiBUaGUgYEhUVFBfUFJPVklERVJTYCBzaG91bGQgYmUgaW5jbHVkZWQgZWl0aGVyIGluIGEgY29tcG9uZW50J3MgaW5qZWN0b3IsXG4gKiBvciBpbiB0aGUgcm9vdCBpbmplY3RvciB3aGVuIGJvb3RzdHJhcHBpbmcgYW4gYXBwbGljYXRpb24uXG4gKlxuICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L3NuajdOdj9wPXByZXZpZXcpKVxuICpcbiAqIGBgYFxuICogaW1wb3J0IHtDb21wb25lbnR9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuICogaW1wb3J0IHtib290c3RyYXB9IGZyb20gJ2FuZ3VsYXIyL3BsYXRmb3JtL2Jyb3dzZXInO1xuICogaW1wb3J0IHtOZ0Zvcn0gZnJvbSAnYW5ndWxhcjIvY29tbW9uJztcbiAqIGltcG9ydCB7SFRUUF9QUk9WSURFUlMsIEh0dHB9IGZyb20gJ2FuZ3VsYXIyL2h0dHAnO1xuICpcbiAqIEBDb21wb25lbnQoe1xuICogICBzZWxlY3RvcjogJ2FwcCcsXG4gKiAgIHByb3ZpZGVyczogW0hUVFBfUFJPVklERVJTXSxcbiAqICAgdGVtcGxhdGU6IGBcbiAqICAgICA8ZGl2PlxuICogICAgICAgPGgxPlBlb3BsZTwvaDE+XG4gKiAgICAgICA8dWw+XG4gKiAgICAgICAgIDxsaSAqbmdGb3I9XCIjcGVyc29uIG9mIHBlb3BsZVwiPlxuICogICAgICAgICAgIHt7cGVyc29uLm5hbWV9fVxuICogICAgICAgICA8L2xpPlxuICogICAgICAgPC91bD5cbiAqICAgICA8L2Rpdj5cbiAqICAgYCxcbiAqICAgZGlyZWN0aXZlczogW05nRm9yXVxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBBcHAge1xuICogICBwZW9wbGU6IE9iamVjdFtdO1xuICogICBjb25zdHJ1Y3RvcihodHRwOkh0dHApIHtcbiAqICAgICBodHRwLmdldCgncGVvcGxlLmpzb24nKS5zdWJzY3JpYmUocmVzID0+IHtcbiAqICAgICAgIHRoaXMucGVvcGxlID0gcmVzLmpzb24oKTtcbiAqICAgICB9KTtcbiAqICAgfVxuICogICBhY3RpdmU6Ym9vbGVhbiA9IGZhbHNlO1xuICogICB0b2dnbGVBY3RpdmVTdGF0ZSgpIHtcbiAqICAgICB0aGlzLmFjdGl2ZSA9ICF0aGlzLmFjdGl2ZTtcbiAqICAgfVxuICogfVxuICpcbiAqIGJvb3RzdHJhcChBcHApXG4gKiAgIC5jYXRjaChlcnIgPT4gY29uc29sZS5lcnJvcihlcnIpKTtcbiAqIGBgYFxuICpcbiAqIFRoZSBwcmltYXJ5IHB1YmxpYyBBUEkgaW5jbHVkZWQgaW4gYEhUVFBfUFJPVklERVJTYCBpcyB0aGUge0BsaW5rIEh0dHB9IGNsYXNzLlxuICogSG93ZXZlciwgb3RoZXIgcHJvdmlkZXJzIHJlcXVpcmVkIGJ5IGBIdHRwYCBhcmUgaW5jbHVkZWQsXG4gKiB3aGljaCBtYXkgYmUgYmVuZWZpY2lhbCB0byBvdmVycmlkZSBpbiBjZXJ0YWluIGNhc2VzLlxuICpcbiAqIFRoZSBwcm92aWRlcnMgaW5jbHVkZWQgaW4gYEhUVFBfUFJPVklERVJTYCBpbmNsdWRlOlxuICogICoge0BsaW5rIEh0dHB9XG4gKiAgKiB7QGxpbmsgWEhSQmFja2VuZH1cbiAqICAqIGBCcm93c2VyWEhSYCAtIFByaXZhdGUgZmFjdG9yeSB0byBjcmVhdGUgYFhNTEh0dHBSZXF1ZXN0YCBpbnN0YW5jZXNcbiAqICAqIHtAbGluayBSZXF1ZXN0T3B0aW9uc30gLSBCb3VuZCB0byB7QGxpbmsgQmFzZVJlcXVlc3RPcHRpb25zfSBjbGFzc1xuICogICoge0BsaW5rIFJlc3BvbnNlT3B0aW9uc30gLSBCb3VuZCB0byB7QGxpbmsgQmFzZVJlc3BvbnNlT3B0aW9uc30gY2xhc3NcbiAqXG4gKiBUaGVyZSBtYXkgYmUgY2FzZXMgd2hlcmUgaXQgbWFrZXMgc2Vuc2UgdG8gZXh0ZW5kIHRoZSBiYXNlIHJlcXVlc3Qgb3B0aW9ucyxcbiAqIHN1Y2ggYXMgdG8gYWRkIGEgc2VhcmNoIHN0cmluZyB0byBiZSBhcHBlbmRlZCB0byBhbGwgVVJMcy5cbiAqIFRvIGFjY29tcGxpc2ggdGhpcywgYSBuZXcgcHJvdmlkZXIgZm9yIHtAbGluayBSZXF1ZXN0T3B0aW9uc30gc2hvdWxkXG4gKiBiZSBhZGRlZCBpbiB0aGUgc2FtZSBpbmplY3RvciBhcyBgSFRUUF9QUk9WSURFUlNgLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9hQ01FWGk/cD1wcmV2aWV3KSlcbiAqXG4gKiBgYGBcbiAqIGltcG9ydCB7cHJvdmlkZX0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG4gKiBpbXBvcnQge2Jvb3RzdHJhcH0gZnJvbSAnYW5ndWxhcjIvcGxhdGZvcm0vYnJvd3Nlcic7XG4gKiBpbXBvcnQge0hUVFBfUFJPVklERVJTLCBCYXNlUmVxdWVzdE9wdGlvbnMsIFJlcXVlc3RPcHRpb25zfSBmcm9tICdhbmd1bGFyMi9odHRwJztcbiAqXG4gKiBjbGFzcyBNeU9wdGlvbnMgZXh0ZW5kcyBCYXNlUmVxdWVzdE9wdGlvbnMge1xuICogICBzZWFyY2g6IHN0cmluZyA9ICdjb3JlVGVhbT10cnVlJztcbiAqIH1cbiAqXG4gKiBib290c3RyYXAoQXBwLCBbSFRUUF9QUk9WSURFUlMsIHByb3ZpZGUoUmVxdWVzdE9wdGlvbnMsIHt1c2VDbGFzczogTXlPcHRpb25zfSldKVxuICogICAuY2F0Y2goZXJyID0+IGNvbnNvbGUuZXJyb3IoZXJyKSk7XG4gKiBgYGBcbiAqXG4gKiBMaWtld2lzZSwgdG8gdXNlIGEgbW9jayBiYWNrZW5kIGZvciB1bml0IHRlc3RzLCB0aGUge0BsaW5rIFhIUkJhY2tlbmR9XG4gKiBwcm92aWRlciBzaG91bGQgYmUgYm91bmQgdG8ge0BsaW5rIE1vY2tCYWNrZW5kfS5cbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvN0xXQUxEP3A9cHJldmlldykpXG4gKlxuICogYGBgXG4gKiBpbXBvcnQge3Byb3ZpZGV9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuICogaW1wb3J0IHtib290c3RyYXB9IGZyb20gJ2FuZ3VsYXIyL3BsYXRmb3JtL2Jyb3dzZXInO1xuICogaW1wb3J0IHtIVFRQX1BST1ZJREVSUywgSHR0cCwgUmVzcG9uc2UsIFhIUkJhY2tlbmR9IGZyb20gJ2FuZ3VsYXIyL2h0dHAnO1xuICogaW1wb3J0IHtNb2NrQmFja2VuZH0gZnJvbSAnYW5ndWxhcjIvaHR0cC90ZXN0aW5nJztcbiAqXG4gKiB2YXIgcGVvcGxlID0gW3tuYW1lOiAnSmVmZid9LCB7bmFtZTogJ1RvYmlhcyd9XTtcbiAqXG4gKiB2YXIgaW5qZWN0b3IgPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtcbiAqICAgSFRUUF9QUk9WSURFUlMsXG4gKiAgIE1vY2tCYWNrZW5kLFxuICogICBwcm92aWRlKFhIUkJhY2tlbmQsIHt1c2VFeGlzdGluZzogTW9ja0JhY2tlbmR9KVxuICogXSk7XG4gKiB2YXIgaHR0cCA9IGluamVjdG9yLmdldChIdHRwKTtcbiAqIHZhciBiYWNrZW5kID0gaW5qZWN0b3IuZ2V0KE1vY2tCYWNrZW5kKTtcbiAqXG4gKiAvLyBMaXN0ZW4gZm9yIGFueSBuZXcgcmVxdWVzdHNcbiAqIGJhY2tlbmQuY29ubmVjdGlvbnMub2JzZXJ2ZXIoe1xuICogICBuZXh0OiBjb25uZWN0aW9uID0+IHtcbiAqICAgICB2YXIgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2Uoe2JvZHk6IHBlb3BsZX0pO1xuICogICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICogICAgICAgLy8gU2VuZCBhIHJlc3BvbnNlIHRvIHRoZSByZXF1ZXN0XG4gKiAgICAgICBjb25uZWN0aW9uLm1vY2tSZXNwb25kKHJlc3BvbnNlKTtcbiAqICAgICB9KTtcbiAqICAgfSk7XG4gKlxuICogaHR0cC5nZXQoJ3Blb3BsZS5qc29uJykub2JzZXJ2ZXIoe1xuICogICBuZXh0OiByZXMgPT4ge1xuICogICAgIC8vIFJlc3BvbnNlIGNhbWUgZnJvbSBtb2NrIGJhY2tlbmRcbiAqICAgICBjb25zb2xlLmxvZygnZmlyc3QgcGVyc29uJywgcmVzLmpzb24oKVswXS5uYW1lKTtcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IEhUVFBfUFJPVklERVJTOiBhbnlbXSA9IFtcbiAgLy8gVE9ETyhwYXNjYWwpOiB1c2UgZmFjdG9yeSB0eXBlIGFubm90YXRpb25zIG9uY2Ugc3VwcG9ydGVkIGluIERJXG4gIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8zMTgzXG4gIHByb3ZpZGUoSHR0cCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB1c2VGYWN0b3J5OiAoeGhyQmFja2VuZCwgcmVxdWVzdE9wdGlvbnMpID0+IG5ldyBIdHRwKHhockJhY2tlbmQsIHJlcXVlc3RPcHRpb25zKSxcbiAgICAgICAgICAgIGRlcHM6IFtYSFJCYWNrZW5kLCBSZXF1ZXN0T3B0aW9uc11cbiAgICAgICAgICB9KSxcbiAgQnJvd3NlclhocixcbiAgcHJvdmlkZShSZXF1ZXN0T3B0aW9ucywge3VzZUNsYXNzOiBCYXNlUmVxdWVzdE9wdGlvbnN9KSxcbiAgcHJvdmlkZShSZXNwb25zZU9wdGlvbnMsIHt1c2VDbGFzczogQmFzZVJlc3BvbnNlT3B0aW9uc30pLFxuICBYSFJCYWNrZW5kXG5dO1xuXG4vKipcbiAqIFNlZSB7QGxpbmsgSFRUUF9QUk9WSURFUlN9IGluc3RlYWQuXG4gKlxuICogQGRlcHJlY2F0ZWRcbiAqL1xuZXhwb3J0IGNvbnN0IEhUVFBfQklORElOR1MgPSBIVFRQX1BST1ZJREVSUztcblxuLyoqXG4gKiBQcm92aWRlcyBhIGJhc2ljIHNldCBvZiBwcm92aWRlcnMgdG8gdXNlIHRoZSB7QGxpbmsgSnNvbnB9IHNlcnZpY2UgaW4gYW55IGFwcGxpY2F0aW9uLlxuICpcbiAqIFRoZSBgSlNPTlBfUFJPVklERVJTYCBzaG91bGQgYmUgaW5jbHVkZWQgZWl0aGVyIGluIGEgY29tcG9uZW50J3MgaW5qZWN0b3IsXG4gKiBvciBpbiB0aGUgcm9vdCBpbmplY3RvciB3aGVuIGJvb3RzdHJhcHBpbmcgYW4gYXBwbGljYXRpb24uXG4gKlxuICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L3ZtZU40Rj9wPXByZXZpZXcpKVxuICpcbiAqIGBgYFxuICogaW1wb3J0IHtDb21wb25lbnR9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuICogaW1wb3J0IHtOZ0Zvcn0gZnJvbSAnYW5ndWxhcjIvY29tbW9uJztcbiAqIGltcG9ydCB7SlNPTlBfUFJPVklERVJTLCBKc29ucH0gZnJvbSAnYW5ndWxhcjIvaHR0cCc7XG4gKlxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAnYXBwJyxcbiAqICAgcHJvdmlkZXJzOiBbSlNPTlBfUFJPVklERVJTXSxcbiAqICAgdGVtcGxhdGU6IGBcbiAqICAgICA8ZGl2PlxuICogICAgICAgPGgxPlBlb3BsZTwvaDE+XG4gKiAgICAgICA8dWw+XG4gKiAgICAgICAgIDxsaSAqbmdGb3I9XCIjcGVyc29uIG9mIHBlb3BsZVwiPlxuICogICAgICAgICAgIHt7cGVyc29uLm5hbWV9fVxuICogICAgICAgICA8L2xpPlxuICogICAgICAgPC91bD5cbiAqICAgICA8L2Rpdj5cbiAqICAgYCxcbiAqICAgZGlyZWN0aXZlczogW05nRm9yXVxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBBcHAge1xuICogICBwZW9wbGU6IEFycmF5PE9iamVjdD47XG4gKiAgIGNvbnN0cnVjdG9yKGpzb25wOkpzb25wKSB7XG4gKiAgICAganNvbnAucmVxdWVzdCgncGVvcGxlLmpzb24nKS5zdWJzY3JpYmUocmVzID0+IHtcbiAqICAgICAgIHRoaXMucGVvcGxlID0gcmVzLmpzb24oKTtcbiAqICAgICB9KVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBUaGUgcHJpbWFyeSBwdWJsaWMgQVBJIGluY2x1ZGVkIGluIGBKU09OUF9QUk9WSURFUlNgIGlzIHRoZSB7QGxpbmsgSnNvbnB9IGNsYXNzLlxuICogSG93ZXZlciwgb3RoZXIgcHJvdmlkZXJzIHJlcXVpcmVkIGJ5IGBKc29ucGAgYXJlIGluY2x1ZGVkLFxuICogd2hpY2ggbWF5IGJlIGJlbmVmaWNpYWwgdG8gb3ZlcnJpZGUgaW4gY2VydGFpbiBjYXNlcy5cbiAqXG4gKiBUaGUgcHJvdmlkZXJzIGluY2x1ZGVkIGluIGBKU09OUF9QUk9WSURFUlNgIGluY2x1ZGU6XG4gKiAgKiB7QGxpbmsgSnNvbnB9XG4gKiAgKiB7QGxpbmsgSlNPTlBCYWNrZW5kfVxuICogICogYEJyb3dzZXJKc29ucGAgLSBQcml2YXRlIGZhY3RvcnlcbiAqICAqIHtAbGluayBSZXF1ZXN0T3B0aW9uc30gLSBCb3VuZCB0byB7QGxpbmsgQmFzZVJlcXVlc3RPcHRpb25zfSBjbGFzc1xuICogICoge0BsaW5rIFJlc3BvbnNlT3B0aW9uc30gLSBCb3VuZCB0byB7QGxpbmsgQmFzZVJlc3BvbnNlT3B0aW9uc30gY2xhc3NcbiAqXG4gKiBUaGVyZSBtYXkgYmUgY2FzZXMgd2hlcmUgaXQgbWFrZXMgc2Vuc2UgdG8gZXh0ZW5kIHRoZSBiYXNlIHJlcXVlc3Qgb3B0aW9ucyxcbiAqIHN1Y2ggYXMgdG8gYWRkIGEgc2VhcmNoIHN0cmluZyB0byBiZSBhcHBlbmRlZCB0byBhbGwgVVJMcy5cbiAqIFRvIGFjY29tcGxpc2ggdGhpcywgYSBuZXcgcHJvdmlkZXIgZm9yIHtAbGluayBSZXF1ZXN0T3B0aW9uc30gc2hvdWxkXG4gKiBiZSBhZGRlZCBpbiB0aGUgc2FtZSBpbmplY3RvciBhcyBgSlNPTlBfUFJPVklERVJTYC5cbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvVEZ1Zzd4P3A9cHJldmlldykpXG4gKlxuICogYGBgXG4gKiBpbXBvcnQge3Byb3ZpZGV9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuICogaW1wb3J0IHtib290c3RyYXB9IGZyb20gJ2FuZ3VsYXIyL3BsYXRmb3JtL2Jyb3dzZXInO1xuICogaW1wb3J0IHtKU09OUF9QUk9WSURFUlMsIEJhc2VSZXF1ZXN0T3B0aW9ucywgUmVxdWVzdE9wdGlvbnN9IGZyb20gJ2FuZ3VsYXIyL2h0dHAnO1xuICpcbiAqIGNsYXNzIE15T3B0aW9ucyBleHRlbmRzIEJhc2VSZXF1ZXN0T3B0aW9ucyB7XG4gKiAgIHNlYXJjaDogc3RyaW5nID0gJ2NvcmVUZWFtPXRydWUnO1xuICogfVxuICpcbiAqIGJvb3RzdHJhcChBcHAsIFtKU09OUF9QUk9WSURFUlMsIHByb3ZpZGUoUmVxdWVzdE9wdGlvbnMsIHt1c2VDbGFzczogTXlPcHRpb25zfSldKVxuICogICAuY2F0Y2goZXJyID0+IGNvbnNvbGUuZXJyb3IoZXJyKSk7XG4gKiBgYGBcbiAqXG4gKiBMaWtld2lzZSwgdG8gdXNlIGEgbW9jayBiYWNrZW5kIGZvciB1bml0IHRlc3RzLCB0aGUge0BsaW5rIEpTT05QQmFja2VuZH1cbiAqIHByb3ZpZGVyIHNob3VsZCBiZSBib3VuZCB0byB7QGxpbmsgTW9ja0JhY2tlbmR9LlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9IRHFaV0w/cD1wcmV2aWV3KSlcbiAqXG4gKiBgYGBcbiAqIGltcG9ydCB7cHJvdmlkZSwgSW5qZWN0b3J9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuICogaW1wb3J0IHtKU09OUF9QUk9WSURFUlMsIEpzb25wLCBSZXNwb25zZSwgSlNPTlBCYWNrZW5kfSBmcm9tICdhbmd1bGFyMi9odHRwJztcbiAqIGltcG9ydCB7TW9ja0JhY2tlbmR9IGZyb20gJ2FuZ3VsYXIyL2h0dHAvdGVzdGluZyc7XG4gKlxuICogdmFyIHBlb3BsZSA9IFt7bmFtZTogJ0plZmYnfSwge25hbWU6ICdUb2JpYXMnfV07XG4gKiB2YXIgaW5qZWN0b3IgPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtcbiAqICAgSlNPTlBfUFJPVklERVJTLFxuICogICBNb2NrQmFja2VuZCxcbiAqICAgcHJvdmlkZShKU09OUEJhY2tlbmQsIHt1c2VFeGlzdGluZzogTW9ja0JhY2tlbmR9KVxuICogXSk7XG4gKiB2YXIganNvbnAgPSBpbmplY3Rvci5nZXQoSnNvbnApO1xuICogdmFyIGJhY2tlbmQgPSBpbmplY3Rvci5nZXQoTW9ja0JhY2tlbmQpO1xuICpcbiAqIC8vIExpc3RlbiBmb3IgYW55IG5ldyByZXF1ZXN0c1xuICogYmFja2VuZC5jb25uZWN0aW9ucy5vYnNlcnZlcih7XG4gKiAgIG5leHQ6IGNvbm5lY3Rpb24gPT4ge1xuICogICAgIHZhciByZXNwb25zZSA9IG5ldyBSZXNwb25zZSh7Ym9keTogcGVvcGxlfSk7XG4gKiAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gKiAgICAgICAvLyBTZW5kIGEgcmVzcG9uc2UgdG8gdGhlIHJlcXVlc3RcbiAqICAgICAgIGNvbm5lY3Rpb24ubW9ja1Jlc3BvbmQocmVzcG9uc2UpO1xuICogICAgIH0pO1xuICogICB9KTtcblxuICoganNvbnAuZ2V0KCdwZW9wbGUuanNvbicpLm9ic2VydmVyKHtcbiAqICAgbmV4dDogcmVzID0+IHtcbiAqICAgICAvLyBSZXNwb25zZSBjYW1lIGZyb20gbW9jayBiYWNrZW5kXG4gKiAgICAgY29uc29sZS5sb2coJ2ZpcnN0IHBlcnNvbicsIHJlcy5qc29uKClbMF0ubmFtZSk7XG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBKU09OUF9QUk9WSURFUlM6IGFueVtdID0gW1xuICAvLyBUT0RPKHBhc2NhbCk6IHVzZSBmYWN0b3J5IHR5cGUgYW5ub3RhdGlvbnMgb25jZSBzdXBwb3J0ZWQgaW4gRElcbiAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzMxODNcbiAgcHJvdmlkZShKc29ucCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB1c2VGYWN0b3J5OiAoanNvbnBCYWNrZW5kLCByZXF1ZXN0T3B0aW9ucykgPT4gbmV3IEpzb25wKGpzb25wQmFja2VuZCwgcmVxdWVzdE9wdGlvbnMpLFxuICAgICAgICAgICAgZGVwczogW0pTT05QQmFja2VuZCwgUmVxdWVzdE9wdGlvbnNdXG4gICAgICAgICAgfSksXG4gIEJyb3dzZXJKc29ucCxcbiAgcHJvdmlkZShSZXF1ZXN0T3B0aW9ucywge3VzZUNsYXNzOiBCYXNlUmVxdWVzdE9wdGlvbnN9KSxcbiAgcHJvdmlkZShSZXNwb25zZU9wdGlvbnMsIHt1c2VDbGFzczogQmFzZVJlc3BvbnNlT3B0aW9uc30pLFxuICBwcm92aWRlKEpTT05QQmFja2VuZCwge3VzZUNsYXNzOiBKU09OUEJhY2tlbmRffSlcbl07XG5cbi8qKlxuICogU2VlIHtAbGluayBKU09OUF9QUk9WSURFUlN9IGluc3RlYWQuXG4gKlxuICogQGRlcHJlY2F0ZWRcbiAqL1xuZXhwb3J0IGNvbnN0IEpTT05fQklORElOR1MgPSBKU09OUF9QUk9WSURFUlM7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9odHRwLnRzXG4gKiovIiwiaW1wb3J0IHtpc1N0cmluZywgaXNQcmVzZW50LCBpc0JsYW5rfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHttYWtlVHlwZUVycm9yfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbmltcG9ydCB7UmVxdWVzdE9wdGlvbnNBcmdzLCBDb25uZWN0aW9uLCBDb25uZWN0aW9uQmFja2VuZH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7UmVxdWVzdH0gZnJvbSAnLi9zdGF0aWNfcmVxdWVzdCc7XG5pbXBvcnQge1Jlc3BvbnNlfSBmcm9tICcuL3N0YXRpY19yZXNwb25zZSc7XG5pbXBvcnQge0Jhc2VSZXF1ZXN0T3B0aW9ucywgUmVxdWVzdE9wdGlvbnN9IGZyb20gJy4vYmFzZV9yZXF1ZXN0X29wdGlvbnMnO1xuaW1wb3J0IHtSZXF1ZXN0TWV0aG9kfSBmcm9tICcuL2VudW1zJztcbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSAncnhqcy9PYnNlcnZhYmxlJztcblxuZnVuY3Rpb24gaHR0cFJlcXVlc3QoYmFja2VuZDogQ29ubmVjdGlvbkJhY2tlbmQsIHJlcXVlc3Q6IFJlcXVlc3QpOiBPYnNlcnZhYmxlPFJlc3BvbnNlPiB7XG4gIHJldHVybiBiYWNrZW5kLmNyZWF0ZUNvbm5lY3Rpb24ocmVxdWVzdCkucmVzcG9uc2U7XG59XG5cbmZ1bmN0aW9uIG1lcmdlT3B0aW9ucyhkZWZhdWx0T3B0cywgcHJvdmlkZWRPcHRzLCBtZXRob2QsIHVybCk6IFJlcXVlc3RPcHRpb25zIHtcbiAgdmFyIG5ld09wdGlvbnMgPSBkZWZhdWx0T3B0cztcbiAgaWYgKGlzUHJlc2VudChwcm92aWRlZE9wdHMpKSB7XG4gICAgLy8gSGFjayBzbyBEYXJ0IGNhbiB1c2VkIG5hbWVkIHBhcmFtZXRlcnNcbiAgICByZXR1cm4gbmV3T3B0aW9ucy5tZXJnZShuZXcgUmVxdWVzdE9wdGlvbnMoe1xuICAgICAgbWV0aG9kOiBwcm92aWRlZE9wdHMubWV0aG9kIHx8IG1ldGhvZCxcbiAgICAgIHVybDogcHJvdmlkZWRPcHRzLnVybCB8fCB1cmwsXG4gICAgICBzZWFyY2g6IHByb3ZpZGVkT3B0cy5zZWFyY2gsXG4gICAgICBoZWFkZXJzOiBwcm92aWRlZE9wdHMuaGVhZGVycyxcbiAgICAgIGJvZHk6IHByb3ZpZGVkT3B0cy5ib2R5XG4gICAgfSkpO1xuICB9XG4gIGlmIChpc1ByZXNlbnQobWV0aG9kKSkge1xuICAgIHJldHVybiBuZXdPcHRpb25zLm1lcmdlKG5ldyBSZXF1ZXN0T3B0aW9ucyh7bWV0aG9kOiBtZXRob2QsIHVybDogdXJsfSkpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXdPcHRpb25zLm1lcmdlKG5ldyBSZXF1ZXN0T3B0aW9ucyh7dXJsOiB1cmx9KSk7XG4gIH1cbn1cblxuLyoqXG4gKiBQZXJmb3JtcyBodHRwIHJlcXVlc3RzIHVzaW5nIGBYTUxIdHRwUmVxdWVzdGAgYXMgdGhlIGRlZmF1bHQgYmFja2VuZC5cbiAqXG4gKiBgSHR0cGAgaXMgYXZhaWxhYmxlIGFzIGFuIGluamVjdGFibGUgY2xhc3MsIHdpdGggbWV0aG9kcyB0byBwZXJmb3JtIGh0dHAgcmVxdWVzdHMuIENhbGxpbmdcbiAqIGByZXF1ZXN0YCByZXR1cm5zIGFuIGBPYnNlcnZhYmxlYCB3aGljaCB3aWxsIGVtaXQgYSBzaW5nbGUge0BsaW5rIFJlc3BvbnNlfSB3aGVuIGFcbiAqIHJlc3BvbnNlIGlzIHJlY2VpdmVkLlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHtIdHRwLCBIVFRQX1BST1ZJREVSU30gZnJvbSAnYW5ndWxhcjIvaHR0cCc7XG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICdodHRwLWFwcCcsXG4gKiAgIHZpZXdQcm92aWRlcnM6IFtIVFRQX1BST1ZJREVSU10sXG4gKiAgIHRlbXBsYXRlVXJsOiAncGVvcGxlLmh0bWwnXG4gKiB9KVxuICogY2xhc3MgUGVvcGxlQ29tcG9uZW50IHtcbiAqICAgY29uc3RydWN0b3IoaHR0cDogSHR0cCkge1xuICogICAgIGh0dHAuZ2V0KCdwZW9wbGUuanNvbicpXG4gKiAgICAgICAvLyBDYWxsIG1hcCBvbiB0aGUgcmVzcG9uc2Ugb2JzZXJ2YWJsZSB0byBnZXQgdGhlIHBhcnNlZCBwZW9wbGUgb2JqZWN0XG4gKiAgICAgICAubWFwKHJlcyA9PiByZXMuanNvbigpKVxuICogICAgICAgLy8gU3Vic2NyaWJlIHRvIHRoZSBvYnNlcnZhYmxlIHRvIGdldCB0aGUgcGFyc2VkIHBlb3BsZSBvYmplY3QgYW5kIGF0dGFjaCBpdCB0byB0aGVcbiAqICAgICAgIC8vIGNvbXBvbmVudFxuICogICAgICAgLnN1YnNjcmliZShwZW9wbGUgPT4gdGhpcy5wZW9wbGUgPSBwZW9wbGUpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGBcbiAqIGh0dHAuZ2V0KCdwZW9wbGUuanNvbicpLm9ic2VydmVyKHtuZXh0OiAodmFsdWUpID0+IHRoaXMucGVvcGxlID0gdmFsdWV9KTtcbiAqIGBgYFxuICpcbiAqIFRoZSBkZWZhdWx0IGNvbnN0cnVjdCB1c2VkIHRvIHBlcmZvcm0gcmVxdWVzdHMsIGBYTUxIdHRwUmVxdWVzdGAsIGlzIGFic3RyYWN0ZWQgYXMgYSBcIkJhY2tlbmRcIiAoXG4gKiB7QGxpbmsgWEhSQmFja2VuZH0gaW4gdGhpcyBjYXNlKSwgd2hpY2ggY291bGQgYmUgbW9ja2VkIHdpdGggZGVwZW5kZW5jeSBpbmplY3Rpb24gYnkgcmVwbGFjaW5nXG4gKiB0aGUge0BsaW5rIFhIUkJhY2tlbmR9IHByb3ZpZGVyLCBhcyBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6XG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQge0Jhc2VSZXF1ZXN0T3B0aW9ucywgSHR0cH0gZnJvbSAnYW5ndWxhcjIvaHR0cCc7XG4gKiBpbXBvcnQge01vY2tCYWNrZW5kfSBmcm9tICdhbmd1bGFyMi9odHRwL3Rlc3RpbmcnO1xuICogdmFyIGluamVjdG9yID0gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbXG4gKiAgIEJhc2VSZXF1ZXN0T3B0aW9ucyxcbiAqICAgTW9ja0JhY2tlbmQsXG4gKiAgIHByb3ZpZGUoSHR0cCwge3VzZUZhY3Rvcnk6XG4gKiAgICAgICBmdW5jdGlvbihiYWNrZW5kLCBkZWZhdWx0T3B0aW9ucykge1xuICogICAgICAgICByZXR1cm4gbmV3IEh0dHAoYmFja2VuZCwgZGVmYXVsdE9wdGlvbnMpO1xuICogICAgICAgfSxcbiAqICAgICAgIGRlcHM6IFtNb2NrQmFja2VuZCwgQmFzZVJlcXVlc3RPcHRpb25zXX0pXG4gKiBdKTtcbiAqIHZhciBodHRwID0gaW5qZWN0b3IuZ2V0KEh0dHApO1xuICogaHR0cC5nZXQoJ3JlcXVlc3QtZnJvbS1tb2NrLWJhY2tlbmQuanNvbicpLnN1YnNjcmliZSgocmVzOlJlc3BvbnNlKSA9PiBkb1NvbWV0aGluZyhyZXMpKTtcbiAqIGBgYFxuICpcbiAqKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBIdHRwIHtcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIF9iYWNrZW5kOiBDb25uZWN0aW9uQmFja2VuZCwgcHJvdGVjdGVkIF9kZWZhdWx0T3B0aW9uczogUmVxdWVzdE9wdGlvbnMpIHt9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIGFueSB0eXBlIG9mIGh0dHAgcmVxdWVzdC4gRmlyc3QgYXJndW1lbnQgaXMgcmVxdWlyZWQsIGFuZCBjYW4gZWl0aGVyIGJlIGEgdXJsIG9yXG4gICAqIGEge0BsaW5rIFJlcXVlc3R9IGluc3RhbmNlLiBJZiB0aGUgZmlyc3QgYXJndW1lbnQgaXMgYSB1cmwsIGFuIG9wdGlvbmFsIHtAbGluayBSZXF1ZXN0T3B0aW9uc31cbiAgICogb2JqZWN0IGNhbiBiZSBwcm92aWRlZCBhcyB0aGUgMm5kIGFyZ3VtZW50LiBUaGUgb3B0aW9ucyBvYmplY3Qgd2lsbCBiZSBtZXJnZWQgd2l0aCB0aGUgdmFsdWVzXG4gICAqIG9mIHtAbGluayBCYXNlUmVxdWVzdE9wdGlvbnN9IGJlZm9yZSBwZXJmb3JtaW5nIHRoZSByZXF1ZXN0LlxuICAgKi9cbiAgcmVxdWVzdCh1cmw6IHN0cmluZyB8IFJlcXVlc3QsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc0FyZ3MpOiBPYnNlcnZhYmxlPFJlc3BvbnNlPiB7XG4gICAgdmFyIHJlc3BvbnNlT2JzZXJ2YWJsZTogYW55O1xuICAgIGlmIChpc1N0cmluZyh1cmwpKSB7XG4gICAgICByZXNwb25zZU9ic2VydmFibGUgPSBodHRwUmVxdWVzdChcbiAgICAgICAgICB0aGlzLl9iYWNrZW5kLFxuICAgICAgICAgIG5ldyBSZXF1ZXN0KG1lcmdlT3B0aW9ucyh0aGlzLl9kZWZhdWx0T3B0aW9ucywgb3B0aW9ucywgUmVxdWVzdE1ldGhvZC5HZXQsIHVybCkpKTtcbiAgICB9IGVsc2UgaWYgKHVybCBpbnN0YW5jZW9mIFJlcXVlc3QpIHtcbiAgICAgIHJlc3BvbnNlT2JzZXJ2YWJsZSA9IGh0dHBSZXF1ZXN0KHRoaXMuX2JhY2tlbmQsIHVybCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG1ha2VUeXBlRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSB1cmwgc3RyaW5nIG9yIFJlcXVlc3QgaW5zdGFuY2UuJyk7XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZU9ic2VydmFibGU7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybXMgYSByZXF1ZXN0IHdpdGggYGdldGAgaHR0cCBtZXRob2QuXG4gICAqL1xuICBnZXQodXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc0FyZ3MpOiBPYnNlcnZhYmxlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIGh0dHBSZXF1ZXN0KHRoaXMuX2JhY2tlbmQsIG5ldyBSZXF1ZXN0KG1lcmdlT3B0aW9ucyh0aGlzLl9kZWZhdWx0T3B0aW9ucywgb3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RNZXRob2QuR2V0LCB1cmwpKSk7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybXMgYSByZXF1ZXN0IHdpdGggYHBvc3RgIGh0dHAgbWV0aG9kLlxuICAgKi9cbiAgcG9zdCh1cmw6IHN0cmluZywgYm9keTogc3RyaW5nLCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnNBcmdzKTogT2JzZXJ2YWJsZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiBodHRwUmVxdWVzdChcbiAgICAgICAgdGhpcy5fYmFja2VuZCxcbiAgICAgICAgbmV3IFJlcXVlc3QobWVyZ2VPcHRpb25zKHRoaXMuX2RlZmF1bHRPcHRpb25zLm1lcmdlKG5ldyBSZXF1ZXN0T3B0aW9ucyh7Ym9keTogYm9keX0pKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMsIFJlcXVlc3RNZXRob2QuUG9zdCwgdXJsKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIGEgcmVxdWVzdCB3aXRoIGBwdXRgIGh0dHAgbWV0aG9kLlxuICAgKi9cbiAgcHV0KHVybDogc3RyaW5nLCBib2R5OiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc0FyZ3MpOiBPYnNlcnZhYmxlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIGh0dHBSZXF1ZXN0KFxuICAgICAgICB0aGlzLl9iYWNrZW5kLFxuICAgICAgICBuZXcgUmVxdWVzdChtZXJnZU9wdGlvbnModGhpcy5fZGVmYXVsdE9wdGlvbnMubWVyZ2UobmV3IFJlcXVlc3RPcHRpb25zKHtib2R5OiBib2R5fSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucywgUmVxdWVzdE1ldGhvZC5QdXQsIHVybCkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBhIHJlcXVlc3Qgd2l0aCBgZGVsZXRlYCBodHRwIG1ldGhvZC5cbiAgICovXG4gIGRlbGV0ZSAodXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc0FyZ3MpOiBPYnNlcnZhYmxlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIGh0dHBSZXF1ZXN0KHRoaXMuX2JhY2tlbmQsIG5ldyBSZXF1ZXN0KG1lcmdlT3B0aW9ucyh0aGlzLl9kZWZhdWx0T3B0aW9ucywgb3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RNZXRob2QuRGVsZXRlLCB1cmwpKSk7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybXMgYSByZXF1ZXN0IHdpdGggYHBhdGNoYCBodHRwIG1ldGhvZC5cbiAgICovXG4gIHBhdGNoKHVybDogc3RyaW5nLCBib2R5OiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc0FyZ3MpOiBPYnNlcnZhYmxlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIGh0dHBSZXF1ZXN0KFxuICAgICAgICB0aGlzLl9iYWNrZW5kLFxuICAgICAgICBuZXcgUmVxdWVzdChtZXJnZU9wdGlvbnModGhpcy5fZGVmYXVsdE9wdGlvbnMubWVyZ2UobmV3IFJlcXVlc3RPcHRpb25zKHtib2R5OiBib2R5fSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucywgUmVxdWVzdE1ldGhvZC5QYXRjaCwgdXJsKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIGEgcmVxdWVzdCB3aXRoIGBoZWFkYCBodHRwIG1ldGhvZC5cbiAgICovXG4gIGhlYWQodXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc0FyZ3MpOiBPYnNlcnZhYmxlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIGh0dHBSZXF1ZXN0KHRoaXMuX2JhY2tlbmQsIG5ldyBSZXF1ZXN0KG1lcmdlT3B0aW9ucyh0aGlzLl9kZWZhdWx0T3B0aW9ucywgb3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RNZXRob2QuSGVhZCwgdXJsKSkpO1xuICB9XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBKc29ucCBleHRlbmRzIEh0dHAge1xuICBjb25zdHJ1Y3RvcihiYWNrZW5kOiBDb25uZWN0aW9uQmFja2VuZCwgZGVmYXVsdE9wdGlvbnM6IFJlcXVlc3RPcHRpb25zKSB7XG4gICAgc3VwZXIoYmFja2VuZCwgZGVmYXVsdE9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIGFueSB0eXBlIG9mIGh0dHAgcmVxdWVzdC4gRmlyc3QgYXJndW1lbnQgaXMgcmVxdWlyZWQsIGFuZCBjYW4gZWl0aGVyIGJlIGEgdXJsIG9yXG4gICAqIGEge0BsaW5rIFJlcXVlc3R9IGluc3RhbmNlLiBJZiB0aGUgZmlyc3QgYXJndW1lbnQgaXMgYSB1cmwsIGFuIG9wdGlvbmFsIHtAbGluayBSZXF1ZXN0T3B0aW9uc31cbiAgICogb2JqZWN0IGNhbiBiZSBwcm92aWRlZCBhcyB0aGUgMm5kIGFyZ3VtZW50LiBUaGUgb3B0aW9ucyBvYmplY3Qgd2lsbCBiZSBtZXJnZWQgd2l0aCB0aGUgdmFsdWVzXG4gICAqIG9mIHtAbGluayBCYXNlUmVxdWVzdE9wdGlvbnN9IGJlZm9yZSBwZXJmb3JtaW5nIHRoZSByZXF1ZXN0LlxuICAgKi9cbiAgcmVxdWVzdCh1cmw6IHN0cmluZyB8IFJlcXVlc3QsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc0FyZ3MpOiBPYnNlcnZhYmxlPFJlc3BvbnNlPiB7XG4gICAgdmFyIHJlc3BvbnNlT2JzZXJ2YWJsZTogYW55O1xuICAgIGlmIChpc1N0cmluZyh1cmwpKSB7XG4gICAgICB1cmwgPSBuZXcgUmVxdWVzdChtZXJnZU9wdGlvbnModGhpcy5fZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMsIFJlcXVlc3RNZXRob2QuR2V0LCB1cmwpKTtcbiAgICB9XG4gICAgaWYgKHVybCBpbnN0YW5jZW9mIFJlcXVlc3QpIHtcbiAgICAgIGlmICh1cmwubWV0aG9kICE9PSBSZXF1ZXN0TWV0aG9kLkdldCkge1xuICAgICAgICBtYWtlVHlwZUVycm9yKCdKU09OUCByZXF1ZXN0cyBtdXN0IHVzZSBHRVQgcmVxdWVzdCBtZXRob2QuJyk7XG4gICAgICB9XG4gICAgICByZXNwb25zZU9ic2VydmFibGUgPSBodHRwUmVxdWVzdCh0aGlzLl9iYWNrZW5kLCB1cmwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBtYWtlVHlwZUVycm9yKCdGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgdXJsIHN0cmluZyBvciBSZXF1ZXN0IGluc3RhbmNlLicpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2VPYnNlcnZhYmxlO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvaHR0cC9odHRwLnRzXG4gKiovIiwiaW1wb3J0IHtSZWFkeVN0YXRlLCBSZXF1ZXN0TWV0aG9kLCBSZXNwb25zZVR5cGV9IGZyb20gJy4vZW51bXMnO1xuaW1wb3J0IHtIZWFkZXJzfSBmcm9tICcuL2hlYWRlcnMnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9uLCBXcmFwcGVkRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtFdmVudEVtaXR0ZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvYXN5bmMnO1xuaW1wb3J0IHtSZXF1ZXN0fSBmcm9tICcuL3N0YXRpY19yZXF1ZXN0JztcbmltcG9ydCB7VVJMU2VhcmNoUGFyYW1zfSBmcm9tICcuL3VybF9zZWFyY2hfcGFyYW1zJztcblxuLyoqXG4gKiBBYnN0cmFjdCBjbGFzcyBmcm9tIHdoaWNoIHJlYWwgYmFja2VuZHMgYXJlIGRlcml2ZWQuXG4gKlxuICogVGhlIHByaW1hcnkgcHVycG9zZSBvZiBhIGBDb25uZWN0aW9uQmFja2VuZGAgaXMgdG8gY3JlYXRlIG5ldyBjb25uZWN0aW9ucyB0byBmdWxmaWxsIGEgZ2l2ZW5cbiAqIHtAbGluayBSZXF1ZXN0fS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvbm5lY3Rpb25CYWNrZW5kIHsgYWJzdHJhY3QgY3JlYXRlQ29ubmVjdGlvbihyZXF1ZXN0OiBhbnkpOiBDb25uZWN0aW9uOyB9XG5cbi8qKlxuICogQWJzdHJhY3QgY2xhc3MgZnJvbSB3aGljaCByZWFsIGNvbm5lY3Rpb25zIGFyZSBkZXJpdmVkLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29ubmVjdGlvbiB7XG4gIHJlYWR5U3RhdGU6IFJlYWR5U3RhdGU7XG4gIHJlcXVlc3Q6IFJlcXVlc3Q7XG4gIHJlc3BvbnNlOiBhbnk7ICAvLyBUT0RPOiBnZW5lcmljIG9mIDxSZXNwb25zZT47XG59XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBvcHRpb25zIHRvIGNvbnN0cnVjdCBhIFJlcXVlc3RPcHRpb25zLCBiYXNlZCBvblxuICogW1JlcXVlc3RJbml0XShodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jcmVxdWVzdGluaXQpIGZyb20gdGhlIEZldGNoIHNwZWMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdE9wdGlvbnNBcmdzIHtcbiAgdXJsPzogc3RyaW5nO1xuICBtZXRob2Q/OiBzdHJpbmcgfCBSZXF1ZXN0TWV0aG9kO1xuICBzZWFyY2g/OiBzdHJpbmcgfCBVUkxTZWFyY2hQYXJhbXM7XG4gIGhlYWRlcnM/OiBIZWFkZXJzO1xuICAvLyBUT0RPOiBTdXBwb3J0IEJsb2IsIEFycmF5QnVmZmVyLCBKU09OLCBVUkxTZWFyY2hQYXJhbXMsIEZvcm1EYXRhXG4gIGJvZHk/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVxdWlyZWQgc3RydWN0dXJlIHdoZW4gY29uc3RydWN0aW5nIG5ldyBSZXF1ZXN0KCk7XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdEFyZ3MgZXh0ZW5kcyBSZXF1ZXN0T3B0aW9uc0FyZ3MgeyB1cmw6IHN0cmluZzsgfVxuXG4vKipcbiAqIEludGVyZmFjZSBmb3Igb3B0aW9ucyB0byBjb25zdHJ1Y3QgYSBSZXNwb25zZSwgYmFzZWQgb25cbiAqIFtSZXNwb25zZUluaXRdKGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNyZXNwb25zZWluaXQpIGZyb20gdGhlIEZldGNoIHNwZWMuXG4gKi9cbmV4cG9ydCB0eXBlIFJlc3BvbnNlT3B0aW9uc0FyZ3MgPSB7XG4gIC8vIFRPRE86IFN1cHBvcnQgQmxvYiwgQXJyYXlCdWZmZXIsIEpTT05cbiAgYm9keT86IHN0cmluZyB8IE9iamVjdCB8IEZvcm1EYXRhO1xuICBzdGF0dXM/OiBudW1iZXI7XG4gIHN0YXR1c1RleHQ/OiBzdHJpbmc7XG4gIGhlYWRlcnM/OiBIZWFkZXJzO1xuICB0eXBlPzogUmVzcG9uc2VUeXBlO1xuICB1cmw/OiBzdHJpbmc7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvaHR0cC9pbnRlcmZhY2VzLnRzXG4gKiovIiwiaW1wb3J0IHtSZXF1ZXN0TWV0aG9kfSBmcm9tICcuL2VudW1zJztcbmltcG9ydCB7UmVxdWVzdEFyZ3N9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQge0hlYWRlcnN9IGZyb20gJy4vaGVhZGVycyc7XG5pbXBvcnQge25vcm1hbGl6ZU1ldGhvZE5hbWV9IGZyb20gJy4vaHR0cF91dGlscyc7XG5pbXBvcnQge1xuICBSZWdFeHBXcmFwcGVyLFxuICBDT05TVF9FWFBSLFxuICBpc1ByZXNlbnQsXG4gIGlzSnNPYmplY3QsXG4gIFN0cmluZ1dyYXBwZXJcbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxuLy8gVE9ETyhqZWZmYmNyb3NzKTogcHJvcGVybHkgaW1wbGVtZW50IGJvZHkgYWNjZXNzb3JzXG4vKipcbiAqIENyZWF0ZXMgYFJlcXVlc3RgIGluc3RhbmNlcyBmcm9tIHByb3ZpZGVkIHZhbHVlcy5cbiAqXG4gKiBUaGUgUmVxdWVzdCdzIGludGVyZmFjZSBpcyBpbnNwaXJlZCBieSB0aGUgUmVxdWVzdCBjb25zdHJ1Y3RvciBkZWZpbmVkIGluIHRoZSBbRmV0Y2hcbiAqIFNwZWNdKGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNyZXF1ZXN0LWNsYXNzKSxcbiAqIGJ1dCBpcyBjb25zaWRlcmVkIGEgc3RhdGljIHZhbHVlIHdob3NlIGJvZHkgY2FuIGJlIGFjY2Vzc2VkIG1hbnkgdGltZXMuIFRoZXJlIGFyZSBvdGhlclxuICogZGlmZmVyZW5jZXMgaW4gdGhlIGltcGxlbWVudGF0aW9uLCBidXQgdGhpcyBpcyB0aGUgbW9zdCBzaWduaWZpY2FudC5cbiAqXG4gKiBgUmVxdWVzdGAgaW5zdGFuY2VzIGFyZSB0eXBpY2FsbHkgY3JlYXRlZCBieSBoaWdoZXItbGV2ZWwgY2xhc3NlcywgbGlrZSB7QGxpbmsgSHR0cH0gYW5kXG4gKiB7QGxpbmsgSnNvbnB9LCBidXQgaXQgbWF5IG9jY2FzaW9uYWxseSBiZSB1c2VmdWwgdG8gZXhwbGljaXRseSBjcmVhdGUgYFJlcXVlc3RgIGluc3RhbmNlcy5cbiAqIE9uZSBzdWNoIGV4YW1wbGUgaXMgd2hlbiBjcmVhdGluZyBzZXJ2aWNlcyB0aGF0IHdyYXAgaGlnaGVyLWxldmVsIHNlcnZpY2VzLCBsaWtlIHtAbGluayBIdHRwfSxcbiAqIHdoZXJlIGl0IG1heSBiZSB1c2VmdWwgdG8gZ2VuZXJhdGUgYSBgUmVxdWVzdGAgd2l0aCBhcmJpdHJhcnkgaGVhZGVycyBhbmQgc2VhcmNoIHBhcmFtcy5cbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQge0luamVjdGFibGUsIEluamVjdG9yfSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbiAqIGltcG9ydCB7SFRUUF9QUk9WSURFUlMsIEh0dHAsIFJlcXVlc3QsIFJlcXVlc3RNZXRob2R9IGZyb20gJ2FuZ3VsYXIyL2h0dHAnO1xuICpcbiAqIEBJbmplY3RhYmxlKClcbiAqIGNsYXNzIEF1dG9BdXRoZW50aWNhdG9yIHtcbiAqICAgY29uc3RydWN0b3IocHVibGljIGh0dHA6SHR0cCkge31cbiAqICAgcmVxdWVzdCh1cmw6c3RyaW5nKSB7XG4gKiAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KG5ldyBSZXF1ZXN0KHtcbiAqICAgICAgIG1ldGhvZDogUmVxdWVzdE1ldGhvZC5HZXQsXG4gKiAgICAgICB1cmw6IHVybCxcbiAqICAgICAgIHNlYXJjaDogJ3Bhc3N3b3JkPTEyMydcbiAqICAgICB9KSk7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiB2YXIgaW5qZWN0b3IgPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtIVFRQX1BST1ZJREVSUywgQXV0b0F1dGhlbnRpY2F0b3JdKTtcbiAqIHZhciBhdXRoZW50aWNhdG9yID0gaW5qZWN0b3IuZ2V0KEF1dG9BdXRoZW50aWNhdG9yKTtcbiAqIGF1dGhlbnRpY2F0b3IucmVxdWVzdCgncGVvcGxlLmpzb24nKS5zdWJzY3JpYmUocmVzID0+IHtcbiAqICAgLy9VUkwgc2hvdWxkIGhhdmUgaW5jbHVkZWQgJz9wYXNzd29yZD0xMjMnXG4gKiAgIGNvbnNvbGUubG9nKCdwZW9wbGUnLCByZXMuanNvbigpKTtcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXF1ZXN0IHtcbiAgLyoqXG4gICAqIEh0dHAgbWV0aG9kIHdpdGggd2hpY2ggdG8gcGVyZm9ybSB0aGUgcmVxdWVzdC5cbiAgICovXG4gIG1ldGhvZDogUmVxdWVzdE1ldGhvZDtcbiAgLyoqXG4gICAqIHtAbGluayBIZWFkZXJzfSBpbnN0YW5jZVxuICAgKi9cbiAgaGVhZGVyczogSGVhZGVycztcbiAgLyoqIFVybCBvZiB0aGUgcmVtb3RlIHJlc291cmNlICovXG4gIHVybDogc3RyaW5nO1xuICAvLyBUT0RPOiBzdXBwb3J0IFVSTFNlYXJjaFBhcmFtcyB8IEZvcm1EYXRhIHwgQmxvYiB8IEFycmF5QnVmZmVyXG4gIHByaXZhdGUgX2JvZHk6IHN0cmluZztcbiAgY29uc3RydWN0b3IocmVxdWVzdE9wdGlvbnM6IFJlcXVlc3RBcmdzKSB7XG4gICAgLy8gVE9ETzogYXNzZXJ0IHRoYXQgdXJsIGlzIHByZXNlbnRcbiAgICBsZXQgdXJsID0gcmVxdWVzdE9wdGlvbnMudXJsO1xuICAgIHRoaXMudXJsID0gcmVxdWVzdE9wdGlvbnMudXJsO1xuICAgIGlmIChpc1ByZXNlbnQocmVxdWVzdE9wdGlvbnMuc2VhcmNoKSkge1xuICAgICAgbGV0IHNlYXJjaCA9IHJlcXVlc3RPcHRpb25zLnNlYXJjaC50b1N0cmluZygpO1xuICAgICAgaWYgKHNlYXJjaC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxldCBwcmVmaXggPSAnPyc7XG4gICAgICAgIGlmIChTdHJpbmdXcmFwcGVyLmNvbnRhaW5zKHRoaXMudXJsLCAnPycpKSB7XG4gICAgICAgICAgcHJlZml4ID0gKHRoaXMudXJsW3RoaXMudXJsLmxlbmd0aCAtIDFdID09ICcmJykgPyAnJyA6ICcmJztcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPOiBqdXN0IGRlbGV0ZSBzZWFyY2gtcXVlcnktbG9va2luZyBzdHJpbmcgaW4gdXJsP1xuICAgICAgICB0aGlzLnVybCA9IHVybCArIHByZWZpeCArIHNlYXJjaDtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fYm9keSA9IHJlcXVlc3RPcHRpb25zLmJvZHk7XG4gICAgdGhpcy5tZXRob2QgPSBub3JtYWxpemVNZXRob2ROYW1lKHJlcXVlc3RPcHRpb25zLm1ldGhvZCk7XG4gICAgLy8gVE9ETyhqZWZmYmNyb3NzKTogaW1wbGVtZW50IGJlaGF2aW9yXG4gICAgLy8gRGVmYXVsdHMgdG8gJ29taXQnLCBjb25zaXN0ZW50IHdpdGggYnJvd3NlclxuICAgIC8vIFRPRE8oamVmZmJjcm9zcyk6IGltcGxlbWVudCBiZWhhdmlvclxuICAgIHRoaXMuaGVhZGVycyA9IG5ldyBIZWFkZXJzKHJlcXVlc3RPcHRpb25zLmhlYWRlcnMpO1xuICB9XG5cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcmVxdWVzdCdzIGJvZHkgYXMgc3RyaW5nLCBhc3N1bWluZyB0aGF0IGJvZHkgZXhpc3RzLiBJZiBib2R5IGlzIHVuZGVmaW5lZCwgcmV0dXJuXG4gICAqIGVtcHR5XG4gICAqIHN0cmluZy5cbiAgICovXG4gIHRleHQoKTogU3RyaW5nIHsgcmV0dXJuIGlzUHJlc2VudCh0aGlzLl9ib2R5KSA/IHRoaXMuX2JvZHkudG9TdHJpbmcoKSA6ICcnOyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvaHR0cC9zdGF0aWNfcmVxdWVzdC50c1xuICoqLyIsImltcG9ydCB7XG4gIGlzUHJlc2VudCxcbiAgaXNCbGFuayxcbiAgaXNKc09iamVjdCxcbiAgaXNUeXBlLFxuICBTdHJpbmdXcmFwcGVyLFxuICBKc29uXG59IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge0Jhc2VFeGNlcHRpb24sIFdyYXBwZWRFeGNlcHRpb259IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9ucyc7XG5pbXBvcnQge1xuICBpc0xpc3RMaWtlSXRlcmFibGUsXG4gIE1hcCxcbiAgTWFwV3JhcHBlcixcbiAgU3RyaW5nTWFwV3JhcHBlcixcbiAgTGlzdFdyYXBwZXIsXG59IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5cbi8qKlxuICogUG9seWZpbGwgZm9yIFtIZWFkZXJzXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSGVhZGVycy9IZWFkZXJzKSwgYXNcbiAqIHNwZWNpZmllZCBpbiB0aGUgW0ZldGNoIFNwZWNdKGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNoZWFkZXJzLWNsYXNzKS5cbiAqXG4gKiBUaGUgb25seSBrbm93biBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBgSGVhZGVyc2AgaW1wbGVtZW50YXRpb24gYW5kIHRoZSBzcGVjIGlzIHRoZVxuICogbGFjayBvZiBhbiBgZW50cmllc2AgbWV0aG9kLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9NVGR3VDY/cD1wcmV2aWV3KSlcbiAqXG4gKiBgYGBcbiAqIGltcG9ydCB7SGVhZGVyc30gZnJvbSAnYW5ndWxhcjIvaHR0cCc7XG4gKlxuICogdmFyIGZpcnN0SGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XG4gKiBmaXJzdEhlYWRlcnMuYXBwZW5kKCdDb250ZW50LVR5cGUnLCAnaW1hZ2UvanBlZycpO1xuICogY29uc29sZS5sb2coZmlyc3RIZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJykpIC8vJ2ltYWdlL2pwZWcnXG4gKlxuICogLy8gQ3JlYXRlIGhlYWRlcnMgZnJvbSBQbGFpbiBPbGQgSmF2YVNjcmlwdCBPYmplY3RcbiAqIHZhciBzZWNvbmRIZWFkZXJzID0gbmV3IEhlYWRlcnMoe1xuICogICAnWC1NeS1DdXN0b20tSGVhZGVyJzogJ0FuZ3VsYXInXG4gKiB9KTtcbiAqIGNvbnNvbGUubG9nKHNlY29uZEhlYWRlcnMuZ2V0KCdYLU15LUN1c3RvbS1IZWFkZXInKSk7IC8vJ0FuZ3VsYXInXG4gKlxuICogdmFyIHRoaXJkSGVhZGVycyA9IG5ldyBIZWFkZXJzKHNlY29uZEhlYWRlcnMpO1xuICogY29uc29sZS5sb2codGhpcmRIZWFkZXJzLmdldCgnWC1NeS1DdXN0b20tSGVhZGVyJykpOyAvLydBbmd1bGFyJ1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBIZWFkZXJzIHtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfaGVhZGVyc01hcDogTWFwPHN0cmluZywgc3RyaW5nW10+O1xuICBjb25zdHJ1Y3RvcihoZWFkZXJzPzogSGVhZGVycyB8IHtba2V5OiBzdHJpbmddOiBhbnl9KSB7XG4gICAgaWYgKGhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzKSB7XG4gICAgICB0aGlzLl9oZWFkZXJzTWFwID0gKDxIZWFkZXJzPmhlYWRlcnMpLl9oZWFkZXJzTWFwO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2hlYWRlcnNNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG5cbiAgICBpZiAoaXNCbGFuayhoZWFkZXJzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGhlYWRlcnMgaW5zdGFuY2VvZiBTdHJpbmdNYXBcbiAgICBTdHJpbmdNYXBXcmFwcGVyLmZvckVhY2goXG4gICAgICAgIGhlYWRlcnMsICh2LCBrKSA9PiB7IHRoaXMuX2hlYWRlcnNNYXAuc2V0KGssIGlzTGlzdExpa2VJdGVyYWJsZSh2KSA/IHYgOiBbdl0pOyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbmV3IEhlYWRlcnMgaW5zdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gRE9NU3RyaW5nIG9mIFJlc3BvbnNlIEhlYWRlcnNcbiAgICovXG4gIHN0YXRpYyBmcm9tUmVzcG9uc2VIZWFkZXJTdHJpbmcoaGVhZGVyc1N0cmluZzogc3RyaW5nKTogSGVhZGVycyB7XG4gICAgcmV0dXJuIGhlYWRlcnNTdHJpbmcudHJpbSgpXG4gICAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgICAgLm1hcCh2YWwgPT4gdmFsLnNwbGl0KCc6JykpXG4gICAgICAgIC5tYXAoKFtrZXksIC4uLnBhcnRzXSkgPT4gKFtrZXkudHJpbSgpLCBwYXJ0cy5qb2luKCc6JykudHJpbSgpXSkpXG4gICAgICAgIC5yZWR1Y2UoKGhlYWRlcnMsIFtrZXksIHZhbHVlXSkgPT4gIWhlYWRlcnMuc2V0KGtleSwgdmFsdWUpICYmIGhlYWRlcnMsIG5ldyBIZWFkZXJzKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgYSBoZWFkZXIgdG8gZXhpc3RpbmcgbGlzdCBvZiBoZWFkZXIgdmFsdWVzIGZvciBhIGdpdmVuIGhlYWRlciBuYW1lLlxuICAgKi9cbiAgYXBwZW5kKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHZhciBtYXBOYW1lID0gdGhpcy5faGVhZGVyc01hcC5nZXQobmFtZSk7XG4gICAgdmFyIGxpc3QgPSBpc0xpc3RMaWtlSXRlcmFibGUobWFwTmFtZSkgPyBtYXBOYW1lIDogW107XG4gICAgbGlzdC5wdXNoKHZhbHVlKTtcbiAgICB0aGlzLl9oZWFkZXJzTWFwLnNldChuYW1lLCBsaXN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGVzIGFsbCBoZWFkZXIgdmFsdWVzIGZvciB0aGUgZ2l2ZW4gbmFtZS5cbiAgICovXG4gIGRlbGV0ZSAobmFtZTogc3RyaW5nKTogdm9pZCB7IHRoaXMuX2hlYWRlcnNNYXAuZGVsZXRlKG5hbWUpOyB9XG5cbiAgZm9yRWFjaChmbjogKHZhbHVlczogc3RyaW5nW10sIG5hbWU6IHN0cmluZywgaGVhZGVyczogTWFwPHN0cmluZywgc3RyaW5nW10+KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5faGVhZGVyc01hcC5mb3JFYWNoKGZuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGZpcnN0IGhlYWRlciB0aGF0IG1hdGNoZXMgZ2l2ZW4gbmFtZS5cbiAgICovXG4gIGdldChoZWFkZXI6IHN0cmluZyk6IHN0cmluZyB7IHJldHVybiBMaXN0V3JhcHBlci5maXJzdCh0aGlzLl9oZWFkZXJzTWFwLmdldChoZWFkZXIpKTsgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBmb3IgZXhpc3RlbmNlIG9mIGhlYWRlciBieSBnaXZlbiBuYW1lLlxuICAgKi9cbiAgaGFzKGhlYWRlcjogc3RyaW5nKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9oZWFkZXJzTWFwLmhhcyhoZWFkZXIpOyB9XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIG5hbWVzIG9mIHNldCBoZWFkZXJzXG4gICAqL1xuICBrZXlzKCk6IHN0cmluZ1tdIHsgcmV0dXJuIE1hcFdyYXBwZXIua2V5cyh0aGlzLl9oZWFkZXJzTWFwKTsgfVxuXG4gIC8qKlxuICAgKiBTZXRzIG9yIG92ZXJyaWRlcyBoZWFkZXIgdmFsdWUgZm9yIGdpdmVuIG5hbWUuXG4gICAqL1xuICBzZXQoaGVhZGVyOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHZhciBsaXN0ID0gW107XG5cbiAgICBpZiAoaXNMaXN0TGlrZUl0ZXJhYmxlKHZhbHVlKSkge1xuICAgICAgdmFyIHB1c2hWYWx1ZSA9ICg8c3RyaW5nW10+dmFsdWUpLmpvaW4oJywnKTtcbiAgICAgIGxpc3QucHVzaChwdXNoVmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsaXN0LnB1c2godmFsdWUpO1xuICAgIH1cblxuICAgIHRoaXMuX2hlYWRlcnNNYXAuc2V0KGhlYWRlciwgbGlzdCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB2YWx1ZXMgb2YgYWxsIGhlYWRlcnMuXG4gICAqL1xuICB2YWx1ZXMoKTogc3RyaW5nW11bXSB7IHJldHVybiBNYXBXcmFwcGVyLnZhbHVlcyh0aGlzLl9oZWFkZXJzTWFwKTsgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHN0cmluZyBvZiBhbGwgaGVhZGVycy5cbiAgICovXG4gIHRvSlNPTigpOiBzdHJpbmcgeyByZXR1cm4gSnNvbi5zdHJpbmdpZnkodGhpcy52YWx1ZXMoKSk7IH1cblxuICAvKipcbiAgICogUmV0dXJucyBsaXN0IG9mIGhlYWRlciB2YWx1ZXMgZm9yIGEgZ2l2ZW4gbmFtZS5cbiAgICovXG4gIGdldEFsbChoZWFkZXI6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICB2YXIgaGVhZGVycyA9IHRoaXMuX2hlYWRlcnNNYXAuZ2V0KGhlYWRlcik7XG4gICAgcmV0dXJuIGlzTGlzdExpa2VJdGVyYWJsZShoZWFkZXJzKSA/IGhlYWRlcnMgOiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuXG4gICAqL1xuICBlbnRyaWVzKCkgeyB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignXCJlbnRyaWVzXCIgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZCBvbiBIZWFkZXJzIGNsYXNzJyk7IH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9odHRwL2hlYWRlcnMudHNcbiAqKi8iLCJpbXBvcnQge2lzU3RyaW5nfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtSZXF1ZXN0TWV0aG9kfSBmcm9tICcuL2VudW1zJztcbmltcG9ydCB7bWFrZVR5cGVFcnJvcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7UmVzcG9uc2V9IGZyb20gJy4vc3RhdGljX3Jlc3BvbnNlJztcblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZU1ldGhvZE5hbWUobWV0aG9kKTogUmVxdWVzdE1ldGhvZCB7XG4gIGlmIChpc1N0cmluZyhtZXRob2QpKSB7XG4gICAgdmFyIG9yaWdpbmFsTWV0aG9kID0gbWV0aG9kO1xuICAgIG1ldGhvZCA9IG1ldGhvZC5yZXBsYWNlKC8oXFx3KShcXHcqKS9nLCAoZzAsIGcxLCBnMikgPT4gZzEudG9VcHBlckNhc2UoKSArIGcyLnRvTG93ZXJDYXNlKCkpO1xuICAgIG1ldGhvZCA9IFJlcXVlc3RNZXRob2RbbWV0aG9kXTtcbiAgICBpZiAodHlwZW9mIG1ldGhvZCAhPT0gJ251bWJlcicpXG4gICAgICB0aHJvdyBtYWtlVHlwZUVycm9yKFxuICAgICAgICAgIGBJbnZhbGlkIHJlcXVlc3QgbWV0aG9kLiBUaGUgbWV0aG9kIFwiJHtvcmlnaW5hbE1ldGhvZH1cIiBpcyBub3Qgc3VwcG9ydGVkLmApO1xuICB9XG4gIHJldHVybiBtZXRob2Q7XG59XG5cbmV4cG9ydCBjb25zdCBpc1N1Y2Nlc3MgPSAoc3RhdHVzOiBudW1iZXIpOiBib29sZWFuID0+IChzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZXNwb25zZVVSTCh4aHI6IGFueSk6IHN0cmluZyB7XG4gIGlmICgncmVzcG9uc2VVUkwnIGluIHhocikge1xuICAgIHJldHVybiB4aHIucmVzcG9uc2VVUkw7XG4gIH1cbiAgaWYgKC9eWC1SZXF1ZXN0LVVSTDovbS50ZXN0KHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSkpIHtcbiAgICByZXR1cm4geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdYLVJlcXVlc3QtVVJMJyk7XG4gIH1cbiAgcmV0dXJuO1xufVxuXG5leHBvcnQge2lzSnNPYmplY3R9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvaHR0cC9odHRwX3V0aWxzLnRzXG4gKiovIiwiaW1wb3J0IHtTdHJpbmdNYXBXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuXG4vKipcbiAqIFN1cHBvcnRlZCBodHRwIG1ldGhvZHMuXG4gKi9cbmV4cG9ydCBlbnVtIFJlcXVlc3RNZXRob2Qge1xuICBHZXQsXG4gIFBvc3QsXG4gIFB1dCxcbiAgRGVsZXRlLFxuICBPcHRpb25zLFxuICBIZWFkLFxuICBQYXRjaFxufVxuXG4vKipcbiAqIEFsbCBwb3NzaWJsZSBzdGF0ZXMgaW4gd2hpY2ggYSBjb25uZWN0aW9uIGNhbiBiZSwgYmFzZWQgb25cbiAqIFtTdGF0ZXNdKGh0dHA6Ly93d3cudzMub3JnL1RSL1hNTEh0dHBSZXF1ZXN0LyNzdGF0ZXMpIGZyb20gdGhlIGBYTUxIdHRwUmVxdWVzdGAgc3BlYywgYnV0IHdpdGggYW5cbiAqIGFkZGl0aW9uYWwgXCJDQU5DRUxMRURcIiBzdGF0ZS5cbiAqL1xuZXhwb3J0IGVudW0gUmVhZHlTdGF0ZSB7XG4gIFVuc2VudCxcbiAgT3BlbixcbiAgSGVhZGVyc1JlY2VpdmVkLFxuICBMb2FkaW5nLFxuICBEb25lLFxuICBDYW5jZWxsZWRcbn1cblxuLyoqXG4gKiBBY2NlcHRhYmxlIHJlc3BvbnNlIHR5cGVzIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBhIHtAbGluayBSZXNwb25zZX0sIGJhc2VkIG9uXG4gKiBbUmVzcG9uc2VUeXBlXShodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jcmVzcG9uc2V0eXBlKSBmcm9tIHRoZSBGZXRjaCBzcGVjLlxuICovXG5leHBvcnQgZW51bSBSZXNwb25zZVR5cGUge1xuICBCYXNpYyxcbiAgQ29ycyxcbiAgRGVmYXVsdCxcbiAgRXJyb3IsXG4gIE9wYXF1ZVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2h0dHAvZW51bXMudHNcbiAqKi8iLCJpbXBvcnQge2lzUHJlc2VudCwgaXNTdHJpbmd9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge0hlYWRlcnN9IGZyb20gJy4vaGVhZGVycyc7XG5pbXBvcnQge1JlcXVlc3RNZXRob2R9IGZyb20gJy4vZW51bXMnO1xuaW1wb3J0IHtSZXF1ZXN0T3B0aW9uc0FyZ3N9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQge0luamVjdGFibGV9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuaW1wb3J0IHtVUkxTZWFyY2hQYXJhbXN9IGZyb20gJy4vdXJsX3NlYXJjaF9wYXJhbXMnO1xuaW1wb3J0IHtub3JtYWxpemVNZXRob2ROYW1lfSBmcm9tICcuL2h0dHBfdXRpbHMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSByZXF1ZXN0IG9wdGlvbnMgb2JqZWN0IHRvIGJlIG9wdGlvbmFsbHkgcHJvdmlkZWQgd2hlbiBpbnN0YW50aWF0aW5nIGFcbiAqIHtAbGluayBSZXF1ZXN0fS5cbiAqXG4gKiBUaGlzIGNsYXNzIGlzIGJhc2VkIG9uIHRoZSBgUmVxdWVzdEluaXRgIGRlc2NyaXB0aW9uIGluIHRoZSBbRmV0Y2hcbiAqIFNwZWNdKGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNyZXF1ZXN0aW5pdCkuXG4gKlxuICogQWxsIHZhbHVlcyBhcmUgbnVsbCBieSBkZWZhdWx0LiBUeXBpY2FsIGRlZmF1bHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUge0BsaW5rIEJhc2VSZXF1ZXN0T3B0aW9uc31cbiAqIGNsYXNzLCB3aGljaCBzdWItY2xhc3NlcyBgUmVxdWVzdE9wdGlvbnNgLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC83V3ZpM2xmTHE0MWFRUEtseEI0Tz9wPXByZXZpZXcpKVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7UmVxdWVzdE9wdGlvbnMsIFJlcXVlc3QsIFJlcXVlc3RNZXRob2R9IGZyb20gJ2FuZ3VsYXIyL2h0dHAnO1xuICpcbiAqIHZhciBvcHRpb25zID0gbmV3IFJlcXVlc3RPcHRpb25zKHtcbiAqICAgbWV0aG9kOiBSZXF1ZXN0TWV0aG9kLlBvc3QsXG4gKiAgIHVybDogJ2h0dHBzOi8vZ29vZ2xlLmNvbSdcbiAqIH0pO1xuICogdmFyIHJlcSA9IG5ldyBSZXF1ZXN0KG9wdGlvbnMpO1xuICogY29uc29sZS5sb2coJ3JlcS5tZXRob2Q6JywgUmVxdWVzdE1ldGhvZFtyZXEubWV0aG9kXSk7IC8vIFBvc3RcbiAqIGNvbnNvbGUubG9nKCdvcHRpb25zLnVybDonLCBvcHRpb25zLnVybCk7IC8vIGh0dHBzOi8vZ29vZ2xlLmNvbVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXF1ZXN0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBIdHRwIG1ldGhvZCB3aXRoIHdoaWNoIHRvIGV4ZWN1dGUgYSB7QGxpbmsgUmVxdWVzdH0uXG4gICAqIEFjY2VwdGFibGUgbWV0aG9kcyBhcmUgZGVmaW5lZCBpbiB0aGUge0BsaW5rIFJlcXVlc3RNZXRob2R9IGVudW0uXG4gICAqL1xuICBtZXRob2Q6IFJlcXVlc3RNZXRob2QgfCBzdHJpbmc7XG4gIC8qKlxuICAgKiB7QGxpbmsgSGVhZGVyc30gdG8gYmUgYXR0YWNoZWQgdG8gYSB7QGxpbmsgUmVxdWVzdH0uXG4gICAqL1xuICBoZWFkZXJzOiBIZWFkZXJzO1xuICAvKipcbiAgICogQm9keSB0byBiZSB1c2VkIHdoZW4gY3JlYXRpbmcgYSB7QGxpbmsgUmVxdWVzdH0uXG4gICAqL1xuICAvLyBUT0RPOiBzdXBwb3J0IEZvcm1EYXRhLCBCbG9iLCBVUkxTZWFyY2hQYXJhbXNcbiAgYm9keTogc3RyaW5nO1xuICAvKipcbiAgICogVXJsIHdpdGggd2hpY2ggdG8gcGVyZm9ybSBhIHtAbGluayBSZXF1ZXN0fS5cbiAgICovXG4gIHVybDogc3RyaW5nO1xuICAvKipcbiAgICogU2VhcmNoIHBhcmFtZXRlcnMgdG8gYmUgaW5jbHVkZWQgaW4gYSB7QGxpbmsgUmVxdWVzdH0uXG4gICAqL1xuICBzZWFyY2g6IFVSTFNlYXJjaFBhcmFtcztcbiAgY29uc3RydWN0b3Ioe21ldGhvZCwgaGVhZGVycywgYm9keSwgdXJsLCBzZWFyY2h9OiBSZXF1ZXN0T3B0aW9uc0FyZ3MgPSB7fSkge1xuICAgIHRoaXMubWV0aG9kID0gaXNQcmVzZW50KG1ldGhvZCkgPyBub3JtYWxpemVNZXRob2ROYW1lKG1ldGhvZCkgOiBudWxsO1xuICAgIHRoaXMuaGVhZGVycyA9IGlzUHJlc2VudChoZWFkZXJzKSA/IGhlYWRlcnMgOiBudWxsO1xuICAgIHRoaXMuYm9keSA9IGlzUHJlc2VudChib2R5KSA/IGJvZHkgOiBudWxsO1xuICAgIHRoaXMudXJsID0gaXNQcmVzZW50KHVybCkgPyB1cmwgOiBudWxsO1xuICAgIHRoaXMuc2VhcmNoID0gaXNQcmVzZW50KHNlYXJjaCkgPyAoaXNTdHJpbmcoc2VhcmNoKSA/IG5ldyBVUkxTZWFyY2hQYXJhbXMoPHN0cmluZz4oc2VhcmNoKSkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxVUkxTZWFyY2hQYXJhbXM+KHNlYXJjaCkpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY29weSBvZiB0aGUgYFJlcXVlc3RPcHRpb25zYCBpbnN0YW5jZSwgdXNpbmcgdGhlIG9wdGlvbmFsIGlucHV0IGFzIHZhbHVlcyB0byBvdmVycmlkZVxuICAgKiBleGlzdGluZyB2YWx1ZXMuIFRoaXMgbWV0aG9kIHdpbGwgbm90IGNoYW5nZSB0aGUgdmFsdWVzIG9mIHRoZSBpbnN0YW5jZSBvbiB3aGljaCBpdCBpcyBiZWluZ1xuICAgKiBjYWxsZWQuXG4gICAqXG4gICAqIE5vdGUgdGhhdCBgaGVhZGVyc2AgYW5kIGBzZWFyY2hgIHdpbGwgb3ZlcnJpZGUgZXhpc3RpbmcgdmFsdWVzIGNvbXBsZXRlbHkgaWYgcHJlc2VudCBpblxuICAgKiB0aGUgYG9wdGlvbnNgIG9iamVjdC4gSWYgdGhlc2UgdmFsdWVzIHNob3VsZCBiZSBtZXJnZWQsIGl0IHNob3VsZCBiZSBkb25lIHByaW9yIHRvIGNhbGxpbmdcbiAgICogYG1lcmdlYCBvbiB0aGUgYFJlcXVlc3RPcHRpb25zYCBpbnN0YW5jZS5cbiAgICpcbiAgICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0LzZ3OFhBOFlUa0RSY1BZcGRCOWRrP3A9cHJldmlldykpXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogaW1wb3J0IHtSZXF1ZXN0T3B0aW9ucywgUmVxdWVzdCwgUmVxdWVzdE1ldGhvZH0gZnJvbSAnYW5ndWxhcjIvaHR0cCc7XG4gICAqXG4gICAqIHZhciBvcHRpb25zID0gbmV3IFJlcXVlc3RPcHRpb25zKHtcbiAgICogICBtZXRob2Q6IFJlcXVlc3RNZXRob2QuUG9zdFxuICAgKiB9KTtcbiAgICogdmFyIHJlcSA9IG5ldyBSZXF1ZXN0KG9wdGlvbnMubWVyZ2Uoe1xuICAgKiAgIHVybDogJ2h0dHBzOi8vZ29vZ2xlLmNvbSdcbiAgICogfSkpO1xuICAgKiBjb25zb2xlLmxvZygncmVxLm1ldGhvZDonLCBSZXF1ZXN0TWV0aG9kW3JlcS5tZXRob2RdKTsgLy8gUG9zdFxuICAgKiBjb25zb2xlLmxvZygnb3B0aW9ucy51cmw6Jywgb3B0aW9ucy51cmwpOyAvLyBudWxsXG4gICAqIGNvbnNvbGUubG9nKCdyZXEudXJsOicsIHJlcS51cmwpOyAvLyBodHRwczovL2dvb2dsZS5jb21cbiAgICogYGBgXG4gICAqL1xuICBtZXJnZShvcHRpb25zPzogUmVxdWVzdE9wdGlvbnNBcmdzKTogUmVxdWVzdE9wdGlvbnMge1xuICAgIHJldHVybiBuZXcgUmVxdWVzdE9wdGlvbnMoe1xuICAgICAgbWV0aG9kOiBpc1ByZXNlbnQob3B0aW9ucykgJiYgaXNQcmVzZW50KG9wdGlvbnMubWV0aG9kKSA/IG9wdGlvbnMubWV0aG9kIDogdGhpcy5tZXRob2QsXG4gICAgICBoZWFkZXJzOiBpc1ByZXNlbnQob3B0aW9ucykgJiYgaXNQcmVzZW50KG9wdGlvbnMuaGVhZGVycykgPyBvcHRpb25zLmhlYWRlcnMgOiB0aGlzLmhlYWRlcnMsXG4gICAgICBib2R5OiBpc1ByZXNlbnQob3B0aW9ucykgJiYgaXNQcmVzZW50KG9wdGlvbnMuYm9keSkgPyBvcHRpb25zLmJvZHkgOiB0aGlzLmJvZHksXG4gICAgICB1cmw6IGlzUHJlc2VudChvcHRpb25zKSAmJiBpc1ByZXNlbnQob3B0aW9ucy51cmwpID8gb3B0aW9ucy51cmwgOiB0aGlzLnVybCxcbiAgICAgIHNlYXJjaDogaXNQcmVzZW50KG9wdGlvbnMpICYmIGlzUHJlc2VudChvcHRpb25zLnNlYXJjaCkgP1xuICAgICAgICAgICAgICAgICAgKGlzU3RyaW5nKG9wdGlvbnMuc2VhcmNoKSA/IG5ldyBVUkxTZWFyY2hQYXJhbXMoPHN0cmluZz4ob3B0aW9ucy5zZWFyY2gpKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDxVUkxTZWFyY2hQYXJhbXM+KG9wdGlvbnMuc2VhcmNoKSkuY2xvbmUoKSkgOlxuICAgICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hcbiAgICB9KTtcbiAgfVxufVxuXG5cbi8qKlxuICogU3ViY2xhc3Mgb2Yge0BsaW5rIFJlcXVlc3RPcHRpb25zfSwgd2l0aCBkZWZhdWx0IHZhbHVlcy5cbiAqXG4gKiBEZWZhdWx0IHZhbHVlczpcbiAqICAqIG1ldGhvZDoge0BsaW5rIFJlcXVlc3RNZXRob2QgUmVxdWVzdE1ldGhvZC5HZXR9XG4gKiAgKiBoZWFkZXJzOiBlbXB0eSB7QGxpbmsgSGVhZGVyc30gb2JqZWN0XG4gKlxuICogVGhpcyBjbGFzcyBjb3VsZCBiZSBleHRlbmRlZCBhbmQgYm91bmQgdG8gdGhlIHtAbGluayBSZXF1ZXN0T3B0aW9uc30gY2xhc3NcbiAqIHdoZW4gY29uZmlndXJpbmcgYW4ge0BsaW5rIEluamVjdG9yfSwgaW4gb3JkZXIgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgb3B0aW9uc1xuICogdXNlZCBieSB7QGxpbmsgSHR0cH0gdG8gY3JlYXRlIGFuZCBzZW5kIHtAbGluayBSZXF1ZXN0IFJlcXVlc3RzfS5cbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvTEVLVlN4P3A9cHJldmlldykpXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHtwcm92aWRlfSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbiAqIGltcG9ydCB7Ym9vdHN0cmFwfSBmcm9tICdhbmd1bGFyMi9wbGF0Zm9ybS9icm93c2VyJztcbiAqIGltcG9ydCB7SFRUUF9QUk9WSURFUlMsIEh0dHAsIEJhc2VSZXF1ZXN0T3B0aW9ucywgUmVxdWVzdE9wdGlvbnN9IGZyb20gJ2FuZ3VsYXIyL2h0dHAnO1xuICogaW1wb3J0IHtBcHB9IGZyb20gJy4vbXlhcHAnO1xuICpcbiAqIGNsYXNzIE15T3B0aW9ucyBleHRlbmRzIEJhc2VSZXF1ZXN0T3B0aW9ucyB7XG4gKiAgIHNlYXJjaDogc3RyaW5nID0gJ2NvcmVUZWFtPXRydWUnO1xuICogfVxuICpcbiAqIGJvb3RzdHJhcChBcHAsIFtIVFRQX1BST1ZJREVSUywgcHJvdmlkZShSZXF1ZXN0T3B0aW9ucywge3VzZUNsYXNzOiBNeU9wdGlvbnN9KV0pO1xuICogYGBgXG4gKlxuICogVGhlIG9wdGlvbnMgY291bGQgYWxzbyBiZSBleHRlbmRlZCB3aGVuIG1hbnVhbGx5IGNyZWF0aW5nIGEge0BsaW5rIFJlcXVlc3R9XG4gKiBvYmplY3QuXG4gKlxuICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L295Qm9Fdk50RGhPU2ZpOVl4YVZiP3A9cHJldmlldykpXG4gKlxuICogYGBgXG4gKiBpbXBvcnQge0Jhc2VSZXF1ZXN0T3B0aW9ucywgUmVxdWVzdCwgUmVxdWVzdE1ldGhvZH0gZnJvbSAnYW5ndWxhcjIvaHR0cCc7XG4gKlxuICogdmFyIG9wdGlvbnMgPSBuZXcgQmFzZVJlcXVlc3RPcHRpb25zKCk7XG4gKiB2YXIgcmVxID0gbmV3IFJlcXVlc3Qob3B0aW9ucy5tZXJnZSh7XG4gKiAgIG1ldGhvZDogUmVxdWVzdE1ldGhvZC5Qb3N0LFxuICogICB1cmw6ICdodHRwczovL2dvb2dsZS5jb20nXG4gKiB9KSk7XG4gKiBjb25zb2xlLmxvZygncmVxLm1ldGhvZDonLCBSZXF1ZXN0TWV0aG9kW3JlcS5tZXRob2RdKTsgLy8gUG9zdFxuICogY29uc29sZS5sb2coJ29wdGlvbnMudXJsOicsIG9wdGlvbnMudXJsKTsgLy8gbnVsbFxuICogY29uc29sZS5sb2coJ3JlcS51cmw6JywgcmVxLnVybCk7IC8vIGh0dHBzOi8vZ29vZ2xlLmNvbVxuICogYGBgXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBCYXNlUmVxdWVzdE9wdGlvbnMgZXh0ZW5kcyBSZXF1ZXN0T3B0aW9ucyB7XG4gIGNvbnN0cnVjdG9yKCkgeyBzdXBlcih7bWV0aG9kOiBSZXF1ZXN0TWV0aG9kLkdldCwgaGVhZGVyczogbmV3IEhlYWRlcnMoKX0pOyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvaHR0cC9iYXNlX3JlcXVlc3Rfb3B0aW9ucy50c1xuICoqLyIsImltcG9ydCB7Q09OU1RfRVhQUiwgaXNQcmVzZW50LCBpc0JsYW5rfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtNYXAsIE1hcFdyYXBwZXIsIExpc3RXcmFwcGVyLCBpc0xpc3RMaWtlSXRlcmFibGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5cbmZ1bmN0aW9uIHBhcmFtUGFyc2VyKHJhd1BhcmFtczogc3RyaW5nID0gJycpOiBNYXA8c3RyaW5nLCBzdHJpbmdbXT4ge1xuICB2YXIgbWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuICBpZiAocmF3UGFyYW1zLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgcGFyYW1zOiBzdHJpbmdbXSA9IHJhd1BhcmFtcy5zcGxpdCgnJicpO1xuICAgIHBhcmFtcy5mb3JFYWNoKChwYXJhbTogc3RyaW5nKSA9PiB7XG4gICAgICB2YXIgc3BsaXQ6IHN0cmluZ1tdID0gcGFyYW0uc3BsaXQoJz0nKTtcbiAgICAgIHZhciBrZXkgPSBzcGxpdFswXTtcbiAgICAgIHZhciB2YWwgPSBzcGxpdFsxXTtcbiAgICAgIHZhciBsaXN0ID0gaXNQcmVzZW50KG1hcC5nZXQoa2V5KSkgPyBtYXAuZ2V0KGtleSkgOiBbXTtcbiAgICAgIGxpc3QucHVzaCh2YWwpO1xuICAgICAgbWFwLnNldChrZXksIGxpc3QpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBtYXA7XG59XG5cbi8qKlxuICogTWFwLWxpa2UgcmVwcmVzZW50YXRpb24gb2YgdXJsIHNlYXJjaCBwYXJhbWV0ZXJzLCBiYXNlZCBvblxuICogW1VSTFNlYXJjaFBhcmFtc10oaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyN1cmxzZWFyY2hwYXJhbXMpIGluIHRoZSB1cmwgbGl2aW5nIHN0YW5kYXJkLFxuICogd2l0aCBzZXZlcmFsIGV4dGVuc2lvbnMgZm9yIG1lcmdpbmcgVVJMU2VhcmNoUGFyYW1zIG9iamVjdHM6XG4gKiAgIC0gc2V0QWxsKClcbiAqICAgLSBhcHBlbmRBbGwoKVxuICogICAtIHJlcGxhY2VBbGwoKVxuICovXG5leHBvcnQgY2xhc3MgVVJMU2VhcmNoUGFyYW1zIHtcbiAgcGFyYW1zTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmdbXT47XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByYXdQYXJhbXM6IHN0cmluZyA9ICcnKSB7IHRoaXMucGFyYW1zTWFwID0gcGFyYW1QYXJzZXIocmF3UGFyYW1zKTsgfVxuXG4gIGNsb25lKCk6IFVSTFNlYXJjaFBhcmFtcyB7XG4gICAgdmFyIGNsb25lID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgIGNsb25lLmFwcGVuZEFsbCh0aGlzKTtcbiAgICByZXR1cm4gY2xvbmU7XG4gIH1cblxuICBoYXMocGFyYW06IHN0cmluZyk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5wYXJhbXNNYXAuaGFzKHBhcmFtKTsgfVxuXG4gIGdldChwYXJhbTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB2YXIgc3RvcmVkUGFyYW0gPSB0aGlzLnBhcmFtc01hcC5nZXQocGFyYW0pO1xuICAgIGlmIChpc0xpc3RMaWtlSXRlcmFibGUoc3RvcmVkUGFyYW0pKSB7XG4gICAgICByZXR1cm4gTGlzdFdyYXBwZXIuZmlyc3Qoc3RvcmVkUGFyYW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBnZXRBbGwocGFyYW06IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICB2YXIgbWFwUGFyYW0gPSB0aGlzLnBhcmFtc01hcC5nZXQocGFyYW0pO1xuICAgIHJldHVybiBpc1ByZXNlbnQobWFwUGFyYW0pID8gbWFwUGFyYW0gOiBbXTtcbiAgfVxuXG4gIHNldChwYXJhbTogc3RyaW5nLCB2YWw6IHN0cmluZykge1xuICAgIHZhciBtYXBQYXJhbSA9IHRoaXMucGFyYW1zTWFwLmdldChwYXJhbSk7XG4gICAgdmFyIGxpc3QgPSBpc1ByZXNlbnQobWFwUGFyYW0pID8gbWFwUGFyYW0gOiBbXTtcbiAgICBMaXN0V3JhcHBlci5jbGVhcihsaXN0KTtcbiAgICBsaXN0LnB1c2godmFsKTtcbiAgICB0aGlzLnBhcmFtc01hcC5zZXQocGFyYW0sIGxpc3QpO1xuICB9XG5cbiAgLy8gQSBtZXJnZSBvcGVyYXRpb25cbiAgLy8gRm9yIGVhY2ggbmFtZS12YWx1ZXMgcGFpciBpbiBgc2VhcmNoUGFyYW1zYCwgcGVyZm9ybSBgc2V0KG5hbWUsIHZhbHVlc1swXSlgXG4gIC8vXG4gIC8vIEUuZzogXCJhPVsxLDIsM10sIGM9WzhdXCIgKyBcImE9WzQsNSw2XSwgYj1bN11cIiA9IFwiYT1bNF0sIGM9WzhdLCBiPVs3XVwiXG4gIC8vXG4gIC8vIFRPRE8oQGNhaXRwKTogZG9jdW1lbnQgdGhpcyBiZXR0ZXJcbiAgc2V0QWxsKHNlYXJjaFBhcmFtczogVVJMU2VhcmNoUGFyYW1zKSB7XG4gICAgc2VhcmNoUGFyYW1zLnBhcmFtc01hcC5mb3JFYWNoKCh2YWx1ZSwgcGFyYW0pID0+IHtcbiAgICAgIHZhciBtYXBQYXJhbSA9IHRoaXMucGFyYW1zTWFwLmdldChwYXJhbSk7XG4gICAgICB2YXIgbGlzdCA9IGlzUHJlc2VudChtYXBQYXJhbSkgPyBtYXBQYXJhbSA6IFtdO1xuICAgICAgTGlzdFdyYXBwZXIuY2xlYXIobGlzdCk7XG4gICAgICBsaXN0LnB1c2godmFsdWVbMF0pO1xuICAgICAgdGhpcy5wYXJhbXNNYXAuc2V0KHBhcmFtLCBsaXN0KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFwcGVuZChwYXJhbTogc3RyaW5nLCB2YWw6IHN0cmluZyk6IHZvaWQge1xuICAgIHZhciBtYXBQYXJhbSA9IHRoaXMucGFyYW1zTWFwLmdldChwYXJhbSk7XG4gICAgdmFyIGxpc3QgPSBpc1ByZXNlbnQobWFwUGFyYW0pID8gbWFwUGFyYW0gOiBbXTtcbiAgICBsaXN0LnB1c2godmFsKTtcbiAgICB0aGlzLnBhcmFtc01hcC5zZXQocGFyYW0sIGxpc3QpO1xuICB9XG5cbiAgLy8gQSBtZXJnZSBvcGVyYXRpb25cbiAgLy8gRm9yIGVhY2ggbmFtZS12YWx1ZXMgcGFpciBpbiBgc2VhcmNoUGFyYW1zYCwgcGVyZm9ybSBgYXBwZW5kKG5hbWUsIHZhbHVlKWBcbiAgLy8gZm9yIGVhY2ggdmFsdWUgaW4gYHZhbHVlc2AuXG4gIC8vXG4gIC8vIEUuZzogXCJhPVsxLDJdLCBjPVs4XVwiICsgXCJhPVszLDRdLCBiPVs3XVwiID0gXCJhPVsxLDIsMyw0XSwgYz1bOF0sIGI9WzddXCJcbiAgLy9cbiAgLy8gVE9ETyhAY2FpdHApOiBkb2N1bWVudCB0aGlzIGJldHRlclxuICBhcHBlbmRBbGwoc2VhcmNoUGFyYW1zOiBVUkxTZWFyY2hQYXJhbXMpIHtcbiAgICBzZWFyY2hQYXJhbXMucGFyYW1zTWFwLmZvckVhY2goKHZhbHVlLCBwYXJhbSkgPT4ge1xuICAgICAgdmFyIG1hcFBhcmFtID0gdGhpcy5wYXJhbXNNYXAuZ2V0KHBhcmFtKTtcbiAgICAgIHZhciBsaXN0ID0gaXNQcmVzZW50KG1hcFBhcmFtKSA/IG1hcFBhcmFtIDogW107XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGxpc3QucHVzaCh2YWx1ZVtpXSk7XG4gICAgICB9XG4gICAgICB0aGlzLnBhcmFtc01hcC5zZXQocGFyYW0sIGxpc3QpO1xuICAgIH0pO1xuICB9XG5cblxuICAvLyBBIG1lcmdlIG9wZXJhdGlvblxuICAvLyBGb3IgZWFjaCBuYW1lLXZhbHVlcyBwYWlyIGluIGBzZWFyY2hQYXJhbXNgLCBwZXJmb3JtIGBkZWxldGUobmFtZSlgLFxuICAvLyBmb2xsb3dlZCBieSBgc2V0KG5hbWUsIHZhbHVlcylgXG4gIC8vXG4gIC8vIEUuZzogXCJhPVsxLDIsM10sIGM9WzhdXCIgKyBcImE9WzQsNSw2XSwgYj1bN11cIiA9IFwiYT1bNCw1LDZdLCBjPVs4XSwgYj1bN11cIlxuICAvL1xuICAvLyBUT0RPKEBjYWl0cCk6IGRvY3VtZW50IHRoaXMgYmV0dGVyXG4gIHJlcGxhY2VBbGwoc2VhcmNoUGFyYW1zOiBVUkxTZWFyY2hQYXJhbXMpIHtcbiAgICBzZWFyY2hQYXJhbXMucGFyYW1zTWFwLmZvckVhY2goKHZhbHVlLCBwYXJhbSkgPT4ge1xuICAgICAgdmFyIG1hcFBhcmFtID0gdGhpcy5wYXJhbXNNYXAuZ2V0KHBhcmFtKTtcbiAgICAgIHZhciBsaXN0ID0gaXNQcmVzZW50KG1hcFBhcmFtKSA/IG1hcFBhcmFtIDogW107XG4gICAgICBMaXN0V3JhcHBlci5jbGVhcihsaXN0KTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgbGlzdC5wdXNoKHZhbHVlW2ldKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucGFyYW1zTWFwLnNldChwYXJhbSwgbGlzdCk7XG4gICAgfSk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHZhciBwYXJhbXNMaXN0ID0gW107XG4gICAgdGhpcy5wYXJhbXNNYXAuZm9yRWFjaCgodmFsdWVzLCBrKSA9PiB7IHZhbHVlcy5mb3JFYWNoKHYgPT4gcGFyYW1zTGlzdC5wdXNoKGsgKyAnPScgKyB2KSk7IH0pO1xuICAgIHJldHVybiBwYXJhbXNMaXN0LmpvaW4oJyYnKTtcbiAgfVxuXG4gIGRlbGV0ZSAocGFyYW06IHN0cmluZyk6IHZvaWQgeyB0aGlzLnBhcmFtc01hcC5kZWxldGUocGFyYW0pOyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvaHR0cC91cmxfc2VhcmNoX3BhcmFtcy50c1xuICoqLyIsImltcG9ydCB7Q29ubmVjdGlvbkJhY2tlbmQsIENvbm5lY3Rpb259IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHtSZWFkeVN0YXRlLCBSZXF1ZXN0TWV0aG9kLCBSZXNwb25zZVR5cGV9IGZyb20gJy4uL2VudW1zJztcbmltcG9ydCB7UmVxdWVzdH0gZnJvbSAnLi4vc3RhdGljX3JlcXVlc3QnO1xuaW1wb3J0IHtSZXNwb25zZX0gZnJvbSAnLi4vc3RhdGljX3Jlc3BvbnNlJztcbmltcG9ydCB7SGVhZGVyc30gZnJvbSAnLi4vaGVhZGVycyc7XG5pbXBvcnQge1Jlc3BvbnNlT3B0aW9ucywgQmFzZVJlc3BvbnNlT3B0aW9uc30gZnJvbSAnLi4vYmFzZV9yZXNwb25zZV9vcHRpb25zJztcbmltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5pbXBvcnQge0Jyb3dzZXJYaHJ9IGZyb20gJy4vYnJvd3Nlcl94aHInO1xuaW1wb3J0IHtpc1ByZXNlbnR9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge09ic2VydmFibGV9IGZyb20gJ3J4anMvT2JzZXJ2YWJsZSc7XG5pbXBvcnQge2lzU3VjY2VzcywgZ2V0UmVzcG9uc2VVUkx9IGZyb20gJy4uL2h0dHBfdXRpbHMnO1xuLyoqXG4qIENyZWF0ZXMgY29ubmVjdGlvbnMgdXNpbmcgYFhNTEh0dHBSZXF1ZXN0YC4gR2l2ZW4gYSBmdWxseS1xdWFsaWZpZWRcbiogcmVxdWVzdCwgYW4gYFhIUkNvbm5lY3Rpb25gIHdpbGwgaW1tZWRpYXRlbHkgY3JlYXRlIGFuIGBYTUxIdHRwUmVxdWVzdGAgb2JqZWN0IGFuZCBzZW5kIHRoZVxuKiByZXF1ZXN0LlxuKlxuKiBUaGlzIGNsYXNzIHdvdWxkIHR5cGljYWxseSBub3QgYmUgY3JlYXRlZCBvciBpbnRlcmFjdGVkIHdpdGggZGlyZWN0bHkgaW5zaWRlIGFwcGxpY2F0aW9ucywgdGhvdWdoXG4qIHRoZSB7QGxpbmsgTW9ja0Nvbm5lY3Rpb259IG1heSBiZSBpbnRlcmFjdGVkIHdpdGggaW4gdGVzdHMuXG4qL1xuZXhwb3J0IGNsYXNzIFhIUkNvbm5lY3Rpb24gaW1wbGVtZW50cyBDb25uZWN0aW9uIHtcbiAgcmVxdWVzdDogUmVxdWVzdDtcbiAgLyoqXG4gICAqIFJlc3BvbnNlIHtAbGluayBFdmVudEVtaXR0ZXJ9IHdoaWNoIGVtaXRzIGEgc2luZ2xlIHtAbGluayBSZXNwb25zZX0gdmFsdWUgb24gbG9hZCBldmVudCBvZlxuICAgKiBgWE1MSHR0cFJlcXVlc3RgLlxuICAgKi9cbiAgcmVzcG9uc2U6IE9ic2VydmFibGU8UmVzcG9uc2U+O1xuICByZWFkeVN0YXRlOiBSZWFkeVN0YXRlO1xuICBjb25zdHJ1Y3RvcihyZXE6IFJlcXVlc3QsIGJyb3dzZXJYSFI6IEJyb3dzZXJYaHIsIGJhc2VSZXNwb25zZU9wdGlvbnM/OiBSZXNwb25zZU9wdGlvbnMpIHtcbiAgICB0aGlzLnJlcXVlc3QgPSByZXE7XG4gICAgdGhpcy5yZXNwb25zZSA9IG5ldyBPYnNlcnZhYmxlKHJlc3BvbnNlT2JzZXJ2ZXIgPT4ge1xuICAgICAgbGV0IF94aHI6IFhNTEh0dHBSZXF1ZXN0ID0gYnJvd3NlclhIUi5idWlsZCgpO1xuICAgICAgX3hoci5vcGVuKFJlcXVlc3RNZXRob2RbcmVxLm1ldGhvZF0udG9VcHBlckNhc2UoKSwgcmVxLnVybCk7XG4gICAgICAvLyBsb2FkIGV2ZW50IGhhbmRsZXJcbiAgICAgIGxldCBvbkxvYWQgPSAoKSA9PiB7XG4gICAgICAgIC8vIHJlc3BvbnNlVGV4dCBpcyB0aGUgb2xkLXNjaG9vbCB3YXkgb2YgcmV0cmlldmluZyByZXNwb25zZSAoc3VwcG9ydGVkIGJ5IElFOCAmIDkpXG4gICAgICAgIC8vIHJlc3BvbnNlL3Jlc3BvbnNlVHlwZSBwcm9wZXJ0aWVzIHdlcmUgaW50cm9kdWNlZCBpbiBYSFIgTGV2ZWwyIHNwZWMgKHN1cHBvcnRlZCBieVxuICAgICAgICAvLyBJRTEwKVxuICAgICAgICBsZXQgYm9keSA9IGlzUHJlc2VudChfeGhyLnJlc3BvbnNlKSA/IF94aHIucmVzcG9uc2UgOiBfeGhyLnJlc3BvbnNlVGV4dDtcblxuICAgICAgICBsZXQgaGVhZGVycyA9IEhlYWRlcnMuZnJvbVJlc3BvbnNlSGVhZGVyU3RyaW5nKF94aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpO1xuXG4gICAgICAgIGxldCB1cmwgPSBnZXRSZXNwb25zZVVSTChfeGhyKTtcblxuICAgICAgICAvLyBub3JtYWxpemUgSUU5IGJ1ZyAoaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTQ1MClcbiAgICAgICAgbGV0IHN0YXR1czogbnVtYmVyID0gX3hoci5zdGF0dXMgPT09IDEyMjMgPyAyMDQgOiBfeGhyLnN0YXR1cztcblxuICAgICAgICAvLyBmaXggc3RhdHVzIGNvZGUgd2hlbiBpdCBpcyAwICgwIHN0YXR1cyBpcyB1bmRvY3VtZW50ZWQpLlxuICAgICAgICAvLyBPY2N1cnMgd2hlbiBhY2Nlc3NpbmcgZmlsZSByZXNvdXJjZXMgb3Igb24gQW5kcm9pZCA0LjEgc3RvY2sgYnJvd3NlclxuICAgICAgICAvLyB3aGlsZSByZXRyaWV2aW5nIGZpbGVzIGZyb20gYXBwbGljYXRpb24gY2FjaGUuXG4gICAgICAgIGlmIChzdGF0dXMgPT09IDApIHtcbiAgICAgICAgICBzdGF0dXMgPSBib2R5ID8gMjAwIDogMDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVzcG9uc2VPcHRpb25zID0gbmV3IFJlc3BvbnNlT3B0aW9ucyh7Ym9keSwgc3RhdHVzLCBoZWFkZXJzLCB1cmx9KTtcbiAgICAgICAgaWYgKGlzUHJlc2VudChiYXNlUmVzcG9uc2VPcHRpb25zKSkge1xuICAgICAgICAgIHJlc3BvbnNlT3B0aW9ucyA9IGJhc2VSZXNwb25zZU9wdGlvbnMubWVyZ2UocmVzcG9uc2VPcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UocmVzcG9uc2VPcHRpb25zKTtcbiAgICAgICAgaWYgKGlzU3VjY2VzcyhzdGF0dXMpKSB7XG4gICAgICAgICAgcmVzcG9uc2VPYnNlcnZlci5uZXh0KHJlc3BvbnNlKTtcbiAgICAgICAgICAvLyBUT0RPKGdkaTIyOTApOiBkZWZlciBjb21wbGV0ZSBpZiBhcnJheSBidWZmZXIgdW50aWwgZG9uZVxuICAgICAgICAgIHJlc3BvbnNlT2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVzcG9uc2VPYnNlcnZlci5lcnJvcihyZXNwb25zZSk7XG4gICAgICB9O1xuICAgICAgLy8gZXJyb3IgZXZlbnQgaGFuZGxlclxuICAgICAgbGV0IG9uRXJyb3IgPSAoZXJyKSA9PiB7XG4gICAgICAgIHZhciByZXNwb25zZU9wdGlvbnMgPSBuZXcgUmVzcG9uc2VPcHRpb25zKHtib2R5OiBlcnIsIHR5cGU6IFJlc3BvbnNlVHlwZS5FcnJvcn0pO1xuICAgICAgICBpZiAoaXNQcmVzZW50KGJhc2VSZXNwb25zZU9wdGlvbnMpKSB7XG4gICAgICAgICAgcmVzcG9uc2VPcHRpb25zID0gYmFzZVJlc3BvbnNlT3B0aW9ucy5tZXJnZShyZXNwb25zZU9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIHJlc3BvbnNlT2JzZXJ2ZXIuZXJyb3IobmV3IFJlc3BvbnNlKHJlc3BvbnNlT3B0aW9ucykpO1xuICAgICAgfTtcblxuICAgICAgaWYgKGlzUHJlc2VudChyZXEuaGVhZGVycykpIHtcbiAgICAgICAgcmVxLmhlYWRlcnMuZm9yRWFjaCgodmFsdWVzLCBuYW1lKSA9PiBfeGhyLnNldFJlcXVlc3RIZWFkZXIobmFtZSwgdmFsdWVzLmpvaW4oJywnKSkpO1xuICAgICAgfVxuXG4gICAgICBfeGhyLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBvbkxvYWQpO1xuICAgICAgX3hoci5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpO1xuXG4gICAgICBfeGhyLnNlbmQodGhpcy5yZXF1ZXN0LnRleHQoKSk7XG5cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIF94aHIucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZCcsIG9uTG9hZCk7XG4gICAgICAgIF94aHIucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgX3hoci5hYm9ydCgpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMge0BsaW5rIFhIUkNvbm5lY3Rpb259IGluc3RhbmNlcy5cbiAqXG4gKiBUaGlzIGNsYXNzIHdvdWxkIHR5cGljYWxseSBub3QgYmUgdXNlZCBieSBlbmQgdXNlcnMsIGJ1dCBjb3VsZCBiZVxuICogb3ZlcnJpZGRlbiBpZiBhIGRpZmZlcmVudCBiYWNrZW5kIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSB1c2VkLFxuICogc3VjaCBhcyBpbiBhIG5vZGUgYmFja2VuZC5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIGBgYFxuICogaW1wb3J0IHtIdHRwLCBNeU5vZGVCYWNrZW5kLCBIVFRQX1BST1ZJREVSUywgQmFzZVJlcXVlc3RPcHRpb25zfSBmcm9tICdhbmd1bGFyMi9odHRwJztcbiAqIEBDb21wb25lbnQoe1xuICogICB2aWV3UHJvdmlkZXJzOiBbXG4gKiAgICAgSFRUUF9QUk9WSURFUlMsXG4gKiAgICAgcHJvdmlkZShIdHRwLCB7dXNlRmFjdG9yeTogKGJhY2tlbmQsIG9wdGlvbnMpID0+IHtcbiAqICAgICAgIHJldHVybiBuZXcgSHR0cChiYWNrZW5kLCBvcHRpb25zKTtcbiAqICAgICB9LCBkZXBzOiBbTXlOb2RlQmFja2VuZCwgQmFzZVJlcXVlc3RPcHRpb25zXX0pXVxuICogfSlcbiAqIGNsYXNzIE15Q29tcG9uZW50IHtcbiAqICAgY29uc3RydWN0b3IoaHR0cDpIdHRwKSB7XG4gKiAgICAgaHR0cC5yZXF1ZXN0KCdwZW9wbGUuanNvbicpLnN1YnNjcmliZShyZXMgPT4gdGhpcy5wZW9wbGUgPSByZXMuanNvbigpKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICoqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFhIUkJhY2tlbmQgaW1wbGVtZW50cyBDb25uZWN0aW9uQmFja2VuZCB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Jyb3dzZXJYSFI6IEJyb3dzZXJYaHIsIHByaXZhdGUgX2Jhc2VSZXNwb25zZU9wdGlvbnM6IFJlc3BvbnNlT3B0aW9ucykge31cbiAgY3JlYXRlQ29ubmVjdGlvbihyZXF1ZXN0OiBSZXF1ZXN0KTogWEhSQ29ubmVjdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBYSFJDb25uZWN0aW9uKHJlcXVlc3QsIHRoaXMuX2Jyb3dzZXJYSFIsIHRoaXMuX2Jhc2VSZXNwb25zZU9wdGlvbnMpO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvaHR0cC9iYWNrZW5kcy94aHJfYmFja2VuZC50c1xuICoqLyIsImltcG9ydCB7UmVzcG9uc2VUeXBlfSBmcm9tICcuL2VudW1zJztcbmltcG9ydCB7Q09OU1RfRVhQUiwgaXNTdHJpbmcsIGlzUHJlc2VudCwgSnNvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbiwgV3JhcHBlZEV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7SGVhZGVyc30gZnJvbSAnLi9oZWFkZXJzJztcbmltcG9ydCB7UmVzcG9uc2VPcHRpb25zfSBmcm9tICcuL2Jhc2VfcmVzcG9uc2Vfb3B0aW9ucyc7XG5pbXBvcnQge2lzSnNPYmplY3R9IGZyb20gJy4vaHR0cF91dGlscyc7XG5cbi8qKlxuICogQ3JlYXRlcyBgUmVzcG9uc2VgIGluc3RhbmNlcyBmcm9tIHByb3ZpZGVkIHZhbHVlcy5cbiAqXG4gKiBUaG91Z2ggdGhpcyBvYmplY3QgaXNuJ3RcbiAqIHVzdWFsbHkgaW5zdGFudGlhdGVkIGJ5IGVuZC11c2VycywgaXQgaXMgdGhlIHByaW1hcnkgb2JqZWN0IGludGVyYWN0ZWQgd2l0aCB3aGVuIGl0IGNvbWVzIHRpbWUgdG9cbiAqIGFkZCBkYXRhIHRvIGEgdmlldy5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIGBgYFxuICogaHR0cC5yZXF1ZXN0KCdteS1mcmllbmRzLnR4dCcpLnN1YnNjcmliZShyZXNwb25zZSA9PiB0aGlzLmZyaWVuZHMgPSByZXNwb25zZS50ZXh0KCkpO1xuICogYGBgXG4gKlxuICogVGhlIFJlc3BvbnNlJ3MgaW50ZXJmYWNlIGlzIGluc3BpcmVkIGJ5IHRoZSBSZXNwb25zZSBjb25zdHJ1Y3RvciBkZWZpbmVkIGluIHRoZSBbRmV0Y2hcbiAqIFNwZWNdKGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNyZXNwb25zZS1jbGFzcyksIGJ1dCBpcyBjb25zaWRlcmVkIGEgc3RhdGljIHZhbHVlIHdob3NlIGJvZHlcbiAqIGNhbiBiZSBhY2Nlc3NlZCBtYW55IHRpbWVzLiBUaGVyZSBhcmUgb3RoZXIgZGlmZmVyZW5jZXMgaW4gdGhlIGltcGxlbWVudGF0aW9uLCBidXQgdGhpcyBpcyB0aGVcbiAqIG1vc3Qgc2lnbmlmaWNhbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXNwb25zZSB7XG4gIC8qKlxuICAgKiBPbmUgb2YgXCJiYXNpY1wiLCBcImNvcnNcIiwgXCJkZWZhdWx0XCIsIFwiZXJyb3IsIG9yIFwib3BhcXVlXCIuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIFwiZGVmYXVsdFwiLlxuICAgKi9cbiAgdHlwZTogUmVzcG9uc2VUeXBlO1xuICAvKipcbiAgICogVHJ1ZSBpZiB0aGUgcmVzcG9uc2UncyBzdGF0dXMgaXMgd2l0aGluIDIwMC0yOTlcbiAgICovXG4gIG9rOiBib29sZWFuO1xuICAvKipcbiAgICogVVJMIG9mIHJlc3BvbnNlLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmcuXG4gICAqL1xuICB1cmw6IHN0cmluZztcbiAgLyoqXG4gICAqIFN0YXR1cyBjb2RlIHJldHVybmVkIGJ5IHNlcnZlci5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gMjAwLlxuICAgKi9cbiAgc3RhdHVzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUZXh0IHJlcHJlc2VudGluZyB0aGUgY29ycmVzcG9uZGluZyByZWFzb24gcGhyYXNlIHRvIHRoZSBgc3RhdHVzYCwgYXMgZGVmaW5lZCBpbiBbaWV0ZiByZmMgMjYxNlxuICAgKiBzZWN0aW9uIDYuMS4xXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjYxNiNzZWN0aW9uLTYuMS4xKVxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBcIk9LXCJcbiAgICovXG4gIHN0YXR1c1RleHQ6IHN0cmluZztcbiAgLyoqXG4gICAqIE5vbi1zdGFuZGFyZCBwcm9wZXJ0eVxuICAgKlxuICAgKiBEZW5vdGVzIGhvdyBtYW55IG9mIHRoZSByZXNwb25zZSBib2R5J3MgYnl0ZXMgaGF2ZSBiZWVuIGxvYWRlZCwgZm9yIGV4YW1wbGUgaWYgdGhlIHJlc3BvbnNlIGlzXG4gICAqIHRoZSByZXN1bHQgb2YgYSBwcm9ncmVzcyBldmVudC5cbiAgICovXG4gIGJ5dGVzTG9hZGVkOiBudW1iZXI7XG4gIC8qKlxuICAgKiBOb24tc3RhbmRhcmQgcHJvcGVydHlcbiAgICpcbiAgICogRGVub3RlcyBob3cgbWFueSBieXRlcyBhcmUgZXhwZWN0ZWQgaW4gdGhlIGZpbmFsIHJlc3BvbnNlIGJvZHkuXG4gICAqL1xuICB0b3RhbEJ5dGVzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBIZWFkZXJzIG9iamVjdCBiYXNlZCBvbiB0aGUgYEhlYWRlcnNgIGNsYXNzIGluIHRoZSBbRmV0Y2hcbiAgICogU3BlY10oaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2hlYWRlcnMtY2xhc3MpLlxuICAgKi9cbiAgaGVhZGVyczogSGVhZGVycztcbiAgLy8gVE9ETzogU3VwcG9ydCBBcnJheUJ1ZmZlciwgSlNPTiwgRm9ybURhdGEsIEJsb2JcbiAgcHJpdmF0ZSBfYm9keTogc3RyaW5nIHwgT2JqZWN0O1xuICBjb25zdHJ1Y3RvcihyZXNwb25zZU9wdGlvbnM6IFJlc3BvbnNlT3B0aW9ucykge1xuICAgIHRoaXMuX2JvZHkgPSByZXNwb25zZU9wdGlvbnMuYm9keTtcbiAgICB0aGlzLnN0YXR1cyA9IHJlc3BvbnNlT3B0aW9ucy5zdGF0dXM7XG4gICAgdGhpcy5zdGF0dXNUZXh0ID0gcmVzcG9uc2VPcHRpb25zLnN0YXR1c1RleHQ7XG4gICAgdGhpcy5oZWFkZXJzID0gcmVzcG9uc2VPcHRpb25zLmhlYWRlcnM7XG4gICAgdGhpcy50eXBlID0gcmVzcG9uc2VPcHRpb25zLnR5cGU7XG4gICAgdGhpcy51cmwgPSByZXNwb25zZU9wdGlvbnMudXJsO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vdCB5ZXQgaW1wbGVtZW50ZWRcbiAgICovXG4gIC8vIFRPRE86IEJsb2IgcmV0dXJuIHR5cGVcbiAgYmxvYigpOiBhbnkgeyB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignXCJibG9iKClcIiBtZXRob2Qgbm90IGltcGxlbWVudGVkIG9uIFJlc3BvbnNlIHN1cGVyY2xhc3MnKTsgfVxuXG4gIC8qKlxuICAgKiBBdHRlbXB0cyB0byByZXR1cm4gYm9keSBhcyBwYXJzZWQgYEpTT05gIG9iamVjdCwgb3IgcmFpc2VzIGFuIGV4Y2VwdGlvbi5cbiAgICovXG4gIGpzb24oKTogYW55IHtcbiAgICB2YXIganNvblJlc3BvbnNlO1xuICAgIGlmIChpc0pzT2JqZWN0KHRoaXMuX2JvZHkpKSB7XG4gICAgICBqc29uUmVzcG9uc2UgPSB0aGlzLl9ib2R5O1xuICAgIH0gZWxzZSBpZiAoaXNTdHJpbmcodGhpcy5fYm9keSkpIHtcbiAgICAgIGpzb25SZXNwb25zZSA9IEpzb24ucGFyc2UoPHN0cmluZz50aGlzLl9ib2R5KTtcbiAgICB9XG4gICAgcmV0dXJuIGpzb25SZXNwb25zZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBib2R5IGFzIGEgc3RyaW5nLCBwcmVzdW1pbmcgYHRvU3RyaW5nKClgIGNhbiBiZSBjYWxsZWQgb24gdGhlIHJlc3BvbnNlIGJvZHkuXG4gICAqL1xuICB0ZXh0KCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9ib2R5LnRvU3RyaW5nKCk7IH1cblxuICAvKipcbiAgICogTm90IHlldCBpbXBsZW1lbnRlZFxuICAgKi9cbiAgLy8gVE9ETzogQXJyYXlCdWZmZXIgcmV0dXJuIHR5cGVcbiAgYXJyYXlCdWZmZXIoKTogYW55IHtcbiAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignXCJhcnJheUJ1ZmZlcigpXCIgbWV0aG9kIG5vdCBpbXBsZW1lbnRlZCBvbiBSZXNwb25zZSBzdXBlcmNsYXNzJyk7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9odHRwL3N0YXRpY19yZXNwb25zZS50c1xuICoqLyIsImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5pbXBvcnQge2lzUHJlc2VudCwgaXNKc09iamVjdH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7SGVhZGVyc30gZnJvbSAnLi9oZWFkZXJzJztcbmltcG9ydCB7UmVzcG9uc2VUeXBlfSBmcm9tICcuL2VudW1zJztcbmltcG9ydCB7UmVzcG9uc2VPcHRpb25zQXJnc30gZnJvbSAnLi9pbnRlcmZhY2VzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgcmVzcG9uc2Ugb3B0aW9ucyBvYmplY3QgdG8gYmUgb3B0aW9uYWxseSBwcm92aWRlZCB3aGVuIGluc3RhbnRpYXRpbmcgYVxuICoge0BsaW5rIFJlc3BvbnNlfS5cbiAqXG4gKiBUaGlzIGNsYXNzIGlzIGJhc2VkIG9uIHRoZSBgUmVzcG9uc2VJbml0YCBkZXNjcmlwdGlvbiBpbiB0aGUgW0ZldGNoXG4gKiBTcGVjXShodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jcmVzcG9uc2Vpbml0KS5cbiAqXG4gKiBBbGwgdmFsdWVzIGFyZSBudWxsIGJ5IGRlZmF1bHQuIFR5cGljYWwgZGVmYXVsdHMgY2FuIGJlIGZvdW5kIGluIHRoZVxuICoge0BsaW5rIEJhc2VSZXNwb25zZU9wdGlvbnN9IGNsYXNzLCB3aGljaCBzdWItY2xhc3NlcyBgUmVzcG9uc2VPcHRpb25zYC5cbiAqXG4gKiBUaGlzIGNsYXNzIG1heSBiZSB1c2VkIGluIHRlc3RzIHRvIGJ1aWxkIHtAbGluayBSZXNwb25zZSBSZXNwb25zZXN9IGZvclxuICogbW9jayByZXNwb25zZXMgKHNlZSB7QGxpbmsgTW9ja0JhY2tlbmR9KS5cbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvUDlKa2s4ZThjejZOVnpiY3hFc0Q/cD1wcmV2aWV3KSlcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQge1Jlc3BvbnNlT3B0aW9ucywgUmVzcG9uc2V9IGZyb20gJ2FuZ3VsYXIyL2h0dHAnO1xuICpcbiAqIHZhciBvcHRpb25zID0gbmV3IFJlc3BvbnNlT3B0aW9ucyh7XG4gKiAgIGJvZHk6ICd7XCJuYW1lXCI6XCJKZWZmXCJ9J1xuICogfSk7XG4gKiB2YXIgcmVzID0gbmV3IFJlc3BvbnNlKG9wdGlvbnMpO1xuICpcbiAqIGNvbnNvbGUubG9nKCdyZXMuanNvbigpOicsIHJlcy5qc29uKCkpOyAvLyBPYmplY3Qge25hbWU6IFwiSmVmZlwifVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXNwb25zZU9wdGlvbnMge1xuICAvLyBUT0RPOiBBcnJheUJ1ZmZlciB8IEZvcm1EYXRhIHwgQmxvYlxuICAvKipcbiAgICogU3RyaW5nIG9yIE9iamVjdCByZXByZXNlbnRpbmcgdGhlIGJvZHkgb2YgdGhlIHtAbGluayBSZXNwb25zZX0uXG4gICAqL1xuICBib2R5OiBzdHJpbmcgfCBPYmplY3Q7XG4gIC8qKlxuICAgKiBIdHRwIHtAbGluayBodHRwOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzEwLmh0bWwgc3RhdHVzIGNvZGV9XG4gICAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzcG9uc2UuXG4gICAqL1xuICBzdGF0dXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFJlc3BvbnNlIHtAbGluayBIZWFkZXJzIGhlYWRlcnN9XG4gICAqL1xuICBoZWFkZXJzOiBIZWFkZXJzO1xuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBzdGF0dXNUZXh0OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHR5cGU6IFJlc3BvbnNlVHlwZTtcbiAgdXJsOiBzdHJpbmc7XG4gIGNvbnN0cnVjdG9yKHtib2R5LCBzdGF0dXMsIGhlYWRlcnMsIHN0YXR1c1RleHQsIHR5cGUsIHVybH06IFJlc3BvbnNlT3B0aW9uc0FyZ3MgPSB7fSkge1xuICAgIHRoaXMuYm9keSA9IGlzUHJlc2VudChib2R5KSA/IGJvZHkgOiBudWxsO1xuICAgIHRoaXMuc3RhdHVzID0gaXNQcmVzZW50KHN0YXR1cykgPyBzdGF0dXMgOiBudWxsO1xuICAgIHRoaXMuaGVhZGVycyA9IGlzUHJlc2VudChoZWFkZXJzKSA/IGhlYWRlcnMgOiBudWxsO1xuICAgIHRoaXMuc3RhdHVzVGV4dCA9IGlzUHJlc2VudChzdGF0dXNUZXh0KSA/IHN0YXR1c1RleHQgOiBudWxsO1xuICAgIHRoaXMudHlwZSA9IGlzUHJlc2VudCh0eXBlKSA/IHR5cGUgOiBudWxsO1xuICAgIHRoaXMudXJsID0gaXNQcmVzZW50KHVybCkgPyB1cmwgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjb3B5IG9mIHRoZSBgUmVzcG9uc2VPcHRpb25zYCBpbnN0YW5jZSwgdXNpbmcgdGhlIG9wdGlvbmFsIGlucHV0IGFzIHZhbHVlcyB0b1xuICAgKiBvdmVycmlkZVxuICAgKiBleGlzdGluZyB2YWx1ZXMuIFRoaXMgbWV0aG9kIHdpbGwgbm90IGNoYW5nZSB0aGUgdmFsdWVzIG9mIHRoZSBpbnN0YW5jZSBvbiB3aGljaCBpdCBpcyBiZWluZ1xuICAgKiBjYWxsZWQuXG4gICAqXG4gICAqIFRoaXMgbWF5IGJlIHVzZWZ1bCB3aGVuIHNoYXJpbmcgYSBiYXNlIGBSZXNwb25zZU9wdGlvbnNgIG9iamVjdCBpbnNpZGUgdGVzdHMsXG4gICAqIHdoZXJlIGNlcnRhaW4gcHJvcGVydGllcyBtYXkgY2hhbmdlIGZyb20gdGVzdCB0byB0ZXN0LlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvMWxYcXVxRmZnZHVURkJXak5vUkU/cD1wcmV2aWV3KSlcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBpbXBvcnQge1Jlc3BvbnNlT3B0aW9ucywgUmVzcG9uc2V9IGZyb20gJ2FuZ3VsYXIyL2h0dHAnO1xuICAgKlxuICAgKiB2YXIgb3B0aW9ucyA9IG5ldyBSZXNwb25zZU9wdGlvbnMoe1xuICAgKiAgIGJvZHk6IHtuYW1lOiAnSmVmZid9XG4gICAqIH0pO1xuICAgKiB2YXIgcmVzID0gbmV3IFJlc3BvbnNlKG9wdGlvbnMubWVyZ2Uoe1xuICAgKiAgIHVybDogJ2h0dHBzOi8vZ29vZ2xlLmNvbSdcbiAgICogfSkpO1xuICAgKiBjb25zb2xlLmxvZygnb3B0aW9ucy51cmw6Jywgb3B0aW9ucy51cmwpOyAvLyBudWxsXG4gICAqIGNvbnNvbGUubG9nKCdyZXMuanNvbigpOicsIHJlcy5qc29uKCkpOyAvLyBPYmplY3Qge25hbWU6IFwiSmVmZlwifVxuICAgKiBjb25zb2xlLmxvZygncmVzLnVybDonLCByZXMudXJsKTsgLy8gaHR0cHM6Ly9nb29nbGUuY29tXG4gICAqIGBgYFxuICAgKi9cbiAgbWVyZ2Uob3B0aW9ucz86IFJlc3BvbnNlT3B0aW9uc0FyZ3MpOiBSZXNwb25zZU9wdGlvbnMge1xuICAgIHJldHVybiBuZXcgUmVzcG9uc2VPcHRpb25zKHtcbiAgICAgIGJvZHk6IGlzUHJlc2VudChvcHRpb25zKSAmJiBpc1ByZXNlbnQob3B0aW9ucy5ib2R5KSA/IG9wdGlvbnMuYm9keSA6IHRoaXMuYm9keSxcbiAgICAgIHN0YXR1czogaXNQcmVzZW50KG9wdGlvbnMpICYmIGlzUHJlc2VudChvcHRpb25zLnN0YXR1cykgPyBvcHRpb25zLnN0YXR1cyA6IHRoaXMuc3RhdHVzLFxuICAgICAgaGVhZGVyczogaXNQcmVzZW50KG9wdGlvbnMpICYmIGlzUHJlc2VudChvcHRpb25zLmhlYWRlcnMpID8gb3B0aW9ucy5oZWFkZXJzIDogdGhpcy5oZWFkZXJzLFxuICAgICAgc3RhdHVzVGV4dDogaXNQcmVzZW50KG9wdGlvbnMpICYmIGlzUHJlc2VudChvcHRpb25zLnN0YXR1c1RleHQpID8gb3B0aW9ucy5zdGF0dXNUZXh0IDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzVGV4dCxcbiAgICAgIHR5cGU6IGlzUHJlc2VudChvcHRpb25zKSAmJiBpc1ByZXNlbnQob3B0aW9ucy50eXBlKSA/IG9wdGlvbnMudHlwZSA6IHRoaXMudHlwZSxcbiAgICAgIHVybDogaXNQcmVzZW50KG9wdGlvbnMpICYmIGlzUHJlc2VudChvcHRpb25zLnVybCkgPyBvcHRpb25zLnVybCA6IHRoaXMudXJsLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogU3ViY2xhc3Mgb2Yge0BsaW5rIFJlc3BvbnNlT3B0aW9uc30sIHdpdGggZGVmYXVsdCB2YWx1ZXMuXG4gKlxuICogRGVmYXVsdCB2YWx1ZXM6XG4gKiAgKiBzdGF0dXM6IDIwMFxuICogICogaGVhZGVyczogZW1wdHkge0BsaW5rIEhlYWRlcnN9IG9iamVjdFxuICpcbiAqIFRoaXMgY2xhc3MgY291bGQgYmUgZXh0ZW5kZWQgYW5kIGJvdW5kIHRvIHRoZSB7QGxpbmsgUmVzcG9uc2VPcHRpb25zfSBjbGFzc1xuICogd2hlbiBjb25maWd1cmluZyBhbiB7QGxpbmsgSW5qZWN0b3J9LCBpbiBvcmRlciB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBvcHRpb25zXG4gKiB1c2VkIGJ5IHtAbGluayBIdHRwfSB0byBjcmVhdGUge0BsaW5rIFJlc3BvbnNlIFJlc3BvbnNlc30uXG4gKlxuICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L3F2OERMVD9wPXByZXZpZXcpKVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7cHJvdmlkZX0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG4gKiBpbXBvcnQge2Jvb3RzdHJhcH0gZnJvbSAnYW5ndWxhcjIvcGxhdGZvcm0vYnJvd3Nlcic7XG4gKiBpbXBvcnQge0hUVFBfUFJPVklERVJTLCBIZWFkZXJzLCBIdHRwLCBCYXNlUmVzcG9uc2VPcHRpb25zLCBSZXNwb25zZU9wdGlvbnN9IGZyb21cbiAqICdhbmd1bGFyMi9odHRwJztcbiAqIGltcG9ydCB7QXBwfSBmcm9tICcuL215YXBwJztcbiAqXG4gKiBjbGFzcyBNeU9wdGlvbnMgZXh0ZW5kcyBCYXNlUmVzcG9uc2VPcHRpb25zIHtcbiAqICAgaGVhZGVyczpIZWFkZXJzID0gbmV3IEhlYWRlcnMoe25ldHdvcms6ICdnaXRodWInfSk7XG4gKiB9XG4gKlxuICogYm9vdHN0cmFwKEFwcCwgW0hUVFBfUFJPVklERVJTLCBwcm92aWRlKFJlc3BvbnNlT3B0aW9ucywge3VzZUNsYXNzOiBNeU9wdGlvbnN9KV0pO1xuICogYGBgXG4gKlxuICogVGhlIG9wdGlvbnMgY291bGQgYWxzbyBiZSBleHRlbmRlZCB3aGVuIG1hbnVhbGx5IGNyZWF0aW5nIGEge0BsaW5rIFJlc3BvbnNlfVxuICogb2JqZWN0LlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9Wbmdvc09XaWFFeEV0YnN0RG9peD9wPXByZXZpZXcpKVxuICpcbiAqIGBgYFxuICogaW1wb3J0IHtCYXNlUmVzcG9uc2VPcHRpb25zLCBSZXNwb25zZX0gZnJvbSAnYW5ndWxhcjIvaHR0cCc7XG4gKlxuICogdmFyIG9wdGlvbnMgPSBuZXcgQmFzZVJlc3BvbnNlT3B0aW9ucygpO1xuICogdmFyIHJlcyA9IG5ldyBSZXNwb25zZShvcHRpb25zLm1lcmdlKHtcbiAqICAgYm9keTogJ0FuZ3VsYXIyJyxcbiAqICAgaGVhZGVyczogbmV3IEhlYWRlcnMoe2ZyYW1ld29yazogJ2FuZ3VsYXInfSlcbiAqIH0pKTtcbiAqIGNvbnNvbGUubG9nKCdyZXMuaGVhZGVycy5nZXQoXCJmcmFtZXdvcmtcIik6JywgcmVzLmhlYWRlcnMuZ2V0KCdmcmFtZXdvcmsnKSk7IC8vIGFuZ3VsYXJcbiAqIGNvbnNvbGUubG9nKCdyZXMudGV4dCgpOicsIHJlcy50ZXh0KCkpOyAvLyBBbmd1bGFyMjtcbiAqIGBgYFxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQmFzZVJlc3BvbnNlT3B0aW9ucyBleHRlbmRzIFJlc3BvbnNlT3B0aW9ucyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHtzdGF0dXM6IDIwMCwgc3RhdHVzVGV4dDogJ09rJywgdHlwZTogUmVzcG9uc2VUeXBlLkRlZmF1bHQsIGhlYWRlcnM6IG5ldyBIZWFkZXJzKCl9KTtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2h0dHAvYmFzZV9yZXNwb25zZV9vcHRpb25zLnRzXG4gKiovIiwiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdhbmd1bGFyMi9jb3JlJztcblxuLyoqXG4gKiBBIGJhY2tlbmQgZm9yIGh0dHAgdGhhdCB1c2VzIHRoZSBgWE1MSHR0cFJlcXVlc3RgIGJyb3dzZXIgQVBJLlxuICpcbiAqIFRha2UgY2FyZSBub3QgdG8gZXZhbHVhdGUgdGhpcyBpbiBub24tYnJvd3NlciBjb250ZXh0cy5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEJyb3dzZXJYaHIge1xuICBjb25zdHJ1Y3RvcigpIHt9XG4gIGJ1aWxkKCk6IGFueSB7IHJldHVybiA8YW55PihuZXcgWE1MSHR0cFJlcXVlc3QoKSk7IH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9odHRwL2JhY2tlbmRzL2Jyb3dzZXJfeGhyLnRzXG4gKiovIiwiaW1wb3J0IHtDb25uZWN0aW9uQmFja2VuZCwgQ29ubmVjdGlvbn0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQge1JlYWR5U3RhdGUsIFJlcXVlc3RNZXRob2QsIFJlc3BvbnNlVHlwZX0gZnJvbSAnLi4vZW51bXMnO1xuaW1wb3J0IHtSZXF1ZXN0fSBmcm9tICcuLi9zdGF0aWNfcmVxdWVzdCc7XG5pbXBvcnQge1Jlc3BvbnNlfSBmcm9tICcuLi9zdGF0aWNfcmVzcG9uc2UnO1xuaW1wb3J0IHtSZXNwb25zZU9wdGlvbnMsIEJhc2VSZXNwb25zZU9wdGlvbnN9IGZyb20gJy4uL2Jhc2VfcmVzcG9uc2Vfb3B0aW9ucyc7XG5pbXBvcnQge0luamVjdGFibGV9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuaW1wb3J0IHtCcm93c2VySnNvbnB9IGZyb20gJy4vYnJvd3Nlcl9qc29ucCc7XG5pbXBvcnQge21ha2VUeXBlRXJyb3J9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9ucyc7XG5pbXBvcnQge1N0cmluZ1dyYXBwZXIsIGlzUHJlc2VudH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSAncnhqcy9PYnNlcnZhYmxlJztcblxuY29uc3QgSlNPTlBfRVJSX05PX0NBTExCQUNLID0gJ0pTT05QIGluamVjdGVkIHNjcmlwdCBkaWQgbm90IGludm9rZSBjYWxsYmFjay4nO1xuY29uc3QgSlNPTlBfRVJSX1dST05HX01FVEhPRCA9ICdKU09OUCByZXF1ZXN0cyBtdXN0IHVzZSBHRVQgcmVxdWVzdCBtZXRob2QuJztcblxuLyoqXG4gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhbiBpbi1mbGlnaHQgSlNPTlAgcmVxdWVzdC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEpTT05QQ29ubmVjdGlvbiBpbXBsZW1lbnRzIENvbm5lY3Rpb24ge1xuICAvKipcbiAgICogVGhlIHtAbGluayBSZWFkeVN0YXRlfSBvZiB0aGlzIHJlcXVlc3QuXG4gICAqL1xuICByZWFkeVN0YXRlOiBSZWFkeVN0YXRlO1xuXG4gIC8qKlxuICAgKiBUaGUgb3V0Z29pbmcgSFRUUCByZXF1ZXN0LlxuICAgKi9cbiAgcmVxdWVzdDogUmVxdWVzdDtcblxuICAvKipcbiAgICogQW4gb2JzZXJ2YWJsZSB0aGF0IGNvbXBsZXRlcyB3aXRoIHRoZSByZXNwb25zZSwgd2hlbiB0aGUgcmVxdWVzdCBpcyBmaW5pc2hlZC5cbiAgICovXG4gIHJlc3BvbnNlOiBPYnNlcnZhYmxlPFJlc3BvbnNlPjtcblxuICAvKipcbiAgICogQ2FsbGJhY2sgY2FsbGVkIHdoZW4gdGhlIEpTT05QIHJlcXVlc3QgY29tcGxldGVzLCB0byBub3RpZnkgdGhlIGFwcGxpY2F0aW9uXG4gICAqIG9mIHRoZSBuZXcgZGF0YS5cbiAgICovXG4gIGFic3RyYWN0IGZpbmlzaGVkKGRhdGE/OiBhbnkpOiB2b2lkO1xufVxuXG5leHBvcnQgY2xhc3MgSlNPTlBDb25uZWN0aW9uXyBleHRlbmRzIEpTT05QQ29ubmVjdGlvbiB7XG4gIHByaXZhdGUgX2lkOiBzdHJpbmc7XG4gIHByaXZhdGUgX3NjcmlwdDogRWxlbWVudDtcbiAgcHJpdmF0ZSBfcmVzcG9uc2VEYXRhOiBhbnk7XG4gIHByaXZhdGUgX2ZpbmlzaGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocmVxOiBSZXF1ZXN0LCBwcml2YXRlIF9kb206IEJyb3dzZXJKc29ucCxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBiYXNlUmVzcG9uc2VPcHRpb25zPzogUmVzcG9uc2VPcHRpb25zKSB7XG4gICAgc3VwZXIoKTtcbiAgICBpZiAocmVxLm1ldGhvZCAhPT0gUmVxdWVzdE1ldGhvZC5HZXQpIHtcbiAgICAgIHRocm93IG1ha2VUeXBlRXJyb3IoSlNPTlBfRVJSX1dST05HX01FVEhPRCk7XG4gICAgfVxuICAgIHRoaXMucmVxdWVzdCA9IHJlcTtcbiAgICB0aGlzLnJlc3BvbnNlID0gbmV3IE9ic2VydmFibGUocmVzcG9uc2VPYnNlcnZlciA9PiB7XG5cbiAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IFJlYWR5U3RhdGUuTG9hZGluZztcbiAgICAgIGxldCBpZCA9IHRoaXMuX2lkID0gX2RvbS5uZXh0UmVxdWVzdElEKCk7XG5cbiAgICAgIF9kb20uZXhwb3NlQ29ubmVjdGlvbihpZCwgdGhpcyk7XG5cbiAgICAgIC8vIFdvcmthcm91bmQgRGFydFxuICAgICAgLy8gdXJsID0gdXJsLnJlcGxhY2UoLz1KU09OUF9DQUxMQkFDSygmfCQpLywgYGdlbmVyYXRlZCBtZXRob2RgKTtcbiAgICAgIGxldCBjYWxsYmFjayA9IF9kb20ucmVxdWVzdENhbGxiYWNrKHRoaXMuX2lkKTtcbiAgICAgIGxldCB1cmw6IHN0cmluZyA9IHJlcS51cmw7XG4gICAgICBpZiAodXJsLmluZGV4T2YoJz1KU09OUF9DQUxMQkFDSyYnKSA+IC0xKSB7XG4gICAgICAgIHVybCA9IFN0cmluZ1dyYXBwZXIucmVwbGFjZSh1cmwsICc9SlNPTlBfQ0FMTEJBQ0smJywgYD0ke2NhbGxiYWNrfSZgKTtcbiAgICAgIH0gZWxzZSBpZiAodXJsLmxhc3RJbmRleE9mKCc9SlNPTlBfQ0FMTEJBQ0snKSA9PT0gdXJsLmxlbmd0aCAtICc9SlNPTlBfQ0FMTEJBQ0snLmxlbmd0aCkge1xuICAgICAgICB1cmwgPSB1cmwuc3Vic3RyaW5nKDAsIHVybC5sZW5ndGggLSAnPUpTT05QX0NBTExCQUNLJy5sZW5ndGgpICsgYD0ke2NhbGxiYWNrfWA7XG4gICAgICB9XG5cbiAgICAgIGxldCBzY3JpcHQgPSB0aGlzLl9zY3JpcHQgPSBfZG9tLmJ1aWxkKHVybCk7XG5cbiAgICAgIGxldCBvbkxvYWQgPSBldmVudCA9PiB7XG4gICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IFJlYWR5U3RhdGUuQ2FuY2VsbGVkKSByZXR1cm47XG4gICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IFJlYWR5U3RhdGUuRG9uZTtcbiAgICAgICAgX2RvbS5jbGVhbnVwKHNjcmlwdCk7XG4gICAgICAgIGlmICghdGhpcy5fZmluaXNoZWQpIHtcbiAgICAgICAgICBsZXQgcmVzcG9uc2VPcHRpb25zID1cbiAgICAgICAgICAgICAgbmV3IFJlc3BvbnNlT3B0aW9ucyh7Ym9keTogSlNPTlBfRVJSX05PX0NBTExCQUNLLCB0eXBlOiBSZXNwb25zZVR5cGUuRXJyb3IsIHVybH0pO1xuICAgICAgICAgIGlmIChpc1ByZXNlbnQoYmFzZVJlc3BvbnNlT3B0aW9ucykpIHtcbiAgICAgICAgICAgIHJlc3BvbnNlT3B0aW9ucyA9IGJhc2VSZXNwb25zZU9wdGlvbnMubWVyZ2UocmVzcG9uc2VPcHRpb25zKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzcG9uc2VPYnNlcnZlci5lcnJvcihuZXcgUmVzcG9uc2UocmVzcG9uc2VPcHRpb25zKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlT3B0aW9ucyA9IG5ldyBSZXNwb25zZU9wdGlvbnMoe2JvZHk6IHRoaXMuX3Jlc3BvbnNlRGF0YSwgdXJsfSk7XG4gICAgICAgIGlmIChpc1ByZXNlbnQodGhpcy5iYXNlUmVzcG9uc2VPcHRpb25zKSkge1xuICAgICAgICAgIHJlc3BvbnNlT3B0aW9ucyA9IHRoaXMuYmFzZVJlc3BvbnNlT3B0aW9ucy5tZXJnZShyZXNwb25zZU9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzcG9uc2VPYnNlcnZlci5uZXh0KG5ldyBSZXNwb25zZShyZXNwb25zZU9wdGlvbnMpKTtcbiAgICAgICAgcmVzcG9uc2VPYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgfTtcblxuICAgICAgbGV0IG9uRXJyb3IgPSBlcnJvciA9PiB7XG4gICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IFJlYWR5U3RhdGUuQ2FuY2VsbGVkKSByZXR1cm47XG4gICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IFJlYWR5U3RhdGUuRG9uZTtcbiAgICAgICAgX2RvbS5jbGVhbnVwKHNjcmlwdCk7XG4gICAgICAgIGxldCByZXNwb25zZU9wdGlvbnMgPSBuZXcgUmVzcG9uc2VPcHRpb25zKHtib2R5OiBlcnJvci5tZXNzYWdlLCB0eXBlOiBSZXNwb25zZVR5cGUuRXJyb3J9KTtcbiAgICAgICAgaWYgKGlzUHJlc2VudChiYXNlUmVzcG9uc2VPcHRpb25zKSkge1xuICAgICAgICAgIHJlc3BvbnNlT3B0aW9ucyA9IGJhc2VSZXNwb25zZU9wdGlvbnMubWVyZ2UocmVzcG9uc2VPcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICByZXNwb25zZU9ic2VydmVyLmVycm9yKG5ldyBSZXNwb25zZShyZXNwb25zZU9wdGlvbnMpKTtcbiAgICAgIH07XG5cbiAgICAgIHNjcmlwdC5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgb25Mb2FkKTtcbiAgICAgIHNjcmlwdC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpO1xuXG4gICAgICBfZG9tLnNlbmQoc2NyaXB0KTtcblxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgdGhpcy5yZWFkeVN0YXRlID0gUmVhZHlTdGF0ZS5DYW5jZWxsZWQ7XG4gICAgICAgIHNjcmlwdC5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkJywgb25Mb2FkKTtcbiAgICAgICAgc2NyaXB0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgIGlmIChpc1ByZXNlbnQoc2NyaXB0KSkge1xuICAgICAgICAgIHRoaXMuX2RvbS5jbGVhbnVwKHNjcmlwdCk7XG4gICAgICAgIH1cblxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGZpbmlzaGVkKGRhdGE/OiBhbnkpIHtcbiAgICAvLyBEb24ndCBsZWFrIGNvbm5lY3Rpb25zXG4gICAgdGhpcy5fZmluaXNoZWQgPSB0cnVlO1xuICAgIHRoaXMuX2RvbS5yZW1vdmVDb25uZWN0aW9uKHRoaXMuX2lkKTtcbiAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09PSBSZWFkeVN0YXRlLkNhbmNlbGxlZCkgcmV0dXJuO1xuICAgIHRoaXMuX3Jlc3BvbnNlRGF0YSA9IGRhdGE7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHtAbGluayBDb25uZWN0aW9uQmFja2VuZH0gdGhhdCB1c2VzIHRoZSBKU09OUCBzdHJhdGVneSBvZiBtYWtpbmcgcmVxdWVzdHMuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBKU09OUEJhY2tlbmQgZXh0ZW5kcyBDb25uZWN0aW9uQmFja2VuZCB7fVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSlNPTlBCYWNrZW5kXyBleHRlbmRzIEpTT05QQmFja2VuZCB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Jyb3dzZXJKU09OUDogQnJvd3Nlckpzb25wLCBwcml2YXRlIF9iYXNlUmVzcG9uc2VPcHRpb25zOiBSZXNwb25zZU9wdGlvbnMpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgY3JlYXRlQ29ubmVjdGlvbihyZXF1ZXN0OiBSZXF1ZXN0KTogSlNPTlBDb25uZWN0aW9uIHtcbiAgICByZXR1cm4gbmV3IEpTT05QQ29ubmVjdGlvbl8ocmVxdWVzdCwgdGhpcy5fYnJvd3NlckpTT05QLCB0aGlzLl9iYXNlUmVzcG9uc2VPcHRpb25zKTtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2h0dHAvYmFja2VuZHMvanNvbnBfYmFja2VuZC50c1xuICoqLyIsImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5pbXBvcnQge2dsb2JhbH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxubGV0IF9uZXh0UmVxdWVzdElkID0gMDtcbmV4cG9ydCBjb25zdCBKU09OUF9IT01FID0gJ19fbmdfanNvbnBfXyc7XG52YXIgX2pzb25wQ29ubmVjdGlvbnMgPSBudWxsO1xuXG5mdW5jdGlvbiBfZ2V0SnNvbnBDb25uZWN0aW9ucygpOiB7W2tleTogc3RyaW5nXTogYW55fSB7XG4gIGlmIChfanNvbnBDb25uZWN0aW9ucyA9PT0gbnVsbCkge1xuICAgIF9qc29ucENvbm5lY3Rpb25zID0gZ2xvYmFsW0pTT05QX0hPTUVdID0ge307XG4gIH1cbiAgcmV0dXJuIF9qc29ucENvbm5lY3Rpb25zO1xufVxuXG4vLyBNYWtlIHN1cmUgbm90IHRvIGV2YWx1YXRlIHRoaXMgaW4gYSBub24tYnJvd3NlciBlbnZpcm9ubWVudCFcbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBCcm93c2VySnNvbnAge1xuICAvLyBDb25zdHJ1Y3QgYSA8c2NyaXB0PiBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCBVUkxcbiAgYnVpbGQodXJsOiBzdHJpbmcpOiBhbnkge1xuICAgIGxldCBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgbm9kZS5zcmMgPSB1cmw7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICBuZXh0UmVxdWVzdElEKCk6IHN0cmluZyB7IHJldHVybiBgX19yZXEke19uZXh0UmVxdWVzdElkKyt9YDsgfVxuXG4gIHJlcXVlc3RDYWxsYmFjayhpZDogc3RyaW5nKTogc3RyaW5nIHsgcmV0dXJuIGAke0pTT05QX0hPTUV9LiR7aWR9LmZpbmlzaGVkYDsgfVxuXG4gIGV4cG9zZUNvbm5lY3Rpb24oaWQ6IHN0cmluZywgY29ubmVjdGlvbjogYW55KSB7XG4gICAgbGV0IGNvbm5lY3Rpb25zID0gX2dldEpzb25wQ29ubmVjdGlvbnMoKTtcbiAgICBjb25uZWN0aW9uc1tpZF0gPSBjb25uZWN0aW9uO1xuICB9XG5cbiAgcmVtb3ZlQ29ubmVjdGlvbihpZDogc3RyaW5nKSB7XG4gICAgdmFyIGNvbm5lY3Rpb25zID0gX2dldEpzb25wQ29ubmVjdGlvbnMoKTtcbiAgICBjb25uZWN0aW9uc1tpZF0gPSBudWxsO1xuICB9XG5cbiAgLy8gQXR0YWNoIHRoZSA8c2NyaXB0PiBlbGVtZW50IHRvIHRoZSBET01cbiAgc2VuZChub2RlOiBhbnkpIHsgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCg8Tm9kZT4obm9kZSkpOyB9XG5cbiAgLy8gUmVtb3ZlIDxzY3JpcHQ+IGVsZW1lbnQgZnJvbSB0aGUgRE9NXG4gIGNsZWFudXAobm9kZTogYW55KSB7XG4gICAgaWYgKG5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKDxOb2RlPihub2RlKSk7XG4gICAgfVxuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvaHR0cC9iYWNrZW5kcy9icm93c2VyX2pzb25wLnRzXG4gKiovIiwiLyoqXG4gKiBAbW9kdWxlXG4gKiBAZGVzY3JpcHRpb25cbiAqIE1hcHMgYXBwbGljYXRpb24gVVJMcyBpbnRvIGFwcGxpY2F0aW9uIHN0YXRlcywgdG8gc3VwcG9ydCBkZWVwLWxpbmtpbmcgYW5kIG5hdmlnYXRpb24uXG4gKi9cblxuZXhwb3J0IHtSb3V0ZXJ9IGZyb20gJy4vc3JjL3JvdXRlci9yb3V0ZXInO1xuZXhwb3J0IHtSb3V0ZXJPdXRsZXR9IGZyb20gJy4vc3JjL3JvdXRlci9yb3V0ZXJfb3V0bGV0JztcbmV4cG9ydCB7Um91dGVyTGlua30gZnJvbSAnLi9zcmMvcm91dGVyL3JvdXRlcl9saW5rJztcbmV4cG9ydCB7Um91dGVQYXJhbXMsIFJvdXRlRGF0YX0gZnJvbSAnLi9zcmMvcm91dGVyL2luc3RydWN0aW9uJztcbmV4cG9ydCB7UGxhdGZvcm1Mb2NhdGlvbn0gZnJvbSAnLi9zcmMvcm91dGVyL3BsYXRmb3JtX2xvY2F0aW9uJztcbmV4cG9ydCB7Um91dGVSZWdpc3RyeSwgUk9VVEVSX1BSSU1BUllfQ09NUE9ORU5UfSBmcm9tICcuL3NyYy9yb3V0ZXIvcm91dGVfcmVnaXN0cnknO1xuZXhwb3J0IHtMb2NhdGlvblN0cmF0ZWd5LCBBUFBfQkFTRV9IUkVGfSBmcm9tICcuL3NyYy9yb3V0ZXIvbG9jYXRpb25fc3RyYXRlZ3knO1xuZXhwb3J0IHtIYXNoTG9jYXRpb25TdHJhdGVneX0gZnJvbSAnLi9zcmMvcm91dGVyL2hhc2hfbG9jYXRpb25fc3RyYXRlZ3knO1xuZXhwb3J0IHtQYXRoTG9jYXRpb25TdHJhdGVneX0gZnJvbSAnLi9zcmMvcm91dGVyL3BhdGhfbG9jYXRpb25fc3RyYXRlZ3knO1xuZXhwb3J0IHtMb2NhdGlvbn0gZnJvbSAnLi9zcmMvcm91dGVyL2xvY2F0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vc3JjL3JvdXRlci9yb3V0ZV9jb25maWdfZGVjb3JhdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vc3JjL3JvdXRlci9yb3V0ZV9kZWZpbml0aW9uJztcbmV4cG9ydCB7T25BY3RpdmF0ZSwgT25EZWFjdGl2YXRlLCBPblJldXNlLCBDYW5EZWFjdGl2YXRlLCBDYW5SZXVzZX0gZnJvbSAnLi9zcmMvcm91dGVyL2ludGVyZmFjZXMnO1xuZXhwb3J0IHtDYW5BY3RpdmF0ZX0gZnJvbSAnLi9zcmMvcm91dGVyL2xpZmVjeWNsZV9hbm5vdGF0aW9ucyc7XG5leHBvcnQge0luc3RydWN0aW9uLCBDb21wb25lbnRJbnN0cnVjdGlvbn0gZnJvbSAnLi9zcmMvcm91dGVyL2luc3RydWN0aW9uJztcbmV4cG9ydCB7T3BhcXVlVG9rZW59IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuXG5pbXBvcnQge1BsYXRmb3JtTG9jYXRpb259IGZyb20gJy4vc3JjL3JvdXRlci9wbGF0Zm9ybV9sb2NhdGlvbic7XG5pbXBvcnQge0xvY2F0aW9uU3RyYXRlZ3l9IGZyb20gJy4vc3JjL3JvdXRlci9sb2NhdGlvbl9zdHJhdGVneSc7XG5pbXBvcnQge1BhdGhMb2NhdGlvblN0cmF0ZWd5fSBmcm9tICcuL3NyYy9yb3V0ZXIvcGF0aF9sb2NhdGlvbl9zdHJhdGVneSc7XG5pbXBvcnQge1JvdXRlciwgUm9vdFJvdXRlcn0gZnJvbSAnLi9zcmMvcm91dGVyL3JvdXRlcic7XG5pbXBvcnQge1JvdXRlck91dGxldH0gZnJvbSAnLi9zcmMvcm91dGVyL3JvdXRlcl9vdXRsZXQnO1xuaW1wb3J0IHtSb3V0ZXJMaW5rfSBmcm9tICcuL3NyYy9yb3V0ZXIvcm91dGVyX2xpbmsnO1xuaW1wb3J0IHtSb3V0ZVJlZ2lzdHJ5LCBST1VURVJfUFJJTUFSWV9DT01QT05FTlR9IGZyb20gJy4vc3JjL3JvdXRlci9yb3V0ZV9yZWdpc3RyeSc7XG5pbXBvcnQge0xvY2F0aW9ufSBmcm9tICcuL3NyYy9yb3V0ZXIvbG9jYXRpb24nO1xuaW1wb3J0IHtBcHBsaWNhdGlvblJlZiwgcHJvdmlkZSwgT3BhcXVlVG9rZW4sIFByb3ZpZGVyfSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbmltcG9ydCB7Q09OU1RfRVhQUn0gZnJvbSAnLi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuXG4vKipcbiAqIEEgbGlzdCBvZiBkaXJlY3RpdmVzLiBUbyB1c2UgdGhlIHJvdXRlciBkaXJlY3RpdmVzIGxpa2Uge0BsaW5rIFJvdXRlck91dGxldH0gYW5kXG4gKiB7QGxpbmsgUm91dGVyTGlua30sIGFkZCB0aGlzIHRvIHlvdXIgYGRpcmVjdGl2ZXNgIGFycmF5IGluIHRoZSB7QGxpbmsgVmlld30gZGVjb3JhdG9yIG9mIHlvdXJcbiAqIGNvbXBvbmVudC5cbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvaVJVUDhCNU9VYnhDV1EzQWNJRG0pKVxuICpcbiAqIGBgYFxuICogaW1wb3J0IHtDb21wb25lbnR9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuICogaW1wb3J0IHtST1VURVJfRElSRUNUSVZFUywgUk9VVEVSX1BST1ZJREVSUywgUm91dGVDb25maWd9IGZyb20gJ2FuZ3VsYXIyL3JvdXRlcic7XG4gKlxuICogQENvbXBvbmVudCh7ZGlyZWN0aXZlczogW1JPVVRFUl9ESVJFQ1RJVkVTXX0pXG4gKiBAUm91dGVDb25maWcoW1xuICogIHsuLi59LFxuICogXSlcbiAqIGNsYXNzIEFwcENtcCB7XG4gKiAgICAvLyAuLi5cbiAqIH1cbiAqXG4gKiBib290c3RyYXAoQXBwQ21wLCBbUk9VVEVSX1BST1ZJREVSU10pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBST1VURVJfRElSRUNUSVZFUzogYW55W10gPSBDT05TVF9FWFBSKFtSb3V0ZXJPdXRsZXQsIFJvdXRlckxpbmtdKTtcblxuLyoqXG4gKiBBIGxpc3Qgb2Yge0BsaW5rIFByb3ZpZGVyfXMuIFRvIHVzZSB0aGUgcm91dGVyLCB5b3UgbXVzdCBhZGQgdGhpcyB0byB5b3VyIGFwcGxpY2F0aW9uLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9pUlVQOEI1T1VieENXUTNBY0lEbSkpXG4gKlxuICogYGBgXG4gKiBpbXBvcnQge0NvbXBvbmVudH0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG4gKiBpbXBvcnQge1xuICogICBST1VURVJfRElSRUNUSVZFUyxcbiAqICAgUk9VVEVSX1BST1ZJREVSUyxcbiAqICAgUm91dGVDb25maWdcbiAqIH0gZnJvbSAnYW5ndWxhcjIvcm91dGVyJztcbiAqXG4gKiBAQ29tcG9uZW50KHtkaXJlY3RpdmVzOiBbUk9VVEVSX0RJUkVDVElWRVNdfSlcbiAqIEBSb3V0ZUNvbmZpZyhbXG4gKiAgey4uLn0sXG4gKiBdKVxuICogY2xhc3MgQXBwQ21wIHtcbiAqICAgLy8gLi4uXG4gKiB9XG4gKlxuICogYm9vdHN0cmFwKEFwcENtcCwgW1JPVVRFUl9QUk9WSURFUlNdKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgUk9VVEVSX1BST1ZJREVSUzogYW55W10gPSBDT05TVF9FWFBSKFtcbiAgUm91dGVSZWdpc3RyeSxcbiAgQ09OU1RfRVhQUihuZXcgUHJvdmlkZXIoTG9jYXRpb25TdHJhdGVneSwge3VzZUNsYXNzOiBQYXRoTG9jYXRpb25TdHJhdGVneX0pKSxcbiAgUGxhdGZvcm1Mb2NhdGlvbixcbiAgTG9jYXRpb24sXG4gIENPTlNUX0VYUFIobmV3IFByb3ZpZGVyKFxuICAgICAgUm91dGVyLFxuICAgICAge1xuICAgICAgICB1c2VGYWN0b3J5OiByb3V0ZXJGYWN0b3J5LFxuICAgICAgICBkZXBzOiBDT05TVF9FWFBSKFtSb3V0ZVJlZ2lzdHJ5LCBMb2NhdGlvbiwgUk9VVEVSX1BSSU1BUllfQ09NUE9ORU5ULCBBcHBsaWNhdGlvblJlZl0pXG4gICAgICB9KSksXG4gIENPTlNUX0VYUFIobmV3IFByb3ZpZGVyKFxuICAgICAgUk9VVEVSX1BSSU1BUllfQ09NUE9ORU5ULFxuICAgICAge3VzZUZhY3Rvcnk6IHJvdXRlclByaW1hcnlDb21wb25lbnRGYWN0b3J5LCBkZXBzOiBDT05TVF9FWFBSKFtBcHBsaWNhdGlvblJlZl0pfSkpXG5dKTtcblxuLyoqXG4gKiBVc2Uge0BsaW5rIFJPVVRFUl9QUk9WSURFUlN9IGluc3RlYWQuXG4gKlxuICogQGRlcHJlY2F0ZWRcbiAqL1xuZXhwb3J0IGNvbnN0IFJPVVRFUl9CSU5ESU5HUyA9IFJPVVRFUl9QUk9WSURFUlM7XG5cbmZ1bmN0aW9uIHJvdXRlckZhY3RvcnkocmVnaXN0cnksIGxvY2F0aW9uLCBwcmltYXJ5Q29tcG9uZW50LCBhcHBSZWYpIHtcbiAgdmFyIHJvb3RSb3V0ZXIgPSBuZXcgUm9vdFJvdXRlcihyZWdpc3RyeSwgbG9jYXRpb24sIHByaW1hcnlDb21wb25lbnQpO1xuICBhcHBSZWYucmVnaXN0ZXJEaXNwb3NlTGlzdGVuZXIoKCkgPT4gcm9vdFJvdXRlci5kaXNwb3NlKCkpO1xuICByZXR1cm4gcm9vdFJvdXRlcjtcbn1cblxuZnVuY3Rpb24gcm91dGVyUHJpbWFyeUNvbXBvbmVudEZhY3RvcnkoYXBwKSB7XG4gIGlmIChhcHAuY29tcG9uZW50VHlwZXMubGVuZ3RoID09IDApIHtcbiAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihcIkJvb3RzdHJhcCBhdCBsZWFzdCBvbmUgY29tcG9uZW50IGJlZm9yZSBpbmplY3RpbmcgUm91dGVyLlwiKTtcbiAgfVxuICByZXR1cm4gYXBwLmNvbXBvbmVudFR5cGVzWzBdO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvcm91dGVyLnRzXG4gKiovIiwiaW1wb3J0IHtQcm9taXNlLCBQcm9taXNlV3JhcHBlciwgRXZlbnRFbWl0dGVyLCBPYnNlcnZhYmxlV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9hc3luYyc7XG5pbXBvcnQge01hcCwgU3RyaW5nTWFwV3JhcHBlciwgTWFwV3JhcHBlciwgTGlzdFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge2lzQmxhbmssIGlzU3RyaW5nLCBpc1ByZXNlbnQsIFR5cGUsIGlzQXJyYXl9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge0Jhc2VFeGNlcHRpb24sIFdyYXBwZWRFeGNlcHRpb259IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9ucyc7XG5pbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZX0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5cbmltcG9ydCB7Um91dGVSZWdpc3RyeSwgUk9VVEVSX1BSSU1BUllfQ09NUE9ORU5UfSBmcm9tICcuL3JvdXRlX3JlZ2lzdHJ5JztcbmltcG9ydCB7XG4gIENvbXBvbmVudEluc3RydWN0aW9uLFxuICBJbnN0cnVjdGlvbixcbn0gZnJvbSAnLi9pbnN0cnVjdGlvbic7XG5pbXBvcnQge1JvdXRlck91dGxldH0gZnJvbSAnLi9yb3V0ZXJfb3V0bGV0JztcbmltcG9ydCB7TG9jYXRpb259IGZyb20gJy4vbG9jYXRpb24nO1xuaW1wb3J0IHtnZXRDYW5BY3RpdmF0ZUhvb2t9IGZyb20gJy4vcm91dGVfbGlmZWN5Y2xlX3JlZmxlY3Rvcic7XG5pbXBvcnQge1JvdXRlRGVmaW5pdGlvbn0gZnJvbSAnLi9yb3V0ZV9jb25maWdfaW1wbCc7XG5cbmxldCBfcmVzb2x2ZVRvVHJ1ZSA9IFByb21pc2VXcmFwcGVyLnJlc29sdmUodHJ1ZSk7XG5sZXQgX3Jlc29sdmVUb0ZhbHNlID0gUHJvbWlzZVdyYXBwZXIucmVzb2x2ZShmYWxzZSk7XG5cbi8qKlxuICogVGhlIGBSb3V0ZXJgIGlzIHJlc3BvbnNpYmxlIGZvciBtYXBwaW5nIFVSTHMgdG8gY29tcG9uZW50cy5cbiAqXG4gKiBZb3UgY2FuIHNlZSB0aGUgc3RhdGUgb2YgdGhlIHJvdXRlciBieSBpbnNwZWN0aW5nIHRoZSByZWFkLW9ubHkgZmllbGQgYHJvdXRlci5uYXZpZ2F0aW5nYC5cbiAqIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3Igc2hvd2luZyBhIHNwaW5uZXIsIGZvciBpbnN0YW5jZS5cbiAqXG4gKiAjIyBDb25jZXB0c1xuICpcbiAqIFJvdXRlcnMgYW5kIGNvbXBvbmVudCBpbnN0YW5jZXMgaGF2ZSBhIDE6MSBjb3JyZXNwb25kZW5jZS5cbiAqXG4gKiBUaGUgcm91dGVyIGhvbGRzIHJlZmVyZW5jZSB0byBhIG51bWJlciBvZiB7QGxpbmsgUm91dGVyT3V0bGV0fS5cbiAqIEFuIG91dGxldCBpcyBhIHBsYWNlaG9sZGVyIHRoYXQgdGhlIHJvdXRlciBkeW5hbWljYWxseSBmaWxscyBpbiBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgVVJMLlxuICpcbiAqIFdoZW4gdGhlIHJvdXRlciBuYXZpZ2F0ZXMgZnJvbSBhIFVSTCwgaXQgbXVzdCBmaXJzdCByZWNvZ25pemUgaXQgYW5kIHNlcmlhbGl6ZSBpdCBpbnRvIGFuXG4gKiBgSW5zdHJ1Y3Rpb25gLlxuICogVGhlIHJvdXRlciB1c2VzIHRoZSBgUm91dGVSZWdpc3RyeWAgdG8gZ2V0IGFuIGBJbnN0cnVjdGlvbmAuXG4gKi9cbmV4cG9ydCBjbGFzcyBSb3V0ZXIge1xuICBuYXZpZ2F0aW5nOiBib29sZWFuID0gZmFsc2U7XG4gIGxhc3ROYXZpZ2F0aW9uQXR0ZW1wdDogc3RyaW5nO1xuXG4gIHByaXZhdGUgX2N1cnJlbnRJbnN0cnVjdGlvbjogSW5zdHJ1Y3Rpb24gPSBudWxsO1xuXG4gIHByaXZhdGUgX2N1cnJlbnROYXZpZ2F0aW9uOiBQcm9taXNlPGFueT4gPSBfcmVzb2x2ZVRvVHJ1ZTtcbiAgcHJpdmF0ZSBfb3V0bGV0OiBSb3V0ZXJPdXRsZXQgPSBudWxsO1xuXG4gIHByaXZhdGUgX2F1eFJvdXRlcnMgPSBuZXcgTWFwPHN0cmluZywgUm91dGVyPigpO1xuICBwcml2YXRlIF9jaGlsZFJvdXRlcjogUm91dGVyO1xuXG4gIHByaXZhdGUgX3N1YmplY3Q6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cbiAgY29uc3RydWN0b3IocHVibGljIHJlZ2lzdHJ5OiBSb3V0ZVJlZ2lzdHJ5LCBwdWJsaWMgcGFyZW50OiBSb3V0ZXIsIHB1YmxpYyBob3N0Q29tcG9uZW50OiBhbnkpIHt9XG5cblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhIGNoaWxkIHJvdXRlci4gWW91IHByb2JhYmx5IGRvbid0IG5lZWQgdG8gdXNlIHRoaXMgdW5sZXNzIHlvdSdyZSB3cml0aW5nIGEgcmV1c2FibGVcbiAgICogY29tcG9uZW50LlxuICAgKi9cbiAgY2hpbGRSb3V0ZXIoaG9zdENvbXBvbmVudDogYW55KTogUm91dGVyIHtcbiAgICByZXR1cm4gdGhpcy5fY2hpbGRSb3V0ZXIgPSBuZXcgQ2hpbGRSb3V0ZXIodGhpcywgaG9zdENvbXBvbmVudCk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgY2hpbGQgcm91dGVyLiBZb3UgcHJvYmFibHkgZG9uJ3QgbmVlZCB0byB1c2UgdGhpcyB1bmxlc3MgeW91J3JlIHdyaXRpbmcgYSByZXVzYWJsZVxuICAgKiBjb21wb25lbnQuXG4gICAqL1xuICBhdXhSb3V0ZXIoaG9zdENvbXBvbmVudDogYW55KTogUm91dGVyIHsgcmV0dXJuIG5ldyBDaGlsZFJvdXRlcih0aGlzLCBob3N0Q29tcG9uZW50KTsgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhbiBvdXRsZXQgdG8gYmUgbm90aWZpZWQgb2YgcHJpbWFyeSByb3V0ZSBjaGFuZ2VzLlxuICAgKlxuICAgKiBZb3UgcHJvYmFibHkgZG9uJ3QgbmVlZCB0byB1c2UgdGhpcyB1bmxlc3MgeW91J3JlIHdyaXRpbmcgYSByZXVzYWJsZSBjb21wb25lbnQuXG4gICAqL1xuICByZWdpc3RlclByaW1hcnlPdXRsZXQob3V0bGV0OiBSb3V0ZXJPdXRsZXQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoaXNQcmVzZW50KG91dGxldC5uYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYHJlZ2lzdGVyUHJpbWFyeU91dGxldCBleHBlY3RzIHRvIGJlIGNhbGxlZCB3aXRoIGFuIHVubmFtZWQgb3V0bGV0LmApO1xuICAgIH1cblxuICAgIHRoaXMuX291dGxldCA9IG91dGxldDtcbiAgICBpZiAoaXNQcmVzZW50KHRoaXMuX2N1cnJlbnRJbnN0cnVjdGlvbikpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbW1pdCh0aGlzLl9jdXJyZW50SW5zdHJ1Y3Rpb24sIGZhbHNlKTtcbiAgICB9XG4gICAgcmV0dXJuIF9yZXNvbHZlVG9UcnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGFuIG91dGxldCB0byBub3RpZmllZCBvZiBhdXhpbGlhcnkgcm91dGUgY2hhbmdlcy5cbiAgICpcbiAgICogWW91IHByb2JhYmx5IGRvbid0IG5lZWQgdG8gdXNlIHRoaXMgdW5sZXNzIHlvdSdyZSB3cml0aW5nIGEgcmV1c2FibGUgY29tcG9uZW50LlxuICAgKi9cbiAgcmVnaXN0ZXJBdXhPdXRsZXQob3V0bGV0OiBSb3V0ZXJPdXRsZXQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB2YXIgb3V0bGV0TmFtZSA9IG91dGxldC5uYW1lO1xuICAgIGlmIChpc0JsYW5rKG91dGxldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgcmVnaXN0ZXJBdXhPdXRsZXQgZXhwZWN0cyB0byBiZSBjYWxsZWQgd2l0aCBhbiBvdXRsZXQgd2l0aCBhIG5hbWUuYCk7XG4gICAgfVxuXG4gICAgLy8gVE9ETy4uLlxuICAgIC8vIHdoYXQgaXMgdGhlIGhvc3Qgb2YgYW4gYXV4IHJvdXRlPz8/XG4gICAgdmFyIHJvdXRlciA9IHRoaXMuYXV4Um91dGVyKHRoaXMuaG9zdENvbXBvbmVudCk7XG5cbiAgICB0aGlzLl9hdXhSb3V0ZXJzLnNldChvdXRsZXROYW1lLCByb3V0ZXIpO1xuICAgIHJvdXRlci5fb3V0bGV0ID0gb3V0bGV0O1xuXG4gICAgdmFyIGF1eEluc3RydWN0aW9uO1xuICAgIGlmIChpc1ByZXNlbnQodGhpcy5fY3VycmVudEluc3RydWN0aW9uKSAmJlxuICAgICAgICBpc1ByZXNlbnQoYXV4SW5zdHJ1Y3Rpb24gPSB0aGlzLl9jdXJyZW50SW5zdHJ1Y3Rpb24uYXV4SW5zdHJ1Y3Rpb25bb3V0bGV0TmFtZV0pKSB7XG4gICAgICByZXR1cm4gcm91dGVyLmNvbW1pdChhdXhJbnN0cnVjdGlvbik7XG4gICAgfVxuICAgIHJldHVybiBfcmVzb2x2ZVRvVHJ1ZTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEdpdmVuIGFuIGluc3RydWN0aW9uLCByZXR1cm5zIGB0cnVlYCBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgY3VycmVudGx5IGFjdGl2ZSxcbiAgICogb3RoZXJ3aXNlIGBmYWxzZWAuXG4gICAqL1xuICBpc1JvdXRlQWN0aXZlKGluc3RydWN0aW9uOiBJbnN0cnVjdGlvbik6IGJvb2xlYW4ge1xuICAgIHZhciByb3V0ZXI6IFJvdXRlciA9IHRoaXM7XG4gICAgd2hpbGUgKGlzUHJlc2VudChyb3V0ZXIucGFyZW50KSAmJiBpc1ByZXNlbnQoaW5zdHJ1Y3Rpb24uY2hpbGQpKSB7XG4gICAgICByb3V0ZXIgPSByb3V0ZXIucGFyZW50O1xuICAgICAgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbi5jaGlsZDtcbiAgICB9XG4gICAgcmV0dXJuIGlzUHJlc2VudCh0aGlzLl9jdXJyZW50SW5zdHJ1Y3Rpb24pICYmXG4gICAgICAgICAgIHRoaXMuX2N1cnJlbnRJbnN0cnVjdGlvbi5jb21wb25lbnQgPT0gaW5zdHJ1Y3Rpb24uY29tcG9uZW50O1xuICB9XG5cblxuICAvKipcbiAgICogRHluYW1pY2FsbHkgdXBkYXRlIHRoZSByb3V0aW5nIGNvbmZpZ3VyYXRpb24gYW5kIHRyaWdnZXIgYSBuYXZpZ2F0aW9uLlxuICAgKlxuICAgKiAjIyMgVXNhZ2VcbiAgICpcbiAgICogYGBgXG4gICAqIHJvdXRlci5jb25maWcoW1xuICAgKiAgIHsgJ3BhdGgnOiAnLycsICdjb21wb25lbnQnOiBJbmRleENvbXAgfSxcbiAgICogICB7ICdwYXRoJzogJy91c2VyLzppZCcsICdjb21wb25lbnQnOiBVc2VyQ29tcCB9LFxuICAgKiBdKTtcbiAgICogYGBgXG4gICAqL1xuICBjb25maWcoZGVmaW5pdGlvbnM6IFJvdXRlRGVmaW5pdGlvbltdKTogUHJvbWlzZTxhbnk+IHtcbiAgICBkZWZpbml0aW9ucy5mb3JFYWNoKFxuICAgICAgICAocm91dGVEZWZpbml0aW9uKSA9PiB7IHRoaXMucmVnaXN0cnkuY29uZmlnKHRoaXMuaG9zdENvbXBvbmVudCwgcm91dGVEZWZpbml0aW9uKTsgfSk7XG4gICAgcmV0dXJuIHRoaXMucmVuYXZpZ2F0ZSgpO1xuICB9XG5cblxuICAvKipcbiAgICogTmF2aWdhdGUgYmFzZWQgb24gdGhlIHByb3ZpZGVkIFJvdXRlIExpbmsgRFNMLiBJdCdzIHByZWZlcnJlZCB0byBuYXZpZ2F0ZSB3aXRoIHRoaXMgbWV0aG9kXG4gICAqIG92ZXIgYG5hdmlnYXRlQnlVcmxgLlxuICAgKlxuICAgKiAjIyMgVXNhZ2VcbiAgICpcbiAgICogVGhpcyBtZXRob2QgdGFrZXMgYW4gYXJyYXkgcmVwcmVzZW50aW5nIHRoZSBSb3V0ZSBMaW5rIERTTDpcbiAgICogYGBgXG4gICAqIFsnLi9NeUNtcCcsIHtwYXJhbTogM31dXG4gICAqIGBgYFxuICAgKiBTZWUgdGhlIHtAbGluayBSb3V0ZXJMaW5rfSBkaXJlY3RpdmUgZm9yIG1vcmUuXG4gICAqL1xuICBuYXZpZ2F0ZShsaW5rUGFyYW1zOiBhbnlbXSk6IFByb21pc2U8YW55PiB7XG4gICAgdmFyIGluc3RydWN0aW9uID0gdGhpcy5nZW5lcmF0ZShsaW5rUGFyYW1zKTtcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0ZUJ5SW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24sIGZhbHNlKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIE5hdmlnYXRlIHRvIGEgVVJMLiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gbmF2aWdhdGlvbiBpcyBjb21wbGV0ZS5cbiAgICogSXQncyBwcmVmZXJyZWQgdG8gbmF2aWdhdGUgd2l0aCBgbmF2aWdhdGVgIGluc3RlYWQgb2YgdGhpcyBtZXRob2QsIHNpbmNlIFVSTHMgYXJlIG1vcmUgYnJpdHRsZS5cbiAgICpcbiAgICogSWYgdGhlIGdpdmVuIFVSTCBiZWdpbnMgd2l0aCBhIGAvYCwgcm91dGVyIHdpbGwgbmF2aWdhdGUgYWJzb2x1dGVseS5cbiAgICogSWYgdGhlIGdpdmVuIFVSTCBkb2VzIG5vdCBiZWdpbiB3aXRoIGAvYCwgdGhlIHJvdXRlciB3aWxsIG5hdmlnYXRlIHJlbGF0aXZlIHRvIHRoaXMgY29tcG9uZW50LlxuICAgKi9cbiAgbmF2aWdhdGVCeVVybCh1cmw6IHN0cmluZywgX3NraXBMb2NhdGlvbkNoYW5nZTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudE5hdmlnYXRpb24gPSB0aGlzLl9jdXJyZW50TmF2aWdhdGlvbi50aGVuKChfKSA9PiB7XG4gICAgICB0aGlzLmxhc3ROYXZpZ2F0aW9uQXR0ZW1wdCA9IHVybDtcbiAgICAgIHRoaXMuX3N0YXJ0TmF2aWdhdGluZygpO1xuICAgICAgcmV0dXJuIHRoaXMuX2FmdGVyUHJvbWlzZUZpbmlzaE5hdmlnYXRpbmcodGhpcy5yZWNvZ25pemUodXJsKS50aGVuKChpbnN0cnVjdGlvbikgPT4ge1xuICAgICAgICBpZiAoaXNCbGFuayhpbnN0cnVjdGlvbikpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX25hdmlnYXRlKGluc3RydWN0aW9uLCBfc2tpcExvY2F0aW9uQ2hhbmdlKTtcbiAgICAgIH0pKTtcbiAgICB9KTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIE5hdmlnYXRlIHZpYSB0aGUgcHJvdmlkZWQgaW5zdHJ1Y3Rpb24uIFJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBuYXZpZ2F0aW9uIGlzXG4gICAqIGNvbXBsZXRlLlxuICAgKi9cbiAgbmF2aWdhdGVCeUluc3RydWN0aW9uKGluc3RydWN0aW9uOiBJbnN0cnVjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIF9za2lwTG9jYXRpb25DaGFuZ2U6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKGlzQmxhbmsoaW5zdHJ1Y3Rpb24pKSB7XG4gICAgICByZXR1cm4gX3Jlc29sdmVUb0ZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY3VycmVudE5hdmlnYXRpb24gPSB0aGlzLl9jdXJyZW50TmF2aWdhdGlvbi50aGVuKChfKSA9PiB7XG4gICAgICB0aGlzLl9zdGFydE5hdmlnYXRpbmcoKTtcbiAgICAgIHJldHVybiB0aGlzLl9hZnRlclByb21pc2VGaW5pc2hOYXZpZ2F0aW5nKHRoaXMuX25hdmlnYXRlKGluc3RydWN0aW9uLCBfc2tpcExvY2F0aW9uQ2hhbmdlKSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9uYXZpZ2F0ZShpbnN0cnVjdGlvbjogSW5zdHJ1Y3Rpb24sIF9za2lwTG9jYXRpb25DaGFuZ2U6IGJvb2xlYW4pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLl9zZXR0bGVJbnN0cnVjdGlvbihpbnN0cnVjdGlvbilcbiAgICAgICAgLnRoZW4oKF8pID0+IHRoaXMuX3JvdXRlckNhblJldXNlKGluc3RydWN0aW9uKSlcbiAgICAgICAgLnRoZW4oKF8pID0+IHRoaXMuX2NhbkFjdGl2YXRlKGluc3RydWN0aW9uKSlcbiAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLl9yb3V0ZXJDYW5EZWFjdGl2YXRlKGluc3RydWN0aW9uKVxuICAgICAgICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tbWl0KGluc3RydWN0aW9uLCBfc2tpcExvY2F0aW9uQ2hhbmdlKVxuICAgICAgICAgICAgICAgICAgICAgIC50aGVuKChfKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbWl0TmF2aWdhdGlvbkZpbmlzaChpbnN0cnVjdGlvbi50b1Jvb3RVcmwoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3NldHRsZUluc3RydWN0aW9uKGluc3RydWN0aW9uOiBJbnN0cnVjdGlvbik6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGluc3RydWN0aW9uLnJlc29sdmVDb21wb25lbnQoKS50aGVuKChfKSA9PiB7XG4gICAgICBpbnN0cnVjdGlvbi5jb21wb25lbnQucmV1c2UgPSBmYWxzZTtcblxuICAgICAgdmFyIHVuc2V0dGxlZEluc3RydWN0aW9uczogQXJyYXk8UHJvbWlzZTxhbnk+PiA9IFtdO1xuXG4gICAgICBpZiAoaXNQcmVzZW50KGluc3RydWN0aW9uLmNoaWxkKSkge1xuICAgICAgICB1bnNldHRsZWRJbnN0cnVjdGlvbnMucHVzaCh0aGlzLl9zZXR0bGVJbnN0cnVjdGlvbihpbnN0cnVjdGlvbi5jaGlsZCkpO1xuICAgICAgfVxuXG4gICAgICBTdHJpbmdNYXBXcmFwcGVyLmZvckVhY2goaW5zdHJ1Y3Rpb24uYXV4SW5zdHJ1Y3Rpb24sIChpbnN0cnVjdGlvbiwgXykgPT4ge1xuICAgICAgICB1bnNldHRsZWRJbnN0cnVjdGlvbnMucHVzaCh0aGlzLl9zZXR0bGVJbnN0cnVjdGlvbihpbnN0cnVjdGlvbikpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gUHJvbWlzZVdyYXBwZXIuYWxsKHVuc2V0dGxlZEluc3RydWN0aW9ucyk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9lbWl0TmF2aWdhdGlvbkZpbmlzaCh1cmwpOiB2b2lkIHsgT2JzZXJ2YWJsZVdyYXBwZXIuY2FsbEVtaXQodGhpcy5fc3ViamVjdCwgdXJsKTsgfVxuXG4gIHByaXZhdGUgX2FmdGVyUHJvbWlzZUZpbmlzaE5hdmlnYXRpbmcocHJvbWlzZTogUHJvbWlzZTxhbnk+KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gUHJvbWlzZVdyYXBwZXIuY2F0Y2hFcnJvcihwcm9taXNlLnRoZW4oKF8pID0+IHRoaXMuX2ZpbmlzaE5hdmlnYXRpbmcoKSksIChlcnIpID0+IHtcbiAgICAgIHRoaXMuX2ZpbmlzaE5hdmlnYXRpbmcoKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9KTtcbiAgfVxuXG4gIC8qXG4gICAqIFJlY3Vyc2l2ZWx5IHNldCByZXVzZSBmbGFnc1xuICAgKi9cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcm91dGVyQ2FuUmV1c2UoaW5zdHJ1Y3Rpb246IEluc3RydWN0aW9uKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoaXNCbGFuayh0aGlzLl9vdXRsZXQpKSB7XG4gICAgICByZXR1cm4gX3Jlc29sdmVUb0ZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fb3V0bGV0LnJvdXRlckNhblJldXNlKGluc3RydWN0aW9uLmNvbXBvbmVudClcbiAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIGluc3RydWN0aW9uLmNvbXBvbmVudC5yZXVzZSA9IHJlc3VsdDtcbiAgICAgICAgICBpZiAocmVzdWx0ICYmIGlzUHJlc2VudCh0aGlzLl9jaGlsZFJvdXRlcikgJiYgaXNQcmVzZW50KGluc3RydWN0aW9uLmNoaWxkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NoaWxkUm91dGVyLl9yb3V0ZXJDYW5SZXVzZShpbnN0cnVjdGlvbi5jaGlsZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2NhbkFjdGl2YXRlKG5leHRJbnN0cnVjdGlvbjogSW5zdHJ1Y3Rpb24pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gY2FuQWN0aXZhdGVPbmUobmV4dEluc3RydWN0aW9uLCB0aGlzLl9jdXJyZW50SW5zdHJ1Y3Rpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcm91dGVyQ2FuRGVhY3RpdmF0ZShpbnN0cnVjdGlvbjogSW5zdHJ1Y3Rpb24pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoaXNCbGFuayh0aGlzLl9vdXRsZXQpKSB7XG4gICAgICByZXR1cm4gX3Jlc29sdmVUb1RydWU7XG4gICAgfVxuICAgIHZhciBuZXh0OiBQcm9taXNlPGJvb2xlYW4+O1xuICAgIHZhciBjaGlsZEluc3RydWN0aW9uOiBJbnN0cnVjdGlvbiA9IG51bGw7XG4gICAgdmFyIHJldXNlOiBib29sZWFuID0gZmFsc2U7XG4gICAgdmFyIGNvbXBvbmVudEluc3RydWN0aW9uOiBDb21wb25lbnRJbnN0cnVjdGlvbiA9IG51bGw7XG4gICAgaWYgKGlzUHJlc2VudChpbnN0cnVjdGlvbikpIHtcbiAgICAgIGNoaWxkSW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbi5jaGlsZDtcbiAgICAgIGNvbXBvbmVudEluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb24uY29tcG9uZW50O1xuICAgICAgcmV1c2UgPSBpbnN0cnVjdGlvbi5jb21wb25lbnQucmV1c2U7XG4gICAgfVxuICAgIGlmIChyZXVzZSkge1xuICAgICAgbmV4dCA9IF9yZXNvbHZlVG9UcnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0ID0gdGhpcy5fb3V0bGV0LnJvdXRlckNhbkRlYWN0aXZhdGUoY29tcG9uZW50SW5zdHJ1Y3Rpb24pO1xuICAgIH1cbiAgICAvLyBUT0RPOiBhdXggcm91dGUgbGlmZWN5Y2xlIGhvb2tzXG4gICAgcmV0dXJuIG5leHQudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0ID09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1ByZXNlbnQodGhpcy5fY2hpbGRSb3V0ZXIpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jaGlsZFJvdXRlci5fcm91dGVyQ2FuRGVhY3RpdmF0ZShjaGlsZEluc3RydWN0aW9uKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhpcyByb3V0ZXIgYW5kIGFsbCBkZXNjZW5kYW50IHJvdXRlcnMgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBpbnN0cnVjdGlvblxuICAgKi9cbiAgY29tbWl0KGluc3RydWN0aW9uOiBJbnN0cnVjdGlvbiwgX3NraXBMb2NhdGlvbkNoYW5nZTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxhbnk+IHtcbiAgICB0aGlzLl9jdXJyZW50SW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbjtcbiAgICB2YXIgbmV4dDogUHJvbWlzZTxhbnk+ID0gX3Jlc29sdmVUb1RydWU7XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLl9vdXRsZXQpKSB7XG4gICAgICB2YXIgY29tcG9uZW50SW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbi5jb21wb25lbnQ7XG4gICAgICBpZiAoY29tcG9uZW50SW5zdHJ1Y3Rpb24ucmV1c2UpIHtcbiAgICAgICAgbmV4dCA9IHRoaXMuX291dGxldC5yZXVzZShjb21wb25lbnRJbnN0cnVjdGlvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0ID1cbiAgICAgICAgICAgIHRoaXMuZGVhY3RpdmF0ZShpbnN0cnVjdGlvbikudGhlbigoXykgPT4gdGhpcy5fb3V0bGV0LmFjdGl2YXRlKGNvbXBvbmVudEluc3RydWN0aW9uKSk7XG4gICAgICB9XG4gICAgICBpZiAoaXNQcmVzZW50KGluc3RydWN0aW9uLmNoaWxkKSkge1xuICAgICAgICBuZXh0ID0gbmV4dC50aGVuKChfKSA9PiB7XG4gICAgICAgICAgaWYgKGlzUHJlc2VudCh0aGlzLl9jaGlsZFJvdXRlcikpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jaGlsZFJvdXRlci5jb21taXQoaW5zdHJ1Y3Rpb24uY2hpbGQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHByb21pc2VzID0gW107XG4gICAgdGhpcy5fYXV4Um91dGVycy5mb3JFYWNoKChyb3V0ZXIsIG5hbWUpID0+IHtcbiAgICAgIGlmIChpc1ByZXNlbnQoaW5zdHJ1Y3Rpb24uYXV4SW5zdHJ1Y3Rpb25bbmFtZV0pKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2gocm91dGVyLmNvbW1pdChpbnN0cnVjdGlvbi5hdXhJbnN0cnVjdGlvbltuYW1lXSkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5leHQudGhlbigoXykgPT4gUHJvbWlzZVdyYXBwZXIuYWxsKHByb21pc2VzKSk7XG4gIH1cblxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3N0YXJ0TmF2aWdhdGluZygpOiB2b2lkIHsgdGhpcy5uYXZpZ2F0aW5nID0gdHJ1ZTsgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2ZpbmlzaE5hdmlnYXRpbmcoKTogdm9pZCB7IHRoaXMubmF2aWdhdGluZyA9IGZhbHNlOyB9XG5cblxuICAvKipcbiAgICogU3Vic2NyaWJlIHRvIFVSTCB1cGRhdGVzIGZyb20gdGhlIHJvdXRlclxuICAgKi9cbiAgc3Vic2NyaWJlKG9uTmV4dDogKHZhbHVlOiBhbnkpID0+IHZvaWQpOiBPYmplY3Qge1xuICAgIHJldHVybiBPYnNlcnZhYmxlV3JhcHBlci5zdWJzY3JpYmUodGhpcy5fc3ViamVjdCwgb25OZXh0KTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgcm91dGVyJ3Mgb3V0bGV0IGFuZCBhbGwgZGVzY2VuZGFudCBvdXRsZXRzXG4gICAqL1xuICBkZWFjdGl2YXRlKGluc3RydWN0aW9uOiBJbnN0cnVjdGlvbik6IFByb21pc2U8YW55PiB7XG4gICAgdmFyIGNoaWxkSW5zdHJ1Y3Rpb246IEluc3RydWN0aW9uID0gbnVsbDtcbiAgICB2YXIgY29tcG9uZW50SW5zdHJ1Y3Rpb246IENvbXBvbmVudEluc3RydWN0aW9uID0gbnVsbDtcbiAgICBpZiAoaXNQcmVzZW50KGluc3RydWN0aW9uKSkge1xuICAgICAgY2hpbGRJbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uLmNoaWxkO1xuICAgICAgY29tcG9uZW50SW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbi5jb21wb25lbnQ7XG4gICAgfVxuICAgIHZhciBuZXh0OiBQcm9taXNlPGFueT4gPSBfcmVzb2x2ZVRvVHJ1ZTtcbiAgICBpZiAoaXNQcmVzZW50KHRoaXMuX2NoaWxkUm91dGVyKSkge1xuICAgICAgbmV4dCA9IHRoaXMuX2NoaWxkUm91dGVyLmRlYWN0aXZhdGUoY2hpbGRJbnN0cnVjdGlvbik7XG4gICAgfVxuICAgIGlmIChpc1ByZXNlbnQodGhpcy5fb3V0bGV0KSkge1xuICAgICAgbmV4dCA9IG5leHQudGhlbigoXykgPT4gdGhpcy5fb3V0bGV0LmRlYWN0aXZhdGUoY29tcG9uZW50SW5zdHJ1Y3Rpb24pKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBoYW5kbGUgYXV4IHJvdXRlc1xuXG4gICAgcmV0dXJuIG5leHQ7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBHaXZlbiBhIFVSTCwgcmV0dXJucyBhbiBpbnN0cnVjdGlvbiByZXByZXNlbnRpbmcgdGhlIGNvbXBvbmVudCBncmFwaFxuICAgKi9cbiAgcmVjb2duaXplKHVybDogc3RyaW5nKTogUHJvbWlzZTxJbnN0cnVjdGlvbj4ge1xuICAgIHZhciBhbmNlc3RvckNvbXBvbmVudHMgPSB0aGlzLl9nZXRBbmNlc3Rvckluc3RydWN0aW9ucygpO1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5LnJlY29nbml6ZSh1cmwsIGFuY2VzdG9yQ29tcG9uZW50cyk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRBbmNlc3Rvckluc3RydWN0aW9ucygpOiBJbnN0cnVjdGlvbltdIHtcbiAgICB2YXIgYW5jZXN0b3JDb21wb25lbnRzID0gW107XG4gICAgdmFyIGFuY2VzdG9yUm91dGVyOiBSb3V0ZXIgPSB0aGlzO1xuICAgIHdoaWxlIChpc1ByZXNlbnQoYW5jZXN0b3JSb3V0ZXIucGFyZW50KSAmJlxuICAgICAgICAgICBpc1ByZXNlbnQoYW5jZXN0b3JSb3V0ZXIucGFyZW50Ll9jdXJyZW50SW5zdHJ1Y3Rpb24pKSB7XG4gICAgICBhbmNlc3RvclJvdXRlciA9IGFuY2VzdG9yUm91dGVyLnBhcmVudDtcbiAgICAgIGFuY2VzdG9yQ29tcG9uZW50cy51bnNoaWZ0KGFuY2VzdG9yUm91dGVyLl9jdXJyZW50SW5zdHJ1Y3Rpb24pO1xuICAgIH1cblxuICAgIHJldHVybiBhbmNlc3RvckNvbXBvbmVudHM7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBOYXZpZ2F0ZXMgdG8gZWl0aGVyIHRoZSBsYXN0IFVSTCBzdWNjZXNzZnVsbHkgbmF2aWdhdGVkIHRvLCBvciB0aGUgbGFzdCBVUkwgcmVxdWVzdGVkIGlmIHRoZVxuICAgKiByb3V0ZXIgaGFzIHlldCB0byBzdWNjZXNzZnVsbHkgbmF2aWdhdGUuXG4gICAqL1xuICByZW5hdmlnYXRlKCk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKGlzQmxhbmsodGhpcy5sYXN0TmF2aWdhdGlvbkF0dGVtcHQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY3VycmVudE5hdmlnYXRpb247XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm5hdmlnYXRlQnlVcmwodGhpcy5sYXN0TmF2aWdhdGlvbkF0dGVtcHQpO1xuICB9XG5cblxuICAvKipcbiAgICogR2VuZXJhdGUgYW4gYEluc3RydWN0aW9uYCBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgUm91dGUgTGluayBEU0wuXG4gICAqL1xuICBnZW5lcmF0ZShsaW5rUGFyYW1zOiBhbnlbXSk6IEluc3RydWN0aW9uIHtcbiAgICB2YXIgYW5jZXN0b3JJbnN0cnVjdGlvbnMgPSB0aGlzLl9nZXRBbmNlc3Rvckluc3RydWN0aW9ucygpO1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5LmdlbmVyYXRlKGxpbmtQYXJhbXMsIGFuY2VzdG9ySW5zdHJ1Y3Rpb25zKTtcbiAgfVxufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUm9vdFJvdXRlciBleHRlbmRzIFJvdXRlciB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2xvY2F0aW9uOiBMb2NhdGlvbjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfbG9jYXRpb25TdWI6IE9iamVjdDtcblxuICBjb25zdHJ1Y3RvcihyZWdpc3RyeTogUm91dGVSZWdpc3RyeSwgbG9jYXRpb246IExvY2F0aW9uLFxuICAgICAgICAgICAgICBASW5qZWN0KFJPVVRFUl9QUklNQVJZX0NPTVBPTkVOVCkgcHJpbWFyeUNvbXBvbmVudDogVHlwZSkge1xuICAgIHN1cGVyKHJlZ2lzdHJ5LCBudWxsLCBwcmltYXJ5Q29tcG9uZW50KTtcbiAgICB0aGlzLl9sb2NhdGlvbiA9IGxvY2F0aW9uO1xuICAgIHRoaXMuX2xvY2F0aW9uU3ViID0gdGhpcy5fbG9jYXRpb24uc3Vic2NyaWJlKChjaGFuZ2UpID0+IHtcbiAgICAgIC8vIHdlIGNhbGwgcmVjb2duaXplIG91cnNlbHZlc1xuICAgICAgdGhpcy5yZWNvZ25pemUoY2hhbmdlWyd1cmwnXSlcbiAgICAgICAgICAudGhlbigoaW5zdHJ1Y3Rpb24pID0+IHtcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGVCeUluc3RydWN0aW9uKGluc3RydWN0aW9uLCBpc1ByZXNlbnQoY2hhbmdlWydwb3AnXSkpXG4gICAgICAgICAgICAgICAgLnRoZW4oKF8pID0+IHtcbiAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBwb3BzdGF0ZSBldmVudDsgbm8gbmVlZCB0byBjaGFuZ2UgdGhlIFVSTFxuICAgICAgICAgICAgICAgICAgaWYgKGlzUHJlc2VudChjaGFuZ2VbJ3BvcCddKSAmJiBjaGFuZ2VbJ3R5cGUnXSAhPSAnaGFzaGNoYW5nZScpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgdmFyIGVtaXRQYXRoID0gaW5zdHJ1Y3Rpb24udG9VcmxQYXRoKCk7XG4gICAgICAgICAgICAgICAgICB2YXIgZW1pdFF1ZXJ5ID0gaW5zdHJ1Y3Rpb24udG9VcmxRdWVyeSgpO1xuICAgICAgICAgICAgICAgICAgaWYgKGVtaXRQYXRoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZW1pdFBhdGggPSAnLycgKyBlbWl0UGF0aDtcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgLy8gQmVjYXVzZSB3ZSd2ZSBvcHRlZCB0byB1c2UgQWxsIGhhc2hjaGFuZ2UgZXZlbnRzIG9jY3VyIG91dHNpZGUgQW5ndWxhci5cbiAgICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIGFwcHMgdGhhdCBhcmUgbWlncmF0aW5nIG1pZ2h0IGhhdmUgaGFzaCBsaW5rcyB0aGF0IG9wZXJhdGUgb3V0c2lkZVxuICAgICAgICAgICAgICAgICAgLy8gYW5ndWxhciB0byB3aGljaCByb3V0aW5nIG11c3QgcmVzcG9uZC5cbiAgICAgICAgICAgICAgICAgIC8vIFRvIHN1cHBvcnQgdGhlc2UgY2FzZXMgd2hlcmUgd2UgcmVzcG9uZCB0byBoYXNoY2hhbmdlcyBhbmQgcmVkaXJlY3QgYXMgYVxuICAgICAgICAgICAgICAgICAgLy8gcmVzdWx0LCB3ZSBuZWVkIHRvIHJlcGxhY2UgdGhlIHRvcCBpdGVtIG9uIHRoZSBzdGFjay5cbiAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VbJ3R5cGUnXSA9PSAnaGFzaGNoYW5nZScpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RydWN0aW9uLnRvUm9vdFVybCgpICE9IHRoaXMuX2xvY2F0aW9uLnBhdGgoKSkge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvY2F0aW9uLnJlcGxhY2VTdGF0ZShlbWl0UGF0aCwgZW1pdFF1ZXJ5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9jYXRpb24uZ28oZW1pdFBhdGgsIGVtaXRRdWVyeSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlZ2lzdHJ5LmNvbmZpZ0Zyb21Db21wb25lbnQocHJpbWFyeUNvbXBvbmVudCk7XG4gICAgdGhpcy5uYXZpZ2F0ZUJ5VXJsKGxvY2F0aW9uLnBhdGgoKSk7XG4gIH1cblxuICBjb21taXQoaW5zdHJ1Y3Rpb246IEluc3RydWN0aW9uLCBfc2tpcExvY2F0aW9uQ2hhbmdlOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPGFueT4ge1xuICAgIHZhciBlbWl0UGF0aCA9IGluc3RydWN0aW9uLnRvVXJsUGF0aCgpO1xuICAgIHZhciBlbWl0UXVlcnkgPSBpbnN0cnVjdGlvbi50b1VybFF1ZXJ5KCk7XG4gICAgaWYgKGVtaXRQYXRoLmxlbmd0aCA+IDApIHtcbiAgICAgIGVtaXRQYXRoID0gJy8nICsgZW1pdFBhdGg7XG4gICAgfVxuICAgIHZhciBwcm9taXNlID0gc3VwZXIuY29tbWl0KGluc3RydWN0aW9uKTtcbiAgICBpZiAoIV9za2lwTG9jYXRpb25DaGFuZ2UpIHtcbiAgICAgIHByb21pc2UgPSBwcm9taXNlLnRoZW4oKF8pID0+IHsgdGhpcy5fbG9jYXRpb24uZ28oZW1pdFBhdGgsIGVtaXRRdWVyeSk7IH0pO1xuICAgIH1cbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLl9sb2NhdGlvblN1YikpIHtcbiAgICAgIE9ic2VydmFibGVXcmFwcGVyLmRpc3Bvc2UodGhpcy5fbG9jYXRpb25TdWIpO1xuICAgICAgdGhpcy5fbG9jYXRpb25TdWIgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBDaGlsZFJvdXRlciBleHRlbmRzIFJvdXRlciB7XG4gIGNvbnN0cnVjdG9yKHBhcmVudDogUm91dGVyLCBob3N0Q29tcG9uZW50KSB7XG4gICAgc3VwZXIocGFyZW50LnJlZ2lzdHJ5LCBwYXJlbnQsIGhvc3RDb21wb25lbnQpO1xuICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICB9XG5cblxuICBuYXZpZ2F0ZUJ5VXJsKHVybDogc3RyaW5nLCBfc2tpcExvY2F0aW9uQ2hhbmdlOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPGFueT4ge1xuICAgIC8vIERlbGVnYXRlIG5hdmlnYXRpb24gdG8gdGhlIHJvb3Qgcm91dGVyXG4gICAgcmV0dXJuIHRoaXMucGFyZW50Lm5hdmlnYXRlQnlVcmwodXJsLCBfc2tpcExvY2F0aW9uQ2hhbmdlKTtcbiAgfVxuXG4gIG5hdmlnYXRlQnlJbnN0cnVjdGlvbihpbnN0cnVjdGlvbjogSW5zdHJ1Y3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBfc2tpcExvY2F0aW9uQ2hhbmdlOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPGFueT4ge1xuICAgIC8vIERlbGVnYXRlIG5hdmlnYXRpb24gdG8gdGhlIHJvb3Qgcm91dGVyXG4gICAgcmV0dXJuIHRoaXMucGFyZW50Lm5hdmlnYXRlQnlJbnN0cnVjdGlvbihpbnN0cnVjdGlvbiwgX3NraXBMb2NhdGlvbkNoYW5nZSk7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBjYW5BY3RpdmF0ZU9uZShuZXh0SW5zdHJ1Y3Rpb246IEluc3RydWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJldkluc3RydWN0aW9uOiBJbnN0cnVjdGlvbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB2YXIgbmV4dCA9IF9yZXNvbHZlVG9UcnVlO1xuICBpZiAoaXNQcmVzZW50KG5leHRJbnN0cnVjdGlvbi5jaGlsZCkpIHtcbiAgICBuZXh0ID0gY2FuQWN0aXZhdGVPbmUobmV4dEluc3RydWN0aW9uLmNoaWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ByZXNlbnQocHJldkluc3RydWN0aW9uKSA/IHByZXZJbnN0cnVjdGlvbi5jaGlsZCA6IG51bGwpO1xuICB9XG4gIHJldHVybiBuZXh0LnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgIGlmIChyZXN1bHQgPT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG5leHRJbnN0cnVjdGlvbi5jb21wb25lbnQucmV1c2UpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB2YXIgaG9vayA9IGdldENhbkFjdGl2YXRlSG9vayhuZXh0SW5zdHJ1Y3Rpb24uY29tcG9uZW50LmNvbXBvbmVudFR5cGUpO1xuICAgIGlmIChpc1ByZXNlbnQoaG9vaykpIHtcbiAgICAgIHJldHVybiBob29rKG5leHRJbnN0cnVjdGlvbi5jb21wb25lbnQsXG4gICAgICAgICAgICAgICAgICBpc1ByZXNlbnQocHJldkluc3RydWN0aW9uKSA/IHByZXZJbnN0cnVjdGlvbi5jb21wb25lbnQgOiBudWxsKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3JvdXRlci9yb3V0ZXIudHNcbiAqKi8iLCJpbXBvcnQge0xpc3RXcmFwcGVyLCBNYXAsIE1hcFdyYXBwZXIsIFN0cmluZ01hcFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge1Byb21pc2UsIFByb21pc2VXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2FzeW5jJztcbmltcG9ydCB7XG4gIGlzUHJlc2VudCxcbiAgaXNBcnJheSxcbiAgaXNCbGFuayxcbiAgaXNUeXBlLFxuICBpc1N0cmluZyxcbiAgaXNTdHJpbmdNYXAsXG4gIFR5cGUsXG4gIGdldFR5cGVOYW1lRm9yRGVidWdnaW5nLFxuICBDT05TVF9FWFBSXG59IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge0Jhc2VFeGNlcHRpb24sIFdyYXBwZWRFeGNlcHRpb259IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9ucyc7XG5pbXBvcnQge3JlZmxlY3Rvcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvcmVmbGVjdGlvbi9yZWZsZWN0aW9uJztcbmltcG9ydCB7SW5qZWN0YWJsZSwgSW5qZWN0LCBPcGFxdWVUb2tlbn0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5cbmltcG9ydCB7XG4gIFJvdXRlQ29uZmlnLFxuICBBc3luY1JvdXRlLFxuICBSb3V0ZSxcbiAgQXV4Um91dGUsXG4gIFJlZGlyZWN0LFxuICBSb3V0ZURlZmluaXRpb25cbn0gZnJvbSAnLi9yb3V0ZV9jb25maWdfaW1wbCc7XG5pbXBvcnQge1BhdGhNYXRjaCwgUmVkaXJlY3RNYXRjaCwgUm91dGVNYXRjaH0gZnJvbSAnLi9yb3V0ZV9yZWNvZ25pemVyJztcbmltcG9ydCB7Q29tcG9uZW50UmVjb2duaXplcn0gZnJvbSAnLi9jb21wb25lbnRfcmVjb2duaXplcic7XG5pbXBvcnQge1xuICBJbnN0cnVjdGlvbixcbiAgUmVzb2x2ZWRJbnN0cnVjdGlvbixcbiAgUmVkaXJlY3RJbnN0cnVjdGlvbixcbiAgVW5yZXNvbHZlZEluc3RydWN0aW9uLFxuICBEZWZhdWx0SW5zdHJ1Y3Rpb25cbn0gZnJvbSAnLi9pbnN0cnVjdGlvbic7XG5cbmltcG9ydCB7bm9ybWFsaXplUm91dGVDb25maWcsIGFzc2VydENvbXBvbmVudEV4aXN0c30gZnJvbSAnLi9yb3V0ZV9jb25maWdfbm9tYWxpemVyJztcbmltcG9ydCB7cGFyc2VyLCBVcmwsIHBhdGhTZWdtZW50c1RvVXJsfSBmcm9tICcuL3VybF9wYXJzZXInO1xuXG52YXIgX3Jlc29sdmVUb051bGwgPSBQcm9taXNlV3JhcHBlci5yZXNvbHZlKG51bGwpO1xuXG5cblxuLyoqXG4gKiBUb2tlbiB1c2VkIHRvIGJpbmQgdGhlIGNvbXBvbmVudCB3aXRoIHRoZSB0b3AtbGV2ZWwge0BsaW5rIFJvdXRlQ29uZmlnfXMgZm9yIHRoZVxuICogYXBwbGljYXRpb24uXG4gKlxuICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L2lSVVA4QjVPVWJ4Q1dRM0FjSURtKSlcbiAqXG4gKiBgYGBcbiAqIGltcG9ydCB7Q29tcG9uZW50fSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbiAqIGltcG9ydCB7XG4gKiAgIFJPVVRFUl9ESVJFQ1RJVkVTLFxuICogICBST1VURVJfUFJPVklERVJTLFxuICogICBSb3V0ZUNvbmZpZ1xuICogfSBmcm9tICdhbmd1bGFyMi9yb3V0ZXInO1xuICpcbiAqIEBDb21wb25lbnQoe2RpcmVjdGl2ZXM6IFtST1VURVJfRElSRUNUSVZFU119KVxuICogQFJvdXRlQ29uZmlnKFtcbiAqICB7Li4ufSxcbiAqIF0pXG4gKiBjbGFzcyBBcHBDbXAge1xuICogICAvLyAuLi5cbiAqIH1cbiAqXG4gKiBib290c3RyYXAoQXBwQ21wLCBbUk9VVEVSX1BST1ZJREVSU10pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBST1VURVJfUFJJTUFSWV9DT01QT05FTlQ6IE9wYXF1ZVRva2VuID1cbiAgICBDT05TVF9FWFBSKG5ldyBPcGFxdWVUb2tlbignUm91dGVyUHJpbWFyeUNvbXBvbmVudCcpKTtcblxuXG4vKipcbiAqIFRoZSBSb3V0ZVJlZ2lzdHJ5IGhvbGRzIHJvdXRlIGNvbmZpZ3VyYXRpb25zIGZvciBlYWNoIGNvbXBvbmVudCBpbiBhbiBBbmd1bGFyIGFwcC5cbiAqIEl0IGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBJbnN0cnVjdGlvbnMgZnJvbSBVUkxzLCBhbmQgZ2VuZXJhdGluZyBVUkxzIGJhc2VkIG9uIHJvdXRlIGFuZFxuICogcGFyYW1ldGVycy5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJvdXRlUmVnaXN0cnkge1xuICBwcml2YXRlIF9ydWxlcyA9IG5ldyBNYXA8YW55LCBDb21wb25lbnRSZWNvZ25pemVyPigpO1xuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoUk9VVEVSX1BSSU1BUllfQ09NUE9ORU5UKSBwcml2YXRlIF9yb290Q29tcG9uZW50OiBUeXBlKSB7fVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhIGNvbXBvbmVudCBhbmQgYSBjb25maWd1cmF0aW9uIG9iamVjdCwgYWRkIHRoZSByb3V0ZSB0byB0aGlzIHJlZ2lzdHJ5XG4gICAqL1xuICBjb25maWcocGFyZW50Q29tcG9uZW50OiBhbnksIGNvbmZpZzogUm91dGVEZWZpbml0aW9uKTogdm9pZCB7XG4gICAgY29uZmlnID0gbm9ybWFsaXplUm91dGVDb25maWcoY29uZmlnLCB0aGlzKTtcblxuICAgIC8vIHRoaXMgaXMgaGVyZSBiZWNhdXNlIERhcnQgdHlwZSBndWFyZCByZWFzb25zXG4gICAgaWYgKGNvbmZpZyBpbnN0YW5jZW9mIFJvdXRlKSB7XG4gICAgICBhc3NlcnRDb21wb25lbnRFeGlzdHMoY29uZmlnLmNvbXBvbmVudCwgY29uZmlnLnBhdGgpO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnIGluc3RhbmNlb2YgQXV4Um91dGUpIHtcbiAgICAgIGFzc2VydENvbXBvbmVudEV4aXN0cyhjb25maWcuY29tcG9uZW50LCBjb25maWcucGF0aCk7XG4gICAgfVxuXG4gICAgdmFyIHJlY29nbml6ZXI6IENvbXBvbmVudFJlY29nbml6ZXIgPSB0aGlzLl9ydWxlcy5nZXQocGFyZW50Q29tcG9uZW50KTtcblxuICAgIGlmIChpc0JsYW5rKHJlY29nbml6ZXIpKSB7XG4gICAgICByZWNvZ25pemVyID0gbmV3IENvbXBvbmVudFJlY29nbml6ZXIoKTtcbiAgICAgIHRoaXMuX3J1bGVzLnNldChwYXJlbnRDb21wb25lbnQsIHJlY29nbml6ZXIpO1xuICAgIH1cblxuICAgIHZhciB0ZXJtaW5hbCA9IHJlY29nbml6ZXIuY29uZmlnKGNvbmZpZyk7XG5cbiAgICBpZiAoY29uZmlnIGluc3RhbmNlb2YgUm91dGUpIHtcbiAgICAgIGlmICh0ZXJtaW5hbCkge1xuICAgICAgICBhc3NlcnRUZXJtaW5hbENvbXBvbmVudChjb25maWcuY29tcG9uZW50LCBjb25maWcucGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvbmZpZ0Zyb21Db21wb25lbnQoY29uZmlnLmNvbXBvbmVudCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIHRoZSBhbm5vdGF0aW9ucyBvZiBhIGNvbXBvbmVudCBhbmQgY29uZmlndXJlcyB0aGUgcmVnaXN0cnkgYmFzZWQgb24gdGhlbVxuICAgKi9cbiAgY29uZmlnRnJvbUNvbXBvbmVudChjb21wb25lbnQ6IGFueSk6IHZvaWQge1xuICAgIGlmICghaXNUeXBlKGNvbXBvbmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBEb24ndCByZWFkIHRoZSBhbm5vdGF0aW9ucyBmcm9tIGEgdHlwZSBtb3JlIHRoYW4gb25jZSDigJNcbiAgICAvLyB0aGlzIHByZXZlbnRzIGFuIGluZmluaXRlIGxvb3AgaWYgYSBjb21wb25lbnQgcm91dGVzIHJlY3Vyc2l2ZWx5LlxuICAgIGlmICh0aGlzLl9ydWxlcy5oYXMoY29tcG9uZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgYW5ub3RhdGlvbnMgPSByZWZsZWN0b3IuYW5ub3RhdGlvbnMoY29tcG9uZW50KTtcbiAgICBpZiAoaXNQcmVzZW50KGFubm90YXRpb25zKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbm5vdGF0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYW5ub3RhdGlvbiA9IGFubm90YXRpb25zW2ldO1xuXG4gICAgICAgIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgUm91dGVDb25maWcpIHtcbiAgICAgICAgICBsZXQgcm91dGVDZmdzOiBSb3V0ZURlZmluaXRpb25bXSA9IGFubm90YXRpb24uY29uZmlncztcbiAgICAgICAgICByb3V0ZUNmZ3MuZm9yRWFjaChjb25maWcgPT4gdGhpcy5jb25maWcoY29tcG9uZW50LCBjb25maWcpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG5cbiAgLyoqXG4gICAqIEdpdmVuIGEgVVJMIGFuZCBhIHBhcmVudCBjb21wb25lbnQsIHJldHVybiB0aGUgbW9zdCBzcGVjaWZpYyBpbnN0cnVjdGlvbiBmb3IgbmF2aWdhdGluZ1xuICAgKiB0aGUgYXBwbGljYXRpb24gaW50byB0aGUgc3RhdGUgc3BlY2lmaWVkIGJ5IHRoZSB1cmxcbiAgICovXG4gIHJlY29nbml6ZSh1cmw6IHN0cmluZywgYW5jZXN0b3JJbnN0cnVjdGlvbnM6IEluc3RydWN0aW9uW10pOiBQcm9taXNlPEluc3RydWN0aW9uPiB7XG4gICAgdmFyIHBhcnNlZFVybCA9IHBhcnNlci5wYXJzZSh1cmwpO1xuICAgIHJldHVybiB0aGlzLl9yZWNvZ25pemUocGFyc2VkVXJsLCBhbmNlc3Rvckluc3RydWN0aW9ucyk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBSZWNvZ25pemVzIGFsbCBwYXJlbnQtY2hpbGQgcm91dGVzLCBidXQgY3JlYXRlcyB1bnJlc29sdmVkIGF1eGlsaWFyeSByb3V0ZXNcbiAgICovXG5cbiAgcHJpdmF0ZSBfcmVjb2duaXplKHBhcnNlZFVybDogVXJsLCBhbmNlc3Rvckluc3RydWN0aW9uczogSW5zdHJ1Y3Rpb25bXSxcbiAgICAgICAgICAgICAgICAgICAgIF9hdXggPSBmYWxzZSk6IFByb21pc2U8SW5zdHJ1Y3Rpb24+IHtcbiAgICB2YXIgcGFyZW50Q29tcG9uZW50ID1cbiAgICAgICAgYW5jZXN0b3JJbnN0cnVjdGlvbnMubGVuZ3RoID4gMCA/XG4gICAgICAgICAgICBhbmNlc3Rvckluc3RydWN0aW9uc1thbmNlc3Rvckluc3RydWN0aW9ucy5sZW5ndGggLSAxXS5jb21wb25lbnQuY29tcG9uZW50VHlwZSA6XG4gICAgICAgICAgICB0aGlzLl9yb290Q29tcG9uZW50O1xuXG4gICAgdmFyIGNvbXBvbmVudFJlY29nbml6ZXIgPSB0aGlzLl9ydWxlcy5nZXQocGFyZW50Q29tcG9uZW50KTtcbiAgICBpZiAoaXNCbGFuayhjb21wb25lbnRSZWNvZ25pemVyKSkge1xuICAgICAgcmV0dXJuIF9yZXNvbHZlVG9OdWxsO1xuICAgIH1cblxuICAgIC8vIE1hdGNoZXMgc29tZSBiZWdpbm5pbmcgcGFydCBvZiB0aGUgZ2l2ZW4gVVJMXG4gICAgdmFyIHBvc3NpYmxlTWF0Y2hlczogUHJvbWlzZTxSb3V0ZU1hdGNoPltdID1cbiAgICAgICAgX2F1eCA/IGNvbXBvbmVudFJlY29nbml6ZXIucmVjb2duaXplQXV4aWxpYXJ5KHBhcnNlZFVybCkgOlxuICAgICAgICAgICAgICAgY29tcG9uZW50UmVjb2duaXplci5yZWNvZ25pemUocGFyc2VkVXJsKTtcblxuICAgIHZhciBtYXRjaFByb21pc2VzOiBQcm9taXNlPEluc3RydWN0aW9uPltdID0gcG9zc2libGVNYXRjaGVzLm1hcChcbiAgICAgICAgKGNhbmRpZGF0ZTogUHJvbWlzZTxSb3V0ZU1hdGNoPikgPT4gY2FuZGlkYXRlLnRoZW4oKGNhbmRpZGF0ZTogUm91dGVNYXRjaCkgPT4ge1xuXG4gICAgICAgICAgaWYgKGNhbmRpZGF0ZSBpbnN0YW5jZW9mIFBhdGhNYXRjaCkge1xuICAgICAgICAgICAgdmFyIGF1eFBhcmVudEluc3RydWN0aW9ucyA9XG4gICAgICAgICAgICAgICAgYW5jZXN0b3JJbnN0cnVjdGlvbnMubGVuZ3RoID4gMCA/XG4gICAgICAgICAgICAgICAgICAgIFthbmNlc3Rvckluc3RydWN0aW9uc1thbmNlc3Rvckluc3RydWN0aW9ucy5sZW5ndGggLSAxXV0gOlxuICAgICAgICAgICAgICAgICAgICBbXTtcbiAgICAgICAgICAgIHZhciBhdXhJbnN0cnVjdGlvbnMgPVxuICAgICAgICAgICAgICAgIHRoaXMuX2F1eFJvdXRlc1RvVW5yZXNvbHZlZChjYW5kaWRhdGUucmVtYWluaW5nQXV4LCBhdXhQYXJlbnRJbnN0cnVjdGlvbnMpO1xuICAgICAgICAgICAgdmFyIGluc3RydWN0aW9uID0gbmV3IFJlc29sdmVkSW5zdHJ1Y3Rpb24oY2FuZGlkYXRlLmluc3RydWN0aW9uLCBudWxsLCBhdXhJbnN0cnVjdGlvbnMpO1xuXG4gICAgICAgICAgICBpZiAoY2FuZGlkYXRlLmluc3RydWN0aW9uLnRlcm1pbmFsKSB7XG4gICAgICAgICAgICAgIHJldHVybiBpbnN0cnVjdGlvbjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIG5ld0FuY2VzdG9yQ29tcG9uZW50cyA9IGFuY2VzdG9ySW5zdHJ1Y3Rpb25zLmNvbmNhdChbaW5zdHJ1Y3Rpb25dKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlY29nbml6ZShjYW5kaWRhdGUucmVtYWluaW5nLCBuZXdBbmNlc3RvckNvbXBvbmVudHMpXG4gICAgICAgICAgICAgICAgLnRoZW4oKGNoaWxkSW5zdHJ1Y3Rpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmIChpc0JsYW5rKGNoaWxkSW5zdHJ1Y3Rpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAvLyByZWRpcmVjdCBpbnN0cnVjdGlvbnMgYXJlIGFscmVhZHkgYWJzb2x1dGVcbiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZEluc3RydWN0aW9uIGluc3RhbmNlb2YgUmVkaXJlY3RJbnN0cnVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRJbnN0cnVjdGlvbjtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uLmNoaWxkID0gY2hpbGRJbnN0cnVjdGlvbjtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBpbnN0cnVjdGlvbjtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY2FuZGlkYXRlIGluc3RhbmNlb2YgUmVkaXJlY3RNYXRjaCkge1xuICAgICAgICAgICAgdmFyIGluc3RydWN0aW9uID0gdGhpcy5nZW5lcmF0ZShjYW5kaWRhdGUucmVkaXJlY3RUbywgYW5jZXN0b3JJbnN0cnVjdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWRpcmVjdEluc3RydWN0aW9uKGluc3RydWN0aW9uLmNvbXBvbmVudCwgaW5zdHJ1Y3Rpb24uY2hpbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24uYXV4SW5zdHJ1Y3Rpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuXG4gICAgaWYgKChpc0JsYW5rKHBhcnNlZFVybCkgfHwgcGFyc2VkVXJsLnBhdGggPT0gJycpICYmIHBvc3NpYmxlTWF0Y2hlcy5sZW5ndGggPT0gMCkge1xuICAgICAgcmV0dXJuIFByb21pc2VXcmFwcGVyLnJlc29sdmUodGhpcy5nZW5lcmF0ZURlZmF1bHQocGFyZW50Q29tcG9uZW50KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2VXcmFwcGVyLmFsbChtYXRjaFByb21pc2VzKS50aGVuKG1vc3RTcGVjaWZpYyk7XG4gIH1cblxuICBwcml2YXRlIF9hdXhSb3V0ZXNUb1VucmVzb2x2ZWQoYXV4Um91dGVzOiBVcmxbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudEluc3RydWN0aW9uczogSW5zdHJ1Y3Rpb25bXSk6IHtba2V5OiBzdHJpbmddOiBJbnN0cnVjdGlvbn0ge1xuICAgIHZhciB1bnJlc29sdmVkQXV4SW5zdHJ1Y3Rpb25zOiB7W2tleTogc3RyaW5nXTogSW5zdHJ1Y3Rpb259ID0ge307XG5cbiAgICBhdXhSb3V0ZXMuZm9yRWFjaCgoYXV4VXJsOiBVcmwpID0+IHtcbiAgICAgIHVucmVzb2x2ZWRBdXhJbnN0cnVjdGlvbnNbYXV4VXJsLnBhdGhdID0gbmV3IFVucmVzb2x2ZWRJbnN0cnVjdGlvbihcbiAgICAgICAgICAoKSA9PiB7IHJldHVybiB0aGlzLl9yZWNvZ25pemUoYXV4VXJsLCBwYXJlbnRJbnN0cnVjdGlvbnMsIHRydWUpOyB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiB1bnJlc29sdmVkQXV4SW5zdHJ1Y3Rpb25zO1xuICB9XG5cblxuICAvKipcbiAgICogR2l2ZW4gYSBub3JtYWxpemVkIGxpc3Qgd2l0aCBjb21wb25lbnQgbmFtZXMgYW5kIHBhcmFtcyBsaWtlOiBgWyd1c2VyJywge2lkOiAzIH1dYFxuICAgKiBnZW5lcmF0ZXMgYSB1cmwgd2l0aCBhIGxlYWRpbmcgc2xhc2ggcmVsYXRpdmUgdG8gdGhlIHByb3ZpZGVkIGBwYXJlbnRDb21wb25lbnRgLlxuICAgKlxuICAgKiBJZiB0aGUgb3B0aW9uYWwgcGFyYW0gYF9hdXhgIGlzIGB0cnVlYCwgdGhlbiB3ZSBnZW5lcmF0ZSBzdGFydGluZyBhdCBhbiBhdXhpbGlhcnlcbiAgICogcm91dGUgYm91bmRhcnkuXG4gICAqL1xuICBnZW5lcmF0ZShsaW5rUGFyYW1zOiBhbnlbXSwgYW5jZXN0b3JJbnN0cnVjdGlvbnM6IEluc3RydWN0aW9uW10sIF9hdXggPSBmYWxzZSk6IEluc3RydWN0aW9uIHtcbiAgICBsZXQgbm9ybWFsaXplZExpbmtQYXJhbXMgPSBzcGxpdEFuZEZsYXR0ZW5MaW5rUGFyYW1zKGxpbmtQYXJhbXMpO1xuXG4gICAgdmFyIGZpcnN0ID0gTGlzdFdyYXBwZXIuZmlyc3Qobm9ybWFsaXplZExpbmtQYXJhbXMpO1xuICAgIHZhciByZXN0ID0gTGlzdFdyYXBwZXIuc2xpY2Uobm9ybWFsaXplZExpbmtQYXJhbXMsIDEpO1xuXG4gICAgLy8gVGhlIGZpcnN0IHNlZ21lbnQgc2hvdWxkIGJlIGVpdGhlciAnLicgKGdlbmVyYXRlIGZyb20gcGFyZW50KSBvciAnJyAoZ2VuZXJhdGUgZnJvbSByb290KS5cbiAgICAvLyBXaGVuIHdlIG5vcm1hbGl6ZSBhYm92ZSwgd2Ugc3RyaXAgYWxsIHRoZSBzbGFzaGVzLCAnLi8nIGJlY29tZXMgJy4nIGFuZCAnLycgYmVjb21lcyAnJy5cbiAgICBpZiAoZmlyc3QgPT0gJycpIHtcbiAgICAgIGFuY2VzdG9ySW5zdHJ1Y3Rpb25zID0gW107XG4gICAgfSBlbHNlIGlmIChmaXJzdCA9PSAnLi4nKSB7XG4gICAgICAvLyB3ZSBhbHJlYWR5IGNhcHR1cmVkIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiBcIi4uXCIsIHNvIHdlIG5lZWQgdG8gcG9wIG9mZiBhbiBhbmNlc3RvclxuICAgICAgYW5jZXN0b3JJbnN0cnVjdGlvbnMucG9wKCk7XG4gICAgICB3aGlsZSAoTGlzdFdyYXBwZXIuZmlyc3QocmVzdCkgPT0gJy4uJykge1xuICAgICAgICByZXN0ID0gTGlzdFdyYXBwZXIuc2xpY2UocmVzdCwgMSk7XG4gICAgICAgIGFuY2VzdG9ySW5zdHJ1Y3Rpb25zLnBvcCgpO1xuICAgICAgICBpZiAoYW5jZXN0b3JJbnN0cnVjdGlvbnMubGVuZ3RoIDw9IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihcbiAgICAgICAgICAgICAgYExpbmsgXCIke0xpc3RXcmFwcGVyLnRvSlNPTihsaW5rUGFyYW1zKX1cIiBoYXMgdG9vIG1hbnkgXCIuLi9cIiBzZWdtZW50cy5gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZmlyc3QgIT0gJy4nKSB7XG4gICAgICBsZXQgcGFyZW50Q29tcG9uZW50ID0gdGhpcy5fcm9vdENvbXBvbmVudDtcbiAgICAgIGxldCBncmFuZHBhcmVudENvbXBvbmVudCA9IG51bGw7XG4gICAgICBpZiAoYW5jZXN0b3JJbnN0cnVjdGlvbnMubGVuZ3RoID4gMSkge1xuICAgICAgICBwYXJlbnRDb21wb25lbnQgPVxuICAgICAgICAgICAgYW5jZXN0b3JJbnN0cnVjdGlvbnNbYW5jZXN0b3JJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uY29tcG9uZW50LmNvbXBvbmVudFR5cGU7XG4gICAgICAgIGdyYW5kcGFyZW50Q29tcG9uZW50ID1cbiAgICAgICAgICAgIGFuY2VzdG9ySW5zdHJ1Y3Rpb25zW2FuY2VzdG9ySW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDJdLmNvbXBvbmVudC5jb21wb25lbnRUeXBlO1xuICAgICAgfSBlbHNlIGlmIChhbmNlc3Rvckluc3RydWN0aW9ucy5sZW5ndGggPT0gMSkge1xuICAgICAgICBwYXJlbnRDb21wb25lbnQgPSBhbmNlc3Rvckluc3RydWN0aW9uc1swXS5jb21wb25lbnQuY29tcG9uZW50VHlwZTtcbiAgICAgICAgZ3JhbmRwYXJlbnRDb21wb25lbnQgPSB0aGlzLl9yb290Q29tcG9uZW50O1xuICAgICAgfVxuXG4gICAgICAvLyBGb3IgYSBsaW5rIHdpdGggbm8gbGVhZGluZyBgLi9gLCBgL2AsIG9yIGAuLi9gLCB3ZSBsb29rIGZvciBhIHNpYmxpbmcgYW5kIGNoaWxkLlxuICAgICAgLy8gSWYgYm90aCBleGlzdCwgd2UgdGhyb3cuIE90aGVyd2lzZSwgd2UgcHJlZmVyIHdoaWNoZXZlciBleGlzdHMuXG4gICAgICB2YXIgY2hpbGRSb3V0ZUV4aXN0cyA9IHRoaXMuaGFzUm91dGUoZmlyc3QsIHBhcmVudENvbXBvbmVudCk7XG4gICAgICB2YXIgcGFyZW50Um91dGVFeGlzdHMgPVxuICAgICAgICAgIGlzUHJlc2VudChncmFuZHBhcmVudENvbXBvbmVudCkgJiYgdGhpcy5oYXNSb3V0ZShmaXJzdCwgZ3JhbmRwYXJlbnRDb21wb25lbnQpO1xuXG4gICAgICBpZiAocGFyZW50Um91dGVFeGlzdHMgJiYgY2hpbGRSb3V0ZUV4aXN0cykge1xuICAgICAgICBsZXQgbXNnID1cbiAgICAgICAgICAgIGBMaW5rIFwiJHtMaXN0V3JhcHBlci50b0pTT04obGlua1BhcmFtcyl9XCIgaXMgYW1iaWd1b3VzLCB1c2UgXCIuL1wiIG9yIFwiLi4vXCIgdG8gZGlzYW1iaWd1YXRlLmA7XG4gICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKG1zZyk7XG4gICAgICB9XG4gICAgICBpZiAocGFyZW50Um91dGVFeGlzdHMpIHtcbiAgICAgICAgYW5jZXN0b3JJbnN0cnVjdGlvbnMucG9wKCk7XG4gICAgICB9XG4gICAgICByZXN0ID0gbGlua1BhcmFtcztcbiAgICB9XG5cbiAgICBpZiAocmVzdFtyZXN0Lmxlbmd0aCAtIDFdID09ICcnKSB7XG4gICAgICByZXN0LnBvcCgpO1xuICAgIH1cblxuICAgIGlmIChyZXN0Lmxlbmd0aCA8IDEpIHtcbiAgICAgIGxldCBtc2cgPSBgTGluayBcIiR7TGlzdFdyYXBwZXIudG9KU09OKGxpbmtQYXJhbXMpfVwiIG11c3QgaW5jbHVkZSBhIHJvdXRlIG5hbWUuYDtcbiAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKG1zZyk7XG4gICAgfVxuXG4gICAgdmFyIGdlbmVyYXRlZEluc3RydWN0aW9uID0gdGhpcy5fZ2VuZXJhdGUocmVzdCwgYW5jZXN0b3JJbnN0cnVjdGlvbnMsIF9hdXgpO1xuXG4gICAgZm9yICh2YXIgaSA9IGFuY2VzdG9ySW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBsZXQgYW5jZXN0b3JJbnN0cnVjdGlvbiA9IGFuY2VzdG9ySW5zdHJ1Y3Rpb25zW2ldO1xuICAgICAgZ2VuZXJhdGVkSW5zdHJ1Y3Rpb24gPSBhbmNlc3Rvckluc3RydWN0aW9uLnJlcGxhY2VDaGlsZChnZW5lcmF0ZWRJbnN0cnVjdGlvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdlbmVyYXRlZEluc3RydWN0aW9uO1xuICB9XG5cblxuICAvKlxuICAgKiBJbnRlcm5hbCBoZWxwZXIgdGhhdCBkb2VzIG5vdCBtYWtlIGFueSBhc3NlcnRpb25zIGFib3V0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmsgRFNMXG4gICAqL1xuICBwcml2YXRlIF9nZW5lcmF0ZShsaW5rUGFyYW1zOiBhbnlbXSwgYW5jZXN0b3JJbnN0cnVjdGlvbnM6IEluc3RydWN0aW9uW10sXG4gICAgICAgICAgICAgICAgICAgIF9hdXggPSBmYWxzZSk6IEluc3RydWN0aW9uIHtcbiAgICBsZXQgcGFyZW50Q29tcG9uZW50ID1cbiAgICAgICAgYW5jZXN0b3JJbnN0cnVjdGlvbnMubGVuZ3RoID4gMCA/XG4gICAgICAgICAgICBhbmNlc3Rvckluc3RydWN0aW9uc1thbmNlc3Rvckluc3RydWN0aW9ucy5sZW5ndGggLSAxXS5jb21wb25lbnQuY29tcG9uZW50VHlwZSA6XG4gICAgICAgICAgICB0aGlzLl9yb290Q29tcG9uZW50O1xuXG5cbiAgICBpZiAobGlua1BhcmFtcy5sZW5ndGggPT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVEZWZhdWx0KHBhcmVudENvbXBvbmVudCk7XG4gICAgfVxuICAgIGxldCBsaW5rSW5kZXggPSAwO1xuICAgIGxldCByb3V0ZU5hbWUgPSBsaW5rUGFyYW1zW2xpbmtJbmRleF07XG5cbiAgICBpZiAoIWlzU3RyaW5nKHJvdXRlTmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBVbmV4cGVjdGVkIHNlZ21lbnQgXCIke3JvdXRlTmFtZX1cIiBpbiBsaW5rIERTTC4gRXhwZWN0ZWQgYSBzdHJpbmcuYCk7XG4gICAgfSBlbHNlIGlmIChyb3V0ZU5hbWUgPT0gJycgfHwgcm91dGVOYW1lID09ICcuJyB8fCByb3V0ZU5hbWUgPT0gJy4uJykge1xuICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYFwiJHtyb3V0ZU5hbWV9L1wiIGlzIG9ubHkgYWxsb3dlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluayBEU0wuYCk7XG4gICAgfVxuXG4gICAgbGV0IHBhcmFtcyA9IHt9O1xuICAgIGlmIChsaW5rSW5kZXggKyAxIDwgbGlua1BhcmFtcy5sZW5ndGgpIHtcbiAgICAgIGxldCBuZXh0U2VnbWVudCA9IGxpbmtQYXJhbXNbbGlua0luZGV4ICsgMV07XG4gICAgICBpZiAoaXNTdHJpbmdNYXAobmV4dFNlZ21lbnQpICYmICFpc0FycmF5KG5leHRTZWdtZW50KSkge1xuICAgICAgICBwYXJhbXMgPSBuZXh0U2VnbWVudDtcbiAgICAgICAgbGlua0luZGV4ICs9IDE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGF1eEluc3RydWN0aW9uczoge1trZXk6IHN0cmluZ106IEluc3RydWN0aW9ufSA9IHt9O1xuICAgIHZhciBuZXh0U2VnbWVudDtcbiAgICB3aGlsZSAobGlua0luZGV4ICsgMSA8IGxpbmtQYXJhbXMubGVuZ3RoICYmIGlzQXJyYXkobmV4dFNlZ21lbnQgPSBsaW5rUGFyYW1zW2xpbmtJbmRleCArIDFdKSkge1xuICAgICAgbGV0IGF1eFBhcmVudEluc3RydWN0aW9uID0gYW5jZXN0b3JJbnN0cnVjdGlvbnMubGVuZ3RoID4gMCA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FuY2VzdG9ySW5zdHJ1Y3Rpb25zW2FuY2VzdG9ySW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdXSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW107XG4gICAgICBsZXQgYXV4SW5zdHJ1Y3Rpb24gPSB0aGlzLl9nZW5lcmF0ZShuZXh0U2VnbWVudCwgYXV4UGFyZW50SW5zdHJ1Y3Rpb24sIHRydWUpO1xuXG4gICAgICAvLyBUT0RPOiB0aGlzIHdpbGwgbm90IHdvcmsgZm9yIGF1eCByb3V0ZXMgd2l0aCBwYXJhbWV0ZXJzIG9yIG11bHRpcGxlIHNlZ21lbnRzXG4gICAgICBhdXhJbnN0cnVjdGlvbnNbYXV4SW5zdHJ1Y3Rpb24uY29tcG9uZW50LnVybFBhdGhdID0gYXV4SW5zdHJ1Y3Rpb247XG4gICAgICBsaW5rSW5kZXggKz0gMTtcbiAgICB9XG5cbiAgICB2YXIgY29tcG9uZW50UmVjb2duaXplciA9IHRoaXMuX3J1bGVzLmdldChwYXJlbnRDb21wb25lbnQpO1xuICAgIGlmIChpc0JsYW5rKGNvbXBvbmVudFJlY29nbml6ZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihcbiAgICAgICAgICBgQ29tcG9uZW50IFwiJHtnZXRUeXBlTmFtZUZvckRlYnVnZ2luZyhwYXJlbnRDb21wb25lbnQpfVwiIGhhcyBubyByb3V0ZSBjb25maWcuYCk7XG4gICAgfVxuXG4gICAgdmFyIHJvdXRlUmVjb2duaXplciA9XG4gICAgICAgIChfYXV4ID8gY29tcG9uZW50UmVjb2duaXplci5hdXhOYW1lcyA6IGNvbXBvbmVudFJlY29nbml6ZXIubmFtZXMpLmdldChyb3V0ZU5hbWUpO1xuXG4gICAgaWYgKCFpc1ByZXNlbnQocm91dGVSZWNvZ25pemVyKSkge1xuICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oXG4gICAgICAgICAgYENvbXBvbmVudCBcIiR7Z2V0VHlwZU5hbWVGb3JEZWJ1Z2dpbmcocGFyZW50Q29tcG9uZW50KX1cIiBoYXMgbm8gcm91dGUgbmFtZWQgXCIke3JvdXRlTmFtZX1cIi5gKTtcbiAgICB9XG5cbiAgICBpZiAoIWlzUHJlc2VudChyb3V0ZVJlY29nbml6ZXIuaGFuZGxlci5jb21wb25lbnRUeXBlKSkge1xuICAgICAgdmFyIGNvbXBJbnN0cnVjdGlvbiA9IHJvdXRlUmVjb2duaXplci5nZW5lcmF0ZUNvbXBvbmVudFBhdGhWYWx1ZXMocGFyYW1zKTtcbiAgICAgIHJldHVybiBuZXcgVW5yZXNvbHZlZEluc3RydWN0aW9uKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHJvdXRlUmVjb2duaXplci5oYW5kbGVyLnJlc29sdmVDb21wb25lbnRUeXBlKCkudGhlbihcbiAgICAgICAgICAgIChfKSA9PiB7IHJldHVybiB0aGlzLl9nZW5lcmF0ZShsaW5rUGFyYW1zLCBhbmNlc3Rvckluc3RydWN0aW9ucywgX2F1eCk7IH0pO1xuICAgICAgfSwgY29tcEluc3RydWN0aW9uWyd1cmxQYXRoJ10sIGNvbXBJbnN0cnVjdGlvblsndXJsUGFyYW1zJ10pO1xuICAgIH1cblxuICAgIHZhciBjb21wb25lbnRJbnN0cnVjdGlvbiA9IF9hdXggPyBjb21wb25lbnRSZWNvZ25pemVyLmdlbmVyYXRlQXV4aWxpYXJ5KHJvdXRlTmFtZSwgcGFyYW1zKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFJlY29nbml6ZXIuZ2VuZXJhdGUocm91dGVOYW1lLCBwYXJhbXMpO1xuXG5cblxuICAgIHZhciByZW1haW5pbmcgPSBsaW5rUGFyYW1zLnNsaWNlKGxpbmtJbmRleCArIDEpO1xuXG4gICAgdmFyIGluc3RydWN0aW9uID0gbmV3IFJlc29sdmVkSW5zdHJ1Y3Rpb24oY29tcG9uZW50SW5zdHJ1Y3Rpb24sIG51bGwsIGF1eEluc3RydWN0aW9ucyk7XG5cbiAgICAvLyB0aGUgY29tcG9uZW50IGlzIHN5bmNcbiAgICBpZiAoaXNQcmVzZW50KGNvbXBvbmVudEluc3RydWN0aW9uLmNvbXBvbmVudFR5cGUpKSB7XG4gICAgICBsZXQgY2hpbGRJbnN0cnVjdGlvbjogSW5zdHJ1Y3Rpb24gPSBudWxsO1xuICAgICAgaWYgKGxpbmtJbmRleCArIDEgPCBsaW5rUGFyYW1zLmxlbmd0aCkge1xuICAgICAgICBsZXQgY2hpbGRBbmNlc3RvckNvbXBvbmVudHMgPSBhbmNlc3Rvckluc3RydWN0aW9ucy5jb25jYXQoW2luc3RydWN0aW9uXSk7XG4gICAgICAgIGNoaWxkSW5zdHJ1Y3Rpb24gPSB0aGlzLl9nZW5lcmF0ZShyZW1haW5pbmcsIGNoaWxkQW5jZXN0b3JDb21wb25lbnRzKTtcbiAgICAgIH0gZWxzZSBpZiAoIWNvbXBvbmVudEluc3RydWN0aW9uLnRlcm1pbmFsKSB7XG4gICAgICAgIC8vIC4uLiBsb29rIGZvciBkZWZhdWx0c1xuICAgICAgICBjaGlsZEluc3RydWN0aW9uID0gdGhpcy5nZW5lcmF0ZURlZmF1bHQoY29tcG9uZW50SW5zdHJ1Y3Rpb24uY29tcG9uZW50VHlwZSk7XG5cbiAgICAgICAgaWYgKGlzQmxhbmsoY2hpbGRJbnN0cnVjdGlvbikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihcbiAgICAgICAgICAgICAgYExpbmsgXCIke0xpc3RXcmFwcGVyLnRvSlNPTihsaW5rUGFyYW1zKX1cIiBkb2VzIG5vdCByZXNvbHZlIHRvIGEgdGVybWluYWwgaW5zdHJ1Y3Rpb24uYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGluc3RydWN0aW9uLmNoaWxkID0gY2hpbGRJbnN0cnVjdGlvbjtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5zdHJ1Y3Rpb247XG4gIH1cblxuICBwdWJsaWMgaGFzUm91dGUobmFtZTogc3RyaW5nLCBwYXJlbnRDb21wb25lbnQ6IGFueSk6IGJvb2xlYW4ge1xuICAgIHZhciBjb21wb25lbnRSZWNvZ25pemVyOiBDb21wb25lbnRSZWNvZ25pemVyID0gdGhpcy5fcnVsZXMuZ2V0KHBhcmVudENvbXBvbmVudCk7XG4gICAgaWYgKGlzQmxhbmsoY29tcG9uZW50UmVjb2duaXplcikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbXBvbmVudFJlY29nbml6ZXIuaGFzUm91dGUobmFtZSk7XG4gIH1cblxuICBwdWJsaWMgZ2VuZXJhdGVEZWZhdWx0KGNvbXBvbmVudEN1cnNvcjogVHlwZSk6IEluc3RydWN0aW9uIHtcbiAgICBpZiAoaXNCbGFuayhjb21wb25lbnRDdXJzb3IpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgY29tcG9uZW50UmVjb2duaXplciA9IHRoaXMuX3J1bGVzLmdldChjb21wb25lbnRDdXJzb3IpO1xuICAgIGlmIChpc0JsYW5rKGNvbXBvbmVudFJlY29nbml6ZXIpIHx8IGlzQmxhbmsoY29tcG9uZW50UmVjb2duaXplci5kZWZhdWx0Um91dGUpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cblxuICAgIHZhciBkZWZhdWx0Q2hpbGQgPSBudWxsO1xuICAgIGlmIChpc1ByZXNlbnQoY29tcG9uZW50UmVjb2duaXplci5kZWZhdWx0Um91dGUuaGFuZGxlci5jb21wb25lbnRUeXBlKSkge1xuICAgICAgdmFyIGNvbXBvbmVudEluc3RydWN0aW9uID0gY29tcG9uZW50UmVjb2duaXplci5kZWZhdWx0Um91dGUuZ2VuZXJhdGUoe30pO1xuICAgICAgaWYgKCFjb21wb25lbnRSZWNvZ25pemVyLmRlZmF1bHRSb3V0ZS50ZXJtaW5hbCkge1xuICAgICAgICBkZWZhdWx0Q2hpbGQgPSB0aGlzLmdlbmVyYXRlRGVmYXVsdChjb21wb25lbnRSZWNvZ25pemVyLmRlZmF1bHRSb3V0ZS5oYW5kbGVyLmNvbXBvbmVudFR5cGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0SW5zdHJ1Y3Rpb24oY29tcG9uZW50SW5zdHJ1Y3Rpb24sIGRlZmF1bHRDaGlsZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBVbnJlc29sdmVkSW5zdHJ1Y3Rpb24oKCkgPT4ge1xuICAgICAgcmV0dXJuIGNvbXBvbmVudFJlY29nbml6ZXIuZGVmYXVsdFJvdXRlLmhhbmRsZXIucmVzb2x2ZUNvbXBvbmVudFR5cGUoKS50aGVuKFxuICAgICAgICAgIChfKSA9PiB0aGlzLmdlbmVyYXRlRGVmYXVsdChjb21wb25lbnRDdXJzb3IpKTtcbiAgICB9KTtcbiAgfVxufVxuXG4vKlxuICogR2l2ZW46IFsnL2EvYicsIHtjOiAyfV1cbiAqIFJldHVybnM6IFsnJywgJ2EnLCAnYicsIHtjOiAyfV1cbiAqL1xuZnVuY3Rpb24gc3BsaXRBbmRGbGF0dGVuTGlua1BhcmFtcyhsaW5rUGFyYW1zOiBhbnlbXSk6IGFueVtdIHtcbiAgcmV0dXJuIGxpbmtQYXJhbXMucmVkdWNlKChhY2N1bXVsYXRpb246IGFueVtdLCBpdGVtKSA9PiB7XG4gICAgaWYgKGlzU3RyaW5nKGl0ZW0pKSB7XG4gICAgICBsZXQgc3RySXRlbTogc3RyaW5nID0gaXRlbTtcbiAgICAgIHJldHVybiBhY2N1bXVsYXRpb24uY29uY2F0KHN0ckl0ZW0uc3BsaXQoJy8nKSk7XG4gICAgfVxuICAgIGFjY3VtdWxhdGlvbi5wdXNoKGl0ZW0pO1xuICAgIHJldHVybiBhY2N1bXVsYXRpb247XG4gIH0sIFtdKTtcbn1cblxuLypcbiAqIEdpdmVuIGEgbGlzdCBvZiBpbnN0cnVjdGlvbnMsIHJldHVybnMgdGhlIG1vc3Qgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25cbiAqL1xuZnVuY3Rpb24gbW9zdFNwZWNpZmljKGluc3RydWN0aW9uczogSW5zdHJ1Y3Rpb25bXSk6IEluc3RydWN0aW9uIHtcbiAgcmV0dXJuIExpc3RXcmFwcGVyLm1heGltdW0oaW5zdHJ1Y3Rpb25zLCAoaW5zdHJ1Y3Rpb246IEluc3RydWN0aW9uKSA9PiBpbnN0cnVjdGlvbi5zcGVjaWZpY2l0eSk7XG59XG5cbmZ1bmN0aW9uIGFzc2VydFRlcm1pbmFsQ29tcG9uZW50KGNvbXBvbmVudCwgcGF0aCkge1xuICBpZiAoIWlzVHlwZShjb21wb25lbnQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGFubm90YXRpb25zID0gcmVmbGVjdG9yLmFubm90YXRpb25zKGNvbXBvbmVudCk7XG4gIGlmIChpc1ByZXNlbnQoYW5ub3RhdGlvbnMpKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbm5vdGF0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGFubm90YXRpb24gPSBhbm5vdGF0aW9uc1tpXTtcblxuICAgICAgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBSb3V0ZUNvbmZpZykge1xuICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihcbiAgICAgICAgICAgIGBDaGlsZCByb3V0ZXMgYXJlIG5vdCBhbGxvd2VkIGZvciBcIiR7cGF0aH1cIi4gVXNlIFwiLi4uXCIgb24gdGhlIHBhcmVudCdzIHJvdXRlIHBhdGguYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvcm91dGVyL3JvdXRlX3JlZ2lzdHJ5LnRzXG4gKiovIiwiaW1wb3J0IHtDT05TVCwgVHlwZSwgaXNQcmVzZW50fSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtSb3V0ZURlZmluaXRpb259IGZyb20gJy4vcm91dGVfZGVmaW5pdGlvbic7XG5leHBvcnQge1JvdXRlRGVmaW5pdGlvbn0gZnJvbSAnLi9yb3V0ZV9kZWZpbml0aW9uJztcblxuLyoqXG4gKiBUaGUgYFJvdXRlQ29uZmlnYCBkZWNvcmF0b3IgZGVmaW5lcyByb3V0ZXMgZm9yIGEgZ2l2ZW4gY29tcG9uZW50LlxuICpcbiAqIEl0IHRha2VzIGFuIGFycmF5IG9mIHtAbGluayBSb3V0ZURlZmluaXRpb259cy5cbiAqL1xuQENPTlNUKClcbmV4cG9ydCBjbGFzcyBSb3V0ZUNvbmZpZyB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBjb25maWdzOiBSb3V0ZURlZmluaXRpb25bXSkge31cbn1cblxuLyoqXG4gKiBgUm91dGVgIGlzIGEgdHlwZSBvZiB7QGxpbmsgUm91dGVEZWZpbml0aW9ufSB1c2VkIHRvIHJvdXRlIGEgcGF0aCB0byBhIGNvbXBvbmVudC5cbiAqXG4gKiBJdCBoYXMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICogLSBgcGF0aGAgaXMgYSBzdHJpbmcgdGhhdCB1c2VzIHRoZSByb3V0ZSBtYXRjaGVyIERTTC5cbiAqIC0gYGNvbXBvbmVudGAgYSBjb21wb25lbnQgdHlwZS5cbiAqIC0gYG5hbWVgIGlzIGFuIG9wdGlvbmFsIGBDYW1lbENhc2VgIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG5hbWUgb2YgdGhlIHJvdXRlLlxuICogLSBgZGF0YWAgaXMgYW4gb3B0aW9uYWwgcHJvcGVydHkgb2YgYW55IHR5cGUgcmVwcmVzZW50aW5nIGFyYml0cmFyeSByb3V0ZSBtZXRhZGF0YSBmb3IgdGhlIGdpdmVuXG4gKiByb3V0ZS4gSXQgaXMgaW5qZWN0YWJsZSB2aWEge0BsaW5rIFJvdXRlRGF0YX0uXG4gKiAtIGB1c2VBc0RlZmF1bHRgIGlzIGEgYm9vbGVhbiB2YWx1ZS4gSWYgYHRydWVgLCB0aGUgY2hpbGQgcm91dGUgd2lsbCBiZSBuYXZpZ2F0ZWQgdG8gaWYgbm8gY2hpbGRcbiAqIHJvdXRlIGlzIHNwZWNpZmllZCBkdXJpbmcgdGhlIG5hdmlnYXRpb24uXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqIGBgYFxuICogaW1wb3J0IHtSb3V0ZUNvbmZpZ30gZnJvbSAnYW5ndWxhcjIvcm91dGVyJztcbiAqXG4gKiBAUm91dGVDb25maWcoW1xuICogICB7cGF0aDogJy9ob21lJywgY29tcG9uZW50OiBIb21lQ21wLCBuYW1lOiAnSG9tZUNtcCcgfVxuICogXSlcbiAqIGNsYXNzIE15QXBwIHt9XG4gKiBgYGBcbiAqL1xuQENPTlNUKClcbmV4cG9ydCBjbGFzcyBSb3V0ZSBpbXBsZW1lbnRzIFJvdXRlRGVmaW5pdGlvbiB7XG4gIGRhdGE6IHtba2V5OiBzdHJpbmddOiBhbnl9O1xuICBwYXRoOiBzdHJpbmc7XG4gIGNvbXBvbmVudDogVHlwZTtcbiAgbmFtZTogc3RyaW5nO1xuICB1c2VBc0RlZmF1bHQ6IGJvb2xlYW47XG4gIC8vIGFkZGVkIG5leHQgdGhyZWUgcHJvcGVydGllcyB0byB3b3JrIGFyb3VuZCBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzQxMDdcbiAgYXV4OiBzdHJpbmcgPSBudWxsO1xuICBsb2FkZXI6IEZ1bmN0aW9uID0gbnVsbDtcbiAgcmVkaXJlY3RUbzogYW55W10gPSBudWxsO1xuICBjb25zdHJ1Y3Rvcih7cGF0aCwgY29tcG9uZW50LCBuYW1lLCBkYXRhLCB1c2VBc0RlZmF1bHR9OiB7XG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGNvbXBvbmVudDogVHlwZSwgbmFtZT86IHN0cmluZywgZGF0YT86IHtba2V5OiBzdHJpbmddOiBhbnl9LCB1c2VBc0RlZmF1bHQ/OiBib29sZWFuXG4gIH0pIHtcbiAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50O1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB0aGlzLnVzZUFzRGVmYXVsdCA9IHVzZUFzRGVmYXVsdDtcbiAgfVxufVxuXG4vKipcbiAqIGBBdXhSb3V0ZWAgaXMgYSB0eXBlIG9mIHtAbGluayBSb3V0ZURlZmluaXRpb259IHVzZWQgdG8gZGVmaW5lIGFuIGF1eGlsaWFyeSByb3V0ZS5cbiAqXG4gKiBJdCB0YWtlcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAtIGBwYXRoYCBpcyBhIHN0cmluZyB0aGF0IHVzZXMgdGhlIHJvdXRlIG1hdGNoZXIgRFNMLlxuICogLSBgY29tcG9uZW50YCBhIGNvbXBvbmVudCB0eXBlLlxuICogLSBgbmFtZWAgaXMgYW4gb3B0aW9uYWwgYENhbWVsQ2FzZWAgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbmFtZSBvZiB0aGUgcm91dGUuXG4gKiAtIGBkYXRhYCBpcyBhbiBvcHRpb25hbCBwcm9wZXJ0eSBvZiBhbnkgdHlwZSByZXByZXNlbnRpbmcgYXJiaXRyYXJ5IHJvdXRlIG1ldGFkYXRhIGZvciB0aGUgZ2l2ZW5cbiAqIHJvdXRlLiBJdCBpcyBpbmplY3RhYmxlIHZpYSB7QGxpbmsgUm91dGVEYXRhfS5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICogYGBgXG4gKiBpbXBvcnQge1JvdXRlQ29uZmlnLCBBdXhSb3V0ZX0gZnJvbSAnYW5ndWxhcjIvcm91dGVyJztcbiAqXG4gKiBAUm91dGVDb25maWcoW1xuICogICBuZXcgQXV4Um91dGUoe3BhdGg6ICcvaG9tZScsIGNvbXBvbmVudDogSG9tZUNtcH0pXG4gKiBdKVxuICogY2xhc3MgTXlBcHAge31cbiAqIGBgYFxuICovXG5AQ09OU1QoKVxuZXhwb3J0IGNsYXNzIEF1eFJvdXRlIGltcGxlbWVudHMgUm91dGVEZWZpbml0aW9uIHtcbiAgZGF0YToge1trZXk6IHN0cmluZ106IGFueX0gPSBudWxsO1xuICBwYXRoOiBzdHJpbmc7XG4gIGNvbXBvbmVudDogVHlwZTtcbiAgbmFtZTogc3RyaW5nO1xuICAvLyBhZGRlZCBuZXh0IHRocmVlIHByb3BlcnRpZXMgdG8gd29yayBhcm91bmQgaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy80MTA3XG4gIGF1eDogc3RyaW5nID0gbnVsbDtcbiAgbG9hZGVyOiBGdW5jdGlvbiA9IG51bGw7XG4gIHJlZGlyZWN0VG86IGFueVtdID0gbnVsbDtcbiAgdXNlQXNEZWZhdWx0OiBib29sZWFuID0gZmFsc2U7XG4gIGNvbnN0cnVjdG9yKHtwYXRoLCBjb21wb25lbnQsIG5hbWV9OiB7cGF0aDogc3RyaW5nLCBjb21wb25lbnQ6IFR5cGUsIG5hbWU/OiBzdHJpbmd9KSB7XG4gICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICB9XG59XG5cbi8qKlxuICogYEFzeW5jUm91dGVgIGlzIGEgdHlwZSBvZiB7QGxpbmsgUm91dGVEZWZpbml0aW9ufSB1c2VkIHRvIHJvdXRlIGEgcGF0aCB0byBhbiBhc3luY2hyb25vdXNseVxuICogbG9hZGVkIGNvbXBvbmVudC5cbiAqXG4gKiBJdCBoYXMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICogLSBgcGF0aGAgaXMgYSBzdHJpbmcgdGhhdCB1c2VzIHRoZSByb3V0ZSBtYXRjaGVyIERTTC5cbiAqIC0gYGxvYWRlcmAgaXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBjb21wb25lbnQuXG4gKiAtIGBuYW1lYCBpcyBhbiBvcHRpb25hbCBgQ2FtZWxDYXNlYCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBuYW1lIG9mIHRoZSByb3V0ZS5cbiAqIC0gYGRhdGFgIGlzIGFuIG9wdGlvbmFsIHByb3BlcnR5IG9mIGFueSB0eXBlIHJlcHJlc2VudGluZyBhcmJpdHJhcnkgcm91dGUgbWV0YWRhdGEgZm9yIHRoZSBnaXZlblxuICogcm91dGUuIEl0IGlzIGluamVjdGFibGUgdmlhIHtAbGluayBSb3V0ZURhdGF9LlxuICogLSBgdXNlQXNEZWZhdWx0YCBpcyBhIGJvb2xlYW4gdmFsdWUuIElmIGB0cnVlYCwgdGhlIGNoaWxkIHJvdXRlIHdpbGwgYmUgbmF2aWdhdGVkIHRvIGlmIG5vIGNoaWxkXG4gKiByb3V0ZSBpcyBzcGVjaWZpZWQgZHVyaW5nIHRoZSBuYXZpZ2F0aW9uLlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKiBgYGBcbiAqIGltcG9ydCB7Um91dGVDb25maWd9IGZyb20gJ2FuZ3VsYXIyL3JvdXRlcic7XG4gKlxuICogQFJvdXRlQ29uZmlnKFtcbiAqICAge3BhdGg6ICcvaG9tZScsIGxvYWRlcjogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKE15TG9hZGVkQ21wKSwgbmFtZTogJ015TG9hZGVkQ21wJ31cbiAqIF0pXG4gKiBjbGFzcyBNeUFwcCB7fVxuICogYGBgXG4gKi9cbkBDT05TVCgpXG5leHBvcnQgY2xhc3MgQXN5bmNSb3V0ZSBpbXBsZW1lbnRzIFJvdXRlRGVmaW5pdGlvbiB7XG4gIGRhdGE6IHtba2V5OiBzdHJpbmddOiBhbnl9O1xuICBwYXRoOiBzdHJpbmc7XG4gIGxvYWRlcjogRnVuY3Rpb247XG4gIG5hbWU6IHN0cmluZztcbiAgdXNlQXNEZWZhdWx0OiBib29sZWFuO1xuICBhdXg6IHN0cmluZyA9IG51bGw7XG4gIGNvbnN0cnVjdG9yKHtwYXRoLCBsb2FkZXIsIG5hbWUsIGRhdGEsIHVzZUFzRGVmYXVsdH06IHtcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgbG9hZGVyOiBGdW5jdGlvbiwgbmFtZT86IHN0cmluZywgZGF0YT86IHtba2V5OiBzdHJpbmddOiBhbnl9LCB1c2VBc0RlZmF1bHQ/OiBib29sZWFuXG4gIH0pIHtcbiAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgIHRoaXMubG9hZGVyID0gbG9hZGVyO1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB0aGlzLnVzZUFzRGVmYXVsdCA9IHVzZUFzRGVmYXVsdDtcbiAgfVxufVxuXG4vKipcbiAqIGBSZWRpcmVjdGAgaXMgYSB0eXBlIG9mIHtAbGluayBSb3V0ZURlZmluaXRpb259IHVzZWQgdG8gcm91dGUgYSBwYXRoIHRvIGEgY2Fub25pY2FsIHJvdXRlLlxuICpcbiAqIEl0IGhhcyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAtIGBwYXRoYCBpcyBhIHN0cmluZyB0aGF0IHVzZXMgdGhlIHJvdXRlIG1hdGNoZXIgRFNMLlxuICogLSBgcmVkaXJlY3RUb2AgaXMgYW4gYXJyYXkgcmVwcmVzZW50aW5nIHRoZSBsaW5rIERTTC5cbiAqXG4gKiBOb3RlIHRoYXQgcmVkaXJlY3RzICoqZG8gbm90KiogYWZmZWN0IGhvdyBsaW5rcyBhcmUgZ2VuZXJhdGVkLiBGb3IgdGhhdCwgc2VlIHRoZSBgdXNlQXNEZWZhdWx0YFxuICogb3B0aW9uLlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKiBgYGBcbiAqIGltcG9ydCB7Um91dGVDb25maWd9IGZyb20gJ2FuZ3VsYXIyL3JvdXRlcic7XG4gKlxuICogQFJvdXRlQ29uZmlnKFtcbiAqICAge3BhdGg6ICcvJywgcmVkaXJlY3RUbzogWycvSG9tZSddIH0sXG4gKiAgIHtwYXRoOiAnL2hvbWUnLCBjb21wb25lbnQ6IEhvbWVDbXAsIG5hbWU6ICdIb21lJ31cbiAqIF0pXG4gKiBjbGFzcyBNeUFwcCB7fVxuICogYGBgXG4gKi9cbkBDT05TVCgpXG5leHBvcnQgY2xhc3MgUmVkaXJlY3QgaW1wbGVtZW50cyBSb3V0ZURlZmluaXRpb24ge1xuICBwYXRoOiBzdHJpbmc7XG4gIHJlZGlyZWN0VG86IGFueVtdO1xuICBuYW1lOiBzdHJpbmcgPSBudWxsO1xuICAvLyBhZGRlZCBuZXh0IHRocmVlIHByb3BlcnRpZXMgdG8gd29yayBhcm91bmQgaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy80MTA3XG4gIGxvYWRlcjogRnVuY3Rpb24gPSBudWxsO1xuICBkYXRhOiBhbnkgPSBudWxsO1xuICBhdXg6IHN0cmluZyA9IG51bGw7XG4gIHVzZUFzRGVmYXVsdDogYm9vbGVhbiA9IGZhbHNlO1xuICBjb25zdHJ1Y3Rvcih7cGF0aCwgcmVkaXJlY3RUb306IHtwYXRoOiBzdHJpbmcsIHJlZGlyZWN0VG86IGFueVtdfSkge1xuICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgdGhpcy5yZWRpcmVjdFRvID0gcmVkaXJlY3RUbztcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3JvdXRlci9yb3V0ZV9jb25maWdfaW1wbC50c1xuICoqLyIsImltcG9ydCB7aXNQcmVzZW50LCBpc0JsYW5rfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtQcm9taXNlV3JhcHBlciwgUHJvbWlzZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9wcm9taXNlJztcbmltcG9ydCB7TWFwfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuXG5pbXBvcnQge1JvdXRlSGFuZGxlcn0gZnJvbSAnLi9yb3V0ZV9oYW5kbGVyJztcbmltcG9ydCB7VXJsfSBmcm9tICcuL3VybF9wYXJzZXInO1xuaW1wb3J0IHtDb21wb25lbnRJbnN0cnVjdGlvbn0gZnJvbSAnLi9pbnN0cnVjdGlvbic7XG5pbXBvcnQge1BhdGhSZWNvZ25pemVyfSBmcm9tICcuL3BhdGhfcmVjb2duaXplcic7XG5cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJvdXRlTWF0Y2gge31cblxuZXhwb3J0IGludGVyZmFjZSBBYnN0cmFjdFJlY29nbml6ZXIge1xuICBoYXNoOiBzdHJpbmc7XG4gIHBhdGg6IHN0cmluZztcbiAgcmVjb2duaXplKGJlZ2lubmluZ1NlZ21lbnQ6IFVybCk6IFByb21pc2U8Um91dGVNYXRjaD47XG4gIGdlbmVyYXRlKHBhcmFtczoge1trZXk6IHN0cmluZ106IGFueX0pOiBDb21wb25lbnRJbnN0cnVjdGlvbjtcbn1cblxuXG5leHBvcnQgY2xhc3MgUGF0aE1hdGNoIGV4dGVuZHMgUm91dGVNYXRjaCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBpbnN0cnVjdGlvbjogQ29tcG9uZW50SW5zdHJ1Y3Rpb24sIHB1YmxpYyByZW1haW5pbmc6IFVybCxcbiAgICAgICAgICAgICAgcHVibGljIHJlbWFpbmluZ0F1eDogVXJsW10pIHtcbiAgICBzdXBlcigpO1xuICB9XG59XG5cblxuZXhwb3J0IGNsYXNzIFJlZGlyZWN0TWF0Y2ggZXh0ZW5kcyBSb3V0ZU1hdGNoIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlZGlyZWN0VG86IGFueVtdLCBwdWJsaWMgc3BlY2lmaWNpdHkpIHsgc3VwZXIoKTsgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVkaXJlY3RSZWNvZ25pemVyIGltcGxlbWVudHMgQWJzdHJhY3RSZWNvZ25pemVyIHtcbiAgcHJpdmF0ZSBfcGF0aFJlY29nbml6ZXI6IFBhdGhSZWNvZ25pemVyO1xuICBwdWJsaWMgaGFzaDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwYXRoOiBzdHJpbmcsIHB1YmxpYyByZWRpcmVjdFRvOiBhbnlbXSkge1xuICAgIHRoaXMuX3BhdGhSZWNvZ25pemVyID0gbmV3IFBhdGhSZWNvZ25pemVyKHBhdGgpO1xuICAgIHRoaXMuaGFzaCA9IHRoaXMuX3BhdGhSZWNvZ25pemVyLmhhc2g7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBgbnVsbGAgb3IgYSBgUGFyc2VkVXJsYCByZXByZXNlbnRpbmcgdGhlIG5ldyBwYXRoIHRvIG1hdGNoXG4gICAqL1xuICByZWNvZ25pemUoYmVnaW5uaW5nU2VnbWVudDogVXJsKTogUHJvbWlzZTxSb3V0ZU1hdGNoPiB7XG4gICAgdmFyIG1hdGNoID0gbnVsbDtcbiAgICBpZiAoaXNQcmVzZW50KHRoaXMuX3BhdGhSZWNvZ25pemVyLnJlY29nbml6ZShiZWdpbm5pbmdTZWdtZW50KSkpIHtcbiAgICAgIG1hdGNoID0gbmV3IFJlZGlyZWN0TWF0Y2godGhpcy5yZWRpcmVjdFRvLCB0aGlzLl9wYXRoUmVjb2duaXplci5zcGVjaWZpY2l0eSk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlV3JhcHBlci5yZXNvbHZlKG1hdGNoKTtcbiAgfVxuXG4gIGdlbmVyYXRlKHBhcmFtczoge1trZXk6IHN0cmluZ106IGFueX0pOiBDb21wb25lbnRJbnN0cnVjdGlvbiB7XG4gICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYFRyaWVkIHRvIGdlbmVyYXRlIGEgcmVkaXJlY3QuYCk7XG4gIH1cbn1cblxuXG4vLyByZXByZXNlbnRzIHNvbWV0aGluZyBsaWtlICcvZm9vLzpiYXInXG5leHBvcnQgY2xhc3MgUm91dGVSZWNvZ25pemVyIGltcGxlbWVudHMgQWJzdHJhY3RSZWNvZ25pemVyIHtcbiAgc3BlY2lmaWNpdHk6IG51bWJlcjtcbiAgdGVybWluYWw6IGJvb2xlYW4gPSB0cnVlO1xuICBoYXNoOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBfY2FjaGU6IE1hcDxzdHJpbmcsIENvbXBvbmVudEluc3RydWN0aW9uPiA9IG5ldyBNYXA8c3RyaW5nLCBDb21wb25lbnRJbnN0cnVjdGlvbj4oKTtcbiAgcHJpdmF0ZSBfcGF0aFJlY29nbml6ZXI6IFBhdGhSZWNvZ25pemVyO1xuXG4gIC8vIFRPRE86IGNhY2hlIGNvbXBvbmVudCBpbnN0cnVjdGlvbiBpbnN0YW5jZXMgYnkgcGFyYW1zIGFuZCBieSBQYXJzZWRVcmwgaW5zdGFuY2VcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcGF0aDogc3RyaW5nLCBwdWJsaWMgaGFuZGxlcjogUm91dGVIYW5kbGVyKSB7XG4gICAgdGhpcy5fcGF0aFJlY29nbml6ZXIgPSBuZXcgUGF0aFJlY29nbml6ZXIocGF0aCk7XG4gICAgdGhpcy5zcGVjaWZpY2l0eSA9IHRoaXMuX3BhdGhSZWNvZ25pemVyLnNwZWNpZmljaXR5O1xuICAgIHRoaXMuaGFzaCA9IHRoaXMuX3BhdGhSZWNvZ25pemVyLmhhc2g7XG4gICAgdGhpcy50ZXJtaW5hbCA9IHRoaXMuX3BhdGhSZWNvZ25pemVyLnRlcm1pbmFsO1xuICB9XG5cbiAgcmVjb2duaXplKGJlZ2lubmluZ1NlZ21lbnQ6IFVybCk6IFByb21pc2U8Um91dGVNYXRjaD4ge1xuICAgIHZhciByZXMgPSB0aGlzLl9wYXRoUmVjb2duaXplci5yZWNvZ25pemUoYmVnaW5uaW5nU2VnbWVudCk7XG4gICAgaWYgKGlzQmxhbmsocmVzKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlci5yZXNvbHZlQ29tcG9uZW50VHlwZSgpLnRoZW4oKF8pID0+IHtcbiAgICAgIHZhciBjb21wb25lbnRJbnN0cnVjdGlvbiA9XG4gICAgICAgICAgdGhpcy5fZ2V0SW5zdHJ1Y3Rpb24ocmVzWyd1cmxQYXRoJ10sIHJlc1sndXJsUGFyYW1zJ10sIHJlc1snYWxsUGFyYW1zJ10pO1xuICAgICAgcmV0dXJuIG5ldyBQYXRoTWF0Y2goY29tcG9uZW50SW5zdHJ1Y3Rpb24sIHJlc1snbmV4dFNlZ21lbnQnXSwgcmVzWydhdXhpbGlhcnknXSk7XG4gICAgfSk7XG4gIH1cblxuICBnZW5lcmF0ZShwYXJhbXM6IHtba2V5OiBzdHJpbmddOiBhbnl9KTogQ29tcG9uZW50SW5zdHJ1Y3Rpb24ge1xuICAgIHZhciBnZW5lcmF0ZWQgPSB0aGlzLl9wYXRoUmVjb2duaXplci5nZW5lcmF0ZShwYXJhbXMpO1xuICAgIHZhciB1cmxQYXRoID0gZ2VuZXJhdGVkWyd1cmxQYXRoJ107XG4gICAgdmFyIHVybFBhcmFtcyA9IGdlbmVyYXRlZFsndXJsUGFyYW1zJ107XG4gICAgcmV0dXJuIHRoaXMuX2dldEluc3RydWN0aW9uKHVybFBhdGgsIHVybFBhcmFtcywgcGFyYW1zKTtcbiAgfVxuXG4gIGdlbmVyYXRlQ29tcG9uZW50UGF0aFZhbHVlcyhwYXJhbXM6IHtba2V5OiBzdHJpbmddOiBhbnl9KToge1trZXk6IHN0cmluZ106IGFueX0ge1xuICAgIHJldHVybiB0aGlzLl9wYXRoUmVjb2duaXplci5nZW5lcmF0ZShwYXJhbXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0SW5zdHJ1Y3Rpb24odXJsUGF0aDogc3RyaW5nLCB1cmxQYXJhbXM6IHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHtba2V5OiBzdHJpbmddOiBhbnl9KTogQ29tcG9uZW50SW5zdHJ1Y3Rpb24ge1xuICAgIGlmIChpc0JsYW5rKHRoaXMuaGFuZGxlci5jb21wb25lbnRUeXBlKSkge1xuICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYFRyaWVkIHRvIGdldCBpbnN0cnVjdGlvbiBiZWZvcmUgdGhlIHR5cGUgd2FzIGxvYWRlZC5gKTtcbiAgICB9XG5cbiAgICB2YXIgaGFzaEtleSA9IHVybFBhdGggKyAnPycgKyB1cmxQYXJhbXMuam9pbignPycpO1xuICAgIGlmICh0aGlzLl9jYWNoZS5oYXMoaGFzaEtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jYWNoZS5nZXQoaGFzaEtleSk7XG4gICAgfVxuICAgIHZhciBpbnN0cnVjdGlvbiA9XG4gICAgICAgIG5ldyBDb21wb25lbnRJbnN0cnVjdGlvbih1cmxQYXRoLCB1cmxQYXJhbXMsIHRoaXMuaGFuZGxlci5kYXRhLCB0aGlzLmhhbmRsZXIuY29tcG9uZW50VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGVybWluYWwsIHRoaXMuc3BlY2lmaWNpdHksIHBhcmFtcyk7XG4gICAgdGhpcy5fY2FjaGUuc2V0KGhhc2hLZXksIGluc3RydWN0aW9uKTtcblxuICAgIHJldHVybiBpbnN0cnVjdGlvbjtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3JvdXRlci9yb3V0ZV9yZWNvZ25pemVyLnRzXG4gKiovIiwiaW1wb3J0IHtNYXAsIE1hcFdyYXBwZXIsIFN0cmluZ01hcFdyYXBwZXIsIExpc3RXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtpc1ByZXNlbnQsIGlzQmxhbmssIG5vcm1hbGl6ZUJsYW5rLCBUeXBlLCBDT05TVF9FWFBSfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtQcm9taXNlLCBQcm9taXNlV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9hc3luYyc7XG5cblxuLyoqXG4gKiBgUm91dGVQYXJhbXNgIGlzIGFuIGltbXV0YWJsZSBtYXAgb2YgcGFyYW1ldGVycyBmb3IgdGhlIGdpdmVuIHJvdXRlXG4gKiBiYXNlZCBvbiB0aGUgdXJsIG1hdGNoZXIgYW5kIG9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHRoYXQgcm91dGUuXG4gKlxuICogWW91IGNhbiBpbmplY3QgYFJvdXRlUGFyYW1zYCBpbnRvIHRoZSBjb25zdHJ1Y3RvciBvZiBhIGNvbXBvbmVudCB0byB1c2UgaXQuXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGBcbiAqIGltcG9ydCB7Q29tcG9uZW50fSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbiAqIGltcG9ydCB7Ym9vdHN0cmFwfSBmcm9tICdhbmd1bGFyMi9wbGF0Zm9ybS9icm93c2VyJztcbiAqIGltcG9ydCB7Um91dGVyLCBST1VURVJfRElSRUNUSVZFUywgUk9VVEVSX1BST1ZJREVSUywgUm91dGVDb25maWd9IGZyb20gJ2FuZ3VsYXIyL3JvdXRlcic7XG4gKlxuICogQENvbXBvbmVudCh7ZGlyZWN0aXZlczogW1JPVVRFUl9ESVJFQ1RJVkVTXX0pXG4gKiBAUm91dGVDb25maWcoW1xuICogIHtwYXRoOiAnL3VzZXIvOmlkJywgY29tcG9uZW50OiBVc2VyQ21wLCBhczogJ1VzZXJDbXAnfSxcbiAqIF0pXG4gKiBjbGFzcyBBcHBDbXAge31cbiAqXG4gKiBAQ29tcG9uZW50KHsgdGVtcGxhdGU6ICd1c2VyOiB7e2lkfX0nIH0pXG4gKiBjbGFzcyBVc2VyQ21wIHtcbiAqICAgaWQ6IHN0cmluZztcbiAqICAgY29uc3RydWN0b3IocGFyYW1zOiBSb3V0ZVBhcmFtcykge1xuICogICAgIHRoaXMuaWQgPSBwYXJhbXMuZ2V0KCdpZCcpO1xuICogICB9XG4gKiB9XG4gKlxuICogYm9vdHN0cmFwKEFwcENtcCwgUk9VVEVSX1BST1ZJREVSUyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFJvdXRlUGFyYW1zIHtcbiAgY29uc3RydWN0b3IocHVibGljIHBhcmFtczoge1trZXk6IHN0cmluZ106IHN0cmluZ30pIHt9XG5cbiAgZ2V0KHBhcmFtOiBzdHJpbmcpOiBzdHJpbmcgeyByZXR1cm4gbm9ybWFsaXplQmxhbmsoU3RyaW5nTWFwV3JhcHBlci5nZXQodGhpcy5wYXJhbXMsIHBhcmFtKSk7IH1cbn1cblxuLyoqXG4gKiBgUm91dGVEYXRhYCBpcyBhbiBpbW11dGFibGUgbWFwIG9mIGFkZGl0aW9uYWwgZGF0YSB5b3UgY2FuIGNvbmZpZ3VyZSBpbiB5b3VyIHtAbGluayBSb3V0ZX0uXG4gKlxuICogWW91IGNhbiBpbmplY3QgYFJvdXRlRGF0YWAgaW50byB0aGUgY29uc3RydWN0b3Igb2YgYSBjb21wb25lbnQgdG8gdXNlIGl0LlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogYGBgXG4gKiBpbXBvcnQge0NvbXBvbmVudCwgVmlld30gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG4gKiBpbXBvcnQge2Jvb3RzdHJhcH0gZnJvbSAnYW5ndWxhcjIvcGxhdGZvcm0vYnJvd3Nlcic7XG4gKiBpbXBvcnQge1JvdXRlciwgUk9VVEVSX0RJUkVDVElWRVMsIHJvdXRlckJpbmRpbmdzLCBSb3V0ZUNvbmZpZ30gZnJvbSAnYW5ndWxhcjIvcm91dGVyJztcbiAqXG4gKiBAQ29tcG9uZW50KHsuLi59KVxuICogQFZpZXcoe2RpcmVjdGl2ZXM6IFtST1VURVJfRElSRUNUSVZFU119KVxuICogQFJvdXRlQ29uZmlnKFtcbiAqICB7cGF0aDogJy91c2VyLzppZCcsIGNvbXBvbmVudDogVXNlckNtcCwgYXM6ICdVc2VyQ21wJywgZGF0YToge2lzQWRtaW46IHRydWV9fSxcbiAqIF0pXG4gKiBjbGFzcyBBcHBDbXAge31cbiAqXG4gKiBAQ29tcG9uZW50KHsuLi59KVxuICogQFZpZXcoeyB0ZW1wbGF0ZTogJ3VzZXI6IHt7aXNBZG1pbn19JyB9KVxuICogY2xhc3MgVXNlckNtcCB7XG4gKiAgIHN0cmluZzogaXNBZG1pbjtcbiAqICAgY29uc3RydWN0b3IoZGF0YTogUm91dGVEYXRhKSB7XG4gKiAgICAgdGhpcy5pc0FkbWluID0gZGF0YS5nZXQoJ2lzQWRtaW4nKTtcbiAqICAgfVxuICogfVxuICpcbiAqIGJvb3RzdHJhcChBcHBDbXAsIHJvdXRlckJpbmRpbmdzKEFwcENtcCkpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBSb3V0ZURhdGEge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZGF0YToge1trZXk6IHN0cmluZ106IGFueX0gPSBDT05TVF9FWFBSKHt9KSkge31cblxuICBnZXQoa2V5OiBzdHJpbmcpOiBhbnkgeyByZXR1cm4gbm9ybWFsaXplQmxhbmsoU3RyaW5nTWFwV3JhcHBlci5nZXQodGhpcy5kYXRhLCBrZXkpKTsgfVxufVxuXG5leHBvcnQgdmFyIEJMQU5LX1JPVVRFX0RBVEEgPSBuZXcgUm91dGVEYXRhKCk7XG5cbi8qKlxuICogYEluc3RydWN0aW9uYCBpcyBhIHRyZWUgb2Yge0BsaW5rIENvbXBvbmVudEluc3RydWN0aW9ufXMgd2l0aCBhbGwgdGhlIGluZm9ybWF0aW9uIG5lZWRlZFxuICogdG8gdHJhbnNpdGlvbiBlYWNoIGNvbXBvbmVudCBpbiB0aGUgYXBwIHRvIGEgZ2l2ZW4gcm91dGUsIGluY2x1ZGluZyBhbGwgYXV4aWxpYXJ5IHJvdXRlcy5cbiAqXG4gKiBgSW5zdHJ1Y3Rpb25gcyBjYW4gYmUgY3JlYXRlZCB1c2luZyB7QGxpbmsgUm91dGVyI2dlbmVyYXRlfSwgYW5kIGNhbiBiZSB1c2VkIHRvXG4gKiBwZXJmb3JtIHJvdXRlIGNoYW5nZXMgd2l0aCB7QGxpbmsgUm91dGVyI25hdmlnYXRlQnlJbnN0cnVjdGlvbn0uXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGBcbiAqIGltcG9ydCB7Q29tcG9uZW50fSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbiAqIGltcG9ydCB7Ym9vdHN0cmFwfSBmcm9tICdhbmd1bGFyMi9wbGF0Zm9ybS9icm93c2VyJztcbiAqIGltcG9ydCB7Um91dGVyLCBST1VURVJfRElSRUNUSVZFUywgUk9VVEVSX1BST1ZJREVSUywgUm91dGVDb25maWd9IGZyb20gJ2FuZ3VsYXIyL3JvdXRlcic7XG4gKlxuICogQENvbXBvbmVudCh7ZGlyZWN0aXZlczogW1JPVVRFUl9ESVJFQ1RJVkVTXX0pXG4gKiBAUm91dGVDb25maWcoW1xuICogIHsuLi59LFxuICogXSlcbiAqIGNsYXNzIEFwcENtcCB7XG4gKiAgIGNvbnN0cnVjdG9yKHJvdXRlcjogUm91dGVyKSB7XG4gKiAgICAgdmFyIGluc3RydWN0aW9uID0gcm91dGVyLmdlbmVyYXRlKFsnL015Um91dGUnXSk7XG4gKiAgICAgcm91dGVyLm5hdmlnYXRlQnlJbnN0cnVjdGlvbihpbnN0cnVjdGlvbik7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBib290c3RyYXAoQXBwQ21wLCBST1VURVJfUFJPVklERVJTKTtcbiAqIGBgYFxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSW5zdHJ1Y3Rpb24ge1xuICBwdWJsaWMgY29tcG9uZW50OiBDb21wb25lbnRJbnN0cnVjdGlvbjtcbiAgcHVibGljIGNoaWxkOiBJbnN0cnVjdGlvbjtcbiAgcHVibGljIGF1eEluc3RydWN0aW9uOiB7W2tleTogc3RyaW5nXTogSW5zdHJ1Y3Rpb259ID0ge307XG5cbiAgZ2V0IHVybFBhdGgoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuY29tcG9uZW50LnVybFBhdGg7IH1cblxuICBnZXQgdXJsUGFyYW1zKCk6IHN0cmluZ1tdIHsgcmV0dXJuIHRoaXMuY29tcG9uZW50LnVybFBhcmFtczsgfVxuXG4gIGdldCBzcGVjaWZpY2l0eSgpOiBudW1iZXIge1xuICAgIHZhciB0b3RhbCA9IDA7XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLmNvbXBvbmVudCkpIHtcbiAgICAgIHRvdGFsICs9IHRoaXMuY29tcG9uZW50LnNwZWNpZmljaXR5O1xuICAgIH1cbiAgICBpZiAoaXNQcmVzZW50KHRoaXMuY2hpbGQpKSB7XG4gICAgICB0b3RhbCArPSB0aGlzLmNoaWxkLnNwZWNpZmljaXR5O1xuICAgIH1cbiAgICByZXR1cm4gdG90YWw7XG4gIH1cblxuICBhYnN0cmFjdCByZXNvbHZlQ29tcG9uZW50KCk6IFByb21pc2U8Q29tcG9uZW50SW5zdHJ1Y3Rpb24+O1xuXG4gIC8qKlxuICAgKiBjb252ZXJ0cyB0aGUgaW5zdHJ1Y3Rpb24gaW50byBhIFVSTCBzdHJpbmdcbiAgICovXG4gIHRvUm9vdFVybCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy50b1VybFBhdGgoKSArIHRoaXMudG9VcmxRdWVyeSgpOyB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfdG9Ob25Sb290VXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3N0cmluZ2lmeVBhdGhNYXRyaXhBdXhQcmVmaXhlZCgpICtcbiAgICAgICAgICAgKGlzUHJlc2VudCh0aGlzLmNoaWxkKSA/IHRoaXMuY2hpbGQuX3RvTm9uUm9vdFVybCgpIDogJycpO1xuICB9XG5cbiAgdG9VcmxRdWVyeSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy51cmxQYXJhbXMubGVuZ3RoID4gMCA/ICgnPycgKyB0aGlzLnVybFBhcmFtcy5qb2luKCcmJykpIDogJyc7IH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIG5ldyBpbnN0cnVjdGlvbiB0aGF0IHNoYXJlcyB0aGUgc3RhdGUgb2YgdGhlIGV4aXN0aW5nIGluc3RydWN0aW9uLCBidXQgd2l0aFxuICAgKiB0aGUgZ2l2ZW4gY2hpbGQge0BsaW5rIEluc3RydWN0aW9ufSByZXBsYWNpbmcgdGhlIGV4aXN0aW5nIGNoaWxkLlxuICAgKi9cbiAgcmVwbGFjZUNoaWxkKGNoaWxkOiBJbnN0cnVjdGlvbik6IEluc3RydWN0aW9uIHtcbiAgICByZXR1cm4gbmV3IFJlc29sdmVkSW5zdHJ1Y3Rpb24odGhpcy5jb21wb25lbnQsIGNoaWxkLCB0aGlzLmF1eEluc3RydWN0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgZmluYWwgVVJMIGZvciB0aGUgaW5zdHJ1Y3Rpb24gaXMgYGBcbiAgICovXG4gIHRvVXJsUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnVybFBhdGggKyB0aGlzLl9zdHJpbmdpZnlBdXgoKSArXG4gICAgICAgICAgIChpc1ByZXNlbnQodGhpcy5jaGlsZCkgPyB0aGlzLmNoaWxkLl90b05vblJvb3RVcmwoKSA6ICcnKTtcbiAgfVxuXG4gIC8vIGRlZmF1bHQgaW5zdHJ1Y3Rpb25zIG92ZXJyaWRlIHRoZXNlXG4gIHRvTGlua1VybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnVybFBhdGggKyB0aGlzLl9zdHJpbmdpZnlBdXgoKSArXG4gICAgICAgICAgIChpc1ByZXNlbnQodGhpcy5jaGlsZCkgPyB0aGlzLmNoaWxkLl90b0xpbmtVcmwoKSA6ICcnKTtcbiAgfVxuXG4gIC8vIHRoaXMgaXMgdGhlIG5vbi1yb290IHZlcnNpb24gKGNhbGxlZCByZWN1cnNpdmVseSlcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfdG9MaW5rVXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3N0cmluZ2lmeVBhdGhNYXRyaXhBdXhQcmVmaXhlZCgpICtcbiAgICAgICAgICAgKGlzUHJlc2VudCh0aGlzLmNoaWxkKSA/IHRoaXMuY2hpbGQuX3RvTGlua1VybCgpIDogJycpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfc3RyaW5naWZ5UGF0aE1hdHJpeEF1eFByZWZpeGVkKCk6IHN0cmluZyB7XG4gICAgdmFyIHByaW1hcnkgPSB0aGlzLl9zdHJpbmdpZnlQYXRoTWF0cml4QXV4KCk7XG4gICAgaWYgKHByaW1hcnkubGVuZ3RoID4gMCkge1xuICAgICAgcHJpbWFyeSA9ICcvJyArIHByaW1hcnk7XG4gICAgfVxuICAgIHJldHVybiBwcmltYXJ5O1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfc3RyaW5naWZ5TWF0cml4UGFyYW1zKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudXJsUGFyYW1zLmxlbmd0aCA+IDAgPyAoJzsnICsgdGhpcy5jb21wb25lbnQudXJsUGFyYW1zLmpvaW4oJzsnKSkgOiAnJztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3N0cmluZ2lmeVBhdGhNYXRyaXhBdXgoKTogc3RyaW5nIHtcbiAgICBpZiAoaXNCbGFuayh0aGlzLmNvbXBvbmVudCkpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudXJsUGF0aCArIHRoaXMuX3N0cmluZ2lmeU1hdHJpeFBhcmFtcygpICsgdGhpcy5fc3RyaW5naWZ5QXV4KCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9zdHJpbmdpZnlBdXgoKTogc3RyaW5nIHtcbiAgICB2YXIgcm91dGVzID0gW107XG4gICAgU3RyaW5nTWFwV3JhcHBlci5mb3JFYWNoKHRoaXMuYXV4SW5zdHJ1Y3Rpb24sIChhdXhJbnN0cnVjdGlvbiwgXykgPT4ge1xuICAgICAgcm91dGVzLnB1c2goYXV4SW5zdHJ1Y3Rpb24uX3N0cmluZ2lmeVBhdGhNYXRyaXhBdXgoKSk7XG4gICAgfSk7XG4gICAgaWYgKHJvdXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gJygnICsgcm91dGVzLmpvaW4oJy8vJykgKyAnKSc7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxufVxuXG5cbi8qKlxuICogYSByZXNvbHZlZCBpbnN0cnVjdGlvbiBoYXMgYW4gb3V0bGV0IGluc3RydWN0aW9uIGZvciBpdHNlbGYsIGJ1dCBtYXliZSBub3QgZm9yLi4uXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXNvbHZlZEluc3RydWN0aW9uIGV4dGVuZHMgSW5zdHJ1Y3Rpb24ge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgY29tcG9uZW50OiBDb21wb25lbnRJbnN0cnVjdGlvbiwgcHVibGljIGNoaWxkOiBJbnN0cnVjdGlvbixcbiAgICAgICAgICAgICAgcHVibGljIGF1eEluc3RydWN0aW9uOiB7W2tleTogc3RyaW5nXTogSW5zdHJ1Y3Rpb259KSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHJlc29sdmVDb21wb25lbnQoKTogUHJvbWlzZTxDb21wb25lbnRJbnN0cnVjdGlvbj4ge1xuICAgIHJldHVybiBQcm9taXNlV3JhcHBlci5yZXNvbHZlKHRoaXMuY29tcG9uZW50KTtcbiAgfVxufVxuXG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHJlc29sdmVkIGRlZmF1bHQgcm91dGVcbiAqL1xuZXhwb3J0IGNsYXNzIERlZmF1bHRJbnN0cnVjdGlvbiBleHRlbmRzIEluc3RydWN0aW9uIHtcbiAgY29uc3RydWN0b3IocHVibGljIGNvbXBvbmVudDogQ29tcG9uZW50SW5zdHJ1Y3Rpb24sIHB1YmxpYyBjaGlsZDogRGVmYXVsdEluc3RydWN0aW9uKSB7IHN1cGVyKCk7IH1cblxuICByZXNvbHZlQ29tcG9uZW50KCk6IFByb21pc2U8Q29tcG9uZW50SW5zdHJ1Y3Rpb24+IHtcbiAgICByZXR1cm4gUHJvbWlzZVdyYXBwZXIucmVzb2x2ZSh0aGlzLmNvbXBvbmVudCk7XG4gIH1cblxuICB0b0xpbmtVcmwoKTogc3RyaW5nIHsgcmV0dXJuICcnOyB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfdG9MaW5rVXJsKCk6IHN0cmluZyB7IHJldHVybiAnJzsgfVxufVxuXG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGNvbXBvbmVudCB0aGF0IG1heSBuZWVkIHRvIGRvIHNvbWUgcmVkaXJlY3Rpb24gb3IgbGF6eSBsb2FkaW5nIGF0IGEgbGF0ZXIgdGltZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFVucmVzb2x2ZWRJbnN0cnVjdGlvbiBleHRlbmRzIEluc3RydWN0aW9uIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfcmVzb2x2ZXI6ICgpID0+IFByb21pc2U8SW5zdHJ1Y3Rpb24+LCBwcml2YXRlIF91cmxQYXRoOiBzdHJpbmcgPSAnJyxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfdXJsUGFyYW1zOiBzdHJpbmdbXSA9IENPTlNUX0VYUFIoW10pKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIGdldCB1cmxQYXRoKCk6IHN0cmluZyB7XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLmNvbXBvbmVudCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudC51cmxQYXRoO1xuICAgIH1cbiAgICBpZiAoaXNQcmVzZW50KHRoaXMuX3VybFBhdGgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdXJsUGF0aDtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgZ2V0IHVybFBhcmFtcygpOiBzdHJpbmdbXSB7XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLmNvbXBvbmVudCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudC51cmxQYXJhbXM7XG4gICAgfVxuICAgIGlmIChpc1ByZXNlbnQodGhpcy5fdXJsUGFyYW1zKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3VybFBhcmFtcztcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcmVzb2x2ZUNvbXBvbmVudCgpOiBQcm9taXNlPENvbXBvbmVudEluc3RydWN0aW9uPiB7XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLmNvbXBvbmVudCkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlV3JhcHBlci5yZXNvbHZlKHRoaXMuY29tcG9uZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3Jlc29sdmVyKCkudGhlbigocmVzb2x1dGlvbjogSW5zdHJ1Y3Rpb24pID0+IHtcbiAgICAgIHRoaXMuY2hpbGQgPSByZXNvbHV0aW9uLmNoaWxkO1xuICAgICAgcmV0dXJuIHRoaXMuY29tcG9uZW50ID0gcmVzb2x1dGlvbi5jb21wb25lbnQ7XG4gICAgfSk7XG4gIH1cbn1cblxuXG5leHBvcnQgY2xhc3MgUmVkaXJlY3RJbnN0cnVjdGlvbiBleHRlbmRzIFJlc29sdmVkSW5zdHJ1Y3Rpb24ge1xuICBjb25zdHJ1Y3Rvcihjb21wb25lbnQ6IENvbXBvbmVudEluc3RydWN0aW9uLCBjaGlsZDogSW5zdHJ1Y3Rpb24sXG4gICAgICAgICAgICAgIGF1eEluc3RydWN0aW9uOiB7W2tleTogc3RyaW5nXTogSW5zdHJ1Y3Rpb259KSB7XG4gICAgc3VwZXIoY29tcG9uZW50LCBjaGlsZCwgYXV4SW5zdHJ1Y3Rpb24pO1xuICB9XG59XG5cblxuLyoqXG4gKiBBIGBDb21wb25lbnRJbnN0cnVjdGlvbmAgcmVwcmVzZW50cyB0aGUgcm91dGUgc3RhdGUgZm9yIGEgc2luZ2xlIGNvbXBvbmVudC4gQW4gYEluc3RydWN0aW9uYCBpc1xuICogY29tcG9zZWQgb2YgYSB0cmVlIG9mIHRoZXNlIGBDb21wb25lbnRJbnN0cnVjdGlvbmBzLlxuICpcbiAqIGBDb21wb25lbnRJbnN0cnVjdGlvbnNgIGlzIGEgcHVibGljIEFQSS4gSW5zdGFuY2VzIG9mIGBDb21wb25lbnRJbnN0cnVjdGlvbmAgYXJlIHBhc3NlZFxuICogdG8gcm91dGUgbGlmZWN5Y2xlIGhvb2tzLCBsaWtlIHtAbGluayBDYW5BY3RpdmF0ZX0uXG4gKlxuICogYENvbXBvbmVudEluc3RydWN0aW9uYHMgYXJlIFtodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IYXNoX2NvbnNpbmddKGhhc2ggY29uc2VkKS4gWW91IHNob3VsZFxuICogbmV2ZXIgY29uc3RydWN0IG9uZSB5b3Vyc2VsZiB3aXRoIFwibmV3LlwiIEluc3RlYWQsIHJlbHkgb24ge0BsaW5rIFJvdXRlci9Sb3V0ZVJlY29nbml6ZXJ9IHRvXG4gKiBjb25zdHJ1Y3QgYENvbXBvbmVudEluc3RydWN0aW9uYHMuXG4gKlxuICogWW91IHNob3VsZCBub3QgbW9kaWZ5IHRoaXMgb2JqZWN0LiBJdCBzaG91bGQgYmUgdHJlYXRlZCBhcyBpbW11dGFibGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb21wb25lbnRJbnN0cnVjdGlvbiB7XG4gIHJldXNlOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyByb3V0ZURhdGE6IFJvdXRlRGF0YTtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgdXJsUGF0aDogc3RyaW5nLCBwdWJsaWMgdXJsUGFyYW1zOiBzdHJpbmdbXSwgZGF0YTogUm91dGVEYXRhLFxuICAgICAgICAgICAgICBwdWJsaWMgY29tcG9uZW50VHlwZSwgcHVibGljIHRlcm1pbmFsOiBib29sZWFuLCBwdWJsaWMgc3BlY2lmaWNpdHk6IG51bWJlcixcbiAgICAgICAgICAgICAgcHVibGljIHBhcmFtczoge1trZXk6IHN0cmluZ106IGFueX0gPSBudWxsKSB7XG4gICAgdGhpcy5yb3V0ZURhdGEgPSBpc1ByZXNlbnQoZGF0YSkgPyBkYXRhIDogQkxBTktfUk9VVEVfREFUQTtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3JvdXRlci9pbnN0cnVjdGlvbi50c1xuICoqLyIsImltcG9ydCB7XG4gIFJlZ0V4cCxcbiAgUmVnRXhwV3JhcHBlcixcbiAgUmVnRXhwTWF0Y2hlcldyYXBwZXIsXG4gIFN0cmluZ1dyYXBwZXIsXG4gIGlzUHJlc2VudCxcbiAgaXNCbGFua1xufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9uLCBXcmFwcGVkRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtNYXAsIE1hcFdyYXBwZXIsIFN0cmluZ01hcFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5cbmltcG9ydCB7VXJsLCBSb290VXJsLCBzZXJpYWxpemVQYXJhbXN9IGZyb20gJy4vdXJsX3BhcnNlcic7XG5cbmNsYXNzIFRvdWNoTWFwIHtcbiAgbWFwOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSA9IHt9O1xuICBrZXlzOiB7W2tleTogc3RyaW5nXTogYm9vbGVhbn0gPSB7fTtcblxuICBjb25zdHJ1Y3RvcihtYXA6IHtba2V5OiBzdHJpbmddOiBhbnl9KSB7XG4gICAgaWYgKGlzUHJlc2VudChtYXApKSB7XG4gICAgICBTdHJpbmdNYXBXcmFwcGVyLmZvckVhY2gobWFwLCAodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICB0aGlzLm1hcFtrZXldID0gaXNQcmVzZW50KHZhbHVlKSA/IHZhbHVlLnRvU3RyaW5nKCkgOiBudWxsO1xuICAgICAgICB0aGlzLmtleXNba2V5XSA9IHRydWU7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBnZXQoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIFN0cmluZ01hcFdyYXBwZXIuZGVsZXRlKHRoaXMua2V5cywga2V5KTtcbiAgICByZXR1cm4gdGhpcy5tYXBba2V5XTtcbiAgfVxuXG4gIGdldFVudXNlZCgpOiB7W2tleTogc3RyaW5nXTogYW55fSB7XG4gICAgdmFyIHVudXNlZDoge1trZXk6IHN0cmluZ106IGFueX0gPSB7fTtcbiAgICB2YXIga2V5cyA9IFN0cmluZ01hcFdyYXBwZXIua2V5cyh0aGlzLmtleXMpO1xuICAgIGtleXMuZm9yRWFjaChrZXkgPT4gdW51c2VkW2tleV0gPSBTdHJpbmdNYXBXcmFwcGVyLmdldCh0aGlzLm1hcCwga2V5KSk7XG4gICAgcmV0dXJuIHVudXNlZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTdHJpbmcob2JqOiBhbnkpOiBzdHJpbmcge1xuICBpZiAoaXNCbGFuayhvYmopKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG9iai50b1N0cmluZygpO1xuICB9XG59XG5cbmludGVyZmFjZSBTZWdtZW50IHtcbiAgbmFtZTogc3RyaW5nO1xuICBnZW5lcmF0ZShwYXJhbXM6IFRvdWNoTWFwKTogc3RyaW5nO1xuICBtYXRjaChwYXRoOiBzdHJpbmcpOiBib29sZWFuO1xufVxuXG5jbGFzcyBDb250aW51YXRpb25TZWdtZW50IGltcGxlbWVudHMgU2VnbWVudCB7XG4gIG5hbWU6IHN0cmluZyA9ICcnO1xuICBnZW5lcmF0ZShwYXJhbXM6IFRvdWNoTWFwKTogc3RyaW5nIHsgcmV0dXJuICcnOyB9XG4gIG1hdGNoKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4geyByZXR1cm4gdHJ1ZTsgfVxufVxuXG5jbGFzcyBTdGF0aWNTZWdtZW50IGltcGxlbWVudHMgU2VnbWVudCB7XG4gIG5hbWU6IHN0cmluZyA9ICcnO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcGF0aDogc3RyaW5nKSB7fVxuICBtYXRjaChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHsgcmV0dXJuIHBhdGggPT0gdGhpcy5wYXRoOyB9XG4gIGdlbmVyYXRlKHBhcmFtczogVG91Y2hNYXApOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5wYXRoOyB9XG59XG5cbmNsYXNzIER5bmFtaWNTZWdtZW50IGltcGxlbWVudHMgU2VnbWVudCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHt9XG4gIG1hdGNoKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4geyByZXR1cm4gcGF0aC5sZW5ndGggPiAwOyB9XG4gIGdlbmVyYXRlKHBhcmFtczogVG91Y2hNYXApOiBzdHJpbmcge1xuICAgIGlmICghU3RyaW5nTWFwV3JhcHBlci5jb250YWlucyhwYXJhbXMubWFwLCB0aGlzLm5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihcbiAgICAgICAgICBgUm91dGUgZ2VuZXJhdG9yIGZvciAnJHt0aGlzLm5hbWV9JyB3YXMgbm90IGluY2x1ZGVkIGluIHBhcmFtZXRlcnMgcGFzc2VkLmApO1xuICAgIH1cbiAgICByZXR1cm4gbm9ybWFsaXplU3RyaW5nKHBhcmFtcy5nZXQodGhpcy5uYW1lKSk7XG4gIH1cbn1cblxuXG5jbGFzcyBTdGFyU2VnbWVudCBpbXBsZW1lbnRzIFNlZ21lbnQge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7fVxuICBtYXRjaChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHsgcmV0dXJuIHRydWU7IH1cbiAgZ2VuZXJhdGUocGFyYW1zOiBUb3VjaE1hcCk6IHN0cmluZyB7IHJldHVybiBub3JtYWxpemVTdHJpbmcocGFyYW1zLmdldCh0aGlzLm5hbWUpKTsgfVxufVxuXG5cbnZhciBwYXJhbU1hdGNoZXIgPSAvXjooW15cXC9dKykkL2c7XG52YXIgd2lsZGNhcmRNYXRjaGVyID0gL15cXCooW15cXC9dKykkL2c7XG5cbmZ1bmN0aW9uIHBhcnNlUGF0aFN0cmluZyhyb3V0ZTogc3RyaW5nKToge1trZXk6IHN0cmluZ106IGFueX0ge1xuICAvLyBub3JtYWxpemUgcm91dGUgYXMgbm90IHN0YXJ0aW5nIHdpdGggYSBcIi9cIi4gUmVjb2duaXRpb24gd2lsbFxuICAvLyBhbHNvIG5vcm1hbGl6ZS5cbiAgaWYgKHJvdXRlLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgcm91dGUgPSByb3V0ZS5zdWJzdHJpbmcoMSk7XG4gIH1cblxuICB2YXIgc2VnbWVudHMgPSBzcGxpdEJ5U2xhc2gocm91dGUpO1xuICB2YXIgcmVzdWx0cyA9IFtdO1xuICB2YXIgc3BlY2lmaWNpdHkgPSAwO1xuXG4gIC8vIFRoZSBcInNwZWNpZmljaXR5XCIgb2YgYSBwYXRoIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIHJvdXRlIGlzIHVzZWQgd2hlbiBtdWx0aXBsZSByb3V0ZXMgbWF0Y2hcbiAgLy8gYSBVUkwuXG4gIC8vIFN0YXRpYyBzZWdtZW50cyAobGlrZSBcIi9mb29cIikgYXJlIHRoZSBtb3N0IHNwZWNpZmljLCBmb2xsb3dlZCBieSBkeW5hbWljIHNlZ21lbnRzIChsaWtlXG4gIC8vIFwiLzppZFwiKS4gU3RhciBzZWdtZW50c1xuICAvLyBhZGQgbm8gc3BlY2lmaWNpdHkuIFNlZ21lbnRzIGF0IHRoZSBzdGFydCBvZiB0aGUgcGF0aCBhcmUgbW9yZSBzcGVjaWZpYyB0aGFuIHByb2NlZWRpbmcgb25lcy5cbiAgLy8gVGhlIGNvZGUgYmVsb3cgdXNlcyBwbGFjZSB2YWx1ZXMgdG8gY29tYmluZSB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIHNlZ21lbnRzIGludG8gYSBzaW5nbGVcbiAgLy8gaW50ZWdlciB0aGF0IHdlIGNhblxuICAvLyBzb3J0IGxhdGVyLiBFYWNoIHN0YXRpYyBzZWdtZW50IGlzIHdvcnRoIGh1bmRyZWRzIG9mIHBvaW50cyBvZiBzcGVjaWZpY2l0eSAoMTAwMDAsIDk5MDAsIC4uLixcbiAgLy8gMjAwKSwgYW5kIGVhY2hcbiAgLy8gZHluYW1pYyBzZWdtZW50IGlzIHdvcnRoIHNpbmdsZSBwb2ludHMgb2Ygc3BlY2lmaWNpdHkgKDEwMCwgOTksIC4uLiAyKS5cbiAgaWYgKHNlZ21lbnRzLmxlbmd0aCA+IDk4KSB7XG4gICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYCcke3JvdXRlfScgaGFzIG1vcmUgdGhhbiB0aGUgbWF4aW11bSBzdXBwb3J0ZWQgbnVtYmVyIG9mIHNlZ21lbnRzLmApO1xuICB9XG5cbiAgdmFyIGxpbWl0ID0gc2VnbWVudHMubGVuZ3RoIC0gMTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPD0gbGltaXQ7IGkrKykge1xuICAgIHZhciBzZWdtZW50ID0gc2VnbWVudHNbaV0sIG1hdGNoO1xuXG4gICAgaWYgKGlzUHJlc2VudChtYXRjaCA9IFJlZ0V4cFdyYXBwZXIuZmlyc3RNYXRjaChwYXJhbU1hdGNoZXIsIHNlZ21lbnQpKSkge1xuICAgICAgcmVzdWx0cy5wdXNoKG5ldyBEeW5hbWljU2VnbWVudChtYXRjaFsxXSkpO1xuICAgICAgc3BlY2lmaWNpdHkgKz0gKDEwMCAtIGkpO1xuICAgIH0gZWxzZSBpZiAoaXNQcmVzZW50KG1hdGNoID0gUmVnRXhwV3JhcHBlci5maXJzdE1hdGNoKHdpbGRjYXJkTWF0Y2hlciwgc2VnbWVudCkpKSB7XG4gICAgICByZXN1bHRzLnB1c2gobmV3IFN0YXJTZWdtZW50KG1hdGNoWzFdKSk7XG4gICAgfSBlbHNlIGlmIChzZWdtZW50ID09ICcuLi4nKSB7XG4gICAgICBpZiAoaSA8IGxpbWl0KSB7XG4gICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBVbmV4cGVjdGVkIFwiLi4uXCIgYmVmb3JlIHRoZSBlbmQgb2YgdGhlIHBhdGggZm9yIFwiJHtyb3V0ZX1cIi5gKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdHMucHVzaChuZXcgQ29udGludWF0aW9uU2VnbWVudCgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0cy5wdXNoKG5ldyBTdGF0aWNTZWdtZW50KHNlZ21lbnQpKTtcbiAgICAgIHNwZWNpZmljaXR5ICs9IDEwMCAqICgxMDAgLSBpKTtcbiAgICB9XG4gIH1cbiAgdmFyIHJlc3VsdCA9IFN0cmluZ01hcFdyYXBwZXIuY3JlYXRlKCk7XG4gIFN0cmluZ01hcFdyYXBwZXIuc2V0KHJlc3VsdCwgJ3NlZ21lbnRzJywgcmVzdWx0cyk7XG4gIFN0cmluZ01hcFdyYXBwZXIuc2V0KHJlc3VsdCwgJ3NwZWNpZmljaXR5Jywgc3BlY2lmaWNpdHkpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vLyB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSByb3V0ZSBjb25maWcgcGF0aCBsaWtlIGAvZm9vLzppZGAgY29sbGlkZXMgd2l0aFxuLy8gYC9mb28vOm5hbWVgXG5mdW5jdGlvbiBwYXRoRHNsSGFzaChzZWdtZW50czogU2VnbWVudFtdKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNlZ21lbnRzLm1hcCgoc2VnbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50IGluc3RhbmNlb2YgU3RhclNlZ21lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnKic7XG4gICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWdtZW50IGluc3RhbmNlb2YgQ29udGludWF0aW9uU2VnbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcuLi4nO1xuICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VnbWVudCBpbnN0YW5jZW9mIER5bmFtaWNTZWdtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICByZXR1cm4gJzonO1xuICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VnbWVudCBpbnN0YW5jZW9mIFN0YXRpY1NlZ21lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWdtZW50LnBhdGg7XG4gICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICB9KVxuICAgICAgLmpvaW4oJy8nKTtcbn1cblxuZnVuY3Rpb24gc3BsaXRCeVNsYXNoKHVybDogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gdXJsLnNwbGl0KCcvJyk7XG59XG5cbnZhciBSRVNFUlZFRF9DSEFSUyA9IFJlZ0V4cFdyYXBwZXIuY3JlYXRlKCcvL3xcXFxcKHxcXFxcKXw7fFxcXFw/fD0nKTtcbmZ1bmN0aW9uIGFzc2VydFBhdGgocGF0aDogc3RyaW5nKSB7XG4gIGlmIChTdHJpbmdXcmFwcGVyLmNvbnRhaW5zKHBhdGgsICcjJykpIHtcbiAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihcbiAgICAgICAgYFBhdGggXCIke3BhdGh9XCIgc2hvdWxkIG5vdCBpbmNsdWRlIFwiI1wiLiBVc2UgXCJIYXNoTG9jYXRpb25TdHJhdGVneVwiIGluc3RlYWQuYCk7XG4gIH1cbiAgdmFyIGlsbGVnYWxDaGFyYWN0ZXIgPSBSZWdFeHBXcmFwcGVyLmZpcnN0TWF0Y2goUkVTRVJWRURfQ0hBUlMsIHBhdGgpO1xuICBpZiAoaXNQcmVzZW50KGlsbGVnYWxDaGFyYWN0ZXIpKSB7XG4gICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oXG4gICAgICAgIGBQYXRoIFwiJHtwYXRofVwiIGNvbnRhaW5zIFwiJHtpbGxlZ2FsQ2hhcmFjdGVyWzBdfVwiIHdoaWNoIGlzIG5vdCBhbGxvd2VkIGluIGEgcm91dGUgY29uZmlnLmApO1xuICB9XG59XG5cblxuLyoqXG4gKiBQYXJzZXMgYSBVUkwgc3RyaW5nIHVzaW5nIGEgZ2l2ZW4gbWF0Y2hlciBEU0wsIGFuZCBnZW5lcmF0ZXMgVVJMcyBmcm9tIHBhcmFtIG1hcHNcbiAqL1xuZXhwb3J0IGNsYXNzIFBhdGhSZWNvZ25pemVyIHtcbiAgcHJpdmF0ZSBfc2VnbWVudHM6IFNlZ21lbnRbXTtcbiAgc3BlY2lmaWNpdHk6IG51bWJlcjtcbiAgdGVybWluYWw6IGJvb2xlYW4gPSB0cnVlO1xuICBoYXNoOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IocHVibGljIHBhdGg6IHN0cmluZykge1xuICAgIGFzc2VydFBhdGgocGF0aCk7XG4gICAgdmFyIHBhcnNlZCA9IHBhcnNlUGF0aFN0cmluZyhwYXRoKTtcblxuICAgIHRoaXMuX3NlZ21lbnRzID0gcGFyc2VkWydzZWdtZW50cyddO1xuICAgIHRoaXMuc3BlY2lmaWNpdHkgPSBwYXJzZWRbJ3NwZWNpZmljaXR5J107XG4gICAgdGhpcy5oYXNoID0gcGF0aERzbEhhc2godGhpcy5fc2VnbWVudHMpO1xuXG4gICAgdmFyIGxhc3RTZWdtZW50ID0gdGhpcy5fc2VnbWVudHNbdGhpcy5fc2VnbWVudHMubGVuZ3RoIC0gMV07XG4gICAgdGhpcy50ZXJtaW5hbCA9ICEobGFzdFNlZ21lbnQgaW5zdGFuY2VvZiBDb250aW51YXRpb25TZWdtZW50KTtcbiAgfVxuXG4gIHJlY29nbml6ZShiZWdpbm5pbmdTZWdtZW50OiBVcmwpOiB7W2tleTogc3RyaW5nXTogYW55fSB7XG4gICAgdmFyIG5leHRTZWdtZW50ID0gYmVnaW5uaW5nU2VnbWVudDtcbiAgICB2YXIgY3VycmVudFNlZ21lbnQ6IFVybDtcbiAgICB2YXIgcG9zaXRpb25hbFBhcmFtcyA9IHt9O1xuICAgIHZhciBjYXB0dXJlZCA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9zZWdtZW50cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgdmFyIHNlZ21lbnQgPSB0aGlzLl9zZWdtZW50c1tpXTtcblxuICAgICAgY3VycmVudFNlZ21lbnQgPSBuZXh0U2VnbWVudDtcbiAgICAgIGlmIChzZWdtZW50IGluc3RhbmNlb2YgQ29udGludWF0aW9uU2VnbWVudCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKGlzUHJlc2VudChjdXJyZW50U2VnbWVudCkpIHtcbiAgICAgICAgY2FwdHVyZWQucHVzaChjdXJyZW50U2VnbWVudC5wYXRoKTtcblxuICAgICAgICAvLyB0aGUgc3RhciBzZWdtZW50IGNvbnN1bWVzIGFsbCBvZiB0aGUgcmVtYWluaW5nIFVSTCwgaW5jbHVkaW5nIG1hdHJpeCBwYXJhbXNcbiAgICAgICAgaWYgKHNlZ21lbnQgaW5zdGFuY2VvZiBTdGFyU2VnbWVudCkge1xuICAgICAgICAgIHBvc2l0aW9uYWxQYXJhbXNbc2VnbWVudC5uYW1lXSA9IGN1cnJlbnRTZWdtZW50LnRvU3RyaW5nKCk7XG4gICAgICAgICAgbmV4dFNlZ21lbnQgPSBudWxsO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlZ21lbnQgaW5zdGFuY2VvZiBEeW5hbWljU2VnbWVudCkge1xuICAgICAgICAgIHBvc2l0aW9uYWxQYXJhbXNbc2VnbWVudC5uYW1lXSA9IGN1cnJlbnRTZWdtZW50LnBhdGg7XG4gICAgICAgIH0gZWxzZSBpZiAoIXNlZ21lbnQubWF0Y2goY3VycmVudFNlZ21lbnQucGF0aCkpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIG5leHRTZWdtZW50ID0gY3VycmVudFNlZ21lbnQuY2hpbGQ7XG4gICAgICB9IGVsc2UgaWYgKCFzZWdtZW50Lm1hdGNoKCcnKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy50ZXJtaW5hbCAmJiBpc1ByZXNlbnQobmV4dFNlZ21lbnQpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgdXJsUGF0aCA9IGNhcHR1cmVkLmpvaW4oJy8nKTtcblxuICAgIHZhciBhdXhpbGlhcnk7XG4gICAgdmFyIHVybFBhcmFtcztcbiAgICB2YXIgYWxsUGFyYW1zO1xuICAgIGlmIChpc1ByZXNlbnQoY3VycmVudFNlZ21lbnQpKSB7XG4gICAgICAvLyBJZiB0aGlzIGlzIHRoZSByb290IGNvbXBvbmVudCwgcmVhZCBxdWVyeSBwYXJhbXMuIE90aGVyd2lzZSwgcmVhZCBtYXRyaXggcGFyYW1zLlxuICAgICAgdmFyIHBhcmFtc1NlZ21lbnQgPSBiZWdpbm5pbmdTZWdtZW50IGluc3RhbmNlb2YgUm9vdFVybCA/IGJlZ2lubmluZ1NlZ21lbnQgOiBjdXJyZW50U2VnbWVudDtcblxuICAgICAgYWxsUGFyYW1zID0gaXNQcmVzZW50KHBhcmFtc1NlZ21lbnQucGFyYW1zKSA/XG4gICAgICAgICAgICAgICAgICAgICAgU3RyaW5nTWFwV3JhcHBlci5tZXJnZShwYXJhbXNTZWdtZW50LnBhcmFtcywgcG9zaXRpb25hbFBhcmFtcykgOlxuICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uYWxQYXJhbXM7XG5cbiAgICAgIHVybFBhcmFtcyA9IHNlcmlhbGl6ZVBhcmFtcyhwYXJhbXNTZWdtZW50LnBhcmFtcyk7XG5cblxuICAgICAgYXV4aWxpYXJ5ID0gY3VycmVudFNlZ21lbnQuYXV4aWxpYXJ5O1xuICAgIH0gZWxzZSB7XG4gICAgICBhbGxQYXJhbXMgPSBwb3NpdGlvbmFsUGFyYW1zO1xuICAgICAgYXV4aWxpYXJ5ID0gW107XG4gICAgICB1cmxQYXJhbXMgPSBbXTtcbiAgICB9XG4gICAgcmV0dXJuIHt1cmxQYXRoLCB1cmxQYXJhbXMsIGFsbFBhcmFtcywgYXV4aWxpYXJ5LCBuZXh0U2VnbWVudH07XG4gIH1cblxuXG4gIGdlbmVyYXRlKHBhcmFtczoge1trZXk6IHN0cmluZ106IGFueX0pOiB7W2tleTogc3RyaW5nXTogYW55fSB7XG4gICAgdmFyIHBhcmFtVG9rZW5zID0gbmV3IFRvdWNoTWFwKHBhcmFtcyk7XG5cbiAgICB2YXIgcGF0aCA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9zZWdtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IHNlZ21lbnQgPSB0aGlzLl9zZWdtZW50c1tpXTtcbiAgICAgIGlmICghKHNlZ21lbnQgaW5zdGFuY2VvZiBDb250aW51YXRpb25TZWdtZW50KSkge1xuICAgICAgICBwYXRoLnB1c2goc2VnbWVudC5nZW5lcmF0ZShwYXJhbVRva2VucykpO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgdXJsUGF0aCA9IHBhdGguam9pbignLycpO1xuXG4gICAgdmFyIG5vblBvc2l0aW9uYWxQYXJhbXMgPSBwYXJhbVRva2Vucy5nZXRVbnVzZWQoKTtcbiAgICB2YXIgdXJsUGFyYW1zID0gc2VyaWFsaXplUGFyYW1zKG5vblBvc2l0aW9uYWxQYXJhbXMpO1xuXG4gICAgcmV0dXJuIHt1cmxQYXRoLCB1cmxQYXJhbXN9O1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvcm91dGVyL3BhdGhfcmVjb2duaXplci50c1xuICoqLyIsImltcG9ydCB7U3RyaW5nTWFwV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcbmltcG9ydCB7aXNQcmVzZW50LCBpc0JsYW5rLCBSZWdFeHBXcmFwcGVyLCBDT05TVF9FWFBSfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9uLCBXcmFwcGVkRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuXG4vKipcbiAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHBhcnNlZCBVUkxcbiAqL1xuZXhwb3J0IGNsYXNzIFVybCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwYXRoOiBzdHJpbmcsIHB1YmxpYyBjaGlsZDogVXJsID0gbnVsbCxcbiAgICAgICAgICAgICAgcHVibGljIGF1eGlsaWFyeTogVXJsW10gPSBDT05TVF9FWFBSKFtdKSxcbiAgICAgICAgICAgICAgcHVibGljIHBhcmFtczoge1trZXk6IHN0cmluZ106IGFueX0gPSBudWxsKSB7fVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGF0aCArIHRoaXMuX21hdHJpeFBhcmFtc1RvU3RyaW5nKCkgKyB0aGlzLl9hdXhUb1N0cmluZygpICsgdGhpcy5fY2hpbGRTdHJpbmcoKTtcbiAgfVxuXG4gIHNlZ21lbnRUb1N0cmluZygpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5wYXRoICsgdGhpcy5fbWF0cml4UGFyYW1zVG9TdHJpbmcoKTsgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2F1eFRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYXV4aWxpYXJ5Lmxlbmd0aCA+IDAgP1xuICAgICAgICAgICAgICAgKCcoJyArIHRoaXMuYXV4aWxpYXJ5Lm1hcChzaWJsaW5nID0+IHNpYmxpbmcudG9TdHJpbmcoKSkuam9pbignLy8nKSArICcpJykgOlxuICAgICAgICAgICAgICAgJyc7XG4gIH1cblxuICBwcml2YXRlIF9tYXRyaXhQYXJhbXNUb1N0cmluZygpOiBzdHJpbmcge1xuICAgIGlmIChpc0JsYW5rKHRoaXMucGFyYW1zKSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIHJldHVybiAnOycgKyBzZXJpYWxpemVQYXJhbXModGhpcy5wYXJhbXMpLmpvaW4oJzsnKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2NoaWxkU3RyaW5nKCk6IHN0cmluZyB7IHJldHVybiBpc1ByZXNlbnQodGhpcy5jaGlsZCkgPyAoJy8nICsgdGhpcy5jaGlsZC50b1N0cmluZygpKSA6ICcnOyB9XG59XG5cbmV4cG9ydCBjbGFzcyBSb290VXJsIGV4dGVuZHMgVXJsIHtcbiAgY29uc3RydWN0b3IocGF0aDogc3RyaW5nLCBjaGlsZDogVXJsID0gbnVsbCwgYXV4aWxpYXJ5OiBVcmxbXSA9IENPTlNUX0VYUFIoW10pLFxuICAgICAgICAgICAgICBwYXJhbXM6IHtba2V5OiBzdHJpbmddOiBhbnl9ID0gbnVsbCkge1xuICAgIHN1cGVyKHBhdGgsIGNoaWxkLCBhdXhpbGlhcnksIHBhcmFtcyk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhdGggKyB0aGlzLl9hdXhUb1N0cmluZygpICsgdGhpcy5fY2hpbGRTdHJpbmcoKSArIHRoaXMuX3F1ZXJ5UGFyYW1zVG9TdHJpbmcoKTtcbiAgfVxuXG4gIHNlZ21lbnRUb1N0cmluZygpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5wYXRoICsgdGhpcy5fcXVlcnlQYXJhbXNUb1N0cmluZygpOyB9XG5cbiAgcHJpdmF0ZSBfcXVlcnlQYXJhbXNUb1N0cmluZygpOiBzdHJpbmcge1xuICAgIGlmIChpc0JsYW5rKHRoaXMucGFyYW1zKSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIHJldHVybiAnPycgKyBzZXJpYWxpemVQYXJhbXModGhpcy5wYXJhbXMpLmpvaW4oJyYnKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGF0aFNlZ21lbnRzVG9VcmwocGF0aFNlZ21lbnRzOiBzdHJpbmdbXSk6IFVybCB7XG4gIHZhciB1cmwgPSBuZXcgVXJsKHBhdGhTZWdtZW50c1twYXRoU2VnbWVudHMubGVuZ3RoIC0gMV0pO1xuICBmb3IgKHZhciBpID0gcGF0aFNlZ21lbnRzLmxlbmd0aCAtIDI7IGkgPj0gMDsgaSAtPSAxKSB7XG4gICAgdXJsID0gbmV3IFVybChwYXRoU2VnbWVudHNbaV0sIHVybCk7XG4gIH1cbiAgcmV0dXJuIHVybDtcbn1cblxudmFyIFNFR01FTlRfUkUgPSBSZWdFeHBXcmFwcGVyLmNyZWF0ZSgnXlteXFxcXC9cXFxcKFxcXFwpXFxcXD87PSYjXSsnKTtcbmZ1bmN0aW9uIG1hdGNoVXJsU2VnbWVudChzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIHZhciBtYXRjaCA9IFJlZ0V4cFdyYXBwZXIuZmlyc3RNYXRjaChTRUdNRU5UX1JFLCBzdHIpO1xuICByZXR1cm4gaXNQcmVzZW50KG1hdGNoKSA/IG1hdGNoWzBdIDogJyc7XG59XG5cbmV4cG9ydCBjbGFzcyBVcmxQYXJzZXIge1xuICBwcml2YXRlIF9yZW1haW5pbmc6IHN0cmluZztcblxuICBwZWVrU3RhcnRzV2l0aChzdHI6IHN0cmluZyk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fcmVtYWluaW5nLnN0YXJ0c1dpdGgoc3RyKTsgfVxuXG4gIGNhcHR1cmUoc3RyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3JlbWFpbmluZy5zdGFydHNXaXRoKHN0cikpIHtcbiAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBFeHBlY3RlZCBcIiR7c3RyfVwiLmApO1xuICAgIH1cbiAgICB0aGlzLl9yZW1haW5pbmcgPSB0aGlzLl9yZW1haW5pbmcuc3Vic3RyaW5nKHN0ci5sZW5ndGgpO1xuICB9XG5cbiAgcGFyc2UodXJsOiBzdHJpbmcpOiBVcmwge1xuICAgIHRoaXMuX3JlbWFpbmluZyA9IHVybDtcbiAgICBpZiAodXJsID09ICcnIHx8IHVybCA9PSAnLycpIHtcbiAgICAgIHJldHVybiBuZXcgVXJsKCcnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGFyc2VSb290KCk7XG4gIH1cblxuICAvLyBzZWdtZW50ICsgKGF1eCBzZWdtZW50cykgKyAocXVlcnkgcGFyYW1zKVxuICBwYXJzZVJvb3QoKTogVXJsIHtcbiAgICBpZiAodGhpcy5wZWVrU3RhcnRzV2l0aCgnLycpKSB7XG4gICAgICB0aGlzLmNhcHR1cmUoJy8nKTtcbiAgICB9XG4gICAgdmFyIHBhdGggPSBtYXRjaFVybFNlZ21lbnQodGhpcy5fcmVtYWluaW5nKTtcbiAgICB0aGlzLmNhcHR1cmUocGF0aCk7XG5cbiAgICB2YXIgYXV4ID0gW107XG4gICAgaWYgKHRoaXMucGVla1N0YXJ0c1dpdGgoJygnKSkge1xuICAgICAgYXV4ID0gdGhpcy5wYXJzZUF1eGlsaWFyeVJvdXRlcygpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wZWVrU3RhcnRzV2l0aCgnOycpKSB7XG4gICAgICAvLyBUT0RPOiBzaG91bGQgdGhlc2UgcGFyYW1zIGp1c3QgYmUgZHJvcHBlZD9cbiAgICAgIHRoaXMucGFyc2VNYXRyaXhQYXJhbXMoKTtcbiAgICB9XG4gICAgdmFyIGNoaWxkID0gbnVsbDtcbiAgICBpZiAodGhpcy5wZWVrU3RhcnRzV2l0aCgnLycpICYmICF0aGlzLnBlZWtTdGFydHNXaXRoKCcvLycpKSB7XG4gICAgICB0aGlzLmNhcHR1cmUoJy8nKTtcbiAgICAgIGNoaWxkID0gdGhpcy5wYXJzZVNlZ21lbnQoKTtcbiAgICB9XG4gICAgdmFyIHF1ZXJ5UGFyYW1zID0gbnVsbDtcbiAgICBpZiAodGhpcy5wZWVrU3RhcnRzV2l0aCgnPycpKSB7XG4gICAgICBxdWVyeVBhcmFtcyA9IHRoaXMucGFyc2VRdWVyeVBhcmFtcygpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFJvb3RVcmwocGF0aCwgY2hpbGQsIGF1eCwgcXVlcnlQYXJhbXMpO1xuICB9XG5cbiAgLy8gc2VnbWVudCArIChtYXRyaXggcGFyYW1zKSArIChhdXggc2VnbWVudHMpXG4gIHBhcnNlU2VnbWVudCgpOiBVcmwge1xuICAgIGlmICh0aGlzLl9yZW1haW5pbmcubGVuZ3RoID09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy5wZWVrU3RhcnRzV2l0aCgnLycpKSB7XG4gICAgICB0aGlzLmNhcHR1cmUoJy8nKTtcbiAgICB9XG4gICAgdmFyIHBhdGggPSBtYXRjaFVybFNlZ21lbnQodGhpcy5fcmVtYWluaW5nKTtcbiAgICB0aGlzLmNhcHR1cmUocGF0aCk7XG5cbiAgICB2YXIgbWF0cml4UGFyYW1zID0gbnVsbDtcbiAgICBpZiAodGhpcy5wZWVrU3RhcnRzV2l0aCgnOycpKSB7XG4gICAgICBtYXRyaXhQYXJhbXMgPSB0aGlzLnBhcnNlTWF0cml4UGFyYW1zKCk7XG4gICAgfVxuICAgIHZhciBhdXggPSBbXTtcbiAgICBpZiAodGhpcy5wZWVrU3RhcnRzV2l0aCgnKCcpKSB7XG4gICAgICBhdXggPSB0aGlzLnBhcnNlQXV4aWxpYXJ5Um91dGVzKCk7XG4gICAgfVxuICAgIHZhciBjaGlsZCA9IG51bGw7XG4gICAgaWYgKHRoaXMucGVla1N0YXJ0c1dpdGgoJy8nKSAmJiAhdGhpcy5wZWVrU3RhcnRzV2l0aCgnLy8nKSkge1xuICAgICAgdGhpcy5jYXB0dXJlKCcvJyk7XG4gICAgICBjaGlsZCA9IHRoaXMucGFyc2VTZWdtZW50KCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVXJsKHBhdGgsIGNoaWxkLCBhdXgsIG1hdHJpeFBhcmFtcyk7XG4gIH1cblxuICBwYXJzZVF1ZXJ5UGFyYW1zKCk6IHtba2V5OiBzdHJpbmddOiBhbnl9IHtcbiAgICB2YXIgcGFyYW1zID0ge307XG4gICAgdGhpcy5jYXB0dXJlKCc/Jyk7XG4gICAgdGhpcy5wYXJzZVBhcmFtKHBhcmFtcyk7XG4gICAgd2hpbGUgKHRoaXMuX3JlbWFpbmluZy5sZW5ndGggPiAwICYmIHRoaXMucGVla1N0YXJ0c1dpdGgoJyYnKSkge1xuICAgICAgdGhpcy5jYXB0dXJlKCcmJyk7XG4gICAgICB0aGlzLnBhcnNlUGFyYW0ocGFyYW1zKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIHBhcnNlTWF0cml4UGFyYW1zKCk6IHtba2V5OiBzdHJpbmddOiBhbnl9IHtcbiAgICB2YXIgcGFyYW1zID0ge307XG4gICAgd2hpbGUgKHRoaXMuX3JlbWFpbmluZy5sZW5ndGggPiAwICYmIHRoaXMucGVla1N0YXJ0c1dpdGgoJzsnKSkge1xuICAgICAgdGhpcy5jYXB0dXJlKCc7Jyk7XG4gICAgICB0aGlzLnBhcnNlUGFyYW0ocGFyYW1zKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIHBhcnNlUGFyYW0ocGFyYW1zOiB7W2tleTogc3RyaW5nXTogYW55fSk6IHZvaWQge1xuICAgIHZhciBrZXkgPSBtYXRjaFVybFNlZ21lbnQodGhpcy5fcmVtYWluaW5nKTtcbiAgICBpZiAoaXNCbGFuayhrZXkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY2FwdHVyZShrZXkpO1xuICAgIHZhciB2YWx1ZTogYW55ID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5wZWVrU3RhcnRzV2l0aCgnPScpKSB7XG4gICAgICB0aGlzLmNhcHR1cmUoJz0nKTtcbiAgICAgIHZhciB2YWx1ZU1hdGNoID0gbWF0Y2hVcmxTZWdtZW50KHRoaXMuX3JlbWFpbmluZyk7XG4gICAgICBpZiAoaXNQcmVzZW50KHZhbHVlTWF0Y2gpKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWVNYXRjaDtcbiAgICAgICAgdGhpcy5jYXB0dXJlKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwYXJhbXNba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcGFyc2VBdXhpbGlhcnlSb3V0ZXMoKTogVXJsW10ge1xuICAgIHZhciByb3V0ZXMgPSBbXTtcbiAgICB0aGlzLmNhcHR1cmUoJygnKTtcblxuICAgIHdoaWxlICghdGhpcy5wZWVrU3RhcnRzV2l0aCgnKScpICYmIHRoaXMuX3JlbWFpbmluZy5sZW5ndGggPiAwKSB7XG4gICAgICByb3V0ZXMucHVzaCh0aGlzLnBhcnNlU2VnbWVudCgpKTtcbiAgICAgIGlmICh0aGlzLnBlZWtTdGFydHNXaXRoKCcvLycpKSB7XG4gICAgICAgIHRoaXMuY2FwdHVyZSgnLy8nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jYXB0dXJlKCcpJyk7XG5cbiAgICByZXR1cm4gcm91dGVzO1xuICB9XG59XG5cbmV4cG9ydCB2YXIgcGFyc2VyID0gbmV3IFVybFBhcnNlcigpO1xuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplUGFyYW1zKHBhcmFtTWFwOiB7W2tleTogc3RyaW5nXTogYW55fSk6IHN0cmluZ1tdIHtcbiAgdmFyIHBhcmFtcyA9IFtdO1xuICBpZiAoaXNQcmVzZW50KHBhcmFtTWFwKSkge1xuICAgIFN0cmluZ01hcFdyYXBwZXIuZm9yRWFjaChwYXJhbU1hcCwgKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIGlmICh2YWx1ZSA9PSB0cnVlKSB7XG4gICAgICAgIHBhcmFtcy5wdXNoKGtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJhbXMucHVzaChrZXkgKyAnPScgKyB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHBhcmFtcztcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9yb3V0ZXIvdXJsX3BhcnNlci50c1xuICoqLyIsImltcG9ydCB7aXNCbGFuaywgaXNQcmVzZW50fSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9uLCBXcmFwcGVkRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtNYXAsIE1hcFdyYXBwZXIsIExpc3RXcmFwcGVyLCBTdHJpbmdNYXBXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtQcm9taXNlLCBQcm9taXNlV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9hc3luYyc7XG5cbmltcG9ydCB7XG4gIEFic3RyYWN0UmVjb2duaXplcixcbiAgUm91dGVSZWNvZ25pemVyLFxuICBSZWRpcmVjdFJlY29nbml6ZXIsXG4gIFJvdXRlTWF0Y2hcbn0gZnJvbSAnLi9yb3V0ZV9yZWNvZ25pemVyJztcbmltcG9ydCB7Um91dGUsIEFzeW5jUm91dGUsIEF1eFJvdXRlLCBSZWRpcmVjdCwgUm91dGVEZWZpbml0aW9ufSBmcm9tICcuL3JvdXRlX2NvbmZpZ19pbXBsJztcbmltcG9ydCB7QXN5bmNSb3V0ZUhhbmRsZXJ9IGZyb20gJy4vYXN5bmNfcm91dGVfaGFuZGxlcic7XG5pbXBvcnQge1N5bmNSb3V0ZUhhbmRsZXJ9IGZyb20gJy4vc3luY19yb3V0ZV9oYW5kbGVyJztcbmltcG9ydCB7VXJsfSBmcm9tICcuL3VybF9wYXJzZXInO1xuaW1wb3J0IHtDb21wb25lbnRJbnN0cnVjdGlvbn0gZnJvbSAnLi9pbnN0cnVjdGlvbic7XG5cblxuLyoqXG4gKiBgQ29tcG9uZW50UmVjb2duaXplcmAgaXMgcmVzcG9uc2libGUgZm9yIHJlY29nbml6aW5nIHJvdXRlcyBmb3IgYSBzaW5nbGUgY29tcG9uZW50LlxuICogSXQgaXMgY29uc3VtZWQgYnkgYFJvdXRlUmVnaXN0cnlgLCB3aGljaCBrbm93cyBob3cgdG8gcmVjb2duaXplIGFuIGVudGlyZSBoaWVyYXJjaHkgb2ZcbiAqIGNvbXBvbmVudHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb21wb25lbnRSZWNvZ25pemVyIHtcbiAgbmFtZXMgPSBuZXcgTWFwPHN0cmluZywgUm91dGVSZWNvZ25pemVyPigpO1xuXG4gIC8vIG1hcCBmcm9tIG5hbWUgdG8gcmVjb2duaXplclxuICBhdXhOYW1lcyA9IG5ldyBNYXA8c3RyaW5nLCBSb3V0ZVJlY29nbml6ZXI+KCk7XG5cbiAgLy8gbWFwIGZyb20gc3RhcnRpbmcgcGF0aCB0byByZWNvZ25pemVyXG4gIGF1eFJvdXRlcyA9IG5ldyBNYXA8c3RyaW5nLCBSb3V0ZVJlY29nbml6ZXI+KCk7XG5cbiAgLy8gVE9ETzogb3B0aW1pemUgdGhpcyBpbnRvIGEgdHJpZVxuICBtYXRjaGVyczogQWJzdHJhY3RSZWNvZ25pemVyW10gPSBbXTtcblxuICBkZWZhdWx0Um91dGU6IFJvdXRlUmVjb2duaXplciA9IG51bGw7XG5cbiAgLyoqXG4gICAqIHJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGNvbmZpZyBpcyB0ZXJtaW5hbFxuICAgKi9cbiAgY29uZmlnKGNvbmZpZzogUm91dGVEZWZpbml0aW9uKTogYm9vbGVhbiB7XG4gICAgdmFyIGhhbmRsZXI7XG5cbiAgICBpZiAoaXNQcmVzZW50KGNvbmZpZy5uYW1lKSAmJiBjb25maWcubmFtZVswXS50b1VwcGVyQ2FzZSgpICE9IGNvbmZpZy5uYW1lWzBdKSB7XG4gICAgICB2YXIgc3VnZ2VzdGVkTmFtZSA9IGNvbmZpZy5uYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBjb25maWcubmFtZS5zdWJzdHJpbmcoMSk7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihcbiAgICAgICAgICBgUm91dGUgXCIke2NvbmZpZy5wYXRofVwiIHdpdGggbmFtZSBcIiR7Y29uZmlnLm5hbWV9XCIgZG9lcyBub3QgYmVnaW4gd2l0aCBhbiB1cHBlcmNhc2UgbGV0dGVyLiBSb3V0ZSBuYW1lcyBzaG91bGQgYmUgQ2FtZWxDYXNlIGxpa2UgXCIke3N1Z2dlc3RlZE5hbWV9XCIuYCk7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZyBpbnN0YW5jZW9mIEF1eFJvdXRlKSB7XG4gICAgICBoYW5kbGVyID0gbmV3IFN5bmNSb3V0ZUhhbmRsZXIoY29uZmlnLmNvbXBvbmVudCwgY29uZmlnLmRhdGEpO1xuICAgICAgbGV0IHBhdGggPSBjb25maWcucGF0aC5zdGFydHNXaXRoKCcvJykgPyBjb25maWcucGF0aC5zdWJzdHJpbmcoMSkgOiBjb25maWcucGF0aDtcbiAgICAgIHZhciByZWNvZ25pemVyID0gbmV3IFJvdXRlUmVjb2duaXplcihjb25maWcucGF0aCwgaGFuZGxlcik7XG4gICAgICB0aGlzLmF1eFJvdXRlcy5zZXQocGF0aCwgcmVjb2duaXplcik7XG4gICAgICBpZiAoaXNQcmVzZW50KGNvbmZpZy5uYW1lKSkge1xuICAgICAgICB0aGlzLmF1eE5hbWVzLnNldChjb25maWcubmFtZSwgcmVjb2duaXplcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVjb2duaXplci50ZXJtaW5hbDtcbiAgICB9XG5cbiAgICB2YXIgdXNlQXNEZWZhdWx0ID0gZmFsc2U7XG5cbiAgICBpZiAoY29uZmlnIGluc3RhbmNlb2YgUmVkaXJlY3QpIHtcbiAgICAgIGxldCByZWRpcmVjdG9yID0gbmV3IFJlZGlyZWN0UmVjb2duaXplcihjb25maWcucGF0aCwgY29uZmlnLnJlZGlyZWN0VG8pO1xuICAgICAgdGhpcy5fYXNzZXJ0Tm9IYXNoQ29sbGlzaW9uKHJlZGlyZWN0b3IuaGFzaCwgY29uZmlnLnBhdGgpO1xuICAgICAgdGhpcy5tYXRjaGVycy5wdXNoKHJlZGlyZWN0b3IpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZyBpbnN0YW5jZW9mIFJvdXRlKSB7XG4gICAgICBoYW5kbGVyID0gbmV3IFN5bmNSb3V0ZUhhbmRsZXIoY29uZmlnLmNvbXBvbmVudCwgY29uZmlnLmRhdGEpO1xuICAgICAgdXNlQXNEZWZhdWx0ID0gaXNQcmVzZW50KGNvbmZpZy51c2VBc0RlZmF1bHQpICYmIGNvbmZpZy51c2VBc0RlZmF1bHQ7XG4gICAgfSBlbHNlIGlmIChjb25maWcgaW5zdGFuY2VvZiBBc3luY1JvdXRlKSB7XG4gICAgICBoYW5kbGVyID0gbmV3IEFzeW5jUm91dGVIYW5kbGVyKGNvbmZpZy5sb2FkZXIsIGNvbmZpZy5kYXRhKTtcbiAgICAgIHVzZUFzRGVmYXVsdCA9IGlzUHJlc2VudChjb25maWcudXNlQXNEZWZhdWx0KSAmJiBjb25maWcudXNlQXNEZWZhdWx0O1xuICAgIH1cbiAgICB2YXIgcmVjb2duaXplciA9IG5ldyBSb3V0ZVJlY29nbml6ZXIoY29uZmlnLnBhdGgsIGhhbmRsZXIpO1xuXG4gICAgdGhpcy5fYXNzZXJ0Tm9IYXNoQ29sbGlzaW9uKHJlY29nbml6ZXIuaGFzaCwgY29uZmlnLnBhdGgpO1xuXG4gICAgaWYgKHVzZUFzRGVmYXVsdCkge1xuICAgICAgaWYgKGlzUHJlc2VudCh0aGlzLmRlZmF1bHRSb3V0ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYE9ubHkgb25lIHJvdXRlIGNhbiBiZSBkZWZhdWx0YCk7XG4gICAgICB9XG4gICAgICB0aGlzLmRlZmF1bHRSb3V0ZSA9IHJlY29nbml6ZXI7XG4gICAgfVxuXG4gICAgdGhpcy5tYXRjaGVycy5wdXNoKHJlY29nbml6ZXIpO1xuICAgIGlmIChpc1ByZXNlbnQoY29uZmlnLm5hbWUpKSB7XG4gICAgICB0aGlzLm5hbWVzLnNldChjb25maWcubmFtZSwgcmVjb2duaXplcik7XG4gICAgfVxuICAgIHJldHVybiByZWNvZ25pemVyLnRlcm1pbmFsO1xuICB9XG5cblxuICBwcml2YXRlIF9hc3NlcnROb0hhc2hDb2xsaXNpb24oaGFzaDogc3RyaW5nLCBwYXRoKSB7XG4gICAgdGhpcy5tYXRjaGVycy5mb3JFYWNoKChtYXRjaGVyKSA9PiB7XG4gICAgICBpZiAoaGFzaCA9PSBtYXRjaGVyLmhhc2gpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oXG4gICAgICAgICAgICBgQ29uZmlndXJhdGlvbiAnJHtwYXRofScgY29uZmxpY3RzIHdpdGggZXhpc3Rpbmcgcm91dGUgJyR7bWF0Y2hlci5wYXRofSdgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEdpdmVuIGEgVVJMLCByZXR1cm5zIGEgbGlzdCBvZiBgUm91dGVNYXRjaGBlcywgd2hpY2ggYXJlIHBhcnRpYWwgcmVjb2duaXRpb25zIGZvciBzb21lIHJvdXRlLlxuICAgKi9cbiAgcmVjb2duaXplKHVybFBhcnNlOiBVcmwpOiBQcm9taXNlPFJvdXRlTWF0Y2g+W10ge1xuICAgIHZhciBzb2x1dGlvbnMgPSBbXTtcblxuICAgIHRoaXMubWF0Y2hlcnMuZm9yRWFjaCgocm91dGVSZWNvZ25pemVyOiBBYnN0cmFjdFJlY29nbml6ZXIpID0+IHtcbiAgICAgIHZhciBwYXRoTWF0Y2ggPSByb3V0ZVJlY29nbml6ZXIucmVjb2duaXplKHVybFBhcnNlKTtcblxuICAgICAgaWYgKGlzUHJlc2VudChwYXRoTWF0Y2gpKSB7XG4gICAgICAgIHNvbHV0aW9ucy5wdXNoKHBhdGhNYXRjaCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc29sdXRpb25zO1xuICB9XG5cbiAgcmVjb2duaXplQXV4aWxpYXJ5KHVybFBhcnNlOiBVcmwpOiBQcm9taXNlPFJvdXRlTWF0Y2g+W10ge1xuICAgIHZhciByb3V0ZVJlY29nbml6ZXI6IFJvdXRlUmVjb2duaXplciA9IHRoaXMuYXV4Um91dGVzLmdldCh1cmxQYXJzZS5wYXRoKTtcbiAgICBpZiAoaXNQcmVzZW50KHJvdXRlUmVjb2duaXplcikpIHtcbiAgICAgIHJldHVybiBbcm91dGVSZWNvZ25pemVyLnJlY29nbml6ZSh1cmxQYXJzZSldO1xuICAgIH1cblxuICAgIHJldHVybiBbUHJvbWlzZVdyYXBwZXIucmVzb2x2ZShudWxsKV07XG4gIH1cblxuICBoYXNSb3V0ZShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMubmFtZXMuaGFzKG5hbWUpOyB9XG5cbiAgY29tcG9uZW50TG9hZGVkKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc1JvdXRlKG5hbWUpICYmIGlzUHJlc2VudCh0aGlzLm5hbWVzLmdldChuYW1lKS5oYW5kbGVyLmNvbXBvbmVudFR5cGUpO1xuICB9XG5cbiAgbG9hZENvbXBvbmVudChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLm5hbWVzLmdldChuYW1lKS5oYW5kbGVyLnJlc29sdmVDb21wb25lbnRUeXBlKCk7XG4gIH1cblxuICBnZW5lcmF0ZShuYW1lOiBzdHJpbmcsIHBhcmFtczogYW55KTogQ29tcG9uZW50SW5zdHJ1Y3Rpb24ge1xuICAgIHZhciBwYXRoUmVjb2duaXplcjogUm91dGVSZWNvZ25pemVyID0gdGhpcy5uYW1lcy5nZXQobmFtZSk7XG4gICAgaWYgKGlzQmxhbmsocGF0aFJlY29nbml6ZXIpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGhSZWNvZ25pemVyLmdlbmVyYXRlKHBhcmFtcyk7XG4gIH1cblxuICBnZW5lcmF0ZUF1eGlsaWFyeShuYW1lOiBzdHJpbmcsIHBhcmFtczogYW55KTogQ29tcG9uZW50SW5zdHJ1Y3Rpb24ge1xuICAgIHZhciBwYXRoUmVjb2duaXplcjogUm91dGVSZWNvZ25pemVyID0gdGhpcy5hdXhOYW1lcy5nZXQobmFtZSk7XG4gICAgaWYgKGlzQmxhbmsocGF0aFJlY29nbml6ZXIpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGhSZWNvZ25pemVyLmdlbmVyYXRlKHBhcmFtcyk7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9yb3V0ZXIvY29tcG9uZW50X3JlY29nbml6ZXIudHNcbiAqKi8iLCJpbXBvcnQge1Byb21pc2UsIFByb21pc2VXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2FzeW5jJztcbmltcG9ydCB7aXNQcmVzZW50LCBUeXBlfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuXG5pbXBvcnQge1JvdXRlSGFuZGxlcn0gZnJvbSAnLi9yb3V0ZV9oYW5kbGVyJztcbmltcG9ydCB7Um91dGVEYXRhLCBCTEFOS19ST1VURV9EQVRBfSBmcm9tICcuL2luc3RydWN0aW9uJztcblxuXG5leHBvcnQgY2xhc3MgQXN5bmNSb3V0ZUhhbmRsZXIgaW1wbGVtZW50cyBSb3V0ZUhhbmRsZXIge1xuICAvKiogQGludGVybmFsICovXG4gIF9yZXNvbHZlZENvbXBvbmVudDogUHJvbWlzZTxhbnk+ID0gbnVsbDtcbiAgY29tcG9uZW50VHlwZTogVHlwZTtcbiAgcHVibGljIGRhdGE6IFJvdXRlRGF0YTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9sb2FkZXI6IEZ1bmN0aW9uLCBkYXRhOiB7W2tleTogc3RyaW5nXTogYW55fSA9IG51bGwpIHtcbiAgICB0aGlzLmRhdGEgPSBpc1ByZXNlbnQoZGF0YSkgPyBuZXcgUm91dGVEYXRhKGRhdGEpIDogQkxBTktfUk9VVEVfREFUQTtcbiAgfVxuXG4gIHJlc29sdmVDb21wb25lbnRUeXBlKCk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLl9yZXNvbHZlZENvbXBvbmVudCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZXNvbHZlZENvbXBvbmVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fcmVzb2x2ZWRDb21wb25lbnQgPSB0aGlzLl9sb2FkZXIoKS50aGVuKChjb21wb25lbnRUeXBlKSA9PiB7XG4gICAgICB0aGlzLmNvbXBvbmVudFR5cGUgPSBjb21wb25lbnRUeXBlO1xuICAgICAgcmV0dXJuIGNvbXBvbmVudFR5cGU7XG4gICAgfSk7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9yb3V0ZXIvYXN5bmNfcm91dGVfaGFuZGxlci50c1xuICoqLyIsImltcG9ydCB7UHJvbWlzZSwgUHJvbWlzZVdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvYXN5bmMnO1xuaW1wb3J0IHtpc1ByZXNlbnQsIFR5cGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5cbmltcG9ydCB7Um91dGVIYW5kbGVyfSBmcm9tICcuL3JvdXRlX2hhbmRsZXInO1xuaW1wb3J0IHtSb3V0ZURhdGEsIEJMQU5LX1JPVVRFX0RBVEF9IGZyb20gJy4vaW5zdHJ1Y3Rpb24nO1xuXG5cbmV4cG9ydCBjbGFzcyBTeW5jUm91dGVIYW5kbGVyIGltcGxlbWVudHMgUm91dGVIYW5kbGVyIHtcbiAgcHVibGljIGRhdGE6IFJvdXRlRGF0YTtcblxuICAvKiogQGludGVybmFsICovXG4gIF9yZXNvbHZlZENvbXBvbmVudDogUHJvbWlzZTxhbnk+ID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgY29tcG9uZW50VHlwZTogVHlwZSwgZGF0YT86IHtba2V5OiBzdHJpbmddOiBhbnl9KSB7XG4gICAgdGhpcy5fcmVzb2x2ZWRDb21wb25lbnQgPSBQcm9taXNlV3JhcHBlci5yZXNvbHZlKGNvbXBvbmVudFR5cGUpO1xuICAgIHRoaXMuZGF0YSA9IGlzUHJlc2VudChkYXRhKSA/IG5ldyBSb3V0ZURhdGEoZGF0YSkgOiBCTEFOS19ST1VURV9EQVRBO1xuICB9XG5cbiAgcmVzb2x2ZUNvbXBvbmVudFR5cGUoKTogUHJvbWlzZTxhbnk+IHsgcmV0dXJuIHRoaXMuX3Jlc29sdmVkQ29tcG9uZW50OyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvcm91dGVyL3N5bmNfcm91dGVfaGFuZGxlci50c1xuICoqLyIsImltcG9ydCB7QXN5bmNSb3V0ZSwgQXV4Um91dGUsIFJvdXRlLCBSZWRpcmVjdCwgUm91dGVEZWZpbml0aW9ufSBmcm9tICcuL3JvdXRlX2NvbmZpZ19kZWNvcmF0b3InO1xuaW1wb3J0IHtDb21wb25lbnREZWZpbml0aW9ufSBmcm9tICcuL3JvdXRlX2RlZmluaXRpb24nO1xuaW1wb3J0IHtpc1R5cGUsIFR5cGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge0Jhc2VFeGNlcHRpb24sIFdyYXBwZWRFeGNlcHRpb259IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9ucyc7XG5pbXBvcnQge1JvdXRlUmVnaXN0cnl9IGZyb20gJy4vcm91dGVfcmVnaXN0cnknO1xuXG5cbi8qKlxuICogR2l2ZW4gYSBKUyBPYmplY3QgdGhhdCByZXByZXNlbnRzIGEgcm91dGUgY29uZmlnLCByZXR1cm5zIGEgY29ycmVzcG9uZGluZyBSb3V0ZSwgQXN5bmNSb3V0ZSxcbiAqIEF1eFJvdXRlIG9yIFJlZGlyZWN0IG9iamVjdC5cbiAqXG4gKiBBbHNvIHdyYXBzIGFuIEFzeW5jUm91dGUncyBsb2FkZXIgZnVuY3Rpb24gdG8gYWRkIHRoZSBsb2FkZWQgY29tcG9uZW50J3Mgcm91dGUgY29uZmlnIHRvIHRoZVxuICogYFJvdXRlUmVnaXN0cnlgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplUm91dGVDb25maWcoY29uZmlnOiBSb3V0ZURlZmluaXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0cnk6IFJvdXRlUmVnaXN0cnkpOiBSb3V0ZURlZmluaXRpb24ge1xuICBpZiAoY29uZmlnIGluc3RhbmNlb2YgQXN5bmNSb3V0ZSkge1xuICAgIHZhciB3cmFwcGVkTG9hZGVyID0gd3JhcExvYWRlclRvUmVjb25maWd1cmVSZWdpc3RyeShjb25maWcubG9hZGVyLCByZWdpc3RyeSk7XG4gICAgcmV0dXJuIG5ldyBBc3luY1JvdXRlKHtcbiAgICAgIHBhdGg6IGNvbmZpZy5wYXRoLFxuICAgICAgbG9hZGVyOiB3cmFwcGVkTG9hZGVyLFxuICAgICAgbmFtZTogY29uZmlnLm5hbWUsXG4gICAgICBkYXRhOiBjb25maWcuZGF0YSxcbiAgICAgIHVzZUFzRGVmYXVsdDogY29uZmlnLnVzZUFzRGVmYXVsdFxuICAgIH0pO1xuICB9XG4gIGlmIChjb25maWcgaW5zdGFuY2VvZiBSb3V0ZSB8fCBjb25maWcgaW5zdGFuY2VvZiBSZWRpcmVjdCB8fCBjb25maWcgaW5zdGFuY2VvZiBBdXhSb3V0ZSkge1xuICAgIHJldHVybiA8Um91dGVEZWZpbml0aW9uPmNvbmZpZztcbiAgfVxuXG4gIGlmICgoKyEhY29uZmlnLmNvbXBvbmVudCkgKyAoKyEhY29uZmlnLnJlZGlyZWN0VG8pICsgKCshIWNvbmZpZy5sb2FkZXIpICE9IDEpIHtcbiAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihcbiAgICAgICAgYFJvdXRlIGNvbmZpZyBzaG91bGQgY29udGFpbiBleGFjdGx5IG9uZSBcImNvbXBvbmVudFwiLCBcImxvYWRlclwiLCBvciBcInJlZGlyZWN0VG9cIiBwcm9wZXJ0eS5gKTtcbiAgfVxuICBpZiAoY29uZmlnLmFzICYmIGNvbmZpZy5uYW1lKSB7XG4gICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYFJvdXRlIGNvbmZpZyBzaG91bGQgY29udGFpbiBleGFjdGx5IG9uZSBcImFzXCIgb3IgXCJuYW1lXCIgcHJvcGVydHkuYCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5hcykge1xuICAgIGNvbmZpZy5uYW1lID0gY29uZmlnLmFzO1xuICB9XG4gIGlmIChjb25maWcubG9hZGVyKSB7XG4gICAgdmFyIHdyYXBwZWRMb2FkZXIgPSB3cmFwTG9hZGVyVG9SZWNvbmZpZ3VyZVJlZ2lzdHJ5KGNvbmZpZy5sb2FkZXIsIHJlZ2lzdHJ5KTtcbiAgICByZXR1cm4gbmV3IEFzeW5jUm91dGUoe1xuICAgICAgcGF0aDogY29uZmlnLnBhdGgsXG4gICAgICBsb2FkZXI6IHdyYXBwZWRMb2FkZXIsXG4gICAgICBuYW1lOiBjb25maWcubmFtZSxcbiAgICAgIHVzZUFzRGVmYXVsdDogY29uZmlnLnVzZUFzRGVmYXVsdFxuICAgIH0pO1xuICB9XG4gIGlmIChjb25maWcuYXV4KSB7XG4gICAgcmV0dXJuIG5ldyBBdXhSb3V0ZSh7cGF0aDogY29uZmlnLmF1eCwgY29tcG9uZW50OjxUeXBlPmNvbmZpZy5jb21wb25lbnQsIG5hbWU6IGNvbmZpZy5uYW1lfSk7XG4gIH1cbiAgaWYgKGNvbmZpZy5jb21wb25lbnQpIHtcbiAgICBpZiAodHlwZW9mIGNvbmZpZy5jb21wb25lbnQgPT0gJ29iamVjdCcpIHtcbiAgICAgIGxldCBjb21wb25lbnREZWZpbml0aW9uT2JqZWN0ID0gPENvbXBvbmVudERlZmluaXRpb24+Y29uZmlnLmNvbXBvbmVudDtcbiAgICAgIGlmIChjb21wb25lbnREZWZpbml0aW9uT2JqZWN0LnR5cGUgPT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICByZXR1cm4gbmV3IFJvdXRlKHtcbiAgICAgICAgICBwYXRoOiBjb25maWcucGF0aCxcbiAgICAgICAgICBjb21wb25lbnQ6PFR5cGU+Y29tcG9uZW50RGVmaW5pdGlvbk9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICBuYW1lOiBjb25maWcubmFtZSxcbiAgICAgICAgICBkYXRhOiBjb25maWcuZGF0YSxcbiAgICAgICAgICB1c2VBc0RlZmF1bHQ6IGNvbmZpZy51c2VBc0RlZmF1bHRcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGNvbXBvbmVudERlZmluaXRpb25PYmplY3QudHlwZSA9PSAnbG9hZGVyJykge1xuICAgICAgICByZXR1cm4gbmV3IEFzeW5jUm91dGUoe1xuICAgICAgICAgIHBhdGg6IGNvbmZpZy5wYXRoLFxuICAgICAgICAgIGxvYWRlcjogY29tcG9uZW50RGVmaW5pdGlvbk9iamVjdC5sb2FkZXIsXG4gICAgICAgICAgbmFtZTogY29uZmlnLm5hbWUsXG4gICAgICAgICAgdXNlQXNEZWZhdWx0OiBjb25maWcudXNlQXNEZWZhdWx0XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oXG4gICAgICAgICAgICBgSW52YWxpZCBjb21wb25lbnQgdHlwZSBcIiR7Y29tcG9uZW50RGVmaW5pdGlvbk9iamVjdC50eXBlfVwiLiBWYWxpZCB0eXBlcyBhcmUgXCJjb25zdHJ1Y3RvclwiIGFuZCBcImxvYWRlclwiLmApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IFJvdXRlKDx7XG4gICAgICBwYXRoOiBzdHJpbmc7XG4gICAgICBjb21wb25lbnQ6IFR5cGU7XG4gICAgICBuYW1lPzogc3RyaW5nO1xuICAgICAgZGF0YT86IHtba2V5OiBzdHJpbmddOiBhbnl9O1xuICAgICAgdXNlQXNEZWZhdWx0PzogYm9vbGVhbjtcbiAgICB9PmNvbmZpZyk7XG4gIH1cblxuICBpZiAoY29uZmlnLnJlZGlyZWN0VG8pIHtcbiAgICByZXR1cm4gbmV3IFJlZGlyZWN0KHtwYXRoOiBjb25maWcucGF0aCwgcmVkaXJlY3RUbzogY29uZmlnLnJlZGlyZWN0VG99KTtcbiAgfVxuXG4gIHJldHVybiBjb25maWc7XG59XG5cblxuZnVuY3Rpb24gd3JhcExvYWRlclRvUmVjb25maWd1cmVSZWdpc3RyeShsb2FkZXI6IEZ1bmN0aW9uLCByZWdpc3RyeTogUm91dGVSZWdpc3RyeSk6IEZ1bmN0aW9uIHtcbiAgcmV0dXJuICgpID0+IHtcbiAgICByZXR1cm4gbG9hZGVyKCkudGhlbigoY29tcG9uZW50VHlwZSkgPT4ge1xuICAgICAgcmVnaXN0cnkuY29uZmlnRnJvbUNvbXBvbmVudChjb21wb25lbnRUeXBlKTtcbiAgICAgIHJldHVybiBjb21wb25lbnRUeXBlO1xuICAgIH0pO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Q29tcG9uZW50RXhpc3RzKGNvbXBvbmVudDogVHlwZSwgcGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghaXNUeXBlKGNvbXBvbmVudCkpIHtcbiAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgQ29tcG9uZW50IGZvciByb3V0ZSBcIiR7cGF0aH1cIiBpcyBub3QgZGVmaW5lZCwgb3IgaXMgbm90IGEgY2xhc3MuYCk7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9yb3V0ZXIvcm91dGVfY29uZmlnX25vbWFsaXplci50c1xuICoqLyIsImltcG9ydCB7Um91dGVDb25maWcgYXMgUm91dGVDb25maWdBbm5vdGF0aW9uLCBSb3V0ZURlZmluaXRpb259IGZyb20gJy4vcm91dGVfY29uZmlnX2ltcGwnO1xuaW1wb3J0IHttYWtlRGVjb3JhdG9yfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS91dGlsL2RlY29yYXRvcnMnO1xuXG5leHBvcnQge1JvdXRlLCBSZWRpcmVjdCwgQXV4Um91dGUsIEFzeW5jUm91dGUsIFJvdXRlRGVmaW5pdGlvbn0gZnJvbSAnLi9yb3V0ZV9jb25maWdfaW1wbCc7XG5cbi8vIENvcGllZCBmcm9tIFJvdXRlQ29uZmlnIGluIHJvdXRlX2NvbmZpZ19pbXBsLlxuLyoqXG4gKiBUaGUgYFJvdXRlQ29uZmlnYCBkZWNvcmF0b3IgZGVmaW5lcyByb3V0ZXMgZm9yIGEgZ2l2ZW4gY29tcG9uZW50LlxuICpcbiAqIEl0IHRha2VzIGFuIGFycmF5IG9mIHtAbGluayBSb3V0ZURlZmluaXRpb259cy5cbiAqL1xuZXhwb3J0IHZhciBSb3V0ZUNvbmZpZzogKGNvbmZpZ3M6IFJvdXRlRGVmaW5pdGlvbltdKSA9PiBDbGFzc0RlY29yYXRvciA9XG4gICAgbWFrZURlY29yYXRvcihSb3V0ZUNvbmZpZ0Fubm90YXRpb24pO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3JvdXRlci9yb3V0ZV9jb25maWdfZGVjb3JhdG9yLnRzXG4gKiovIiwiaW1wb3J0IHtMb2NhdGlvblN0cmF0ZWd5fSBmcm9tICcuL2xvY2F0aW9uX3N0cmF0ZWd5JztcbmltcG9ydCB7RXZlbnRFbWl0dGVyLCBPYnNlcnZhYmxlV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9hc3luYyc7XG5pbXBvcnQge0luamVjdGFibGUsIEluamVjdH0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5cbi8qKlxuICogYExvY2F0aW9uYCBpcyBhIHNlcnZpY2UgdGhhdCBhcHBsaWNhdGlvbnMgY2FuIHVzZSB0byBpbnRlcmFjdCB3aXRoIGEgYnJvd3NlcidzIFVSTC5cbiAqIERlcGVuZGluZyBvbiB3aGljaCB7QGxpbmsgTG9jYXRpb25TdHJhdGVneX0gaXMgdXNlZCwgYExvY2F0aW9uYCB3aWxsIGVpdGhlciBwZXJzaXN0XG4gKiB0byB0aGUgVVJMJ3MgcGF0aCBvciB0aGUgVVJMJ3MgaGFzaCBzZWdtZW50LlxuICpcbiAqIE5vdGU6IGl0J3MgYmV0dGVyIHRvIHVzZSB7QGxpbmsgUm91dGVyI25hdmlnYXRlfSBzZXJ2aWNlIHRvIHRyaWdnZXIgcm91dGUgY2hhbmdlcy4gVXNlXG4gKiBgTG9jYXRpb25gIG9ubHkgaWYgeW91IG5lZWQgdG8gaW50ZXJhY3Qgd2l0aCBvciBjcmVhdGUgbm9ybWFsaXplZCBVUkxzIG91dHNpZGUgb2ZcbiAqIHJvdXRpbmcuXG4gKlxuICogYExvY2F0aW9uYCBpcyByZXNwb25zaWJsZSBmb3Igbm9ybWFsaXppbmcgdGhlIFVSTCBhZ2FpbnN0IHRoZSBhcHBsaWNhdGlvbidzIGJhc2UgaHJlZi5cbiAqIEEgbm9ybWFsaXplZCBVUkwgaXMgYWJzb2x1dGUgZnJvbSB0aGUgVVJMIGhvc3QsIGluY2x1ZGVzIHRoZSBhcHBsaWNhdGlvbidzIGJhc2UgaHJlZiwgYW5kIGhhcyBub1xuICogdHJhaWxpbmcgc2xhc2g6XG4gKiAtIGAvbXkvYXBwL3VzZXIvMTIzYCBpcyBub3JtYWxpemVkXG4gKiAtIGBteS9hcHAvdXNlci8xMjNgICoqaXMgbm90Kiogbm9ybWFsaXplZFxuICogLSBgL215L2FwcC91c2VyLzEyMy9gICoqaXMgbm90Kiogbm9ybWFsaXplZFxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogYGBgXG4gKiBpbXBvcnQge0NvbXBvbmVudH0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG4gKiBpbXBvcnQge1xuICogICBST1VURVJfRElSRUNUSVZFUyxcbiAqICAgUk9VVEVSX1BST1ZJREVSUyxcbiAqICAgUm91dGVDb25maWcsXG4gKiAgIExvY2F0aW9uXG4gKiB9IGZyb20gJ2FuZ3VsYXIyL3JvdXRlcic7XG4gKlxuICogQENvbXBvbmVudCh7ZGlyZWN0aXZlczogW1JPVVRFUl9ESVJFQ1RJVkVTXX0pXG4gKiBAUm91dGVDb25maWcoW1xuICogIHsuLi59LFxuICogXSlcbiAqIGNsYXNzIEFwcENtcCB7XG4gKiAgIGNvbnN0cnVjdG9yKGxvY2F0aW9uOiBMb2NhdGlvbikge1xuICogICAgIGxvY2F0aW9uLmdvKCcvZm9vJyk7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBib290c3RyYXAoQXBwQ21wLCBbUk9VVEVSX1BST1ZJREVSU10pO1xuICogYGBgXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBMb2NhdGlvbiB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3N1YmplY3Q6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAvKiogQGludGVybmFsICovXG4gIF9iYXNlSHJlZjogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF0Zm9ybVN0cmF0ZWd5OiBMb2NhdGlvblN0cmF0ZWd5KSB7XG4gICAgdmFyIGJyb3dzZXJCYXNlSHJlZiA9IHRoaXMucGxhdGZvcm1TdHJhdGVneS5nZXRCYXNlSHJlZigpO1xuICAgIHRoaXMuX2Jhc2VIcmVmID0gc3RyaXBUcmFpbGluZ1NsYXNoKHN0cmlwSW5kZXhIdG1sKGJyb3dzZXJCYXNlSHJlZikpO1xuICAgIHRoaXMucGxhdGZvcm1TdHJhdGVneS5vblBvcFN0YXRlKChldikgPT4ge1xuICAgICAgT2JzZXJ2YWJsZVdyYXBwZXIuY2FsbEVtaXQodGhpcy5fc3ViamVjdCwgeyd1cmwnOiB0aGlzLnBhdGgoKSwgJ3BvcCc6IHRydWUsICd0eXBlJzogZXYudHlwZX0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG5vcm1hbGl6ZWQgVVJMIHBhdGguXG4gICAqL1xuICBwYXRoKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLm5vcm1hbGl6ZSh0aGlzLnBsYXRmb3JtU3RyYXRlZ3kucGF0aCgpKTsgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhIHN0cmluZyByZXByZXNlbnRpbmcgYSBVUkwsIHJldHVybnMgdGhlIG5vcm1hbGl6ZWQgVVJMIHBhdGggd2l0aG91dCBsZWFkaW5nIG9yXG4gICAqIHRyYWlsaW5nIHNsYXNoZXNcbiAgICovXG4gIG5vcm1hbGl6ZSh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN0cmlwVHJhaWxpbmdTbGFzaChfc3RyaXBCYXNlSHJlZih0aGlzLl9iYXNlSHJlZiwgc3RyaXBJbmRleEh0bWwodXJsKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdpdmVuIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhIFVSTCwgcmV0dXJucyB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgZXh0ZXJuYWwgVVJMIHBhdGguXG4gICAqIElmIHRoZSBnaXZlbiBVUkwgZG9lc24ndCBiZWdpbiB3aXRoIGEgbGVhZGluZyBzbGFzaCAoYCcvJ2ApLCB0aGlzIG1ldGhvZCBhZGRzIG9uZVxuICAgKiBiZWZvcmUgbm9ybWFsaXppbmcuIFRoaXMgbWV0aG9kIHdpbGwgYWxzbyBhZGQgYSBoYXNoIGlmIGBIYXNoTG9jYXRpb25TdHJhdGVneWAgaXNcbiAgICogdXNlZCwgb3IgdGhlIGBBUFBfQkFTRV9IUkVGYCBpZiB0aGUgYFBhdGhMb2NhdGlvblN0cmF0ZWd5YCBpcyBpbiB1c2UuXG4gICAqL1xuICBwcmVwYXJlRXh0ZXJuYWxVcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh1cmwubGVuZ3RoID4gMCAmJiAhdXJsLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgdXJsID0gJy8nICsgdXJsO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wbGF0Zm9ybVN0cmF0ZWd5LnByZXBhcmVFeHRlcm5hbFVybCh1cmwpO1xuICB9XG5cbiAgLy8gVE9ETzogcmVuYW1lIHRoaXMgbWV0aG9kIHRvIHB1c2hTdGF0ZVxuICAvKipcbiAgICogQ2hhbmdlcyB0aGUgYnJvd3NlcnMgVVJMIHRvIHRoZSBub3JtYWxpemVkIHZlcnNpb24gb2YgdGhlIGdpdmVuIFVSTCwgYW5kIHB1c2hlcyBhXG4gICAqIG5ldyBpdGVtIG9udG8gdGhlIHBsYXRmb3JtJ3MgaGlzdG9yeS5cbiAgICovXG4gIGdvKHBhdGg6IHN0cmluZywgcXVlcnk6IHN0cmluZyA9ICcnKTogdm9pZCB7XG4gICAgdGhpcy5wbGF0Zm9ybVN0cmF0ZWd5LnB1c2hTdGF0ZShudWxsLCAnJywgcGF0aCwgcXVlcnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZXMgdGhlIGJyb3dzZXJzIFVSTCB0byB0aGUgbm9ybWFsaXplZCB2ZXJzaW9uIG9mIHRoZSBnaXZlbiBVUkwsIGFuZCByZXBsYWNlc1xuICAgKiB0aGUgdG9wIGl0ZW0gb24gdGhlIHBsYXRmb3JtJ3MgaGlzdG9yeSBzdGFjay5cbiAgICovXG4gIHJlcGxhY2VTdGF0ZShwYXRoOiBzdHJpbmcsIHF1ZXJ5OiBzdHJpbmcgPSAnJyk6IHZvaWQge1xuICAgIHRoaXMucGxhdGZvcm1TdHJhdGVneS5yZXBsYWNlU3RhdGUobnVsbCwgJycsIHBhdGgsIHF1ZXJ5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOYXZpZ2F0ZXMgZm9yd2FyZCBpbiB0aGUgcGxhdGZvcm0ncyBoaXN0b3J5LlxuICAgKi9cbiAgZm9yd2FyZCgpOiB2b2lkIHsgdGhpcy5wbGF0Zm9ybVN0cmF0ZWd5LmZvcndhcmQoKTsgfVxuXG4gIC8qKlxuICAgKiBOYXZpZ2F0ZXMgYmFjayBpbiB0aGUgcGxhdGZvcm0ncyBoaXN0b3J5LlxuICAgKi9cbiAgYmFjaygpOiB2b2lkIHsgdGhpcy5wbGF0Zm9ybVN0cmF0ZWd5LmJhY2soKTsgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gdGhlIHBsYXRmb3JtJ3MgYHBvcFN0YXRlYCBldmVudHMuXG4gICAqL1xuICBzdWJzY3JpYmUob25OZXh0OiAodmFsdWU6IGFueSkgPT4gdm9pZCwgb25UaHJvdzogKGV4Y2VwdGlvbjogYW55KSA9PiB2b2lkID0gbnVsbCxcbiAgICAgICAgICAgIG9uUmV0dXJuOiAoKSA9PiB2b2lkID0gbnVsbCk6IE9iamVjdCB7XG4gICAgcmV0dXJuIE9ic2VydmFibGVXcmFwcGVyLnN1YnNjcmliZSh0aGlzLl9zdWJqZWN0LCBvbk5leHQsIG9uVGhyb3csIG9uUmV0dXJuKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfc3RyaXBCYXNlSHJlZihiYXNlSHJlZjogc3RyaW5nLCB1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChiYXNlSHJlZi5sZW5ndGggPiAwICYmIHVybC5zdGFydHNXaXRoKGJhc2VIcmVmKSkge1xuICAgIHJldHVybiB1cmwuc3Vic3RyaW5nKGJhc2VIcmVmLmxlbmd0aCk7XG4gIH1cbiAgcmV0dXJuIHVybDtcbn1cblxuZnVuY3Rpb24gc3RyaXBJbmRleEh0bWwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoL1xcL2luZGV4Lmh0bWwkL2cudGVzdCh1cmwpKSB7XG4gICAgLy8gJy9pbmRleC5odG1sJy5sZW5ndGggPT0gMTFcbiAgICByZXR1cm4gdXJsLnN1YnN0cmluZygwLCB1cmwubGVuZ3RoIC0gMTEpO1xuICB9XG4gIHJldHVybiB1cmw7XG59XG5cbmZ1bmN0aW9uIHN0cmlwVHJhaWxpbmdTbGFzaCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICgvXFwvJC9nLnRlc3QodXJsKSkge1xuICAgIHVybCA9IHVybC5zdWJzdHJpbmcoMCwgdXJsLmxlbmd0aCAtIDEpO1xuICB9XG4gIHJldHVybiB1cmw7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvcm91dGVyL2xvY2F0aW9uLnRzXG4gKiovIiwiaW1wb3J0IHtDT05TVF9FWFBSfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtPcGFxdWVUb2tlbn0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5cbi8qKlxuICogYExvY2F0aW9uU3RyYXRlZ3lgIGlzIHJlc3BvbnNpYmxlIGZvciByZXByZXNlbnRpbmcgYW5kIHJlYWRpbmcgcm91dGUgc3RhdGVcbiAqIGZyb20gdGhlIGJyb3dzZXIncyBVUkwuIEFuZ3VsYXIgcHJvdmlkZXMgdHdvIHN0cmF0ZWdpZXM6XG4gKiB7QGxpbmsgSGFzaExvY2F0aW9uU3RyYXRlZ3l9IChkZWZhdWx0KSBhbmQge0BsaW5rIFBhdGhMb2NhdGlvblN0cmF0ZWd5fS5cbiAqXG4gKiBUaGlzIGlzIHVzZWQgdW5kZXIgdGhlIGhvb2Qgb2YgdGhlIHtAbGluayBMb2NhdGlvbn0gc2VydmljZS5cbiAqXG4gKiBBcHBsaWNhdGlvbnMgc2hvdWxkIHVzZSB0aGUge0BsaW5rIFJvdXRlcn0gb3Ige0BsaW5rIExvY2F0aW9ufSBzZXJ2aWNlcyB0b1xuICogaW50ZXJhY3Qgd2l0aCBhcHBsaWNhdGlvbiByb3V0ZSBzdGF0ZS5cbiAqXG4gKiBGb3IgaW5zdGFuY2UsIHtAbGluayBIYXNoTG9jYXRpb25TdHJhdGVneX0gcHJvZHVjZXMgVVJMcyBsaWtlXG4gKiBgaHR0cDovL2V4YW1wbGUuY29tIy9mb29gLCBhbmQge0BsaW5rIFBhdGhMb2NhdGlvblN0cmF0ZWd5fSBwcm9kdWNlc1xuICogYGh0dHA6Ly9leGFtcGxlLmNvbS9mb29gIGFzIGFuIGVxdWl2YWxlbnQgVVJMLlxuICpcbiAqIFNlZSB0aGVzZSB0d28gY2xhc3NlcyBmb3IgbW9yZS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIExvY2F0aW9uU3RyYXRlZ3kge1xuICBhYnN0cmFjdCBwYXRoKCk6IHN0cmluZztcbiAgYWJzdHJhY3QgcHJlcGFyZUV4dGVybmFsVXJsKGludGVybmFsOiBzdHJpbmcpOiBzdHJpbmc7XG4gIGFic3RyYWN0IHB1c2hTdGF0ZShzdGF0ZTogYW55LCB0aXRsZTogc3RyaW5nLCB1cmw6IHN0cmluZywgcXVlcnlQYXJhbXM6IHN0cmluZyk6IHZvaWQ7XG4gIGFic3RyYWN0IHJlcGxhY2VTdGF0ZShzdGF0ZTogYW55LCB0aXRsZTogc3RyaW5nLCB1cmw6IHN0cmluZywgcXVlcnlQYXJhbXM6IHN0cmluZyk6IHZvaWQ7XG4gIGFic3RyYWN0IGZvcndhcmQoKTogdm9pZDtcbiAgYWJzdHJhY3QgYmFjaygpOiB2b2lkO1xuICBhYnN0cmFjdCBvblBvcFN0YXRlKGZuOiAoXzogYW55KSA9PiBhbnkpOiB2b2lkO1xuICBhYnN0cmFjdCBnZXRCYXNlSHJlZigpOiBzdHJpbmc7XG59XG5cblxuLyoqXG4gKiBUaGUgYEFQUF9CQVNFX0hSRUZgIHRva2VuIHJlcHJlc2VudHMgdGhlIGJhc2UgaHJlZiB0byBiZSB1c2VkIHdpdGggdGhlXG4gKiB7QGxpbmsgUGF0aExvY2F0aW9uU3RyYXRlZ3l9LlxuICpcbiAqIElmIHlvdSdyZSB1c2luZyB7QGxpbmsgUGF0aExvY2F0aW9uU3RyYXRlZ3l9LCB5b3UgbXVzdCBwcm92aWRlIGEgcHJvdmlkZXIgdG8gYSBzdHJpbmdcbiAqIHJlcHJlc2VudGluZyB0aGUgVVJMIHByZWZpeCB0aGF0IHNob3VsZCBiZSBwcmVzZXJ2ZWQgd2hlbiBnZW5lcmF0aW5nIGFuZCByZWNvZ25pemluZ1xuICogVVJMcy5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIGBgYFxuICogaW1wb3J0IHtDb21wb25lbnR9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuICogaW1wb3J0IHtST1VURVJfRElSRUNUSVZFUywgUk9VVEVSX1BST1ZJREVSUywgUm91dGVDb25maWd9IGZyb20gJ2FuZ3VsYXIyL3JvdXRlcic7XG4gKlxuICogQENvbXBvbmVudCh7ZGlyZWN0aXZlczogW1JPVVRFUl9ESVJFQ1RJVkVTXX0pXG4gKiBAUm91dGVDb25maWcoW1xuICogIHsuLi59LFxuICogXSlcbiAqIGNsYXNzIEFwcENtcCB7XG4gKiAgIC8vIC4uLlxuICogfVxuICpcbiAqIGJvb3RzdHJhcChBcHBDbXAsIFtcbiAqICAgUk9VVEVSX1BST1ZJREVSUyxcbiAqICAgUGF0aExvY2F0aW9uU3RyYXRlZ3ksXG4gKiAgIHByb3ZpZGUoQVBQX0JBU0VfSFJFRiwge3VzZVZhbHVlOiAnL215L2FwcCd9KVxuICogXSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IEFQUF9CQVNFX0hSRUY6IE9wYXF1ZVRva2VuID0gQ09OU1RfRVhQUihuZXcgT3BhcXVlVG9rZW4oJ2FwcEJhc2VIcmVmJykpO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplUXVlcnlQYXJhbXMocGFyYW1zOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gKHBhcmFtcy5sZW5ndGggPiAwICYmIHBhcmFtcy5zdWJzdHJpbmcoMCwgMSkgIT0gJz8nKSA/ICgnPycgKyBwYXJhbXMpIDogcGFyYW1zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gam9pbldpdGhTbGFzaChzdGFydDogc3RyaW5nLCBlbmQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChzdGFydC5sZW5ndGggPT0gMCkge1xuICAgIHJldHVybiBlbmQ7XG4gIH1cbiAgaWYgKGVuZC5sZW5ndGggPT0gMCkge1xuICAgIHJldHVybiBzdGFydDtcbiAgfVxuICB2YXIgc2xhc2hlcyA9IDA7XG4gIGlmIChzdGFydC5lbmRzV2l0aCgnLycpKSB7XG4gICAgc2xhc2hlcysrO1xuICB9XG4gIGlmIChlbmQuc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgc2xhc2hlcysrO1xuICB9XG4gIGlmIChzbGFzaGVzID09IDIpIHtcbiAgICByZXR1cm4gc3RhcnQgKyBlbmQuc3Vic3RyaW5nKDEpO1xuICB9XG4gIGlmIChzbGFzaGVzID09IDEpIHtcbiAgICByZXR1cm4gc3RhcnQgKyBlbmQ7XG4gIH1cbiAgcmV0dXJuIHN0YXJ0ICsgJy8nICsgZW5kO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3JvdXRlci9sb2NhdGlvbl9zdHJhdGVneS50c1xuICoqLyIsImltcG9ydCB7VHlwZSwgaXNQcmVzZW50fSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtSb3V0ZUxpZmVjeWNsZUhvb2ssIENhbkFjdGl2YXRlfSBmcm9tICcuL2xpZmVjeWNsZV9hbm5vdGF0aW9uc19pbXBsJztcbmltcG9ydCB7cmVmbGVjdG9yfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9yZWZsZWN0aW9uL3JlZmxlY3Rpb24nO1xuXG5leHBvcnQgZnVuY3Rpb24gaGFzTGlmZWN5Y2xlSG9vayhlOiBSb3V0ZUxpZmVjeWNsZUhvb2ssIHR5cGUpOiBib29sZWFuIHtcbiAgaWYgKCEodHlwZSBpbnN0YW5jZW9mIFR5cGUpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBlLm5hbWUgaW4oPGFueT50eXBlKS5wcm90b3R5cGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDYW5BY3RpdmF0ZUhvb2sodHlwZSk6IEZ1bmN0aW9uIHtcbiAgdmFyIGFubm90YXRpb25zID0gcmVmbGVjdG9yLmFubm90YXRpb25zKHR5cGUpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFubm90YXRpb25zLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgbGV0IGFubm90YXRpb24gPSBhbm5vdGF0aW9uc1tpXTtcbiAgICBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIENhbkFjdGl2YXRlKSB7XG4gICAgICByZXR1cm4gYW5ub3RhdGlvbi5mbjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9yb3V0ZXIvcm91dGVfbGlmZWN5Y2xlX3JlZmxlY3Rvci50c1xuICoqLyIsImltcG9ydCB7Q09OU1QsIENPTlNUX0VYUFJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5cbkBDT05TVCgpXG5leHBvcnQgY2xhc3MgUm91dGVMaWZlY3ljbGVIb29rIHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge31cbn1cblxuQENPTlNUKClcbmV4cG9ydCBjbGFzcyBDYW5BY3RpdmF0ZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBmbjogRnVuY3Rpb24pIHt9XG59XG5cbmV4cG9ydCBjb25zdCByb3V0ZXJDYW5SZXVzZTogUm91dGVMaWZlY3ljbGVIb29rID1cbiAgICBDT05TVF9FWFBSKG5ldyBSb3V0ZUxpZmVjeWNsZUhvb2soXCJyb3V0ZXJDYW5SZXVzZVwiKSk7XG5leHBvcnQgY29uc3Qgcm91dGVyQ2FuRGVhY3RpdmF0ZTogUm91dGVMaWZlY3ljbGVIb29rID1cbiAgICBDT05TVF9FWFBSKG5ldyBSb3V0ZUxpZmVjeWNsZUhvb2soXCJyb3V0ZXJDYW5EZWFjdGl2YXRlXCIpKTtcbmV4cG9ydCBjb25zdCByb3V0ZXJPbkFjdGl2YXRlOiBSb3V0ZUxpZmVjeWNsZUhvb2sgPVxuICAgIENPTlNUX0VYUFIobmV3IFJvdXRlTGlmZWN5Y2xlSG9vayhcInJvdXRlck9uQWN0aXZhdGVcIikpO1xuZXhwb3J0IGNvbnN0IHJvdXRlck9uUmV1c2U6IFJvdXRlTGlmZWN5Y2xlSG9vayA9XG4gICAgQ09OU1RfRVhQUihuZXcgUm91dGVMaWZlY3ljbGVIb29rKFwicm91dGVyT25SZXVzZVwiKSk7XG5leHBvcnQgY29uc3Qgcm91dGVyT25EZWFjdGl2YXRlOiBSb3V0ZUxpZmVjeWNsZUhvb2sgPVxuICAgIENPTlNUX0VYUFIobmV3IFJvdXRlTGlmZWN5Y2xlSG9vayhcInJvdXRlck9uRGVhY3RpdmF0ZVwiKSk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvcm91dGVyL2xpZmVjeWNsZV9hbm5vdGF0aW9uc19pbXBsLnRzXG4gKiovIiwiaW1wb3J0IHtQcm9taXNlLCBQcm9taXNlV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9hc3luYyc7XG5pbXBvcnQge1N0cmluZ01hcFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge2lzQmxhbmssIGlzUHJlc2VudH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbiwgV3JhcHBlZEV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcblxuaW1wb3J0IHtcbiAgRGlyZWN0aXZlLFxuICBBdHRyaWJ1dGUsXG4gIER5bmFtaWNDb21wb25lbnRMb2FkZXIsXG4gIENvbXBvbmVudFJlZixcbiAgRWxlbWVudFJlZixcbiAgSW5qZWN0b3IsXG4gIHByb3ZpZGUsXG4gIERlcGVuZGVuY3lcbn0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5cbmltcG9ydCAqIGFzIHJvdXRlck1vZCBmcm9tICcuL3JvdXRlcic7XG5pbXBvcnQge0NvbXBvbmVudEluc3RydWN0aW9uLCBSb3V0ZVBhcmFtcywgUm91dGVEYXRhfSBmcm9tICcuL2luc3RydWN0aW9uJztcbmltcG9ydCAqIGFzIGhvb2tNb2QgZnJvbSAnLi9saWZlY3ljbGVfYW5ub3RhdGlvbnMnO1xuaW1wb3J0IHtoYXNMaWZlY3ljbGVIb29rfSBmcm9tICcuL3JvdXRlX2xpZmVjeWNsZV9yZWZsZWN0b3InO1xuaW1wb3J0IHtPbkFjdGl2YXRlLCBDYW5SZXVzZSwgT25SZXVzZSwgT25EZWFjdGl2YXRlLCBDYW5EZWFjdGl2YXRlfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuXG5sZXQgX3Jlc29sdmVUb1RydWUgPSBQcm9taXNlV3JhcHBlci5yZXNvbHZlKHRydWUpO1xuXG4vKipcbiAqIEEgcm91dGVyIG91dGxldCBpcyBhIHBsYWNlaG9sZGVyIHRoYXQgQW5ndWxhciBkeW5hbWljYWxseSBmaWxscyBiYXNlZCBvbiB0aGUgYXBwbGljYXRpb24ncyByb3V0ZS5cbiAqXG4gKiAjIyBVc2VcbiAqXG4gKiBgYGBcbiAqIDxyb3V0ZXItb3V0bGV0Pjwvcm91dGVyLW91dGxldD5cbiAqIGBgYFxuICovXG5ARGlyZWN0aXZlKHtzZWxlY3RvcjogJ3JvdXRlci1vdXRsZXQnfSlcbmV4cG9ydCBjbGFzcyBSb3V0ZXJPdXRsZXQge1xuICBuYW1lOiBzdHJpbmcgPSBudWxsO1xuICBwcml2YXRlIF9jb21wb25lbnRSZWY6IENvbXBvbmVudFJlZiA9IG51bGw7XG4gIHByaXZhdGUgX2N1cnJlbnRJbnN0cnVjdGlvbjogQ29tcG9uZW50SW5zdHJ1Y3Rpb24gPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIHByaXZhdGUgX2xvYWRlcjogRHluYW1pY0NvbXBvbmVudExvYWRlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfcGFyZW50Um91dGVyOiByb3V0ZXJNb2QuUm91dGVyLCBAQXR0cmlidXRlKCduYW1lJykgbmFtZUF0dHI6IHN0cmluZykge1xuICAgIGlmIChpc1ByZXNlbnQobmFtZUF0dHIpKSB7XG4gICAgICB0aGlzLm5hbWUgPSBuYW1lQXR0cjtcbiAgICAgIHRoaXMuX3BhcmVudFJvdXRlci5yZWdpc3RlckF1eE91dGxldCh0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcGFyZW50Um91dGVyLnJlZ2lzdGVyUHJpbWFyeU91dGxldCh0aGlzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIGJ5IHRoZSBSb3V0ZXIgdG8gaW5zdGFudGlhdGUgYSBuZXcgY29tcG9uZW50IGR1cmluZyB0aGUgY29tbWl0IHBoYXNlIG9mIGEgbmF2aWdhdGlvbi5cbiAgICogVGhpcyBtZXRob2QgaW4gdHVybiBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyB0aGUgYHJvdXRlck9uQWN0aXZhdGVgIGhvb2sgb2YgaXRzIGNoaWxkLlxuICAgKi9cbiAgYWN0aXZhdGUobmV4dEluc3RydWN0aW9uOiBDb21wb25lbnRJbnN0cnVjdGlvbik6IFByb21pc2U8YW55PiB7XG4gICAgdmFyIHByZXZpb3VzSW5zdHJ1Y3Rpb24gPSB0aGlzLl9jdXJyZW50SW5zdHJ1Y3Rpb247XG4gICAgdGhpcy5fY3VycmVudEluc3RydWN0aW9uID0gbmV4dEluc3RydWN0aW9uO1xuICAgIHZhciBjb21wb25lbnRUeXBlID0gbmV4dEluc3RydWN0aW9uLmNvbXBvbmVudFR5cGU7XG4gICAgdmFyIGNoaWxkUm91dGVyID0gdGhpcy5fcGFyZW50Um91dGVyLmNoaWxkUm91dGVyKGNvbXBvbmVudFR5cGUpO1xuXG4gICAgdmFyIHByb3ZpZGVycyA9IEluamVjdG9yLnJlc29sdmUoW1xuICAgICAgcHJvdmlkZShSb3V0ZURhdGEsIHt1c2VWYWx1ZTogbmV4dEluc3RydWN0aW9uLnJvdXRlRGF0YX0pLFxuICAgICAgcHJvdmlkZShSb3V0ZVBhcmFtcywge3VzZVZhbHVlOiBuZXcgUm91dGVQYXJhbXMobmV4dEluc3RydWN0aW9uLnBhcmFtcyl9KSxcbiAgICAgIHByb3ZpZGUocm91dGVyTW9kLlJvdXRlciwge3VzZVZhbHVlOiBjaGlsZFJvdXRlcn0pXG4gICAgXSk7XG4gICAgcmV0dXJuIHRoaXMuX2xvYWRlci5sb2FkTmV4dFRvTG9jYXRpb24oY29tcG9uZW50VHlwZSwgdGhpcy5fZWxlbWVudFJlZiwgcHJvdmlkZXJzKVxuICAgICAgICAudGhlbigoY29tcG9uZW50UmVmKSA9PiB7XG4gICAgICAgICAgdGhpcy5fY29tcG9uZW50UmVmID0gY29tcG9uZW50UmVmO1xuICAgICAgICAgIGlmIChoYXNMaWZlY3ljbGVIb29rKGhvb2tNb2Qucm91dGVyT25BY3RpdmF0ZSwgY29tcG9uZW50VHlwZSkpIHtcbiAgICAgICAgICAgIHJldHVybiAoPE9uQWN0aXZhdGU+dGhpcy5fY29tcG9uZW50UmVmLmluc3RhbmNlKVxuICAgICAgICAgICAgICAgIC5yb3V0ZXJPbkFjdGl2YXRlKG5leHRJbnN0cnVjdGlvbiwgcHJldmlvdXNJbnN0cnVjdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgYnkgdGhlIHtAbGluayBSb3V0ZXJ9IGR1cmluZyB0aGUgY29tbWl0IHBoYXNlIG9mIGEgbmF2aWdhdGlvbiB3aGVuIGFuIG91dGxldFxuICAgKiByZXVzZXMgYSBjb21wb25lbnQgYmV0d2VlbiBkaWZmZXJlbnQgcm91dGVzLlxuICAgKiBUaGlzIG1ldGhvZCBpbiB0dXJuIGlzIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIHRoZSBgcm91dGVyT25SZXVzZWAgaG9vayBvZiBpdHMgY2hpbGQuXG4gICAqL1xuICByZXVzZShuZXh0SW5zdHJ1Y3Rpb246IENvbXBvbmVudEluc3RydWN0aW9uKTogUHJvbWlzZTxhbnk+IHtcbiAgICB2YXIgcHJldmlvdXNJbnN0cnVjdGlvbiA9IHRoaXMuX2N1cnJlbnRJbnN0cnVjdGlvbjtcbiAgICB0aGlzLl9jdXJyZW50SW5zdHJ1Y3Rpb24gPSBuZXh0SW5zdHJ1Y3Rpb247XG5cbiAgICBpZiAoaXNCbGFuayh0aGlzLl9jb21wb25lbnRSZWYpKSB7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgQ2Fubm90IHJldXNlIGFuIG91dGxldCB0aGF0IGRvZXMgbm90IGNvbnRhaW4gYSBjb21wb25lbnQuYCk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlV3JhcHBlci5yZXNvbHZlKFxuICAgICAgICBoYXNMaWZlY3ljbGVIb29rKGhvb2tNb2Qucm91dGVyT25SZXVzZSwgdGhpcy5fY3VycmVudEluc3RydWN0aW9uLmNvbXBvbmVudFR5cGUpID9cbiAgICAgICAgICAgICg8T25SZXVzZT50aGlzLl9jb21wb25lbnRSZWYuaW5zdGFuY2UpXG4gICAgICAgICAgICAgICAgLnJvdXRlck9uUmV1c2UobmV4dEluc3RydWN0aW9uLCBwcmV2aW91c0luc3RydWN0aW9uKSA6XG4gICAgICAgICAgICB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgYnkgdGhlIHtAbGluayBSb3V0ZXJ9IHdoZW4gYW4gb3V0bGV0IGRpc3Bvc2VzIG9mIGEgY29tcG9uZW50J3MgY29udGVudHMuXG4gICAqIFRoaXMgbWV0aG9kIGluIHR1cm4gaXMgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgdGhlIGByb3V0ZXJPbkRlYWN0aXZhdGVgIGhvb2sgb2YgaXRzIGNoaWxkLlxuICAgKi9cbiAgZGVhY3RpdmF0ZShuZXh0SW5zdHJ1Y3Rpb246IENvbXBvbmVudEluc3RydWN0aW9uKTogUHJvbWlzZTxhbnk+IHtcbiAgICB2YXIgbmV4dCA9IF9yZXNvbHZlVG9UcnVlO1xuICAgIGlmIChpc1ByZXNlbnQodGhpcy5fY29tcG9uZW50UmVmKSAmJiBpc1ByZXNlbnQodGhpcy5fY3VycmVudEluc3RydWN0aW9uKSAmJlxuICAgICAgICBoYXNMaWZlY3ljbGVIb29rKGhvb2tNb2Qucm91dGVyT25EZWFjdGl2YXRlLCB0aGlzLl9jdXJyZW50SW5zdHJ1Y3Rpb24uY29tcG9uZW50VHlwZSkpIHtcbiAgICAgIG5leHQgPSBQcm9taXNlV3JhcHBlci5yZXNvbHZlKFxuICAgICAgICAgICg8T25EZWFjdGl2YXRlPnRoaXMuX2NvbXBvbmVudFJlZi5pbnN0YW5jZSlcbiAgICAgICAgICAgICAgLnJvdXRlck9uRGVhY3RpdmF0ZShuZXh0SW5zdHJ1Y3Rpb24sIHRoaXMuX2N1cnJlbnRJbnN0cnVjdGlvbikpO1xuICAgIH1cbiAgICByZXR1cm4gbmV4dC50aGVuKChfKSA9PiB7XG4gICAgICBpZiAoaXNQcmVzZW50KHRoaXMuX2NvbXBvbmVudFJlZikpIHtcbiAgICAgICAgdGhpcy5fY29tcG9uZW50UmVmLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5fY29tcG9uZW50UmVmID0gbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgYnkgdGhlIHtAbGluayBSb3V0ZXJ9IGR1cmluZyByZWNvZ25pdGlvbiBwaGFzZSBvZiBhIG5hdmlnYXRpb24uXG4gICAqXG4gICAqIElmIHRoaXMgcmVzb2x2ZXMgdG8gYGZhbHNlYCwgdGhlIGdpdmVuIG5hdmlnYXRpb24gaXMgY2FuY2VsbGVkLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBkZWxlZ2F0ZXMgdG8gdGhlIGNoaWxkIGNvbXBvbmVudCdzIGByb3V0ZXJDYW5EZWFjdGl2YXRlYCBob29rIGlmIGl0IGV4aXN0cyxcbiAgICogYW5kIG90aGVyd2lzZSByZXNvbHZlcyB0byB0cnVlLlxuICAgKi9cbiAgcm91dGVyQ2FuRGVhY3RpdmF0ZShuZXh0SW5zdHJ1Y3Rpb246IENvbXBvbmVudEluc3RydWN0aW9uKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKGlzQmxhbmsodGhpcy5fY3VycmVudEluc3RydWN0aW9uKSkge1xuICAgICAgcmV0dXJuIF9yZXNvbHZlVG9UcnVlO1xuICAgIH1cbiAgICBpZiAoaGFzTGlmZWN5Y2xlSG9vayhob29rTW9kLnJvdXRlckNhbkRlYWN0aXZhdGUsIHRoaXMuX2N1cnJlbnRJbnN0cnVjdGlvbi5jb21wb25lbnRUeXBlKSkge1xuICAgICAgcmV0dXJuIFByb21pc2VXcmFwcGVyLnJlc29sdmUoXG4gICAgICAgICAgKDxDYW5EZWFjdGl2YXRlPnRoaXMuX2NvbXBvbmVudFJlZi5pbnN0YW5jZSlcbiAgICAgICAgICAgICAgLnJvdXRlckNhbkRlYWN0aXZhdGUobmV4dEluc3RydWN0aW9uLCB0aGlzLl9jdXJyZW50SW5zdHJ1Y3Rpb24pKTtcbiAgICB9XG4gICAgcmV0dXJuIF9yZXNvbHZlVG9UcnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCBieSB0aGUge0BsaW5rIFJvdXRlcn0gZHVyaW5nIHJlY29nbml0aW9uIHBoYXNlIG9mIGEgbmF2aWdhdGlvbi5cbiAgICpcbiAgICogSWYgdGhlIG5ldyBjaGlsZCBjb21wb25lbnQgaGFzIGEgZGlmZmVyZW50IFR5cGUgdGhhbiB0aGUgZXhpc3RpbmcgY2hpbGQgY29tcG9uZW50LFxuICAgKiB0aGlzIHdpbGwgcmVzb2x2ZSB0byBgZmFsc2VgLiBZb3UgY2FuJ3QgcmV1c2UgYW4gb2xkIGNvbXBvbmVudCB3aGVuIHRoZSBuZXcgY29tcG9uZW50XG4gICAqIGlzIG9mIGEgZGlmZmVyZW50IFR5cGUuXG4gICAqXG4gICAqIE90aGVyd2lzZSwgdGhpcyBtZXRob2QgZGVsZWdhdGVzIHRvIHRoZSBjaGlsZCBjb21wb25lbnQncyBgcm91dGVyQ2FuUmV1c2VgIGhvb2sgaWYgaXQgZXhpc3RzLFxuICAgKiBvciByZXNvbHZlcyB0byB0cnVlIGlmIHRoZSBob29rIGlzIG5vdCBwcmVzZW50LlxuICAgKi9cbiAgcm91dGVyQ2FuUmV1c2UobmV4dEluc3RydWN0aW9uOiBDb21wb25lbnRJbnN0cnVjdGlvbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHZhciByZXN1bHQ7XG5cbiAgICBpZiAoaXNCbGFuayh0aGlzLl9jdXJyZW50SW5zdHJ1Y3Rpb24pIHx8XG4gICAgICAgIHRoaXMuX2N1cnJlbnRJbnN0cnVjdGlvbi5jb21wb25lbnRUeXBlICE9IG5leHRJbnN0cnVjdGlvbi5jb21wb25lbnRUeXBlKSB7XG4gICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGhhc0xpZmVjeWNsZUhvb2soaG9va01vZC5yb3V0ZXJDYW5SZXVzZSwgdGhpcy5fY3VycmVudEluc3RydWN0aW9uLmNvbXBvbmVudFR5cGUpKSB7XG4gICAgICByZXN1bHQgPSAoPENhblJldXNlPnRoaXMuX2NvbXBvbmVudFJlZi5pbnN0YW5jZSlcbiAgICAgICAgICAgICAgICAgICAucm91dGVyQ2FuUmV1c2UobmV4dEluc3RydWN0aW9uLCB0aGlzLl9jdXJyZW50SW5zdHJ1Y3Rpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBuZXh0SW5zdHJ1Y3Rpb24gPT0gdGhpcy5fY3VycmVudEluc3RydWN0aW9uIHx8XG4gICAgICAgICAgICAgICAoaXNQcmVzZW50KG5leHRJbnN0cnVjdGlvbi5wYXJhbXMpICYmIGlzUHJlc2VudCh0aGlzLl9jdXJyZW50SW5zdHJ1Y3Rpb24ucGFyYW1zKSAmJlxuICAgICAgICAgICAgICAgIFN0cmluZ01hcFdyYXBwZXIuZXF1YWxzKG5leHRJbnN0cnVjdGlvbi5wYXJhbXMsIHRoaXMuX2N1cnJlbnRJbnN0cnVjdGlvbi5wYXJhbXMpKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2VXcmFwcGVyLnJlc29sdmUocmVzdWx0KTtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3JvdXRlci9yb3V0ZXJfb3V0bGV0LnRzXG4gKiovIiwiLyoqXG4gKiBUaGlzIGluZGlyZWN0aW9uIGlzIG5lZWRlZCB0byBmcmVlIHVwIENvbXBvbmVudCwgZXRjIHN5bWJvbHMgaW4gdGhlIHB1YmxpYyBBUElcbiAqIHRvIGJlIHVzZWQgYnkgdGhlIGRlY29yYXRvciB2ZXJzaW9ucyBvZiB0aGVzZSBhbm5vdGF0aW9ucy5cbiAqL1xuXG5pbXBvcnQge21ha2VEZWNvcmF0b3J9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL3V0aWwvZGVjb3JhdG9ycyc7XG5pbXBvcnQge0NhbkFjdGl2YXRlIGFzIENhbkFjdGl2YXRlQW5ub3RhdGlvbn0gZnJvbSAnLi9saWZlY3ljbGVfYW5ub3RhdGlvbnNfaW1wbCc7XG5pbXBvcnQge1Byb21pc2V9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvYXN5bmMnO1xuaW1wb3J0IHtDb21wb25lbnRJbnN0cnVjdGlvbn0gZnJvbSAnLi9pbnN0cnVjdGlvbic7XG5cbmV4cG9ydCB7XG4gIHJvdXRlckNhblJldXNlLFxuICByb3V0ZXJDYW5EZWFjdGl2YXRlLFxuICByb3V0ZXJPbkFjdGl2YXRlLFxuICByb3V0ZXJPblJldXNlLFxuICByb3V0ZXJPbkRlYWN0aXZhdGVcbn0gZnJvbSAnLi9saWZlY3ljbGVfYW5ub3RhdGlvbnNfaW1wbCc7XG5cbi8qKlxuICogRGVmaW5lcyByb3V0ZSBsaWZlY3ljbGUgaG9vayBgQ2FuQWN0aXZhdGVgLCB3aGljaCBpcyBjYWxsZWQgYnkgdGhlIHJvdXRlciB0byBkZXRlcm1pbmVcbiAqIGlmIGEgY29tcG9uZW50IGNhbiBiZSBpbnN0YW50aWF0ZWQgYXMgcGFydCBvZiBhIG5hdmlnYXRpb24uXG4gKlxuICogPGFzaWRlIGNsYXNzPVwiaXMtcmlnaHRcIj5cbiAqIE5vdGUgdGhhdCB1bmxpa2Ugb3RoZXIgbGlmZWN5Y2xlIGhvb2tzLCB0aGlzIG9uZSB1c2VzIGFuIGFubm90YXRpb24gcmF0aGVyIHRoYW4gYW4gaW50ZXJmYWNlLlxuICogVGhpcyBpcyBiZWNhdXNlIHRoZSBgQ2FuQWN0aXZhdGVgIGZ1bmN0aW9uIGlzIGNhbGxlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBpcyBpbnN0YW50aWF0ZWQuXG4gKiA8L2FzaWRlPlxuICpcbiAqIFRoZSBgQ2FuQWN0aXZhdGVgIGhvb2sgaXMgY2FsbGVkIHdpdGggdHdvIHtAbGluayBDb21wb25lbnRJbnN0cnVjdGlvbn1zIGFzIHBhcmFtZXRlcnMsIHRoZSBmaXJzdFxuICogcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IHJvdXRlIGJlaW5nIG5hdmlnYXRlZCB0bywgYW5kIHRoZSBzZWNvbmQgcGFyYW1ldGVyIHJlcHJlc2VudGluZyB0aGVcbiAqIHByZXZpb3VzIHJvdXRlIG9yIGBudWxsYC5cbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBAQ2FuQWN0aXZhdGUoKG5leHQsIHByZXYpID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+KVxuICogYGBgXG4gKlxuICogSWYgYENhbkFjdGl2YXRlYCByZXR1cm5zIG9yIHJlc29sdmVzIHRvIGBmYWxzZWAsIHRoZSBuYXZpZ2F0aW9uIGlzIGNhbmNlbGxlZC5cbiAqIElmIGBDYW5BY3RpdmF0ZWAgdGhyb3dzIG9yIHJlamVjdHMsIHRoZSBuYXZpZ2F0aW9uIGlzIGFsc28gY2FuY2VsbGVkLlxuICogSWYgYENhbkFjdGl2YXRlYCByZXR1cm5zIG9yIHJlc29sdmVzIHRvIGB0cnVlYCwgbmF2aWdhdGlvbiBjb250aW51ZXMsIHRoZSBjb21wb25lbnQgaXNcbiAqIGluc3RhbnRpYXRlZCwgYW5kIHRoZSB7QGxpbmsgT25BY3RpdmF0ZX0gaG9vayBvZiB0aGF0IGNvbXBvbmVudCBpcyBjYWxsZWQgaWYgaW1wbGVtZW50ZWQuXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiB7QGV4YW1wbGUgcm91dGVyL3RzL2Nhbl9hY3RpdmF0ZS9jYW5fYWN0aXZhdGVfZXhhbXBsZS50cyByZWdpb249J2NhbkFjdGl2YXRlJyB9XG4gKi9cbmV4cG9ydCB2YXIgQ2FuQWN0aXZhdGU6IChob29rOiAobmV4dDogQ29tcG9uZW50SW5zdHJ1Y3Rpb24sIHByZXY6IENvbXBvbmVudEluc3RydWN0aW9uKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9taXNlPGJvb2xlYW4+fCBib29sZWFuKSA9PiBDbGFzc0RlY29yYXRvciA9XG4gICAgbWFrZURlY29yYXRvcihDYW5BY3RpdmF0ZUFubm90YXRpb24pO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3JvdXRlci9saWZlY3ljbGVfYW5ub3RhdGlvbnMudHNcbiAqKi8iLCJpbXBvcnQge0RpcmVjdGl2ZX0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5pbXBvcnQge2lzU3RyaW5nfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuXG5pbXBvcnQge1JvdXRlcn0gZnJvbSAnLi9yb3V0ZXInO1xuaW1wb3J0IHtMb2NhdGlvbn0gZnJvbSAnLi9sb2NhdGlvbic7XG5pbXBvcnQge0luc3RydWN0aW9ufSBmcm9tICcuL2luc3RydWN0aW9uJztcblxuLyoqXG4gKiBUaGUgUm91dGVyTGluayBkaXJlY3RpdmUgbGV0cyB5b3UgbGluayB0byBzcGVjaWZpYyBwYXJ0cyBvZiB5b3VyIGFwcC5cbiAqXG4gKiBDb25zaWRlciB0aGUgZm9sbG93aW5nIHJvdXRlIGNvbmZpZ3VyYXRpb246XG5cbiAqIGBgYFxuICogQFJvdXRlQ29uZmlnKFtcbiAqICAgeyBwYXRoOiAnL3VzZXInLCBjb21wb25lbnQ6IFVzZXJDbXAsIGFzOiAnVXNlcicgfVxuICogXSk7XG4gKiBjbGFzcyBNeUNvbXAge31cbiAqIGBgYFxuICpcbiAqIFdoZW4gbGlua2luZyB0byB0aGlzIGBVc2VyYCByb3V0ZSwgeW91IGNhbiB3cml0ZTpcbiAqXG4gKiBgYGBcbiAqIDxhIFtyb3V0ZXJMaW5rXT1cIlsnLi9Vc2VyJ11cIj5saW5rIHRvIHVzZXIgY29tcG9uZW50PC9hPlxuICogYGBgXG4gKlxuICogUm91dGVyTGluayBleHBlY3RzIHRoZSB2YWx1ZSB0byBiZSBhbiBhcnJheSBvZiByb3V0ZSBuYW1lcywgZm9sbG93ZWQgYnkgdGhlIHBhcmFtc1xuICogZm9yIHRoYXQgbGV2ZWwgb2Ygcm91dGluZy4gRm9yIGluc3RhbmNlIGBbJy9UZWFtJywge3RlYW1JZDogMX0sICdVc2VyJywge3VzZXJJZDogMn1dYFxuICogbWVhbnMgdGhhdCB3ZSB3YW50IHRvIGdlbmVyYXRlIGEgbGluayBmb3IgdGhlIGBUZWFtYCByb3V0ZSB3aXRoIHBhcmFtcyBge3RlYW1JZDogMX1gLFxuICogYW5kIHdpdGggYSBjaGlsZCByb3V0ZSBgVXNlcmAgd2l0aCBwYXJhbXMgYHt1c2VySWQ6IDJ9YC5cbiAqXG4gKiBUaGUgZmlyc3Qgcm91dGUgbmFtZSBzaG91bGQgYmUgcHJlcGVuZGVkIHdpdGggYC9gLCBgLi9gLCBvciBgLi4vYC5cbiAqIElmIHRoZSByb3V0ZSBiZWdpbnMgd2l0aCBgL2AsIHRoZSByb3V0ZXIgd2lsbCBsb29rIHVwIHRoZSByb3V0ZSBmcm9tIHRoZSByb290IG9mIHRoZSBhcHAuXG4gKiBJZiB0aGUgcm91dGUgYmVnaW5zIHdpdGggYC4vYCwgdGhlIHJvdXRlciB3aWxsIGluc3RlYWQgbG9vayBpbiB0aGUgY3VycmVudCBjb21wb25lbnQnc1xuICogY2hpbGRyZW4gZm9yIHRoZSByb3V0ZS4gQW5kIGlmIHRoZSByb3V0ZSBiZWdpbnMgd2l0aCBgLi4vYCwgdGhlIHJvdXRlciB3aWxsIGxvb2sgYXQgdGhlXG4gKiBjdXJyZW50IGNvbXBvbmVudCdzIHBhcmVudC5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW3JvdXRlckxpbmtdJyxcbiAgaW5wdXRzOiBbJ3JvdXRlUGFyYW1zOiByb3V0ZXJMaW5rJywgJ3RhcmdldDogdGFyZ2V0J10sXG4gIGhvc3Q6IHtcbiAgICAnKGNsaWNrKSc6ICdvbkNsaWNrKCknLFxuICAgICdbYXR0ci5ocmVmXSc6ICd2aXNpYmxlSHJlZicsXG4gICAgJ1tjbGFzcy5yb3V0ZXItbGluay1hY3RpdmVdJzogJ2lzUm91dGVBY3RpdmUnXG4gIH1cbn0pXG5leHBvcnQgY2xhc3MgUm91dGVyTGluayB7XG4gIHByaXZhdGUgX3JvdXRlUGFyYW1zOiBhbnlbXTtcblxuICAvLyB0aGUgdXJsIGRpc3BsYXllZCBvbiB0aGUgYW5jaG9yIGVsZW1lbnQuXG4gIHZpc2libGVIcmVmOiBzdHJpbmc7XG4gIHRhcmdldDogc3RyaW5nO1xuXG4gIC8vIHRoZSBpbnN0cnVjdGlvbiBwYXNzZWQgdG8gdGhlIHJvdXRlciB0byBuYXZpZ2F0ZVxuICBwcml2YXRlIF9uYXZpZ2F0aW9uSW5zdHJ1Y3Rpb246IEluc3RydWN0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3JvdXRlcjogUm91dGVyLCBwcml2YXRlIF9sb2NhdGlvbjogTG9jYXRpb24pIHt9XG5cbiAgZ2V0IGlzUm91dGVBY3RpdmUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9yb3V0ZXIuaXNSb3V0ZUFjdGl2ZSh0aGlzLl9uYXZpZ2F0aW9uSW5zdHJ1Y3Rpb24pOyB9XG5cbiAgc2V0IHJvdXRlUGFyYW1zKGNoYW5nZXM6IGFueVtdKSB7XG4gICAgdGhpcy5fcm91dGVQYXJhbXMgPSBjaGFuZ2VzO1xuICAgIHRoaXMuX25hdmlnYXRpb25JbnN0cnVjdGlvbiA9IHRoaXMuX3JvdXRlci5nZW5lcmF0ZSh0aGlzLl9yb3V0ZVBhcmFtcyk7XG5cbiAgICB2YXIgbmF2aWdhdGlvbkhyZWYgPSB0aGlzLl9uYXZpZ2F0aW9uSW5zdHJ1Y3Rpb24udG9MaW5rVXJsKCk7XG4gICAgdGhpcy52aXNpYmxlSHJlZiA9IHRoaXMuX2xvY2F0aW9uLnByZXBhcmVFeHRlcm5hbFVybChuYXZpZ2F0aW9uSHJlZik7XG4gIH1cblxuICBvbkNsaWNrKCk6IGJvb2xlYW4ge1xuICAgIC8vIElmIG5vIHRhcmdldCwgb3IgaWYgdGFyZ2V0IGlzIF9zZWxmLCBwcmV2ZW50IGRlZmF1bHQgYnJvd3NlciBiZWhhdmlvclxuICAgIGlmICghaXNTdHJpbmcodGhpcy50YXJnZXQpIHx8IHRoaXMudGFyZ2V0ID09ICdfc2VsZicpIHtcbiAgICAgIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZUJ5SW5zdHJ1Y3Rpb24odGhpcy5fbmF2aWdhdGlvbkluc3RydWN0aW9uKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9yb3V0ZXIvcm91dGVyX2xpbmsudHNcbiAqKi8iLCJpbXBvcnQge0RPTX0gZnJvbSAnYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9kb21fYWRhcHRlcic7XG5pbXBvcnQge0luamVjdGFibGV9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuaW1wb3J0IHtFdmVudExpc3RlbmVyLCBIaXN0b3J5LCBMb2NhdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9icm93c2VyJztcblxuLyoqXG4gKiBgUGxhdGZvcm1Mb2NhdGlvbmAgZW5jYXBzdWxhdGVzIGFsbCBvZiB0aGUgZGlyZWN0IGNhbGxzIHRvIHBsYXRmb3JtIEFQSXMuXG4gKiBUaGlzIGNsYXNzIHNob3VsZCBub3QgYmUgdXNlZCBkaXJlY3RseSBieSBhbiBhcHBsaWNhdGlvbiBkZXZlbG9wZXIuIEluc3RlYWQsIHVzZVxuICoge0BsaW5rIExvY2F0aW9ufS5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFBsYXRmb3JtTG9jYXRpb24ge1xuICBwcml2YXRlIF9sb2NhdGlvbjogTG9jYXRpb247XG4gIHByaXZhdGUgX2hpc3Rvcnk6IEhpc3Rvcnk7XG5cbiAgY29uc3RydWN0b3IoKSB7IHRoaXMuX2luaXQoKTsgfVxuXG4gIC8vIFRoaXMgaXMgbW92ZWQgdG8gaXRzIG93biBtZXRob2Qgc28gdGhhdCBgTW9ja1BsYXRmb3JtTG9jYXRpb25TdHJhdGVneWAgY2FuIG92ZXJ3cml0ZSBpdFxuICAvKiogQGludGVybmFsICovXG4gIF9pbml0KCkge1xuICAgIHRoaXMuX2xvY2F0aW9uID0gRE9NLmdldExvY2F0aW9uKCk7XG4gICAgdGhpcy5faGlzdG9yeSA9IERPTS5nZXRIaXN0b3J5KCk7XG4gIH1cblxuICBnZXRCYXNlSHJlZkZyb21ET00oKTogc3RyaW5nIHsgcmV0dXJuIERPTS5nZXRCYXNlSHJlZigpOyB9XG5cbiAgb25Qb3BTdGF0ZShmbjogRXZlbnRMaXN0ZW5lcik6IHZvaWQge1xuICAgIERPTS5nZXRHbG9iYWxFdmVudFRhcmdldCgnd2luZG93JykuYWRkRXZlbnRMaXN0ZW5lcigncG9wc3RhdGUnLCBmbiwgZmFsc2UpO1xuICB9XG5cbiAgb25IYXNoQ2hhbmdlKGZuOiBFdmVudExpc3RlbmVyKTogdm9pZCB7XG4gICAgRE9NLmdldEdsb2JhbEV2ZW50VGFyZ2V0KCd3aW5kb3cnKS5hZGRFdmVudExpc3RlbmVyKCdoYXNoY2hhbmdlJywgZm4sIGZhbHNlKTtcbiAgfVxuXG4gIGdldCBwYXRobmFtZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fbG9jYXRpb24ucGF0aG5hbWU7IH1cbiAgZ2V0IHNlYXJjaCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fbG9jYXRpb24uc2VhcmNoOyB9XG4gIGdldCBoYXNoKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9sb2NhdGlvbi5oYXNoOyB9XG4gIHNldCBwYXRobmFtZShuZXdQYXRoOiBzdHJpbmcpIHsgdGhpcy5fbG9jYXRpb24ucGF0aG5hbWUgPSBuZXdQYXRoOyB9XG5cbiAgcHVzaFN0YXRlKHN0YXRlOiBhbnksIHRpdGxlOiBzdHJpbmcsIHVybDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5faGlzdG9yeS5wdXNoU3RhdGUoc3RhdGUsIHRpdGxlLCB1cmwpO1xuICB9XG5cbiAgcmVwbGFjZVN0YXRlKHN0YXRlOiBhbnksIHRpdGxlOiBzdHJpbmcsIHVybDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5faGlzdG9yeS5yZXBsYWNlU3RhdGUoc3RhdGUsIHRpdGxlLCB1cmwpO1xuICB9XG5cbiAgZm9yd2FyZCgpOiB2b2lkIHsgdGhpcy5faGlzdG9yeS5mb3J3YXJkKCk7IH1cblxuICBiYWNrKCk6IHZvaWQgeyB0aGlzLl9oaXN0b3J5LmJhY2soKTsgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3JvdXRlci9wbGF0Zm9ybV9sb2NhdGlvbi50c1xuICoqLyIsImltcG9ydCB7SW5qZWN0YWJsZSwgSW5qZWN0LCBPcHRpb25hbH0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5pbXBvcnQge1xuICBMb2NhdGlvblN0cmF0ZWd5LFxuICBqb2luV2l0aFNsYXNoLFxuICBBUFBfQkFTRV9IUkVGLFxuICBub3JtYWxpemVRdWVyeVBhcmFtc1xufSBmcm9tICcuL2xvY2F0aW9uX3N0cmF0ZWd5JztcbmltcG9ydCB7RXZlbnRMaXN0ZW5lcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9icm93c2VyJztcbmltcG9ydCB7aXNQcmVzZW50fSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtQbGF0Zm9ybUxvY2F0aW9ufSBmcm9tICcuL3BsYXRmb3JtX2xvY2F0aW9uJztcblxuLyoqXG4gKiBgSGFzaExvY2F0aW9uU3RyYXRlZ3lgIGlzIGEge0BsaW5rIExvY2F0aW9uU3RyYXRlZ3l9IHVzZWQgdG8gY29uZmlndXJlIHRoZVxuICoge0BsaW5rIExvY2F0aW9ufSBzZXJ2aWNlIHRvIHJlcHJlc2VudCBpdHMgc3RhdGUgaW4gdGhlXG4gKiBbaGFzaCBmcmFnbWVudF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVW5pZm9ybV9SZXNvdXJjZV9Mb2NhdG9yI1N5bnRheClcbiAqIG9mIHRoZSBicm93c2VyJ3MgVVJMLlxuICpcbiAqIEZvciBpbnN0YW5jZSwgaWYgeW91IGNhbGwgYGxvY2F0aW9uLmdvKCcvZm9vJylgLCB0aGUgYnJvd3NlcidzIFVSTCB3aWxsIGJlY29tZVxuICogYGV4YW1wbGUuY29tIy9mb29gLlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogYGBgXG4gKiBpbXBvcnQge0NvbXBvbmVudCwgcHJvdmlkZX0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG4gKiBpbXBvcnQge1xuICogICBST1VURVJfRElSRUNUSVZFUyxcbiAqICAgUk9VVEVSX1BST1ZJREVSUyxcbiAqICAgUm91dGVDb25maWcsXG4gKiAgIExvY2F0aW9uLFxuICogICBMb2NhdGlvblN0cmF0ZWd5LFxuICogICBIYXNoTG9jYXRpb25TdHJhdGVneVxuICogfSBmcm9tICdhbmd1bGFyMi9yb3V0ZXInO1xuICpcbiAqIEBDb21wb25lbnQoe2RpcmVjdGl2ZXM6IFtST1VURVJfRElSRUNUSVZFU119KVxuICogQFJvdXRlQ29uZmlnKFtcbiAqICB7Li4ufSxcbiAqIF0pXG4gKiBjbGFzcyBBcHBDbXAge1xuICogICBjb25zdHJ1Y3Rvcihsb2NhdGlvbjogTG9jYXRpb24pIHtcbiAqICAgICBsb2NhdGlvbi5nbygnL2ZvbycpO1xuICogICB9XG4gKiB9XG4gKlxuICogYm9vdHN0cmFwKEFwcENtcCwgW1xuICogICBST1VURVJfUFJPVklERVJTLFxuICogICBwcm92aWRlKExvY2F0aW9uU3RyYXRlZ3ksIHt1c2VDbGFzczogSGFzaExvY2F0aW9uU3RyYXRlZ3l9KVxuICogXSk7XG4gKiBgYGBcbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEhhc2hMb2NhdGlvblN0cmF0ZWd5IGV4dGVuZHMgTG9jYXRpb25TdHJhdGVneSB7XG4gIHByaXZhdGUgX2Jhc2VIcmVmOiBzdHJpbmcgPSAnJztcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfcGxhdGZvcm1Mb2NhdGlvbjogUGxhdGZvcm1Mb2NhdGlvbixcbiAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChBUFBfQkFTRV9IUkVGKSBfYmFzZUhyZWY/OiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuICAgIGlmIChpc1ByZXNlbnQoX2Jhc2VIcmVmKSkge1xuICAgICAgdGhpcy5fYmFzZUhyZWYgPSBfYmFzZUhyZWY7XG4gICAgfVxuICB9XG5cbiAgb25Qb3BTdGF0ZShmbjogRXZlbnRMaXN0ZW5lcik6IHZvaWQge1xuICAgIHRoaXMuX3BsYXRmb3JtTG9jYXRpb24ub25Qb3BTdGF0ZShmbik7XG4gICAgdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5vbkhhc2hDaGFuZ2UoZm4pO1xuICB9XG5cbiAgZ2V0QmFzZUhyZWYoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX2Jhc2VIcmVmOyB9XG5cbiAgcGF0aCgpOiBzdHJpbmcge1xuICAgIC8vIHRoZSBoYXNoIHZhbHVlIGlzIGFsd2F5cyBwcmVmaXhlZCB3aXRoIGEgYCNgXG4gICAgLy8gYW5kIGlmIGl0IGlzIGVtcHR5IHRoZW4gaXQgd2lsbCBzdGF5IGVtcHR5XG4gICAgdmFyIHBhdGggPSB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLmhhc2g7XG5cbiAgICAvLyBEYXJ0IHdpbGwgY29tcGxhaW4gaWYgYSBjYWxsIHRvIHN1YnN0cmluZyBpc1xuICAgIC8vIGV4ZWN1dGVkIHdpdGggYSBwb3NpdGlvbiB2YWx1ZSB0aGF0IGV4dGVuZHMgdGhlXG4gICAgLy8gbGVuZ3RoIG9mIHN0cmluZy5cbiAgICByZXR1cm4gKHBhdGgubGVuZ3RoID4gMCA/IHBhdGguc3Vic3RyaW5nKDEpIDogcGF0aCkgK1xuICAgICAgICAgICBub3JtYWxpemVRdWVyeVBhcmFtcyh0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLnNlYXJjaCk7XG4gIH1cblxuICBwcmVwYXJlRXh0ZXJuYWxVcmwoaW50ZXJuYWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdmFyIHVybCA9IGpvaW5XaXRoU2xhc2godGhpcy5fYmFzZUhyZWYsIGludGVybmFsKTtcbiAgICByZXR1cm4gdXJsLmxlbmd0aCA+IDAgPyAoJyMnICsgdXJsKSA6IHVybDtcbiAgfVxuXG4gIHB1c2hTdGF0ZShzdGF0ZTogYW55LCB0aXRsZTogc3RyaW5nLCBwYXRoOiBzdHJpbmcsIHF1ZXJ5UGFyYW1zOiBzdHJpbmcpIHtcbiAgICB2YXIgdXJsID0gdGhpcy5wcmVwYXJlRXh0ZXJuYWxVcmwocGF0aCArIG5vcm1hbGl6ZVF1ZXJ5UGFyYW1zKHF1ZXJ5UGFyYW1zKSk7XG4gICAgaWYgKHVybC5sZW5ndGggPT0gMCkge1xuICAgICAgdXJsID0gdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5wYXRobmFtZTtcbiAgICB9XG4gICAgdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5wdXNoU3RhdGUoc3RhdGUsIHRpdGxlLCB1cmwpO1xuICB9XG5cbiAgcmVwbGFjZVN0YXRlKHN0YXRlOiBhbnksIHRpdGxlOiBzdHJpbmcsIHBhdGg6IHN0cmluZywgcXVlcnlQYXJhbXM6IHN0cmluZykge1xuICAgIHZhciB1cmwgPSB0aGlzLnByZXBhcmVFeHRlcm5hbFVybChwYXRoICsgbm9ybWFsaXplUXVlcnlQYXJhbXMocXVlcnlQYXJhbXMpKTtcbiAgICBpZiAodXJsLmxlbmd0aCA9PSAwKSB7XG4gICAgICB1cmwgPSB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIH1cbiAgICB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLnJlcGxhY2VTdGF0ZShzdGF0ZSwgdGl0bGUsIHVybCk7XG4gIH1cblxuICBmb3J3YXJkKCk6IHZvaWQgeyB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLmZvcndhcmQoKTsgfVxuXG4gIGJhY2soKTogdm9pZCB7IHRoaXMuX3BsYXRmb3JtTG9jYXRpb24uYmFjaygpOyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvcm91dGVyL2hhc2hfbG9jYXRpb25fc3RyYXRlZ3kudHNcbiAqKi8iLCJpbXBvcnQge0luamVjdGFibGUsIEluamVjdCwgT3B0aW9uYWx9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuaW1wb3J0IHtFdmVudExpc3RlbmVyLCBIaXN0b3J5LCBMb2NhdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9icm93c2VyJztcbmltcG9ydCB7aXNCbGFua30gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7XG4gIExvY2F0aW9uU3RyYXRlZ3ksXG4gIEFQUF9CQVNFX0hSRUYsXG4gIG5vcm1hbGl6ZVF1ZXJ5UGFyYW1zLFxuICBqb2luV2l0aFNsYXNoXG59IGZyb20gJy4vbG9jYXRpb25fc3RyYXRlZ3knO1xuaW1wb3J0IHtQbGF0Zm9ybUxvY2F0aW9ufSBmcm9tICcuL3BsYXRmb3JtX2xvY2F0aW9uJztcblxuLyoqXG4gKiBgUGF0aExvY2F0aW9uU3RyYXRlZ3lgIGlzIGEge0BsaW5rIExvY2F0aW9uU3RyYXRlZ3l9IHVzZWQgdG8gY29uZmlndXJlIHRoZVxuICoge0BsaW5rIExvY2F0aW9ufSBzZXJ2aWNlIHRvIHJlcHJlc2VudCBpdHMgc3RhdGUgaW4gdGhlXG4gKiBbcGF0aF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVW5pZm9ybV9SZXNvdXJjZV9Mb2NhdG9yI1N5bnRheCkgb2YgdGhlXG4gKiBicm93c2VyJ3MgVVJMLlxuICpcbiAqIGBQYXRoTG9jYXRpb25TdHJhdGVneWAgaXMgdGhlIGRlZmF1bHQgYmluZGluZyBmb3Ige0BsaW5rIExvY2F0aW9uU3RyYXRlZ3l9XG4gKiBwcm92aWRlZCBpbiB7QGxpbmsgUk9VVEVSX1BST1ZJREVSU30uXG4gKlxuICogSWYgeW91J3JlIHVzaW5nIGBQYXRoTG9jYXRpb25TdHJhdGVneWAsIHlvdSBtdXN0IHByb3ZpZGUgYSBwcm92aWRlciBmb3JcbiAqIHtAbGluayBBUFBfQkFTRV9IUkVGfSB0byBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIFVSTCBwcmVmaXggdGhhdCBzaG91bGRcbiAqIGJlIHByZXNlcnZlZCB3aGVuIGdlbmVyYXRpbmcgYW5kIHJlY29nbml6aW5nIFVSTHMuXG4gKlxuICogRm9yIGluc3RhbmNlLCBpZiB5b3UgcHJvdmlkZSBhbiBgQVBQX0JBU0VfSFJFRmAgb2YgYCcvbXkvYXBwJ2AgYW5kIGNhbGxcbiAqIGBsb2NhdGlvbi5nbygnL2ZvbycpYCwgdGhlIGJyb3dzZXIncyBVUkwgd2lsbCBiZWNvbWVcbiAqIGBleGFtcGxlLmNvbS9teS9hcHAvZm9vYC5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIGBgYFxuICogaW1wb3J0IHtDb21wb25lbnQsIHByb3ZpZGV9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuICogaW1wb3J0IHtcbiAqICAgQVBQX0JBU0VfSFJFRlxuICogICBST1VURVJfRElSRUNUSVZFUyxcbiAqICAgUk9VVEVSX1BST1ZJREVSUyxcbiAqICAgUm91dGVDb25maWcsXG4gKiAgIExvY2F0aW9uXG4gKiB9IGZyb20gJ2FuZ3VsYXIyL3JvdXRlcic7XG4gKlxuICogQENvbXBvbmVudCh7ZGlyZWN0aXZlczogW1JPVVRFUl9ESVJFQ1RJVkVTXX0pXG4gKiBAUm91dGVDb25maWcoW1xuICogIHsuLi59LFxuICogXSlcbiAqIGNsYXNzIEFwcENtcCB7XG4gKiAgIGNvbnN0cnVjdG9yKGxvY2F0aW9uOiBMb2NhdGlvbikge1xuICogICAgIGxvY2F0aW9uLmdvKCcvZm9vJyk7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBib290c3RyYXAoQXBwQ21wLCBbXG4gKiAgIFJPVVRFUl9QUk9WSURFUlMsIC8vIGluY2x1ZGVzIGJpbmRpbmcgdG8gUGF0aExvY2F0aW9uU3RyYXRlZ3lcbiAqICAgcHJvdmlkZShBUFBfQkFTRV9IUkVGLCB7dXNlVmFsdWU6ICcvbXkvYXBwJ30pXG4gKiBdKTtcbiAqIGBgYFxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUGF0aExvY2F0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBMb2NhdGlvblN0cmF0ZWd5IHtcbiAgcHJpdmF0ZSBfYmFzZUhyZWY6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9wbGF0Zm9ybUxvY2F0aW9uOiBQbGF0Zm9ybUxvY2F0aW9uLFxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFQUF9CQVNFX0hSRUYpIGhyZWY/OiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgaWYgKGlzQmxhbmsoaHJlZikpIHtcbiAgICAgIGhyZWYgPSB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLmdldEJhc2VIcmVmRnJvbURPTSgpO1xuICAgIH1cblxuICAgIGlmIChpc0JsYW5rKGhyZWYpKSB7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihcbiAgICAgICAgICBgTm8gYmFzZSBocmVmIHNldC4gUGxlYXNlIHByb3ZpZGUgYSB2YWx1ZSBmb3IgdGhlIEFQUF9CQVNFX0hSRUYgdG9rZW4gb3IgYWRkIGEgYmFzZSBlbGVtZW50IHRvIHRoZSBkb2N1bWVudC5gKTtcbiAgICB9XG5cbiAgICB0aGlzLl9iYXNlSHJlZiA9IGhyZWY7XG4gIH1cblxuICBvblBvcFN0YXRlKGZuOiBFdmVudExpc3RlbmVyKTogdm9pZCB7XG4gICAgdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5vblBvcFN0YXRlKGZuKTtcbiAgICB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLm9uSGFzaENoYW5nZShmbik7XG4gIH1cblxuICBnZXRCYXNlSHJlZigpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fYmFzZUhyZWY7IH1cblxuICBwcmVwYXJlRXh0ZXJuYWxVcmwoaW50ZXJuYWw6IHN0cmluZyk6IHN0cmluZyB7IHJldHVybiBqb2luV2l0aFNsYXNoKHRoaXMuX2Jhc2VIcmVmLCBpbnRlcm5hbCk7IH1cblxuICBwYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3BsYXRmb3JtTG9jYXRpb24ucGF0aG5hbWUgKyBub3JtYWxpemVRdWVyeVBhcmFtcyh0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLnNlYXJjaCk7XG4gIH1cblxuICBwdXNoU3RhdGUoc3RhdGU6IGFueSwgdGl0bGU6IHN0cmluZywgdXJsOiBzdHJpbmcsIHF1ZXJ5UGFyYW1zOiBzdHJpbmcpIHtcbiAgICB2YXIgZXh0ZXJuYWxVcmwgPSB0aGlzLnByZXBhcmVFeHRlcm5hbFVybCh1cmwgKyBub3JtYWxpemVRdWVyeVBhcmFtcyhxdWVyeVBhcmFtcykpO1xuICAgIHRoaXMuX3BsYXRmb3JtTG9jYXRpb24ucHVzaFN0YXRlKHN0YXRlLCB0aXRsZSwgZXh0ZXJuYWxVcmwpO1xuICB9XG5cbiAgcmVwbGFjZVN0YXRlKHN0YXRlOiBhbnksIHRpdGxlOiBzdHJpbmcsIHVybDogc3RyaW5nLCBxdWVyeVBhcmFtczogc3RyaW5nKSB7XG4gICAgdmFyIGV4dGVybmFsVXJsID0gdGhpcy5wcmVwYXJlRXh0ZXJuYWxVcmwodXJsICsgbm9ybWFsaXplUXVlcnlQYXJhbXMocXVlcnlQYXJhbXMpKTtcbiAgICB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLnJlcGxhY2VTdGF0ZShzdGF0ZSwgdGl0bGUsIGV4dGVybmFsVXJsKTtcbiAgfVxuXG4gIGZvcndhcmQoKTogdm9pZCB7IHRoaXMuX3BsYXRmb3JtTG9jYXRpb24uZm9yd2FyZCgpOyB9XG5cbiAgYmFjaygpOiB2b2lkIHsgdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5iYWNrKCk7IH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9yb3V0ZXIvcGF0aF9sb2NhdGlvbl9zdHJhdGVneS50c1xuICoqLyIsImltcG9ydCB7VEVNUExBVEVfVFJBTlNGT1JNU30gZnJvbSAnYW5ndWxhcjIvY29tcGlsZXInO1xuaW1wb3J0IHtQcm92aWRlcn0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5pbXBvcnQge1JvdXRlckxpbmtUcmFuc2Zvcm19IGZyb20gJ2FuZ3VsYXIyL3NyYy9yb3V0ZXIvcm91dGVyX2xpbmtfdHJhbnNmb3JtJztcbmltcG9ydCB7Q09OU1RfRVhQUn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxuZXhwb3J0IHtSb3V0ZXJMaW5rVHJhbnNmb3JtfSBmcm9tICdhbmd1bGFyMi9zcmMvcm91dGVyL3JvdXRlcl9saW5rX3RyYW5zZm9ybSc7XG5cbi8qKlxuICogRW5hYmxlcyB0aGUgcm91dGVyIGxpbmsgRFNMLlxuICpcbiAqIFdhcm5pbmcuIFRoaXMgZmVhdHVyZSBpcyBleHBlcmltZW50YWwgYW5kIGNhbiBjaGFuZ2UuXG4gKlxuICogVG8gZW5hYmxlIHRoZSB0cmFuc2Zvcm1lciBwYXNzIHRoZSByb3V0ZXIgbGluayBEU0wgcHJvdmlkZXIgdG8gYGJvb3RzdHJhcGAuXG4gKlxuICogIyMgRXhhbXBsZTpcbiAqIGBgYFxuICogaW1wb3J0IHtib290c3RyYXB9IGZyb20gJ2FuZ3VsYXIyL3BsYXRmb3JtL2Jyb3dzZXInO1xuICogaW1wb3J0IHtST1VURVJfTElOS19EU0xfUFJPVklERVJ9IGZyb20gJ2FuZ3VsYXIyL3JvdXRlci9yb3V0ZXJfbGlua19kc2wnO1xuICpcbiAqIGJvb3RzdHJhcChDdXN0b21BcHAsIFtST1VURVJfTElOS19EU0xfUFJPVklERVJdKTtcbiAqIGBgYFxuICpcbiAqIFRoZSBEU0wgYWxsb3dzIHlvdSB0byBleHByZXNzIHJvdXRlciBsaW5rcyBhcyBmb2xsb3dzOlxuICogYGBgXG4gKiA8YSBbcm91dGVyTGlua109XCJyb3V0ZTpVc2VyXCI+IDwhLS0gU2FtZSBhcyA8YSBbcm91dGVyTGlua109XCJbJ1VzZXInXVwiPiAtLT5cbiAqIDxhIFtyb3V0ZXJMaW5rXT1cInJvdXRlOi9Vc2VyXCI+IDwhLS0gU2FtZSBhcyA8YSBbcm91dGVyTGlua109XCJbJ1VzZXInXVwiPiAtLT5cbiAqIDxhIFtyb3V0ZXJMaW5rXT1cInJvdXRlOi4vVXNlclwiPiA8IS0tIFNhbWUgYXMgPGEgW3JvdXRlckxpbmtdPVwiWycuL1VzZXInXVwiPiAtLT5cbiAqIDxhIFtyb3V0ZXJMaW5rXT1cIi4vVXNlcihpZDogdmFsdWUsIG5hbWU6ICdCb2InKVwiPiA8IS0tIFNhbWUgYXMgPGEgW3JvdXRlckxpbmtdPVwiWycuL1VzZXInLCB7aWQ6XG4gKiB2YWx1ZSwgbmFtZTogJ0JvYid9XVwiPiAtLT5cbiAqIDxhIFtyb3V0ZXJMaW5rXT1cIi9Vc2VyL01vZGFsXCI+IDwhLS0gU2FtZSBhcyA8YSBbcm91dGVyTGlua109XCJbJy9Vc2VyJywgJ01vZGFsJ11cIj4gLS0+XG4gKiA8YSBbcm91dGVyTGlua109XCJVc2VyW01vZGFsXVwiPiA8IS0tIFNhbWUgYXMgPGEgW3JvdXRlckxpbmtdPVwiWydVc2VyJywgWydNb2RhbCddXVwiPiAtLT5cbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgUk9VVEVSX0xJTktfRFNMX1BST1ZJREVSID1cbiAgICBDT05TVF9FWFBSKG5ldyBQcm92aWRlcihURU1QTEFURV9UUkFOU0ZPUk1TLCB7dXNlQ2xhc3M6IFJvdXRlckxpbmtUcmFuc2Zvcm0sIG11bHRpOiB0cnVlfSkpO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvcm91dGVyL3JvdXRlcl9saW5rX2RzbC50c1xuICoqLyIsImltcG9ydCB7XG4gIFRlbXBsYXRlQXN0VmlzaXRvcixcbiAgRWxlbWVudEFzdCxcbiAgQm91bmREaXJlY3RpdmVQcm9wZXJ0eUFzdCxcbiAgRGlyZWN0aXZlQXN0LFxuICBCb3VuZEVsZW1lbnRQcm9wZXJ0eUFzdFxufSBmcm9tICdhbmd1bGFyMi9jb21waWxlcic7XG5pbXBvcnQge1xuICBBc3RUcmFuc2Zvcm1lcixcbiAgUXVvdGUsXG4gIEFTVCxcbiAgRW1wdHlFeHByLFxuICBMaXRlcmFsQXJyYXksXG4gIExpdGVyYWxQcmltaXRpdmUsXG4gIEFTVFdpdGhTb3VyY2Vcbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9wYXJzZXIvYXN0JztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5pbXBvcnQge1BhcnNlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9wYXJzZXIvcGFyc2VyJztcblxuLyoqXG4gKiBlLmcuLCAnLi9Vc2VyJywgJ01vZGFsJyBpbiAuL1VzZXJbTW9kYWwocGFyYW06IHZhbHVlKV1cbiAqL1xuY2xhc3MgRml4ZWRQYXJ0IHtcbiAgY29uc3RydWN0b3IocHVibGljIHZhbHVlOiBzdHJpbmcpIHt9XG59XG5cbi8qKlxuICogVGhlIHNxdWFyZSBicmFja2V0XG4gKi9cbmNsYXNzIEF1eGlsaWFyeVN0YXJ0IHtcbiAgY29uc3RydWN0b3IoKSB7fVxufVxuXG4vKipcbiAqIFRoZSBzcXVhcmUgYnJhY2tldFxuICovXG5jbGFzcyBBdXhpbGlhcnlFbmQge1xuICBjb25zdHJ1Y3RvcigpIHt9XG59XG5cbi8qKlxuICogZS5nLiwgcGFyYW06dmFsdWUgaW4gLi9Vc2VyW01vZGFsKHBhcmFtOiB2YWx1ZSldXG4gKi9cbmNsYXNzIFBhcmFtcyB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBhc3Q6IEFTVCkge31cbn1cblxuY2xhc3MgUm91dGVyTGlua0xleGVyIHtcbiAgaW5kZXg6IG51bWJlciA9IDA7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBwYXJzZXI6IFBhcnNlciwgcHJpdmF0ZSBleHA6IHN0cmluZykge31cblxuICB0b2tlbml6ZSgpOiBBcnJheTxGaXhlZFBhcnQgfCBBdXhpbGlhcnlTdGFydCB8IEF1eGlsaWFyeUVuZCB8IFBhcmFtcz4ge1xuICAgIGxldCB0b2tlbnMgPSBbXTtcbiAgICB3aGlsZSAodGhpcy5pbmRleCA8IHRoaXMuZXhwLmxlbmd0aCkge1xuICAgICAgdG9rZW5zLnB1c2godGhpcy5fcGFyc2VUb2tlbigpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRva2VucztcbiAgfVxuXG4gIHByaXZhdGUgX3BhcnNlVG9rZW4oKSB7XG4gICAgbGV0IGMgPSB0aGlzLmV4cFt0aGlzLmluZGV4XTtcbiAgICBpZiAoYyA9PSAnWycpIHtcbiAgICAgIHRoaXMuaW5kZXgrKztcbiAgICAgIHJldHVybiBuZXcgQXV4aWxpYXJ5U3RhcnQoKTtcblxuICAgIH0gZWxzZSBpZiAoYyA9PSAnXScpIHtcbiAgICAgIHRoaXMuaW5kZXgrKztcbiAgICAgIHJldHVybiBuZXcgQXV4aWxpYXJ5RW5kKCk7XG5cbiAgICB9IGVsc2UgaWYgKGMgPT0gJygnKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcGFyc2VQYXJhbXMoKTtcblxuICAgIH0gZWxzZSBpZiAoYyA9PSAnLycgJiYgdGhpcy5pbmRleCAhPT0gMCkge1xuICAgICAgdGhpcy5pbmRleCsrO1xuICAgICAgcmV0dXJuIHRoaXMuX3BhcnNlRml4ZWRQYXJ0KCk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX3BhcnNlRml4ZWRQYXJ0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcGFyc2VQYXJhbXMoKSB7XG4gICAgbGV0IHN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICBmb3IgKDsgdGhpcy5pbmRleCA8IHRoaXMuZXhwLmxlbmd0aDsgKyt0aGlzLmluZGV4KSB7XG4gICAgICBsZXQgYyA9IHRoaXMuZXhwW3RoaXMuaW5kZXhdO1xuICAgICAgaWYgKGMgPT0gJyknKSB7XG4gICAgICAgIGxldCBwYXJhbXNDb250ZW50ID0gdGhpcy5leHAuc3Vic3RyaW5nKHN0YXJ0ICsgMSwgdGhpcy5pbmRleCk7XG4gICAgICAgIHRoaXMuaW5kZXgrKztcbiAgICAgICAgcmV0dXJuIG5ldyBQYXJhbXModGhpcy5wYXJzZXIucGFyc2VCaW5kaW5nKGB7JHtwYXJhbXNDb250ZW50fX1gLCBudWxsKS5hc3QpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihcIkNhbm5vdCBmaW5kICcpJ1wiKTtcbiAgfVxuXG4gIHByaXZhdGUgX3BhcnNlRml4ZWRQYXJ0KCkge1xuICAgIGxldCBzdGFydCA9IHRoaXMuaW5kZXg7XG4gICAgbGV0IHNhd05vblNsYXNoID0gZmFsc2U7XG5cblxuICAgIGZvciAoOyB0aGlzLmluZGV4IDwgdGhpcy5leHAubGVuZ3RoOyArK3RoaXMuaW5kZXgpIHtcbiAgICAgIGxldCBjID0gdGhpcy5leHBbdGhpcy5pbmRleF07XG5cbiAgICAgIGlmIChjID09ICcoJyB8fCBjID09ICdbJyB8fCBjID09ICddJyB8fCAoYyA9PSAnLycgJiYgc2F3Tm9uU2xhc2gpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoYyAhPSAnLicgJiYgYyAhPSAnLycpIHtcbiAgICAgICAgc2F3Tm9uU2xhc2ggPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBmaXhlZCA9IHRoaXMuZXhwLnN1YnN0cmluZyhzdGFydCwgdGhpcy5pbmRleCk7XG5cbiAgICBpZiAoc3RhcnQgPT09IHRoaXMuaW5kZXggfHwgIXNhd05vblNsYXNoIHx8IGZpeGVkLnN0YXJ0c1dpdGgoJy8vJykpIHtcbiAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKFwiSW52YWxpZCByb3V0ZXIgbGlua1wiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEZpeGVkUGFydChmaXhlZCk7XG4gIH1cbn1cblxuY2xhc3MgUm91dGVyTGlua0FzdEdlbmVyYXRvciB7XG4gIGluZGV4OiBudW1iZXIgPSAwO1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRva2VuczogYW55W10pIHt9XG5cbiAgZ2VuZXJhdGUoKTogQVNUIHsgcmV0dXJuIHRoaXMuX2dlbkF1eGlsaWFyeSgpOyB9XG5cbiAgcHJpdmF0ZSBfZ2VuQXV4aWxpYXJ5KCk6IEFTVCB7XG4gICAgbGV0IGFyciA9IFtdO1xuICAgIGZvciAoOyB0aGlzLmluZGV4IDwgdGhpcy50b2tlbnMubGVuZ3RoOyB0aGlzLmluZGV4KyspIHtcbiAgICAgIGxldCByID0gdGhpcy50b2tlbnNbdGhpcy5pbmRleF07XG5cbiAgICAgIGlmIChyIGluc3RhbmNlb2YgRml4ZWRQYXJ0KSB7XG4gICAgICAgIGFyci5wdXNoKG5ldyBMaXRlcmFsUHJpbWl0aXZlKHIudmFsdWUpKTtcblxuICAgICAgfSBlbHNlIGlmIChyIGluc3RhbmNlb2YgUGFyYW1zKSB7XG4gICAgICAgIGFyci5wdXNoKHIuYXN0KTtcblxuICAgICAgfSBlbHNlIGlmIChyIGluc3RhbmNlb2YgQXV4aWxpYXJ5RW5kKSB7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICB9IGVsc2UgaWYgKHIgaW5zdGFuY2VvZiBBdXhpbGlhcnlTdGFydCkge1xuICAgICAgICB0aGlzLmluZGV4Kys7XG4gICAgICAgIGFyci5wdXNoKHRoaXMuX2dlbkF1eGlsaWFyeSgpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IExpdGVyYWxBcnJheShhcnIpO1xuICB9XG59XG5cbmNsYXNzIFJvdXRlckxpbmtBc3RUcmFuc2Zvcm1lciBleHRlbmRzIEFzdFRyYW5zZm9ybWVyIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBwYXJzZXI6IFBhcnNlcikgeyBzdXBlcigpOyB9XG5cbiAgdmlzaXRRdW90ZShhc3Q6IFF1b3RlKTogQVNUIHtcbiAgICBpZiAoYXN0LnByZWZpeCA9PSBcInJvdXRlXCIpIHtcbiAgICAgIHJldHVybiBwYXJzZVJvdXRlckxpbmtFeHByZXNzaW9uKHRoaXMucGFyc2VyLCBhc3QudW5pbnRlcnByZXRlZEV4cHJlc3Npb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc3VwZXIudmlzaXRRdW90ZShhc3QpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VSb3V0ZXJMaW5rRXhwcmVzc2lvbihwYXJzZXI6IFBhcnNlciwgZXhwOiBzdHJpbmcpOiBBU1Qge1xuICBsZXQgdG9rZW5zID0gbmV3IFJvdXRlckxpbmtMZXhlcihwYXJzZXIsIGV4cC50cmltKCkpLnRva2VuaXplKCk7XG4gIHJldHVybiBuZXcgUm91dGVyTGlua0FzdEdlbmVyYXRvcih0b2tlbnMpLmdlbmVyYXRlKCk7XG59XG5cbi8qKlxuICogQSBjb21waWxlciBwbHVnaW4gdGhhdCBpbXBsZW1lbnRzIHRoZSByb3V0ZXIgbGluayBEU0wuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBSb3V0ZXJMaW5rVHJhbnNmb3JtIGltcGxlbWVudHMgVGVtcGxhdGVBc3RWaXNpdG9yIHtcbiAgcHJpdmF0ZSBhc3RUcmFuc2Zvcm1lcjtcblxuICBjb25zdHJ1Y3RvcihwYXJzZXI6IFBhcnNlcikgeyB0aGlzLmFzdFRyYW5zZm9ybWVyID0gbmV3IFJvdXRlckxpbmtBc3RUcmFuc2Zvcm1lcihwYXJzZXIpOyB9XG5cbiAgdmlzaXROZ0NvbnRlbnQoYXN0OiBhbnksIGNvbnRleHQ6IGFueSk6IGFueSB7IHJldHVybiBhc3Q7IH1cblxuICB2aXNpdEVtYmVkZGVkVGVtcGxhdGUoYXN0OiBhbnksIGNvbnRleHQ6IGFueSk6IGFueSB7IHJldHVybiBhc3Q7IH1cblxuICB2aXNpdEVsZW1lbnQoYXN0OiBFbGVtZW50QXN0LCBjb250ZXh0OiBhbnkpOiBhbnkge1xuICAgIGxldCB1cGRhdGVkQ2hpbGRyZW4gPSBhc3QuY2hpbGRyZW4ubWFwKGMgPT4gYy52aXNpdCh0aGlzLCBjb250ZXh0KSk7XG4gICAgbGV0IHVwZGF0ZWRJbnB1dHMgPSBhc3QuaW5wdXRzLm1hcChjID0+IGMudmlzaXQodGhpcywgY29udGV4dCkpO1xuICAgIGxldCB1cGRhdGVkRGlyZWN0aXZlcyA9IGFzdC5kaXJlY3RpdmVzLm1hcChjID0+IGMudmlzaXQodGhpcywgY29udGV4dCkpO1xuICAgIHJldHVybiBuZXcgRWxlbWVudEFzdChhc3QubmFtZSwgYXN0LmF0dHJzLCB1cGRhdGVkSW5wdXRzLCBhc3Qub3V0cHV0cywgYXN0LmV4cG9ydEFzVmFycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZERpcmVjdGl2ZXMsIHVwZGF0ZWRDaGlsZHJlbiwgYXN0Lm5nQ29udGVudEluZGV4LCBhc3Quc291cmNlU3Bhbik7XG4gIH1cblxuICB2aXNpdFZhcmlhYmxlKGFzdDogYW55LCBjb250ZXh0OiBhbnkpOiBhbnkgeyByZXR1cm4gYXN0OyB9XG5cbiAgdmlzaXRFdmVudChhc3Q6IGFueSwgY29udGV4dDogYW55KTogYW55IHsgcmV0dXJuIGFzdDsgfVxuXG4gIHZpc2l0RWxlbWVudFByb3BlcnR5KGFzdDogYW55LCBjb250ZXh0OiBhbnkpOiBhbnkgeyByZXR1cm4gYXN0OyB9XG5cbiAgdmlzaXRBdHRyKGFzdDogYW55LCBjb250ZXh0OiBhbnkpOiBhbnkgeyByZXR1cm4gYXN0OyB9XG5cbiAgdmlzaXRCb3VuZFRleHQoYXN0OiBhbnksIGNvbnRleHQ6IGFueSk6IGFueSB7IHJldHVybiBhc3Q7IH1cblxuICB2aXNpdFRleHQoYXN0OiBhbnksIGNvbnRleHQ6IGFueSk6IGFueSB7IHJldHVybiBhc3Q7IH1cblxuICB2aXNpdERpcmVjdGl2ZShhc3Q6IERpcmVjdGl2ZUFzdCwgY29udGV4dDogYW55KTogYW55IHtcbiAgICBsZXQgdXBkYXRlZElucHV0cyA9IGFzdC5pbnB1dHMubWFwKGMgPT4gYy52aXNpdCh0aGlzLCBjb250ZXh0KSk7XG4gICAgcmV0dXJuIG5ldyBEaXJlY3RpdmVBc3QoYXN0LmRpcmVjdGl2ZSwgdXBkYXRlZElucHV0cywgYXN0Lmhvc3RQcm9wZXJ0aWVzLCBhc3QuaG9zdEV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3QuZXhwb3J0QXNWYXJzLCBhc3Quc291cmNlU3Bhbik7XG4gIH1cblxuICB2aXNpdERpcmVjdGl2ZVByb3BlcnR5KGFzdDogQm91bmREaXJlY3RpdmVQcm9wZXJ0eUFzdCwgY29udGV4dDogYW55KTogYW55IHtcbiAgICBsZXQgdHJhbnNmb3JtZWRWYWx1ZSA9IGFzdC52YWx1ZS52aXNpdCh0aGlzLmFzdFRyYW5zZm9ybWVyKTtcbiAgICByZXR1cm4gbmV3IEJvdW5kRGlyZWN0aXZlUHJvcGVydHlBc3QoYXN0LmRpcmVjdGl2ZU5hbWUsIGFzdC50ZW1wbGF0ZU5hbWUsIHRyYW5zZm9ybWVkVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzdC5zb3VyY2VTcGFuKTtcbiAgfVxufVxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9yb3V0ZXIvcm91dGVyX2xpbmtfdHJhbnNmb3JtLnRzXG4gKiovIiwiZXhwb3J0IHtcbiAgd3RmQ3JlYXRlU2NvcGUsXG4gIHd0ZkxlYXZlLFxuICB3dGZTdGFydFRpbWVSYW5nZSxcbiAgd3RmRW5kVGltZVJhbmdlLFxuICBXdGZTY29wZUZuXG59IGZyb20gJy4vc3JjL2NvcmUvcHJvZmlsZS9wcm9maWxlJztcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL2luc3RydW1lbnRhdGlvbi50c1xuICoqLyIsIi8qKlxuICogQG1vZHVsZVxuICogQGRlc2NyaXB0aW9uXG4gKiBBZGFwdGVyIGFsbG93aW5nIEFuZ3VsYXJKUyB2MSBhbmQgQW5ndWxhciB2MiB0byBydW4gc2lkZSBieSBzaWRlIGluIHRoZSBzYW1lIGFwcGxpY2F0aW9uLlxuICovXG5leHBvcnQge1VwZ3JhZGVBZGFwdGVyLCBVcGdyYWRlQWRhcHRlclJlZn0gZnJvbSAnLi9zcmMvdXBncmFkZS91cGdyYWRlX2FkYXB0ZXInO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvdXBncmFkZS50c1xuICoqLyIsImltcG9ydCB7XG4gIHByb3ZpZGUsXG4gIHBsYXRmb3JtLFxuICBBcHBsaWNhdGlvblJlZixcbiAgQXBwVmlld01hbmFnZXIsXG4gIENvbXBpbGVyLFxuICBJbmplY3RvcixcbiAgTmdab25lLFxuICBQbGF0Zm9ybVJlZixcbiAgUHJvdG9WaWV3UmVmLFxuICBQcm92aWRlcixcbiAgVHlwZSxcbiAgQVBQTElDQVRJT05fQ09NTU9OX1BST1ZJREVSU1xufSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbmltcG9ydCB7T2JzZXJ2YWJsZVdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvYXN5bmMnO1xuaW1wb3J0IHtCUk9XU0VSX1BST1ZJREVSUywgQlJPV1NFUl9BUFBfUFJPVklERVJTfSBmcm9tICdhbmd1bGFyMi9wbGF0Zm9ybS9icm93c2VyJztcblxuaW1wb3J0IHtnZXRDb21wb25lbnRJbmZvLCBDb21wb25lbnRJbmZvfSBmcm9tICcuL21ldGFkYXRhJztcbmltcG9ydCB7b25FcnJvciwgY29udHJvbGxlcktleX0gZnJvbSAnLi91dGlsJztcbmltcG9ydCB7XG4gIE5HMV9DT01QSUxFLFxuICBORzFfSU5KRUNUT1IsXG4gIE5HMV9QQVJTRSxcbiAgTkcxX1JPT1RfU0NPUEUsXG4gIE5HMV9TQ09QRSxcbiAgTkcyX0FQUF9WSUVXX01BTkFHRVIsXG4gIE5HMl9DT01QSUxFUixcbiAgTkcyX0lOSkVDVE9SLFxuICBORzJfUFJPVE9fVklFV19SRUZfTUFQLFxuICBORzJfWk9ORSxcbiAgUkVRVUlSRV9JTkpFQ1RPUlxufSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge0Rvd25ncmFkZU5nMkNvbXBvbmVudEFkYXB0ZXJ9IGZyb20gJy4vZG93bmdyYWRlX25nMl9hZGFwdGVyJztcbmltcG9ydCB7VXBncmFkZU5nMUNvbXBvbmVudEFkYXB0ZXJCdWlsZGVyfSBmcm9tICcuL3VwZ3JhZGVfbmcxX2FkYXB0ZXInO1xuaW1wb3J0ICogYXMgYW5ndWxhciBmcm9tICcuL2FuZ3VsYXJfanMnO1xuXG52YXIgdXBncmFkZUNvdW50OiBudW1iZXIgPSAwO1xuXG4vKipcbiAqIFVzZSBgVXBncmFkZUFkYXB0ZXJgIHRvIGFsbG93IEFuZ3VsYXJKUyB2MSBhbmQgQW5ndWxhciB2MiB0byBjb2V4aXN0IGluIGEgc2luZ2xlIGFwcGxpY2F0aW9uLlxuICpcbiAqIFRoZSBgVXBncmFkZUFkYXB0ZXJgIGFsbG93czpcbiAqIDEuIGNyZWF0aW9uIG9mIEFuZ3VsYXIgdjIgY29tcG9uZW50IGZyb20gQW5ndWxhckpTIHYxIGNvbXBvbmVudCBkaXJlY3RpdmVcbiAqICAgIChTZWUgW1VwZ3JhZGVBZGFwdGVyI3VwZ3JhZGVOZzFDb21wb25lbnQoKV0pXG4gKiAyLiBjcmVhdGlvbiBvZiBBbmd1bGFySlMgdjEgZGlyZWN0aXZlIGZyb20gQW5ndWxhciB2MiBjb21wb25lbnQuXG4gKiAgICAoU2VlIFtVcGdyYWRlQWRhcHRlciNkb3duZ3JhZGVOZzJDb21wb25lbnQoKV0pXG4gKiAzLiBCb290c3RyYXBwaW5nIG9mIGEgaHlicmlkIEFuZ3VsYXIgYXBwbGljYXRpb24gd2hpY2ggY29udGFpbnMgYm90aCBvZiB0aGUgZnJhbWV3b3Jrc1xuICogICAgY29leGlzdGluZyBpbiBhIHNpbmdsZSBhcHBsaWNhdGlvbi5cbiAqXG4gKiAjIyBNZW50YWwgTW9kZWxcbiAqXG4gKiBXaGVuIHJlYXNvbmluZyBhYm91dCBob3cgYSBoeWJyaWQgYXBwbGljYXRpb24gd29ya3MgaXQgaXMgdXNlZnVsIHRvIGhhdmUgYSBtZW50YWwgbW9kZWwgd2hpY2hcbiAqIGRlc2NyaWJlcyB3aGF0IGlzIGhhcHBlbmluZyBhbmQgZXhwbGFpbnMgd2hhdCBpcyBoYXBwZW5pbmcgYXQgdGhlIGxvd2VzdCBsZXZlbC5cbiAqXG4gKiAxLiBUaGVyZSBhcmUgdHdvIGluZGVwZW5kZW50IGZyYW1ld29ya3MgcnVubmluZyBpbiBhIHNpbmdsZSBhcHBsaWNhdGlvbiwgZWFjaCBmcmFtZXdvcmsgdHJlYXRzXG4gKiAgICB0aGUgb3RoZXIgYXMgYSBibGFjayBib3guXG4gKiAyLiBFYWNoIERPTSBlbGVtZW50IG9uIHRoZSBwYWdlIGlzIG93bmVkIGV4YWN0bHkgYnkgb25lIGZyYW1ld29yay4gV2hpY2hldmVyIGZyYW1ld29ya1xuICogICAgaW5zdGFudGlhdGVkIHRoZSBlbGVtZW50IGlzIHRoZSBvd25lci4gRWFjaCBmcmFtZXdvcmsgb25seSB1cGRhdGVzL2ludGVyYWN0cyB3aXRoIGl0cyBvd25cbiAqICAgIERPTSBlbGVtZW50cyBhbmQgaWdub3JlcyBvdGhlcnMuXG4gKiAzLiBBbmd1bGFySlMgdjEgZGlyZWN0aXZlcyBhbHdheXMgZXhlY3V0ZSBpbnNpZGUgQW5ndWxhckpTIHYxIGZyYW1ld29yayBjb2RlYmFzZSByZWdhcmRsZXNzIG9mXG4gKiAgICB3aGVyZSB0aGV5IGFyZSBpbnN0YW50aWF0ZWQuXG4gKiA0LiBBbmd1bGFyIHYyIGNvbXBvbmVudHMgYWx3YXlzIGV4ZWN1dGUgaW5zaWRlIEFuZ3VsYXIgdjIgZnJhbWV3b3JrIGNvZGViYXNlIHJlZ2FyZGxlc3Mgb2ZcbiAqICAgIHdoZXJlIHRoZXkgYXJlIGluc3RhbnRpYXRlZC5cbiAqIDUuIEFuIEFuZ3VsYXJKUyB2MSBjb21wb25lbnQgY2FuIGJlIHVwZ3JhZGVkIHRvIGFuIEFuZ3VsYXIgdjIgY29tcG9uZW50LiBUaGlzIGNyZWF0ZXMgYW5cbiAqICAgIEFuZ3VsYXIgdjIgZGlyZWN0aXZlLCB3aGljaCBib290c3RyYXBzIHRoZSBBbmd1bGFySlMgdjEgY29tcG9uZW50IGRpcmVjdGl2ZSBpbiB0aGF0IGxvY2F0aW9uLlxuICogNi4gQW4gQW5ndWxhciB2MiBjb21wb25lbnQgY2FuIGJlIGRvd25ncmFkZWQgdG8gYW4gQW5ndWxhckpTIHYxIGNvbXBvbmVudCBkaXJlY3RpdmUuIFRoaXMgY3JlYXRlc1xuICogICAgYW4gQW5ndWxhckpTIHYxIGRpcmVjdGl2ZSwgd2hpY2ggYm9vdHN0cmFwcyB0aGUgQW5ndWxhciB2MiBjb21wb25lbnQgaW4gdGhhdCBsb2NhdGlvbi5cbiAqIDcuIFdoZW5ldmVyIGFuIGFkYXB0ZXIgY29tcG9uZW50IGlzIGluc3RhbnRpYXRlZCB0aGUgaG9zdCBlbGVtZW50IGlzIG93bmVkIGJ5IHRoZSBmcmFtZXdvcmtcbiAqICAgIGRvaW5nIHRoZSBpbnN0YW50aWF0aW9uLiBUaGUgb3RoZXIgZnJhbWV3b3JrIHRoZW4gaW5zdGFudGlhdGVzIGFuZCBvd25zIHRoZSB2aWV3IGZvciB0aGF0XG4gKiAgICBjb21wb25lbnQuIFRoaXMgaW1wbGllcyB0aGF0IGNvbXBvbmVudCBiaW5kaW5ncyB3aWxsIGFsd2F5cyBmb2xsb3cgdGhlIHNlbWFudGljcyBvZiB0aGVcbiAqICAgIGluc3RhbnRpYXRpb24gZnJhbWV3b3JrLiBUaGUgc3ludGF4IGlzIGFsd2F5cyB0aGF0IG9mIEFuZ3VsYXIgdjIgc3ludGF4LlxuICogOC4gQW5ndWxhckpTIHYxIGlzIGFsd2F5cyBib290c3RyYXBwZWQgZmlyc3QgYW5kIG93bnMgdGhlIGJvdHRvbSBtb3N0IHZpZXcuXG4gKiA5LiBUaGUgbmV3IGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcgaW4gQW5ndWxhciB2MiB6b25lLCBhbmQgdGhlcmVmb3JlIGl0IG5vIGxvbmdlciBuZWVkcyBjYWxscyB0b1xuICogICAgYCRhcHBseSgpYC5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIGBgYFxuICogdmFyIGFkYXB0ZXIgPSBuZXcgVXBncmFkZUFkYXB0ZXIoKTtcbiAqIHZhciBtb2R1bGUgPSBhbmd1bGFyLm1vZHVsZSgnbXlFeGFtcGxlJywgW10pO1xuICogbW9kdWxlLmRpcmVjdGl2ZSgnbmcyJywgYWRhcHRlci5kb3duZ3JhZGVOZzJDb21wb25lbnQoTmcyKSk7XG4gKlxuICogbW9kdWxlLmRpcmVjdGl2ZSgnbmcxJywgZnVuY3Rpb24oKSB7XG4gKiAgIHJldHVybiB7XG4gKiAgICAgIHNjb3BlOiB7IHRpdGxlOiAnPScgfSxcbiAqICAgICAgdGVtcGxhdGU6ICduZzFbSGVsbG8ge3t0aXRsZX19IV0oPHNwYW4gbmctdHJhbnNjbHVkZT48L3NwYW4+KSdcbiAqICAgfTtcbiAqIH0pO1xuICpcbiAqXG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICduZzInLFxuICogICBpbnB1dHM6IFsnbmFtZSddLFxuICogICB0ZW1wbGF0ZTogJ25nMls8bmcxIFt0aXRsZV09XCJuYW1lXCI+dHJhbnNjbHVkZTwvbmcxPl0oPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PiknLFxuICogICBkaXJlY3RpdmVzOiBbYWRhcHRlci51cGdyYWRlTmcxQ29tcG9uZW50KCduZzEnKV1cbiAqIH0pXG4gKiBjbGFzcyBOZzIge1xuICogfVxuICpcbiAqIGRvY3VtZW50LmJvZHkuaW5uZXJIVE1MID0gJzxuZzIgbmFtZT1cIldvcmxkXCI+cHJvamVjdDwvbmcyPic7XG4gKlxuICogYWRhcHRlci5ib290c3RyYXAoZG9jdW1lbnQuYm9keSwgWydteUV4YW1wbGUnXSkucmVhZHkoZnVuY3Rpb24oKSB7XG4gKiAgIGV4cGVjdChkb2N1bWVudC5ib2R5LnRleHRDb250ZW50KS50b0VxdWFsKFxuICogICAgICAgXCJuZzJbbmcxW0hlbGxvIFdvcmxkIV0odHJhbnNjbHVkZSldKHByb2plY3QpXCIpO1xuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFVwZ3JhZGVBZGFwdGVyIHtcbiAgLyogQGludGVybmFsICovXG4gIHByaXZhdGUgaWRQcmVmaXg6IHN0cmluZyA9IGBORzJfVVBHUkFERV8ke3VwZ3JhZGVDb3VudCsrfV9gO1xuICAvKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSB1cGdyYWRlZENvbXBvbmVudHM6IFR5cGVbXSA9IFtdO1xuICAvKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSBkb3duZ3JhZGVkQ29tcG9uZW50czoge1tuYW1lOiBzdHJpbmddOiBVcGdyYWRlTmcxQ29tcG9uZW50QWRhcHRlckJ1aWxkZXJ9ID0ge307XG4gIC8qIEBpbnRlcm5hbCAqL1xuICBwcml2YXRlIHByb3ZpZGVyczogQXJyYXk8VHlwZSB8IFByb3ZpZGVyIHwgYW55W10+ID0gW107XG5cbiAgLyoqXG4gICAqIEFsbG93cyBBbmd1bGFyIHYyIENvbXBvbmVudCB0byBiZSB1c2VkIGZyb20gQW5ndWxhckpTIHYxLlxuICAgKlxuICAgKiBVc2UgYGRvd25ncmFkZU5nMkNvbXBvbmVudGAgdG8gY3JlYXRlIGFuIEFuZ3VsYXJKUyB2MSBEaXJlY3RpdmUgRGVmaW5pdGlvbiBGYWN0b3J5IGZyb21cbiAgICogQW5ndWxhciB2MiBDb21wb25lbnQuIFRoZSBhZGFwdGVyIHdpbGwgYm9vdHN0cmFwIEFuZ3VsYXIgdjIgY29tcG9uZW50IGZyb20gd2l0aGluIHRoZVxuICAgKiBBbmd1bGFySlMgdjEgdGVtcGxhdGUuXG4gICAqXG4gICAqICMjIE1lbnRhbCBNb2RlbFxuICAgKlxuICAgKiAxLiBUaGUgY29tcG9uZW50IGlzIGluc3RhbnRpYXRlZCBieSBiZWluZyBsaXN0ZWQgaW4gQW5ndWxhckpTIHYxIHRlbXBsYXRlLiBUaGlzIG1lYW5zIHRoYXQgdGhlXG4gICAqICAgIGhvc3QgZWxlbWVudCBpcyBjb250cm9sbGVkIGJ5IEFuZ3VsYXJKUyB2MSwgYnV0IHRoZSBjb21wb25lbnQncyB2aWV3IHdpbGwgYmUgY29udHJvbGxlZCBieVxuICAgKiAgICBBbmd1bGFyIHYyLlxuICAgKiAyLiBFdmVuIHRob3VnaHQgdGhlIGNvbXBvbmVudCBpcyBpbnN0YW50aWF0ZWQgaW4gQW5ndWxhckpTIHYxLCBpdCB3aWxsIGJlIHVzaW5nIEFuZ3VsYXIgdjJcbiAgICogICAgc3ludGF4LiBUaGlzIGhhcyB0byBiZSBkb25lLCB0aGlzIHdheSBiZWNhdXNlIHdlIG11c3QgZm9sbG93IEFuZ3VsYXIgdjIgY29tcG9uZW50cyBkbyBub3RcbiAgICogICAgZGVjbGFyZSBob3cgdGhlIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIGludGVycHJldGVkLlxuICAgKlxuICAgKiAjIyBTdXBwb3J0ZWQgRmVhdHVyZXNcbiAgICpcbiAgICogLSBCaW5kaW5nczpcbiAgICogICAtIEF0dHJpYnV0ZTogYDxjb21wIG5hbWU9XCJXb3JsZFwiPmBcbiAgICogICAtIEludGVycG9sYXRpb246ICBgPGNvbXAgZ3JlZXRpbmc9XCJIZWxsbyB7e25hbWV9fSFcIj5gXG4gICAqICAgLSBFeHByZXNzaW9uOiAgYDxjb21wIFtuYW1lXT1cInVzZXJuYW1lXCI+YFxuICAgKiAgIC0gRXZlbnQ6ICBgPGNvbXAgKGNsb3NlKT1cImRvU29tZXRoaW5nKClcIj5gXG4gICAqIC0gQ29udGVudCBwcm9qZWN0aW9uOiB5ZXNcbiAgICpcbiAgICogIyMjIEV4YW1wbGVcbiAgICpcbiAgICogYGBgXG4gICAqIHZhciBhZGFwdGVyID0gbmV3IFVwZ3JhZGVBZGFwdGVyKCk7XG4gICAqIHZhciBtb2R1bGUgPSBhbmd1bGFyLm1vZHVsZSgnbXlFeGFtcGxlJywgW10pO1xuICAgKiBtb2R1bGUuZGlyZWN0aXZlKCdncmVldCcsIGFkYXB0ZXIuZG93bmdyYWRlTmcyQ29tcG9uZW50KEdyZWV0ZXIpKTtcbiAgICpcbiAgICogQENvbXBvbmVudCh7XG4gICAqICAgc2VsZWN0b3I6ICdncmVldCcsXG4gICAqICAgdGVtcGxhdGU6ICd7e3NhbHV0YXRpb259fSB7e25hbWV9fSEgLSA8bmctY29udGVudD48L25nLWNvbnRlbnQ+J1xuICAgKiB9KVxuICAgKiBjbGFzcyBHcmVldGVyIHtcbiAgICogICBASW5wdXQoKSBzYWx1dGF0aW9uOiBzdHJpbmc7XG4gICAqICAgQElucHV0KCkgbmFtZTogc3RyaW5nO1xuICAgKiB9XG4gICAqXG4gICAqIGRvY3VtZW50LmJvZHkuaW5uZXJIVE1MID1cbiAgICogICAnbmcxIHRlbXBsYXRlOiA8Z3JlZXQgc2FsdXRhdGlvbj1cIkhlbGxvXCIgW25hbWVdPVwid29ybGRcIj50ZXh0PC9ncmVldD4nO1xuICAgKlxuICAgKiBhZGFwdGVyLmJvb3RzdHJhcChkb2N1bWVudC5ib2R5LCBbJ215RXhhbXBsZSddKS5yZWFkeShmdW5jdGlvbigpIHtcbiAgICogICBleHBlY3QoZG9jdW1lbnQuYm9keS50ZXh0Q29udGVudCkudG9FcXVhbChcIm5nMSB0ZW1wbGF0ZTogSGVsbG8gd29ybGQhIC0gdGV4dFwiKTtcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgZG93bmdyYWRlTmcyQ29tcG9uZW50KHR5cGU6IFR5cGUpOiBGdW5jdGlvbiB7XG4gICAgdGhpcy51cGdyYWRlZENvbXBvbmVudHMucHVzaCh0eXBlKTtcbiAgICB2YXIgaW5mbzogQ29tcG9uZW50SW5mbyA9IGdldENvbXBvbmVudEluZm8odHlwZSk7XG4gICAgcmV0dXJuIG5nMUNvbXBvbmVudERpcmVjdGl2ZShpbmZvLCBgJHt0aGlzLmlkUHJlZml4fSR7aW5mby5zZWxlY3Rvcn1fY2ApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93cyBBbmd1bGFySlMgdjEgQ29tcG9uZW50IHRvIGJlIHVzZWQgZnJvbSBBbmd1bGFyIHYyLlxuICAgKlxuICAgKiBVc2UgYHVwZ3JhZGVOZzFDb21wb25lbnRgIHRvIGNyZWF0ZSBhbiBBbmd1bGFyIHYyIGNvbXBvbmVudCBmcm9tIEFuZ3VsYXJKUyB2MSBDb21wb25lbnRcbiAgICogZGlyZWN0aXZlLiBUaGUgYWRhcHRlciB3aWxsIGJvb3RzdHJhcCBBbmd1bGFySlMgdjEgY29tcG9uZW50IGZyb20gd2l0aGluIHRoZSBBbmd1bGFyIHYyXG4gICAqIHRlbXBsYXRlLlxuICAgKlxuICAgKiAjIyBNZW50YWwgTW9kZWxcbiAgICpcbiAgICogMS4gVGhlIGNvbXBvbmVudCBpcyBpbnN0YW50aWF0ZWQgYnkgYmVpbmcgbGlzdGVkIGluIEFuZ3VsYXIgdjIgdGVtcGxhdGUuIFRoaXMgbWVhbnMgdGhhdCB0aGVcbiAgICogICAgaG9zdCBlbGVtZW50IGlzIGNvbnRyb2xsZWQgYnkgQW5ndWxhciB2MiwgYnV0IHRoZSBjb21wb25lbnQncyB2aWV3IHdpbGwgYmUgY29udHJvbGxlZCBieVxuICAgKiAgICBBbmd1bGFySlMgdjEuXG4gICAqXG4gICAqICMjIFN1cHBvcnRlZCBGZWF0dXJlc1xuICAgKlxuICAgKiAtIEJpbmRpbmdzOlxuICAgKiAgIC0gQXR0cmlidXRlOiBgPGNvbXAgbmFtZT1cIldvcmxkXCI+YFxuICAgKiAgIC0gSW50ZXJwb2xhdGlvbjogIGA8Y29tcCBncmVldGluZz1cIkhlbGxvIHt7bmFtZX19IVwiPmBcbiAgICogICAtIEV4cHJlc3Npb246ICBgPGNvbXAgW25hbWVdPVwidXNlcm5hbWVcIj5gXG4gICAqICAgLSBFdmVudDogIGA8Y29tcCAoY2xvc2UpPVwiZG9Tb21ldGhpbmcoKVwiPmBcbiAgICogLSBUcmFuc2NsdXNpb246IHllc1xuICAgKiAtIE9ubHkgc29tZSBvZiB0aGUgZmVhdHVyZXMgb2ZcbiAgICogICBbRGlyZWN0aXZlIERlZmluaXRpb24gT2JqZWN0XShodHRwczovL2RvY3MuYW5ndWxhcmpzLm9yZy9hcGkvbmcvc2VydmljZS8kY29tcGlsZSkgYXJlXG4gICAqICAgc3VwcG9ydGVkOlxuICAgKiAgIC0gYGNvbXBpbGVgOiBub3Qgc3VwcG9ydGVkIGJlY2F1c2UgdGhlIGhvc3QgZWxlbWVudCBpcyBvd25lZCBieSBBbmd1bGFyIHYyLCB3aGljaCBkb2VzXG4gICAqICAgICBub3QgYWxsb3cgbW9kaWZ5aW5nIERPTSBzdHJ1Y3R1cmUgZHVyaW5nIGNvbXBpbGF0aW9uLlxuICAgKiAgIC0gYGNvbnRyb2xsZXJgOiBzdXBwb3J0ZWQuIChOT1RFOiBpbmplY3Rpb24gb2YgYCRhdHRyc2AgYW5kIGAkdHJhbnNjbHVkZWAgaXMgbm90IHN1cHBvcnRlZC4pXG4gICAqICAgLSBgY29udHJvbGxlckFzJzogc3VwcG9ydGVkLlxuICAgKiAgIC0gYGJpbmRUb0NvbnRyb2xsZXInOiBzdXBwb3J0ZWQuXG4gICAqICAgLSBgbGluayc6IHN1cHBvcnRlZC4gKE5PVEU6IG9ubHkgcHJlLWxpbmsgZnVuY3Rpb24gaXMgc3VwcG9ydGVkLilcbiAgICogICAtIGBuYW1lJzogc3VwcG9ydGVkLlxuICAgKiAgIC0gYHByaW9yaXR5JzogaWdub3JlZC5cbiAgICogICAtIGByZXBsYWNlJzogbm90IHN1cHBvcnRlZC5cbiAgICogICAtIGByZXF1aXJlYDogc3VwcG9ydGVkLlxuICAgKiAgIC0gYHJlc3RyaWN0YDogbXVzdCBiZSBzZXQgdG8gJ0UnLlxuICAgKiAgIC0gYHNjb3BlYDogc3VwcG9ydGVkLlxuICAgKiAgIC0gYHRlbXBsYXRlYDogc3VwcG9ydGVkLlxuICAgKiAgIC0gYHRlbXBsYXRlVXJsYDogc3VwcG9ydGVkLlxuICAgKiAgIC0gYHRlcm1pbmFsYDogaWdub3JlZC5cbiAgICogICAtIGB0cmFuc2NsdWRlYDogc3VwcG9ydGVkLlxuICAgKlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZVxuICAgKlxuICAgKiBgYGBcbiAgICogdmFyIGFkYXB0ZXIgPSBuZXcgVXBncmFkZUFkYXB0ZXIoKTtcbiAgICogdmFyIG1vZHVsZSA9IGFuZ3VsYXIubW9kdWxlKCdteUV4YW1wbGUnLCBbXSk7XG4gICAqXG4gICAqIG1vZHVsZS5kaXJlY3RpdmUoJ2dyZWV0JywgZnVuY3Rpb24oKSB7XG4gICAqICAgcmV0dXJuIHtcbiAgICogICAgIHNjb3BlOiB7c2FsdXRhdGlvbjogJz0nLCBuYW1lOiAnPScgfSxcbiAgICogICAgIHRlbXBsYXRlOiAne3tzYWx1dGF0aW9ufX0ge3tuYW1lfX0hIC0gPHNwYW4gbmctdHJhbnNjbHVkZT48L3NwYW4+J1xuICAgKiAgIH07XG4gICAqIH0pO1xuICAgKlxuICAgKiBtb2R1bGUuZGlyZWN0aXZlKCduZzInLCBhZGFwdGVyLmRvd25ncmFkZU5nMkNvbXBvbmVudChOZzIpKTtcbiAgICpcbiAgICogQENvbXBvbmVudCh7XG4gICAqICAgc2VsZWN0b3I6ICduZzInLFxuICAgKiAgIHRlbXBsYXRlOiAnbmcyIHRlbXBsYXRlOiA8Z3JlZXQgc2FsdXRhdGlvbj1cIkhlbGxvXCIgW25hbWVdPVwid29ybGRcIj50ZXh0PC9ncmVldD4nXG4gICAqICAgZGlyZWN0aXZlczogW2FkYXB0ZXIudXBncmFkZU5nMUNvbXBvbmVudCgnZ3JlZXQnKV1cbiAgICogfSlcbiAgICogY2xhc3MgTmcyIHtcbiAgICogfVxuICAgKlxuICAgKiBkb2N1bWVudC5ib2R5LmlubmVySFRNTCA9ICc8bmcyPjwvbmcyPic7XG4gICAqXG4gICAqIGFkYXB0ZXIuYm9vdHN0cmFwKGRvY3VtZW50LmJvZHksIFsnbXlFeGFtcGxlJ10pLnJlYWR5KGZ1bmN0aW9uKCkge1xuICAgKiAgIGV4cGVjdChkb2N1bWVudC5ib2R5LnRleHRDb250ZW50KS50b0VxdWFsKFwibmcyIHRlbXBsYXRlOiBIZWxsbyB3b3JsZCEgLSB0ZXh0XCIpO1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICB1cGdyYWRlTmcxQ29tcG9uZW50KG5hbWU6IHN0cmluZyk6IFR5cGUge1xuICAgIGlmICgoPGFueT50aGlzLmRvd25ncmFkZWRDb21wb25lbnRzKS5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZG93bmdyYWRlZENvbXBvbmVudHNbbmFtZV0udHlwZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICh0aGlzLmRvd25ncmFkZWRDb21wb25lbnRzW25hbWVdID0gbmV3IFVwZ3JhZGVOZzFDb21wb25lbnRBZGFwdGVyQnVpbGRlcihuYW1lKSkudHlwZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQm9vdHN0cmFwIGEgaHlicmlkIEFuZ3VsYXJKUyB2MSAvIEFuZ3VsYXIgdjIgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIFRoaXMgYGJvb3RzdHJhcGAgbWV0aG9kIGlzIGEgZGlyZWN0IHJlcGxhY2VtZW50ICh0YWtlcyBzYW1lIGFyZ3VtZW50cykgZm9yIEFuZ3VsYXJKUyB2MVxuICAgKiBbYGJvb3RzdHJhcGBdKGh0dHBzOi8vZG9jcy5hbmd1bGFyanMub3JnL2FwaS9uZy9mdW5jdGlvbi9hbmd1bGFyLmJvb3RzdHJhcCkgbWV0aG9kLiBVbmxpa2VcbiAgICogQW5ndWxhckpTIHYxLCB0aGlzIGJvb3RzdHJhcCBpcyBhc3luY2hyb25vdXMuXG4gICAqXG4gICAqICMjIyBFeGFtcGxlXG4gICAqXG4gICAqIGBgYFxuICAgKiB2YXIgYWRhcHRlciA9IG5ldyBVcGdyYWRlQWRhcHRlcigpO1xuICAgKiB2YXIgbW9kdWxlID0gYW5ndWxhci5tb2R1bGUoJ215RXhhbXBsZScsIFtdKTtcbiAgICogbW9kdWxlLmRpcmVjdGl2ZSgnbmcyJywgYWRhcHRlci5kb3duZ3JhZGVOZzJDb21wb25lbnQoTmcyKSk7XG4gICAqXG4gICAqIG1vZHVsZS5kaXJlY3RpdmUoJ25nMScsIGZ1bmN0aW9uKCkge1xuICAgKiAgIHJldHVybiB7XG4gICAqICAgICAgc2NvcGU6IHsgdGl0bGU6ICc9JyB9LFxuICAgKiAgICAgIHRlbXBsYXRlOiAnbmcxW0hlbGxvIHt7dGl0bGV9fSFdKDxzcGFuIG5nLXRyYW5zY2x1ZGU+PC9zcGFuPiknXG4gICAqICAgfTtcbiAgICogfSk7XG4gICAqXG4gICAqXG4gICAqIEBDb21wb25lbnQoe1xuICAgKiAgIHNlbGVjdG9yOiAnbmcyJyxcbiAgICogICBpbnB1dHM6IFsnbmFtZSddLFxuICAgKiAgIHRlbXBsYXRlOiAnbmcyWzxuZzEgW3RpdGxlXT1cIm5hbWVcIj50cmFuc2NsdWRlPC9uZzE+XSg8bmctY29udGVudD48L25nLWNvbnRlbnQ+KScsXG4gICAqICAgZGlyZWN0aXZlczogW2FkYXB0ZXIudXBncmFkZU5nMUNvbXBvbmVudCgnbmcxJyldXG4gICAqIH0pXG4gICAqIGNsYXNzIE5nMiB7XG4gICAqIH1cbiAgICpcbiAgICogZG9jdW1lbnQuYm9keS5pbm5lckhUTUwgPSAnPG5nMiBuYW1lPVwiV29ybGRcIj5wcm9qZWN0PC9uZzI+JztcbiAgICpcbiAgICogYWRhcHRlci5ib290c3RyYXAoZG9jdW1lbnQuYm9keSwgWydteUV4YW1wbGUnXSkucmVhZHkoZnVuY3Rpb24oKSB7XG4gICAqICAgZXhwZWN0KGRvY3VtZW50LmJvZHkudGV4dENvbnRlbnQpLnRvRXF1YWwoXG4gICAqICAgICAgIFwibmcyW25nMVtIZWxsbyBXb3JsZCFdKHRyYW5zY2x1ZGUpXShwcm9qZWN0KVwiKTtcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYm9vdHN0cmFwKGVsZW1lbnQ6IEVsZW1lbnQsIG1vZHVsZXM/OiBhbnlbXSxcbiAgICAgICAgICAgIGNvbmZpZz86IGFuZ3VsYXIuSUFuZ3VsYXJCb290c3RyYXBDb25maWcpOiBVcGdyYWRlQWRhcHRlclJlZiB7XG4gICAgdmFyIHVwZ3JhZGUgPSBuZXcgVXBncmFkZUFkYXB0ZXJSZWYoKTtcbiAgICB2YXIgbmcxSW5qZWN0b3I6IGFuZ3VsYXIuSUluamVjdG9yU2VydmljZSA9IG51bGw7XG4gICAgdmFyIHBsYXRmb3JtUmVmOiBQbGF0Zm9ybVJlZiA9IHBsYXRmb3JtKEJST1dTRVJfUFJPVklERVJTKTtcbiAgICB2YXIgYXBwbGljYXRpb25SZWY6IEFwcGxpY2F0aW9uUmVmID0gcGxhdGZvcm1SZWYuYXBwbGljYXRpb24oW1xuICAgICAgQlJPV1NFUl9BUFBfUFJPVklERVJTLFxuICAgICAgcHJvdmlkZShORzFfSU5KRUNUT1IsIHt1c2VGYWN0b3J5OiAoKSA9PiBuZzFJbmplY3Rvcn0pLFxuICAgICAgcHJvdmlkZShORzFfQ09NUElMRSwge3VzZUZhY3Rvcnk6ICgpID0+IG5nMUluamVjdG9yLmdldChORzFfQ09NUElMRSl9KSxcbiAgICAgIHRoaXMucHJvdmlkZXJzXG4gICAgXSk7XG4gICAgdmFyIGluamVjdG9yOiBJbmplY3RvciA9IGFwcGxpY2F0aW9uUmVmLmluamVjdG9yO1xuICAgIHZhciBuZ1pvbmU6IE5nWm9uZSA9IGluamVjdG9yLmdldChOZ1pvbmUpO1xuICAgIHZhciBjb21waWxlcjogQ29tcGlsZXIgPSBpbmplY3Rvci5nZXQoQ29tcGlsZXIpO1xuICAgIHZhciBkZWxheUFwcGx5RXhwczogRnVuY3Rpb25bXSA9IFtdO1xuICAgIHZhciBvcmlnaW5hbCRhcHBseUZuOiBGdW5jdGlvbjtcbiAgICB2YXIgcm9vdFNjb3BlUHJvdG90eXBlOiBhbnk7XG4gICAgdmFyIHJvb3RTY29wZTogYW5ndWxhci5JUm9vdFNjb3BlU2VydmljZTtcbiAgICB2YXIgcHJvdG9WaWV3UmVmTWFwOiBQcm90b1ZpZXdSZWZNYXAgPSB7fTtcbiAgICB2YXIgbmcxTW9kdWxlID0gYW5ndWxhci5tb2R1bGUodGhpcy5pZFByZWZpeCwgbW9kdWxlcyk7XG4gICAgdmFyIG5nMWNvbXBpbGVQcm9taXNlOiBQcm9taXNlPGFueT4gPSBudWxsO1xuICAgIG5nMU1vZHVsZS52YWx1ZShORzJfSU5KRUNUT1IsIGluamVjdG9yKVxuICAgICAgICAudmFsdWUoTkcyX1pPTkUsIG5nWm9uZSlcbiAgICAgICAgLnZhbHVlKE5HMl9DT01QSUxFUiwgY29tcGlsZXIpXG4gICAgICAgIC52YWx1ZShORzJfUFJPVE9fVklFV19SRUZfTUFQLCBwcm90b1ZpZXdSZWZNYXApXG4gICAgICAgIC52YWx1ZShORzJfQVBQX1ZJRVdfTUFOQUdFUiwgaW5qZWN0b3IuZ2V0KEFwcFZpZXdNYW5hZ2VyKSlcbiAgICAgICAgLmNvbmZpZyhbXG4gICAgICAgICAgJyRwcm92aWRlJyxcbiAgICAgICAgICAocHJvdmlkZSkgPT4ge1xuICAgICAgICAgICAgcHJvdmlkZS5kZWNvcmF0b3IoTkcxX1JPT1RfU0NPUEUsIFtcbiAgICAgICAgICAgICAgJyRkZWxlZ2F0ZScsXG4gICAgICAgICAgICAgIGZ1bmN0aW9uKHJvb3RTY29wZURlbGVnYXRlOiBhbmd1bGFyLklSb290U2NvcGVTZXJ2aWNlKSB7XG4gICAgICAgICAgICAgICAgcm9vdFNjb3BlUHJvdG90eXBlID0gcm9vdFNjb3BlRGVsZWdhdGUuY29uc3RydWN0b3IucHJvdG90eXBlO1xuICAgICAgICAgICAgICAgIGlmIChyb290U2NvcGVQcm90b3R5cGUuaGFzT3duUHJvcGVydHkoJyRhcHBseScpKSB7XG4gICAgICAgICAgICAgICAgICBvcmlnaW5hbCRhcHBseUZuID0gcm9vdFNjb3BlUHJvdG90eXBlLiRhcHBseTtcbiAgICAgICAgICAgICAgICAgIHJvb3RTY29wZVByb3RvdHlwZS4kYXBwbHkgPSAoZXhwKSA9PiBkZWxheUFwcGx5RXhwcy5wdXNoKGV4cCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBmaW5kICckYXBwbHknIG9uICckcm9vdFNjb3BlJyFcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByb290U2NvcGUgPSByb290U2NvcGVEZWxlZ2F0ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgfVxuICAgICAgICBdKVxuICAgICAgICAucnVuKFtcbiAgICAgICAgICAnJGluamVjdG9yJyxcbiAgICAgICAgICAnJHJvb3RTY29wZScsXG4gICAgICAgICAgKGluamVjdG9yOiBhbmd1bGFyLklJbmplY3RvclNlcnZpY2UsIHJvb3RTY29wZTogYW5ndWxhci5JUm9vdFNjb3BlU2VydmljZSkgPT4ge1xuICAgICAgICAgICAgbmcxSW5qZWN0b3IgPSBpbmplY3RvcjtcbiAgICAgICAgICAgIE9ic2VydmFibGVXcmFwcGVyLnN1YnNjcmliZShuZ1pvbmUub25UdXJuRG9uZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXykgPT4geyBuZ1pvbmUucnVuKCgpID0+IHJvb3RTY29wZS4kYXBwbHkoKSk7IH0pO1xuICAgICAgICAgICAgbmcxY29tcGlsZVByb21pc2UgPVxuICAgICAgICAgICAgICAgIFVwZ3JhZGVOZzFDb21wb25lbnRBZGFwdGVyQnVpbGRlci5yZXNvbHZlKHRoaXMuZG93bmdyYWRlZENvbXBvbmVudHMsIGluamVjdG9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIF0pO1xuXG4gICAgYW5ndWxhci5lbGVtZW50KGVsZW1lbnQpLmRhdGEoY29udHJvbGxlcktleShORzJfSU5KRUNUT1IpLCBpbmplY3Rvcik7XG4gICAgbmdab25lLnJ1bigoKSA9PiB7IGFuZ3VsYXIuYm9vdHN0cmFwKGVsZW1lbnQsIFt0aGlzLmlkUHJlZml4XSwgY29uZmlnKTsgfSk7XG4gICAgUHJvbWlzZS5hbGwoW3RoaXMuY29tcGlsZU5nMkNvbXBvbmVudHMoY29tcGlsZXIsIHByb3RvVmlld1JlZk1hcCksIG5nMWNvbXBpbGVQcm9taXNlXSlcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIG5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHJvb3RTY29wZVByb3RvdHlwZSkge1xuICAgICAgICAgICAgICByb290U2NvcGVQcm90b3R5cGUuJGFwcGx5ID0gb3JpZ2luYWwkYXBwbHlGbjsgIC8vIHJlc3RvcmUgb3JpZ2luYWwgJGFwcGx5XG4gICAgICAgICAgICAgIHdoaWxlIChkZWxheUFwcGx5RXhwcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByb290U2NvcGUuJGFwcGx5KGRlbGF5QXBwbHlFeHBzLnNoaWZ0KCkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICg8YW55PnVwZ3JhZGUpLl9ib290c3RyYXBEb25lKGFwcGxpY2F0aW9uUmVmLCBuZzFJbmplY3Rvcik7XG4gICAgICAgICAgICAgIHJvb3RTY29wZVByb3RvdHlwZSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sIG9uRXJyb3IpO1xuICAgIHJldHVybiB1cGdyYWRlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBwcm92aWRlciB0byB0aGUgdG9wIGxldmVsIGVudmlyb25tZW50IG9mIGEgaHlicmlkIEFuZ3VsYXJKUyB2MSAvIEFuZ3VsYXIgdjIgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEluIGh5YnJpZCBBbmd1bGFySlMgdjEgLyBBbmd1bGFyIHYyIGFwcGxpY2F0aW9uLCB0aGVyZSBpcyBubyBvbmUgcm9vdCBBbmd1bGFyIHYyIGNvbXBvbmVudCxcbiAgICogZm9yIHRoaXMgcmVhc29uIHdlIHByb3ZpZGUgYW4gYXBwbGljYXRpb24gZ2xvYmFsIHdheSBvZiByZWdpc3RlcmluZyBwcm92aWRlcnMgd2hpY2ggaXNcbiAgICogY29uc2lzdGVudCB3aXRoIHNpbmdsZSBnbG9iYWwgaW5qZWN0aW9uIGluIEFuZ3VsYXJKUyB2MS5cbiAgICpcbiAgICogIyMjIEV4YW1wbGVcbiAgICpcbiAgICogYGBgXG4gICAqIGNsYXNzIEdyZWV0ZXIge1xuICAgKiAgIGdyZWV0KG5hbWUpIHtcbiAgICogICAgIGFsZXJ0KCdIZWxsbyAnICsgbmFtZSArICchJyk7XG4gICAqICAgfVxuICAgKiB9XG4gICAqXG4gICAqIEBDb21wb25lbnQoe1xuICAgKiAgIHNlbGVjdG9yOiAnYXBwJyxcbiAgICogICB0ZW1wbGF0ZTogJydcbiAgICogfSlcbiAgICogY2xhc3MgQXBwIHtcbiAgICogICBjb25zdHJ1Y3RvcihncmVldGVyOiBHcmVldGVyKSB7XG4gICAqICAgICB0aGlzLmdyZWV0ZXIoJ1dvcmxkJyk7XG4gICAqICAgfVxuICAgKiB9XG4gICAqXG4gICAqIHZhciBhZGFwdGVyID0gbmV3IFVwZ3JhZGVBZGFwdGVyKCk7XG4gICAqIGFkYXB0ZXIuYWRkUHJvdmlkZXIoR3JlZXRlcik7XG4gICAqXG4gICAqIHZhciBtb2R1bGUgPSBhbmd1bGFyLm1vZHVsZSgnbXlFeGFtcGxlJywgW10pO1xuICAgKiBtb2R1bGUuZGlyZWN0aXZlKCdhcHAnLCBhZGFwdGVyLmRvd25ncmFkZU5nMkNvbXBvbmVudChBcHApKTtcbiAgICpcbiAgICogZG9jdW1lbnQuYm9keS5pbm5lckhUTUwgPSAnPGFwcD48L2FwcD4nXG4gICAqIGFkYXB0ZXIuYm9vdHN0cmFwKGRvY3VtZW50LmJvZHksIFsnbXlFeGFtcGxlJ10pO1xuICAgKmBgYFxuICAgKi9cbiAgcHVibGljIGFkZFByb3ZpZGVyKHByb3ZpZGVyOiBUeXBlIHwgUHJvdmlkZXIgfCBhbnlbXSk6IHZvaWQgeyB0aGlzLnByb3ZpZGVycy5wdXNoKHByb3ZpZGVyKTsgfVxuXG4gIC8qKlxuICAgKiBBbGxvd3MgQW5ndWxhckpTIHYxIHNlcnZpY2UgdG8gYmUgYWNjZXNzaWJsZSBmcm9tIEFuZ3VsYXIgdjIuXG4gICAqXG4gICAqXG4gICAqICMjIyBFeGFtcGxlXG4gICAqXG4gICAqIGBgYFxuICAgKiBjbGFzcyBMb2dpbiB7IC4uLiB9XG4gICAqIGNsYXNzIFNlcnZlciB7IC4uLiB9XG4gICAqXG4gICAqIEBJbmplY3RhYmxlKClcbiAgICogY2xhc3MgRXhhbXBsZSB7XG4gICAqICAgY29uc3RydWN0b3IoQEluamVjdCgnc2VydmVyJykgc2VydmVyLCBsb2dpbjogTG9naW4pIHtcbiAgICogICAgIC4uLlxuICAgKiAgIH1cbiAgICogfVxuICAgKlxuICAgKiB2YXIgbW9kdWxlID0gYW5ndWxhci5tb2R1bGUoJ215RXhhbXBsZScsIFtdKTtcbiAgICogbW9kdWxlLnNlcnZpY2UoJ3NlcnZlcicsIFNlcnZlcik7XG4gICAqIG1vZHVsZS5zZXJ2aWNlKCdsb2dpbicsIExvZ2luKTtcbiAgICpcbiAgICogdmFyIGFkYXB0ZXIgPSBuZXcgVXBncmFkZUFkYXB0ZXIoKTtcbiAgICogYWRhcHRlci51cGdyYWRlTmcxUHJvdmlkZXIoJ3NlcnZlcicpO1xuICAgKiBhZGFwdGVyLnVwZ3JhZGVOZzFQcm92aWRlcignbG9naW4nLCB7YXNUb2tlbjogTG9naW59KTtcbiAgICogYWRhcHRlci5hZGRQcm92aWRlcihFeGFtcGxlKTtcbiAgICpcbiAgICogYWRhcHRlci5ib290c3RyYXAoZG9jdW1lbnQuYm9keSwgWydteUV4YW1wbGUnXSkucmVhZHkoKHJlZikgPT4ge1xuICAgKiAgIHZhciBleGFtcGxlOiBFeGFtcGxlID0gcmVmLm5nMkluamVjdG9yLmdldChFeGFtcGxlKTtcbiAgICogfSk7XG4gICAqXG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIHVwZ3JhZGVOZzFQcm92aWRlcihuYW1lOiBzdHJpbmcsIG9wdGlvbnM/OiB7YXNUb2tlbjogYW55fSkge1xuICAgIHZhciB0b2tlbiA9IG9wdGlvbnMgJiYgb3B0aW9ucy5hc1Rva2VuIHx8IG5hbWU7XG4gICAgdGhpcy5wcm92aWRlcnMucHVzaChwcm92aWRlKHRva2VuLCB7XG4gICAgICB1c2VGYWN0b3J5OiAobmcxSW5qZWN0b3I6IGFuZ3VsYXIuSUluamVjdG9yU2VydmljZSkgPT4gbmcxSW5qZWN0b3IuZ2V0KG5hbWUpLFxuICAgICAgZGVwczogW05HMV9JTkpFQ1RPUl1cbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3dzIEFuZ3VsYXIgdjIgc2VydmljZSB0byBiZSBhY2Nlc3NpYmxlIGZyb20gQW5ndWxhckpTIHYxLlxuICAgKlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZVxuICAgKlxuICAgKiBgYGBcbiAgICogY2xhc3MgRXhhbXBsZSB7XG4gICAqIH1cbiAgICpcbiAgICogdmFyIGFkYXB0ZXIgPSBuZXcgVXBncmFkZUFkYXB0ZXIoKTtcbiAgICogYWRhcHRlci5hZGRQcm92aWRlcihFeGFtcGxlKTtcbiAgICpcbiAgICogdmFyIG1vZHVsZSA9IGFuZ3VsYXIubW9kdWxlKCdteUV4YW1wbGUnLCBbXSk7XG4gICAqIG1vZHVsZS5mYWN0b3J5KCdleGFtcGxlJywgYWRhcHRlci5kb3duZ3JhZGVOZzJQcm92aWRlcihFeGFtcGxlKSk7XG4gICAqXG4gICAqIGFkYXB0ZXIuYm9vdHN0cmFwKGRvY3VtZW50LmJvZHksIFsnbXlFeGFtcGxlJ10pLnJlYWR5KChyZWYpID0+IHtcbiAgICogICB2YXIgZXhhbXBsZTogRXhhbXBsZSA9IHJlZi5uZzFJbmplY3Rvci5nZXQoJ2V4YW1wbGUnKTtcbiAgICogfSk7XG4gICAqXG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGRvd25ncmFkZU5nMlByb3ZpZGVyKHRva2VuOiBhbnkpOiBGdW5jdGlvbiB7XG4gICAgdmFyIGZhY3RvcnkgPSBmdW5jdGlvbihpbmplY3RvcjogSW5qZWN0b3IpIHsgcmV0dXJuIGluamVjdG9yLmdldCh0b2tlbik7IH07XG4gICAgKDxhbnk+ZmFjdG9yeSkuJGluamVjdCA9IFtORzJfSU5KRUNUT1JdO1xuICAgIHJldHVybiBmYWN0b3J5O1xuICB9XG5cbiAgLyogQGludGVybmFsICovXG4gIHByaXZhdGUgY29tcGlsZU5nMkNvbXBvbmVudHMoY29tcGlsZXI6IENvbXBpbGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvVmlld1JlZk1hcDogUHJvdG9WaWV3UmVmTWFwKTogUHJvbWlzZTxQcm90b1ZpZXdSZWZNYXA+IHtcbiAgICB2YXIgcHJvbWlzZXM6IEFycmF5PFByb21pc2U8UHJvdG9WaWV3UmVmPj4gPSBbXTtcbiAgICB2YXIgdHlwZXMgPSB0aGlzLnVwZ3JhZGVkQ29tcG9uZW50cztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBwcm9taXNlcy5wdXNoKGNvbXBpbGVyLmNvbXBpbGVJbkhvc3QodHlwZXNbaV0pKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKChwcm90b1ZpZXdzOiBBcnJheTxQcm90b1ZpZXdSZWY+KSA9PiB7XG4gICAgICB2YXIgdHlwZXMgPSB0aGlzLnVwZ3JhZGVkQ29tcG9uZW50cztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvdG9WaWV3cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBwcm90b1ZpZXdSZWZNYXBbZ2V0Q29tcG9uZW50SW5mbyh0eXBlc1tpXSkuc2VsZWN0b3JdID0gcHJvdG9WaWV3c1tpXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm90b1ZpZXdSZWZNYXA7XG4gICAgfSwgb25FcnJvcik7XG4gIH1cbn1cblxuaW50ZXJmYWNlIFByb3RvVmlld1JlZk1hcCB7XG4gIFtzZWxlY3Rvcjogc3RyaW5nXTogUHJvdG9WaWV3UmVmO1xufVxuXG5mdW5jdGlvbiBuZzFDb21wb25lbnREaXJlY3RpdmUoaW5mbzogQ29tcG9uZW50SW5mbywgaWRQcmVmaXg6IHN0cmluZyk6IEZ1bmN0aW9uIHtcbiAgKDxhbnk+ZGlyZWN0aXZlRmFjdG9yeSkuJGluamVjdCA9IFtORzJfUFJPVE9fVklFV19SRUZfTUFQLCBORzJfQVBQX1ZJRVdfTUFOQUdFUiwgTkcxX1BBUlNFXTtcbiAgZnVuY3Rpb24gZGlyZWN0aXZlRmFjdG9yeShwcm90b1ZpZXdSZWZNYXA6IFByb3RvVmlld1JlZk1hcCwgdmlld01hbmFnZXI6IEFwcFZpZXdNYW5hZ2VyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlOiBhbmd1bGFyLklQYXJzZVNlcnZpY2UpOiBhbmd1bGFyLklEaXJlY3RpdmUge1xuICAgIHZhciBwcm90b1ZpZXc6IFByb3RvVmlld1JlZiA9IHByb3RvVmlld1JlZk1hcFtpbmZvLnNlbGVjdG9yXTtcbiAgICBpZiAoIXByb3RvVmlldykgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RpbmcgUHJvdG9WaWV3UmVmIGZvcjogJyArIGluZm8uc2VsZWN0b3IpO1xuICAgIHZhciBpZENvdW50ID0gMDtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzdHJpY3Q6ICdFJyxcbiAgICAgIHJlcXVpcmU6IFJFUVVJUkVfSU5KRUNUT1IsXG4gICAgICBsaW5rOiB7XG4gICAgICAgIHBvc3Q6IChzY29wZTogYW5ndWxhci5JU2NvcGUsIGVsZW1lbnQ6IGFuZ3VsYXIuSUF1Z21lbnRlZEpRdWVyeSwgYXR0cnM6IGFuZ3VsYXIuSUF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICBwYXJlbnRJbmplY3RvcjogYW55LCB0cmFuc2NsdWRlOiBhbmd1bGFyLklUcmFuc2NsdWRlRnVuY3Rpb24pOiB2b2lkID0+IHtcbiAgICAgICAgICB2YXIgZG9tRWxlbWVudCA9IDxhbnk+ZWxlbWVudFswXTtcbiAgICAgICAgICB2YXIgZmFjYWRlID0gbmV3IERvd25ncmFkZU5nMkNvbXBvbmVudEFkYXB0ZXIoaWRQcmVmaXggKyAoaWRDb3VudCsrKSwgaW5mbywgZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMsIHNjb3BlLCA8SW5qZWN0b3I+cGFyZW50SW5qZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlLCB2aWV3TWFuYWdlciwgcHJvdG9WaWV3KTtcbiAgICAgICAgICBmYWNhZGUuc2V0dXBJbnB1dHMoKTtcbiAgICAgICAgICBmYWNhZGUuYm9vdHN0cmFwTmcyKCk7XG4gICAgICAgICAgZmFjYWRlLnByb2plY3RDb250ZW50KCk7XG4gICAgICAgICAgZmFjYWRlLnNldHVwT3V0cHV0cygpO1xuICAgICAgICAgIGZhY2FkZS5yZWdpc3RlckNsZWFudXAoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIGRpcmVjdGl2ZUZhY3Rvcnk7XG59XG5cbi8qKlxuICogVXNlIGBVZ3JhZGVBZGFwdGVyUmVmYCB0byBjb250cm9sIGEgaHlicmlkIEFuZ3VsYXJKUyB2MSAvIEFuZ3VsYXIgdjIgYXBwbGljYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBVcGdyYWRlQWRhcHRlclJlZiB7XG4gIC8qIEBpbnRlcm5hbCAqL1xuICBwcml2YXRlIF9yZWFkeUZuOiAodXBncmFkZUFkYXB0ZXJSZWY/OiBVcGdyYWRlQWRhcHRlclJlZikgPT4gdm9pZCA9IG51bGw7XG5cbiAgcHVibGljIG5nMVJvb3RTY29wZTogYW5ndWxhci5JUm9vdFNjb3BlU2VydmljZSA9IG51bGw7XG4gIHB1YmxpYyBuZzFJbmplY3RvcjogYW5ndWxhci5JSW5qZWN0b3JTZXJ2aWNlID0gbnVsbDtcbiAgcHVibGljIG5nMkFwcGxpY2F0aW9uUmVmOiBBcHBsaWNhdGlvblJlZiA9IG51bGw7XG4gIHB1YmxpYyBuZzJJbmplY3RvcjogSW5qZWN0b3IgPSBudWxsO1xuXG4gIC8qIEBpbnRlcm5hbCAqL1xuICBwcml2YXRlIF9ib290c3RyYXBEb25lKGFwcGxpY2F0aW9uUmVmOiBBcHBsaWNhdGlvblJlZiwgbmcxSW5qZWN0b3I6IGFuZ3VsYXIuSUluamVjdG9yU2VydmljZSkge1xuICAgIHRoaXMubmcyQXBwbGljYXRpb25SZWYgPSBhcHBsaWNhdGlvblJlZjtcbiAgICB0aGlzLm5nMkluamVjdG9yID0gYXBwbGljYXRpb25SZWYuaW5qZWN0b3I7XG4gICAgdGhpcy5uZzFJbmplY3RvciA9IG5nMUluamVjdG9yO1xuICAgIHRoaXMubmcxUm9vdFNjb3BlID0gbmcxSW5qZWN0b3IuZ2V0KE5HMV9ST09UX1NDT1BFKTtcbiAgICB0aGlzLl9yZWFkeUZuICYmIHRoaXMuX3JlYWR5Rm4odGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBjYWxsYmFjayBmdW5jdGlvbiB3aGljaCBpcyBub3RpZmllZCB1cG9uIHN1Y2Nlc3NmdWwgaHlicmlkIEFuZ3VsYXJKUyB2MSAvIEFuZ3VsYXIgdjJcbiAgICogYXBwbGljYXRpb24gaGFzIGJlZW4gYm9vdHN0cmFwcGVkLlxuICAgKlxuICAgKiBUaGUgYHJlYWR5YCBjYWxsYmFjayBmdW5jdGlvbiBpcyBpbnZva2VkIGluc2lkZSB0aGUgQW5ndWxhciB2MiB6b25lLCB0aGVyZWZvcmUgaXQgZG9lcyBub3RcbiAgICogcmVxdWlyZSBhIGNhbGwgdG8gYCRhcHBseSgpYC5cbiAgICovXG4gIHB1YmxpYyByZWFkeShmbjogKHVwZ3JhZGVBZGFwdGVyUmVmPzogVXBncmFkZUFkYXB0ZXJSZWYpID0+IHZvaWQpIHsgdGhpcy5fcmVhZHlGbiA9IGZuOyB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2Ugb2YgcnVubmluZyBoeWJyaWQgQW5ndWxhckpTIHYxIC8gQW5ndWxhciB2MiBhcHBsaWNhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBkaXNwb3NlKCkge1xuICAgIHRoaXMubmcxSW5qZWN0b3IuZ2V0KE5HMV9ST09UX1NDT1BFKS4kZGVzdHJveSgpO1xuICAgIHRoaXMubmcyQXBwbGljYXRpb25SZWYuZGlzcG9zZSgpO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvdXBncmFkZS91cGdyYWRlX2FkYXB0ZXIudHNcbiAqKi8iLCJpbXBvcnQge1R5cGUsIERpcmVjdGl2ZVJlc29sdmVyLCBEaXJlY3RpdmVNZXRhZGF0YX0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5pbXBvcnQge3N0cmluZ2lmeX0gZnJvbSAnLi91dGlsJztcblxudmFyIENPTVBPTkVOVF9TRUxFQ1RPUiA9IC9eW1xcd3wtXSokLztcbnZhciBTS0VXRVJfQ0FTRSA9IC8tKFxcdykvZztcbnZhciBkaXJlY3RpdmVSZXNvbHZlciA9IG5ldyBEaXJlY3RpdmVSZXNvbHZlcigpO1xuXG5leHBvcnQgaW50ZXJmYWNlIEF0dHJQcm9wIHtcbiAgcHJvcDogc3RyaW5nO1xuICBhdHRyOiBzdHJpbmc7XG4gIGJyYWNrZXRBdHRyOiBzdHJpbmc7XG4gIGJyYWNrZXRQYXJlbkF0dHI6IHN0cmluZztcbiAgcGFyZW5BdHRyOiBzdHJpbmc7XG4gIG9uQXR0cjogc3RyaW5nO1xuICBiaW5kQXR0cjogc3RyaW5nO1xuICBiaW5kb25BdHRyOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50SW5mbyB7XG4gIHR5cGU6IFR5cGU7XG4gIHNlbGVjdG9yOiBzdHJpbmc7XG4gIGlucHV0czogQXR0clByb3BbXTtcbiAgb3V0cHV0czogQXR0clByb3BbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbXBvbmVudEluZm8odHlwZTogVHlwZSk6IENvbXBvbmVudEluZm8ge1xuICB2YXIgcmVzb2x2ZWRNZXRhZGF0YTogRGlyZWN0aXZlTWV0YWRhdGEgPSBkaXJlY3RpdmVSZXNvbHZlci5yZXNvbHZlKHR5cGUpO1xuICB2YXIgc2VsZWN0b3IgPSByZXNvbHZlZE1ldGFkYXRhLnNlbGVjdG9yO1xuICBpZiAoIXNlbGVjdG9yLm1hdGNoKENPTVBPTkVOVF9TRUxFQ1RPUikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ09ubHkgc2VsZWN0b3JzIG1hdGNoaW5nIGVsZW1lbnQgbmFtZXMgYXJlIHN1cHBvcnRlZCwgZ290OiAnICsgc2VsZWN0b3IpO1xuICB9XG4gIHZhciBzZWxlY3RvciA9IHNlbGVjdG9yLnJlcGxhY2UoU0tFV0VSX0NBU0UsIChhbGwsIGxldHRlcjogc3RyaW5nKSA9PiBsZXR0ZXIudG9VcHBlckNhc2UoKSk7XG4gIHJldHVybiB7XG4gICAgdHlwZTogdHlwZSxcbiAgICBzZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgaW5wdXRzOiBwYXJzZUZpZWxkcyhyZXNvbHZlZE1ldGFkYXRhLmlucHV0cyksXG4gICAgb3V0cHV0czogcGFyc2VGaWVsZHMocmVzb2x2ZWRNZXRhZGF0YS5vdXRwdXRzKVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VGaWVsZHMobmFtZXM6IHN0cmluZ1tdKTogQXR0clByb3BbXSB7XG4gIHZhciBhdHRyUHJvcHM6IEF0dHJQcm9wW10gPSBbXTtcbiAgaWYgKG5hbWVzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBhcnRzID0gbmFtZXNbaV0uc3BsaXQoJzonKTtcbiAgICAgIHZhciBwcm9wID0gcGFydHNbMF0udHJpbSgpO1xuICAgICAgdmFyIGF0dHIgPSAocGFydHNbMV0gfHwgcGFydHNbMF0pLnRyaW0oKTtcbiAgICAgIHZhciBjYXBpdGFsQXR0ciA9IGF0dHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBhdHRyLnN1YnN0cigxKTtcbiAgICAgIGF0dHJQcm9wcy5wdXNoKDxBdHRyUHJvcD57XG4gICAgICAgIHByb3A6IHByb3AsXG4gICAgICAgIGF0dHI6IGF0dHIsXG4gICAgICAgIGJyYWNrZXRBdHRyOiBgWyR7YXR0cn1dYCxcbiAgICAgICAgcGFyZW5BdHRyOiBgKCR7YXR0cn0pYCxcbiAgICAgICAgYnJhY2tldFBhcmVuQXR0cjogYFsoJHthdHRyfSldYCxcbiAgICAgICAgb25BdHRyOiBgb24ke2NhcGl0YWxBdHRyfWAsXG4gICAgICAgIGJpbmRBdHRyOiBgYmluZCR7Y2FwaXRhbEF0dHJ9YCxcbiAgICAgICAgYmluZG9uQXR0cjogYGJpbmRvbiR7Y2FwaXRhbEF0dHJ9YFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBhdHRyUHJvcHM7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvdXBncmFkZS9tZXRhZGF0YS50c1xuICoqLyIsIlxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ2lmeShvYmo6IGFueSk6IHN0cmluZyB7XG4gIGlmICh0eXBlb2Ygb2JqID09ICdmdW5jdGlvbicpIHJldHVybiBvYmoubmFtZSB8fCBvYmoudG9TdHJpbmcoKTtcbiAgcmV0dXJuICcnICsgb2JqO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBvbkVycm9yKGU6IGFueSkge1xuICAvLyBUT0RPOiAobWlza28pOiBXZSBzZWVtIHRvIG5vdCBoYXZlIGEgc3RhY2sgdHJhY2UgaGVyZSFcbiAgY29uc29sZS5sb2coZSwgZS5zdGFjayk7XG4gIHRocm93IGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb250cm9sbGVyS2V5KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiAnJCcgKyBuYW1lICsgJ0NvbnRyb2xsZXInO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3VwZ3JhZGUvdXRpbC50c1xuICoqLyIsImV4cG9ydCBjb25zdCBORzJfQVBQX1ZJRVdfTUFOQUdFUiA9ICduZzIuQXBwVmlld01hbmFnZXInO1xuZXhwb3J0IGNvbnN0IE5HMl9DT01QSUxFUiA9ICduZzIuQ29tcGlsZXInO1xuZXhwb3J0IGNvbnN0IE5HMl9JTkpFQ1RPUiA9ICduZzIuSW5qZWN0b3InO1xuZXhwb3J0IGNvbnN0IE5HMl9QUk9UT19WSUVXX1JFRl9NQVAgPSAnbmcyLlByb3RvVmlld1JlZk1hcCc7XG5leHBvcnQgY29uc3QgTkcyX1pPTkUgPSAnbmcyLk5nWm9uZSc7XG5cbmV4cG9ydCBjb25zdCBORzFfQ09OVFJPTExFUiA9ICckY29udHJvbGxlcic7XG5leHBvcnQgY29uc3QgTkcxX1NDT1BFID0gJyRzY29wZSc7XG5leHBvcnQgY29uc3QgTkcxX1JPT1RfU0NPUEUgPSAnJHJvb3RTY29wZSc7XG5leHBvcnQgY29uc3QgTkcxX0NPTVBJTEUgPSAnJGNvbXBpbGUnO1xuZXhwb3J0IGNvbnN0IE5HMV9IVFRQX0JBQ0tFTkQgPSAnJGh0dHBCYWNrZW5kJztcbmV4cG9ydCBjb25zdCBORzFfSU5KRUNUT1IgPSAnJGluamVjdG9yJztcbmV4cG9ydCBjb25zdCBORzFfUEFSU0UgPSAnJHBhcnNlJztcbmV4cG9ydCBjb25zdCBORzFfVEVNUExBVEVfQ0FDSEUgPSAnJHRlbXBsYXRlQ2FjaGUnO1xuZXhwb3J0IGNvbnN0IFJFUVVJUkVfSU5KRUNUT1IgPSAnXicgKyBORzJfSU5KRUNUT1I7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvdXBncmFkZS9jb25zdGFudHMudHNcbiAqKi8iLCJpbXBvcnQge1xuICBwcm92aWRlLFxuICBBcHBWaWV3TWFuYWdlcixcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIEhvc3RWaWV3UmVmLFxuICBJbmplY3RvcixcbiAgT25DaGFuZ2VzLFxuICBQcm90b1ZpZXdSZWYsXG4gIFNpbXBsZUNoYW5nZVxufSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbmltcG9ydCB7TkcxX1NDT1BFfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge0NvbXBvbmVudEluZm99IGZyb20gJy4vbWV0YWRhdGEnO1xuaW1wb3J0IEVsZW1lbnQgPSBwcm90cmFjdG9yLkVsZW1lbnQ7XG5pbXBvcnQgKiBhcyBhbmd1bGFyIGZyb20gJy4vYW5ndWxhcl9qcyc7XG5cbmNvbnN0IElOSVRJQUxfVkFMVUUgPSB7XG4gIF9fVU5JTklUSUFMSVpFRF9fOiB0cnVlXG59O1xuXG5leHBvcnQgY2xhc3MgRG93bmdyYWRlTmcyQ29tcG9uZW50QWRhcHRlciB7XG4gIGNvbXBvbmVudDogYW55ID0gbnVsbDtcbiAgaW5wdXRDaGFuZ2VDb3VudDogbnVtYmVyID0gMDtcbiAgaW5wdXRDaGFuZ2VzOiB7W2tleTogc3RyaW5nXTogU2ltcGxlQ2hhbmdlfSA9IG51bGw7XG4gIGhvc3RWaWV3UmVmOiBIb3N0Vmlld1JlZiA9IG51bGw7XG4gIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZiA9IG51bGw7XG4gIGNvbXBvbmVudFNjb3BlOiBhbmd1bGFyLklTY29wZTtcbiAgY2hpbGROb2RlczogTm9kZVtdO1xuICBjb250ZW50SW5zZXJjdGlvblBvaW50OiBOb2RlID0gbnVsbDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGlkOiBzdHJpbmcsIHByaXZhdGUgaW5mbzogQ29tcG9uZW50SW5mbyxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBlbGVtZW50OiBhbmd1bGFyLklBdWdtZW50ZWRKUXVlcnksIHByaXZhdGUgYXR0cnM6IGFuZ3VsYXIuSUF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgIHByaXZhdGUgc2NvcGU6IGFuZ3VsYXIuSVNjb3BlLCBwcml2YXRlIHBhcmVudEluamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBwYXJzZTogYW5ndWxhci5JUGFyc2VTZXJ2aWNlLCBwcml2YXRlIHZpZXdNYW5hZ2VyOiBBcHBWaWV3TWFuYWdlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBwcm90b1ZpZXc6IFByb3RvVmlld1JlZikge1xuICAgICg8YW55PnRoaXMuZWxlbWVudFswXSkuaWQgPSBpZDtcbiAgICB0aGlzLmNvbXBvbmVudFNjb3BlID0gc2NvcGUuJG5ldygpO1xuICAgIHRoaXMuY2hpbGROb2RlcyA9IDxOb2RlW10+PGFueT5lbGVtZW50LmNvbnRlbnRzKCk7XG4gIH1cblxuICBib290c3RyYXBOZzIoKSB7XG4gICAgdmFyIGNoaWxkSW5qZWN0b3IgPSB0aGlzLnBhcmVudEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGVDaGlsZChcbiAgICAgICAgW3Byb3ZpZGUoTkcxX1NDT1BFLCB7dXNlVmFsdWU6IHRoaXMuY29tcG9uZW50U2NvcGV9KV0pO1xuICAgIHRoaXMuaG9zdFZpZXdSZWYgPVxuICAgICAgICB0aGlzLnZpZXdNYW5hZ2VyLmNyZWF0ZVJvb3RIb3N0Vmlldyh0aGlzLnByb3RvVmlldywgJyMnICsgdGhpcy5pZCwgY2hpbGRJbmplY3Rvcik7XG4gICAgdmFyIHJlbmRlcmVyOiBhbnkgPSAoPGFueT50aGlzLmhvc3RWaWV3UmVmKS5yZW5kZXI7XG4gICAgdmFyIGhvc3RFbGVtZW50ID0gdGhpcy52aWV3TWFuYWdlci5nZXRIb3N0RWxlbWVudCh0aGlzLmhvc3RWaWV3UmVmKTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yID0gdGhpcy5ob3N0Vmlld1JlZi5jaGFuZ2VEZXRlY3RvclJlZjtcbiAgICB0aGlzLmNvbXBvbmVudCA9IHRoaXMudmlld01hbmFnZXIuZ2V0Q29tcG9uZW50KGhvc3RFbGVtZW50KTtcbiAgICB0aGlzLmNvbnRlbnRJbnNlcmN0aW9uUG9pbnQgPSByZW5kZXJlci5yb290Q29udGVudEluc2VydGlvblBvaW50c1swXTtcbiAgfVxuXG4gIHNldHVwSW5wdXRzKCk6IHZvaWQge1xuICAgIHZhciBhdHRycyA9IHRoaXMuYXR0cnM7XG4gICAgdmFyIGlucHV0cyA9IHRoaXMuaW5mby5pbnB1dHM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnB1dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpbnB1dCA9IGlucHV0c1tpXTtcbiAgICAgIHZhciBleHByID0gbnVsbDtcbiAgICAgIGlmIChhdHRycy5oYXNPd25Qcm9wZXJ0eShpbnB1dC5hdHRyKSkge1xuICAgICAgICB2YXIgb2JzZXJ2ZUZuID0gKChwcm9wKSA9PiB7XG4gICAgICAgICAgdmFyIHByZXZWYWx1ZSA9IElOSVRJQUxfVkFMVUU7XG4gICAgICAgICAgcmV0dXJuICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuaW5wdXRDaGFuZ2VzICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHRoaXMuaW5wdXRDaGFuZ2VDb3VudCsrO1xuICAgICAgICAgICAgICB0aGlzLmlucHV0Q2hhbmdlc1twcm9wXSA9XG4gICAgICAgICAgICAgICAgICBuZXcgTmcxQ2hhbmdlKHZhbHVlLCBwcmV2VmFsdWUgPT09IElOSVRJQUxfVkFMVUUgPyB2YWx1ZSA6IHByZXZWYWx1ZSk7XG4gICAgICAgICAgICAgIHByZXZWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRbcHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgICB9O1xuICAgICAgICB9KShpbnB1dC5wcm9wKTtcbiAgICAgICAgYXR0cnMuJG9ic2VydmUoaW5wdXQuYXR0ciwgb2JzZXJ2ZUZuKTtcbiAgICAgIH0gZWxzZSBpZiAoYXR0cnMuaGFzT3duUHJvcGVydHkoaW5wdXQuYmluZEF0dHIpKSB7XG4gICAgICAgIGV4cHIgPSBhdHRyc1tpbnB1dC5iaW5kQXR0cl07XG4gICAgICB9IGVsc2UgaWYgKGF0dHJzLmhhc093blByb3BlcnR5KGlucHV0LmJyYWNrZXRBdHRyKSkge1xuICAgICAgICBleHByID0gYXR0cnNbaW5wdXQuYnJhY2tldEF0dHJdO1xuICAgICAgfSBlbHNlIGlmIChhdHRycy5oYXNPd25Qcm9wZXJ0eShpbnB1dC5iaW5kb25BdHRyKSkge1xuICAgICAgICBleHByID0gYXR0cnNbaW5wdXQuYmluZG9uQXR0cl07XG4gICAgICB9IGVsc2UgaWYgKGF0dHJzLmhhc093blByb3BlcnR5KGlucHV0LmJyYWNrZXRQYXJlbkF0dHIpKSB7XG4gICAgICAgIGV4cHIgPSBhdHRyc1tpbnB1dC5icmFja2V0UGFyZW5BdHRyXTtcbiAgICAgIH1cbiAgICAgIGlmIChleHByICE9IG51bGwpIHtcbiAgICAgICAgdmFyIHdhdGNoRm4gPSAoKHByb3ApID0+ICh2YWx1ZSwgcHJldlZhbHVlKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaW5wdXRDaGFuZ2VzICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRDaGFuZ2VDb3VudCsrO1xuICAgICAgICAgICAgdGhpcy5pbnB1dENoYW5nZXNbcHJvcF0gPSBuZXcgTmcxQ2hhbmdlKHByZXZWYWx1ZSwgdmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmNvbXBvbmVudFtwcm9wXSA9IHZhbHVlO1xuICAgICAgICB9KShpbnB1dC5wcm9wKTtcbiAgICAgICAgdGhpcy5jb21wb25lbnRTY29wZS4kd2F0Y2goZXhwciwgd2F0Y2hGbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHByb3RvdHlwZSA9IHRoaXMuaW5mby50eXBlLnByb3RvdHlwZTtcbiAgICBpZiAocHJvdG90eXBlICYmICg8T25DaGFuZ2VzPnByb3RvdHlwZSkubmdPbkNoYW5nZXMpIHtcbiAgICAgIC8vIERldGVjdDogT25DaGFuZ2VzIGludGVyZmFjZVxuICAgICAgdGhpcy5pbnB1dENoYW5nZXMgPSB7fTtcbiAgICAgIHRoaXMuY29tcG9uZW50U2NvcGUuJHdhdGNoKCgpID0+IHRoaXMuaW5wdXRDaGFuZ2VDb3VudCwgKCkgPT4ge1xuICAgICAgICB2YXIgaW5wdXRDaGFuZ2VzID0gdGhpcy5pbnB1dENoYW5nZXM7XG4gICAgICAgIHRoaXMuaW5wdXRDaGFuZ2VzID0ge307XG4gICAgICAgICg8T25DaGFuZ2VzPnRoaXMuY29tcG9uZW50KS5uZ09uQ2hhbmdlcyhpbnB1dENoYW5nZXMpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuY29tcG9uZW50U2NvcGUuJHdhdGNoKCgpID0+IHRoaXMuY2hhbmdlRGV0ZWN0b3IgJiYgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCkpO1xuICB9XG5cbiAgcHJvamVjdENvbnRlbnQoKSB7XG4gICAgdmFyIGNoaWxkTm9kZXMgPSB0aGlzLmNoaWxkTm9kZXM7XG4gICAgaWYgKHRoaXMuY29udGVudEluc2VyY3Rpb25Qb2ludCkge1xuICAgICAgdmFyIHBhcmVudCA9IHRoaXMuY29udGVudEluc2VyY3Rpb25Qb2ludC5wYXJlbnROb2RlO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gY2hpbGROb2Rlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGROb2Rlc1tpXSwgdGhpcy5jb250ZW50SW5zZXJjdGlvblBvaW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzZXR1cE91dHB1dHMoKSB7XG4gICAgdmFyIGF0dHJzID0gdGhpcy5hdHRycztcbiAgICB2YXIgb3V0cHV0cyA9IHRoaXMuaW5mby5vdXRwdXRzO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgb3V0cHV0cy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIG91dHB1dCA9IG91dHB1dHNbal07XG4gICAgICB2YXIgZXhwciA9IG51bGw7XG4gICAgICB2YXIgYXNzaWduRXhwciA9IGZhbHNlO1xuXG4gICAgICB2YXIgYmluZG9uQXR0ciA9XG4gICAgICAgICAgb3V0cHV0LmJpbmRvbkF0dHIgPyBvdXRwdXQuYmluZG9uQXR0ci5zdWJzdHJpbmcoMCwgb3V0cHV0LmJpbmRvbkF0dHIubGVuZ3RoIC0gNikgOiBudWxsO1xuICAgICAgdmFyIGJyYWNrZXRQYXJlbkF0dHIgPVxuICAgICAgICAgIG91dHB1dC5icmFja2V0UGFyZW5BdHRyID9cbiAgICAgICAgICAgICAgYFsoJHtvdXRwdXQuYnJhY2tldFBhcmVuQXR0ci5zdWJzdHJpbmcoMiwgb3V0cHV0LmJyYWNrZXRQYXJlbkF0dHIubGVuZ3RoIC0gOCl9KV1gIDpcbiAgICAgICAgICAgICAgbnVsbDtcblxuICAgICAgaWYgKGF0dHJzLmhhc093blByb3BlcnR5KG91dHB1dC5vbkF0dHIpKSB7XG4gICAgICAgIGV4cHIgPSBhdHRyc1tvdXRwdXQub25BdHRyXTtcbiAgICAgIH0gZWxzZSBpZiAoYXR0cnMuaGFzT3duUHJvcGVydHkob3V0cHV0LnBhcmVuQXR0cikpIHtcbiAgICAgICAgZXhwciA9IGF0dHJzW291dHB1dC5wYXJlbkF0dHJdO1xuICAgICAgfSBlbHNlIGlmIChhdHRycy5oYXNPd25Qcm9wZXJ0eShiaW5kb25BdHRyKSkge1xuICAgICAgICBleHByID0gYXR0cnNbYmluZG9uQXR0cl07XG4gICAgICAgIGFzc2lnbkV4cHIgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChhdHRycy5oYXNPd25Qcm9wZXJ0eShicmFja2V0UGFyZW5BdHRyKSkge1xuICAgICAgICBleHByID0gYXR0cnNbYnJhY2tldFBhcmVuQXR0cl07XG4gICAgICAgIGFzc2lnbkV4cHIgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXhwciAhPSBudWxsICYmIGFzc2lnbkV4cHIgIT0gbnVsbCkge1xuICAgICAgICB2YXIgZ2V0dGVyID0gdGhpcy5wYXJzZShleHByKTtcbiAgICAgICAgdmFyIHNldHRlciA9IGdldHRlci5hc3NpZ247XG4gICAgICAgIGlmIChhc3NpZ25FeHByICYmICFzZXR0ZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cHJlc3Npb24gJyR7ZXhwcn0nIGlzIG5vdCBhc3NpZ25hYmxlIWApO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlbWl0dGVyID0gdGhpcy5jb21wb25lbnRbb3V0cHV0LnByb3BdO1xuICAgICAgICBpZiAoZW1pdHRlcikge1xuICAgICAgICAgIGVtaXR0ZXIuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIG5leHQ6IGFzc2lnbkV4cHIgPyAoKHNldHRlcikgPT4gKHZhbHVlKSA9PiBzZXR0ZXIodGhpcy5zY29wZSwgdmFsdWUpKShzZXR0ZXIpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGdldHRlcikgPT4gKHZhbHVlKSA9PiBnZXR0ZXIodGhpcy5zY29wZSwgeyRldmVudDogdmFsdWV9KSkoZ2V0dGVyKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBlbWl0dGVyICcke291dHB1dC5wcm9wfScgb24gY29tcG9uZW50ICcke3RoaXMuaW5mby5zZWxlY3Rvcn0nIWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJDbGVhbnVwKCkge1xuICAgIHRoaXMuZWxlbWVudC5iaW5kKCckcmVtb3ZlJywgKCkgPT4gdGhpcy52aWV3TWFuYWdlci5kZXN0cm95Um9vdEhvc3RWaWV3KHRoaXMuaG9zdFZpZXdSZWYpKTtcbiAgfVxufVxuXG5jbGFzcyBOZzFDaGFuZ2UgaW1wbGVtZW50cyBTaW1wbGVDaGFuZ2Uge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcHJldmlvdXNWYWx1ZTogYW55LCBwdWJsaWMgY3VycmVudFZhbHVlOiBhbnkpIHt9XG5cbiAgaXNGaXJzdENoYW5nZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMucHJldmlvdXNWYWx1ZSA9PT0gdGhpcy5jdXJyZW50VmFsdWU7IH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy91cGdyYWRlL2Rvd25ncmFkZV9uZzJfYWRhcHRlci50c1xuICoqLyIsImltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgRG9DaGVjayxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIE9uQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlLFxuICBUeXBlXG59IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuaW1wb3J0IHtcbiAgTkcxX0NPTVBJTEUsXG4gIE5HMV9TQ09QRSxcbiAgTkcxX0hUVFBfQkFDS0VORCxcbiAgTkcxX1RFTVBMQVRFX0NBQ0hFLFxuICBORzFfQ09OVFJPTExFUlxufSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge2NvbnRyb2xsZXJLZXl9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgKiBhcyBhbmd1bGFyIGZyb20gJy4vYW5ndWxhcl9qcyc7XG5cbmNvbnN0IENBTUVMX0NBU0UgPSAvKFtBLVpdKS9nO1xuY29uc3QgSU5JVElBTF9WQUxVRSA9IHtcbiAgX19VTklOSVRJQUxJWkVEX186IHRydWVcbn07XG5jb25zdCBOT1RfU1VQUE9SVEVEOiBhbnkgPSAnTk9UX1NVUFBPUlRFRCc7XG5cblxuZXhwb3J0IGNsYXNzIFVwZ3JhZGVOZzFDb21wb25lbnRBZGFwdGVyQnVpbGRlciB7XG4gIHR5cGU6IFR5cGU7XG4gIGlucHV0czogc3RyaW5nW10gPSBbXTtcbiAgaW5wdXRzUmVuYW1lOiBzdHJpbmdbXSA9IFtdO1xuICBvdXRwdXRzOiBzdHJpbmdbXSA9IFtdO1xuICBvdXRwdXRzUmVuYW1lOiBzdHJpbmdbXSA9IFtdO1xuICBwcm9wZXJ0eU91dHB1dHM6IHN0cmluZ1tdID0gW107XG4gIGNoZWNrUHJvcGVydGllczogc3RyaW5nW10gPSBbXTtcbiAgcHJvcGVydHlNYXA6IHtbbmFtZTogc3RyaW5nXTogc3RyaW5nfSA9IHt9O1xuICBsaW5rRm46IGFuZ3VsYXIuSUxpbmtGbiA9IG51bGw7XG4gIGRpcmVjdGl2ZTogYW5ndWxhci5JRGlyZWN0aXZlID0gbnVsbDtcbiAgJGNvbnRyb2xsZXI6IGFuZ3VsYXIuSUNvbnRyb2xsZXJTZXJ2aWNlID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgdmFyIHNlbGVjdG9yID0gbmFtZS5yZXBsYWNlKENBTUVMX0NBU0UsIChhbGwsIG5leHQ6IHN0cmluZykgPT4gJy0nICsgbmV4dC50b0xvd2VyQ2FzZSgpKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy50eXBlID1cbiAgICAgICAgRGlyZWN0aXZlKHtzZWxlY3Rvcjogc2VsZWN0b3IsIGlucHV0czogdGhpcy5pbnB1dHNSZW5hbWUsIG91dHB1dHM6IHRoaXMub3V0cHV0c1JlbmFtZX0pXG4gICAgICAgICAgICAuQ2xhc3Moe1xuICAgICAgICAgICAgICBjb25zdHJ1Y3RvcjogW1xuICAgICAgICAgICAgICAgIG5ldyBJbmplY3QoTkcxX1NDT1BFKSxcbiAgICAgICAgICAgICAgICBFbGVtZW50UmVmLFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHNjb3BlOiBhbmd1bGFyLklTY29wZSwgZWxlbWVudFJlZjogRWxlbWVudFJlZikge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVcGdyYWRlTmcxQ29tcG9uZW50QWRhcHRlcihcbiAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxpbmtGbiwgc2NvcGUsIHNlbGYuZGlyZWN0aXZlLCBlbGVtZW50UmVmLCBzZWxmLiRjb250cm9sbGVyLCBzZWxmLmlucHV0cyxcbiAgICAgICAgICAgICAgICAgICAgICBzZWxmLm91dHB1dHMsIHNlbGYucHJvcGVydHlPdXRwdXRzLCBzZWxmLmNoZWNrUHJvcGVydGllcywgc2VsZi5wcm9wZXJ0eU1hcCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICBuZ09uQ2hhbmdlczogZnVuY3Rpb24oKSB7IC8qIG5lZWRzIHRvIGJlIGhlcmUgZm9yIG5nMiB0byBwcm9wZXJseSBkZXRlY3QgaXQgKi8gfSxcbiAgICAgICAgICAgICAgbmdEb0NoZWNrOiBmdW5jdGlvbigpIHsgLyogbmVlZHMgdG8gYmUgaGVyZSBmb3IgbmcyIHRvIHByb3Blcmx5IGRldGVjdCBpdCAqLyB9XG4gICAgICAgICAgICB9KTtcbiAgfVxuXG4gIGV4dHJhY3REaXJlY3RpdmUoaW5qZWN0b3I6IGFuZ3VsYXIuSUluamVjdG9yU2VydmljZSk6IGFuZ3VsYXIuSURpcmVjdGl2ZSB7XG4gICAgdmFyIGRpcmVjdGl2ZXM6IGFuZ3VsYXIuSURpcmVjdGl2ZVtdID0gaW5qZWN0b3IuZ2V0KHRoaXMubmFtZSArICdEaXJlY3RpdmUnKTtcbiAgICBpZiAoZGlyZWN0aXZlcy5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ09ubHkgc3VwcG9ydCBzaW5nbGUgZGlyZWN0aXZlIGRlZmluaXRpb24gZm9yOiAnICsgdGhpcy5uYW1lKTtcbiAgICB9XG4gICAgdmFyIGRpcmVjdGl2ZSA9IGRpcmVjdGl2ZXNbMF07XG4gICAgaWYgKGRpcmVjdGl2ZS5yZXBsYWNlKSB0aGlzLm5vdFN1cHBvcnRlZCgncmVwbGFjZScpO1xuICAgIGlmIChkaXJlY3RpdmUudGVybWluYWwpIHRoaXMubm90U3VwcG9ydGVkKCd0ZXJtaW5hbCcpO1xuICAgIHZhciBsaW5rID0gZGlyZWN0aXZlLmxpbms7XG4gICAgaWYgKHR5cGVvZiBsaW5rID09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoKDxhbmd1bGFyLklEaXJlY3RpdmVQcmVQb3N0PmxpbmspLnBvc3QpIHRoaXMubm90U3VwcG9ydGVkKCdsaW5rLnBvc3QnKTtcbiAgICB9XG4gICAgcmV0dXJuIGRpcmVjdGl2ZTtcbiAgfVxuXG4gIHByaXZhdGUgbm90U3VwcG9ydGVkKGZlYXR1cmU6IHN0cmluZykge1xuICAgIHRocm93IG5ldyBFcnJvcihgVXBncmFkZWQgZGlyZWN0aXZlICcke3RoaXMubmFtZX0nIGRvZXMgbm90IHN1cHBvcnQgJyR7ZmVhdHVyZX0nLmApO1xuICB9XG5cbiAgZXh0cmFjdEJpbmRpbmdzKCkge1xuICAgIHZhciBzY29wZSA9IHRoaXMuZGlyZWN0aXZlLnNjb3BlO1xuICAgIGlmICh0eXBlb2Ygc2NvcGUgPT0gJ29iamVjdCcpIHtcbiAgICAgIGZvciAodmFyIG5hbWUgaW4gc2NvcGUpIHtcbiAgICAgICAgaWYgKCg8YW55PnNjb3BlKS5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICAgIHZhciBsb2NhbE5hbWUgPSBzY29wZVtuYW1lXTtcbiAgICAgICAgICB2YXIgdHlwZSA9IGxvY2FsTmFtZS5jaGFyQXQoMCk7XG4gICAgICAgICAgbG9jYWxOYW1lID0gbG9jYWxOYW1lLnN1YnN0cigxKSB8fCBuYW1lO1xuICAgICAgICAgIHZhciBvdXRwdXROYW1lID0gJ291dHB1dF8nICsgbmFtZTtcbiAgICAgICAgICB2YXIgb3V0cHV0TmFtZVJlbmFtZSA9IG91dHB1dE5hbWUgKyAnOiAnICsgbmFtZTtcbiAgICAgICAgICB2YXIgb3V0cHV0TmFtZVJlbmFtZUNoYW5nZSA9IG91dHB1dE5hbWUgKyAnOiAnICsgbmFtZSArICdDaGFuZ2UnO1xuICAgICAgICAgIHZhciBpbnB1dE5hbWUgPSAnaW5wdXRfJyArIG5hbWU7XG4gICAgICAgICAgdmFyIGlucHV0TmFtZVJlbmFtZSA9IGlucHV0TmFtZSArICc6ICcgKyBuYW1lO1xuICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnPSc6XG4gICAgICAgICAgICAgIHRoaXMucHJvcGVydHlPdXRwdXRzLnB1c2gob3V0cHV0TmFtZSk7XG4gICAgICAgICAgICAgIHRoaXMuY2hlY2tQcm9wZXJ0aWVzLnB1c2gobG9jYWxOYW1lKTtcbiAgICAgICAgICAgICAgdGhpcy5vdXRwdXRzLnB1c2gob3V0cHV0TmFtZSk7XG4gICAgICAgICAgICAgIHRoaXMub3V0cHV0c1JlbmFtZS5wdXNoKG91dHB1dE5hbWVSZW5hbWVDaGFuZ2UpO1xuICAgICAgICAgICAgICB0aGlzLnByb3BlcnR5TWFwW291dHB1dE5hbWVdID0gbG9jYWxOYW1lO1xuICAgICAgICAgICAgLy8gZG9uJ3QgYnJlYWs7IGxldCBpdCBmYWxsIHRocm91Z2ggdG8gJ0AnXG4gICAgICAgICAgICBjYXNlICdAJzpcbiAgICAgICAgICAgICAgdGhpcy5pbnB1dHMucHVzaChpbnB1dE5hbWUpO1xuICAgICAgICAgICAgICB0aGlzLmlucHV0c1JlbmFtZS5wdXNoKGlucHV0TmFtZVJlbmFtZSk7XG4gICAgICAgICAgICAgIHRoaXMucHJvcGVydHlNYXBbaW5wdXROYW1lXSA9IGxvY2FsTmFtZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcmJzpcbiAgICAgICAgICAgICAgdGhpcy5vdXRwdXRzLnB1c2gob3V0cHV0TmFtZSk7XG4gICAgICAgICAgICAgIHRoaXMub3V0cHV0c1JlbmFtZS5wdXNoKG91dHB1dE5hbWVSZW5hbWUpO1xuICAgICAgICAgICAgICB0aGlzLnByb3BlcnR5TWFwW291dHB1dE5hbWVdID0gbG9jYWxOYW1lO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHZhciBqc29uID0gSlNPTi5zdHJpbmdpZnkoc2NvcGUpO1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICBgVW5leHBlY3RlZCBtYXBwaW5nICcke3R5cGV9JyBpbiAnJHtqc29ufScgaW4gJyR7dGhpcy5uYW1lfScgZGlyZWN0aXZlLmApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbXBpbGVUZW1wbGF0ZShjb21waWxlOiBhbmd1bGFyLklDb21waWxlU2VydmljZSwgdGVtcGxhdGVDYWNoZTogYW5ndWxhci5JVGVtcGxhdGVDYWNoZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICBodHRwQmFja2VuZDogYW5ndWxhci5JSHR0cEJhY2tlbmRTZXJ2aWNlKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAodGhpcy5kaXJlY3RpdmUudGVtcGxhdGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5saW5rRm4gPSBjb21waWxlSHRtbCh0aGlzLmRpcmVjdGl2ZS50ZW1wbGF0ZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmRpcmVjdGl2ZS50ZW1wbGF0ZVVybCkge1xuICAgICAgdmFyIHVybCA9IHRoaXMuZGlyZWN0aXZlLnRlbXBsYXRlVXJsO1xuICAgICAgdmFyIGh0bWwgPSB0ZW1wbGF0ZUNhY2hlLmdldCh1cmwpO1xuICAgICAgaWYgKGh0bWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxpbmtGbiA9IGNvbXBpbGVIdG1sKGh0bWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCBlcnIpID0+IHtcbiAgICAgICAgICBodHRwQmFja2VuZCgnR0VUJywgdXJsLCBudWxsLCAoc3RhdHVzLCByZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSAyMDApIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLmxpbmtGbiA9IGNvbXBpbGVIdG1sKHRlbXBsYXRlQ2FjaGUucHV0KHVybCwgcmVzcG9uc2UpKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBlcnIoYEdFVCAke3VybH0gcmV0dXJuZWQgJHtzdGF0dXN9OiAke3Jlc3BvbnNlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBEaXJlY3RpdmUgJyR7dGhpcy5uYW1lfScgaXMgbm90IGEgY29tcG9uZW50LCBpdCBpcyBtaXNzaW5nIHRlbXBsYXRlLmApO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgICBmdW5jdGlvbiBjb21waWxlSHRtbChodG1sKTogYW5ndWxhci5JTGlua0ZuIHtcbiAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGRpdi5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgcmV0dXJuIGNvbXBpbGUoZGl2LmNoaWxkTm9kZXMpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyByZXNvbHZlKGV4cG9ydGVkQ29tcG9uZW50czoge1tuYW1lOiBzdHJpbmddOiBVcGdyYWRlTmcxQ29tcG9uZW50QWRhcHRlckJ1aWxkZXJ9LFxuICAgICAgICAgICAgICAgICBpbmplY3RvcjogYW5ndWxhci5JSW5qZWN0b3JTZXJ2aWNlKTogUHJvbWlzZTxhbnk+IHtcbiAgICB2YXIgcHJvbWlzZXMgPSBbXTtcbiAgICB2YXIgY29tcGlsZTogYW5ndWxhci5JQ29tcGlsZVNlcnZpY2UgPSBpbmplY3Rvci5nZXQoTkcxX0NPTVBJTEUpO1xuICAgIHZhciB0ZW1wbGF0ZUNhY2hlOiBhbmd1bGFyLklUZW1wbGF0ZUNhY2hlU2VydmljZSA9IGluamVjdG9yLmdldChORzFfVEVNUExBVEVfQ0FDSEUpO1xuICAgIHZhciBodHRwQmFja2VuZDogYW5ndWxhci5JSHR0cEJhY2tlbmRTZXJ2aWNlID0gaW5qZWN0b3IuZ2V0KE5HMV9IVFRQX0JBQ0tFTkQpO1xuICAgIHZhciAkY29udHJvbGxlcjogYW5ndWxhci5JQ29udHJvbGxlclNlcnZpY2UgPSBpbmplY3Rvci5nZXQoTkcxX0NPTlRST0xMRVIpO1xuICAgIGZvciAodmFyIG5hbWUgaW4gZXhwb3J0ZWRDb21wb25lbnRzKSB7XG4gICAgICBpZiAoKDxhbnk+ZXhwb3J0ZWRDb21wb25lbnRzKS5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICB2YXIgZXhwb3J0ZWRDb21wb25lbnQgPSBleHBvcnRlZENvbXBvbmVudHNbbmFtZV07XG4gICAgICAgIGV4cG9ydGVkQ29tcG9uZW50LmRpcmVjdGl2ZSA9IGV4cG9ydGVkQ29tcG9uZW50LmV4dHJhY3REaXJlY3RpdmUoaW5qZWN0b3IpO1xuICAgICAgICBleHBvcnRlZENvbXBvbmVudC4kY29udHJvbGxlciA9ICRjb250cm9sbGVyO1xuICAgICAgICBleHBvcnRlZENvbXBvbmVudC5leHRyYWN0QmluZGluZ3MoKTtcbiAgICAgICAgdmFyIHByb21pc2UgPSBleHBvcnRlZENvbXBvbmVudC5jb21waWxlVGVtcGxhdGUoY29tcGlsZSwgdGVtcGxhdGVDYWNoZSwgaHR0cEJhY2tlbmQpO1xuICAgICAgICBpZiAocHJvbWlzZSkgcHJvbWlzZXMucHVzaChwcm9taXNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgfVxufVxuXG5jbGFzcyBVcGdyYWRlTmcxQ29tcG9uZW50QWRhcHRlciBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgRG9DaGVjayB7XG4gIGRlc3RpbmF0aW9uT2JqOiBhbnkgPSBudWxsO1xuICBjaGVja0xhc3RWYWx1ZXM6IGFueVtdID0gW107XG5cbiAgY29uc3RydWN0b3IobGlua0ZuOiBhbmd1bGFyLklMaW5rRm4sIHNjb3BlOiBhbmd1bGFyLklTY29wZSwgcHJpdmF0ZSBkaXJlY3RpdmU6IGFuZ3VsYXIuSURpcmVjdGl2ZSxcbiAgICAgICAgICAgICAgZWxlbWVudFJlZjogRWxlbWVudFJlZiwgJGNvbnRyb2xsZXI6IGFuZ3VsYXIuSUNvbnRyb2xsZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIGlucHV0czogc3RyaW5nW10sIHByaXZhdGUgb3V0cHV0czogc3RyaW5nW10sIHByaXZhdGUgcHJvcE91dHM6IHN0cmluZ1tdLFxuICAgICAgICAgICAgICBwcml2YXRlIGNoZWNrUHJvcGVydGllczogc3RyaW5nW10sIHByaXZhdGUgcHJvcGVydHlNYXA6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9KSB7XG4gICAgdmFyIGVsZW1lbnQ6IEVsZW1lbnQgPSBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgdmFyIGNoaWxkTm9kZXM6IE5vZGVbXSA9IFtdO1xuICAgIHZhciBjaGlsZE5vZGU7XG4gICAgd2hpbGUgKGNoaWxkTm9kZSA9IGVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgZWxlbWVudC5yZW1vdmVDaGlsZChjaGlsZE5vZGUpO1xuICAgICAgY2hpbGROb2Rlcy5wdXNoKGNoaWxkTm9kZSk7XG4gICAgfVxuICAgIHZhciBjb21wb25lbnRTY29wZSA9IHNjb3BlLiRuZXcoISFkaXJlY3RpdmUuc2NvcGUpO1xuICAgIHZhciAkZWxlbWVudCA9IGFuZ3VsYXIuZWxlbWVudChlbGVtZW50KTtcbiAgICB2YXIgY29udHJvbGxlclR5cGUgPSBkaXJlY3RpdmUuY29udHJvbGxlcjtcbiAgICB2YXIgY29udHJvbGxlcjogYW55ID0gbnVsbDtcbiAgICBpZiAoY29udHJvbGxlclR5cGUpIHtcbiAgICAgIHZhciBsb2NhbHMgPSB7JHNjb3BlOiBjb21wb25lbnRTY29wZSwgJGVsZW1lbnQ6ICRlbGVtZW50fTtcbiAgICAgIGNvbnRyb2xsZXIgPSAkY29udHJvbGxlcihjb250cm9sbGVyVHlwZSwgbG9jYWxzLCBudWxsLCBkaXJlY3RpdmUuY29udHJvbGxlckFzKTtcbiAgICAgICRlbGVtZW50LmRhdGEoY29udHJvbGxlcktleShkaXJlY3RpdmUubmFtZSksIGNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICB2YXIgbGluayA9IGRpcmVjdGl2ZS5saW5rO1xuICAgIGlmICh0eXBlb2YgbGluayA9PSAnb2JqZWN0JykgbGluayA9ICg8YW5ndWxhci5JRGlyZWN0aXZlUHJlUG9zdD5saW5rKS5wcmU7XG4gICAgaWYgKGxpbmspIHtcbiAgICAgIHZhciBhdHRyczogYW5ndWxhci5JQXR0cmlidXRlcyA9IE5PVF9TVVBQT1JURUQ7XG4gICAgICB2YXIgdHJhbnNjbHVkZUZuOiBhbmd1bGFyLklUcmFuc2NsdWRlRnVuY3Rpb24gPSBOT1RfU1VQUE9SVEVEO1xuICAgICAgdmFyIGxpbmtDb250cm9sbGVyID0gdGhpcy5yZXNvbHZlUmVxdWlyZWQoJGVsZW1lbnQsIGRpcmVjdGl2ZS5yZXF1aXJlKTtcbiAgICAgICg8YW5ndWxhci5JRGlyZWN0aXZlTGlua0ZuPmRpcmVjdGl2ZS5saW5rKShjb21wb25lbnRTY29wZSwgJGVsZW1lbnQsIGF0dHJzLCBsaW5rQ29udHJvbGxlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2NsdWRlRm4pO1xuICAgIH1cbiAgICB0aGlzLmRlc3RpbmF0aW9uT2JqID0gZGlyZWN0aXZlLmJpbmRUb0NvbnRyb2xsZXIgJiYgY29udHJvbGxlciA/IGNvbnRyb2xsZXIgOiBjb21wb25lbnRTY29wZTtcblxuICAgIGxpbmtGbihjb21wb25lbnRTY29wZSwgKGNsb25lZEVsZW1lbnQ6IE5vZGVbXSwgc2NvcGU6IGFuZ3VsYXIuSVNjb3BlKSA9PiB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBjbG9uZWRFbGVtZW50Lmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChjbG9uZWRFbGVtZW50W2ldKTtcbiAgICAgIH1cbiAgICB9LCB7cGFyZW50Qm91bmRUcmFuc2NsdWRlRm46IChzY29wZSwgY2xvbmVBdHRhY2gpID0+IHsgY2xvbmVBdHRhY2goY2hpbGROb2Rlcyk7IH19KTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5wdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzW2lucHV0c1tpXV0gPSBudWxsO1xuICAgIH1cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG91dHB1dHMubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBlbWl0dGVyID0gdGhpc1tvdXRwdXRzW2pdXSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgIHRoaXMuc2V0Q29tcG9uZW50UHJvcGVydHkob3V0cHV0c1tqXSwgKChlbWl0dGVyKSA9PiAodmFsdWUpID0+IGVtaXR0ZXIuZW1pdCh2YWx1ZSkpKGVtaXR0ZXIpKTtcbiAgICB9XG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCBwcm9wT3V0cy5sZW5ndGg7IGsrKykge1xuICAgICAgdGhpc1twcm9wT3V0c1trXV0gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICB0aGlzLmNoZWNrTGFzdFZhbHVlcy5wdXNoKElOSVRJQUxfVkFMVUUpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IHtbbmFtZTogc3RyaW5nXTogU2ltcGxlQ2hhbmdlfSkge1xuICAgIGZvciAodmFyIG5hbWUgaW4gY2hhbmdlcykge1xuICAgICAgaWYgKCg8T2JqZWN0PmNoYW5nZXMpLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgIHZhciBjaGFuZ2U6IFNpbXBsZUNoYW5nZSA9IGNoYW5nZXNbbmFtZV07XG4gICAgICAgIHRoaXMuc2V0Q29tcG9uZW50UHJvcGVydHkobmFtZSwgY2hhbmdlLmN1cnJlbnRWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdEb0NoZWNrKCk6IG51bWJlciB7XG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICB2YXIgZGVzdGluYXRpb25PYmogPSB0aGlzLmRlc3RpbmF0aW9uT2JqO1xuICAgIHZhciBsYXN0VmFsdWVzID0gdGhpcy5jaGVja0xhc3RWYWx1ZXM7XG4gICAgdmFyIGNoZWNrUHJvcGVydGllcyA9IHRoaXMuY2hlY2tQcm9wZXJ0aWVzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hlY2tQcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdmFsdWUgPSBkZXN0aW5hdGlvbk9ialtjaGVja1Byb3BlcnRpZXNbaV1dO1xuICAgICAgdmFyIGxhc3QgPSBsYXN0VmFsdWVzW2ldO1xuICAgICAgaWYgKHZhbHVlICE9PSBsYXN0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiYgaXNOYU4odmFsdWUpICYmIHR5cGVvZiBsYXN0ID09ICdudW1iZXInICYmIGlzTmFOKGxhc3QpKSB7XG4gICAgICAgICAgLy8gaWdub3JlIGJlY2F1c2UgTmFOICE9IE5hTlxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBldmVudEVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gdGhpc1t0aGlzLnByb3BPdXRzW2ldXTtcbiAgICAgICAgICBldmVudEVtaXR0ZXIuZW1pdChsYXN0VmFsdWVzW2ldID0gdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb3VudDtcbiAgfVxuXG4gIHNldENvbXBvbmVudFByb3BlcnR5KG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIHRoaXMuZGVzdGluYXRpb25PYmpbdGhpcy5wcm9wZXJ0eU1hcFtuYW1lXV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZVJlcXVpcmVkKCRlbGVtZW50OiBhbmd1bGFyLklBdWdtZW50ZWRKUXVlcnksIHJlcXVpcmU6IHN0cmluZyB8IHN0cmluZ1tdKTogYW55IHtcbiAgICBpZiAoIXJlcXVpcmUpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcmVxdWlyZSA9PSAnc3RyaW5nJykge1xuICAgICAgdmFyIG5hbWU6IHN0cmluZyA9IDxzdHJpbmc+cmVxdWlyZTtcbiAgICAgIHZhciBpc09wdGlvbmFsID0gZmFsc2U7XG4gICAgICB2YXIgc3RhcnRQYXJlbnQgPSBmYWxzZTtcbiAgICAgIHZhciBzZWFyY2hQYXJlbnRzID0gZmFsc2U7XG4gICAgICB2YXIgY2g6IHN0cmluZztcbiAgICAgIGlmIChuYW1lLmNoYXJBdCgwKSA9PSAnPycpIHtcbiAgICAgICAgaXNPcHRpb25hbCA9IHRydWU7XG4gICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cigxKTtcbiAgICAgIH1cbiAgICAgIGlmIChuYW1lLmNoYXJBdCgwKSA9PSAnXicpIHtcbiAgICAgICAgc2VhcmNoUGFyZW50cyA9IHRydWU7XG4gICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cigxKTtcbiAgICAgIH1cbiAgICAgIGlmIChuYW1lLmNoYXJBdCgwKSA9PSAnXicpIHtcbiAgICAgICAgc3RhcnRQYXJlbnQgPSB0cnVlO1xuICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHIoMSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBrZXkgPSBjb250cm9sbGVyS2V5KG5hbWUpO1xuICAgICAgaWYgKHN0YXJ0UGFyZW50KSAkZWxlbWVudCA9ICRlbGVtZW50LnBhcmVudCgpO1xuICAgICAgdmFyIGRlcCA9IHNlYXJjaFBhcmVudHMgPyAkZWxlbWVudC5pbmhlcml0ZWREYXRhKGtleSkgOiAkZWxlbWVudC5kYXRhKGtleSk7XG4gICAgICBpZiAoIWRlcCAmJiAhaXNPcHRpb25hbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbiBub3QgbG9jYXRlICcke3JlcXVpcmV9JyBpbiAnJHt0aGlzLmRpcmVjdGl2ZS5uYW1lfScuYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVwO1xuICAgIH0gZWxzZSBpZiAocmVxdWlyZSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICB2YXIgZGVwcyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXF1aXJlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGRlcHMucHVzaCh0aGlzLnJlc29sdmVSZXF1aXJlZCgkZWxlbWVudCwgcmVxdWlyZVtpXSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRlcHM7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYERpcmVjdGl2ZSAnJHt0aGlzLmRpcmVjdGl2ZS5uYW1lfScgcmVxdWlyZSBzeW50YXggdW5yZWNvZ25pemVkOiAke3RoaXMuZGlyZWN0aXZlLnJlcXVpcmV9YCk7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy91cGdyYWRlL3VwZ3JhZGVfbmcxX2FkYXB0ZXIudHNcbiAqKi8iLCJleHBvcnQgaW50ZXJmYWNlIElNb2R1bGUge1xuICBjb25maWcoZm46IGFueSk6IElNb2R1bGU7XG4gIGRpcmVjdGl2ZShzZWxlY3Rvcjogc3RyaW5nLCBmYWN0b3J5OiBhbnkpOiBJTW9kdWxlO1xuICBjb250cm9sbGVyKG5hbWU6IHN0cmluZywgdHlwZTogYW55KTogSU1vZHVsZTtcbiAgZmFjdG9yeShrZXk6IHN0cmluZywgZmFjdG9yeUZuOiBhbnkpOiBJTW9kdWxlO1xuICB2YWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IElNb2R1bGU7XG4gIHJ1bihhOiBhbnkpOiB2b2lkO1xufVxuZXhwb3J0IGludGVyZmFjZSBJQ29tcGlsZVNlcnZpY2Uge1xuICAoZWxlbWVudDogRWxlbWVudCB8IE5vZGVMaXN0IHwgc3RyaW5nLCB0cmFuc2NsdWRlPzogRnVuY3Rpb24pOiBJTGlua0ZuO1xufVxuZXhwb3J0IGludGVyZmFjZSBJTGlua0ZuIHtcbiAgKHNjb3BlOiBJU2NvcGUsIGNsb25lQXR0YWNoRm4/OiBGdW5jdGlvbiwgb3B0aW9ucz86IElMaW5rRm5PcHRpb25zKTogdm9pZDtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSUxpbmtGbk9wdGlvbnMge1xuICBwYXJlbnRCb3VuZFRyYW5zY2x1ZGVGbj86IEZ1bmN0aW9uO1xuICB0cmFuc2NsdWRlQ29udHJvbGxlcnM/OiB7W2tleTogc3RyaW5nXTogYW55fTtcbiAgZnV0dXJlUGFyZW50RWxlbWVudD86IE5vZGU7XG59XG5leHBvcnQgaW50ZXJmYWNlIElSb290U2NvcGVTZXJ2aWNlIHtcbiAgJG5ldyhpc29sYXRlPzogYm9vbGVhbik6IElTY29wZTtcbiAgJGlkOiBzdHJpbmc7XG4gICR3YXRjaChleHByOiBhbnksIGZuPzogKGExPzogYW55LCBhMj86IGFueSkgPT4gdm9pZCk6IEZ1bmN0aW9uO1xuICAkYXBwbHkoKTogYW55O1xuICAkYXBwbHkoZXhwOiBzdHJpbmcpOiBhbnk7XG4gICRhcHBseShleHA6IEZ1bmN0aW9uKTogYW55O1xuICAkJGNoaWxkVGFpbDogSVNjb3BlO1xuICAkJGNoaWxkSGVhZDogSVNjb3BlO1xuICAkJG5leHRTaWJsaW5nOiBJU2NvcGU7XG59XG5leHBvcnQgaW50ZXJmYWNlIElTY29wZSBleHRlbmRzIElSb290U2NvcGVTZXJ2aWNlIHt9XG5leHBvcnQgaW50ZXJmYWNlIElBbmd1bGFyQm9vdHN0cmFwQ29uZmlnIHt9XG5leHBvcnQgaW50ZXJmYWNlIElEaXJlY3RpdmUge1xuICBjb21waWxlPzogSURpcmVjdGl2ZUNvbXBpbGVGbjtcbiAgY29udHJvbGxlcj86IGFueTtcbiAgY29udHJvbGxlckFzPzogc3RyaW5nO1xuICBiaW5kVG9Db250cm9sbGVyPzogYm9vbGVhbiB8IE9iamVjdDtcbiAgbGluaz86IElEaXJlY3RpdmVMaW5rRm4gfCBJRGlyZWN0aXZlUHJlUG9zdDtcbiAgbmFtZT86IHN0cmluZztcbiAgcHJpb3JpdHk/OiBudW1iZXI7XG4gIHJlcGxhY2U/OiBib29sZWFuO1xuICByZXF1aXJlPzogYW55O1xuICByZXN0cmljdD86IHN0cmluZztcbiAgc2NvcGU/OiBhbnk7XG4gIHRlbXBsYXRlPzogYW55O1xuICB0ZW1wbGF0ZVVybD86IGFueTtcbiAgdGVybWluYWw/OiBib29sZWFuO1xuICB0cmFuc2NsdWRlPzogYW55O1xufVxuZXhwb3J0IGludGVyZmFjZSBJRGlyZWN0aXZlQ29tcGlsZUZuIHtcbiAgKHRlbXBsYXRlRWxlbWVudDogSUF1Z21lbnRlZEpRdWVyeSwgdGVtcGxhdGVBdHRyaWJ1dGVzOiBJQXR0cmlidXRlcyxcbiAgIHRyYW5zY2x1ZGU6IElUcmFuc2NsdWRlRnVuY3Rpb24pOiBJRGlyZWN0aXZlUHJlUG9zdDtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSURpcmVjdGl2ZVByZVBvc3Qge1xuICBwcmU/OiBJRGlyZWN0aXZlTGlua0ZuO1xuICBwb3N0PzogSURpcmVjdGl2ZUxpbmtGbjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSURpcmVjdGl2ZUxpbmtGbiB7XG4gIChzY29wZTogSVNjb3BlLCBpbnN0YW5jZUVsZW1lbnQ6IElBdWdtZW50ZWRKUXVlcnksIGluc3RhbmNlQXR0cmlidXRlczogSUF0dHJpYnV0ZXMsXG4gICBjb250cm9sbGVyOiBhbnksIHRyYW5zY2x1ZGU6IElUcmFuc2NsdWRlRnVuY3Rpb24pOiB2b2lkO1xufVxuZXhwb3J0IGludGVyZmFjZSBJQXR0cmlidXRlcyB7ICRvYnNlcnZlKGF0dHI6IHN0cmluZywgZm46ICh2OiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkOyB9XG5leHBvcnQgaW50ZXJmYWNlIElUcmFuc2NsdWRlRnVuY3Rpb24ge1xuICAvLyBJZiB0aGUgc2NvcGUgaXMgcHJvdmlkZWQsIHRoZW4gdGhlIGNsb25lQXR0YWNoRm4gbXVzdCBiZSBhcyB3ZWxsLlxuICAoc2NvcGU6IElTY29wZSwgY2xvbmVBdHRhY2hGbjogSUNsb25lQXR0YWNoRnVuY3Rpb24pOiBJQXVnbWVudGVkSlF1ZXJ5O1xuICAvLyBJZiBvbmUgYXJndW1lbnQgaXMgcHJvdmlkZWQsIHRoZW4gaXQncyBhc3N1bWVkIHRvIGJlIHRoZSBjbG9uZUF0dGFjaEZuLlxuICAoY2xvbmVBdHRhY2hGbj86IElDbG9uZUF0dGFjaEZ1bmN0aW9uKTogSUF1Z21lbnRlZEpRdWVyeTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSUNsb25lQXR0YWNoRnVuY3Rpb24ge1xuICAvLyBMZXQncyBoaW50IGJ1dCBub3QgZm9yY2UgY2xvbmVBdHRhY2hGbidzIHNpZ25hdHVyZVxuICAoY2xvbmVkRWxlbWVudD86IElBdWdtZW50ZWRKUXVlcnksIHNjb3BlPzogSVNjb3BlKTogYW55O1xufVxuZXhwb3J0IGludGVyZmFjZSBJQXVnbWVudGVkSlF1ZXJ5IHtcbiAgYmluZChuYW1lOiBzdHJpbmcsIGZuOiAoKSA9PiB2b2lkKTogdm9pZDtcbiAgZGF0YShuYW1lOiBzdHJpbmcsIHZhbHVlPzogYW55KTogYW55O1xuICBpbmhlcml0ZWREYXRhKG5hbWU6IHN0cmluZywgdmFsdWU/OiBhbnkpOiBhbnk7XG4gIGNvbnRlbnRzKCk6IElBdWdtZW50ZWRKUXVlcnk7XG4gIHBhcmVudCgpOiBJQXVnbWVudGVkSlF1ZXJ5O1xuICBsZW5ndGg6IG51bWJlcjtcbiAgW2luZGV4OiBudW1iZXJdOiBOb2RlO1xufVxuZXhwb3J0IGludGVyZmFjZSBJUGFyc2VTZXJ2aWNlIHsgKGV4cHJlc3Npb246IHN0cmluZyk6IElDb21waWxlZEV4cHJlc3Npb247IH1cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBpbGVkRXhwcmVzc2lvbiB7IGFzc2lnbihjb250ZXh0OiBhbnksIHZhbHVlOiBhbnkpOiBhbnk7IH1cbmV4cG9ydCBpbnRlcmZhY2UgSUh0dHBCYWNrZW5kU2VydmljZSB7XG4gIChtZXRob2Q6IHN0cmluZywgdXJsOiBzdHJpbmcsIHBvc3Q/OiBhbnksIGNhbGxiYWNrPzogRnVuY3Rpb24sIGhlYWRlcnM/OiBhbnksIHRpbWVvdXQ/OiBudW1iZXIsXG4gICB3aXRoQ3JlZGVudGlhbHM/OiBib29sZWFuKTogdm9pZDtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSUNhY2hlT2JqZWN0IHtcbiAgcHV0PFQ+KGtleTogc3RyaW5nLCB2YWx1ZT86IFQpOiBUO1xuICBnZXQoa2V5OiBzdHJpbmcpOiBhbnk7XG59XG5leHBvcnQgaW50ZXJmYWNlIElUZW1wbGF0ZUNhY2hlU2VydmljZSBleHRlbmRzIElDYWNoZU9iamVjdCB7fVxuZXhwb3J0IGludGVyZmFjZSBJQ29udHJvbGxlclNlcnZpY2Uge1xuICAoY29udHJvbGxlckNvbnN0cnVjdG9yOiBGdW5jdGlvbiwgbG9jYWxzPzogYW55LCBsYXRlcj86IGFueSwgaWRlbnQ/OiBhbnkpOiBhbnk7XG4gIChjb250cm9sbGVyTmFtZTogc3RyaW5nLCBsb2NhbHM/OiBhbnkpOiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUluamVjdG9yU2VydmljZSB7IGdldChrZXk6IHN0cmluZyk6IGFueTsgfVxuXG5mdW5jdGlvbiBub05nKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ0FuZ3VsYXJKUyB2MS54IGlzIG5vdCBsb2FkZWQhJyk7XG59XG5cbnZhciBhbmd1bGFyOiB7XG4gIGJvb3RzdHJhcDogKGU6IEVsZW1lbnQsIG1vZHVsZXM6IHN0cmluZ1tdLCBjb25maWc6IElBbmd1bGFyQm9vdHN0cmFwQ29uZmlnKSA9PiB2b2lkLFxuICBtb2R1bGU6IChwcmVmaXg6IHN0cmluZywgZGVwZW5kZW5jaWVzPzogc3RyaW5nW10pID0+IElNb2R1bGUsXG4gIGVsZW1lbnQ6IChlOiBFbGVtZW50KSA9PiBJQXVnbWVudGVkSlF1ZXJ5LFxuICB2ZXJzaW9uOiB7bWFqb3I6IG51bWJlcn1cbn0gPSA8YW55Pntib290c3RyYXA6IG5vTmcsIG1vZHVsZTogbm9OZywgZWxlbWVudDogbm9OZywgdmVyc2lvbjogbm9OZ307XG5cblxudHJ5IHtcbiAgaWYgKHdpbmRvdy5oYXNPd25Qcm9wZXJ0eSgnYW5ndWxhcicpKSB7XG4gICAgYW5ndWxhciA9ICg8YW55PndpbmRvdykuYW5ndWxhcjtcbiAgfVxufSBjYXRjaCAoZSkge1xuICAvLyBpZ25vcmUgaW4gQ0pTIG1vZGUuXG59XG5cbmV4cG9ydCB2YXIgYm9vdHN0cmFwID0gYW5ndWxhci5ib290c3RyYXA7XG5leHBvcnQgdmFyIG1vZHVsZSA9IGFuZ3VsYXIubW9kdWxlO1xuZXhwb3J0IHZhciBlbGVtZW50ID0gYW5ndWxhci5lbGVtZW50O1xuZXhwb3J0IHZhciB2ZXJzaW9uID0gYW5ndWxhci52ZXJzaW9uO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3VwZ3JhZGUvYW5ndWxhcl9qcy50c1xuICoqLyIsIi8qKlxuICogQG1vZHVsZVxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGlzIG1vZHVsZSBpcyB1c2VkIGZvciB3cml0aW5nIHRlc3RzIGZvciBhcHBsaWNhdGlvbnMgd3JpdHRlbiBpbiBBbmd1bGFyLlxuICpcbiAqIFRoaXMgbW9kdWxlIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgYGFuZ3VsYXIyYCBtb2R1bGU7IHlvdSBtdXN0IGltcG9ydCB0aGUgdGVzdCBtb2R1bGUgZXhwbGljaXRseS5cbiAqXG4gKi9cbmV4cG9ydCAqIGZyb20gJy4vc3JjL3Rlc3RpbmcvdGVzdGluZyc7XG5leHBvcnQge0NvbXBvbmVudEZpeHR1cmUsIFRlc3RDb21wb25lbnRCdWlsZGVyfSBmcm9tICcuL3NyYy90ZXN0aW5nL3Rlc3RfY29tcG9uZW50X2J1aWxkZXInO1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvdGVzdGluZy90ZXN0X2luamVjdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vc3JjL3Rlc3RpbmcvZmFrZV9hc3luYyc7XG5cbmV4cG9ydCB7TW9ja1ZpZXdSZXNvbHZlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL21vY2svdmlld19yZXNvbHZlcl9tb2NrJztcbmV4cG9ydCB7TW9ja1hIUn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3hocl9tb2NrJztcbmV4cG9ydCB7TW9ja05nWm9uZX0gZnJvbSAnYW5ndWxhcjIvc3JjL21vY2svbmdfem9uZV9tb2NrJztcbmV4cG9ydCB7TW9ja0FwcGxpY2F0aW9uUmVmfSBmcm9tICdhbmd1bGFyMi9zcmMvbW9jay9tb2NrX2FwcGxpY2F0aW9uX3JlZic7XG5leHBvcnQge01vY2tEaXJlY3RpdmVSZXNvbHZlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL21vY2svZGlyZWN0aXZlX3Jlc29sdmVyX21vY2snO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvdGVzdGluZy50c1xuICoqLyIsIi8qKlxuICogUHVibGljIFRlc3QgTGlicmFyeSBmb3IgdW5pdCB0ZXN0aW5nIEFuZ3VsYXIyIEFwcGxpY2F0aW9ucy4gVXNlcyB0aGVcbiAqIEphc21pbmUgZnJhbWV3b3JrLlxuICovXG5pbXBvcnQge2dsb2JhbH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7TGlzdFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge2JpbmR9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuXG5pbXBvcnQge1xuICBjcmVhdGVUZXN0SW5qZWN0b3JXaXRoUnVudGltZUNvbXBpbGVyLFxuICBGdW5jdGlvbldpdGhQYXJhbVRva2VucyxcbiAgaW5qZWN0LFxuICBpbmplY3RBc3luY1xufSBmcm9tICcuL3Rlc3RfaW5qZWN0b3InO1xuXG5leHBvcnQge2luamVjdCwgaW5qZWN0QXN5bmN9IGZyb20gJy4vdGVzdF9pbmplY3Rvcic7XG5cbmV4cG9ydCB7ZXhwZWN0LCBOZ01hdGNoZXJzfSBmcm9tICcuL21hdGNoZXJzJztcblxudmFyIF9nbG9iYWw6IGphc21pbmUuR2xvYmFsUG9sbHV0ZXIgPSA8YW55Pih0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHdpbmRvdyk7XG5cbi8qKlxuICogUnVuIGEgZnVuY3Rpb24gKHdpdGggYW4gb3B0aW9uYWwgYXN5bmNocm9ub3VzIGNhbGxiYWNrKSBhZnRlciBlYWNoIHRlc3QgY2FzZS5cbiAqXG4gKiBTZWUgaHR0cDovL2phc21pbmUuZ2l0aHViLmlvLyBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqICMjIEV4YW1wbGU6XG4gKlxuICoge0BleGFtcGxlIHRlc3RpbmcvdHMvdGVzdGluZy50cyByZWdpb249J2FmdGVyRWFjaCd9XG4gKi9cbmV4cG9ydCB2YXIgYWZ0ZXJFYWNoOiBGdW5jdGlvbiA9IF9nbG9iYWwuYWZ0ZXJFYWNoO1xuXG4vKipcbiAqIEdyb3VwIHRlc3QgY2FzZXMgdG9nZXRoZXIgdW5kZXIgYSBjb21tb24gZGVzY3JpcHRpb24gcHJlZml4LlxuICpcbiAqIFNlZSBodHRwOi8vamFzbWluZS5naXRodWIuaW8vIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogIyMgRXhhbXBsZTpcbiAqXG4gKiB7QGV4YW1wbGUgdGVzdGluZy90cy90ZXN0aW5nLnRzIHJlZ2lvbj0nZGVzY3JpYmVJdCd9XG4gKi9cbmV4cG9ydCB2YXIgZGVzY3JpYmU6IEZ1bmN0aW9uID0gX2dsb2JhbC5kZXNjcmliZTtcblxuLyoqXG4gKiBTZWUge0BsaW5rIGZkZXNjcmliZX0uXG4gKi9cbmV4cG9ydCB2YXIgZGRlc2NyaWJlOiBGdW5jdGlvbiA9IF9nbG9iYWwuZmRlc2NyaWJlO1xuXG4vKipcbiAqIExpa2Uge0BsaW5rIGRlc2NyaWJlfSwgYnV0IGluc3RydWN0cyB0aGUgdGVzdCBydW5uZXIgdG8gb25seSBydW5cbiAqIHRoZSB0ZXN0IGNhc2VzIGluIHRoaXMgZ3JvdXAuIFRoaXMgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG4gKlxuICogU2VlIGh0dHA6Ly9qYXNtaW5lLmdpdGh1Yi5pby8gZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiAjIyBFeGFtcGxlOlxuICpcbiAqIHtAZXhhbXBsZSB0ZXN0aW5nL3RzL3Rlc3RpbmcudHMgcmVnaW9uPSdmZGVzY3JpYmUnfVxuICovXG5leHBvcnQgdmFyIGZkZXNjcmliZTogRnVuY3Rpb24gPSBfZ2xvYmFsLmZkZXNjcmliZTtcblxuLyoqXG4gKiBMaWtlIHtAbGluayBkZXNjcmliZX0sIGJ1dCBpbnN0cnVjdHMgdGhlIHRlc3QgcnVubmVyIHRvIGV4Y2x1ZGVcbiAqIHRoaXMgZ3JvdXAgb2YgdGVzdCBjYXNlcyBmcm9tIGV4ZWN1dGlvbi4gVGhpcyBpcyB1c2VmdWwgZm9yXG4gKiBkZWJ1Z2dpbmcsIG9yIGZvciBleGNsdWRpbmcgYnJva2VuIHRlc3RzIHVudGlsIHRoZXkgY2FuIGJlIGZpeGVkLlxuICpcbiAqIFNlZSBodHRwOi8vamFzbWluZS5naXRodWIuaW8vIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogIyMgRXhhbXBsZTpcbiAqXG4gKiB7QGV4YW1wbGUgdGVzdGluZy90cy90ZXN0aW5nLnRzIHJlZ2lvbj0neGRlc2NyaWJlJ31cbiAqL1xuZXhwb3J0IHZhciB4ZGVzY3JpYmU6IEZ1bmN0aW9uID0gX2dsb2JhbC54ZGVzY3JpYmU7XG5cbi8qKlxuICogU2lnbmF0dXJlIGZvciBhIHN5bmNocm9ub3VzIHRlc3QgZnVuY3Rpb24gKG5vIGFyZ3VtZW50cykuXG4gKi9cbmV4cG9ydCB0eXBlIFN5bmNUZXN0Rm4gPSAoKSA9PiB2b2lkO1xuXG4vKipcbiAqIFNpZ25hdHVyZSBmb3IgYW4gYXN5bmNocm9ub3VzIHRlc3QgZnVuY3Rpb24gd2hpY2ggdGFrZXMgYVxuICogYGRvbmVgIGNhbGxiYWNrLlxuICovXG5leHBvcnQgdHlwZSBBc3luY1Rlc3RGbiA9IChkb25lOiAoKSA9PiB2b2lkKSA9PiB2b2lkO1xuXG4vKipcbiAqIFNpZ25hdHVyZSBmb3IgYW55IHNpbXBsZSB0ZXN0aW5nIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgdHlwZSBBbnlUZXN0Rm4gPSBTeW5jVGVzdEZuIHwgQXN5bmNUZXN0Rm47XG5cbnZhciBqc21CZWZvcmVFYWNoID0gX2dsb2JhbC5iZWZvcmVFYWNoO1xudmFyIGpzbUl0ID0gX2dsb2JhbC5pdDtcbnZhciBqc21JSXQgPSBfZ2xvYmFsLmZpdDtcbnZhciBqc21YSXQgPSBfZ2xvYmFsLnhpdDtcblxudmFyIHRlc3RQcm92aWRlcnM7XG52YXIgaW5qZWN0b3I7XG5cbi8vIFJlc2V0IHRoZSB0ZXN0IHByb3ZpZGVycyBiZWZvcmUgZWFjaCB0ZXN0LlxuanNtQmVmb3JlRWFjaCgoKSA9PiB7XG4gIHRlc3RQcm92aWRlcnMgPSBbXTtcbiAgaW5qZWN0b3IgPSBudWxsO1xufSk7XG5cbi8qKlxuICogQWxsb3dzIG92ZXJyaWRpbmcgZGVmYXVsdCBwcm92aWRlcnMgb2YgdGhlIHRlc3QgaW5qZWN0b3IsXG4gKiB3aGljaCBhcmUgZGVmaW5lZCBpbiB0ZXN0X2luamVjdG9yLmpzLlxuICpcbiAqIFRoZSBnaXZlbiBmdW5jdGlvbiBtdXN0IHJldHVybiBhIGxpc3Qgb2YgREkgcHJvdmlkZXJzLlxuICpcbiAqICMjIEV4YW1wbGU6XG4gKlxuICoge0BleGFtcGxlIHRlc3RpbmcvdHMvdGVzdGluZy50cyByZWdpb249J2JlZm9yZUVhY2hQcm92aWRlcnMnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYmVmb3JlRWFjaFByb3ZpZGVycyhmbik6IHZvaWQge1xuICBqc21CZWZvcmVFYWNoKCgpID0+IHtcbiAgICB2YXIgcHJvdmlkZXJzID0gZm4oKTtcbiAgICBpZiAoIXByb3ZpZGVycykgcmV0dXJuO1xuICAgIHRlc3RQcm92aWRlcnMgPSBbLi4udGVzdFByb3ZpZGVycywgLi4ucHJvdmlkZXJzXTtcbiAgICBpZiAoaW5qZWN0b3IgIT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYmVmb3JlRWFjaFByb3ZpZGVycyB3YXMgY2FsbGVkIGFmdGVyIHRoZSBpbmplY3RvciBoYWQgJyArXG4gICAgICAgICAgICAgICAgICAgICAgJ2JlZW4gdXNlZCBpbiBhIGJlZm9yZUVhY2ggb3IgaXQgYmxvY2suIFRoaXMgaW52YWxpZGF0ZXMgdGhlICcgK1xuICAgICAgICAgICAgICAgICAgICAgICd0ZXN0IGluamVjdG9yJyk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gX2lzUHJvbWlzZUxpa2UoaW5wdXQpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlucHV0ICYmICEhKGlucHV0LnRoZW4pO1xufVxuXG5mdW5jdGlvbiBydW5JblRlc3Rab25lKGZuVG9FeGVjdXRlLCBmaW5pc2hDYWxsYmFjaywgZmFpbENhbGxiYWNrKTogYW55IHtcbiAgdmFyIHBlbmRpbmdNaWNyb3Rhc2tzID0gMDtcbiAgdmFyIHBlbmRpbmdUaW1lb3V0cyA9IFtdO1xuXG4gIHZhciBuZ1Rlc3Rab25lID0gKDxab25lPmdsb2JhbC56b25lKVxuICAgICAgICAgICAgICAgICAgICAgICAuZm9yayh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcjogZnVuY3Rpb24oZSkgeyBmYWlsQ2FsbGJhY2soZSk7IH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgJyRydW4nOiBmdW5jdGlvbihwYXJlbnRSdW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50UnVuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBlbmRpbmdNaWNyb3Rhc2tzID09IDAgJiYgcGVuZGluZ1RpbWVvdXRzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hDYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICckc2NoZWR1bGVNaWNyb3Rhc2snOiBmdW5jdGlvbihwYXJlbnRTY2hlZHVsZU1pY3JvdGFzaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGZuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdNaWNyb3Rhc2tzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtaWNyb3Rhc2sgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ01pY3JvdGFza3MtLTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFNjaGVkdWxlTWljcm90YXNrLmNhbGwodGhpcywgbWljcm90YXNrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAnJHNldFRpbWVvdXQnOiBmdW5jdGlvbihwYXJlbnRTZXRUaW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZm46IEZ1bmN0aW9uLCBkZWxheTogbnVtYmVyLCAuLi5hcmdzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNiID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0V3JhcHBlci5yZW1vdmUocGVuZGluZ1RpbWVvdXRzLCBpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkID0gcGFyZW50U2V0VGltZW91dChjYiwgZGVsYXksIGFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nVGltZW91dHMucHVzaChpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAnJGNsZWFyVGltZW91dCc6IGZ1bmN0aW9uKHBhcmVudENsZWFyVGltZW91dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGlkOiBudW1iZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Q2xlYXJUaW1lb3V0KGlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFdyYXBwZXIucmVtb3ZlKHBlbmRpbmdUaW1lb3V0cywgaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICByZXR1cm4gbmdUZXN0Wm9uZS5ydW4oZm5Ub0V4ZWN1dGUpO1xufVxuXG5mdW5jdGlvbiBfaXQoanNtRm46IEZ1bmN0aW9uLCBuYW1lOiBzdHJpbmcsIHRlc3RGbjogRnVuY3Rpb25XaXRoUGFyYW1Ub2tlbnMgfCBBbnlUZXN0Rm4sXG4gICAgICAgICAgICAgdGVzdFRpbWVPdXQ6IG51bWJlcik6IHZvaWQge1xuICB2YXIgdGltZU91dCA9IHRlc3RUaW1lT3V0O1xuXG4gIGlmICh0ZXN0Rm4gaW5zdGFuY2VvZiBGdW5jdGlvbldpdGhQYXJhbVRva2Vucykge1xuICAgIGpzbUZuKG5hbWUsIChkb25lKSA9PiB7XG4gICAgICBpZiAoIWluamVjdG9yKSB7XG4gICAgICAgIGluamVjdG9yID0gY3JlYXRlVGVzdEluamVjdG9yV2l0aFJ1bnRpbWVDb21waWxlcih0ZXN0UHJvdmlkZXJzKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGZpbmlzaENhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICAvLyBXYWl0IG9uZSBtb3JlIGV2ZW50IGxvb3AgdG8gbWFrZSBzdXJlIHdlIGNhdGNoIHVucmV0dXJuZWQgcHJvbWlzZXMgYW5kXG4gICAgICAgIC8vIHByb21pc2UgcmVqZWN0aW9ucy5cbiAgICAgICAgc2V0VGltZW91dChkb25lLCAwKTtcbiAgICAgIH07XG4gICAgICB2YXIgcmV0dXJuZWRUZXN0VmFsdWUgPVxuICAgICAgICAgIHJ1bkluVGVzdFpvbmUoKCkgPT4gdGVzdEZuLmV4ZWN1dGUoaW5qZWN0b3IpLCBmaW5pc2hDYWxsYmFjaywgZG9uZS5mYWlsKTtcblxuICAgICAgaWYgKHRlc3RGbi5pc0FzeW5jKSB7XG4gICAgICAgIGlmIChfaXNQcm9taXNlTGlrZShyZXR1cm5lZFRlc3RWYWx1ZSkpIHtcbiAgICAgICAgICAoPFByb21pc2U8YW55Pj5yZXR1cm5lZFRlc3RWYWx1ZSkudGhlbihudWxsLCAoZXJyKSA9PiB7IGRvbmUuZmFpbChlcnIpOyB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkb25lLmZhaWwoJ0Vycm9yOiBpbmplY3RBc3luYyB3YXMgZXhwZWN0ZWQgdG8gcmV0dXJuIGEgcHJvbWlzZSwgYnV0IHRoZSAnICtcbiAgICAgICAgICAgICAgICAgICAgJyByZXR1cm5lZCB2YWx1ZSB3YXM6ICcgKyByZXR1cm5lZFRlc3RWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghKHJldHVybmVkVGVzdFZhbHVlID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgZG9uZS5mYWlsKCdFcnJvcjogaW5qZWN0IHJldHVybmVkIGEgdmFsdWUuIERpZCB5b3UgbWVhbiB0byB1c2UgaW5qZWN0QXN5bmM/IFJldHVybmVkICcgK1xuICAgICAgICAgICAgICAgICAgICAndmFsdWUgd2FzOiAnICsgcmV0dXJuZWRUZXN0VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgdGltZU91dCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhlIHRlc3QgY2FzZSBkb2Vzbid0IHVzZSBpbmplY3QoKS4gaWUgYGl0KCd0ZXN0JywgKGRvbmUpID0+IHsgLi4uIH0pKTtgXG4gICAganNtRm4obmFtZSwgdGVzdEZuLCB0aW1lT3V0KTtcbiAgfVxufVxuXG4vKipcbiAqIFdyYXBwZXIgYXJvdW5kIEphc21pbmUgYmVmb3JlRWFjaCBmdW5jdGlvbi5cbiAqXG4gKiBiZWZvcmVFYWNoIG1heSBiZSB1c2VkIHdpdGggdGhlIGBpbmplY3RgIGZ1bmN0aW9uIHRvIGZldGNoIGRlcGVuZGVuY2llcy5cbiAqIFRoZSB0ZXN0IHdpbGwgYXV0b21hdGljYWxseSB3YWl0IGZvciBhbnkgYXN5bmNocm9ub3VzIGNhbGxzIGluc2lkZSB0aGVcbiAqIGluamVjdGVkIHRlc3QgZnVuY3Rpb24gdG8gY29tcGxldGUuXG4gKlxuICogU2VlIGh0dHA6Ly9qYXNtaW5lLmdpdGh1Yi5pby8gZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiAjIyBFeGFtcGxlOlxuICpcbiAqIHtAZXhhbXBsZSB0ZXN0aW5nL3RzL3Rlc3RpbmcudHMgcmVnaW9uPSdiZWZvcmVFYWNoJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJlZm9yZUVhY2goZm46IEZ1bmN0aW9uV2l0aFBhcmFtVG9rZW5zIHwgQW55VGVzdEZuKTogdm9pZCB7XG4gIGlmIChmbiBpbnN0YW5jZW9mIEZ1bmN0aW9uV2l0aFBhcmFtVG9rZW5zKSB7XG4gICAgLy8gVGhlIHRlc3QgY2FzZSB1c2VzIGluamVjdCgpLiBpZSBgYmVmb3JlRWFjaChpbmplY3QoW0NsYXNzQV0sIChhKSA9PiB7IC4uLlxuICAgIC8vIH0pKTtgXG4gICAganNtQmVmb3JlRWFjaCgoZG9uZSkgPT4ge1xuICAgICAgdmFyIGZpbmlzaENhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICAvLyBXYWl0IG9uZSBtb3JlIGV2ZW50IGxvb3AgdG8gbWFrZSBzdXJlIHdlIGNhdGNoIHVucmV0dXJuZWQgcHJvbWlzZXMgYW5kXG4gICAgICAgIC8vIHByb21pc2UgcmVqZWN0aW9ucy5cbiAgICAgICAgc2V0VGltZW91dChkb25lLCAwKTtcbiAgICAgIH07XG4gICAgICBpZiAoIWluamVjdG9yKSB7XG4gICAgICAgIGluamVjdG9yID0gY3JlYXRlVGVzdEluamVjdG9yV2l0aFJ1bnRpbWVDb21waWxlcih0ZXN0UHJvdmlkZXJzKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHJldHVybmVkVGVzdFZhbHVlID0gcnVuSW5UZXN0Wm9uZSgoKSA9PiBmbi5leGVjdXRlKGluamVjdG9yKSwgZmluaXNoQ2FsbGJhY2ssIGRvbmUuZmFpbCk7XG4gICAgICBpZiAoZm4uaXNBc3luYykge1xuICAgICAgICBpZiAoX2lzUHJvbWlzZUxpa2UocmV0dXJuZWRUZXN0VmFsdWUpKSB7XG4gICAgICAgICAgKDxQcm9taXNlPGFueT4+cmV0dXJuZWRUZXN0VmFsdWUpLnRoZW4obnVsbCwgKGVycikgPT4geyBkb25lLmZhaWwoZXJyKTsgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZG9uZS5mYWlsKCdFcnJvcjogaW5qZWN0QXN5bmMgd2FzIGV4cGVjdGVkIHRvIHJldHVybiBhIHByb21pc2UsIGJ1dCB0aGUgJyArXG4gICAgICAgICAgICAgICAgICAgICcgcmV0dXJuZWQgdmFsdWUgd2FzOiAnICsgcmV0dXJuZWRUZXN0VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIShyZXR1cm5lZFRlc3RWYWx1ZSA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgIGRvbmUuZmFpbCgnRXJyb3I6IGluamVjdCByZXR1cm5lZCBhIHZhbHVlLiBEaWQgeW91IG1lYW4gdG8gdXNlIGluamVjdEFzeW5jPyBSZXR1cm5lZCAnICtcbiAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlIHdhczogJyArIHJldHVybmVkVGVzdFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIC8vIFRoZSB0ZXN0IGNhc2UgZG9lc24ndCB1c2UgaW5qZWN0KCkuIGllIGBiZWZvcmVFYWNoKChkb25lKSA9PiB7IC4uLiB9KSk7YFxuICAgIGlmICgoPGFueT5mbikubGVuZ3RoID09PSAwKSB7XG4gICAgICBqc21CZWZvcmVFYWNoKCgpID0+IHsgKDxTeW5jVGVzdEZuPmZuKSgpOyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAganNtQmVmb3JlRWFjaCgoZG9uZSkgPT4geyAoPEFzeW5jVGVzdEZuPmZuKShkb25lKTsgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRGVmaW5lIGEgc2luZ2xlIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiB0ZXN0IG5hbWUgYW5kIGV4ZWN1dGlvbiBmdW5jdGlvbi5cbiAqXG4gKiBUaGUgdGVzdCBmdW5jdGlvbiBjYW4gYmUgZWl0aGVyIGEgc3luY2hyb25vdXMgZnVuY3Rpb24sIGFuIGFzeW5jaHJvbm91cyBmdW5jdGlvblxuICogdGhhdCB0YWtlcyBhIGNvbXBsZXRpb24gY2FsbGJhY2ssIG9yIGFuIGluamVjdGVkIGZ1bmN0aW9uIGNyZWF0ZWQgdmlhIHtAbGluayBpbmplY3R9XG4gKiBvciB7QGxpbmsgaW5qZWN0QXN5bmN9LiBUaGUgdGVzdCB3aWxsIGF1dG9tYXRpY2FsbHkgd2FpdCBmb3IgYW55IGFzeW5jaHJvbm91cyBjYWxsc1xuICogaW5zaWRlIHRoZSBpbmplY3RlZCB0ZXN0IGZ1bmN0aW9uIHRvIGNvbXBsZXRlLlxuICpcbiAqIFdyYXBwZXIgYXJvdW5kIEphc21pbmUgaXQgZnVuY3Rpb24uIFNlZSBodHRwOi8vamFzbWluZS5naXRodWIuaW8vIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogIyMgRXhhbXBsZTpcbiAqXG4gKiB7QGV4YW1wbGUgdGVzdGluZy90cy90ZXN0aW5nLnRzIHJlZ2lvbj0nZGVzY3JpYmVJdCd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpdChuYW1lOiBzdHJpbmcsIGZuOiBGdW5jdGlvbldpdGhQYXJhbVRva2VucyB8IEFueVRlc3RGbixcbiAgICAgICAgICAgICAgICAgICB0aW1lT3V0OiBudW1iZXIgPSBudWxsKTogdm9pZCB7XG4gIHJldHVybiBfaXQoanNtSXQsIG5hbWUsIGZuLCB0aW1lT3V0KTtcbn1cblxuLyoqXG4gKiBMaWtlIHtAbGluayBpdH0sIGJ1dCBpbnN0cnVjdHMgdGhlIHRlc3QgcnVubmVyIHRvIGV4Y2x1ZGUgdGhpcyB0ZXN0XG4gKiBlbnRpcmVseS4gVXNlZnVsIGZvciBkZWJ1Z2dpbmcgb3IgZm9yIGV4Y2x1ZGluZyBicm9rZW4gdGVzdHMgdW50aWxcbiAqIHRoZXkgY2FuIGJlIGZpeGVkLlxuICpcbiAqIFdyYXBwZXIgYXJvdW5kIEphc21pbmUgeGl0IGZ1bmN0aW9uLiBTZWUgaHR0cDovL2phc21pbmUuZ2l0aHViLmlvLyBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqICMjIEV4YW1wbGU6XG4gKlxuICoge0BleGFtcGxlIHRlc3RpbmcvdHMvdGVzdGluZy50cyByZWdpb249J3hpdCd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB4aXQobmFtZTogc3RyaW5nLCBmbjogRnVuY3Rpb25XaXRoUGFyYW1Ub2tlbnMgfCBBbnlUZXN0Rm4sXG4gICAgICAgICAgICAgICAgICAgIHRpbWVPdXQ6IG51bWJlciA9IG51bGwpOiB2b2lkIHtcbiAgcmV0dXJuIF9pdChqc21YSXQsIG5hbWUsIGZuLCB0aW1lT3V0KTtcbn1cblxuLyoqXG4gKiBTZWUge0BsaW5rIGZpdH0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpaXQobmFtZTogc3RyaW5nLCBmbjogRnVuY3Rpb25XaXRoUGFyYW1Ub2tlbnMgfCBBbnlUZXN0Rm4sXG4gICAgICAgICAgICAgICAgICAgIHRpbWVPdXQ6IG51bWJlciA9IG51bGwpOiB2b2lkIHtcbiAgcmV0dXJuIF9pdChqc21JSXQsIG5hbWUsIGZuLCB0aW1lT3V0KTtcbn1cblxuLyoqXG4gKiBMaWtlIHtAbGluayBpdH0sIGJ1dCBpbnN0cnVjdHMgdGhlIHRlc3QgcnVubmVyIHRvIG9ubHkgcnVuIHRoaXMgdGVzdC5cbiAqIFVzZWZ1bCBmb3IgZGVidWdnaW5nLlxuICpcbiAqIFdyYXBwZXIgYXJvdW5kIEphc21pbmUgZml0IGZ1bmN0aW9uLiBTZWUgaHR0cDovL2phc21pbmUuZ2l0aHViLmlvLyBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqICMjIEV4YW1wbGU6XG4gKlxuICoge0BleGFtcGxlIHRlc3RpbmcvdHMvdGVzdGluZy50cyByZWdpb249J2ZpdCd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaXQobmFtZTogc3RyaW5nLCBmbjogRnVuY3Rpb25XaXRoUGFyYW1Ub2tlbnMgfCBBbnlUZXN0Rm4sXG4gICAgICAgICAgICAgICAgICAgIHRpbWVPdXQ6IG51bWJlciA9IG51bGwpOiB2b2lkIHtcbiAgcmV0dXJuIF9pdChqc21JSXQsIG5hbWUsIGZuLCB0aW1lT3V0KTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy90ZXN0aW5nL3Rlc3RpbmcudHNcbiAqKi8iLCJpbXBvcnQge1xuICBBUFBfSUQsXG4gIEFQUExJQ0FUSU9OX0NPTU1PTl9QUk9WSURFUlMsXG4gIEFwcFZpZXdNYW5hZ2VyLFxuICBEaXJlY3RpdmVSZXNvbHZlcixcbiAgRHluYW1pY0NvbXBvbmVudExvYWRlcixcbiAgSW5qZWN0b3IsXG4gIE5nWm9uZSxcbiAgUmVuZGVyZXIsXG4gIFByb3ZpZGVyLFxuICBWaWV3UmVzb2x2ZXIsXG4gIHByb3ZpZGVcbn0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5pbXBvcnQge0FuaW1hdGlvbkJ1aWxkZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9hbmltYXRlL2FuaW1hdGlvbl9idWlsZGVyJztcbmltcG9ydCB7TW9ja0FuaW1hdGlvbkJ1aWxkZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9tb2NrL2FuaW1hdGlvbl9idWlsZGVyX21vY2snO1xuXG5pbXBvcnQge1Byb3RvVmlld0ZhY3Rvcnl9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9wcm90b192aWV3X2ZhY3RvcnknO1xuaW1wb3J0IHtSZWZsZWN0b3IsIHJlZmxlY3Rvcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvcmVmbGVjdGlvbi9yZWZsZWN0aW9uJztcbmltcG9ydCB7XG4gIEl0ZXJhYmxlRGlmZmVycyxcbiAgZGVmYXVsdEl0ZXJhYmxlRGlmZmVycyxcbiAgS2V5VmFsdWVEaWZmZXJzLFxuICBkZWZhdWx0S2V5VmFsdWVEaWZmZXJzLFxuICBDaGFuZ2VEZXRlY3RvckdlbkNvbmZpZ1xufSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2NoYW5nZV9kZXRlY3Rpb24nO1xuaW1wb3J0IHtFeGNlcHRpb25IYW5kbGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtQaXBlUmVzb2x2ZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9waXBlX3Jlc29sdmVyJztcbmltcG9ydCB7WEhSfSBmcm9tICdhbmd1bGFyMi9zcmMvY29tcGlsZXIveGhyJztcblxuaW1wb3J0IHtET019IGZyb20gJ2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZG9tX2FkYXB0ZXInO1xuXG5pbXBvcnQge01vY2tEaXJlY3RpdmVSZXNvbHZlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL21vY2svZGlyZWN0aXZlX3Jlc29sdmVyX21vY2snO1xuaW1wb3J0IHtNb2NrVmlld1Jlc29sdmVyfSBmcm9tICdhbmd1bGFyMi9zcmMvbW9jay92aWV3X3Jlc29sdmVyX21vY2snO1xuaW1wb3J0IHtNb2NrTG9jYXRpb25TdHJhdGVneX0gZnJvbSAnYW5ndWxhcjIvc3JjL21vY2svbW9ja19sb2NhdGlvbl9zdHJhdGVneSc7XG5pbXBvcnQge0xvY2F0aW9uU3RyYXRlZ3l9IGZyb20gJ2FuZ3VsYXIyL3NyYy9yb3V0ZXIvbG9jYXRpb25fc3RyYXRlZ3knO1xuaW1wb3J0IHtNb2NrTmdab25lfSBmcm9tICdhbmd1bGFyMi9zcmMvbW9jay9uZ196b25lX21vY2snO1xuXG5pbXBvcnQge1Rlc3RDb21wb25lbnRCdWlsZGVyfSBmcm9tICcuL3Rlc3RfY29tcG9uZW50X2J1aWxkZXInO1xuXG5pbXBvcnQge1xuICBFdmVudE1hbmFnZXIsXG4gIEVWRU5UX01BTkFHRVJfUExVR0lOUyxcbiAgRUxFTUVOVF9QUk9CRV9QUk9WSURFUlNcbn0gZnJvbSAnYW5ndWxhcjIvcGxhdGZvcm0vY29tbW9uX2RvbSc7XG5cbmltcG9ydCB7TGlzdFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge0Z1bmN0aW9uV3JhcHBlciwgVHlwZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxuaW1wb3J0IHtBcHBWaWV3UG9vbCwgQVBQX1ZJRVdfUE9PTF9DQVBBQ0lUWX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL3ZpZXdfcG9vbCc7XG5pbXBvcnQge0FwcFZpZXdNYW5hZ2VyVXRpbHN9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci92aWV3X21hbmFnZXJfdXRpbHMnO1xuXG5pbXBvcnQge0RPQ1VNRU5UfSBmcm9tICdhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2RvbV90b2tlbnMnO1xuaW1wb3J0IHtEb21SZW5kZXJlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9kb21fcmVuZGVyZXInO1xuaW1wb3J0IHtEb21TaGFyZWRTdHlsZXNIb3N0fSBmcm9tICdhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL3NoYXJlZF9zdHlsZXNfaG9zdCc7XG5pbXBvcnQge1NoYXJlZFN0eWxlc0hvc3R9IGZyb20gJ2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vc2hhcmVkX3N0eWxlc19ob3N0JztcbmltcG9ydCB7RG9tRXZlbnRzUGx1Z2lufSBmcm9tICdhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2V2ZW50cy9kb21fZXZlbnRzJztcblxuaW1wb3J0IHtTZXJpYWxpemVyfSBmcm9tIFwiYW5ndWxhcjIvc3JjL3dlYl93b3JrZXJzL3NoYXJlZC9zZXJpYWxpemVyXCI7XG5pbXBvcnQge0xvZ30gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQge0NPTVBJTEVSX1BST1ZJREVSU30gZnJvbSAnYW5ndWxhcjIvc3JjL2NvbXBpbGVyL2NvbXBpbGVyJztcbmltcG9ydCB7RG9tUmVuZGVyZXJffSBmcm9tIFwiYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9kb21fcmVuZGVyZXJcIjtcbmltcG9ydCB7RHluYW1pY0NvbXBvbmVudExvYWRlcl99IGZyb20gXCJhbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvZHluYW1pY19jb21wb25lbnRfbG9hZGVyXCI7XG5pbXBvcnQge0FwcFZpZXdNYW5hZ2VyX30gZnJvbSBcImFuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci92aWV3X21hbmFnZXJcIjtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSByb290IGluamVjdG9yIHByb3ZpZGVycy5cbiAqXG4gKiBUaGlzIG11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIF9yb290QmluZGluZ3MgaW4gYXBwbGljYXRpb24uanNcbiAqXG4gKiBAcmV0dXJucyB7YW55W119XG4gKi9cbmZ1bmN0aW9uIF9nZXRSb290UHJvdmlkZXJzKCkge1xuICByZXR1cm4gW3Byb3ZpZGUoUmVmbGVjdG9yLCB7dXNlVmFsdWU6IHJlZmxlY3Rvcn0pXTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBhcHBsaWNhdGlvbiBpbmplY3RvciBwcm92aWRlcnMuXG4gKlxuICogVGhpcyBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIF9pbmplY3RvckJpbmRpbmdzKCkgaW4gYXBwbGljYXRpb24uanNcbiAqXG4gKiBAcmV0dXJucyB7YW55W119XG4gKi9cbmZ1bmN0aW9uIF9nZXRBcHBCaW5kaW5ncygpIHtcbiAgdmFyIGFwcERvYztcblxuICAvLyBUaGUgZG9jdW1lbnQgaXMgb25seSBhdmFpbGFibGUgaW4gYnJvd3NlciBlbnZpcm9ubWVudFxuICB0cnkge1xuICAgIGFwcERvYyA9IERPTS5kZWZhdWx0RG9jKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBhcHBEb2MgPSBudWxsO1xuICB9XG5cbiAgcmV0dXJuIFtcbiAgICBBUFBMSUNBVElPTl9DT01NT05fUFJPVklERVJTLFxuICAgIHByb3ZpZGUoQ2hhbmdlRGV0ZWN0b3JHZW5Db25maWcsIHt1c2VWYWx1ZTogbmV3IENoYW5nZURldGVjdG9yR2VuQ29uZmlnKHRydWUsIGZhbHNlLCB0cnVlKX0pLFxuICAgIHByb3ZpZGUoRE9DVU1FTlQsIHt1c2VWYWx1ZTogYXBwRG9jfSksXG4gICAgcHJvdmlkZShEb21SZW5kZXJlciwge3VzZUNsYXNzOiBEb21SZW5kZXJlcl99KSxcbiAgICBwcm92aWRlKFJlbmRlcmVyLCB7dXNlRXhpc3Rpbmc6IERvbVJlbmRlcmVyfSksXG4gICAgcHJvdmlkZShBUFBfSUQsIHt1c2VWYWx1ZTogJ2EnfSksXG4gICAgRG9tU2hhcmVkU3R5bGVzSG9zdCxcbiAgICBwcm92aWRlKFNoYXJlZFN0eWxlc0hvc3QsIHt1c2VFeGlzdGluZzogRG9tU2hhcmVkU3R5bGVzSG9zdH0pLFxuICAgIEFwcFZpZXdQb29sLFxuICAgIHByb3ZpZGUoQXBwVmlld01hbmFnZXIsIHt1c2VDbGFzczogQXBwVmlld01hbmFnZXJffSksXG4gICAgQXBwVmlld01hbmFnZXJVdGlscyxcbiAgICBTZXJpYWxpemVyLFxuICAgIEVMRU1FTlRfUFJPQkVfUFJPVklERVJTLFxuICAgIHByb3ZpZGUoQVBQX1ZJRVdfUE9PTF9DQVBBQ0lUWSwge3VzZVZhbHVlOiA1MDB9KSxcbiAgICBQcm90b1ZpZXdGYWN0b3J5LFxuICAgIHByb3ZpZGUoRGlyZWN0aXZlUmVzb2x2ZXIsIHt1c2VDbGFzczogTW9ja0RpcmVjdGl2ZVJlc29sdmVyfSksXG4gICAgcHJvdmlkZShWaWV3UmVzb2x2ZXIsIHt1c2VDbGFzczogTW9ja1ZpZXdSZXNvbHZlcn0pLFxuICAgIHByb3ZpZGUoSXRlcmFibGVEaWZmZXJzLCB7dXNlVmFsdWU6IGRlZmF1bHRJdGVyYWJsZURpZmZlcnN9KSxcbiAgICBwcm92aWRlKEtleVZhbHVlRGlmZmVycywge3VzZVZhbHVlOiBkZWZhdWx0S2V5VmFsdWVEaWZmZXJzfSksXG4gICAgTG9nLFxuICAgIHByb3ZpZGUoRHluYW1pY0NvbXBvbmVudExvYWRlciwge3VzZUNsYXNzOiBEeW5hbWljQ29tcG9uZW50TG9hZGVyX30pLFxuICAgIFBpcGVSZXNvbHZlcixcbiAgICBwcm92aWRlKEV4Y2VwdGlvbkhhbmRsZXIsIHt1c2VWYWx1ZTogbmV3IEV4Y2VwdGlvbkhhbmRsZXIoRE9NKX0pLFxuICAgIHByb3ZpZGUoTG9jYXRpb25TdHJhdGVneSwge3VzZUNsYXNzOiBNb2NrTG9jYXRpb25TdHJhdGVneX0pLFxuICAgIHByb3ZpZGUoWEhSLCB7dXNlQ2xhc3M6IERPTS5nZXRYSFIoKX0pLFxuICAgIFRlc3RDb21wb25lbnRCdWlsZGVyLFxuICAgIHByb3ZpZGUoTmdab25lLCB7dXNlQ2xhc3M6IE1vY2tOZ1pvbmV9KSxcbiAgICBwcm92aWRlKEFuaW1hdGlvbkJ1aWxkZXIsIHt1c2VDbGFzczogTW9ja0FuaW1hdGlvbkJ1aWxkZXJ9KSxcbiAgICBFdmVudE1hbmFnZXIsXG4gICAgbmV3IFByb3ZpZGVyKEVWRU5UX01BTkFHRVJfUExVR0lOUywge3VzZUNsYXNzOiBEb21FdmVudHNQbHVnaW4sIG11bHRpOiB0cnVlfSlcbiAgXTtcbn1cblxuZnVuY3Rpb24gX3J1bnRpbWVDb21waWxlckJpbmRpbmdzKCkge1xuICByZXR1cm4gW1xuICAgIHByb3ZpZGUoWEhSLCB7dXNlQ2xhc3M6IERPTS5nZXRYSFIoKX0pLFxuICAgIENPTVBJTEVSX1BST1ZJREVSUyxcbiAgXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRlc3RJbmplY3Rvcihwcm92aWRlcnM6IEFycmF5PFR5cGUgfCBQcm92aWRlciB8IGFueVtdPik6IEluamVjdG9yIHtcbiAgdmFyIHJvb3RJbmplY3RvciA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoX2dldFJvb3RQcm92aWRlcnMoKSk7XG4gIHJldHVybiByb290SW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZUNoaWxkKExpc3RXcmFwcGVyLmNvbmNhdChfZ2V0QXBwQmluZGluZ3MoKSwgcHJvdmlkZXJzKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUZXN0SW5qZWN0b3JXaXRoUnVudGltZUNvbXBpbGVyKFxuICAgIHByb3ZpZGVyczogQXJyYXk8VHlwZSB8IFByb3ZpZGVyIHwgYW55W10+KTogSW5qZWN0b3Ige1xuICByZXR1cm4gY3JlYXRlVGVzdEluamVjdG9yKExpc3RXcmFwcGVyLmNvbmNhdChfcnVudGltZUNvbXBpbGVyQmluZGluZ3MoKSwgcHJvdmlkZXJzKSk7XG59XG5cbi8qKlxuICogQWxsb3dzIGluamVjdGluZyBkZXBlbmRlbmNpZXMgaW4gYGJlZm9yZUVhY2goKWAgYW5kIGBpdCgpYC5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYFxuICogYmVmb3JlRWFjaChpbmplY3QoW0RlcGVuZGVuY3ksIEFDbGFzc10sIChkZXAsIG9iamVjdCkgPT4ge1xuICogICAvLyBzb21lIGNvZGUgdGhhdCB1c2VzIGBkZXBgIGFuZCBgb2JqZWN0YFxuICogICAvLyAuLi5cbiAqIH0pKTtcbiAqXG4gKiBpdCgnLi4uJywgaW5qZWN0KFtBQ2xhc3NdLCAob2JqZWN0KSA9PiB7XG4gKiAgIG9iamVjdC5kb1NvbWV0aGluZygpO1xuICogICBleHBlY3QoLi4uKTtcbiAqIH0pXG4gKiBgYGBcbiAqXG4gKiBOb3RlczpcbiAqIC0gaW5qZWN0IGlzIGN1cnJlbnRseSBhIGZ1bmN0aW9uIGJlY2F1c2Ugb2Ygc29tZSBUcmFjZXVyIGxpbWl0YXRpb24gdGhlIHN5bnRheCBzaG91bGQgZXZlbnR1YWxseVxuICogICBiZWNvbWVzIGBpdCgnLi4uJywgQEluamVjdCAob2JqZWN0OiBBQ2xhc3MsIGFzeW5jOiBBc3luY1Rlc3RDb21wbGV0ZXIpID0+IHsgLi4uIH0pO2BcbiAqXG4gKiBAcGFyYW0ge0FycmF5fSB0b2tlbnNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbldpdGhQYXJhbVRva2Vuc31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdCh0b2tlbnM6IGFueVtdLCBmbjogRnVuY3Rpb24pOiBGdW5jdGlvbldpdGhQYXJhbVRva2VucyB7XG4gIHJldHVybiBuZXcgRnVuY3Rpb25XaXRoUGFyYW1Ub2tlbnModG9rZW5zLCBmbiwgZmFsc2UpO1xufVxuXG4vKipcbiAqIEFsbG93cyBpbmplY3RpbmcgZGVwZW5kZW5jaWVzIGluIGBiZWZvcmVFYWNoKClgIGFuZCBgaXQoKWAuIFRoZSB0ZXN0IG11c3QgcmV0dXJuXG4gKiBhIHByb21pc2Ugd2hpY2ggd2lsbCByZXNvbHZlIHdoZW4gYWxsIGFzeW5jaHJvbm91cyBhY3Rpdml0eSBpcyBjb21wbGV0ZS5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYFxuICogaXQoJy4uLicsIGluamVjdEFzeW5jKFtBQ2xhc3NdLCAob2JqZWN0KSA9PiB7XG4gKiAgIHJldHVybiBvYmplY3QuZG9Tb21ldGhpbmcoKS50aGVuKCgpID0+IHtcbiAqICAgICBleHBlY3QoLi4uKTtcbiAqICAgfSk7XG4gKiB9KVxuICogYGBgXG4gKlxuICogQHBhcmFtIHtBcnJheX0gdG9rZW5zXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHJldHVybiB7RnVuY3Rpb25XaXRoUGFyYW1Ub2tlbnN9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RBc3luYyh0b2tlbnM6IGFueVtdLCBmbjogRnVuY3Rpb24pOiBGdW5jdGlvbldpdGhQYXJhbVRva2VucyB7XG4gIHJldHVybiBuZXcgRnVuY3Rpb25XaXRoUGFyYW1Ub2tlbnModG9rZW5zLCBmbiwgdHJ1ZSk7XG59XG5cbmV4cG9ydCBjbGFzcyBGdW5jdGlvbldpdGhQYXJhbVRva2VucyB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3Rva2VuczogYW55W10sIHByaXZhdGUgX2ZuOiBGdW5jdGlvbiwgcHVibGljIGlzQXN5bmM6IGJvb2xlYW4pIHt9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBleGVjdXRlZCBmdW5jdGlvbi5cbiAgICovXG4gIGV4ZWN1dGUoaW5qZWN0b3I6IEluamVjdG9yKTogYW55IHtcbiAgICB2YXIgcGFyYW1zID0gdGhpcy5fdG9rZW5zLm1hcCh0ID0+IGluamVjdG9yLmdldCh0KSk7XG4gICAgcmV0dXJuIEZ1bmN0aW9uV3JhcHBlci5hcHBseSh0aGlzLl9mbiwgcGFyYW1zKTtcbiAgfVxuXG4gIGhhc1Rva2VuKHRva2VuOiBhbnkpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX3Rva2Vucy5pbmRleE9mKHRva2VuKSA+IC0xOyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvdGVzdGluZy90ZXN0X2luamVjdG9yLnRzXG4gKiovIiwiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5pbXBvcnQge0FuaW1hdGlvbkJ1aWxkZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9hbmltYXRlL2FuaW1hdGlvbl9idWlsZGVyJztcbmltcG9ydCB7Q3NzQW5pbWF0aW9uQnVpbGRlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2FuaW1hdGUvY3NzX2FuaW1hdGlvbl9idWlsZGVyJztcbmltcG9ydCB7Q3NzQW5pbWF0aW9uT3B0aW9uc30gZnJvbSAnYW5ndWxhcjIvc3JjL2FuaW1hdGUvY3NzX2FuaW1hdGlvbl9vcHRpb25zJztcbmltcG9ydCB7QW5pbWF0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvYW5pbWF0ZS9hbmltYXRpb24nO1xuaW1wb3J0IHtCcm93c2VyRGV0YWlsc30gZnJvbSAnYW5ndWxhcjIvc3JjL2FuaW1hdGUvYnJvd3Nlcl9kZXRhaWxzJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE1vY2tBbmltYXRpb25CdWlsZGVyIGV4dGVuZHMgQW5pbWF0aW9uQnVpbGRlciB7XG4gIGNvbnN0cnVjdG9yKCkgeyBzdXBlcihudWxsKTsgfVxuICBjc3MoKTogQ3NzQW5pbWF0aW9uQnVpbGRlciB7IHJldHVybiBuZXcgTW9ja0Nzc0FuaW1hdGlvbkJ1aWxkZXIoKTsgfVxufVxuXG5jbGFzcyBNb2NrQ3NzQW5pbWF0aW9uQnVpbGRlciBleHRlbmRzIENzc0FuaW1hdGlvbkJ1aWxkZXIge1xuICBjb25zdHJ1Y3RvcigpIHsgc3VwZXIobnVsbCk7IH1cbiAgc3RhcnQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBBbmltYXRpb24geyByZXR1cm4gbmV3IE1vY2tBbmltYXRpb24oZWxlbWVudCwgdGhpcy5kYXRhKTsgfVxufVxuXG5jbGFzcyBNb2NrQnJvd3NlckFic3RyYWN0aW9uIGV4dGVuZHMgQnJvd3NlckRldGFpbHMge1xuICBkb2VzRWxhcHNlZFRpbWVJbmNsdWRlc0RlbGF5KCk6IHZvaWQgeyB0aGlzLmVsYXBzZWRUaW1lSW5jbHVkZXNEZWxheSA9IGZhbHNlOyB9XG59XG5cbmNsYXNzIE1vY2tBbmltYXRpb24gZXh0ZW5kcyBBbmltYXRpb24ge1xuICBwcml2YXRlIF9jYWxsYmFjazogRnVuY3Rpb247XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBkYXRhOiBDc3NBbmltYXRpb25PcHRpb25zKSB7XG4gICAgc3VwZXIoZWxlbWVudCwgZGF0YSwgbmV3IE1vY2tCcm93c2VyQWJzdHJhY3Rpb24oKSk7XG4gIH1cbiAgd2FpdChjYWxsYmFjazogRnVuY3Rpb24pIHsgdGhpcy5fY2FsbGJhY2sgPSBjYWxsYmFjazsgfVxuICBmbHVzaCgpIHtcbiAgICB0aGlzLl9jYWxsYmFjaygwKTtcbiAgICB0aGlzLl9jYWxsYmFjayA9IG51bGw7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9tb2NrL2FuaW1hdGlvbl9idWlsZGVyX21vY2sudHNcbiAqKi8iLCJpbXBvcnQge0luamVjdGFibGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpJztcbmltcG9ydCB7TWFwLCBNYXBXcmFwcGVyLCBMaXN0V3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcbmltcG9ydCB7VHlwZSwgaXNQcmVzZW50LCBzdHJpbmdpZnksIGlzQmxhbmssIHByaW50fSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtEaXJlY3RpdmVNZXRhZGF0YSwgQ29tcG9uZW50TWV0YWRhdGF9IGZyb20gJy4uL2NvcmUvbWV0YWRhdGEnO1xuaW1wb3J0IHtEaXJlY3RpdmVSZXNvbHZlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL2RpcmVjdGl2ZV9yZXNvbHZlcic7XG5cbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIERpcmVjdGl2ZVJlc29sdmVyfSB0aGF0IGFsbG93cyBvdmVycmlkaW5nXG4gKiB2YXJpb3VzIHByb3BlcnRpZXMgb2YgZGlyZWN0aXZlcy5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE1vY2tEaXJlY3RpdmVSZXNvbHZlciBleHRlbmRzIERpcmVjdGl2ZVJlc29sdmVyIHtcbiAgcHJpdmF0ZSBfcHJvdmlkZXJPdmVycmlkZXMgPSBuZXcgTWFwPFR5cGUsIGFueVtdPigpO1xuICBwcml2YXRlIHZpZXdQcm92aWRlck92ZXJyaWRlcyA9IG5ldyBNYXA8VHlwZSwgYW55W10+KCk7XG5cbiAgcmVzb2x2ZSh0eXBlOiBUeXBlKTogRGlyZWN0aXZlTWV0YWRhdGEge1xuICAgIHZhciBkbSA9IHN1cGVyLnJlc29sdmUodHlwZSk7XG5cbiAgICB2YXIgcHJvdmlkZXJPdmVycmlkZXMgPSB0aGlzLl9wcm92aWRlck92ZXJyaWRlcy5nZXQodHlwZSk7XG4gICAgdmFyIHZpZXdQcm92aWRlck92ZXJyaWRlcyA9IHRoaXMudmlld1Byb3ZpZGVyT3ZlcnJpZGVzLmdldCh0eXBlKTtcblxuICAgIHZhciBwcm92aWRlcnMgPSBkbS5wcm92aWRlcnM7XG4gICAgaWYgKGlzUHJlc2VudChwcm92aWRlck92ZXJyaWRlcykpIHtcbiAgICAgIHByb3ZpZGVycyA9IGRtLnByb3ZpZGVycy5jb25jYXQocHJvdmlkZXJPdmVycmlkZXMpO1xuICAgIH1cblxuICAgIGlmIChkbSBpbnN0YW5jZW9mIENvbXBvbmVudE1ldGFkYXRhKSB7XG4gICAgICB2YXIgdmlld1Byb3ZpZGVycyA9IGRtLnZpZXdQcm92aWRlcnM7XG4gICAgICBpZiAoaXNQcmVzZW50KHZpZXdQcm92aWRlck92ZXJyaWRlcykpIHtcbiAgICAgICAgdmlld1Byb3ZpZGVycyA9IGRtLnZpZXdQcm92aWRlcnMuY29uY2F0KHZpZXdQcm92aWRlck92ZXJyaWRlcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50TWV0YWRhdGEoe1xuICAgICAgICBzZWxlY3RvcjogZG0uc2VsZWN0b3IsXG4gICAgICAgIGlucHV0czogZG0uaW5wdXRzLFxuICAgICAgICBvdXRwdXRzOiBkbS5vdXRwdXRzLFxuICAgICAgICBob3N0OiBkbS5ob3N0LFxuICAgICAgICBleHBvcnRBczogZG0uZXhwb3J0QXMsXG4gICAgICAgIG1vZHVsZUlkOiBkbS5tb2R1bGVJZCxcbiAgICAgICAgcXVlcmllczogZG0ucXVlcmllcyxcbiAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBkbS5jaGFuZ2VEZXRlY3Rpb24sXG4gICAgICAgIHByb3ZpZGVyczogcHJvdmlkZXJzLFxuICAgICAgICB2aWV3UHJvdmlkZXJzOiB2aWV3UHJvdmlkZXJzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IERpcmVjdGl2ZU1ldGFkYXRhKHtcbiAgICAgIHNlbGVjdG9yOiBkbS5zZWxlY3RvcixcbiAgICAgIGlucHV0czogZG0uaW5wdXRzLFxuICAgICAgb3V0cHV0czogZG0ub3V0cHV0cyxcbiAgICAgIGhvc3Q6IGRtLmhvc3QsXG4gICAgICBwcm92aWRlcnM6IHByb3ZpZGVycyxcbiAgICAgIGV4cG9ydEFzOiBkbS5leHBvcnRBcyxcbiAgICAgIHF1ZXJpZXM6IGRtLnF1ZXJpZXNcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgc2V0QmluZGluZ3NPdmVycmlkZSh0eXBlOiBUeXBlLCBiaW5kaW5nczogYW55W10pOiB2b2lkIHtcbiAgICB0aGlzLl9wcm92aWRlck92ZXJyaWRlcy5zZXQodHlwZSwgYmluZGluZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBzZXRWaWV3QmluZGluZ3NPdmVycmlkZSh0eXBlOiBUeXBlLCB2aWV3QmluZGluZ3M6IGFueVtdKTogdm9pZCB7XG4gICAgdGhpcy52aWV3UHJvdmlkZXJPdmVycmlkZXMuc2V0KHR5cGUsIHZpZXdCaW5kaW5ncyk7XG4gIH1cblxuICBzZXRQcm92aWRlcnNPdmVycmlkZSh0eXBlOiBUeXBlLCBiaW5kaW5nczogYW55W10pOiB2b2lkIHtcbiAgICB0aGlzLl9wcm92aWRlck92ZXJyaWRlcy5zZXQodHlwZSwgYmluZGluZ3MpO1xuICB9XG5cbiAgc2V0Vmlld1Byb3ZpZGVyc092ZXJyaWRlKHR5cGU6IFR5cGUsIHZpZXdCaW5kaW5nczogYW55W10pOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdQcm92aWRlck92ZXJyaWRlcy5zZXQodHlwZSwgdmlld0JpbmRpbmdzKTtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL21vY2svZGlyZWN0aXZlX3Jlc29sdmVyX21vY2sudHNcbiAqKi8iLCJpbXBvcnQge0luamVjdGFibGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpJztcbmltcG9ydCB7TWFwLCBNYXBXcmFwcGVyLCBMaXN0V3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcbmltcG9ydCB7VHlwZSwgaXNQcmVzZW50LCBzdHJpbmdpZnksIGlzQmxhbmt9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge0Jhc2VFeGNlcHRpb24sIFdyYXBwZWRFeGNlcHRpb259IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9ucyc7XG5cbmltcG9ydCB7Vmlld01ldGFkYXRhfSBmcm9tICcuLi9jb3JlL21ldGFkYXRhJztcbmltcG9ydCB7Vmlld1Jlc29sdmVyfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvdmlld19yZXNvbHZlcic7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBNb2NrVmlld1Jlc29sdmVyIGV4dGVuZHMgVmlld1Jlc29sdmVyIHtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfdmlld3MgPSBuZXcgTWFwPFR5cGUsIFZpZXdNZXRhZGF0YT4oKTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfaW5saW5lVGVtcGxhdGVzID0gbmV3IE1hcDxUeXBlLCBzdHJpbmc+KCk7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3ZpZXdDYWNoZSA9IG5ldyBNYXA8VHlwZSwgVmlld01ldGFkYXRhPigpO1xuICAvKiogQGludGVybmFsICovXG4gIF9kaXJlY3RpdmVPdmVycmlkZXMgPSBuZXcgTWFwPFR5cGUsIE1hcDxUeXBlLCBUeXBlPj4oKTtcblxuICBjb25zdHJ1Y3RvcigpIHsgc3VwZXIoKTsgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZXMgdGhlIHtAbGluayBWaWV3TWV0YWRhdGF9IGZvciBhIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHtUeXBlfSBjb21wb25lbnRcbiAgICogQHBhcmFtIHtWaWV3RGVmaW5pdGlvbn0gdmlld1xuICAgKi9cbiAgc2V0Vmlldyhjb21wb25lbnQ6IFR5cGUsIHZpZXc6IFZpZXdNZXRhZGF0YSk6IHZvaWQge1xuICAgIHRoaXMuX2NoZWNrT3ZlcnJpZGVhYmxlKGNvbXBvbmVudCk7XG4gICAgdGhpcy5fdmlld3Muc2V0KGNvbXBvbmVudCwgdmlldyk7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGVzIHRoZSBpbmxpbmUgdGVtcGxhdGUgZm9yIGEgY29tcG9uZW50IC0gb3RoZXIgY29uZmlndXJhdGlvbiByZW1haW5zIHVuY2hhbmdlZC5cbiAgICpcbiAgICogQHBhcmFtIHtUeXBlfSBjb21wb25lbnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlbXBsYXRlXG4gICAqL1xuICBzZXRJbmxpbmVUZW1wbGF0ZShjb21wb25lbnQ6IFR5cGUsIHRlbXBsYXRlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9jaGVja092ZXJyaWRlYWJsZShjb21wb25lbnQpO1xuICAgIHRoaXMuX2lubGluZVRlbXBsYXRlcy5zZXQoY29tcG9uZW50LCB0ZW1wbGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGVzIGEgZGlyZWN0aXZlIGZyb20gdGhlIGNvbXBvbmVudCB7QGxpbmsgVmlld01ldGFkYXRhfS5cbiAgICpcbiAgICogQHBhcmFtIHtUeXBlfSBjb21wb25lbnRcbiAgICogQHBhcmFtIHtUeXBlfSBmcm9tXG4gICAqIEBwYXJhbSB7VHlwZX0gdG9cbiAgICovXG4gIG92ZXJyaWRlVmlld0RpcmVjdGl2ZShjb21wb25lbnQ6IFR5cGUsIGZyb206IFR5cGUsIHRvOiBUeXBlKTogdm9pZCB7XG4gICAgdGhpcy5fY2hlY2tPdmVycmlkZWFibGUoY29tcG9uZW50KTtcblxuICAgIHZhciBvdmVycmlkZXMgPSB0aGlzLl9kaXJlY3RpdmVPdmVycmlkZXMuZ2V0KGNvbXBvbmVudCk7XG5cbiAgICBpZiAoaXNCbGFuayhvdmVycmlkZXMpKSB7XG4gICAgICBvdmVycmlkZXMgPSBuZXcgTWFwPFR5cGUsIFR5cGU+KCk7XG4gICAgICB0aGlzLl9kaXJlY3RpdmVPdmVycmlkZXMuc2V0KGNvbXBvbmVudCwgb3ZlcnJpZGVzKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZXMuc2V0KGZyb20sIHRvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVmlld01ldGFkYXRhfSBmb3IgYSBjb21wb25lbnQ6XG4gICAqIC0gU2V0IHRoZSB7QGxpbmsgVmlld01ldGFkYXRhfSB0byB0aGUgb3ZlcnJpZGRlbiB2aWV3IHdoZW4gaXQgZXhpc3RzIG9yIGZhbGxiYWNrIHRvIHRoZSBkZWZhdWx0XG4gICAqIGBWaWV3UmVzb2x2ZXJgLFxuICAgKiAgIHNlZSBgc2V0Vmlld2AuXG4gICAqIC0gT3ZlcnJpZGUgdGhlIGRpcmVjdGl2ZXMsIHNlZSBgb3ZlcnJpZGVWaWV3RGlyZWN0aXZlYC5cbiAgICogLSBPdmVycmlkZSB0aGUgQFZpZXcgZGVmaW5pdGlvbiwgc2VlIGBzZXRJbmxpbmVUZW1wbGF0ZWAuXG4gICAqXG4gICAqIEBwYXJhbSBjb21wb25lbnRcbiAgICogQHJldHVybnMge1ZpZXdEZWZpbml0aW9ufVxuICAgKi9cbiAgcmVzb2x2ZShjb21wb25lbnQ6IFR5cGUpOiBWaWV3TWV0YWRhdGEge1xuICAgIHZhciB2aWV3ID0gdGhpcy5fdmlld0NhY2hlLmdldChjb21wb25lbnQpO1xuICAgIGlmIChpc1ByZXNlbnQodmlldykpIHJldHVybiB2aWV3O1xuXG4gICAgdmlldyA9IHRoaXMuX3ZpZXdzLmdldChjb21wb25lbnQpO1xuICAgIGlmIChpc0JsYW5rKHZpZXcpKSB7XG4gICAgICB2aWV3ID0gc3VwZXIucmVzb2x2ZShjb21wb25lbnQpO1xuICAgIH1cblxuICAgIHZhciBkaXJlY3RpdmVzID0gdmlldy5kaXJlY3RpdmVzO1xuICAgIHZhciBvdmVycmlkZXMgPSB0aGlzLl9kaXJlY3RpdmVPdmVycmlkZXMuZ2V0KGNvbXBvbmVudCk7XG5cbiAgICBpZiAoaXNQcmVzZW50KG92ZXJyaWRlcykgJiYgaXNQcmVzZW50KGRpcmVjdGl2ZXMpKSB7XG4gICAgICBkaXJlY3RpdmVzID0gTGlzdFdyYXBwZXIuY2xvbmUodmlldy5kaXJlY3RpdmVzKTtcbiAgICAgIG92ZXJyaWRlcy5mb3JFYWNoKCh0bywgZnJvbSkgPT4ge1xuICAgICAgICB2YXIgc3JjSW5kZXggPSBkaXJlY3RpdmVzLmluZGV4T2YoZnJvbSk7XG4gICAgICAgIGlmIChzcmNJbmRleCA9PSAtMSkge1xuICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKFxuICAgICAgICAgICAgICBgT3ZlcnJpZGVuIGRpcmVjdGl2ZSAke3N0cmluZ2lmeShmcm9tKX0gbm90IGZvdW5kIGluIHRoZSB0ZW1wbGF0ZSBvZiAke3N0cmluZ2lmeShjb21wb25lbnQpfWApO1xuICAgICAgICB9XG4gICAgICAgIGRpcmVjdGl2ZXNbc3JjSW5kZXhdID0gdG87XG4gICAgICB9KTtcbiAgICAgIHZpZXcgPSBuZXcgVmlld01ldGFkYXRhKFxuICAgICAgICAgIHt0ZW1wbGF0ZTogdmlldy50ZW1wbGF0ZSwgdGVtcGxhdGVVcmw6IHZpZXcudGVtcGxhdGVVcmwsIGRpcmVjdGl2ZXM6IGRpcmVjdGl2ZXN9KTtcbiAgICB9XG5cbiAgICB2YXIgaW5saW5lVGVtcGxhdGUgPSB0aGlzLl9pbmxpbmVUZW1wbGF0ZXMuZ2V0KGNvbXBvbmVudCk7XG4gICAgaWYgKGlzUHJlc2VudChpbmxpbmVUZW1wbGF0ZSkpIHtcbiAgICAgIHZpZXcgPSBuZXcgVmlld01ldGFkYXRhKFxuICAgICAgICAgIHt0ZW1wbGF0ZTogaW5saW5lVGVtcGxhdGUsIHRlbXBsYXRlVXJsOiBudWxsLCBkaXJlY3RpdmVzOiB2aWV3LmRpcmVjdGl2ZXN9KTtcbiAgICB9XG5cbiAgICB0aGlzLl92aWV3Q2FjaGUuc2V0KGNvbXBvbmVudCwgdmlldyk7XG4gICAgcmV0dXJuIHZpZXc7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqXG4gICAqIE9uY2UgYSBjb21wb25lbnQgaGFzIGJlZW4gY29tcGlsZWQsIHRoZSBBcHBQcm90b1ZpZXcgaXMgc3RvcmVkIGluIHRoZSBjb21waWxlciBjYWNoZS5cbiAgICpcbiAgICogVGhlbiBpdCBzaG91bGQgbm90IGJlIHBvc3NpYmxlIHRvIG92ZXJyaWRlIHRoZSBjb21wb25lbnQgY29uZmlndXJhdGlvbiBhZnRlciB0aGUgY29tcG9uZW50XG4gICAqIGhhcyBiZWVuIGNvbXBpbGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge1R5cGV9IGNvbXBvbmVudFxuICAgKi9cbiAgX2NoZWNrT3ZlcnJpZGVhYmxlKGNvbXBvbmVudDogVHlwZSk6IHZvaWQge1xuICAgIHZhciBjYWNoZWQgPSB0aGlzLl92aWV3Q2FjaGUuZ2V0KGNvbXBvbmVudCk7XG5cbiAgICBpZiAoaXNQcmVzZW50KGNhY2hlZCkpIHtcbiAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKFxuICAgICAgICAgIGBUaGUgY29tcG9uZW50ICR7c3RyaW5naWZ5KGNvbXBvbmVudCl9IGhhcyBhbHJlYWR5IGJlZW4gY29tcGlsZWQsIGl0cyBjb25maWd1cmF0aW9uIGNhbiBub3QgYmUgY2hhbmdlZGApO1xuICAgIH1cbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL21vY2svdmlld19yZXNvbHZlcl9tb2NrLnRzXG4gKiovIiwiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5pbXBvcnQge0V2ZW50RW1pdHRlciwgT2JzZXJ2YWJsZVdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvYXN5bmMnO1xuaW1wb3J0IHtMb2NhdGlvblN0cmF0ZWd5fSBmcm9tICdhbmd1bGFyMi9zcmMvcm91dGVyL2xvY2F0aW9uX3N0cmF0ZWd5JztcblxuXG4vKipcbiAqIEEgbW9jayBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgTG9jYXRpb25TdHJhdGVneX0gdGhhdCBhbGxvd3MgdGVzdHMgdG8gZmlyZSBzaW11bGF0ZWRcbiAqIGxvY2F0aW9uIGV2ZW50cy5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE1vY2tMb2NhdGlvblN0cmF0ZWd5IGV4dGVuZHMgTG9jYXRpb25TdHJhdGVneSB7XG4gIGludGVybmFsQmFzZUhyZWY6IHN0cmluZyA9ICcvJztcbiAgaW50ZXJuYWxQYXRoOiBzdHJpbmcgPSAnLyc7XG4gIGludGVybmFsVGl0bGU6IHN0cmluZyA9ICcnO1xuICB1cmxDaGFuZ2VzOiBzdHJpbmdbXSA9IFtdO1xuICAvKiogQGludGVybmFsICovXG4gIF9zdWJqZWN0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgY29uc3RydWN0b3IoKSB7IHN1cGVyKCk7IH1cblxuICBzaW11bGF0ZVBvcFN0YXRlKHVybDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5pbnRlcm5hbFBhdGggPSB1cmw7XG4gICAgT2JzZXJ2YWJsZVdyYXBwZXIuY2FsbEVtaXQodGhpcy5fc3ViamVjdCwgbmV3IF9Nb2NrUG9wU3RhdGVFdmVudCh0aGlzLnBhdGgoKSkpO1xuICB9XG5cbiAgcGF0aCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5pbnRlcm5hbFBhdGg7IH1cblxuICBwcmVwYXJlRXh0ZXJuYWxVcmwoaW50ZXJuYWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGludGVybmFsLnN0YXJ0c1dpdGgoJy8nKSAmJiB0aGlzLmludGVybmFsQmFzZUhyZWYuZW5kc1dpdGgoJy8nKSkge1xuICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxCYXNlSHJlZiArIGludGVybmFsLnN1YnN0cmluZygxKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxCYXNlSHJlZiArIGludGVybmFsO1xuICB9XG5cbiAgcHVzaFN0YXRlKGN0eDogYW55LCB0aXRsZTogc3RyaW5nLCBwYXRoOiBzdHJpbmcsIHF1ZXJ5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmludGVybmFsVGl0bGUgPSB0aXRsZTtcblxuICAgIHZhciB1cmwgPSBwYXRoICsgKHF1ZXJ5Lmxlbmd0aCA+IDAgPyAoJz8nICsgcXVlcnkpIDogJycpO1xuICAgIHRoaXMuaW50ZXJuYWxQYXRoID0gdXJsO1xuXG4gICAgdmFyIGV4dGVybmFsVXJsID0gdGhpcy5wcmVwYXJlRXh0ZXJuYWxVcmwodXJsKTtcbiAgICB0aGlzLnVybENoYW5nZXMucHVzaChleHRlcm5hbFVybCk7XG4gIH1cblxuICByZXBsYWNlU3RhdGUoY3R4OiBhbnksIHRpdGxlOiBzdHJpbmcsIHBhdGg6IHN0cmluZywgcXVlcnk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuaW50ZXJuYWxUaXRsZSA9IHRpdGxlO1xuXG4gICAgdmFyIHVybCA9IHBhdGggKyAocXVlcnkubGVuZ3RoID4gMCA/ICgnPycgKyBxdWVyeSkgOiAnJyk7XG4gICAgdGhpcy5pbnRlcm5hbFBhdGggPSB1cmw7XG5cbiAgICB2YXIgZXh0ZXJuYWxVcmwgPSB0aGlzLnByZXBhcmVFeHRlcm5hbFVybCh1cmwpO1xuICAgIHRoaXMudXJsQ2hhbmdlcy5wdXNoKCdyZXBsYWNlOiAnICsgZXh0ZXJuYWxVcmwpO1xuICB9XG5cbiAgb25Qb3BTdGF0ZShmbjogKHZhbHVlOiBhbnkpID0+IHZvaWQpOiB2b2lkIHsgT2JzZXJ2YWJsZVdyYXBwZXIuc3Vic2NyaWJlKHRoaXMuX3N1YmplY3QsIGZuKTsgfVxuXG4gIGdldEJhc2VIcmVmKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmludGVybmFsQmFzZUhyZWY7IH1cblxuICBiYWNrKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnVybENoYW5nZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy51cmxDaGFuZ2VzLnBvcCgpO1xuICAgICAgdmFyIG5leHRVcmwgPSB0aGlzLnVybENoYW5nZXMubGVuZ3RoID4gMCA/IHRoaXMudXJsQ2hhbmdlc1t0aGlzLnVybENoYW5nZXMubGVuZ3RoIC0gMV0gOiAnJztcbiAgICAgIHRoaXMuc2ltdWxhdGVQb3BTdGF0ZShuZXh0VXJsKTtcbiAgICB9XG4gIH1cblxuICBmb3J3YXJkKCk6IHZvaWQgeyB0aHJvdyAnbm90IGltcGxlbWVudGVkJzsgfVxufVxuXG5jbGFzcyBfTW9ja1BvcFN0YXRlRXZlbnQge1xuICBwb3A6IGJvb2xlYW4gPSB0cnVlO1xuICB0eXBlOiBzdHJpbmcgPSAncG9wc3RhdGUnO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmV3VXJsOiBzdHJpbmcpIHt9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvbW9jay9tb2NrX2xvY2F0aW9uX3N0cmF0ZWd5LnRzXG4gKiovIiwiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5pbXBvcnQge05nWm9uZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvem9uZS9uZ196b25lJztcbmltcG9ydCB7RXZlbnRFbWl0dGVyLCBPYnNlcnZhYmxlV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9hc3luYyc7XG5cbi8qKlxuICogQSBtb2NrIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBOZ1pvbmV9LlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTW9ja05nWm9uZSBleHRlbmRzIE5nWm9uZSB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX21vY2tPbkV2ZW50RG9uZTogRXZlbnRFbWl0dGVyPGFueT47XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoe2VuYWJsZUxvbmdTdGFja1RyYWNlOiBmYWxzZX0pO1xuICAgIHRoaXMuX21vY2tPbkV2ZW50RG9uZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PihmYWxzZSk7XG4gIH1cblxuICBnZXQgb25FdmVudERvbmUoKSB7IHJldHVybiB0aGlzLl9tb2NrT25FdmVudERvbmU7IH1cblxuICBydW4oZm46IEZ1bmN0aW9uKTogYW55IHsgcmV0dXJuIGZuKCk7IH1cblxuICBydW5PdXRzaWRlQW5ndWxhcihmbjogRnVuY3Rpb24pOiBhbnkgeyByZXR1cm4gZm4oKTsgfVxuXG4gIHNpbXVsYXRlWm9uZUV4aXQoKTogdm9pZCB7IE9ic2VydmFibGVXcmFwcGVyLmNhbGxOZXh0KHRoaXMub25FdmVudERvbmUsIG51bGwpOyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvbW9jay9uZ196b25lX21vY2sudHNcbiAqKi8iLCJpbXBvcnQge1xuICBDb21wb25lbnRSZWYsXG4gIERlYnVnRWxlbWVudCxcbiAgRGlyZWN0aXZlUmVzb2x2ZXIsXG4gIER5bmFtaWNDb21wb25lbnRMb2FkZXIsXG4gIEluamVjdG9yLFxuICBJbmplY3RhYmxlLFxuICBWaWV3TWV0YWRhdGEsXG4gIFZpZXdSZWYsXG4gIFZpZXdSZXNvbHZlcixcbiAgcHJvdmlkZVxufSBmcm9tICdhbmd1bGFyMi9jb3JlJztcblxuaW1wb3J0IHtUeXBlLCBpc1ByZXNlbnQsIGlzQmxhbmt9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge1Byb21pc2V9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvYXN5bmMnO1xuaW1wb3J0IHtMaXN0V3JhcHBlciwgTWFwV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcblxuaW1wb3J0IHtBcHBWaWV3fSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvdmlldyc7XG5pbXBvcnQge2ludGVybmFsVmlld30gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL3ZpZXdfcmVmJztcblxuaW1wb3J0IHtlbH0gZnJvbSAnLi91dGlscyc7XG5cbmltcG9ydCB7RE9DVU1FTlR9IGZyb20gJ2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZG9tX3Rva2Vucyc7XG5pbXBvcnQge0RPTX0gZnJvbSAnYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9kb21fYWRhcHRlcic7XG5cbmltcG9ydCB7RGVidWdFbGVtZW50X30gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvZGVidWcvZGVidWdfZWxlbWVudCc7XG5cblxuLyoqXG4gKiBGaXh0dXJlIGZvciBkZWJ1Z2dpbmcgYW5kIHRlc3RpbmcgYSBjb21wb25lbnQuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb21wb25lbnRGaXh0dXJlIHtcbiAgLyoqXG4gICAqIFRoZSBEZWJ1Z0VsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSByb290IGVsZW1lbnQgb2YgdGhpcyBjb21wb25lbnQuXG4gICAqL1xuICBkZWJ1Z0VsZW1lbnQ6IERlYnVnRWxlbWVudDtcblxuICAvKipcbiAgICogVGhlIGluc3RhbmNlIG9mIHRoZSByb290IGNvbXBvbmVudCBjbGFzcy5cbiAgICovXG4gIGNvbXBvbmVudEluc3RhbmNlOiBhbnk7XG5cbiAgLyoqXG4gICAqIFRoZSBuYXRpdmUgZWxlbWVudCBhdCB0aGUgcm9vdCBvZiB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgbmF0aXZlRWxlbWVudDogYW55O1xuXG4gIC8qKlxuICAgKiBUcmlnZ2VyIGEgY2hhbmdlIGRldGVjdGlvbiBjeWNsZSBmb3IgdGhlIGNvbXBvbmVudC5cbiAgICovXG4gIGFic3RyYWN0IGRldGVjdENoYW5nZXMoKTogdm9pZDtcblxuICAvKipcbiAgICogVHJpZ2dlciBjb21wb25lbnQgZGVzdHJ1Y3Rpb24uXG4gICAqL1xuICBhYnN0cmFjdCBkZXN0cm95KCk6IHZvaWQ7XG59XG5cblxuZXhwb3J0IGNsYXNzIENvbXBvbmVudEZpeHR1cmVfIGV4dGVuZHMgQ29tcG9uZW50Rml4dHVyZSB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2NvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmO1xuICAvKiogQGludGVybmFsICovXG4gIF9jb21wb25lbnRQYXJlbnRWaWV3OiBBcHBWaWV3O1xuXG4gIGNvbnN0cnVjdG9yKGNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmRlYnVnRWxlbWVudCA9IG5ldyBEZWJ1Z0VsZW1lbnRfKGludGVybmFsVmlldyg8Vmlld1JlZj5jb21wb25lbnRSZWYuaG9zdFZpZXcpLCAwKTtcbiAgICB0aGlzLmNvbXBvbmVudEluc3RhbmNlID0gdGhpcy5kZWJ1Z0VsZW1lbnQuY29tcG9uZW50SW5zdGFuY2U7XG4gICAgdGhpcy5uYXRpdmVFbGVtZW50ID0gdGhpcy5kZWJ1Z0VsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICB0aGlzLl9jb21wb25lbnRQYXJlbnRWaWV3ID0gaW50ZXJuYWxWaWV3KDxWaWV3UmVmPmNvbXBvbmVudFJlZi5ob3N0Vmlldyk7XG4gICAgdGhpcy5fY29tcG9uZW50UmVmID0gY29tcG9uZW50UmVmO1xuICB9XG5cbiAgZGV0ZWN0Q2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLl9jb21wb25lbnRQYXJlbnRWaWV3LmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICB0aGlzLl9jb21wb25lbnRQYXJlbnRWaWV3LmNoYW5nZURldGVjdG9yLmNoZWNrTm9DaGFuZ2VzKCk7XG4gIH1cblxuICBkZXN0cm95KCk6IHZvaWQgeyB0aGlzLl9jb21wb25lbnRSZWYuZGlzcG9zZSgpOyB9XG59XG5cbnZhciBfbmV4dFJvb3RFbGVtZW50SWQgPSAwO1xuXG4vKipcbiAqIEJ1aWxkcyBhIENvbXBvbmVudEZpeHR1cmUgZm9yIHVzZSBpbiBjb21wb25lbnQgbGV2ZWwgdGVzdHMuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBUZXN0Q29tcG9uZW50QnVpbGRlciB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2JpbmRpbmdzT3ZlcnJpZGVzID0gbmV3IE1hcDxUeXBlLCBhbnlbXT4oKTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZGlyZWN0aXZlT3ZlcnJpZGVzID0gbmV3IE1hcDxUeXBlLCBNYXA8VHlwZSwgVHlwZT4+KCk7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3RlbXBsYXRlT3ZlcnJpZGVzID0gbmV3IE1hcDxUeXBlLCBzdHJpbmc+KCk7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3ZpZXdCaW5kaW5nc092ZXJyaWRlcyA9IG5ldyBNYXA8VHlwZSwgYW55W10+KCk7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3ZpZXdPdmVycmlkZXMgPSBuZXcgTWFwPFR5cGUsIFZpZXdNZXRhZGF0YT4oKTtcblxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2luamVjdG9yOiBJbmplY3Rvcikge31cblxuICAvKiogQGludGVybmFsICovXG4gIF9jbG9uZSgpOiBUZXN0Q29tcG9uZW50QnVpbGRlciB7XG4gICAgdmFyIGNsb25lID0gbmV3IFRlc3RDb21wb25lbnRCdWlsZGVyKHRoaXMuX2luamVjdG9yKTtcbiAgICBjbG9uZS5fdmlld092ZXJyaWRlcyA9IE1hcFdyYXBwZXIuY2xvbmUodGhpcy5fdmlld092ZXJyaWRlcyk7XG4gICAgY2xvbmUuX2RpcmVjdGl2ZU92ZXJyaWRlcyA9IE1hcFdyYXBwZXIuY2xvbmUodGhpcy5fZGlyZWN0aXZlT3ZlcnJpZGVzKTtcbiAgICBjbG9uZS5fdGVtcGxhdGVPdmVycmlkZXMgPSBNYXBXcmFwcGVyLmNsb25lKHRoaXMuX3RlbXBsYXRlT3ZlcnJpZGVzKTtcbiAgICByZXR1cm4gY2xvbmU7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGVzIG9ubHkgdGhlIGh0bWwgb2YgYSB7QGxpbmsgQ29tcG9uZW50TWV0YWRhdGF9LlxuICAgKiBBbGwgdGhlIG90aGVyIHByb3BlcnRpZXMgb2YgdGhlIGNvbXBvbmVudCdzIHtAbGluayBWaWV3TWV0YWRhdGF9IGFyZSBwcmVzZXJ2ZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7VHlwZX0gY29tcG9uZW50XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBodG1sXG4gICAqXG4gICAqIEByZXR1cm4ge1Rlc3RDb21wb25lbnRCdWlsZGVyfVxuICAgKi9cbiAgb3ZlcnJpZGVUZW1wbGF0ZShjb21wb25lbnRUeXBlOiBUeXBlLCB0ZW1wbGF0ZTogc3RyaW5nKTogVGVzdENvbXBvbmVudEJ1aWxkZXIge1xuICAgIHZhciBjbG9uZSA9IHRoaXMuX2Nsb25lKCk7XG4gICAgY2xvbmUuX3RlbXBsYXRlT3ZlcnJpZGVzLnNldChjb21wb25lbnRUeXBlLCB0ZW1wbGF0ZSk7XG4gICAgcmV0dXJuIGNsb25lO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlcyBhIGNvbXBvbmVudCdzIHtAbGluayBWaWV3TWV0YWRhdGF9LlxuICAgKlxuICAgKiBAcGFyYW0ge1R5cGV9IGNvbXBvbmVudFxuICAgKiBAcGFyYW0ge3ZpZXd9IFZpZXdcbiAgICpcbiAgICogQHJldHVybiB7VGVzdENvbXBvbmVudEJ1aWxkZXJ9XG4gICAqL1xuICBvdmVycmlkZVZpZXcoY29tcG9uZW50VHlwZTogVHlwZSwgdmlldzogVmlld01ldGFkYXRhKTogVGVzdENvbXBvbmVudEJ1aWxkZXIge1xuICAgIHZhciBjbG9uZSA9IHRoaXMuX2Nsb25lKCk7XG4gICAgY2xvbmUuX3ZpZXdPdmVycmlkZXMuc2V0KGNvbXBvbmVudFR5cGUsIHZpZXcpO1xuICAgIHJldHVybiBjbG9uZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZXMgdGhlIGRpcmVjdGl2ZXMgZnJvbSB0aGUgY29tcG9uZW50IHtAbGluayBWaWV3TWV0YWRhdGF9LlxuICAgKlxuICAgKiBAcGFyYW0ge1R5cGV9IGNvbXBvbmVudFxuICAgKiBAcGFyYW0ge1R5cGV9IGZyb21cbiAgICogQHBhcmFtIHtUeXBlfSB0b1xuICAgKlxuICAgKiBAcmV0dXJuIHtUZXN0Q29tcG9uZW50QnVpbGRlcn1cbiAgICovXG4gIG92ZXJyaWRlRGlyZWN0aXZlKGNvbXBvbmVudFR5cGU6IFR5cGUsIGZyb206IFR5cGUsIHRvOiBUeXBlKTogVGVzdENvbXBvbmVudEJ1aWxkZXIge1xuICAgIHZhciBjbG9uZSA9IHRoaXMuX2Nsb25lKCk7XG4gICAgdmFyIG92ZXJyaWRlc0ZvckNvbXBvbmVudCA9IGNsb25lLl9kaXJlY3RpdmVPdmVycmlkZXMuZ2V0KGNvbXBvbmVudFR5cGUpO1xuICAgIGlmICghaXNQcmVzZW50KG92ZXJyaWRlc0ZvckNvbXBvbmVudCkpIHtcbiAgICAgIGNsb25lLl9kaXJlY3RpdmVPdmVycmlkZXMuc2V0KGNvbXBvbmVudFR5cGUsIG5ldyBNYXA8VHlwZSwgVHlwZT4oKSk7XG4gICAgICBvdmVycmlkZXNGb3JDb21wb25lbnQgPSBjbG9uZS5fZGlyZWN0aXZlT3ZlcnJpZGVzLmdldChjb21wb25lbnRUeXBlKTtcbiAgICB9XG4gICAgb3ZlcnJpZGVzRm9yQ29tcG9uZW50LnNldChmcm9tLCB0byk7XG4gICAgcmV0dXJuIGNsb25lO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlcyBvbmUgb3IgbW9yZSBpbmplY3RhYmxlcyBjb25maWd1cmVkIHZpYSBgcHJvdmlkZXJzYCBtZXRhZGF0YSBwcm9wZXJ0eSBvZiBhIGRpcmVjdGl2ZVxuICAgKiBvclxuICAgKiBjb21wb25lbnQuXG4gICAqIFZlcnkgdXNlZnVsIHdoZW4gY2VydGFpbiBwcm92aWRlcnMgbmVlZCB0byBiZSBtb2NrZWQgb3V0LlxuICAgKlxuICAgKiBUaGUgcHJvdmlkZXJzIHNwZWNpZmllZCB2aWEgdGhpcyBtZXRob2QgYXJlIGFwcGVuZGVkIHRvIHRoZSBleGlzdGluZyBgcHJvdmlkZXJzYCBjYXVzaW5nIHRoZVxuICAgKiBkdXBsaWNhdGVkIHByb3ZpZGVycyB0b1xuICAgKiBiZSBvdmVycmlkZGVuLlxuICAgKlxuICAgKiBAcGFyYW0ge1R5cGV9IGNvbXBvbmVudFxuICAgKiBAcGFyYW0ge2FueVtdfSBwcm92aWRlcnNcbiAgICpcbiAgICogQHJldHVybiB7VGVzdENvbXBvbmVudEJ1aWxkZXJ9XG4gICAqL1xuICBvdmVycmlkZVByb3ZpZGVycyh0eXBlOiBUeXBlLCBwcm92aWRlcnM6IGFueVtdKTogVGVzdENvbXBvbmVudEJ1aWxkZXIge1xuICAgIHZhciBjbG9uZSA9IHRoaXMuX2Nsb25lKCk7XG4gICAgY2xvbmUuX2JpbmRpbmdzT3ZlcnJpZGVzLnNldCh0eXBlLCBwcm92aWRlcnMpO1xuICAgIHJldHVybiBjbG9uZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgb3ZlcnJpZGVCaW5kaW5ncyh0eXBlOiBUeXBlLCBwcm92aWRlcnM6IGFueVtdKTogVGVzdENvbXBvbmVudEJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLm92ZXJyaWRlUHJvdmlkZXJzKHR5cGUsIHByb3ZpZGVycyk7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGVzIG9uZSBvciBtb3JlIGluamVjdGFibGVzIGNvbmZpZ3VyZWQgdmlhIGBwcm92aWRlcnNgIG1ldGFkYXRhIHByb3BlcnR5IG9mIGEgZGlyZWN0aXZlXG4gICAqIG9yXG4gICAqIGNvbXBvbmVudC5cbiAgICogVmVyeSB1c2VmdWwgd2hlbiBjZXJ0YWluIHByb3ZpZGVycyBuZWVkIHRvIGJlIG1vY2tlZCBvdXQuXG4gICAqXG4gICAqIFRoZSBwcm92aWRlcnMgc3BlY2lmaWVkIHZpYSB0aGlzIG1ldGhvZCBhcmUgYXBwZW5kZWQgdG8gdGhlIGV4aXN0aW5nIGBwcm92aWRlcnNgIGNhdXNpbmcgdGhlXG4gICAqIGR1cGxpY2F0ZWQgcHJvdmlkZXJzIHRvXG4gICAqIGJlIG92ZXJyaWRkZW4uXG4gICAqXG4gICAqIEBwYXJhbSB7VHlwZX0gY29tcG9uZW50XG4gICAqIEBwYXJhbSB7YW55W119IHByb3ZpZGVyc1xuICAgKlxuICAgKiBAcmV0dXJuIHtUZXN0Q29tcG9uZW50QnVpbGRlcn1cbiAgICovXG4gIG92ZXJyaWRlVmlld1Byb3ZpZGVycyh0eXBlOiBUeXBlLCBwcm92aWRlcnM6IGFueVtdKTogVGVzdENvbXBvbmVudEJ1aWxkZXIge1xuICAgIHZhciBjbG9uZSA9IHRoaXMuX2Nsb25lKCk7XG4gICAgY2xvbmUuX3ZpZXdCaW5kaW5nc092ZXJyaWRlcy5zZXQodHlwZSwgcHJvdmlkZXJzKTtcbiAgICByZXR1cm4gY2xvbmU7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIG92ZXJyaWRlVmlld0JpbmRpbmdzKHR5cGU6IFR5cGUsIHByb3ZpZGVyczogYW55W10pOiBUZXN0Q29tcG9uZW50QnVpbGRlciB7XG4gICAgcmV0dXJuIHRoaXMub3ZlcnJpZGVWaWV3UHJvdmlkZXJzKHR5cGUsIHByb3ZpZGVycyk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGFuZCByZXR1cm5zIGEgQ29tcG9uZW50Rml4dHVyZS5cbiAgICpcbiAgICogQHJldHVybiB7UHJvbWlzZTxDb21wb25lbnRGaXh0dXJlPn1cbiAgICovXG4gIGNyZWF0ZUFzeW5jKHJvb3RDb21wb25lbnRUeXBlOiBUeXBlKTogUHJvbWlzZTxDb21wb25lbnRGaXh0dXJlPiB7XG4gICAgdmFyIG1vY2tEaXJlY3RpdmVSZXNvbHZlciA9IHRoaXMuX2luamVjdG9yLmdldChEaXJlY3RpdmVSZXNvbHZlcik7XG4gICAgdmFyIG1vY2tWaWV3UmVzb2x2ZXIgPSB0aGlzLl9pbmplY3Rvci5nZXQoVmlld1Jlc29sdmVyKTtcbiAgICB0aGlzLl92aWV3T3ZlcnJpZGVzLmZvckVhY2goKHZpZXcsIHR5cGUpID0+IG1vY2tWaWV3UmVzb2x2ZXIuc2V0Vmlldyh0eXBlLCB2aWV3KSk7XG4gICAgdGhpcy5fdGVtcGxhdGVPdmVycmlkZXMuZm9yRWFjaCgodGVtcGxhdGUsIHR5cGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9ja1ZpZXdSZXNvbHZlci5zZXRJbmxpbmVUZW1wbGF0ZSh0eXBlLCB0ZW1wbGF0ZSkpO1xuICAgIHRoaXMuX2RpcmVjdGl2ZU92ZXJyaWRlcy5mb3JFYWNoKChvdmVycmlkZXMsIGNvbXBvbmVudCkgPT4ge1xuICAgICAgb3ZlcnJpZGVzLmZvckVhY2goXG4gICAgICAgICAgKHRvLCBmcm9tKSA9PiB7IG1vY2tWaWV3UmVzb2x2ZXIub3ZlcnJpZGVWaWV3RGlyZWN0aXZlKGNvbXBvbmVudCwgZnJvbSwgdG8pOyB9KTtcbiAgICB9KTtcblxuICAgIHRoaXMuX2JpbmRpbmdzT3ZlcnJpZGVzLmZvckVhY2goKGJpbmRpbmdzLCB0eXBlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vY2tEaXJlY3RpdmVSZXNvbHZlci5zZXRCaW5kaW5nc092ZXJyaWRlKHR5cGUsIGJpbmRpbmdzKSk7XG4gICAgdGhpcy5fdmlld0JpbmRpbmdzT3ZlcnJpZGVzLmZvckVhY2goXG4gICAgICAgIChiaW5kaW5ncywgdHlwZSkgPT4gbW9ja0RpcmVjdGl2ZVJlc29sdmVyLnNldFZpZXdCaW5kaW5nc092ZXJyaWRlKHR5cGUsIGJpbmRpbmdzKSk7XG5cbiAgICB2YXIgcm9vdEVsSWQgPSBgcm9vdCR7X25leHRSb290RWxlbWVudElkKyt9YDtcbiAgICB2YXIgcm9vdEVsID0gZWwoYDxkaXYgaWQ9XCIke3Jvb3RFbElkfVwiPjwvZGl2PmApO1xuICAgIHZhciBkb2MgPSB0aGlzLl9pbmplY3Rvci5nZXQoRE9DVU1FTlQpO1xuXG4gICAgLy8gVE9ETyhqdWxpZW1yKTogY2FuL3Nob3VsZCB0aGlzIGJlIG9wdGlvbmFsP1xuICAgIHZhciBvbGRSb290cyA9IERPTS5xdWVyeVNlbGVjdG9yQWxsKGRvYywgJ1tpZF49cm9vdF0nKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9sZFJvb3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBET00ucmVtb3ZlKG9sZFJvb3RzW2ldKTtcbiAgICB9XG4gICAgRE9NLmFwcGVuZENoaWxkKGRvYy5ib2R5LCByb290RWwpO1xuXG5cbiAgICByZXR1cm4gdGhpcy5faW5qZWN0b3IuZ2V0KER5bmFtaWNDb21wb25lbnRMb2FkZXIpXG4gICAgICAgIC5sb2FkQXNSb290KHJvb3RDb21wb25lbnRUeXBlLCBgIyR7cm9vdEVsSWR9YCwgdGhpcy5faW5qZWN0b3IpXG4gICAgICAgIC50aGVuKChjb21wb25lbnRSZWYpID0+IHsgcmV0dXJuIG5ldyBDb21wb25lbnRGaXh0dXJlXyhjb21wb25lbnRSZWYpOyB9KTtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3Rlc3RpbmcvdGVzdF9jb21wb25lbnRfYnVpbGRlci50c1xuICoqLyIsImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5pbXBvcnQge0xpc3RXcmFwcGVyLCBNYXBXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtET019IGZyb20gJ2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZG9tX2FkYXB0ZXInO1xuaW1wb3J0IHtpc1ByZXNlbnQsIGlzU3RyaW5nLCBSZWdFeHBXcmFwcGVyLCBTdHJpbmdXcmFwcGVyLCBSZWdFeHB9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBMb2cge1xuICAvKiogQGludGVybmFsICovXG4gIF9yZXN1bHQ6IGFueVtdO1xuXG4gIGNvbnN0cnVjdG9yKCkgeyB0aGlzLl9yZXN1bHQgPSBbXTsgfVxuXG4gIGFkZCh2YWx1ZSk6IHZvaWQgeyB0aGlzLl9yZXN1bHQucHVzaCh2YWx1ZSk7IH1cblxuICBmbih2YWx1ZSkge1xuICAgIHJldHVybiAoYTEgPSBudWxsLCBhMiA9IG51bGwsIGEzID0gbnVsbCwgYTQgPSBudWxsLCBhNSA9IG51bGwpID0+IHsgdGhpcy5fcmVzdWx0LnB1c2godmFsdWUpOyB9XG4gIH1cblxuICBjbGVhcigpOiB2b2lkIHsgdGhpcy5fcmVzdWx0ID0gW107IH1cblxuICByZXN1bHQoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX3Jlc3VsdC5qb2luKFwiOyBcIik7IH1cbn1cblxuXG5leHBvcnQgY2xhc3MgQnJvd3NlckRldGVjdGlvbiB7XG4gIHByaXZhdGUgX3VhOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IodWE6IHN0cmluZykge1xuICAgIGlmIChpc1ByZXNlbnQodWEpKSB7XG4gICAgICB0aGlzLl91YSA9IHVhO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl91YSA9IGlzUHJlc2VudChET00pID8gRE9NLmdldFVzZXJBZ2VudCgpIDogJyc7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGlzRmlyZWZveCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX3VhLmluZGV4T2YoJ0ZpcmVmb3gnKSA+IC0xOyB9XG5cbiAgZ2V0IGlzQW5kcm9pZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdWEuaW5kZXhPZignTW96aWxsYS81LjAnKSA+IC0xICYmIHRoaXMuX3VhLmluZGV4T2YoJ0FuZHJvaWQnKSA+IC0xICYmXG4gICAgICAgICAgIHRoaXMuX3VhLmluZGV4T2YoJ0FwcGxlV2ViS2l0JykgPiAtMSAmJiB0aGlzLl91YS5pbmRleE9mKCdDaHJvbWUnKSA9PSAtMTtcbiAgfVxuXG4gIGdldCBpc0VkZ2UoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl91YS5pbmRleE9mKCdFZGdlJykgPiAtMTsgfVxuXG4gIGdldCBpc0lFKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fdWEuaW5kZXhPZignVHJpZGVudCcpID4gLTE7IH1cblxuICBnZXQgaXNXZWJraXQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3VhLmluZGV4T2YoJ0FwcGxlV2ViS2l0JykgPiAtMSAmJiB0aGlzLl91YS5pbmRleE9mKCdFZGdlJykgPT0gLTE7XG4gIH1cblxuICBnZXQgaXNJT1M3KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl91YS5pbmRleE9mKCdpUGhvbmUgT1MgNycpID4gLTEgfHwgdGhpcy5fdWEuaW5kZXhPZignaVBhZCBPUyA3JykgPiAtMTtcbiAgfVxuXG4gIGdldCBpc1Nsb3coKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmlzQW5kcm9pZCB8fCB0aGlzLmlzSUUgfHwgdGhpcy5pc0lPUzc7IH1cblxuICAvLyBUaGUgSW50bCBBUEkgaXMgb25seSBwcm9wZXJseSBzdXBwb3J0ZWQgaW4gcmVjZW50IENocm9tZSBhbmQgT3BlcmEuXG4gIC8vIE5vdGU6IEVkZ2UgaXMgZGlzZ3Vpc2VkIGFzIENocm9tZSA0Miwgc28gY2hlY2tpbmcgdGhlIFwiRWRnZVwiIHBhcnQgaXMgbmVlZGVkLFxuICAvLyBzZWUgaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9oaDg2OTMwMSh2PXZzLjg1KS5hc3B4XG4gIGdldCBzdXBwb3J0c0ludGxBcGkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3VhLmluZGV4T2YoJ0Nocm9tZS80JykgPiAtMSAmJiB0aGlzLl91YS5pbmRleE9mKCdFZGdlJykgPT0gLTE7XG4gIH1cbn1cbmV4cG9ydCB2YXIgYnJvd3NlckRldGVjdGlvbjogQnJvd3NlckRldGVjdGlvbiA9IG5ldyBCcm93c2VyRGV0ZWN0aW9uKG51bGwpO1xuXG5leHBvcnQgZnVuY3Rpb24gZGlzcGF0Y2hFdmVudChlbGVtZW50LCBldmVudFR5cGUpOiB2b2lkIHtcbiAgRE9NLmRpc3BhdGNoRXZlbnQoZWxlbWVudCwgRE9NLmNyZWF0ZUV2ZW50KGV2ZW50VHlwZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZWwoaHRtbDogc3RyaW5nKTogSFRNTEVsZW1lbnQge1xuICByZXR1cm4gPEhUTUxFbGVtZW50PkRPTS5maXJzdENoaWxkKERPTS5jb250ZW50KERPTS5jcmVhdGVUZW1wbGF0ZShodG1sKSkpO1xufVxuXG52YXIgX1JFX1NQRUNJQUxfQ0hBUlMgPVxuICAgIFsnLScsICdbJywgJ10nLCAnLycsICd7JywgJ30nLCAnXFxcXCcsICcoJywgJyknLCAnKicsICcrJywgJz8nLCAnLicsICdeJywgJyQnLCAnfCddO1xudmFyIF9FU0NBUEVfUkUgPSBSZWdFeHBXcmFwcGVyLmNyZWF0ZShgW1xcXFwke19SRV9TUEVDSUFMX0NIQVJTLmpvaW4oJ1xcXFwnKX1dYCk7XG5leHBvcnQgZnVuY3Rpb24gY29udGFpbnNSZWdleHAoaW5wdXQ6IHN0cmluZyk6IFJlZ0V4cCB7XG4gIHJldHVybiBSZWdFeHBXcmFwcGVyLmNyZWF0ZShcbiAgICAgIFN0cmluZ1dyYXBwZXIucmVwbGFjZUFsbE1hcHBlZChpbnB1dCwgX0VTQ0FQRV9SRSwgKG1hdGNoKSA9PiBgXFxcXCR7bWF0Y2hbMF19YCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQ1NTKGNzczogc3RyaW5nKTogc3RyaW5nIHtcbiAgY3NzID0gU3RyaW5nV3JhcHBlci5yZXBsYWNlQWxsKGNzcywgL1xccysvZywgJyAnKTtcbiAgY3NzID0gU3RyaW5nV3JhcHBlci5yZXBsYWNlQWxsKGNzcywgLzpcXHMvZywgJzonKTtcbiAgY3NzID0gU3RyaW5nV3JhcHBlci5yZXBsYWNlQWxsKGNzcywgLycvZywgJ1wiJyk7XG4gIGNzcyA9IFN0cmluZ1dyYXBwZXIucmVwbGFjZUFsbChjc3MsIC8gfS9nLCAnfScpO1xuICBjc3MgPSBTdHJpbmdXcmFwcGVyLnJlcGxhY2VBbGxNYXBwZWQoY3NzLCAvdXJsXFwoKFxcXCJ8XFxzKSguKykoXFxcInxcXHMpXFwpKFxccyopL2csXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2gpID0+IGB1cmwoXCIke21hdGNoWzJdfVwiKWApO1xuICBjc3MgPSBTdHJpbmdXcmFwcGVyLnJlcGxhY2VBbGxNYXBwZWQoY3NzLCAvXFxbKC4rKT0oW15cIlxcXV0rKVxcXS9nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoKSA9PiBgWyR7bWF0Y2hbMV19PVwiJHttYXRjaFsyXX1cIl1gKTtcbiAgcmV0dXJuIGNzcztcbn1cblxudmFyIF9zaW5nbGVUYWdXaGl0ZWxpc3QgPSBbJ2JyJywgJ2hyJywgJ2lucHV0J107XG5leHBvcnQgZnVuY3Rpb24gc3RyaW5naWZ5RWxlbWVudChlbCk6IHN0cmluZyB7XG4gIHZhciByZXN1bHQgPSAnJztcbiAgaWYgKERPTS5pc0VsZW1lbnROb2RlKGVsKSkge1xuICAgIHZhciB0YWdOYW1lID0gRE9NLnRhZ05hbWUoZWwpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAvLyBPcGVuaW5nIHRhZ1xuICAgIHJlc3VsdCArPSBgPCR7dGFnTmFtZX1gO1xuXG4gICAgLy8gQXR0cmlidXRlcyBpbiBhbiBvcmRlcmVkIHdheVxuICAgIHZhciBhdHRyaWJ1dGVNYXAgPSBET00uYXR0cmlidXRlTWFwKGVsKTtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGF0dHJpYnV0ZU1hcC5mb3JFYWNoKCh2LCBrKSA9PiBrZXlzLnB1c2goaykpO1xuICAgIExpc3RXcmFwcGVyLnNvcnQoa2V5cyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICAgIHZhciBhdHRWYWx1ZSA9IGF0dHJpYnV0ZU1hcC5nZXQoa2V5KTtcbiAgICAgIGlmICghaXNTdHJpbmcoYXR0VmFsdWUpKSB7XG4gICAgICAgIHJlc3VsdCArPSBgICR7a2V5fWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgKz0gYCAke2tleX09XCIke2F0dFZhbHVlfVwiYDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0ICs9ICc+JztcblxuICAgIC8vIENoaWxkcmVuXG4gICAgdmFyIGNoaWxkcmVuUm9vdCA9IERPTS50ZW1wbGF0ZUF3YXJlUm9vdChlbCk7XG4gICAgdmFyIGNoaWxkcmVuID0gaXNQcmVzZW50KGNoaWxkcmVuUm9vdCkgPyBET00uY2hpbGROb2RlcyhjaGlsZHJlblJvb3QpIDogW107XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBjaGlsZHJlbi5sZW5ndGg7IGorKykge1xuICAgICAgcmVzdWx0ICs9IHN0cmluZ2lmeUVsZW1lbnQoY2hpbGRyZW5bal0pO1xuICAgIH1cblxuICAgIC8vIENsb3NpbmcgdGFnXG4gICAgaWYgKCFMaXN0V3JhcHBlci5jb250YWlucyhfc2luZ2xlVGFnV2hpdGVsaXN0LCB0YWdOYW1lKSkge1xuICAgICAgcmVzdWx0ICs9IGA8LyR7dGFnTmFtZX0+YDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoRE9NLmlzQ29tbWVudE5vZGUoZWwpKSB7XG4gICAgcmVzdWx0ICs9IGA8IS0tJHtET00ubm9kZVZhbHVlKGVsKX0tLT5gO1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdCArPSBET00uZ2V0VGV4dChlbCk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3Rlc3RpbmcvdXRpbHMudHNcbiAqKi8iLCJpbXBvcnQge1R5cGUsIGlzQXJyYXksIGlzUHJlc2VudCwgc2VyaWFsaXplRW51bSwgZGVzZXJpYWxpemVFbnVtfSBmcm9tIFwiYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nXCI7XG5pbXBvcnQge0Jhc2VFeGNlcHRpb24sIFdyYXBwZWRFeGNlcHRpb259IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9ucyc7XG5cbmltcG9ydCB7TWFwLCBTdHJpbmdNYXBXcmFwcGVyLCBNYXBXcmFwcGVyfSBmcm9tIFwiYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uXCI7XG5pbXBvcnQge1xuICBSZW5kZXJQcm90b1ZpZXdSZWYsXG4gIFJlbmRlclZpZXdSZWYsXG4gIFJlbmRlckZyYWdtZW50UmVmLFxuICBSZW5kZXJFbGVtZW50UmVmLFxuICBSZW5kZXJUZW1wbGF0ZUNtZCxcbiAgUmVuZGVyQ29tbWFuZFZpc2l0b3IsXG4gIFJlbmRlclRleHRDbWQsXG4gIFJlbmRlck5nQ29udGVudENtZCxcbiAgUmVuZGVyQmVnaW5FbGVtZW50Q21kLFxuICBSZW5kZXJCZWdpbkNvbXBvbmVudENtZCxcbiAgUmVuZGVyRW1iZWRkZWRUZW1wbGF0ZUNtZCxcbiAgUmVuZGVyQ29tcG9uZW50VGVtcGxhdGVcbn0gZnJvbSBcImFuZ3VsYXIyL3NyYy9jb3JlL3JlbmRlci9hcGlcIjtcbmltcG9ydCB7XG4gIFdlYldvcmtlckVsZW1lbnRSZWYsXG4gIFdlYldvcmtlclRlbXBsYXRlQ21kLFxuICBXZWJXb3JrZXJUZXh0Q21kLFxuICBXZWJXb3JrZXJOZ0NvbnRlbnRDbWQsXG4gIFdlYldvcmtlckJlZ2luRWxlbWVudENtZCxcbiAgV2ViV29ya2VyRW5kRWxlbWVudENtZCxcbiAgV2ViV29ya2VyQmVnaW5Db21wb25lbnRDbWQsXG4gIFdlYldvcmtlckVuZENvbXBvbmVudENtZCxcbiAgV2ViV29ya2VyRW1iZWRkZWRUZW1wbGF0ZUNtZFxufSBmcm9tICdhbmd1bGFyMi9zcmMvd2ViX3dvcmtlcnMvc2hhcmVkL2FwaSc7XG5pbXBvcnQge0luamVjdGFibGV9IGZyb20gXCJhbmd1bGFyMi9zcmMvY29yZS9kaVwiO1xuaW1wb3J0IHtSZW5kZXJQcm90b1ZpZXdSZWZTdG9yZX0gZnJvbSAnYW5ndWxhcjIvc3JjL3dlYl93b3JrZXJzL3NoYXJlZC9yZW5kZXJfcHJvdG9fdmlld19yZWZfc3RvcmUnO1xuaW1wb3J0IHtcbiAgUmVuZGVyVmlld1dpdGhGcmFnbWVudHNTdG9yZVxufSBmcm9tICdhbmd1bGFyMi9zcmMvd2ViX3dvcmtlcnMvc2hhcmVkL3JlbmRlcl92aWV3X3dpdGhfZnJhZ21lbnRzX3N0b3JlJztcbmltcG9ydCB7Vmlld0VuY2Fwc3VsYXRpb24sIFZJRVdfRU5DQVBTVUxBVElPTl9WQUxVRVN9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL21ldGFkYXRhL3ZpZXcnO1xuXG4vLyBQUklNSVRJVkUgaXMgYW55IHR5cGUgdGhhdCBkb2VzIG5vdCBuZWVkIHRvIGJlIHNlcmlhbGl6ZWQgKHN0cmluZywgbnVtYmVyLCBib29sZWFuKVxuLy8gV2Ugc2V0IGl0IHRvIFN0cmluZyBzbyB0aGF0IGl0IGlzIGNvbnNpZGVyZWQgYSBUeXBlLlxuZXhwb3J0IGNvbnN0IFBSSU1JVElWRTogVHlwZSA9IFN0cmluZztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFNlcmlhbGl6ZXIge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9wcm90b1ZpZXdTdG9yZTogUmVuZGVyUHJvdG9WaWV3UmVmU3RvcmUsXG4gICAgICAgICAgICAgIHByaXZhdGUgX3JlbmRlclZpZXdTdG9yZTogUmVuZGVyVmlld1dpdGhGcmFnbWVudHNTdG9yZSkge31cblxuICBzZXJpYWxpemUob2JqOiBhbnksIHR5cGU6IGFueSk6IE9iamVjdCB7XG4gICAgaWYgKCFpc1ByZXNlbnQob2JqKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChpc0FycmF5KG9iaikpIHtcbiAgICAgIHJldHVybiAoPGFueVtdPm9iaikubWFwKHYgPT4gdGhpcy5zZXJpYWxpemUodiwgdHlwZSkpO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PSBQUklNSVRJVkUpIHtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuICAgIGlmICh0eXBlID09IFJlbmRlclByb3RvVmlld1JlZikge1xuICAgICAgcmV0dXJuIHRoaXMuX3Byb3RvVmlld1N0b3JlLnNlcmlhbGl6ZShvYmopO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PSBSZW5kZXJWaWV3UmVmKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVuZGVyVmlld1N0b3JlLnNlcmlhbGl6ZVJlbmRlclZpZXdSZWYob2JqKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gUmVuZGVyRnJhZ21lbnRSZWYpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJWaWV3U3RvcmUuc2VyaWFsaXplUmVuZGVyRnJhZ21lbnRSZWYob2JqKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gV2ViV29ya2VyRWxlbWVudFJlZikge1xuICAgICAgcmV0dXJuIHRoaXMuX3NlcmlhbGl6ZVdvcmtlckVsZW1lbnRSZWYob2JqKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gV2ViV29ya2VyVGVtcGxhdGVDbWQpIHtcbiAgICAgIHJldHVybiBzZXJpYWxpemVUZW1wbGF0ZUNtZChvYmopO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gUmVuZGVyQ29tcG9uZW50VGVtcGxhdGUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zZXJpYWxpemVSZW5kZXJUZW1wbGF0ZShvYmopO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gVmlld0VuY2Fwc3VsYXRpb24pIHtcbiAgICAgIHJldHVybiBzZXJpYWxpemVFbnVtKG9iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKFwiTm8gc2VyaWFsaXplciBmb3IgXCIgKyB0eXBlLnRvU3RyaW5nKCkpO1xuICAgIH1cbiAgfVxuXG4gIGRlc2VyaWFsaXplKG1hcDogYW55LCB0eXBlOiBhbnksIGRhdGE/OiBhbnkpOiBhbnkge1xuICAgIGlmICghaXNQcmVzZW50KG1hcCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoaXNBcnJheShtYXApKSB7XG4gICAgICB2YXIgb2JqOiBhbnlbXSA9IFtdO1xuICAgICAgKDxhbnlbXT5tYXApLmZvckVhY2godmFsID0+IG9iai5wdXNoKHRoaXMuZGVzZXJpYWxpemUodmFsLCB0eXBlLCBkYXRhKSkpO1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT0gUFJJTUlUSVZFKSB7XG4gICAgICByZXR1cm4gbWFwO1xuICAgIH1cblxuICAgIGlmICh0eXBlID09IFJlbmRlclByb3RvVmlld1JlZikge1xuICAgICAgcmV0dXJuIHRoaXMuX3Byb3RvVmlld1N0b3JlLmRlc2VyaWFsaXplKG1hcCk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09IFJlbmRlclZpZXdSZWYpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJWaWV3U3RvcmUuZGVzZXJpYWxpemVSZW5kZXJWaWV3UmVmKG1hcCk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09IFJlbmRlckZyYWdtZW50UmVmKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVuZGVyVmlld1N0b3JlLmRlc2VyaWFsaXplUmVuZGVyRnJhZ21lbnRSZWYobWFwKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gV2ViV29ya2VyRWxlbWVudFJlZikge1xuICAgICAgcmV0dXJuIHRoaXMuX2Rlc2VyaWFsaXplV29ya2VyRWxlbWVudFJlZihtYXApO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PSBXZWJXb3JrZXJUZW1wbGF0ZUNtZCkge1xuICAgICAgcmV0dXJuIGRlc2VyaWFsaXplVGVtcGxhdGVDbWQobWFwKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFJlbmRlckNvbXBvbmVudFRlbXBsYXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZGVzZXJpYWxpemVSZW5kZXJUZW1wbGF0ZShtYXApO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gVmlld0VuY2Fwc3VsYXRpb24pIHtcbiAgICAgIHJldHVybiBWSUVXX0VOQ0FQU1VMQVRJT05fVkFMVUVTW21hcF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKFwiTm8gZGVzZXJpYWxpemVyIGZvciBcIiArIHR5cGUudG9TdHJpbmcoKSk7XG4gICAgfVxuICB9XG5cbiAgbWFwVG9PYmplY3QobWFwOiBNYXA8c3RyaW5nLCBhbnk+LCB0eXBlPzogVHlwZSk6IE9iamVjdCB7XG4gICAgdmFyIG9iamVjdCA9IHt9O1xuICAgIHZhciBzZXJpYWxpemUgPSBpc1ByZXNlbnQodHlwZSk7XG5cbiAgICBtYXAuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgaWYgKHNlcmlhbGl6ZSkge1xuICAgICAgICBvYmplY3Rba2V5XSA9IHRoaXMuc2VyaWFsaXplKHZhbHVlLCB0eXBlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9iamVjdFtrZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfVxuXG4gIC8qXG4gICAqIFRyYW5zZm9ybXMgYSBKYXZhc2NyaXB0IG9iamVjdCAoU3RyaW5nTWFwKSBpbnRvIGEgTWFwPHN0cmluZywgVj5cbiAgICogSWYgdGhlIHZhbHVlcyBuZWVkIHRvIGJlIGRlc2VyaWFsaXplZCBwYXNzIGluIHRoZWlyIHR5cGVcbiAgICogYW5kIHRoZXkgd2lsbCBiZSBkZXNlcmlhbGl6ZWQgYmVmb3JlIGJlaW5nIHBsYWNlZCBpbiB0aGUgbWFwXG4gICAqL1xuICBvYmplY3RUb01hcChvYmo6IHtba2V5OiBzdHJpbmddOiBhbnl9LCB0eXBlPzogVHlwZSwgZGF0YT86IGFueSk6IE1hcDxzdHJpbmcsIGFueT4ge1xuICAgIGlmIChpc1ByZXNlbnQodHlwZSkpIHtcbiAgICAgIHZhciBtYXAgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICAgICAgU3RyaW5nTWFwV3JhcHBlci5mb3JFYWNoKG9iaixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmFsLCBrZXkpID0+IHsgbWFwLnNldChrZXksIHRoaXMuZGVzZXJpYWxpemUodmFsLCB0eXBlLCBkYXRhKSk7IH0pO1xuICAgICAgcmV0dXJuIG1hcDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIE1hcFdyYXBwZXIuY3JlYXRlRnJvbVN0cmluZ01hcChvYmopO1xuICAgIH1cbiAgfVxuXG4gIGFsbG9jYXRlUmVuZGVyVmlld3MoZnJhZ21lbnRDb3VudDogbnVtYmVyKSB7IHRoaXMuX3JlbmRlclZpZXdTdG9yZS5hbGxvY2F0ZShmcmFnbWVudENvdW50KTsgfVxuXG4gIHByaXZhdGUgX3NlcmlhbGl6ZVdvcmtlckVsZW1lbnRSZWYoZWxlbWVudFJlZjogUmVuZGVyRWxlbWVudFJlZik6IHtba2V5OiBzdHJpbmddOiBhbnl9IHtcbiAgICByZXR1cm4ge1xuICAgICAgJ3JlbmRlclZpZXcnOiB0aGlzLnNlcmlhbGl6ZShlbGVtZW50UmVmLnJlbmRlclZpZXcsIFJlbmRlclZpZXdSZWYpLFxuICAgICAgJ2JvdW5kRWxlbWVudEluZGV4JzogZWxlbWVudFJlZi5ib3VuZEVsZW1lbnRJbmRleFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIF9kZXNlcmlhbGl6ZVdvcmtlckVsZW1lbnRSZWYobWFwOiB7W2tleTogc3RyaW5nXTogYW55fSk6IFJlbmRlckVsZW1lbnRSZWYge1xuICAgIHJldHVybiBuZXcgV2ViV29ya2VyRWxlbWVudFJlZih0aGlzLmRlc2VyaWFsaXplKG1hcFsncmVuZGVyVmlldyddLCBSZW5kZXJWaWV3UmVmKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwWydib3VuZEVsZW1lbnRJbmRleCddKTtcbiAgfVxuXG5cbiAgcHJpdmF0ZSBfc2VyaWFsaXplUmVuZGVyVGVtcGxhdGUob2JqOiBSZW5kZXJDb21wb25lbnRUZW1wbGF0ZSk6IE9iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdpZCc6IG9iai5pZCxcbiAgICAgICdzaG9ydElkJzogb2JqLnNob3J0SWQsXG4gICAgICAnZW5jYXBzdWxhdGlvbic6IHRoaXMuc2VyaWFsaXplKG9iai5lbmNhcHN1bGF0aW9uLCBWaWV3RW5jYXBzdWxhdGlvbiksXG4gICAgICAnY29tbWFuZHMnOiB0aGlzLnNlcmlhbGl6ZShvYmouY29tbWFuZHMsIFdlYldvcmtlclRlbXBsYXRlQ21kKSxcbiAgICAgICdzdHlsZXMnOiB0aGlzLnNlcmlhbGl6ZShvYmouc3R5bGVzLCBQUklNSVRJVkUpXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX2Rlc2VyaWFsaXplUmVuZGVyVGVtcGxhdGUobWFwOiB7W2tleTogc3RyaW5nXTogYW55fSk6IFJlbmRlckNvbXBvbmVudFRlbXBsYXRlIHtcbiAgICByZXR1cm4gbmV3IFJlbmRlckNvbXBvbmVudFRlbXBsYXRlKG1hcFsnaWQnXSwgbWFwWydzaG9ydElkJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc2VyaWFsaXplKG1hcFsnZW5jYXBzdWxhdGlvbiddLCBWaWV3RW5jYXBzdWxhdGlvbiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc2VyaWFsaXplKG1hcFsnY29tbWFuZHMnXSwgV2ViV29ya2VyVGVtcGxhdGVDbWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXNlcmlhbGl6ZShtYXBbJ3N0eWxlcyddLCBQUklNSVRJVkUpKTtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZVRlbXBsYXRlQ21kKGNtZDogUmVuZGVyVGVtcGxhdGVDbWQpOiBPYmplY3Qge1xuICByZXR1cm4gY21kLnZpc2l0KFJFTkRFUl9URU1QTEFURV9DTURfU0VSSUFMSVpFUiwgbnVsbCk7XG59XG5cbmZ1bmN0aW9uIGRlc2VyaWFsaXplVGVtcGxhdGVDbWQoZGF0YToge1trZXk6IHN0cmluZ106IGFueX0pOiBSZW5kZXJUZW1wbGF0ZUNtZCB7XG4gIHJldHVybiBSRU5ERVJfVEVNUExBVEVfQ01EX0RFU0VSSUFMSVpFUlNbZGF0YVsnZGVzZXJpYWxpemVySW5kZXgnXV0oZGF0YSk7XG59XG5cbmNsYXNzIFJlbmRlclRlbXBsYXRlQ21kU2VyaWFsaXplciBpbXBsZW1lbnRzIFJlbmRlckNvbW1hbmRWaXNpdG9yIHtcbiAgdmlzaXRUZXh0KGNtZDogUmVuZGVyVGV4dENtZCwgY29udGV4dDogYW55KTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgJ2Rlc2VyaWFsaXplckluZGV4JzogMCxcbiAgICAgICdpc0JvdW5kJzogY21kLmlzQm91bmQsXG4gICAgICAnbmdDb250ZW50SW5kZXgnOiBjbWQubmdDb250ZW50SW5kZXgsXG4gICAgICAndmFsdWUnOiBjbWQudmFsdWVcbiAgICB9O1xuICB9XG4gIHZpc2l0TmdDb250ZW50KGNtZDogUmVuZGVyTmdDb250ZW50Q21kLCBjb250ZXh0OiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB7J2Rlc2VyaWFsaXplckluZGV4JzogMSwgJ2luZGV4JzogY21kLmluZGV4LCAnbmdDb250ZW50SW5kZXgnOiBjbWQubmdDb250ZW50SW5kZXh9O1xuICB9XG4gIHZpc2l0QmVnaW5FbGVtZW50KGNtZDogUmVuZGVyQmVnaW5FbGVtZW50Q21kLCBjb250ZXh0OiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICAnZGVzZXJpYWxpemVySW5kZXgnOiAyLFxuICAgICAgJ2lzQm91bmQnOiBjbWQuaXNCb3VuZCxcbiAgICAgICduZ0NvbnRlbnRJbmRleCc6IGNtZC5uZ0NvbnRlbnRJbmRleCxcbiAgICAgICduYW1lJzogY21kLm5hbWUsXG4gICAgICAnYXR0ck5hbWVBbmRWYWx1ZXMnOiBjbWQuYXR0ck5hbWVBbmRWYWx1ZXMsXG4gICAgICAnZXZlbnRUYXJnZXRBbmROYW1lcyc6IGNtZC5ldmVudFRhcmdldEFuZE5hbWVzXG4gICAgfTtcbiAgfVxuICB2aXNpdEVuZEVsZW1lbnQoY29udGV4dDogYW55KTogYW55IHsgcmV0dXJuIHsnZGVzZXJpYWxpemVySW5kZXgnOiAzfTsgfVxuICB2aXNpdEJlZ2luQ29tcG9uZW50KGNtZDogUmVuZGVyQmVnaW5Db21wb25lbnRDbWQsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdkZXNlcmlhbGl6ZXJJbmRleCc6IDQsXG4gICAgICAnaXNCb3VuZCc6IGNtZC5pc0JvdW5kLFxuICAgICAgJ25nQ29udGVudEluZGV4JzogY21kLm5nQ29udGVudEluZGV4LFxuICAgICAgJ25hbWUnOiBjbWQubmFtZSxcbiAgICAgICdhdHRyTmFtZUFuZFZhbHVlcyc6IGNtZC5hdHRyTmFtZUFuZFZhbHVlcyxcbiAgICAgICdldmVudFRhcmdldEFuZE5hbWVzJzogY21kLmV2ZW50VGFyZ2V0QW5kTmFtZXMsXG4gICAgICAndGVtcGxhdGVJZCc6IGNtZC50ZW1wbGF0ZUlkXG4gICAgfTtcbiAgfVxuICB2aXNpdEVuZENvbXBvbmVudChjb250ZXh0OiBhbnkpOiBhbnkgeyByZXR1cm4geydkZXNlcmlhbGl6ZXJJbmRleCc6IDV9OyB9XG4gIHZpc2l0RW1iZWRkZWRUZW1wbGF0ZShjbWQ6IFJlbmRlckVtYmVkZGVkVGVtcGxhdGVDbWQsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgdmFyIGNoaWxkcmVuID0gY21kLmNoaWxkcmVuLm1hcChjaGlsZCA9PiBjaGlsZC52aXNpdCh0aGlzLCBudWxsKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICdkZXNlcmlhbGl6ZXJJbmRleCc6IDYsXG4gICAgICAnaXNCb3VuZCc6IGNtZC5pc0JvdW5kLFxuICAgICAgJ25nQ29udGVudEluZGV4JzogY21kLm5nQ29udGVudEluZGV4LFxuICAgICAgJ25hbWUnOiBjbWQubmFtZSxcbiAgICAgICdhdHRyTmFtZUFuZFZhbHVlcyc6IGNtZC5hdHRyTmFtZUFuZFZhbHVlcyxcbiAgICAgICdldmVudFRhcmdldEFuZE5hbWVzJzogY21kLmV2ZW50VGFyZ2V0QW5kTmFtZXMsXG4gICAgICAnaXNNZXJnZWQnOiBjbWQuaXNNZXJnZWQsXG4gICAgICAnY2hpbGRyZW4nOiBjaGlsZHJlblxuICAgIH07XG4gIH1cbn1cblxudmFyIFJFTkRFUl9URU1QTEFURV9DTURfU0VSSUFMSVpFUiA9IG5ldyBSZW5kZXJUZW1wbGF0ZUNtZFNlcmlhbGl6ZXIoKTtcblxudmFyIFJFTkRFUl9URU1QTEFURV9DTURfREVTRVJJQUxJWkVSUyA9IFtcbiAgKGRhdGE6IHtba2V5OiBzdHJpbmddOiBhbnl9KSA9PlxuICAgICAgbmV3IFdlYldvcmtlclRleHRDbWQoZGF0YVsnaXNCb3VuZCddLCBkYXRhWyduZ0NvbnRlbnRJbmRleCddLCBkYXRhWyd2YWx1ZSddKSxcbiAgKGRhdGE6IHtba2V5OiBzdHJpbmddOiBhbnl9KSA9PiBuZXcgV2ViV29ya2VyTmdDb250ZW50Q21kKGRhdGFbJ2luZGV4J10sIGRhdGFbJ25nQ29udGVudEluZGV4J10pLFxuICAoZGF0YToge1trZXk6IHN0cmluZ106IGFueX0pID0+XG4gICAgICBuZXcgV2ViV29ya2VyQmVnaW5FbGVtZW50Q21kKGRhdGFbJ2lzQm91bmQnXSwgZGF0YVsnbmdDb250ZW50SW5kZXgnXSwgZGF0YVsnbmFtZSddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhWydhdHRyTmFtZUFuZFZhbHVlcyddLCBkYXRhWydldmVudFRhcmdldEFuZE5hbWVzJ10pLFxuICAoZGF0YToge1trZXk6IHN0cmluZ106IGFueX0pID0+IG5ldyBXZWJXb3JrZXJFbmRFbGVtZW50Q21kKCksXG4gIChkYXRhOiB7W2tleTogc3RyaW5nXTogYW55fSkgPT4gbmV3IFdlYldvcmtlckJlZ2luQ29tcG9uZW50Q21kKFxuICAgICAgZGF0YVsnaXNCb3VuZCddLCBkYXRhWyduZ0NvbnRlbnRJbmRleCddLCBkYXRhWyduYW1lJ10sIGRhdGFbJ2F0dHJOYW1lQW5kVmFsdWVzJ10sXG4gICAgICBkYXRhWydldmVudFRhcmdldEFuZE5hbWVzJ10sIGRhdGFbJ3RlbXBsYXRlSWQnXSksXG4gIChkYXRhOiB7W2tleTogc3RyaW5nXTogYW55fSkgPT4gbmV3IFdlYldvcmtlckVuZENvbXBvbmVudENtZCgpLFxuICAoZGF0YToge1trZXk6IHN0cmluZ106IGFueX0pID0+IG5ldyBXZWJXb3JrZXJFbWJlZGRlZFRlbXBsYXRlQ21kKFxuICAgICAgZGF0YVsnaXNCb3VuZCddLCBkYXRhWyduZ0NvbnRlbnRJbmRleCddLCBkYXRhWyduYW1lJ10sIGRhdGFbJ2F0dHJOYW1lQW5kVmFsdWVzJ10sXG4gICAgICBkYXRhWydldmVudFRhcmdldEFuZE5hbWVzJ10sIGRhdGFbJ2lzTWVyZ2VkJ10sXG4gICAgICAoPGFueVtdPmRhdGFbJ2NoaWxkcmVuJ10pLm1hcChjaGlsZERhdGEgPT4gZGVzZXJpYWxpemVUZW1wbGF0ZUNtZChjaGlsZERhdGEpKSksXG5dO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3dlYl93b3JrZXJzL3NoYXJlZC9zZXJpYWxpemVyLnRzXG4gKiovIiwiaW1wb3J0IHtDT05TVF9FWFBSfSBmcm9tIFwiYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nXCI7XG5pbXBvcnQge09wYXF1ZVRva2VufSBmcm9tIFwiYW5ndWxhcjIvc3JjL2NvcmUvZGlcIjtcbmltcG9ydCB7XG4gIFJlbmRlckVsZW1lbnRSZWYsXG4gIFJlbmRlclZpZXdSZWYsXG4gIFJlbmRlclRlbXBsYXRlQ21kLFxuICBSZW5kZXJUZXh0Q21kLFxuICBSZW5kZXJOZ0NvbnRlbnRDbWQsXG4gIFJlbmRlckJlZ2luRWxlbWVudENtZCxcbiAgUmVuZGVyQmVnaW5Db21wb25lbnRDbWQsXG4gIFJlbmRlckVtYmVkZGVkVGVtcGxhdGVDbWQsXG4gIFJlbmRlckNvbW1hbmRWaXNpdG9yXG59IGZyb20gXCJhbmd1bGFyMi9zcmMvY29yZS9yZW5kZXIvYXBpXCI7XG5cbmV4cG9ydCBjb25zdCBPTl9XRUJfV09SS0VSID0gQ09OU1RfRVhQUihuZXcgT3BhcXVlVG9rZW4oJ1dlYldvcmtlci5vbldlYldvcmtlcicpKTtcblxuZXhwb3J0IGNsYXNzIFdlYldvcmtlckVsZW1lbnRSZWYgaW1wbGVtZW50cyBSZW5kZXJFbGVtZW50UmVmIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlbmRlclZpZXc6IFJlbmRlclZpZXdSZWYsIHB1YmxpYyBib3VuZEVsZW1lbnRJbmRleDogbnVtYmVyKSB7fVxufVxuXG5leHBvcnQgY2xhc3MgV2ViV29ya2VyVGVtcGxhdGVDbWQgaW1wbGVtZW50cyBSZW5kZXJUZW1wbGF0ZUNtZCB7XG4gIHZpc2l0KHZpc2l0b3I6IFJlbmRlckNvbW1hbmRWaXNpdG9yLCBjb250ZXh0OiBhbnkpOiBhbnkgeyByZXR1cm4gbnVsbDsgfVxufVxuXG5leHBvcnQgY2xhc3MgV2ViV29ya2VyVGV4dENtZCBpbXBsZW1lbnRzIFJlbmRlclRleHRDbWQge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgaXNCb3VuZDogYm9vbGVhbiwgcHVibGljIG5nQ29udGVudEluZGV4OiBudW1iZXIsIHB1YmxpYyB2YWx1ZTogc3RyaW5nKSB7fVxuICB2aXNpdCh2aXNpdG9yOiBSZW5kZXJDb21tYW5kVmlzaXRvciwgY29udGV4dDogYW55KTogYW55IHtcbiAgICByZXR1cm4gdmlzaXRvci52aXNpdFRleHQodGhpcywgY29udGV4dCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFdlYldvcmtlck5nQ29udGVudENtZCBpbXBsZW1lbnRzIFJlbmRlck5nQ29udGVudENtZCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBpbmRleDogbnVtYmVyLCBwdWJsaWMgbmdDb250ZW50SW5kZXg6IG51bWJlcikge31cbiAgdmlzaXQodmlzaXRvcjogUmVuZGVyQ29tbWFuZFZpc2l0b3IsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHZpc2l0b3IudmlzaXROZ0NvbnRlbnQodGhpcywgY29udGV4dCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFdlYldvcmtlckJlZ2luRWxlbWVudENtZCBpbXBsZW1lbnRzIFJlbmRlckJlZ2luRWxlbWVudENtZCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBpc0JvdW5kOiBib29sZWFuLCBwdWJsaWMgbmdDb250ZW50SW5kZXg6IG51bWJlciwgcHVibGljIG5hbWU6IHN0cmluZyxcbiAgICAgICAgICAgICAgcHVibGljIGF0dHJOYW1lQW5kVmFsdWVzOiBzdHJpbmdbXSwgcHVibGljIGV2ZW50VGFyZ2V0QW5kTmFtZXM6IHN0cmluZ1tdKSB7fVxuICB2aXNpdCh2aXNpdG9yOiBSZW5kZXJDb21tYW5kVmlzaXRvciwgY29udGV4dDogYW55KTogYW55IHtcbiAgICByZXR1cm4gdmlzaXRvci52aXNpdEJlZ2luRWxlbWVudCh0aGlzLCBjb250ZXh0KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgV2ViV29ya2VyRW5kRWxlbWVudENtZCBpbXBsZW1lbnRzIFJlbmRlclRlbXBsYXRlQ21kIHtcbiAgdmlzaXQodmlzaXRvcjogUmVuZGVyQ29tbWFuZFZpc2l0b3IsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHZpc2l0b3IudmlzaXRFbmRFbGVtZW50KGNvbnRleHQpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBXZWJXb3JrZXJCZWdpbkNvbXBvbmVudENtZCBpbXBsZW1lbnRzIFJlbmRlckJlZ2luQ29tcG9uZW50Q21kIHtcbiAgY29uc3RydWN0b3IocHVibGljIGlzQm91bmQ6IGJvb2xlYW4sIHB1YmxpYyBuZ0NvbnRlbnRJbmRleDogbnVtYmVyLCBwdWJsaWMgbmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICBwdWJsaWMgYXR0ck5hbWVBbmRWYWx1ZXM6IHN0cmluZ1tdLCBwdWJsaWMgZXZlbnRUYXJnZXRBbmROYW1lczogc3RyaW5nW10sXG4gICAgICAgICAgICAgIHB1YmxpYyB0ZW1wbGF0ZUlkOiBzdHJpbmcpIHt9XG4gIHZpc2l0KHZpc2l0b3I6IFJlbmRlckNvbW1hbmRWaXNpdG9yLCBjb250ZXh0OiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB2aXNpdG9yLnZpc2l0QmVnaW5Db21wb25lbnQodGhpcywgY29udGV4dCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFdlYldvcmtlckVuZENvbXBvbmVudENtZCBpbXBsZW1lbnRzIFJlbmRlclRlbXBsYXRlQ21kIHtcbiAgdmlzaXQodmlzaXRvcjogUmVuZGVyQ29tbWFuZFZpc2l0b3IsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHZpc2l0b3IudmlzaXRFbmRDb21wb25lbnQoY29udGV4dCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFdlYldvcmtlckVtYmVkZGVkVGVtcGxhdGVDbWQgaW1wbGVtZW50cyBSZW5kZXJFbWJlZGRlZFRlbXBsYXRlQ21kIHtcbiAgY29uc3RydWN0b3IocHVibGljIGlzQm91bmQ6IGJvb2xlYW4sIHB1YmxpYyBuZ0NvbnRlbnRJbmRleDogbnVtYmVyLCBwdWJsaWMgbmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICBwdWJsaWMgYXR0ck5hbWVBbmRWYWx1ZXM6IHN0cmluZ1tdLCBwdWJsaWMgZXZlbnRUYXJnZXRBbmROYW1lczogc3RyaW5nW10sXG4gICAgICAgICAgICAgIHB1YmxpYyBpc01lcmdlZDogYm9vbGVhbiwgcHVibGljIGNoaWxkcmVuOiBSZW5kZXJUZW1wbGF0ZUNtZFtdKSB7fVxuICB2aXNpdCh2aXNpdG9yOiBSZW5kZXJDb21tYW5kVmlzaXRvciwgY29udGV4dDogYW55KTogYW55IHtcbiAgICByZXR1cm4gdmlzaXRvci52aXNpdEVtYmVkZGVkVGVtcGxhdGUodGhpcywgY29udGV4dCk7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy93ZWJfd29ya2Vycy9zaGFyZWQvYXBpLnRzXG4gKiovIiwiaW1wb3J0IHtJbmplY3RhYmxlLCBJbmplY3R9IGZyb20gXCJhbmd1bGFyMi9zcmMvY29yZS9kaVwiO1xuaW1wb3J0IHtSZW5kZXJQcm90b1ZpZXdSZWZ9IGZyb20gXCJhbmd1bGFyMi9zcmMvY29yZS9yZW5kZXIvYXBpXCI7XG5pbXBvcnQge09OX1dFQl9XT1JLRVJ9IGZyb20gXCJhbmd1bGFyMi9zcmMvd2ViX3dvcmtlcnMvc2hhcmVkL2FwaVwiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUmVuZGVyUHJvdG9WaWV3UmVmU3RvcmUge1xuICBwcml2YXRlIF9sb29rdXBCeUluZGV4OiBNYXA8bnVtYmVyLCBSZW5kZXJQcm90b1ZpZXdSZWY+ID0gbmV3IE1hcDxudW1iZXIsIFJlbmRlclByb3RvVmlld1JlZj4oKTtcbiAgcHJpdmF0ZSBfbG9va3VwQnlQcm90b1ZpZXc6IE1hcDxSZW5kZXJQcm90b1ZpZXdSZWYsIG51bWJlcj4gPVxuICAgICAgbmV3IE1hcDxSZW5kZXJQcm90b1ZpZXdSZWYsIG51bWJlcj4oKTtcbiAgcHJpdmF0ZSBfbmV4dEluZGV4OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9vbldlYndvcmtlcjogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KE9OX1dFQl9XT1JLRVIpIG9uV2Vid29ya2VyKSB7IHRoaXMuX29uV2Vid29ya2VyID0gb25XZWJ3b3JrZXI7IH1cblxuICBhbGxvY2F0ZSgpOiBSZW5kZXJQcm90b1ZpZXdSZWYge1xuICAgIHZhciBpbmRleCA9IHRoaXMuX25leHRJbmRleCsrO1xuICAgIHZhciByZXN1bHQgPSBuZXcgV2ViV29ya2VyUmVuZGVyUHJvdG9WaWV3UmVmKGluZGV4KTtcbiAgICB0aGlzLnN0b3JlKHJlc3VsdCwgaW5kZXgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBzdG9yZShyZWY6IFJlbmRlclByb3RvVmlld1JlZiwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2xvb2t1cEJ5UHJvdG9WaWV3LnNldChyZWYsIGluZGV4KTtcbiAgICB0aGlzLl9sb29rdXBCeUluZGV4LnNldChpbmRleCwgcmVmKTtcbiAgfVxuXG4gIGRlc2VyaWFsaXplKGluZGV4OiBudW1iZXIpOiBSZW5kZXJQcm90b1ZpZXdSZWYge1xuICAgIGlmIChpbmRleCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2xvb2t1cEJ5SW5kZXguZ2V0KGluZGV4KTtcbiAgfVxuXG4gIHNlcmlhbGl6ZShyZWY6IFJlbmRlclByb3RvVmlld1JlZik6IG51bWJlciB7XG4gICAgaWYgKHJlZiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX29uV2Vid29ya2VyKSB7XG4gICAgICByZXR1cm4gKDxXZWJXb3JrZXJSZW5kZXJQcm90b1ZpZXdSZWY+cmVmKS5yZWZOdW1iZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl9sb29rdXBCeVByb3RvVmlldy5nZXQocmVmKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFdlYldvcmtlclJlbmRlclByb3RvVmlld1JlZiBleHRlbmRzIFJlbmRlclByb3RvVmlld1JlZiB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWZOdW1iZXI6IG51bWJlcikgeyBzdXBlcigpOyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvd2ViX3dvcmtlcnMvc2hhcmVkL3JlbmRlcl9wcm90b192aWV3X3JlZl9zdG9yZS50c1xuICoqLyIsImltcG9ydCB7SW5qZWN0YWJsZSwgSW5qZWN0fSBmcm9tIFwiYW5ndWxhcjIvc3JjL2NvcmUvZGlcIjtcbmltcG9ydCB7XG4gIFJlbmRlclZpZXdSZWYsXG4gIFJlbmRlckZyYWdtZW50UmVmLFxuICBSZW5kZXJWaWV3V2l0aEZyYWdtZW50c1xufSBmcm9tIFwiYW5ndWxhcjIvc3JjL2NvcmUvcmVuZGVyL2FwaVwiO1xuaW1wb3J0IHtPTl9XRUJfV09SS0VSfSBmcm9tIFwiYW5ndWxhcjIvc3JjL3dlYl93b3JrZXJzL3NoYXJlZC9hcGlcIjtcbmltcG9ydCB7TWFwV3JhcHBlciwgTGlzdFdyYXBwZXJ9IGZyb20gXCJhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb25cIjtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJlbmRlclZpZXdXaXRoRnJhZ21lbnRzU3RvcmUge1xuICBwcml2YXRlIF9uZXh0SW5kZXg6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX29uV2ViV29ya2VyOiBib29sZWFuO1xuICBwcml2YXRlIF9sb29rdXBCeUluZGV4OiBNYXA8bnVtYmVyLCBSZW5kZXJWaWV3UmVmIHwgUmVuZGVyRnJhZ21lbnRSZWY+O1xuICBwcml2YXRlIF9sb29rdXBCeVZpZXc6IE1hcDxSZW5kZXJWaWV3UmVmIHwgUmVuZGVyRnJhZ21lbnRSZWYsIG51bWJlcj47XG4gIHByaXZhdGUgX3ZpZXdGcmFnbWVudHM6IE1hcDxSZW5kZXJWaWV3UmVmLCBSZW5kZXJGcmFnbWVudFJlZltdPjtcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KE9OX1dFQl9XT1JLRVIpIG9uV2ViV29ya2VyKSB7XG4gICAgdGhpcy5fb25XZWJXb3JrZXIgPSBvbldlYldvcmtlcjtcbiAgICB0aGlzLl9sb29rdXBCeUluZGV4ID0gbmV3IE1hcDxudW1iZXIsIFJlbmRlclZpZXdSZWYgfCBSZW5kZXJGcmFnbWVudFJlZj4oKTtcbiAgICB0aGlzLl9sb29rdXBCeVZpZXcgPSBuZXcgTWFwPFJlbmRlclZpZXdSZWYgfCBSZW5kZXJGcmFnbWVudFJlZiwgbnVtYmVyPigpO1xuICAgIHRoaXMuX3ZpZXdGcmFnbWVudHMgPSBuZXcgTWFwPFJlbmRlclZpZXdSZWYsIFJlbmRlckZyYWdtZW50UmVmW10+KCk7XG4gIH1cblxuICBhbGxvY2F0ZShmcmFnbWVudENvdW50OiBudW1iZXIpOiBSZW5kZXJWaWV3V2l0aEZyYWdtZW50cyB7XG4gICAgdmFyIGluaXRpYWxJbmRleCA9IHRoaXMuX25leHRJbmRleDtcblxuICAgIHZhciB2aWV3UmVmID0gbmV3IFdlYldvcmtlclJlbmRlclZpZXdSZWYodGhpcy5fbmV4dEluZGV4KyspO1xuICAgIHZhciBmcmFnbWVudFJlZnMgPSBMaXN0V3JhcHBlci5jcmVhdGVHcm93YWJsZVNpemUoZnJhZ21lbnRDb3VudCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZyYWdtZW50Q291bnQ7IGkrKykge1xuICAgICAgZnJhZ21lbnRSZWZzW2ldID0gbmV3IFdlYldvcmtlclJlbmRlckZyYWdtZW50UmVmKHRoaXMuX25leHRJbmRleCsrKTtcbiAgICB9XG4gICAgdmFyIHJlbmRlclZpZXdXaXRoRnJhZ21lbnRzID0gbmV3IFJlbmRlclZpZXdXaXRoRnJhZ21lbnRzKHZpZXdSZWYsIGZyYWdtZW50UmVmcyk7XG4gICAgdGhpcy5zdG9yZShyZW5kZXJWaWV3V2l0aEZyYWdtZW50cywgaW5pdGlhbEluZGV4KTtcbiAgICByZXR1cm4gcmVuZGVyVmlld1dpdGhGcmFnbWVudHM7XG4gIH1cblxuICBzdG9yZSh2aWV3OiBSZW5kZXJWaWV3V2l0aEZyYWdtZW50cywgc3RhcnRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fbG9va3VwQnlJbmRleC5zZXQoc3RhcnRJbmRleCwgdmlldy52aWV3UmVmKTtcbiAgICB0aGlzLl9sb29rdXBCeVZpZXcuc2V0KHZpZXcudmlld1JlZiwgc3RhcnRJbmRleCk7XG4gICAgc3RhcnRJbmRleCsrO1xuXG4gICAgdmlldy5mcmFnbWVudFJlZnMuZm9yRWFjaChyZWYgPT4ge1xuICAgICAgdGhpcy5fbG9va3VwQnlJbmRleC5zZXQoc3RhcnRJbmRleCwgcmVmKTtcbiAgICAgIHRoaXMuX2xvb2t1cEJ5Vmlldy5zZXQocmVmLCBzdGFydEluZGV4KTtcbiAgICAgIHN0YXJ0SW5kZXgrKztcbiAgICB9KTtcblxuICAgIHRoaXMuX3ZpZXdGcmFnbWVudHMuc2V0KHZpZXcudmlld1JlZiwgdmlldy5mcmFnbWVudFJlZnMpO1xuICB9XG5cbiAgcmVtb3ZlKHZpZXc6IFJlbmRlclZpZXdSZWYpOiB2b2lkIHtcbiAgICB0aGlzLl9yZW1vdmVSZWYodmlldyk7XG4gICAgdmFyIGZyYWdtZW50cyA9IHRoaXMuX3ZpZXdGcmFnbWVudHMuZ2V0KHZpZXcpO1xuICAgIGZyYWdtZW50cy5mb3JFYWNoKChmcmFnbWVudCkgPT4geyB0aGlzLl9yZW1vdmVSZWYoZnJhZ21lbnQpOyB9KTtcbiAgICB0aGlzLl92aWV3RnJhZ21lbnRzLmRlbGV0ZSh2aWV3KTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbW92ZVJlZihyZWY6IFJlbmRlclZpZXdSZWYgfCBSZW5kZXJGcmFnbWVudFJlZikge1xuICAgIHZhciBpbmRleCA9IHRoaXMuX2xvb2t1cEJ5Vmlldy5nZXQocmVmKTtcbiAgICB0aGlzLl9sb29rdXBCeVZpZXcuZGVsZXRlKHJlZik7XG4gICAgdGhpcy5fbG9va3VwQnlJbmRleC5kZWxldGUoaW5kZXgpO1xuICB9XG5cbiAgc2VyaWFsaXplUmVuZGVyVmlld1JlZih2aWV3UmVmOiBSZW5kZXJWaWV3UmVmKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc2VyaWFsaXplUmVuZGVyRnJhZ21lbnRPclZpZXdSZWYodmlld1JlZik7XG4gIH1cblxuICBzZXJpYWxpemVSZW5kZXJGcmFnbWVudFJlZihmcmFnbWVudFJlZjogUmVuZGVyRnJhZ21lbnRSZWYpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9zZXJpYWxpemVSZW5kZXJGcmFnbWVudE9yVmlld1JlZihmcmFnbWVudFJlZik7XG4gIH1cblxuICBkZXNlcmlhbGl6ZVJlbmRlclZpZXdSZWYocmVmOiBudW1iZXIpOiBSZW5kZXJWaWV3UmVmIHtcbiAgICBpZiAocmVmID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9yZXRyaWV2ZShyZWYpO1xuICB9XG5cbiAgZGVzZXJpYWxpemVSZW5kZXJGcmFnbWVudFJlZihyZWY6IG51bWJlcik6IFJlbmRlckZyYWdtZW50UmVmIHtcbiAgICBpZiAocmVmID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9yZXRyaWV2ZShyZWYpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmV0cmlldmUocmVmOiBudW1iZXIpOiBSZW5kZXJWaWV3UmVmIHwgUmVuZGVyRnJhZ21lbnRSZWYge1xuICAgIGlmIChyZWYgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9sb29rdXBCeUluZGV4LmhhcyhyZWYpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fbG9va3VwQnlJbmRleC5nZXQocmVmKTtcbiAgfVxuXG5cbiAgcHJpdmF0ZSBfc2VyaWFsaXplUmVuZGVyRnJhZ21lbnRPclZpZXdSZWYocmVmOiBSZW5kZXJWaWV3UmVmIHwgUmVuZGVyRnJhZ21lbnRSZWYpOiBudW1iZXIge1xuICAgIGlmIChyZWYgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX29uV2ViV29ya2VyKSB7XG4gICAgICByZXR1cm4gKDxXZWJXb3JrZXJSZW5kZXJGcmFnbWVudFJlZiB8IFdlYldvcmtlclJlbmRlclZpZXdSZWY+cmVmKS5zZXJpYWxpemUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX2xvb2t1cEJ5Vmlldy5nZXQocmVmKTtcbiAgICB9XG4gIH1cblxuICBzZXJpYWxpemVWaWV3V2l0aEZyYWdtZW50cyh2aWV3OiBSZW5kZXJWaWV3V2l0aEZyYWdtZW50cyk6IHtba2V5OiBzdHJpbmddOiBhbnl9IHtcbiAgICBpZiAodmlldyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fb25XZWJXb3JrZXIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICd2aWV3UmVmJzogKDxXZWJXb3JrZXJSZW5kZXJWaWV3UmVmPnZpZXcudmlld1JlZikuc2VyaWFsaXplKCksXG4gICAgICAgICdmcmFnbWVudFJlZnMnOiB2aWV3LmZyYWdtZW50UmVmcy5tYXAodmFsID0+ICg8YW55PnZhbCkuc2VyaWFsaXplKCkpXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAndmlld1JlZic6IHRoaXMuX2xvb2t1cEJ5Vmlldy5nZXQodmlldy52aWV3UmVmKSxcbiAgICAgICAgJ2ZyYWdtZW50UmVmcyc6IHZpZXcuZnJhZ21lbnRSZWZzLm1hcCh2YWwgPT4gdGhpcy5fbG9va3VwQnlWaWV3LmdldCh2YWwpKVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBkZXNlcmlhbGl6ZVZpZXdXaXRoRnJhZ21lbnRzKG9iajoge1trZXk6IHN0cmluZ106IGFueX0pOiBSZW5kZXJWaWV3V2l0aEZyYWdtZW50cyB7XG4gICAgaWYgKG9iaiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgdmlld1JlZiA9IHRoaXMuZGVzZXJpYWxpemVSZW5kZXJWaWV3UmVmKG9ialsndmlld1JlZiddKTtcbiAgICB2YXIgZnJhZ21lbnRzID0gKDxhbnlbXT5vYmpbJ2ZyYWdtZW50UmVmcyddKS5tYXAodmFsID0+IHRoaXMuZGVzZXJpYWxpemVSZW5kZXJGcmFnbWVudFJlZih2YWwpKTtcblxuICAgIHJldHVybiBuZXcgUmVuZGVyVmlld1dpdGhGcmFnbWVudHModmlld1JlZiwgZnJhZ21lbnRzKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgV2ViV29ya2VyUmVuZGVyVmlld1JlZiBleHRlbmRzIFJlbmRlclZpZXdSZWYge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmTnVtYmVyOiBudW1iZXIpIHsgc3VwZXIoKTsgfVxuICBzZXJpYWxpemUoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMucmVmTnVtYmVyOyB9XG5cbiAgc3RhdGljIGRlc2VyaWFsaXplKHJlZjogbnVtYmVyKTogV2ViV29ya2VyUmVuZGVyVmlld1JlZiB7XG4gICAgcmV0dXJuIG5ldyBXZWJXb3JrZXJSZW5kZXJWaWV3UmVmKHJlZik7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFdlYldvcmtlclJlbmRlckZyYWdtZW50UmVmIGV4dGVuZHMgUmVuZGVyRnJhZ21lbnRSZWYge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmTnVtYmVyOiBudW1iZXIpIHsgc3VwZXIoKTsgfVxuXG4gIHNlcmlhbGl6ZSgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5yZWZOdW1iZXI7IH1cblxuICBzdGF0aWMgZGVzZXJpYWxpemUocmVmOiBudW1iZXIpOiBXZWJXb3JrZXJSZW5kZXJGcmFnbWVudFJlZiB7XG4gICAgcmV0dXJuIG5ldyBXZWJXb3JrZXJSZW5kZXJGcmFnbWVudFJlZihyZWYpO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvd2ViX3dvcmtlcnMvc2hhcmVkL3JlbmRlcl92aWV3X3dpdGhfZnJhZ21lbnRzX3N0b3JlLnRzXG4gKiovIiwiaW1wb3J0IHtET019IGZyb20gJ2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZG9tX2FkYXB0ZXInO1xuaW1wb3J0IHtnbG9iYWwsIGlzU3RyaW5nfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtTdHJpbmdNYXBXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuXG4vKipcbiAqIEphc21pbmUgbWF0Y2hlcnMgdGhhdCBjaGVjayBBbmd1bGFyIHNwZWNpZmljIGNvbmRpdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmdNYXRjaGVycyBleHRlbmRzIGphc21pbmUuTWF0Y2hlcnMge1xuICAvKipcbiAgICogRXhwZWN0IHRoZSB2YWx1ZSB0byBiZSBhIGBQcm9taXNlYC5cbiAgICpcbiAgICogIyMgRXhhbXBsZVxuICAgKlxuICAgKiB7QGV4YW1wbGUgdGVzdGluZy90cy9tYXRjaGVycy50cyByZWdpb249J3RvQmVQcm9taXNlJ31cbiAgICovXG4gIHRvQmVQcm9taXNlKCk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEV4cGVjdCB0aGUgdmFsdWUgdG8gYmUgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcy5cbiAgICpcbiAgICogIyMgRXhhbXBsZVxuICAgKlxuICAgKiB7QGV4YW1wbGUgdGVzdGluZy90cy9tYXRjaGVycy50cyByZWdpb249J3RvQmVBbkluc3RhbmNlT2YnfVxuICAgKi9cbiAgdG9CZUFuSW5zdGFuY2VPZihleHBlY3RlZDogYW55KTogYm9vbGVhbjtcblxuICAvKipcbiAgICogRXhwZWN0IHRoZSBlbGVtZW50IHRvIGhhdmUgZXhhY3RseSB0aGUgZ2l2ZW4gdGV4dC5cbiAgICpcbiAgICogIyMgRXhhbXBsZVxuICAgKlxuICAgKiB7QGV4YW1wbGUgdGVzdGluZy90cy9tYXRjaGVycy50cyByZWdpb249J3RvSGF2ZVRleHQnfVxuICAgKi9cbiAgdG9IYXZlVGV4dChleHBlY3RlZDogYW55KTogYm9vbGVhbjtcblxuICAvKipcbiAgICogRXhwZWN0IHRoZSBlbGVtZW50IHRvIGhhdmUgdGhlIGdpdmVuIENTUyBjbGFzcy5cbiAgICpcbiAgICogIyMgRXhhbXBsZVxuICAgKlxuICAgKiB7QGV4YW1wbGUgdGVzdGluZy90cy9tYXRjaGVycy50cyByZWdpb249J3RvSGF2ZUNzc0NsYXNzJ31cbiAgICovXG4gIHRvSGF2ZUNzc0NsYXNzKGV4cGVjdGVkOiBhbnkpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFeHBlY3QgdGhlIGVsZW1lbnQgdG8gaGF2ZSB0aGUgZ2l2ZW4gQ1NTIHN0eWxlcy5cbiAgICpcbiAgICogIyMgRXhhbXBsZVxuICAgKlxuICAgKiB7QGV4YW1wbGUgdGVzdGluZy90cy9tYXRjaGVycy50cyByZWdpb249J3RvSGF2ZUNzc1N0eWxlJ31cbiAgICovXG4gIHRvSGF2ZUNzc1N0eWxlKGV4cGVjdGVkOiBhbnkpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFeHBlY3QgYSBjbGFzcyB0byBpbXBsZW1lbnQgdGhlIGludGVyZmFjZSBvZiB0aGUgZ2l2ZW4gY2xhc3MuXG4gICAqXG4gICAqICMjIEV4YW1wbGVcbiAgICpcbiAgICoge0BleGFtcGxlIHRlc3RpbmcvdHMvbWF0Y2hlcnMudHMgcmVnaW9uPSd0b0ltcGxlbWVudCd9XG4gICAqL1xuICB0b0ltcGxlbWVudChleHBlY3RlZDogYW55KTogYm9vbGVhbjtcblxuICAvKipcbiAgICogRXhwZWN0IGFuIGV4Y2VwdGlvbiB0byBjb250YWluIHRoZSBnaXZlbiBlcnJvciB0ZXh0LlxuICAgKlxuICAgKiAjIyBFeGFtcGxlXG4gICAqXG4gICAqIHtAZXhhbXBsZSB0ZXN0aW5nL3RzL21hdGNoZXJzLnRzIHJlZ2lvbj0ndG9Db250YWluRXJyb3InfVxuICAgKi9cbiAgdG9Db250YWluRXJyb3IoZXhwZWN0ZWQ6IGFueSk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEV4cGVjdCBhIGZ1bmN0aW9uIHRvIHRocm93IGFuIGVycm9yIHdpdGggdGhlIGdpdmVuIGVycm9yIHRleHQgd2hlbiBleGVjdXRlZC5cbiAgICpcbiAgICogIyMgRXhhbXBsZVxuICAgKlxuICAgKiB7QGV4YW1wbGUgdGVzdGluZy90cy9tYXRjaGVycy50cyByZWdpb249J3RvVGhyb3dFcnJvcldpdGgnfVxuICAgKi9cbiAgdG9UaHJvd0Vycm9yV2l0aChleHBlY3RlZE1lc3NhZ2U6IGFueSk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEludmVydCB0aGUgbWF0Y2hlcnMuXG4gICAqL1xuICBub3Q6IE5nTWF0Y2hlcnM7XG59XG5cbnZhciBfZ2xvYmFsOiBqYXNtaW5lLkdsb2JhbFBvbGx1dGVyID0gPGFueT4odHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiB3aW5kb3cpO1xuXG4vKipcbiAqIEphc21pbmUgbWF0Y2hpbmcgZnVuY3Rpb24gd2l0aCBBbmd1bGFyIG1hdGNoZXJzIG1peGVkIGluLlxuICpcbiAqICMjIEV4YW1wbGVcbiAqXG4gKiB7QGV4YW1wbGUgdGVzdGluZy90cy9tYXRjaGVycy50cyByZWdpb249J3RvSGF2ZVRleHQnfVxuICovXG5leHBvcnQgdmFyIGV4cGVjdDogKGFjdHVhbDogYW55KSA9PiBOZ01hdGNoZXJzID0gPGFueT5fZ2xvYmFsLmV4cGVjdDtcblxuXG4vLyBTb21lIE1hcCBwb2x5ZmlsbHMgZG9uJ3QgcG9seWZpbGwgTWFwLnRvU3RyaW5nIGNvcnJlY3RseSwgd2hpY2hcbi8vIGdpdmVzIHVzIGJhZCBlcnJvciBtZXNzYWdlcyBpbiB0ZXN0cy5cbi8vIFRoZSBvbmx5IHdheSB0byBkbyB0aGlzIGluIEphc21pbmUgaXMgdG8gbW9ua2V5IHBhdGNoIGEgbWV0aG9kXG4vLyB0byB0aGUgb2JqZWN0IDotKFxuTWFwLnByb3RvdHlwZVsnamFzbWluZVRvU3RyaW5nJ10gPSBmdW5jdGlvbigpIHtcbiAgdmFyIG0gPSB0aGlzO1xuICBpZiAoIW0pIHtcbiAgICByZXR1cm4gJycgKyBtO1xuICB9XG4gIHZhciByZXMgPSBbXTtcbiAgbS5mb3JFYWNoKCh2LCBrKSA9PiB7IHJlcy5wdXNoKGAke2t9OiR7dn1gKTsgfSk7XG4gIHJldHVybiBgeyAke3Jlcy5qb2luKCcsJyl9IH1gO1xufTtcblxuX2dsb2JhbC5iZWZvcmVFYWNoKGZ1bmN0aW9uKCkge1xuICBqYXNtaW5lLmFkZE1hdGNoZXJzKHtcbiAgICAvLyBDdXN0b20gaGFuZGxlciBmb3IgTWFwIGFzIEphc21pbmUgZG9lcyBub3Qgc3VwcG9ydCBpdCB5ZXRcbiAgICB0b0VxdWFsOiBmdW5jdGlvbih1dGlsLCBjdXN0b21FcXVhbGl0eVRlc3RlcnMpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbXBhcmU6IGZ1bmN0aW9uKGFjdHVhbCwgZXhwZWN0ZWQpIHtcbiAgICAgICAgICByZXR1cm4ge3Bhc3M6IHV0aWwuZXF1YWxzKGFjdHVhbCwgZXhwZWN0ZWQsIFtjb21wYXJlTWFwXSl9O1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBmdW5jdGlvbiBjb21wYXJlTWFwKGFjdHVhbCwgZXhwZWN0ZWQpIHtcbiAgICAgICAgaWYgKGFjdHVhbCBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICAgIHZhciBwYXNzID0gYWN0dWFsLnNpemUgPT09IGV4cGVjdGVkLnNpemU7XG4gICAgICAgICAgaWYgKHBhc3MpIHtcbiAgICAgICAgICAgIGFjdHVhbC5mb3JFYWNoKCh2LCBrKSA9PiB7IHBhc3MgPSBwYXNzICYmIHV0aWwuZXF1YWxzKHYsIGV4cGVjdGVkLmdldChrKSk7IH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcGFzcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIHRvQmVQcm9taXNlOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbXBhcmU6IGZ1bmN0aW9uKGFjdHVhbCwgZXhwZWN0ZWRDbGFzcykge1xuICAgICAgICAgIHZhciBwYXNzID0gdHlwZW9mIGFjdHVhbCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIGFjdHVhbC50aGVuID09PSAnZnVuY3Rpb24nO1xuICAgICAgICAgIHJldHVybiB7cGFzczogcGFzcywgZ2V0IG1lc3NhZ2UoKSB7IHJldHVybiAnRXhwZWN0ZWQgJyArIGFjdHVhbCArICcgdG8gYmUgYSBwcm9taXNlJzsgfX07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSxcblxuICAgIHRvQmVBbkluc3RhbmNlT2Y6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29tcGFyZTogZnVuY3Rpb24oYWN0dWFsLCBleHBlY3RlZENsYXNzKSB7XG4gICAgICAgICAgdmFyIHBhc3MgPSB0eXBlb2YgYWN0dWFsID09PSAnb2JqZWN0JyAmJiBhY3R1YWwgaW5zdGFuY2VvZiBleHBlY3RlZENsYXNzO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwYXNzOiBwYXNzLFxuICAgICAgICAgICAgZ2V0IG1lc3NhZ2UoKSB7XG4gICAgICAgICAgICAgIHJldHVybiAnRXhwZWN0ZWQgJyArIGFjdHVhbCArICcgdG8gYmUgYW4gaW5zdGFuY2Ugb2YgJyArIGV4cGVjdGVkQ2xhc3M7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9LFxuXG4gICAgdG9IYXZlVGV4dDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb21wYXJlOiBmdW5jdGlvbihhY3R1YWwsIGV4cGVjdGVkVGV4dCkge1xuICAgICAgICAgIHZhciBhY3R1YWxUZXh0ID0gZWxlbWVudFRleHQoYWN0dWFsKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcGFzczogYWN0dWFsVGV4dCA9PSBleHBlY3RlZFRleHQsXG4gICAgICAgICAgICBnZXQgbWVzc2FnZSgpIHsgcmV0dXJuICdFeHBlY3RlZCAnICsgYWN0dWFsVGV4dCArICcgdG8gYmUgZXF1YWwgdG8gJyArIGV4cGVjdGVkVGV4dDsgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSxcblxuICAgIHRvSGF2ZUNzc0NsYXNzOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB7Y29tcGFyZTogYnVpbGRFcnJvcihmYWxzZSksIG5lZ2F0aXZlQ29tcGFyZTogYnVpbGRFcnJvcih0cnVlKX07XG5cbiAgICAgIGZ1bmN0aW9uIGJ1aWxkRXJyb3IoaXNOb3QpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGFjdHVhbCwgY2xhc3NOYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBhc3M6IERPTS5oYXNDbGFzcyhhY3R1YWwsIGNsYXNzTmFtZSkgPT0gIWlzTm90LFxuICAgICAgICAgICAgZ2V0IG1lc3NhZ2UoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBgRXhwZWN0ZWQgJHthY3R1YWwub3V0ZXJIVE1MfSAke2lzTm90ID8gJ25vdCAnIDogJyd9dG8gY29udGFpbiB0aGUgQ1NTIGNsYXNzIFwiJHtjbGFzc05hbWV9XCJgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSxcblxuICAgIHRvSGF2ZUNzc1N0eWxlOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbXBhcmU6IGZ1bmN0aW9uKGFjdHVhbCwgc3R5bGVzKSB7XG4gICAgICAgICAgdmFyIGFsbFBhc3NlZDtcbiAgICAgICAgICBpZiAoaXNTdHJpbmcoc3R5bGVzKSkge1xuICAgICAgICAgICAgYWxsUGFzc2VkID0gRE9NLmhhc1N0eWxlKGFjdHVhbCwgc3R5bGVzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWxsUGFzc2VkID0gIVN0cmluZ01hcFdyYXBwZXIuaXNFbXB0eShzdHlsZXMpO1xuICAgICAgICAgICAgU3RyaW5nTWFwV3JhcHBlci5mb3JFYWNoKHN0eWxlcywgKHN0eWxlLCBwcm9wKSA9PiB7XG4gICAgICAgICAgICAgIGFsbFBhc3NlZCA9IGFsbFBhc3NlZCAmJiBET00uaGFzU3R5bGUoYWN0dWFsLCBwcm9wLCBzdHlsZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcGFzczogYWxsUGFzc2VkLFxuICAgICAgICAgICAgZ2V0IG1lc3NhZ2UoKSB7XG4gICAgICAgICAgICAgIHZhciBleHBlY3RlZFZhbHVlU3RyID0gaXNTdHJpbmcoc3R5bGVzKSA/IHN0eWxlcyA6IEpTT04uc3RyaW5naWZ5KHN0eWxlcyk7XG4gICAgICAgICAgICAgIHJldHVybiBgRXhwZWN0ZWQgJHthY3R1YWwub3V0ZXJIVE1MfSAkeyFhbGxQYXNzZWQgPyAnICcgOiAnbm90ICd9dG8gY29udGFpbiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICBDU1MgJHtpc1N0cmluZyhzdHlsZXMpID8gJ3Byb3BlcnR5JyA6ICdzdHlsZXMnfSBcIiR7ZXhwZWN0ZWRWYWx1ZVN0cn1cImA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9LFxuXG4gICAgdG9Db250YWluRXJyb3I6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29tcGFyZTogZnVuY3Rpb24oYWN0dWFsLCBleHBlY3RlZFRleHQpIHtcbiAgICAgICAgICB2YXIgZXJyb3JNZXNzYWdlID0gYWN0dWFsLnRvU3RyaW5nKCk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBhc3M6IGVycm9yTWVzc2FnZS5pbmRleE9mKGV4cGVjdGVkVGV4dCkgPiAtMSxcbiAgICAgICAgICAgIGdldCBtZXNzYWdlKCkgeyByZXR1cm4gJ0V4cGVjdGVkICcgKyBlcnJvck1lc3NhZ2UgKyAnIHRvIGNvbnRhaW4gJyArIGV4cGVjdGVkVGV4dDsgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSxcblxuICAgIHRvVGhyb3dFcnJvcldpdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29tcGFyZTogZnVuY3Rpb24oYWN0dWFsLCBleHBlY3RlZFRleHQpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYWN0dWFsKCk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBwYXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgZ2V0IG1lc3NhZ2UoKSB7IHJldHVybiBcIldhcyBleHBlY3RlZCB0byB0aHJvdywgYnV0IGRpZCBub3QgdGhyb3dcIjsgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB2YXIgZXJyb3JNZXNzYWdlID0gZS50b1N0cmluZygpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgcGFzczogZXJyb3JNZXNzYWdlLmluZGV4T2YoZXhwZWN0ZWRUZXh0KSA+IC0xLFxuICAgICAgICAgICAgICBnZXQgbWVzc2FnZSgpIHsgcmV0dXJuICdFeHBlY3RlZCAnICsgZXJyb3JNZXNzYWdlICsgJyB0byBjb250YWluICcgKyBleHBlY3RlZFRleHQ7IH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sXG5cbiAgICB0b0ltcGxlbWVudDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb21wYXJlOiBmdW5jdGlvbihhY3R1YWxPYmplY3QsIGV4cGVjdGVkSW50ZXJmYWNlKSB7XG4gICAgICAgICAgdmFyIG9ialByb3BzID0gT2JqZWN0LmtleXMoYWN0dWFsT2JqZWN0LmNvbnN0cnVjdG9yLnByb3RvdHlwZSk7XG4gICAgICAgICAgdmFyIGludFByb3BzID0gT2JqZWN0LmtleXMoZXhwZWN0ZWRJbnRlcmZhY2UucHJvdG90eXBlKTtcblxuICAgICAgICAgIHZhciBtaXNzZWRNZXRob2RzID0gW107XG4gICAgICAgICAgaW50UHJvcHMuZm9yRWFjaCgoaykgPT4ge1xuICAgICAgICAgICAgaWYgKCFhY3R1YWxPYmplY3QuY29uc3RydWN0b3IucHJvdG90eXBlW2tdKSBtaXNzZWRNZXRob2RzLnB1c2goayk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcGFzczogbWlzc2VkTWV0aG9kcy5sZW5ndGggPT0gMCxcbiAgICAgICAgICAgIGdldCBtZXNzYWdlKCkge1xuICAgICAgICAgICAgICByZXR1cm4gJ0V4cGVjdGVkICcgKyBhY3R1YWxPYmplY3QgKyAnIHRvIGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzOiAnICtcbiAgICAgICAgICAgICAgICAgICAgIG1pc3NlZE1ldGhvZHMuam9pbihcIiwgXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9KTtcbn0pO1xuXG5mdW5jdGlvbiBlbGVtZW50VGV4dChuKSB7XG4gIHZhciBoYXNOb2RlcyA9IChuKSA9PiB7XG4gICAgdmFyIGNoaWxkcmVuID0gRE9NLmNoaWxkTm9kZXMobik7XG4gICAgcmV0dXJuIGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCA+IDA7XG4gIH07XG5cbiAgaWYgKG4gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgIHJldHVybiBuLm1hcChlbGVtZW50VGV4dCkuam9pbihcIlwiKTtcbiAgfVxuXG4gIGlmIChET00uaXNDb21tZW50Tm9kZShuKSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGlmIChET00uaXNFbGVtZW50Tm9kZShuKSAmJiBET00udGFnTmFtZShuKSA9PSAnQ09OVEVOVCcpIHtcbiAgICByZXR1cm4gZWxlbWVudFRleHQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KERPTS5nZXREaXN0cmlidXRlZE5vZGVzKG4pKSk7XG4gIH1cblxuICBpZiAoRE9NLmhhc1NoYWRvd1Jvb3QobikpIHtcbiAgICByZXR1cm4gZWxlbWVudFRleHQoRE9NLmNoaWxkTm9kZXNBc0xpc3QoRE9NLmdldFNoYWRvd1Jvb3QobikpKTtcbiAgfVxuXG4gIGlmIChoYXNOb2RlcyhuKSkge1xuICAgIHJldHVybiBlbGVtZW50VGV4dChET00uY2hpbGROb2Rlc0FzTGlzdChuKSk7XG4gIH1cblxuICByZXR1cm4gRE9NLmdldFRleHQobik7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvdGVzdGluZy9tYXRjaGVycy50c1xuICoqLyIsImltcG9ydCB7Z2xvYmFsfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9uLCBXcmFwcGVkRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtMaXN0V3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcbmltcG9ydCB7Tmdab25lWm9uZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvem9uZS9uZ196b25lJztcblxudmFyIF9zY2hlZHVsZXI7XG52YXIgX21pY3JvdGFza3M6IEZ1bmN0aW9uW10gPSBbXTtcbnZhciBfcGVuZGluZ1BlcmlvZGljVGltZXJzOiBudW1iZXJbXSA9IFtdO1xudmFyIF9wZW5kaW5nVGltZXJzOiBudW1iZXJbXSA9IFtdO1xuXG5pbnRlcmZhY2UgRmFrZUFzeW5jWm9uZSBleHRlbmRzIE5nWm9uZVpvbmUge1xuICBfaW5GYWtlQXN5bmNab25lOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFdyYXBzIGEgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgaW4gdGhlIGZha2VBc3luYyB6b25lOlxuICogLSBtaWNyb3Rhc2tzIGFyZSBtYW51YWxseSBleGVjdXRlZCBieSBjYWxsaW5nIGBmbHVzaE1pY3JvdGFza3MoKWAsXG4gKiAtIHRpbWVycyBhcmUgc3luY2hyb25vdXMsIGB0aWNrKClgIHNpbXVsYXRlcyB0aGUgYXN5bmNocm9ub3VzIHBhc3NhZ2Ugb2YgdGltZS5cbiAqXG4gKiBJZiB0aGVyZSBhcmUgYW55IHBlbmRpbmcgdGltZXJzIGF0IHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLCBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uXG4gKlxuICogIyMgRXhhbXBsZVxuICpcbiAqIHtAZXhhbXBsZSB0ZXN0aW5nL3RzL2Zha2VfYXN5bmMudHMgcmVnaW9uPSdiYXNpYyd9XG4gKlxuICogQHBhcmFtIGZuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFRoZSBmdW5jdGlvbiB3cmFwcGVkIHRvIGJlIGV4ZWN1dGVkIGluIHRoZSBmYWtlQXN5bmMgem9uZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZmFrZUFzeW5jKGZuOiBGdW5jdGlvbik6IEZ1bmN0aW9uIHtcbiAgaWYgKCg8RmFrZUFzeW5jWm9uZT5nbG9iYWwuem9uZSkuX2luRmFrZUFzeW5jWm9uZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignZmFrZUFzeW5jKCkgY2FsbHMgY2FuIG5vdCBiZSBuZXN0ZWQnKTtcbiAgfVxuXG4gIHZhciBmYWtlQXN5bmNab25lID0gPEZha2VBc3luY1pvbmU+Z2xvYmFsLnpvbmUuZm9yayh7XG4gICAgc2V0VGltZW91dDogX3NldFRpbWVvdXQsXG4gICAgY2xlYXJUaW1lb3V0OiBfY2xlYXJUaW1lb3V0LFxuICAgIHNldEludGVydmFsOiBfc2V0SW50ZXJ2YWwsXG4gICAgY2xlYXJJbnRlcnZhbDogX2NsZWFySW50ZXJ2YWwsXG4gICAgc2NoZWR1bGVNaWNyb3Rhc2s6IF9zY2hlZHVsZU1pY3JvdGFzayxcbiAgICBfaW5GYWtlQXN5bmNab25lOiB0cnVlXG4gIH0pO1xuXG4gIHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgLy8gVE9ETyh0Ym9zY2gpOiBUaGlzIGNsYXNzIHNob3VsZCBhbHJlYWR5IGJlIHBhcnQgb2YgdGhlIGphc21pbmUgdHlwaW5ncyBidXQgaXQgaXMgbm90Li4uXG4gICAgX3NjaGVkdWxlciA9IG5ldyAoPGFueT5qYXNtaW5lKS5EZWxheWVkRnVuY3Rpb25TY2hlZHVsZXIoKTtcbiAgICBjbGVhclBlbmRpbmdUaW1lcnMoKTtcblxuICAgIGxldCByZXMgPSBmYWtlQXN5bmNab25lLnJ1bigoKSA9PiB7XG4gICAgICBsZXQgcmVzID0gZm4oLi4uYXJncyk7XG4gICAgICBmbHVzaE1pY3JvdGFza3MoKTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfSk7XG5cbiAgICBpZiAoX3BlbmRpbmdQZXJpb2RpY1RpbWVycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihcbiAgICAgICAgICBgJHtfcGVuZGluZ1BlcmlvZGljVGltZXJzLmxlbmd0aH0gcGVyaW9kaWMgdGltZXIocykgc3RpbGwgaW4gdGhlIHF1ZXVlLmApO1xuICAgIH1cblxuICAgIGlmIChfcGVuZGluZ1RpbWVycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgJHtfcGVuZGluZ1RpbWVycy5sZW5ndGh9IHRpbWVyKHMpIHN0aWxsIGluIHRoZSBxdWV1ZS5gKTtcbiAgICB9XG5cbiAgICBfc2NoZWR1bGVyID0gbnVsbDtcbiAgICBMaXN0V3JhcHBlci5jbGVhcihfbWljcm90YXNrcyk7XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG59XG5cbi8qKlxuICogQ2xlYXIgdGhlIHF1ZXVlIG9mIHBlbmRpbmcgdGltZXJzIGFuZCBtaWNyb3Rhc2tzLlxuICpcbiAqIFVzZWZ1bCBmb3IgY2xlYW5pbmcgdXAgYWZ0ZXIgYW4gYXN5bmNocm9ub3VzIHRlc3QgcGFzc2VzLlxuICpcbiAqICMjIEV4YW1wbGVcbiAqXG4gKiB7QGV4YW1wbGUgdGVzdGluZy90cy9mYWtlX2FzeW5jLnRzIHJlZ2lvbj0ncGVuZGluZyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhclBlbmRpbmdUaW1lcnMoKTogdm9pZCB7XG4gIC8vIFRPRE8gd2Ugc2hvdWxkIGZpeCB0aWNrIHRvIGRlcXVldWUgdGhlIGZhaWxlZCB0aW1lciBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gY2xlYXJQZW5kaW5nVGltZXJzXG4gIExpc3RXcmFwcGVyLmNsZWFyKF9taWNyb3Rhc2tzKTtcbiAgTGlzdFdyYXBwZXIuY2xlYXIoX3BlbmRpbmdQZXJpb2RpY1RpbWVycyk7XG4gIExpc3RXcmFwcGVyLmNsZWFyKF9wZW5kaW5nVGltZXJzKTtcbn1cblxuXG4vKipcbiAqIFNpbXVsYXRlcyB0aGUgYXN5bmNocm9ub3VzIHBhc3NhZ2Ugb2YgdGltZSBmb3IgdGhlIHRpbWVycyBpbiB0aGUgZmFrZUFzeW5jIHpvbmUuXG4gKlxuICogVGhlIG1pY3JvdGFza3MgcXVldWUgaXMgZHJhaW5lZCBhdCB0aGUgdmVyeSBzdGFydCBvZiB0aGlzIGZ1bmN0aW9uIGFuZCBhZnRlciBhbnkgdGltZXIgY2FsbGJhY2tcbiAqIGhhcyBiZWVuIGV4ZWN1dGVkLlxuICpcbiAqICMjIEV4YW1wbGVcbiAqXG4gKiB7QGV4YW1wbGUgdGVzdGluZy90cy9mYWtlX2FzeW5jLnRzIHJlZ2lvbj0nYmFzaWMnfVxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBtaWxsaXMgTnVtYmVyIG9mIG1pbGxpc2Vjb25kLCBkZWZhdWx0cyB0byAwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aWNrKG1pbGxpczogbnVtYmVyID0gMCk6IHZvaWQge1xuICBfYXNzZXJ0SW5GYWtlQXN5bmNab25lKCk7XG4gIGZsdXNoTWljcm90YXNrcygpO1xuICBfc2NoZWR1bGVyLnRpY2sobWlsbGlzKTtcbn1cblxuLyoqXG4gKiBGbHVzaCBhbnkgcGVuZGluZyBtaWNyb3Rhc2tzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmx1c2hNaWNyb3Rhc2tzKCk6IHZvaWQge1xuICBfYXNzZXJ0SW5GYWtlQXN5bmNab25lKCk7XG4gIHdoaWxlIChfbWljcm90YXNrcy5sZW5ndGggPiAwKSB7XG4gICAgdmFyIG1pY3JvdGFzayA9IExpc3RXcmFwcGVyLnJlbW92ZUF0KF9taWNyb3Rhc2tzLCAwKTtcbiAgICBtaWNyb3Rhc2soKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfc2V0VGltZW91dChmbjogRnVuY3Rpb24sIGRlbGF5OiBudW1iZXIsIC4uLmFyZ3MpOiBudW1iZXIge1xuICB2YXIgY2IgPSBfZm5BbmRGbHVzaChmbik7XG4gIHZhciBpZCA9IF9zY2hlZHVsZXIuc2NoZWR1bGVGdW5jdGlvbihjYiwgZGVsYXksIGFyZ3MpO1xuICBfcGVuZGluZ1RpbWVycy5wdXNoKGlkKTtcbiAgX3NjaGVkdWxlci5zY2hlZHVsZUZ1bmN0aW9uKF9kZXF1ZXVlVGltZXIoaWQpLCBkZWxheSk7XG4gIHJldHVybiBpZDtcbn1cblxuZnVuY3Rpb24gX2NsZWFyVGltZW91dChpZDogbnVtYmVyKSB7XG4gIF9kZXF1ZXVlVGltZXIoaWQpO1xuICByZXR1cm4gX3NjaGVkdWxlci5yZW1vdmVGdW5jdGlvbldpdGhJZChpZCk7XG59XG5cbmZ1bmN0aW9uIF9zZXRJbnRlcnZhbChmbjogRnVuY3Rpb24sIGludGVydmFsOiBudW1iZXIsIC4uLmFyZ3MpIHtcbiAgdmFyIGNiID0gX2ZuQW5kRmx1c2goZm4pO1xuICB2YXIgaWQgPSBfc2NoZWR1bGVyLnNjaGVkdWxlRnVuY3Rpb24oY2IsIGludGVydmFsLCBhcmdzLCB0cnVlKTtcbiAgX3BlbmRpbmdQZXJpb2RpY1RpbWVycy5wdXNoKGlkKTtcbiAgcmV0dXJuIGlkO1xufVxuXG5mdW5jdGlvbiBfY2xlYXJJbnRlcnZhbChpZDogbnVtYmVyKSB7XG4gIExpc3RXcmFwcGVyLnJlbW92ZShfcGVuZGluZ1BlcmlvZGljVGltZXJzLCBpZCk7XG4gIHJldHVybiBfc2NoZWR1bGVyLnJlbW92ZUZ1bmN0aW9uV2l0aElkKGlkKTtcbn1cblxuZnVuY3Rpb24gX2ZuQW5kRmx1c2goZm46IEZ1bmN0aW9uKTogRnVuY3Rpb24ge1xuICByZXR1cm4gKC4uLmFyZ3MpID0+IHtcbiAgICBmbi5hcHBseShnbG9iYWwsIGFyZ3MpO1xuICAgIGZsdXNoTWljcm90YXNrcygpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9zY2hlZHVsZU1pY3JvdGFzayhtaWNyb3Rhc2s6IEZ1bmN0aW9uKTogdm9pZCB7XG4gIF9taWNyb3Rhc2tzLnB1c2gobWljcm90YXNrKTtcbn1cblxuZnVuY3Rpb24gX2RlcXVldWVUaW1lcihpZDogbnVtYmVyKTogRnVuY3Rpb24ge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7IExpc3RXcmFwcGVyLnJlbW92ZShfcGVuZGluZ1RpbWVycywgaWQpOyB9XG59XG5cbmZ1bmN0aW9uIF9hc3NlcnRJbkZha2VBc3luY1pvbmUoKTogdm9pZCB7XG4gIGlmICghZ2xvYmFsLnpvbmUgfHwgISg8RmFrZUFzeW5jWm9uZT5nbG9iYWwuem9uZSkuX2luRmFrZUFzeW5jWm9uZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIGNvZGUgc2hvdWxkIGJlIHJ1bm5pbmcgaW4gdGhlIGZha2VBc3luYyB6b25lIHRvIGNhbGwgdGhpcyBmdW5jdGlvbicpO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvdGVzdGluZy9mYWtlX2FzeW5jLnRzXG4gKiovIiwiaW1wb3J0IHtYSFJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb21waWxlci94aHInO1xuaW1wb3J0IHtMaXN0V3JhcHBlciwgTWFwLCBNYXBXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtpc0JsYW5rLCBpc1ByZXNlbnQsIG5vcm1hbGl6ZUJsYW5rfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9uLCBXcmFwcGVkRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtQcm9taXNlQ29tcGxldGVyLCBQcm9taXNlV3JhcHBlciwgUHJvbWlzZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9hc3luYyc7XG5cbi8qKlxuICogQSBtb2NrIGltcGxlbWVuYXRpb24gb2Yge0BsaW5rIFhIUn0gdGhhdCBhbGxvd3Mgb3V0Z29pbmcgcmVxdWVzdHMgdG8gYmUgbW9ja2VkXG4gKiBhbmQgcmVzcG9uZGVkIHRvIHdpdGhpbiBhIHNpbmdsZSB0ZXN0LCB3aXRob3V0IGdvaW5nIHRvIHRoZSBuZXR3b3JrLlxuICovXG5leHBvcnQgY2xhc3MgTW9ja1hIUiBleHRlbmRzIFhIUiB7XG4gIHByaXZhdGUgX2V4cGVjdGF0aW9uczogX0V4cGVjdGF0aW9uW10gPSBbXTtcbiAgcHJpdmF0ZSBfZGVmaW5pdGlvbnMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBwcml2YXRlIF9yZXF1ZXN0czogX1BlbmRpbmdSZXF1ZXN0W10gPSBbXTtcblxuICBnZXQodXJsOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHZhciByZXF1ZXN0ID0gbmV3IF9QZW5kaW5nUmVxdWVzdCh1cmwpO1xuICAgIHRoaXMuX3JlcXVlc3RzLnB1c2gocmVxdWVzdCk7XG4gICAgcmV0dXJuIHJlcXVlc3QuZ2V0UHJvbWlzZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBleHBlY3RhdGlvbiBmb3IgdGhlIGdpdmVuIFVSTC4gSW5jb21pbmcgcmVxdWVzdHMgd2lsbCBiZSBjaGVja2VkIGFnYWluc3RcbiAgICogdGhlIG5leHQgZXhwZWN0YXRpb24gKGluIEZJRk8gb3JkZXIpLiBUaGUgYHZlcmlmeU5vT3V0c3RhbmRpbmdFeHBlY3RhdGlvbnNgIG1ldGhvZFxuICAgKiBjYW4gYmUgdXNlZCB0byBjaGVjayBpZiBhbnkgZXhwZWN0YXRpb25zIGhhdmUgbm90IHlldCBiZWVuIG1ldC5cbiAgICpcbiAgICogVGhlIHJlc3BvbnNlIGdpdmVuIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIGV4cGVjdGF0aW9uIG1hdGNoZXMuXG4gICAqL1xuICBleHBlY3QodXJsOiBzdHJpbmcsIHJlc3BvbnNlOiBzdHJpbmcpIHtcbiAgICB2YXIgZXhwZWN0YXRpb24gPSBuZXcgX0V4cGVjdGF0aW9uKHVybCwgcmVzcG9uc2UpO1xuICAgIHRoaXMuX2V4cGVjdGF0aW9ucy5wdXNoKGV4cGVjdGF0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBkZWZpbml0aW9uIGZvciB0aGUgZ2l2ZW4gVVJMIHRvIHJldHVybiB0aGUgZ2l2ZW4gcmVzcG9uc2UuIFVubGlrZSBleHBlY3RhdGlvbnMsXG4gICAqIGRlZmluaXRpb25zIGhhdmUgbm8gb3JkZXIgYW5kIHdpbGwgc2F0aXNmeSBhbnkgbWF0Y2hpbmcgcmVxdWVzdCBhdCBhbnkgdGltZS4gQWxzb1xuICAgKiB1bmxpa2UgZXhwZWN0YXRpb25zLCB1bnVzZWQgZGVmaW5pdGlvbnMgZG8gbm90IGNhdXNlIGB2ZXJpZnlOb091dHN0YW5kaW5nRXhwZWN0YXRpb25zYFxuICAgKiB0byByZXR1cm4gYW4gZXJyb3IuXG4gICAqL1xuICB3aGVuKHVybDogc3RyaW5nLCByZXNwb25zZTogc3RyaW5nKSB7IHRoaXMuX2RlZmluaXRpb25zLnNldCh1cmwsIHJlc3BvbnNlKTsgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzIHBlbmRpbmcgcmVxdWVzdHMgYW5kIHZlcmlmeSB0aGVyZSBhcmUgbm8gb3V0c3RhbmRpbmcgZXhwZWN0YXRpb25zLiBBbHNvIGZhaWxzXG4gICAqIGlmIG5vIHJlcXVlc3RzIGFyZSBwZW5kaW5nLlxuICAgKi9cbiAgZmx1c2goKSB7XG4gICAgaWYgKHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ05vIHBlbmRpbmcgcmVxdWVzdHMgdG8gZmx1c2gnKTtcbiAgICB9XG5cbiAgICBkbyB7XG4gICAgICB0aGlzLl9wcm9jZXNzUmVxdWVzdCh0aGlzLl9yZXF1ZXN0cy5zaGlmdCgpKTtcbiAgICB9IHdoaWxlICh0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPiAwKTtcblxuICAgIHRoaXMudmVyaWZ5Tm9PdXRzdGFuZGluZ0V4cGVjdGF0aW9ucygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiBhbnkgZXhwZWN0YXRpb25zIGhhdmUgbm90IGJlZW4gc2F0aXNmaWVkLlxuICAgKi9cbiAgdmVyaWZ5Tm9PdXRzdGFuZGluZ0V4cGVjdGF0aW9ucygpIHtcbiAgICBpZiAodGhpcy5fZXhwZWN0YXRpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgdmFyIHVybHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2V4cGVjdGF0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGV4cGVjdGF0aW9uID0gdGhpcy5fZXhwZWN0YXRpb25zW2ldO1xuICAgICAgdXJscy5wdXNoKGV4cGVjdGF0aW9uLnVybCk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYFVuc2F0aXNmaWVkIHJlcXVlc3RzOiAke3VybHMuam9pbignLCAnKX1gKTtcbiAgfVxuXG4gIHByaXZhdGUgX3Byb2Nlc3NSZXF1ZXN0KHJlcXVlc3Q6IF9QZW5kaW5nUmVxdWVzdCkge1xuICAgIHZhciB1cmwgPSByZXF1ZXN0LnVybDtcblxuICAgIGlmICh0aGlzLl9leHBlY3RhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgdmFyIGV4cGVjdGF0aW9uID0gdGhpcy5fZXhwZWN0YXRpb25zWzBdO1xuICAgICAgaWYgKGV4cGVjdGF0aW9uLnVybCA9PSB1cmwpIHtcbiAgICAgICAgTGlzdFdyYXBwZXIucmVtb3ZlKHRoaXMuX2V4cGVjdGF0aW9ucywgZXhwZWN0YXRpb24pO1xuICAgICAgICByZXF1ZXN0LmNvbXBsZXRlKGV4cGVjdGF0aW9uLnJlc3BvbnNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9kZWZpbml0aW9ucy5oYXModXJsKSkge1xuICAgICAgdmFyIHJlc3BvbnNlID0gdGhpcy5fZGVmaW5pdGlvbnMuZ2V0KHVybCk7XG4gICAgICByZXF1ZXN0LmNvbXBsZXRlKG5vcm1hbGl6ZUJsYW5rKHJlc3BvbnNlKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYFVuZXhwZWN0ZWQgcmVxdWVzdCAke3VybH1gKTtcbiAgfVxufVxuXG5jbGFzcyBfUGVuZGluZ1JlcXVlc3Qge1xuICB1cmw6IHN0cmluZztcbiAgY29tcGxldGVyOiBQcm9taXNlQ29tcGxldGVyPHN0cmluZz47XG5cbiAgY29uc3RydWN0b3IodXJsKSB7XG4gICAgdGhpcy51cmwgPSB1cmw7XG4gICAgdGhpcy5jb21wbGV0ZXIgPSBQcm9taXNlV3JhcHBlci5jb21wbGV0ZXIoKTtcbiAgfVxuXG4gIGNvbXBsZXRlKHJlc3BvbnNlOiBzdHJpbmcpIHtcbiAgICBpZiAoaXNCbGFuayhyZXNwb25zZSkpIHtcbiAgICAgIHRoaXMuY29tcGxldGVyLnJlamVjdChgRmFpbGVkIHRvIGxvYWQgJHt0aGlzLnVybH1gLCBudWxsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb21wbGV0ZXIucmVzb2x2ZShyZXNwb25zZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0UHJvbWlzZSgpOiBQcm9taXNlPHN0cmluZz4geyByZXR1cm4gdGhpcy5jb21wbGV0ZXIucHJvbWlzZTsgfVxufVxuXG5jbGFzcyBfRXhwZWN0YXRpb24ge1xuICB1cmw6IHN0cmluZztcbiAgcmVzcG9uc2U6IHN0cmluZztcbiAgY29uc3RydWN0b3IodXJsOiBzdHJpbmcsIHJlc3BvbnNlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnVybCA9IHVybDtcbiAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21waWxlci94aHJfbW9jay50c1xuICoqLyIsImltcG9ydCB7QXBwbGljYXRpb25SZWZ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2FwcGxpY2F0aW9uX3JlZic7XG5pbXBvcnQge0luamVjdGFibGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpJztcbmltcG9ydCB7VHlwZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7Q29tcG9uZW50UmVmfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvZHluYW1pY19jb21wb25lbnRfbG9hZGVyJztcbmltcG9ydCB7UHJvdmlkZXIsIEluamVjdG9yfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5pbXBvcnQge05nWm9uZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvem9uZS9uZ196b25lJztcbmltcG9ydCB7UHJvbWlzZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9hc3luYyc7XG5cbi8qKlxuICogQSBuby1vcCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgQXBwbGljYXRpb25SZWZ9LCB1c2VmdWwgZm9yIHRlc3RpbmcuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBNb2NrQXBwbGljYXRpb25SZWYgZXh0ZW5kcyBBcHBsaWNhdGlvblJlZiB7XG4gIHJlZ2lzdGVyQm9vdHN0cmFwTGlzdGVuZXIobGlzdGVuZXI6IChyZWY6IENvbXBvbmVudFJlZikgPT4gdm9pZCk6IHZvaWQge31cblxuICByZWdpc3RlckRpc3Bvc2VMaXN0ZW5lcihkaXNwb3NlOiAoKSA9PiB2b2lkKTogdm9pZCB7fVxuXG4gIGJvb3RzdHJhcChjb21wb25lbnRUeXBlOiBUeXBlLCBiaW5kaW5ncz86IEFycmF5PFR5cGUgfCBQcm92aWRlciB8IGFueVtdPik6IFByb21pc2U8Q29tcG9uZW50UmVmPiB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXQgaW5qZWN0b3IoKTogSW5qZWN0b3IgeyByZXR1cm4gbnVsbDsgfTtcblxuICBnZXQgem9uZSgpOiBOZ1pvbmUgeyByZXR1cm4gbnVsbDsgfTtcblxuICBkaXNwb3NlKCk6IHZvaWQge31cblxuICB0aWNrKCk6IHZvaWQge31cblxuICBnZXQgY29tcG9uZW50VHlwZXMoKTogVHlwZVtdIHsgcmV0dXJuIG51bGw7IH07XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvbW9jay9tb2NrX2FwcGxpY2F0aW9uX3JlZi50c1xuICoqLyIsImV4cG9ydCAqIGZyb20gJ2FuZ3VsYXIyL3NyYy9odHRwL2JhY2tlbmRzL21vY2tfYmFja2VuZCc7XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvaHR0cC90ZXN0aW5nLnRzXG4gKiovIiwiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbmltcG9ydCB7UmVxdWVzdH0gZnJvbSAnLi4vc3RhdGljX3JlcXVlc3QnO1xuaW1wb3J0IHtSZXNwb25zZX0gZnJvbSAnLi4vc3RhdGljX3Jlc3BvbnNlJztcbmltcG9ydCB7UmVhZHlTdGF0ZX0gZnJvbSAnLi4vZW51bXMnO1xuaW1wb3J0IHtDb25uZWN0aW9uLCBDb25uZWN0aW9uQmFja2VuZH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQge2lzUHJlc2VudH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbiwgV3JhcHBlZEV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7U3ViamVjdH0gZnJvbSAncnhqcy9TdWJqZWN0JztcbmltcG9ydCB7UmVwbGF5U3ViamVjdH0gZnJvbSAncnhqcy9zdWJqZWN0L1JlcGxheVN1YmplY3QnO1xuaW1wb3J0IHt0YWtlfSBmcm9tICdyeGpzL29wZXJhdG9yL3Rha2UnO1xuXG4vKipcbiAqXG4gKiBNb2NrIENvbm5lY3Rpb24gdG8gcmVwcmVzZW50IGEge0BsaW5rIENvbm5lY3Rpb259IGZvciB0ZXN0cy5cbiAqXG4gKiovXG5leHBvcnQgY2xhc3MgTW9ja0Nvbm5lY3Rpb24gaW1wbGVtZW50cyBDb25uZWN0aW9uIHtcbiAgLy8gVE9ETyBOYW1lIGByZWFkeVN0YXRlYCBzaG91bGQgY2hhbmdlIHRvIGJlIG1vcmUgZ2VuZXJpYywgYW5kIHN0YXRlcyBjb3VsZCBiZSBtYWRlIHRvIGJlIG1vcmVcbiAgLy8gZGVzY3JpcHRpdmUgdGhhbiBYSFIgc3RhdGVzLlxuICAvKipcbiAgICogRGVzY3JpYmVzIHRoZSBzdGF0ZSBvZiB0aGUgY29ubmVjdGlvbiwgYmFzZWQgb24gYFhNTEh0dHBSZXF1ZXN0LnJlYWR5U3RhdGVgLCBidXQgd2l0aFxuICAgKiBhZGRpdGlvbmFsIHN0YXRlcy4gRm9yIGV4YW1wbGUsIHN0YXRlIDUgaW5kaWNhdGVzIGFuIGFib3J0ZWQgY29ubmVjdGlvbi5cbiAgICovXG4gIHJlYWR5U3RhdGU6IFJlYWR5U3RhdGU7XG5cbiAgLyoqXG4gICAqIHtAbGluayBSZXF1ZXN0fSBpbnN0YW5jZSB1c2VkIHRvIGNyZWF0ZSB0aGUgY29ubmVjdGlvbi5cbiAgICovXG4gIHJlcXVlc3Q6IFJlcXVlc3Q7XG5cbiAgLyoqXG4gICAqIHtAbGluayBFdmVudEVtaXR0ZXJ9IG9mIHtAbGluayBSZXNwb25zZX0uIENhbiBiZSBzdWJzY3JpYmVkIHRvIGluIG9yZGVyIHRvIGJlIG5vdGlmaWVkIHdoZW4gYVxuICAgKiByZXNwb25zZSBpcyBhdmFpbGFibGUuXG4gICAqL1xuICByZXNwb25zZTogYW55OyAgLy8gU3ViamVjdDxSZXNwb25zZT5cblxuICBjb25zdHJ1Y3RvcihyZXE6IFJlcXVlc3QpIHtcbiAgICB0aGlzLnJlc3BvbnNlID0gdGFrZS5jYWxsKG5ldyBSZXBsYXlTdWJqZWN0KDEpLCAxKTtcbiAgICB0aGlzLnJlYWR5U3RhdGUgPSBSZWFkeVN0YXRlLk9wZW47XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgbW9jayByZXNwb25zZSB0byB0aGUgY29ubmVjdGlvbi4gVGhpcyByZXNwb25zZSBpcyB0aGUgdmFsdWUgdGhhdCBpcyBlbWl0dGVkIHRvIHRoZVxuICAgKiB7QGxpbmsgRXZlbnRFbWl0dGVyfSByZXR1cm5lZCBieSB7QGxpbmsgSHR0cH0uXG4gICAqXG4gICAqICMjIyBFeGFtcGxlXG4gICAqXG4gICAqIGBgYFxuICAgKiB2YXIgY29ubmVjdGlvbjtcbiAgICogYmFja2VuZC5jb25uZWN0aW9ucy5zdWJzY3JpYmUoYyA9PiBjb25uZWN0aW9uID0gYyk7XG4gICAqIGh0dHAucmVxdWVzdCgnZGF0YS5qc29uJykuc3Vic2NyaWJlKHJlcyA9PiBjb25zb2xlLmxvZyhyZXMudGV4dCgpKSk7XG4gICAqIGNvbm5lY3Rpb24ubW9ja1Jlc3BvbmQobmV3IFJlc3BvbnNlKCdmYWtlIHJlc3BvbnNlJykpOyAvL2xvZ3MgJ2Zha2UgcmVzcG9uc2UnXG4gICAqIGBgYFxuICAgKlxuICAgKi9cbiAgbW9ja1Jlc3BvbmQocmVzOiBSZXNwb25zZSkge1xuICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IFJlYWR5U3RhdGUuRG9uZSB8fCB0aGlzLnJlYWR5U3RhdGUgPT09IFJlYWR5U3RhdGUuQ2FuY2VsbGVkKSB7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignQ29ubmVjdGlvbiBoYXMgYWxyZWFkeSBiZWVuIHJlc29sdmVkJyk7XG4gICAgfVxuICAgIHRoaXMucmVhZHlTdGF0ZSA9IFJlYWR5U3RhdGUuRG9uZTtcbiAgICB0aGlzLnJlc3BvbnNlLm5leHQocmVzKTtcbiAgICB0aGlzLnJlc3BvbnNlLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogTm90IHlldCBpbXBsZW1lbnRlZCFcbiAgICpcbiAgICogU2VuZHMgdGhlIHByb3ZpZGVkIHtAbGluayBSZXNwb25zZX0gdG8gdGhlIGBkb3dubG9hZE9ic2VydmVyYCBvZiB0aGUgYFJlcXVlc3RgXG4gICAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbm5lY3Rpb24uXG4gICAqL1xuICBtb2NrRG93bmxvYWQocmVzOiBSZXNwb25zZSkge1xuICAgIC8vIHRoaXMucmVxdWVzdC5kb3dubG9hZE9ic2VydmVyLm9uTmV4dChyZXMpO1xuICAgIC8vIGlmIChyZXMuYnl0ZXNMb2FkZWQgPT09IHJlcy50b3RhbEJ5dGVzKSB7XG4gICAgLy8gICB0aGlzLnJlcXVlc3QuZG93bmxvYWRPYnNlcnZlci5vbkNvbXBsZXRlZCgpO1xuICAgIC8vIH1cbiAgfVxuXG4gIC8vIFRPRE8oamVmZmJjcm9zcyk6IGNvbnNpZGVyIHVzaW5nIFJlc3BvbnNlIHR5cGVcbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBwcm92aWRlZCBlcnJvciBvYmplY3QgYXMgYW4gZXJyb3IgdG8gdGhlIHtAbGluayBSZXNwb25zZX0ge0BsaW5rIEV2ZW50RW1pdHRlcn1cbiAgICogcmV0dXJuZWRcbiAgICogZnJvbSB7QGxpbmsgSHR0cH0uXG4gICAqL1xuICBtb2NrRXJyb3IoZXJyPzogRXJyb3IpIHtcbiAgICAvLyBNYXRjaGVzIFhIUiBzZW1hbnRpY3NcbiAgICB0aGlzLnJlYWR5U3RhdGUgPSBSZWFkeVN0YXRlLkRvbmU7XG4gICAgdGhpcy5yZXNwb25zZS5lcnJvcihlcnIpO1xuICB9XG59XG5cbi8qKlxuICogQSBtb2NrIGJhY2tlbmQgZm9yIHRlc3RpbmcgdGhlIHtAbGluayBIdHRwfSBzZXJ2aWNlLlxuICpcbiAqIFRoaXMgY2xhc3MgY2FuIGJlIGluamVjdGVkIGluIHRlc3RzLCBhbmQgc2hvdWxkIGJlIHVzZWQgdG8gb3ZlcnJpZGUgcHJvdmlkZXJzXG4gKiB0byBvdGhlciBiYWNrZW5kcywgc3VjaCBhcyB7QGxpbmsgWEhSQmFja2VuZH0uXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGBcbiAqIGltcG9ydCB7RGVmYXVsdE9wdGlvbnMsIEh0dHB9IGZyb20gJ2FuZ3VsYXIyL2h0dHAnO1xuICogaW1wb3J0IHtNb2NrQmFja2VuZH0gZnJvbSAnYW5ndWxhcjIvaHR0cC90ZXN0aW5nJztcbiAqIGl0KCdzaG91bGQgZ2V0IHNvbWUgZGF0YScsIGluamVjdChbQXN5bmNUZXN0Q29tcGxldGVyXSwgKGFzeW5jKSA9PiB7XG4gKiAgIHZhciBjb25uZWN0aW9uO1xuICogICB2YXIgaW5qZWN0b3IgPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtcbiAqICAgICBNb2NrQmFja2VuZCxcbiAqICAgICBwcm92aWRlKEh0dHAsIHt1c2VGYWN0b3J5OiAoYmFja2VuZCwgZGVmYXVsdE9wdGlvbnMpID0+IHtcbiAqICAgICAgIHJldHVybiBuZXcgSHR0cChiYWNrZW5kLCBkZWZhdWx0T3B0aW9ucylcbiAqICAgICB9LCBkZXBzOiBbTW9ja0JhY2tlbmQsIERlZmF1bHRPcHRpb25zXX0pXSk7XG4gKiAgIHZhciBodHRwID0gaW5qZWN0b3IuZ2V0KEh0dHApO1xuICogICB2YXIgYmFja2VuZCA9IGluamVjdG9yLmdldChNb2NrQmFja2VuZCk7XG4gKiAgIC8vQXNzaWduIGFueSBuZXdseS1jcmVhdGVkIGNvbm5lY3Rpb24gdG8gbG9jYWwgdmFyaWFibGVcbiAqICAgYmFja2VuZC5jb25uZWN0aW9ucy5zdWJzY3JpYmUoYyA9PiBjb25uZWN0aW9uID0gYyk7XG4gKiAgIGh0dHAucmVxdWVzdCgnZGF0YS5qc29uJykuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAqICAgICBleHBlY3QocmVzLnRleHQoKSkudG9CZSgnYXdlc29tZScpO1xuICogICAgIGFzeW5jLmRvbmUoKTtcbiAqICAgfSk7XG4gKiAgIGNvbm5lY3Rpb24ubW9ja1Jlc3BvbmQobmV3IFJlc3BvbnNlKCdhd2Vzb21lJykpO1xuICogfSkpO1xuICogYGBgXG4gKlxuICogVGhpcyBtZXRob2Qgb25seSBleGlzdHMgaW4gdGhlIG1vY2sgaW1wbGVtZW50YXRpb24sIG5vdCBpbiByZWFsIEJhY2tlbmRzLlxuICoqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE1vY2tCYWNrZW5kIGltcGxlbWVudHMgQ29ubmVjdGlvbkJhY2tlbmQge1xuICAvKipcbiAgICoge0BsaW5rIEV2ZW50RW1pdHRlcn1cbiAgICogb2Yge0BsaW5rIE1vY2tDb25uZWN0aW9ufSBpbnN0YW5jZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZCBieSB0aGlzIGJhY2tlbmQuIENhbiBiZSBzdWJzY3JpYmVkXG4gICAqIHRvIGluIG9yZGVyIHRvIHJlc3BvbmQgdG8gY29ubmVjdGlvbnMuXG4gICAqXG4gICAqICMjIyBFeGFtcGxlXG4gICAqXG4gICAqIGBgYFxuICAgKiBpbXBvcnQge01vY2tCYWNrZW5kLCBIdHRwLCBCYXNlUmVxdWVzdE9wdGlvbnN9IGZyb20gJ2FuZ3VsYXIyL2h0dHAnO1xuICAgKiBpbXBvcnQge0luamVjdG9yfSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbiAgICpcbiAgICogaXQoJ3Nob3VsZCBnZXQgYSByZXNwb25zZScsICgpID0+IHtcbiAgICogICB2YXIgY29ubmVjdGlvbjsgLy90aGlzIHdpbGwgYmUgc2V0IHdoZW4gYSBuZXcgY29ubmVjdGlvbiBpcyBlbWl0dGVkIGZyb20gdGhlIGJhY2tlbmQuXG4gICAqICAgdmFyIHRleHQ7IC8vdGhpcyB3aWxsIGJlIHNldCBmcm9tIG1vY2sgcmVzcG9uc2VcbiAgICogICB2YXIgaW5qZWN0b3IgPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtcbiAgICogICAgIE1vY2tCYWNrZW5kLFxuICAgKiAgICAgcHJvdmlkZShIdHRwLCB7dXNlRmFjdG9yeTogKGJhY2tlbmQsIG9wdGlvbnMpIHtcbiAgICogICAgICAgcmV0dXJuIG5ldyBIdHRwKGJhY2tlbmQsIG9wdGlvbnMpO1xuICAgKiAgICAgfSwgZGVwczogW01vY2tCYWNrZW5kLCBCYXNlUmVxdWVzdE9wdGlvbnNdfV0pO1xuICAgKiAgIHZhciBiYWNrZW5kID0gaW5qZWN0b3IuZ2V0KE1vY2tCYWNrZW5kKTtcbiAgICogICB2YXIgaHR0cCA9IGluamVjdG9yLmdldChIdHRwKTtcbiAgICogICBiYWNrZW5kLmNvbm5lY3Rpb25zLnN1YnNjcmliZShjID0+IGNvbm5lY3Rpb24gPSBjKTtcbiAgICogICBodHRwLnJlcXVlc3QoJ3NvbWV0aGluZy5qc29uJykuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAqICAgICB0ZXh0ID0gcmVzLnRleHQoKTtcbiAgICogICB9KTtcbiAgICogICBjb25uZWN0aW9uLm1vY2tSZXNwb25kKG5ldyBSZXNwb25zZSh7Ym9keTogJ1NvbWV0aGluZyd9KSk7XG4gICAqICAgZXhwZWN0KHRleHQpLnRvQmUoJ1NvbWV0aGluZycpO1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIFRoaXMgcHJvcGVydHkgb25seSBleGlzdHMgaW4gdGhlIG1vY2sgaW1wbGVtZW50YXRpb24sIG5vdCBpbiByZWFsIEJhY2tlbmRzLlxuICAgKi9cbiAgY29ubmVjdGlvbnM6IGFueTsgIC8vPE1vY2tDb25uZWN0aW9uPlxuXG4gIC8qKlxuICAgKiBBbiBhcnJheSByZXByZXNlbnRhdGlvbiBvZiBgY29ubmVjdGlvbnNgLiBUaGlzIGFycmF5IHdpbGwgYmUgdXBkYXRlZCB3aXRoIGVhY2ggY29ubmVjdGlvbiB0aGF0XG4gICAqIGlzIGNyZWF0ZWQgYnkgdGhpcyBiYWNrZW5kLlxuICAgKlxuICAgKiBUaGlzIHByb3BlcnR5IG9ubHkgZXhpc3RzIGluIHRoZSBtb2NrIGltcGxlbWVudGF0aW9uLCBub3QgaW4gcmVhbCBCYWNrZW5kcy5cbiAgICovXG4gIGNvbm5lY3Rpb25zQXJyYXk6IE1vY2tDb25uZWN0aW9uW107XG4gIC8qKlxuICAgKiB7QGxpbmsgRXZlbnRFbWl0dGVyfSBvZiB7QGxpbmsgTW9ja0Nvbm5lY3Rpb259IGluc3RhbmNlcyB0aGF0IGhhdmVuJ3QgeWV0IGJlZW4gcmVzb2x2ZWQgKGkuZS5cbiAgICogd2l0aCBhIGByZWFkeVN0YXRlYFxuICAgKiBsZXNzIHRoYW4gNCkuIFVzZWQgaW50ZXJuYWxseSB0byB2ZXJpZnkgdGhhdCBubyBjb25uZWN0aW9ucyBhcmUgcGVuZGluZyB2aWEgdGhlXG4gICAqIGB2ZXJpZnlOb1BlbmRpbmdSZXF1ZXN0c2AgbWV0aG9kLlxuICAgKlxuICAgKiBUaGlzIHByb3BlcnR5IG9ubHkgZXhpc3RzIGluIHRoZSBtb2NrIGltcGxlbWVudGF0aW9uLCBub3QgaW4gcmVhbCBCYWNrZW5kcy5cbiAgICovXG4gIHBlbmRpbmdDb25uZWN0aW9uczogYW55OyAgLy8gU3ViamVjdDxNb2NrQ29ubmVjdGlvbj5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uc0FycmF5ID0gW107XG4gICAgdGhpcy5jb25uZWN0aW9ucyA9IG5ldyBTdWJqZWN0KCk7XG4gICAgdGhpcy5jb25uZWN0aW9ucy5zdWJzY3JpYmUoY29ubmVjdGlvbiA9PiB0aGlzLmNvbm5lY3Rpb25zQXJyYXkucHVzaChjb25uZWN0aW9uKSk7XG4gICAgdGhpcy5wZW5kaW5nQ29ubmVjdGlvbnMgPSBuZXcgU3ViamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBhbGwgY29ubmVjdGlvbnMsIGFuZCByYWlzZXMgYW4gZXhjZXB0aW9uIGlmIGFueSBjb25uZWN0aW9uIGhhcyBub3QgcmVjZWl2ZWQgYSByZXNwb25zZS5cbiAgICpcbiAgICogVGhpcyBtZXRob2Qgb25seSBleGlzdHMgaW4gdGhlIG1vY2sgaW1wbGVtZW50YXRpb24sIG5vdCBpbiByZWFsIEJhY2tlbmRzLlxuICAgKi9cbiAgdmVyaWZ5Tm9QZW5kaW5nUmVxdWVzdHMoKSB7XG4gICAgbGV0IHBlbmRpbmcgPSAwO1xuICAgIHRoaXMucGVuZGluZ0Nvbm5lY3Rpb25zLnN1YnNjcmliZShjID0+IHBlbmRpbmcrKyk7XG4gICAgaWYgKHBlbmRpbmcgPiAwKSB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgJHtwZW5kaW5nfSBwZW5kaW5nIGNvbm5lY3Rpb25zIHRvIGJlIHJlc29sdmVkYCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBgdmVyaWZ5Tm9QZW5kaW5nUmVxdWVzdHNgIHRvIHJlc29sdmUgYW55IG5vdC15ZXQtcmVzb2x2ZVxuICAgKiBjb25uZWN0aW9ucywgaWYgaXQncyBleHBlY3RlZCB0aGF0IHRoZXJlIGFyZSBjb25uZWN0aW9ucyB0aGF0IGhhdmUgbm90IHlldCByZWNlaXZlZCBhIHJlc3BvbnNlLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBvbmx5IGV4aXN0cyBpbiB0aGUgbW9jayBpbXBsZW1lbnRhdGlvbiwgbm90IGluIHJlYWwgQmFja2VuZHMuXG4gICAqL1xuICByZXNvbHZlQWxsQ29ubmVjdGlvbnMoKSB7IHRoaXMuY29ubmVjdGlvbnMuc3Vic2NyaWJlKGMgPT4gYy5yZWFkeVN0YXRlID0gNCk7IH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgTW9ja0Nvbm5lY3Rpb259LiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyBgbmV3XG4gICAqIE1vY2tDb25uZWN0aW9uKClgLCBleGNlcHQgdGhhdCBpdCBhbHNvIHdpbGwgZW1pdCB0aGUgbmV3IGBDb25uZWN0aW9uYCB0byB0aGUgYGNvbm5lY3Rpb25zYFxuICAgKiBlbWl0dGVyIG9mIHRoaXMgYE1vY2tCYWNrZW5kYCBpbnN0YW5jZS4gVGhpcyBtZXRob2Qgd2lsbCB1c3VhbGx5IG9ubHkgYmUgdXNlZCBieSB0ZXN0c1xuICAgKiBhZ2FpbnN0IHRoZSBmcmFtZXdvcmsgaXRzZWxmLCBub3QgYnkgZW5kLXVzZXJzLlxuICAgKi9cbiAgY3JlYXRlQ29ubmVjdGlvbihyZXE6IFJlcXVlc3QpOiBDb25uZWN0aW9uIHtcbiAgICBpZiAoIWlzUHJlc2VudChyZXEpIHx8ICEocmVxIGluc3RhbmNlb2YgUmVxdWVzdCkpIHtcbiAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBjcmVhdGVDb25uZWN0aW9uIHJlcXVpcmVzIGFuIGluc3RhbmNlIG9mIFJlcXVlc3QsIGdvdCAke3JlcX1gKTtcbiAgICB9XG4gICAgbGV0IGNvbm5lY3Rpb24gPSBuZXcgTW9ja0Nvbm5lY3Rpb24ocmVxKTtcbiAgICB0aGlzLmNvbm5lY3Rpb25zLm5leHQoY29ubmVjdGlvbik7XG4gICAgcmV0dXJuIGNvbm5lY3Rpb247XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9odHRwL2JhY2tlbmRzL21vY2tfYmFja2VuZC50c1xuICoqLyIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV8yNzlfXztcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIGV4dGVybmFsIHtcImNvbW1vbmpzXCI6XCJyeGpzL3N1YmplY3QvUmVwbGF5U3ViamVjdFwiLFwiY29tbW9uanMyXCI6XCJyeGpzL3N1YmplY3QvUmVwbGF5U3ViamVjdFwiLFwiYW1kXCI6XCJyeGpzL3N1YmplY3QvUmVwbGF5U3ViamVjdFwiLFwicm9vdFwiOltcIlJ4XCJdfVxuICoqIG1vZHVsZSBpZCA9IDI3OVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzI4MF9fO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogZXh0ZXJuYWwge1wiY29tbW9uanNcIjpcInJ4anMvb3BlcmF0b3IvdGFrZVwiLFwiY29tbW9uanMyXCI6XCJyeGpzL29wZXJhdG9yL3Rha2VcIixcImFtZFwiOlwicnhqcy9vcGVyYXRvci90YWtlXCIsXCJyb290XCI6W1wiUnhcIixcIk9ic2VydmFibGVcIixcInByb3RvdHlwZVwiXX1cbiAqKiBtb2R1bGUgaWQgPSAyODBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsImV4cG9ydCAqIGZyb20gJ2FuZ3VsYXIyL3NyYy9tb2NrL21vY2tfbG9jYXRpb25fc3RyYXRlZ3knO1xuZXhwb3J0ICogZnJvbSAnYW5ndWxhcjIvc3JjL21vY2svbG9jYXRpb25fbW9jayc7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9yb3V0ZXIvdGVzdGluZy50c1xuICoqLyIsImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvZGknO1xuaW1wb3J0IHtFdmVudEVtaXR0ZXIsIE9ic2VydmFibGVXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2FzeW5jJztcbmltcG9ydCB7TGlzdFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge0xvY2F0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvcm91dGVyL2xvY2F0aW9uJztcblxuLyoqXG4gKiBBIHNweSBmb3Ige0BsaW5rIExvY2F0aW9ufSB0aGF0IGFsbG93cyB0ZXN0cyB0byBmaXJlIHNpbXVsYXRlZCBsb2NhdGlvbiBldmVudHMuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTcHlMb2NhdGlvbiBpbXBsZW1lbnRzIExvY2F0aW9uIHtcbiAgdXJsQ2hhbmdlczogc3RyaW5nW10gPSBbXTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcGF0aDogc3RyaW5nID0gJyc7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3F1ZXJ5OiBzdHJpbmcgPSAnJztcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfc3ViamVjdDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2Jhc2VIcmVmOiBzdHJpbmcgPSAnJztcblxuICBzZXRJbml0aWFsUGF0aCh1cmw6IHN0cmluZykgeyB0aGlzLl9wYXRoID0gdXJsOyB9XG5cbiAgc2V0QmFzZUhyZWYodXJsOiBzdHJpbmcpIHsgdGhpcy5fYmFzZUhyZWYgPSB1cmw7IH1cblxuICBwYXRoKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9wYXRoOyB9XG5cbiAgc2ltdWxhdGVVcmxQb3AocGF0aG5hbWU6IHN0cmluZykge1xuICAgIE9ic2VydmFibGVXcmFwcGVyLmNhbGxFbWl0KHRoaXMuX3N1YmplY3QsIHsndXJsJzogcGF0aG5hbWUsICdwb3AnOiB0cnVlfSk7XG4gIH1cblxuICBzaW11bGF0ZUhhc2hDaGFuZ2UocGF0aG5hbWU6IHN0cmluZykge1xuICAgIC8vIEJlY2F1c2Ugd2UgZG9uJ3QgcHJldmVudCB0aGUgbmF0aXZlIGV2ZW50LCB0aGUgYnJvd3NlciB3aWxsIGluZGVwZW5kZW50bHkgdXBkYXRlIHRoZSBwYXRoXG4gICAgdGhpcy5zZXRJbml0aWFsUGF0aChwYXRobmFtZSk7XG4gICAgdGhpcy51cmxDaGFuZ2VzLnB1c2goJ2hhc2g6ICcgKyBwYXRobmFtZSk7XG4gICAgT2JzZXJ2YWJsZVdyYXBwZXIuY2FsbEVtaXQodGhpcy5fc3ViamVjdCwgeyd1cmwnOiBwYXRobmFtZSwgJ3BvcCc6IHRydWUsICd0eXBlJzogJ2hhc2hjaGFuZ2UnfSk7XG4gIH1cblxuICBwcmVwYXJlRXh0ZXJuYWxVcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh1cmwubGVuZ3RoID4gMCAmJiAhdXJsLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgdXJsID0gJy8nICsgdXJsO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYmFzZUhyZWYgKyB1cmw7XG4gIH1cblxuICBnbyhwYXRoOiBzdHJpbmcsIHF1ZXJ5OiBzdHJpbmcgPSAnJykge1xuICAgIHBhdGggPSB0aGlzLnByZXBhcmVFeHRlcm5hbFVybChwYXRoKTtcbiAgICBpZiAodGhpcy5fcGF0aCA9PSBwYXRoICYmIHRoaXMuX3F1ZXJ5ID09IHF1ZXJ5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3BhdGggPSBwYXRoO1xuICAgIHRoaXMuX3F1ZXJ5ID0gcXVlcnk7XG5cbiAgICB2YXIgdXJsID0gcGF0aCArIChxdWVyeS5sZW5ndGggPiAwID8gKCc/JyArIHF1ZXJ5KSA6ICcnKTtcbiAgICB0aGlzLnVybENoYW5nZXMucHVzaCh1cmwpO1xuICB9XG5cbiAgcmVwbGFjZVN0YXRlKHBhdGg6IHN0cmluZywgcXVlcnk6IHN0cmluZyA9ICcnKSB7XG4gICAgcGF0aCA9IHRoaXMucHJlcGFyZUV4dGVybmFsVXJsKHBhdGgpO1xuICAgIHRoaXMuX3BhdGggPSBwYXRoO1xuICAgIHRoaXMuX3F1ZXJ5ID0gcXVlcnk7XG5cbiAgICB2YXIgdXJsID0gcGF0aCArIChxdWVyeS5sZW5ndGggPiAwID8gKCc/JyArIHF1ZXJ5KSA6ICcnKTtcbiAgICB0aGlzLnVybENoYW5nZXMucHVzaCgncmVwbGFjZTogJyArIHVybCk7XG4gIH1cblxuICBmb3J3YXJkKCkge1xuICAgIC8vIFRPRE9cbiAgfVxuXG4gIGJhY2soKSB7XG4gICAgLy8gVE9ET1xuICB9XG5cbiAgc3Vic2NyaWJlKG9uTmV4dDogKHZhbHVlOiBhbnkpID0+IHZvaWQsIG9uVGhyb3c6IChlcnJvcjogYW55KSA9PiB2b2lkID0gbnVsbCxcbiAgICAgICAgICAgIG9uUmV0dXJuOiAoKSA9PiB2b2lkID0gbnVsbCk6IE9iamVjdCB7XG4gICAgcmV0dXJuIE9ic2VydmFibGVXcmFwcGVyLnN1YnNjcmliZSh0aGlzLl9zdWJqZWN0LCBvbk5leHQsIG9uVGhyb3csIG9uUmV0dXJuKTtcbiAgfVxuXG4gIC8vIFRPRE86IHJlbW92ZSB0aGVzZSBvbmNlIExvY2F0aW9uIGlzIGFuIGludGVyZmFjZSwgYW5kIGNhbiBiZSBpbXBsZW1lbnRlZCBjbGVhbmx5XG4gIHBsYXRmb3JtU3RyYXRlZ3k6IGFueSA9IG51bGw7XG4gIG5vcm1hbGl6ZSh1cmw6IHN0cmluZyk6IHN0cmluZyB7IHJldHVybiBudWxsOyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvbW9jay9sb2NhdGlvbl9tb2NrLnRzXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ==
|