angular2-all.umd.dev.js 4.7 MB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032110331103411035110361103711038110391104011041110421104311044110451104611047110481104911050110511105211053110541105511056110571105811059110601106111062110631106411065110661106711068110691107011071110721107311074110751107611077110781107911080110811108211083110841108511086110871108811089110901109111092110931109411095110961109711098110991110011101111021110311104111051110611107111081110911110111111111211113111141111511116111171111811119111201112111122111231112411125111261112711128111291113011131111321113311134111351113611137111381113911140111411114211143111441114511146111471114811149111501115111152111531115411155111561115711158111591116011161111621116311164111651116611167111681116911170111711117211173111741117511176111771117811179111801118111182111831118411185111861118711188111891119011191111921119311194111951119611197111981119911200112011120211203112041120511206112071120811209112101121111212112131121411215112161121711218112191122011221112221122311224112251122611227112281122911230112311123211233112341123511236112371123811239112401124111242112431124411245112461124711248112491125011251112521125311254112551125611257112581125911260112611126211263112641126511266112671126811269112701127111272112731127411275112761127711278112791128011281112821128311284112851128611287112881128911290112911129211293112941129511296112971129811299113001130111302113031130411305113061130711308113091131011311113121131311314113151131611317113181131911320113211132211323113241132511326113271132811329113301133111332113331133411335113361133711338113391134011341113421134311344113451134611347113481134911350113511135211353113541135511356113571135811359113601136111362113631136411365113661136711368113691137011371113721137311374113751137611377113781137911380113811138211383113841138511386113871138811389113901139111392113931139411395113961139711398113991140011401114021140311404114051140611407114081140911410114111141211413114141141511416114171141811419114201142111422114231142411425114261142711428114291143011431114321143311434114351143611437114381143911440114411144211443114441144511446114471144811449114501145111452114531145411455114561145711458114591146011461114621146311464114651146611467114681146911470114711147211473114741147511476114771147811479114801148111482114831148411485114861148711488114891149011491114921149311494114951149611497114981149911500115011150211503115041150511506115071150811509115101151111512115131151411515115161151711518115191152011521115221152311524115251152611527115281152911530115311153211533115341153511536115371153811539115401154111542115431154411545115461154711548115491155011551115521155311554115551155611557115581155911560115611156211563115641156511566115671156811569115701157111572115731157411575115761157711578115791158011581115821158311584115851158611587115881158911590115911159211593115941159511596115971159811599116001160111602116031160411605116061160711608116091161011611116121161311614116151161611617116181161911620116211162211623116241162511626116271162811629116301163111632116331163411635116361163711638116391164011641116421164311644116451164611647116481164911650116511165211653116541165511656116571165811659116601166111662116631166411665116661166711668116691167011671116721167311674116751167611677116781167911680116811168211683116841168511686116871168811689116901169111692116931169411695116961169711698116991170011701117021170311704117051170611707117081170911710117111171211713117141171511716117171171811719117201172111722117231172411725117261172711728117291173011731117321173311734117351173611737117381173911740117411174211743117441174511746117471174811749117501175111752117531175411755117561175711758117591176011761117621176311764117651176611767117681176911770117711177211773117741177511776117771177811779117801178111782117831178411785117861178711788117891179011791117921179311794117951179611797117981179911800118011180211803118041180511806118071180811809118101181111812118131181411815118161181711818118191182011821118221182311824118251182611827118281182911830118311183211833118341183511836118371183811839118401184111842118431184411845118461184711848118491185011851118521185311854118551185611857118581185911860118611186211863118641186511866118671186811869118701187111872118731187411875118761187711878118791188011881118821188311884118851188611887118881188911890118911189211893118941189511896118971189811899119001190111902119031190411905119061190711908119091191011911119121191311914119151191611917119181191911920119211192211923119241192511926119271192811929119301193111932119331193411935119361193711938119391194011941119421194311944119451194611947119481194911950119511195211953119541195511956119571195811959119601196111962119631196411965119661196711968119691197011971119721197311974119751197611977119781197911980119811198211983119841198511986119871198811989119901199111992119931199411995119961199711998119991200012001120021200312004120051200612007120081200912010120111201212013120141201512016120171201812019120201202112022120231202412025120261202712028120291203012031120321203312034120351203612037120381203912040120411204212043120441204512046120471204812049120501205112052120531205412055120561205712058120591206012061120621206312064120651206612067120681206912070120711207212073120741207512076120771207812079120801208112082120831208412085120861208712088120891209012091120921209312094120951209612097120981209912100121011210212103121041210512106121071210812109121101211112112121131211412115121161211712118121191212012121121221212312124121251212612127121281212912130121311213212133121341213512136121371213812139121401214112142121431214412145121461214712148121491215012151121521215312154121551215612157121581215912160121611216212163121641216512166121671216812169121701217112172121731217412175121761217712178121791218012181121821218312184121851218612187121881218912190121911219212193121941219512196121971219812199122001220112202122031220412205122061220712208122091221012211122121221312214122151221612217122181221912220122211222212223122241222512226122271222812229122301223112232122331223412235122361223712238122391224012241122421224312244122451224612247122481224912250122511225212253122541225512256122571225812259122601226112262122631226412265122661226712268122691227012271122721227312274122751227612277122781227912280122811228212283122841228512286122871228812289122901229112292122931229412295122961229712298122991230012301123021230312304123051230612307123081230912310123111231212313123141231512316123171231812319123201232112322123231232412325123261232712328123291233012331123321233312334123351233612337123381233912340123411234212343123441234512346123471234812349123501235112352123531235412355123561235712358123591236012361123621236312364123651236612367123681236912370123711237212373123741237512376123771237812379123801238112382123831238412385123861238712388123891239012391123921239312394123951239612397123981239912400124011240212403124041240512406124071240812409124101241112412124131241412415124161241712418124191242012421124221242312424124251242612427124281242912430124311243212433124341243512436124371243812439124401244112442124431244412445124461244712448124491245012451124521245312454124551245612457124581245912460124611246212463124641246512466124671246812469124701247112472124731247412475124761247712478124791248012481124821248312484124851248612487124881248912490124911249212493124941249512496124971249812499125001250112502125031250412505125061250712508125091251012511125121251312514125151251612517125181251912520125211252212523125241252512526125271252812529125301253112532125331253412535125361253712538125391254012541125421254312544125451254612547125481254912550125511255212553125541255512556125571255812559125601256112562125631256412565125661256712568125691257012571125721257312574125751257612577125781257912580125811258212583125841258512586125871258812589125901259112592125931259412595125961259712598125991260012601126021260312604126051260612607126081260912610126111261212613126141261512616126171261812619126201262112622126231262412625126261262712628126291263012631126321263312634126351263612637126381263912640126411264212643126441264512646126471264812649126501265112652126531265412655126561265712658126591266012661126621266312664126651266612667126681266912670126711267212673126741267512676126771267812679126801268112682126831268412685126861268712688126891269012691126921269312694126951269612697126981269912700127011270212703127041270512706127071270812709127101271112712127131271412715127161271712718127191272012721127221272312724127251272612727127281272912730127311273212733127341273512736127371273812739127401274112742127431274412745127461274712748127491275012751127521275312754127551275612757127581275912760127611276212763127641276512766127671276812769127701277112772127731277412775127761277712778127791278012781127821278312784127851278612787127881278912790127911279212793127941279512796127971279812799128001280112802128031280412805128061280712808128091281012811128121281312814128151281612817128181281912820128211282212823128241282512826128271282812829128301283112832128331283412835128361283712838128391284012841128421284312844128451284612847128481284912850128511285212853128541285512856128571285812859128601286112862128631286412865128661286712868128691287012871128721287312874128751287612877128781287912880128811288212883128841288512886128871288812889128901289112892128931289412895128961289712898128991290012901129021290312904129051290612907129081290912910129111291212913129141291512916129171291812919129201292112922129231292412925129261292712928129291293012931129321293312934129351293612937129381293912940129411294212943129441294512946129471294812949129501295112952129531295412955129561295712958129591296012961129621296312964129651296612967129681296912970129711297212973129741297512976129771297812979129801298112982129831298412985129861298712988129891299012991129921299312994129951299612997129981299913000130011300213003130041300513006130071300813009130101301113012130131301413015130161301713018130191302013021130221302313024130251302613027130281302913030130311303213033130341303513036130371303813039130401304113042130431304413045130461304713048130491305013051130521305313054130551305613057130581305913060130611306213063130641306513066130671306813069130701307113072130731307413075130761307713078130791308013081130821308313084130851308613087130881308913090130911309213093130941309513096130971309813099131001310113102131031310413105131061310713108131091311013111131121311313114131151311613117131181311913120131211312213123131241312513126131271312813129131301313113132131331313413135131361313713138131391314013141131421314313144131451314613147131481314913150131511315213153131541315513156131571315813159131601316113162131631316413165131661316713168131691317013171131721317313174131751317613177131781317913180131811318213183131841318513186131871318813189131901319113192131931319413195131961319713198131991320013201132021320313204132051320613207132081320913210132111321213213132141321513216132171321813219132201322113222132231322413225132261322713228132291323013231132321323313234132351323613237132381323913240132411324213243132441324513246132471324813249132501325113252132531325413255132561325713258132591326013261132621326313264132651326613267132681326913270132711327213273132741327513276132771327813279132801328113282132831328413285132861328713288132891329013291132921329313294132951329613297132981329913300133011330213303133041330513306133071330813309133101331113312133131331413315133161331713318133191332013321133221332313324133251332613327133281332913330133311333213333133341333513336133371333813339133401334113342133431334413345133461334713348133491335013351133521335313354133551335613357133581335913360133611336213363133641336513366133671336813369133701337113372133731337413375133761337713378133791338013381133821338313384133851338613387133881338913390133911339213393133941339513396133971339813399134001340113402134031340413405134061340713408134091341013411134121341313414134151341613417134181341913420134211342213423134241342513426134271342813429134301343113432134331343413435134361343713438134391344013441134421344313444134451344613447134481344913450134511345213453134541345513456134571345813459134601346113462134631346413465134661346713468134691347013471134721347313474134751347613477134781347913480134811348213483134841348513486134871348813489134901349113492134931349413495134961349713498134991350013501135021350313504135051350613507135081350913510135111351213513135141351513516135171351813519135201352113522135231352413525135261352713528135291353013531135321353313534135351353613537135381353913540135411354213543135441354513546135471354813549135501355113552135531355413555135561355713558135591356013561135621356313564135651356613567135681356913570135711357213573135741357513576135771357813579135801358113582135831358413585135861358713588135891359013591135921359313594135951359613597135981359913600136011360213603136041360513606136071360813609136101361113612136131361413615136161361713618136191362013621136221362313624136251362613627136281362913630136311363213633136341363513636136371363813639136401364113642136431364413645136461364713648136491365013651136521365313654136551365613657136581365913660136611366213663136641366513666136671366813669136701367113672136731367413675136761367713678136791368013681136821368313684136851368613687136881368913690136911369213693136941369513696136971369813699137001370113702137031370413705137061370713708137091371013711137121371313714137151371613717137181371913720137211372213723137241372513726137271372813729137301373113732137331373413735137361373713738137391374013741137421374313744137451374613747137481374913750137511375213753137541375513756137571375813759137601376113762137631376413765137661376713768137691377013771137721377313774137751377613777137781377913780137811378213783137841378513786137871378813789137901379113792137931379413795137961379713798137991380013801138021380313804138051380613807138081380913810138111381213813138141381513816138171381813819138201382113822138231382413825138261382713828138291383013831138321383313834138351383613837138381383913840138411384213843138441384513846138471384813849138501385113852138531385413855138561385713858138591386013861138621386313864138651386613867138681386913870138711387213873138741387513876138771387813879138801388113882138831388413885138861388713888138891389013891138921389313894138951389613897138981389913900139011390213903139041390513906139071390813909139101391113912139131391413915139161391713918139191392013921139221392313924139251392613927139281392913930139311393213933139341393513936139371393813939139401394113942139431394413945139461394713948139491395013951139521395313954139551395613957139581395913960139611396213963139641396513966139671396813969139701397113972139731397413975139761397713978139791398013981139821398313984139851398613987139881398913990139911399213993139941399513996139971399813999140001400114002140031400414005140061400714008140091401014011140121401314014140151401614017140181401914020140211402214023140241402514026140271402814029140301403114032140331403414035140361403714038140391404014041140421404314044140451404614047140481404914050140511405214053140541405514056140571405814059140601406114062140631406414065140661406714068140691407014071140721407314074140751407614077140781407914080140811408214083140841408514086140871408814089140901409114092140931409414095140961409714098140991410014101141021410314104141051410614107141081410914110141111411214113141141411514116141171411814119141201412114122141231412414125141261412714128141291413014131141321413314134141351413614137141381413914140141411414214143141441414514146141471414814149141501415114152141531415414155141561415714158141591416014161141621416314164141651416614167141681416914170141711417214173141741417514176141771417814179141801418114182141831418414185141861418714188141891419014191141921419314194141951419614197141981419914200142011420214203142041420514206142071420814209142101421114212142131421414215142161421714218142191422014221142221422314224142251422614227142281422914230142311423214233142341423514236142371423814239142401424114242142431424414245142461424714248142491425014251142521425314254142551425614257142581425914260142611426214263142641426514266142671426814269142701427114272142731427414275142761427714278142791428014281142821428314284142851428614287142881428914290142911429214293142941429514296142971429814299143001430114302143031430414305143061430714308143091431014311143121431314314143151431614317143181431914320143211432214323143241432514326143271432814329143301433114332143331433414335143361433714338143391434014341143421434314344143451434614347143481434914350143511435214353143541435514356143571435814359143601436114362143631436414365143661436714368143691437014371143721437314374143751437614377143781437914380143811438214383143841438514386143871438814389143901439114392143931439414395143961439714398143991440014401144021440314404144051440614407144081440914410144111441214413144141441514416144171441814419144201442114422144231442414425144261442714428144291443014431144321443314434144351443614437144381443914440144411444214443144441444514446144471444814449144501445114452144531445414455144561445714458144591446014461144621446314464144651446614467144681446914470144711447214473144741447514476144771447814479144801448114482144831448414485144861448714488144891449014491144921449314494144951449614497144981449914500145011450214503145041450514506145071450814509145101451114512145131451414515145161451714518145191452014521145221452314524145251452614527145281452914530145311453214533145341453514536145371453814539145401454114542145431454414545145461454714548145491455014551145521455314554145551455614557145581455914560145611456214563145641456514566145671456814569145701457114572145731457414575145761457714578145791458014581145821458314584145851458614587145881458914590145911459214593145941459514596145971459814599146001460114602146031460414605146061460714608146091461014611146121461314614146151461614617146181461914620146211462214623146241462514626146271462814629146301463114632146331463414635146361463714638146391464014641146421464314644146451464614647146481464914650146511465214653146541465514656146571465814659146601466114662146631466414665146661466714668146691467014671146721467314674146751467614677146781467914680146811468214683146841468514686146871468814689146901469114692146931469414695146961469714698146991470014701147021470314704147051470614707147081470914710147111471214713147141471514716147171471814719147201472114722147231472414725147261472714728147291473014731147321473314734147351473614737147381473914740147411474214743147441474514746147471474814749147501475114752147531475414755147561475714758147591476014761147621476314764147651476614767147681476914770147711477214773147741477514776147771477814779147801478114782147831478414785147861478714788147891479014791147921479314794147951479614797147981479914800148011480214803148041480514806148071480814809148101481114812148131481414815148161481714818148191482014821148221482314824148251482614827148281482914830148311483214833148341483514836148371483814839148401484114842148431484414845148461484714848148491485014851148521485314854148551485614857148581485914860148611486214863148641486514866148671486814869148701487114872148731487414875148761487714878148791488014881148821488314884148851488614887148881488914890148911489214893148941489514896148971489814899149001490114902149031490414905149061490714908149091491014911149121491314914149151491614917149181491914920149211492214923149241492514926149271492814929149301493114932149331493414935149361493714938149391494014941149421494314944149451494614947149481494914950149511495214953149541495514956149571495814959149601496114962149631496414965149661496714968149691497014971149721497314974149751497614977149781497914980149811498214983149841498514986149871498814989149901499114992149931499414995149961499714998149991500015001150021500315004150051500615007150081500915010150111501215013150141501515016150171501815019150201502115022150231502415025150261502715028150291503015031150321503315034150351503615037150381503915040150411504215043150441504515046150471504815049150501505115052150531505415055150561505715058150591506015061150621506315064150651506615067150681506915070150711507215073150741507515076150771507815079150801508115082150831508415085150861508715088150891509015091150921509315094150951509615097150981509915100151011510215103151041510515106151071510815109151101511115112151131511415115151161511715118151191512015121151221512315124151251512615127151281512915130151311513215133151341513515136151371513815139151401514115142151431514415145151461514715148151491515015151151521515315154151551515615157151581515915160151611516215163151641516515166151671516815169151701517115172151731517415175151761517715178151791518015181151821518315184151851518615187151881518915190151911519215193151941519515196151971519815199152001520115202152031520415205152061520715208152091521015211152121521315214152151521615217152181521915220152211522215223152241522515226152271522815229152301523115232152331523415235152361523715238152391524015241152421524315244152451524615247152481524915250152511525215253152541525515256152571525815259152601526115262152631526415265152661526715268152691527015271152721527315274152751527615277152781527915280152811528215283152841528515286152871528815289152901529115292152931529415295152961529715298152991530015301153021530315304153051530615307153081530915310153111531215313153141531515316153171531815319153201532115322153231532415325153261532715328153291533015331153321533315334153351533615337153381533915340153411534215343153441534515346153471534815349153501535115352153531535415355153561535715358153591536015361153621536315364153651536615367153681536915370153711537215373153741537515376153771537815379153801538115382153831538415385153861538715388153891539015391153921539315394153951539615397153981539915400154011540215403154041540515406154071540815409154101541115412154131541415415154161541715418154191542015421154221542315424154251542615427154281542915430154311543215433154341543515436154371543815439154401544115442154431544415445154461544715448154491545015451154521545315454154551545615457154581545915460154611546215463154641546515466154671546815469154701547115472154731547415475154761547715478154791548015481154821548315484154851548615487154881548915490154911549215493154941549515496154971549815499155001550115502155031550415505155061550715508155091551015511155121551315514155151551615517155181551915520155211552215523155241552515526155271552815529155301553115532155331553415535155361553715538155391554015541155421554315544155451554615547155481554915550155511555215553155541555515556155571555815559155601556115562155631556415565155661556715568155691557015571155721557315574155751557615577155781557915580155811558215583155841558515586155871558815589155901559115592155931559415595155961559715598155991560015601156021560315604156051560615607156081560915610156111561215613156141561515616156171561815619156201562115622156231562415625156261562715628156291563015631156321563315634156351563615637156381563915640156411564215643156441564515646156471564815649156501565115652156531565415655156561565715658156591566015661156621566315664156651566615667156681566915670156711567215673156741567515676156771567815679156801568115682156831568415685156861568715688156891569015691156921569315694156951569615697156981569915700157011570215703157041570515706157071570815709157101571115712157131571415715157161571715718157191572015721157221572315724157251572615727157281572915730157311573215733157341573515736157371573815739157401574115742157431574415745157461574715748157491575015751157521575315754157551575615757157581575915760157611576215763157641576515766157671576815769157701577115772157731577415775157761577715778157791578015781157821578315784157851578615787157881578915790157911579215793157941579515796157971579815799158001580115802158031580415805158061580715808158091581015811158121581315814158151581615817158181581915820158211582215823158241582515826158271582815829158301583115832158331583415835158361583715838158391584015841158421584315844158451584615847158481584915850158511585215853158541585515856158571585815859158601586115862158631586415865158661586715868158691587015871158721587315874158751587615877158781587915880158811588215883158841588515886158871588815889158901589115892158931589415895158961589715898158991590015901159021590315904159051590615907159081590915910159111591215913159141591515916159171591815919159201592115922159231592415925159261592715928159291593015931159321593315934159351593615937159381593915940159411594215943159441594515946159471594815949159501595115952159531595415955159561595715958159591596015961159621596315964159651596615967159681596915970159711597215973159741597515976159771597815979159801598115982159831598415985159861598715988159891599015991159921599315994159951599615997159981599916000160011600216003160041600516006160071600816009160101601116012160131601416015160161601716018160191602016021160221602316024160251602616027160281602916030160311603216033160341603516036160371603816039160401604116042160431604416045160461604716048160491605016051160521605316054160551605616057160581605916060160611606216063160641606516066160671606816069160701607116072160731607416075160761607716078160791608016081160821608316084160851608616087160881608916090160911609216093160941609516096160971609816099161001610116102161031610416105161061610716108161091611016111161121611316114161151611616117161181611916120161211612216123161241612516126161271612816129161301613116132161331613416135161361613716138161391614016141161421614316144161451614616147161481614916150161511615216153161541615516156161571615816159161601616116162161631616416165161661616716168161691617016171161721617316174161751617616177161781617916180161811618216183161841618516186161871618816189161901619116192161931619416195161961619716198161991620016201162021620316204162051620616207162081620916210162111621216213162141621516216162171621816219162201622116222162231622416225162261622716228162291623016231162321623316234162351623616237162381623916240162411624216243162441624516246162471624816249162501625116252162531625416255162561625716258162591626016261162621626316264162651626616267162681626916270162711627216273162741627516276162771627816279162801628116282162831628416285162861628716288162891629016291162921629316294162951629616297162981629916300163011630216303163041630516306163071630816309163101631116312163131631416315163161631716318163191632016321163221632316324163251632616327163281632916330163311633216333163341633516336163371633816339163401634116342163431634416345163461634716348163491635016351163521635316354163551635616357163581635916360163611636216363163641636516366163671636816369163701637116372163731637416375163761637716378163791638016381163821638316384163851638616387163881638916390163911639216393163941639516396163971639816399164001640116402164031640416405164061640716408164091641016411164121641316414164151641616417164181641916420164211642216423164241642516426164271642816429164301643116432164331643416435164361643716438164391644016441164421644316444164451644616447164481644916450164511645216453164541645516456164571645816459164601646116462164631646416465164661646716468164691647016471164721647316474164751647616477164781647916480164811648216483164841648516486164871648816489164901649116492164931649416495164961649716498164991650016501165021650316504165051650616507165081650916510165111651216513165141651516516165171651816519165201652116522165231652416525165261652716528165291653016531165321653316534165351653616537165381653916540165411654216543165441654516546165471654816549165501655116552165531655416555165561655716558165591656016561165621656316564165651656616567165681656916570165711657216573165741657516576165771657816579165801658116582165831658416585165861658716588165891659016591165921659316594165951659616597165981659916600166011660216603166041660516606166071660816609166101661116612166131661416615166161661716618166191662016621166221662316624166251662616627166281662916630166311663216633166341663516636166371663816639166401664116642166431664416645166461664716648166491665016651166521665316654166551665616657166581665916660166611666216663166641666516666166671666816669166701667116672166731667416675166761667716678166791668016681166821668316684166851668616687166881668916690166911669216693166941669516696166971669816699167001670116702167031670416705167061670716708167091671016711167121671316714167151671616717167181671916720167211672216723167241672516726167271672816729167301673116732167331673416735167361673716738167391674016741167421674316744167451674616747167481674916750167511675216753167541675516756167571675816759167601676116762167631676416765167661676716768167691677016771167721677316774167751677616777167781677916780167811678216783167841678516786167871678816789167901679116792167931679416795167961679716798167991680016801168021680316804168051680616807168081680916810168111681216813168141681516816168171681816819168201682116822168231682416825168261682716828168291683016831168321683316834168351683616837168381683916840168411684216843168441684516846168471684816849168501685116852168531685416855168561685716858168591686016861168621686316864168651686616867168681686916870168711687216873168741687516876168771687816879168801688116882168831688416885168861688716888168891689016891168921689316894168951689616897168981689916900169011690216903169041690516906169071690816909169101691116912169131691416915169161691716918169191692016921169221692316924169251692616927169281692916930169311693216933169341693516936169371693816939169401694116942169431694416945169461694716948169491695016951169521695316954169551695616957169581695916960169611696216963169641696516966169671696816969169701697116972169731697416975169761697716978169791698016981169821698316984169851698616987169881698916990169911699216993169941699516996169971699816999170001700117002170031700417005170061700717008170091701017011170121701317014170151701617017170181701917020170211702217023170241702517026170271702817029170301703117032170331703417035170361703717038170391704017041170421704317044170451704617047170481704917050170511705217053170541705517056170571705817059170601706117062170631706417065170661706717068170691707017071170721707317074170751707617077170781707917080170811708217083170841708517086170871708817089170901709117092170931709417095170961709717098170991710017101171021710317104171051710617107171081710917110171111711217113171141711517116171171711817119171201712117122171231712417125171261712717128171291713017131171321713317134171351713617137171381713917140171411714217143171441714517146171471714817149171501715117152171531715417155171561715717158171591716017161171621716317164171651716617167171681716917170171711717217173171741717517176171771717817179171801718117182171831718417185171861718717188171891719017191171921719317194171951719617197171981719917200172011720217203172041720517206172071720817209172101721117212172131721417215172161721717218172191722017221172221722317224172251722617227172281722917230172311723217233172341723517236172371723817239172401724117242172431724417245172461724717248172491725017251172521725317254172551725617257172581725917260172611726217263172641726517266172671726817269172701727117272172731727417275172761727717278172791728017281172821728317284172851728617287172881728917290172911729217293172941729517296172971729817299173001730117302173031730417305173061730717308173091731017311173121731317314173151731617317173181731917320173211732217323173241732517326173271732817329173301733117332173331733417335173361733717338173391734017341173421734317344173451734617347173481734917350173511735217353173541735517356173571735817359173601736117362173631736417365173661736717368173691737017371173721737317374173751737617377173781737917380173811738217383173841738517386173871738817389173901739117392173931739417395173961739717398173991740017401174021740317404174051740617407174081740917410174111741217413174141741517416174171741817419174201742117422174231742417425174261742717428174291743017431174321743317434174351743617437174381743917440174411744217443174441744517446174471744817449174501745117452174531745417455174561745717458174591746017461174621746317464174651746617467174681746917470174711747217473174741747517476174771747817479174801748117482174831748417485174861748717488174891749017491174921749317494174951749617497174981749917500175011750217503175041750517506175071750817509175101751117512175131751417515175161751717518175191752017521175221752317524175251752617527175281752917530175311753217533175341753517536175371753817539175401754117542175431754417545175461754717548175491755017551175521755317554175551755617557175581755917560175611756217563175641756517566175671756817569175701757117572175731757417575175761757717578175791758017581175821758317584175851758617587175881758917590175911759217593175941759517596175971759817599176001760117602176031760417605176061760717608176091761017611176121761317614176151761617617176181761917620176211762217623176241762517626176271762817629176301763117632176331763417635176361763717638176391764017641176421764317644176451764617647176481764917650176511765217653176541765517656176571765817659176601766117662176631766417665176661766717668176691767017671176721767317674176751767617677176781767917680176811768217683176841768517686176871768817689176901769117692176931769417695176961769717698176991770017701177021770317704177051770617707177081770917710177111771217713177141771517716177171771817719177201772117722177231772417725177261772717728177291773017731177321773317734177351773617737177381773917740177411774217743177441774517746177471774817749177501775117752177531775417755177561775717758177591776017761177621776317764177651776617767177681776917770177711777217773177741777517776177771777817779177801778117782177831778417785177861778717788177891779017791177921779317794177951779617797177981779917800178011780217803178041780517806178071780817809178101781117812178131781417815178161781717818178191782017821178221782317824178251782617827178281782917830178311783217833178341783517836178371783817839178401784117842178431784417845178461784717848178491785017851178521785317854178551785617857178581785917860178611786217863178641786517866178671786817869178701787117872178731787417875178761787717878178791788017881178821788317884178851788617887178881788917890178911789217893178941789517896178971789817899179001790117902179031790417905179061790717908179091791017911179121791317914179151791617917179181791917920179211792217923179241792517926179271792817929179301793117932179331793417935179361793717938179391794017941179421794317944179451794617947179481794917950179511795217953179541795517956179571795817959179601796117962179631796417965179661796717968179691797017971179721797317974179751797617977179781797917980179811798217983179841798517986179871798817989179901799117992179931799417995179961799717998179991800018001180021800318004180051800618007180081800918010180111801218013180141801518016180171801818019180201802118022180231802418025180261802718028180291803018031180321803318034180351803618037180381803918040180411804218043180441804518046180471804818049180501805118052180531805418055180561805718058180591806018061180621806318064180651806618067180681806918070180711807218073180741807518076180771807818079180801808118082180831808418085180861808718088180891809018091180921809318094180951809618097180981809918100181011810218103181041810518106181071810818109181101811118112181131811418115181161811718118181191812018121181221812318124181251812618127181281812918130181311813218133181341813518136181371813818139181401814118142181431814418145181461814718148181491815018151181521815318154181551815618157181581815918160181611816218163181641816518166181671816818169181701817118172181731817418175181761817718178181791818018181181821818318184181851818618187181881818918190181911819218193181941819518196181971819818199182001820118202182031820418205182061820718208182091821018211182121821318214182151821618217182181821918220182211822218223182241822518226182271822818229182301823118232182331823418235182361823718238182391824018241182421824318244182451824618247182481824918250182511825218253182541825518256182571825818259182601826118262182631826418265182661826718268182691827018271182721827318274182751827618277182781827918280182811828218283182841828518286182871828818289182901829118292182931829418295182961829718298182991830018301183021830318304183051830618307183081830918310183111831218313183141831518316183171831818319183201832118322183231832418325183261832718328183291833018331183321833318334183351833618337183381833918340183411834218343183441834518346183471834818349183501835118352183531835418355183561835718358183591836018361183621836318364183651836618367183681836918370183711837218373183741837518376183771837818379183801838118382183831838418385183861838718388183891839018391183921839318394183951839618397183981839918400184011840218403184041840518406184071840818409184101841118412184131841418415184161841718418184191842018421184221842318424184251842618427184281842918430184311843218433184341843518436184371843818439184401844118442184431844418445184461844718448184491845018451184521845318454184551845618457184581845918460184611846218463184641846518466184671846818469184701847118472184731847418475184761847718478184791848018481184821848318484184851848618487184881848918490184911849218493184941849518496184971849818499185001850118502185031850418505185061850718508185091851018511185121851318514185151851618517185181851918520185211852218523185241852518526185271852818529185301853118532185331853418535185361853718538185391854018541185421854318544185451854618547185481854918550185511855218553185541855518556185571855818559185601856118562185631856418565185661856718568185691857018571185721857318574185751857618577185781857918580185811858218583185841858518586185871858818589185901859118592185931859418595185961859718598185991860018601186021860318604186051860618607186081860918610186111861218613186141861518616186171861818619186201862118622186231862418625186261862718628186291863018631186321863318634186351863618637186381863918640186411864218643186441864518646186471864818649186501865118652186531865418655186561865718658186591866018661186621866318664186651866618667186681866918670186711867218673186741867518676186771867818679186801868118682186831868418685186861868718688186891869018691186921869318694186951869618697186981869918700187011870218703187041870518706187071870818709187101871118712187131871418715187161871718718187191872018721187221872318724187251872618727187281872918730187311873218733187341873518736187371873818739187401874118742187431874418745187461874718748187491875018751187521875318754187551875618757187581875918760187611876218763187641876518766187671876818769187701877118772187731877418775187761877718778187791878018781187821878318784187851878618787187881878918790187911879218793187941879518796187971879818799188001880118802188031880418805188061880718808188091881018811188121881318814188151881618817188181881918820188211882218823188241882518826188271882818829188301883118832188331883418835188361883718838188391884018841188421884318844188451884618847188481884918850188511885218853188541885518856188571885818859188601886118862188631886418865188661886718868188691887018871188721887318874188751887618877188781887918880188811888218883188841888518886188871888818889188901889118892188931889418895188961889718898188991890018901189021890318904189051890618907189081890918910189111891218913189141891518916189171891818919189201892118922189231892418925189261892718928189291893018931189321893318934189351893618937189381893918940189411894218943189441894518946189471894818949189501895118952189531895418955189561895718958189591896018961189621896318964189651896618967189681896918970189711897218973189741897518976189771897818979189801898118982189831898418985189861898718988189891899018991189921899318994189951899618997189981899919000190011900219003190041900519006190071900819009190101901119012190131901419015190161901719018190191902019021190221902319024190251902619027190281902919030190311903219033190341903519036190371903819039190401904119042190431904419045190461904719048190491905019051190521905319054190551905619057190581905919060190611906219063190641906519066190671906819069190701907119072190731907419075190761907719078190791908019081190821908319084190851908619087190881908919090190911909219093190941909519096190971909819099191001910119102191031910419105191061910719108191091911019111191121911319114191151911619117191181911919120191211912219123191241912519126191271912819129191301913119132191331913419135191361913719138191391914019141191421914319144191451914619147191481914919150191511915219153191541915519156191571915819159191601916119162191631916419165191661916719168191691917019171191721917319174191751917619177191781917919180191811918219183191841918519186191871918819189191901919119192191931919419195191961919719198191991920019201192021920319204192051920619207192081920919210192111921219213192141921519216192171921819219192201922119222192231922419225192261922719228192291923019231192321923319234192351923619237192381923919240192411924219243192441924519246192471924819249192501925119252192531925419255192561925719258192591926019261192621926319264192651926619267192681926919270192711927219273192741927519276192771927819279192801928119282192831928419285192861928719288192891929019291192921929319294192951929619297192981929919300193011930219303193041930519306193071930819309193101931119312193131931419315193161931719318193191932019321193221932319324193251932619327193281932919330193311933219333193341933519336193371933819339193401934119342193431934419345193461934719348193491935019351193521935319354193551935619357193581935919360193611936219363193641936519366193671936819369193701937119372193731937419375193761937719378193791938019381193821938319384193851938619387193881938919390193911939219393193941939519396193971939819399194001940119402194031940419405194061940719408194091941019411194121941319414194151941619417194181941919420194211942219423194241942519426194271942819429194301943119432194331943419435194361943719438194391944019441194421944319444194451944619447194481944919450194511945219453194541945519456194571945819459194601946119462194631946419465194661946719468194691947019471194721947319474194751947619477194781947919480194811948219483194841948519486194871948819489194901949119492194931949419495194961949719498194991950019501195021950319504195051950619507195081950919510195111951219513195141951519516195171951819519195201952119522195231952419525195261952719528195291953019531195321953319534195351953619537195381953919540195411954219543195441954519546195471954819549195501955119552195531955419555195561955719558195591956019561195621956319564195651956619567195681956919570195711957219573195741957519576195771957819579195801958119582195831958419585195861958719588195891959019591195921959319594195951959619597195981959919600196011960219603196041960519606196071960819609196101961119612196131961419615196161961719618196191962019621196221962319624196251962619627196281962919630196311963219633196341963519636196371963819639196401964119642196431964419645196461964719648196491965019651196521965319654196551965619657196581965919660196611966219663196641966519666196671966819669196701967119672196731967419675196761967719678196791968019681196821968319684196851968619687196881968919690196911969219693196941969519696196971969819699197001970119702197031970419705197061970719708197091971019711197121971319714197151971619717197181971919720197211972219723197241972519726197271972819729197301973119732197331973419735197361973719738197391974019741197421974319744197451974619747197481974919750197511975219753197541975519756197571975819759197601976119762197631976419765197661976719768197691977019771197721977319774197751977619777197781977919780197811978219783197841978519786197871978819789197901979119792197931979419795197961979719798197991980019801198021980319804198051980619807198081980919810198111981219813198141981519816198171981819819198201982119822198231982419825198261982719828198291983019831198321983319834198351983619837198381983919840198411984219843198441984519846198471984819849198501985119852198531985419855198561985719858198591986019861198621986319864198651986619867198681986919870198711987219873198741987519876198771987819879198801988119882198831988419885198861988719888198891989019891198921989319894198951989619897198981989919900199011990219903199041990519906199071990819909199101991119912199131991419915199161991719918199191992019921199221992319924199251992619927199281992919930199311993219933199341993519936199371993819939199401994119942199431994419945199461994719948199491995019951199521995319954199551995619957199581995919960199611996219963199641996519966199671996819969199701997119972199731997419975199761997719978199791998019981199821998319984199851998619987199881998919990199911999219993199941999519996199971999819999200002000120002200032000420005200062000720008200092001020011200122001320014200152001620017200182001920020200212002220023200242002520026200272002820029200302003120032200332003420035200362003720038200392004020041200422004320044200452004620047200482004920050200512005220053200542005520056200572005820059200602006120062200632006420065200662006720068200692007020071200722007320074200752007620077200782007920080200812008220083200842008520086200872008820089200902009120092200932009420095200962009720098200992010020101201022010320104201052010620107201082010920110201112011220113201142011520116201172011820119201202012120122201232012420125201262012720128201292013020131201322013320134201352013620137201382013920140201412014220143201442014520146201472014820149201502015120152201532015420155201562015720158201592016020161201622016320164201652016620167201682016920170201712017220173201742017520176201772017820179201802018120182201832018420185201862018720188201892019020191201922019320194201952019620197201982019920200202012020220203202042020520206202072020820209202102021120212202132021420215202162021720218202192022020221202222022320224202252022620227202282022920230202312023220233202342023520236202372023820239202402024120242202432024420245202462024720248202492025020251202522025320254202552025620257202582025920260202612026220263202642026520266202672026820269202702027120272202732027420275202762027720278202792028020281202822028320284202852028620287202882028920290202912029220293202942029520296202972029820299203002030120302203032030420305203062030720308203092031020311203122031320314203152031620317203182031920320203212032220323203242032520326203272032820329203302033120332203332033420335203362033720338203392034020341203422034320344203452034620347203482034920350203512035220353203542035520356203572035820359203602036120362203632036420365203662036720368203692037020371203722037320374203752037620377203782037920380203812038220383203842038520386203872038820389203902039120392203932039420395203962039720398203992040020401204022040320404204052040620407204082040920410204112041220413204142041520416204172041820419204202042120422204232042420425204262042720428204292043020431204322043320434204352043620437204382043920440204412044220443204442044520446204472044820449204502045120452204532045420455204562045720458204592046020461204622046320464204652046620467204682046920470204712047220473204742047520476204772047820479204802048120482204832048420485204862048720488204892049020491204922049320494204952049620497204982049920500205012050220503205042050520506205072050820509205102051120512205132051420515205162051720518205192052020521205222052320524205252052620527205282052920530205312053220533205342053520536205372053820539205402054120542205432054420545205462054720548205492055020551205522055320554205552055620557205582055920560205612056220563205642056520566205672056820569205702057120572205732057420575205762057720578205792058020581205822058320584205852058620587205882058920590205912059220593205942059520596205972059820599206002060120602206032060420605206062060720608206092061020611206122061320614206152061620617206182061920620206212062220623206242062520626206272062820629206302063120632206332063420635206362063720638206392064020641206422064320644206452064620647206482064920650206512065220653206542065520656206572065820659206602066120662206632066420665206662066720668206692067020671206722067320674206752067620677206782067920680206812068220683206842068520686206872068820689206902069120692206932069420695206962069720698206992070020701207022070320704207052070620707207082070920710207112071220713207142071520716207172071820719207202072120722207232072420725207262072720728207292073020731207322073320734207352073620737207382073920740207412074220743207442074520746207472074820749207502075120752207532075420755207562075720758207592076020761207622076320764207652076620767207682076920770207712077220773207742077520776207772077820779207802078120782207832078420785207862078720788207892079020791207922079320794207952079620797207982079920800208012080220803208042080520806208072080820809208102081120812208132081420815208162081720818208192082020821208222082320824208252082620827208282082920830208312083220833208342083520836208372083820839208402084120842208432084420845208462084720848208492085020851208522085320854208552085620857208582085920860208612086220863208642086520866208672086820869208702087120872208732087420875208762087720878208792088020881208822088320884208852088620887208882088920890208912089220893208942089520896208972089820899209002090120902209032090420905209062090720908209092091020911209122091320914209152091620917209182091920920209212092220923209242092520926209272092820929209302093120932209332093420935209362093720938209392094020941209422094320944209452094620947209482094920950209512095220953209542095520956209572095820959209602096120962209632096420965209662096720968209692097020971209722097320974209752097620977209782097920980209812098220983209842098520986209872098820989209902099120992209932099420995209962099720998209992100021001210022100321004210052100621007210082100921010210112101221013210142101521016210172101821019210202102121022210232102421025210262102721028210292103021031210322103321034210352103621037210382103921040210412104221043210442104521046210472104821049210502105121052210532105421055210562105721058210592106021061210622106321064210652106621067210682106921070210712107221073210742107521076210772107821079210802108121082210832108421085210862108721088210892109021091210922109321094210952109621097210982109921100211012110221103211042110521106211072110821109211102111121112211132111421115211162111721118211192112021121211222112321124211252112621127211282112921130211312113221133211342113521136211372113821139211402114121142211432114421145211462114721148211492115021151211522115321154211552115621157211582115921160211612116221163211642116521166211672116821169211702117121172211732117421175211762117721178211792118021181211822118321184211852118621187211882118921190211912119221193211942119521196211972119821199212002120121202212032120421205212062120721208212092121021211212122121321214212152121621217212182121921220212212122221223212242122521226212272122821229212302123121232212332123421235212362123721238212392124021241212422124321244212452124621247212482124921250212512125221253212542125521256212572125821259212602126121262212632126421265212662126721268212692127021271212722127321274212752127621277212782127921280212812128221283212842128521286212872128821289212902129121292212932129421295212962129721298212992130021301213022130321304213052130621307213082130921310213112131221313213142131521316213172131821319213202132121322213232132421325213262132721328213292133021331213322133321334213352133621337213382133921340213412134221343213442134521346213472134821349213502135121352213532135421355213562135721358213592136021361213622136321364213652136621367213682136921370213712137221373213742137521376213772137821379213802138121382213832138421385213862138721388213892139021391213922139321394213952139621397213982139921400214012140221403214042140521406214072140821409214102141121412214132141421415214162141721418214192142021421214222142321424214252142621427214282142921430214312143221433214342143521436214372143821439214402144121442214432144421445214462144721448214492145021451214522145321454214552145621457214582145921460214612146221463214642146521466214672146821469214702147121472214732147421475214762147721478214792148021481214822148321484214852148621487214882148921490214912149221493214942149521496214972149821499215002150121502215032150421505215062150721508215092151021511215122151321514215152151621517215182151921520215212152221523215242152521526215272152821529215302153121532215332153421535215362153721538215392154021541215422154321544215452154621547215482154921550215512155221553215542155521556215572155821559215602156121562215632156421565215662156721568215692157021571215722157321574215752157621577215782157921580215812158221583215842158521586215872158821589215902159121592215932159421595215962159721598215992160021601216022160321604216052160621607216082160921610216112161221613216142161521616216172161821619216202162121622216232162421625216262162721628216292163021631216322163321634216352163621637216382163921640216412164221643216442164521646216472164821649216502165121652216532165421655216562165721658216592166021661216622166321664216652166621667216682166921670216712167221673216742167521676216772167821679216802168121682216832168421685216862168721688216892169021691216922169321694216952169621697216982169921700217012170221703217042170521706217072170821709217102171121712217132171421715217162171721718217192172021721217222172321724217252172621727217282172921730217312173221733217342173521736217372173821739217402174121742217432174421745217462174721748217492175021751217522175321754217552175621757217582175921760217612176221763217642176521766217672176821769217702177121772217732177421775217762177721778217792178021781217822178321784217852178621787217882178921790217912179221793217942179521796217972179821799218002180121802218032180421805218062180721808218092181021811218122181321814218152181621817218182181921820218212182221823218242182521826218272182821829218302183121832218332183421835218362183721838218392184021841218422184321844218452184621847218482184921850218512185221853218542185521856218572185821859218602186121862218632186421865218662186721868218692187021871218722187321874218752187621877218782187921880218812188221883218842188521886218872188821889218902189121892218932189421895218962189721898218992190021901219022190321904219052190621907219082190921910219112191221913219142191521916219172191821919219202192121922219232192421925219262192721928219292193021931219322193321934219352193621937219382193921940219412194221943219442194521946219472194821949219502195121952219532195421955219562195721958219592196021961219622196321964219652196621967219682196921970219712197221973219742197521976219772197821979219802198121982219832198421985219862198721988219892199021991219922199321994219952199621997219982199922000220012200222003220042200522006220072200822009220102201122012220132201422015220162201722018220192202022021220222202322024220252202622027220282202922030220312203222033220342203522036220372203822039220402204122042220432204422045220462204722048220492205022051220522205322054220552205622057220582205922060220612206222063220642206522066220672206822069220702207122072220732207422075220762207722078220792208022081220822208322084220852208622087220882208922090220912209222093220942209522096220972209822099221002210122102221032210422105221062210722108221092211022111221122211322114221152211622117221182211922120221212212222123221242212522126221272212822129221302213122132221332213422135221362213722138221392214022141221422214322144221452214622147221482214922150221512215222153221542215522156221572215822159221602216122162221632216422165221662216722168221692217022171221722217322174221752217622177221782217922180221812218222183221842218522186221872218822189221902219122192221932219422195221962219722198221992220022201222022220322204222052220622207222082220922210222112221222213222142221522216222172221822219222202222122222222232222422225222262222722228222292223022231222322223322234222352223622237222382223922240222412224222243222442224522246222472224822249222502225122252222532225422255222562225722258222592226022261222622226322264222652226622267222682226922270222712227222273222742227522276222772227822279222802228122282222832228422285222862228722288222892229022291222922229322294222952229622297222982229922300223012230222303223042230522306223072230822309223102231122312223132231422315223162231722318223192232022321223222232322324223252232622327223282232922330223312233222333223342233522336223372233822339223402234122342223432234422345223462234722348223492235022351223522235322354223552235622357223582235922360223612236222363223642236522366223672236822369223702237122372223732237422375223762237722378223792238022381223822238322384223852238622387223882238922390223912239222393223942239522396223972239822399224002240122402224032240422405224062240722408224092241022411224122241322414224152241622417224182241922420224212242222423224242242522426224272242822429224302243122432224332243422435224362243722438224392244022441224422244322444224452244622447224482244922450224512245222453224542245522456224572245822459224602246122462224632246422465224662246722468224692247022471224722247322474224752247622477224782247922480224812248222483224842248522486224872248822489224902249122492224932249422495224962249722498224992250022501225022250322504225052250622507225082250922510225112251222513225142251522516225172251822519225202252122522225232252422525225262252722528225292253022531225322253322534225352253622537225382253922540225412254222543225442254522546225472254822549225502255122552225532255422555225562255722558225592256022561225622256322564225652256622567225682256922570225712257222573225742257522576225772257822579225802258122582225832258422585225862258722588225892259022591225922259322594225952259622597225982259922600226012260222603226042260522606226072260822609226102261122612226132261422615226162261722618226192262022621226222262322624226252262622627226282262922630226312263222633226342263522636226372263822639226402264122642226432264422645226462264722648226492265022651226522265322654226552265622657226582265922660226612266222663226642266522666226672266822669226702267122672226732267422675226762267722678226792268022681226822268322684226852268622687226882268922690226912269222693226942269522696226972269822699227002270122702227032270422705227062270722708227092271022711227122271322714227152271622717227182271922720227212272222723227242272522726227272272822729227302273122732227332273422735227362273722738227392274022741227422274322744227452274622747227482274922750227512275222753227542275522756227572275822759227602276122762227632276422765227662276722768227692277022771227722277322774227752277622777227782277922780227812278222783227842278522786227872278822789227902279122792227932279422795227962279722798227992280022801228022280322804228052280622807228082280922810228112281222813228142281522816228172281822819228202282122822228232282422825228262282722828228292283022831228322283322834228352283622837228382283922840228412284222843228442284522846228472284822849228502285122852228532285422855228562285722858228592286022861228622286322864228652286622867228682286922870228712287222873228742287522876228772287822879228802288122882228832288422885228862288722888228892289022891228922289322894228952289622897228982289922900229012290222903229042290522906229072290822909229102291122912229132291422915229162291722918229192292022921229222292322924229252292622927229282292922930229312293222933229342293522936229372293822939229402294122942229432294422945229462294722948229492295022951229522295322954229552295622957229582295922960229612296222963229642296522966229672296822969229702297122972229732297422975229762297722978229792298022981229822298322984229852298622987229882298922990229912299222993229942299522996229972299822999230002300123002230032300423005230062300723008230092301023011230122301323014230152301623017230182301923020230212302223023230242302523026230272302823029230302303123032230332303423035230362303723038230392304023041230422304323044230452304623047230482304923050230512305223053230542305523056230572305823059230602306123062230632306423065230662306723068230692307023071230722307323074230752307623077230782307923080230812308223083230842308523086230872308823089230902309123092230932309423095230962309723098230992310023101231022310323104231052310623107231082310923110231112311223113231142311523116231172311823119231202312123122231232312423125231262312723128231292313023131231322313323134231352313623137231382313923140231412314223143231442314523146231472314823149231502315123152231532315423155231562315723158231592316023161231622316323164231652316623167231682316923170231712317223173231742317523176231772317823179231802318123182231832318423185231862318723188231892319023191231922319323194231952319623197231982319923200232012320223203232042320523206232072320823209232102321123212232132321423215232162321723218232192322023221232222322323224232252322623227232282322923230232312323223233232342323523236232372323823239232402324123242232432324423245232462324723248232492325023251232522325323254232552325623257232582325923260232612326223263232642326523266232672326823269232702327123272232732327423275232762327723278232792328023281232822328323284232852328623287232882328923290232912329223293232942329523296232972329823299233002330123302233032330423305233062330723308233092331023311233122331323314233152331623317233182331923320233212332223323233242332523326233272332823329233302333123332233332333423335233362333723338233392334023341233422334323344233452334623347233482334923350233512335223353233542335523356233572335823359233602336123362233632336423365233662336723368233692337023371233722337323374233752337623377233782337923380233812338223383233842338523386233872338823389233902339123392233932339423395233962339723398233992340023401234022340323404234052340623407234082340923410234112341223413234142341523416234172341823419234202342123422234232342423425234262342723428234292343023431234322343323434234352343623437234382343923440234412344223443234442344523446234472344823449234502345123452234532345423455234562345723458234592346023461234622346323464234652346623467234682346923470234712347223473234742347523476234772347823479234802348123482234832348423485234862348723488234892349023491234922349323494234952349623497234982349923500235012350223503235042350523506235072350823509235102351123512235132351423515235162351723518235192352023521235222352323524235252352623527235282352923530235312353223533235342353523536235372353823539235402354123542235432354423545235462354723548235492355023551235522355323554235552355623557235582355923560235612356223563235642356523566235672356823569235702357123572235732357423575235762357723578235792358023581235822358323584235852358623587235882358923590235912359223593235942359523596235972359823599236002360123602236032360423605236062360723608236092361023611236122361323614236152361623617236182361923620236212362223623236242362523626236272362823629236302363123632236332363423635236362363723638236392364023641236422364323644236452364623647236482364923650236512365223653236542365523656236572365823659236602366123662236632366423665236662366723668236692367023671236722367323674236752367623677236782367923680236812368223683236842368523686236872368823689236902369123692236932369423695236962369723698236992370023701237022370323704237052370623707237082370923710237112371223713237142371523716237172371823719237202372123722237232372423725237262372723728237292373023731237322373323734237352373623737237382373923740237412374223743237442374523746237472374823749237502375123752237532375423755237562375723758237592376023761237622376323764237652376623767237682376923770237712377223773237742377523776237772377823779237802378123782237832378423785237862378723788237892379023791237922379323794237952379623797237982379923800238012380223803238042380523806238072380823809238102381123812238132381423815238162381723818238192382023821238222382323824238252382623827238282382923830238312383223833238342383523836238372383823839238402384123842238432384423845238462384723848238492385023851238522385323854238552385623857238582385923860238612386223863238642386523866238672386823869238702387123872238732387423875238762387723878238792388023881238822388323884238852388623887238882388923890238912389223893238942389523896238972389823899239002390123902239032390423905239062390723908239092391023911239122391323914239152391623917239182391923920239212392223923239242392523926239272392823929239302393123932239332393423935239362393723938239392394023941239422394323944239452394623947239482394923950239512395223953239542395523956239572395823959239602396123962239632396423965239662396723968239692397023971239722397323974239752397623977239782397923980239812398223983239842398523986239872398823989239902399123992239932399423995239962399723998239992400024001240022400324004240052400624007240082400924010240112401224013240142401524016240172401824019240202402124022240232402424025240262402724028240292403024031240322403324034240352403624037240382403924040240412404224043240442404524046240472404824049240502405124052240532405424055240562405724058240592406024061240622406324064240652406624067240682406924070240712407224073240742407524076240772407824079240802408124082240832408424085240862408724088240892409024091240922409324094240952409624097240982409924100241012410224103241042410524106241072410824109241102411124112241132411424115241162411724118241192412024121241222412324124241252412624127241282412924130241312413224133241342413524136241372413824139241402414124142241432414424145241462414724148241492415024151241522415324154241552415624157241582415924160241612416224163241642416524166241672416824169241702417124172241732417424175241762417724178241792418024181241822418324184241852418624187241882418924190241912419224193241942419524196241972419824199242002420124202242032420424205242062420724208242092421024211242122421324214242152421624217242182421924220242212422224223242242422524226242272422824229242302423124232242332423424235242362423724238242392424024241242422424324244242452424624247242482424924250242512425224253242542425524256242572425824259242602426124262242632426424265242662426724268242692427024271242722427324274242752427624277242782427924280242812428224283242842428524286242872428824289242902429124292242932429424295242962429724298242992430024301243022430324304243052430624307243082430924310243112431224313243142431524316243172431824319243202432124322243232432424325243262432724328243292433024331243322433324334243352433624337243382433924340243412434224343243442434524346243472434824349243502435124352243532435424355243562435724358243592436024361243622436324364243652436624367243682436924370243712437224373243742437524376243772437824379243802438124382243832438424385243862438724388243892439024391243922439324394243952439624397243982439924400244012440224403244042440524406244072440824409244102441124412244132441424415244162441724418244192442024421244222442324424244252442624427244282442924430244312443224433244342443524436244372443824439244402444124442244432444424445244462444724448244492445024451244522445324454244552445624457244582445924460244612446224463244642446524466244672446824469244702447124472244732447424475244762447724478244792448024481244822448324484244852448624487244882448924490244912449224493244942449524496244972449824499245002450124502245032450424505245062450724508245092451024511245122451324514245152451624517245182451924520245212452224523245242452524526245272452824529245302453124532245332453424535245362453724538245392454024541245422454324544245452454624547245482454924550245512455224553245542455524556245572455824559245602456124562245632456424565245662456724568245692457024571245722457324574245752457624577245782457924580245812458224583245842458524586245872458824589245902459124592245932459424595245962459724598245992460024601246022460324604246052460624607246082460924610246112461224613246142461524616246172461824619246202462124622246232462424625246262462724628246292463024631246322463324634246352463624637246382463924640246412464224643246442464524646246472464824649246502465124652246532465424655246562465724658246592466024661246622466324664246652466624667246682466924670246712467224673246742467524676246772467824679246802468124682246832468424685246862468724688246892469024691246922469324694246952469624697246982469924700247012470224703247042470524706247072470824709247102471124712247132471424715247162471724718247192472024721247222472324724247252472624727247282472924730247312473224733247342473524736247372473824739247402474124742247432474424745247462474724748247492475024751247522475324754247552475624757247582475924760247612476224763247642476524766247672476824769247702477124772247732477424775247762477724778247792478024781247822478324784247852478624787247882478924790247912479224793247942479524796247972479824799248002480124802248032480424805248062480724808248092481024811248122481324814248152481624817248182481924820248212482224823248242482524826248272482824829248302483124832248332483424835248362483724838248392484024841248422484324844248452484624847248482484924850248512485224853248542485524856248572485824859248602486124862248632486424865248662486724868248692487024871248722487324874248752487624877248782487924880248812488224883248842488524886248872488824889248902489124892248932489424895248962489724898248992490024901249022490324904249052490624907249082490924910249112491224913249142491524916249172491824919249202492124922249232492424925249262492724928249292493024931249322493324934249352493624937249382493924940249412494224943249442494524946249472494824949249502495124952249532495424955249562495724958249592496024961249622496324964249652496624967249682496924970249712497224973249742497524976249772497824979249802498124982249832498424985249862498724988249892499024991249922499324994249952499624997249982499925000250012500225003250042500525006250072500825009250102501125012250132501425015250162501725018250192502025021250222502325024250252502625027250282502925030250312503225033250342503525036250372503825039250402504125042250432504425045250462504725048250492505025051250522505325054250552505625057250582505925060250612506225063250642506525066250672506825069250702507125072250732507425075250762507725078250792508025081250822508325084250852508625087250882508925090250912509225093250942509525096250972509825099251002510125102251032510425105251062510725108251092511025111251122511325114251152511625117251182511925120251212512225123251242512525126251272512825129251302513125132251332513425135251362513725138251392514025141251422514325144251452514625147251482514925150251512515225153251542515525156251572515825159251602516125162251632516425165251662516725168251692517025171251722517325174251752517625177251782517925180251812518225183251842518525186251872518825189251902519125192251932519425195251962519725198251992520025201252022520325204252052520625207252082520925210252112521225213252142521525216252172521825219252202522125222252232522425225252262522725228252292523025231252322523325234252352523625237252382523925240252412524225243252442524525246252472524825249252502525125252252532525425255252562525725258252592526025261252622526325264252652526625267252682526925270252712527225273252742527525276252772527825279252802528125282252832528425285252862528725288252892529025291252922529325294252952529625297252982529925300253012530225303253042530525306253072530825309253102531125312253132531425315253162531725318253192532025321253222532325324253252532625327253282532925330253312533225333253342533525336253372533825339253402534125342253432534425345253462534725348253492535025351253522535325354253552535625357253582535925360253612536225363253642536525366253672536825369253702537125372253732537425375253762537725378253792538025381253822538325384253852538625387253882538925390253912539225393253942539525396253972539825399254002540125402254032540425405254062540725408254092541025411254122541325414254152541625417254182541925420254212542225423254242542525426254272542825429254302543125432254332543425435254362543725438254392544025441254422544325444254452544625447254482544925450254512545225453254542545525456254572545825459254602546125462254632546425465254662546725468254692547025471254722547325474254752547625477254782547925480254812548225483254842548525486254872548825489254902549125492254932549425495254962549725498254992550025501255022550325504255052550625507255082550925510255112551225513255142551525516255172551825519255202552125522255232552425525255262552725528255292553025531255322553325534255352553625537255382553925540255412554225543255442554525546255472554825549255502555125552255532555425555255562555725558255592556025561255622556325564255652556625567255682556925570255712557225573255742557525576255772557825579255802558125582255832558425585255862558725588255892559025591255922559325594255952559625597255982559925600256012560225603256042560525606256072560825609256102561125612256132561425615256162561725618256192562025621256222562325624256252562625627256282562925630256312563225633256342563525636256372563825639256402564125642256432564425645256462564725648256492565025651256522565325654256552565625657256582565925660256612566225663256642566525666256672566825669256702567125672256732567425675256762567725678256792568025681256822568325684256852568625687256882568925690256912569225693256942569525696256972569825699257002570125702257032570425705257062570725708257092571025711257122571325714257152571625717257182571925720257212572225723257242572525726257272572825729257302573125732257332573425735257362573725738257392574025741257422574325744257452574625747257482574925750257512575225753257542575525756257572575825759257602576125762257632576425765257662576725768257692577025771257722577325774257752577625777257782577925780257812578225783257842578525786257872578825789257902579125792257932579425795257962579725798257992580025801258022580325804258052580625807258082580925810258112581225813258142581525816258172581825819258202582125822258232582425825258262582725828258292583025831258322583325834258352583625837258382583925840258412584225843258442584525846258472584825849258502585125852258532585425855258562585725858258592586025861258622586325864258652586625867258682586925870258712587225873258742587525876258772587825879258802588125882258832588425885258862588725888258892589025891258922589325894258952589625897258982589925900259012590225903259042590525906259072590825909259102591125912259132591425915259162591725918259192592025921259222592325924259252592625927259282592925930259312593225933259342593525936259372593825939259402594125942259432594425945259462594725948259492595025951259522595325954259552595625957259582595925960259612596225963259642596525966259672596825969259702597125972259732597425975259762597725978259792598025981259822598325984259852598625987259882598925990259912599225993259942599525996259972599825999260002600126002260032600426005260062600726008260092601026011260122601326014260152601626017260182601926020260212602226023260242602526026260272602826029260302603126032260332603426035260362603726038260392604026041260422604326044260452604626047260482604926050260512605226053260542605526056260572605826059260602606126062260632606426065260662606726068260692607026071260722607326074260752607626077260782607926080260812608226083260842608526086260872608826089260902609126092260932609426095260962609726098260992610026101261022610326104261052610626107261082610926110261112611226113261142611526116261172611826119261202612126122261232612426125261262612726128261292613026131261322613326134261352613626137261382613926140261412614226143261442614526146261472614826149261502615126152261532615426155261562615726158261592616026161261622616326164261652616626167261682616926170261712617226173261742617526176261772617826179261802618126182261832618426185261862618726188261892619026191261922619326194261952619626197261982619926200262012620226203262042620526206262072620826209262102621126212262132621426215262162621726218262192622026221262222622326224262252622626227262282622926230262312623226233262342623526236262372623826239262402624126242262432624426245262462624726248262492625026251262522625326254262552625626257262582625926260262612626226263262642626526266262672626826269262702627126272262732627426275262762627726278262792628026281262822628326284262852628626287262882628926290262912629226293262942629526296262972629826299263002630126302263032630426305263062630726308263092631026311263122631326314263152631626317263182631926320263212632226323263242632526326263272632826329263302633126332263332633426335263362633726338263392634026341263422634326344263452634626347263482634926350263512635226353263542635526356263572635826359263602636126362263632636426365263662636726368263692637026371263722637326374263752637626377263782637926380263812638226383263842638526386263872638826389263902639126392263932639426395263962639726398263992640026401264022640326404264052640626407264082640926410264112641226413264142641526416264172641826419264202642126422264232642426425264262642726428264292643026431264322643326434264352643626437264382643926440264412644226443264442644526446264472644826449264502645126452264532645426455264562645726458264592646026461264622646326464264652646626467264682646926470264712647226473264742647526476264772647826479264802648126482264832648426485264862648726488264892649026491264922649326494264952649626497264982649926500265012650226503265042650526506265072650826509265102651126512265132651426515265162651726518265192652026521265222652326524265252652626527265282652926530265312653226533265342653526536265372653826539265402654126542265432654426545265462654726548265492655026551265522655326554265552655626557265582655926560265612656226563265642656526566265672656826569265702657126572265732657426575265762657726578265792658026581265822658326584265852658626587265882658926590265912659226593265942659526596265972659826599266002660126602266032660426605266062660726608266092661026611266122661326614266152661626617266182661926620266212662226623266242662526626266272662826629266302663126632266332663426635266362663726638266392664026641266422664326644266452664626647266482664926650266512665226653266542665526656266572665826659266602666126662266632666426665266662666726668266692667026671266722667326674266752667626677266782667926680266812668226683266842668526686266872668826689266902669126692266932669426695266962669726698266992670026701267022670326704267052670626707267082670926710267112671226713267142671526716267172671826719267202672126722267232672426725267262672726728267292673026731267322673326734267352673626737267382673926740267412674226743267442674526746267472674826749267502675126752267532675426755267562675726758267592676026761267622676326764267652676626767267682676926770267712677226773267742677526776267772677826779267802678126782267832678426785267862678726788267892679026791267922679326794267952679626797267982679926800268012680226803268042680526806268072680826809268102681126812268132681426815268162681726818268192682026821268222682326824268252682626827268282682926830268312683226833268342683526836268372683826839268402684126842268432684426845268462684726848268492685026851268522685326854268552685626857268582685926860268612686226863268642686526866268672686826869268702687126872268732687426875268762687726878268792688026881268822688326884268852688626887268882688926890268912689226893268942689526896268972689826899269002690126902269032690426905269062690726908269092691026911269122691326914269152691626917269182691926920269212692226923269242692526926269272692826929269302693126932269332693426935269362693726938269392694026941269422694326944269452694626947269482694926950269512695226953269542695526956269572695826959269602696126962269632696426965269662696726968269692697026971269722697326974269752697626977269782697926980269812698226983269842698526986269872698826989269902699126992269932699426995269962699726998269992700027001270022700327004270052700627007270082700927010270112701227013270142701527016270172701827019270202702127022270232702427025270262702727028270292703027031270322703327034270352703627037270382703927040270412704227043270442704527046270472704827049270502705127052270532705427055270562705727058270592706027061270622706327064270652706627067270682706927070270712707227073270742707527076270772707827079270802708127082270832708427085270862708727088270892709027091270922709327094270952709627097270982709927100271012710227103271042710527106271072710827109271102711127112271132711427115271162711727118271192712027121271222712327124271252712627127271282712927130271312713227133271342713527136271372713827139271402714127142271432714427145271462714727148271492715027151271522715327154271552715627157271582715927160271612716227163271642716527166271672716827169271702717127172271732717427175271762717727178271792718027181271822718327184271852718627187271882718927190271912719227193271942719527196271972719827199272002720127202272032720427205272062720727208272092721027211272122721327214272152721627217272182721927220272212722227223272242722527226272272722827229272302723127232272332723427235272362723727238272392724027241272422724327244272452724627247272482724927250272512725227253272542725527256272572725827259272602726127262272632726427265272662726727268272692727027271272722727327274272752727627277272782727927280272812728227283272842728527286272872728827289272902729127292272932729427295272962729727298272992730027301273022730327304273052730627307273082730927310273112731227313273142731527316273172731827319273202732127322273232732427325273262732727328273292733027331273322733327334273352733627337273382733927340273412734227343273442734527346273472734827349273502735127352273532735427355273562735727358273592736027361273622736327364273652736627367273682736927370273712737227373273742737527376273772737827379273802738127382273832738427385273862738727388273892739027391273922739327394273952739627397273982739927400274012740227403274042740527406274072740827409274102741127412274132741427415274162741727418274192742027421274222742327424274252742627427274282742927430274312743227433274342743527436274372743827439274402744127442274432744427445274462744727448274492745027451274522745327454274552745627457274582745927460274612746227463274642746527466274672746827469274702747127472274732747427475274762747727478274792748027481274822748327484274852748627487274882748927490274912749227493274942749527496274972749827499275002750127502275032750427505275062750727508275092751027511275122751327514275152751627517275182751927520275212752227523275242752527526275272752827529275302753127532275332753427535275362753727538275392754027541275422754327544275452754627547275482754927550275512755227553275542755527556275572755827559275602756127562275632756427565275662756727568275692757027571275722757327574275752757627577275782757927580275812758227583275842758527586275872758827589275902759127592275932759427595275962759727598275992760027601276022760327604276052760627607276082760927610276112761227613276142761527616276172761827619276202762127622276232762427625276262762727628276292763027631276322763327634276352763627637276382763927640276412764227643276442764527646276472764827649276502765127652276532765427655276562765727658276592766027661276622766327664276652766627667276682766927670276712767227673276742767527676276772767827679276802768127682276832768427685276862768727688276892769027691276922769327694276952769627697276982769927700277012770227703277042770527706277072770827709277102771127712277132771427715277162771727718277192772027721277222772327724277252772627727277282772927730277312773227733277342773527736277372773827739277402774127742277432774427745277462774727748277492775027751277522775327754277552775627757277582775927760277612776227763277642776527766277672776827769277702777127772277732777427775277762777727778277792778027781277822778327784277852778627787277882778927790277912779227793277942779527796277972779827799278002780127802278032780427805278062780727808278092781027811278122781327814278152781627817278182781927820278212782227823278242782527826278272782827829278302783127832278332783427835278362783727838278392784027841278422784327844278452784627847278482784927850278512785227853278542785527856278572785827859278602786127862278632786427865278662786727868278692787027871278722787327874278752787627877278782787927880278812788227883278842788527886278872788827889278902789127892278932789427895278962789727898278992790027901279022790327904279052790627907279082790927910279112791227913279142791527916279172791827919279202792127922279232792427925279262792727928279292793027931279322793327934279352793627937279382793927940279412794227943279442794527946279472794827949279502795127952279532795427955279562795727958279592796027961279622796327964279652796627967279682796927970279712797227973279742797527976279772797827979279802798127982279832798427985279862798727988279892799027991279922799327994279952799627997279982799928000280012800228003280042800528006280072800828009280102801128012280132801428015280162801728018280192802028021280222802328024280252802628027280282802928030280312803228033280342803528036280372803828039280402804128042280432804428045280462804728048280492805028051280522805328054280552805628057280582805928060280612806228063280642806528066280672806828069280702807128072280732807428075280762807728078280792808028081280822808328084280852808628087280882808928090280912809228093280942809528096280972809828099281002810128102281032810428105281062810728108281092811028111281122811328114281152811628117281182811928120281212812228123281242812528126281272812828129281302813128132281332813428135281362813728138281392814028141281422814328144281452814628147281482814928150281512815228153281542815528156281572815828159281602816128162281632816428165281662816728168281692817028171281722817328174281752817628177281782817928180281812818228183281842818528186281872818828189281902819128192281932819428195281962819728198281992820028201282022820328204282052820628207282082820928210282112821228213282142821528216282172821828219282202822128222282232822428225282262822728228282292823028231282322823328234282352823628237282382823928240282412824228243282442824528246282472824828249282502825128252282532825428255282562825728258282592826028261282622826328264282652826628267282682826928270282712827228273282742827528276282772827828279282802828128282282832828428285282862828728288282892829028291282922829328294282952829628297282982829928300283012830228303283042830528306283072830828309283102831128312283132831428315283162831728318283192832028321283222832328324283252832628327283282832928330283312833228333283342833528336283372833828339283402834128342283432834428345283462834728348283492835028351283522835328354283552835628357283582835928360283612836228363283642836528366283672836828369283702837128372283732837428375283762837728378283792838028381283822838328384283852838628387283882838928390283912839228393283942839528396283972839828399284002840128402284032840428405284062840728408284092841028411284122841328414284152841628417284182841928420284212842228423284242842528426284272842828429284302843128432284332843428435284362843728438284392844028441284422844328444284452844628447284482844928450284512845228453284542845528456284572845828459284602846128462284632846428465284662846728468284692847028471284722847328474284752847628477284782847928480284812848228483284842848528486284872848828489284902849128492284932849428495284962849728498284992850028501285022850328504285052850628507285082850928510285112851228513285142851528516285172851828519285202852128522285232852428525285262852728528285292853028531285322853328534285352853628537285382853928540285412854228543285442854528546285472854828549285502855128552285532855428555285562855728558285592856028561285622856328564285652856628567285682856928570285712857228573285742857528576285772857828579285802858128582285832858428585285862858728588285892859028591285922859328594285952859628597285982859928600286012860228603286042860528606286072860828609286102861128612286132861428615286162861728618286192862028621286222862328624286252862628627286282862928630286312863228633286342863528636286372863828639286402864128642286432864428645286462864728648286492865028651286522865328654286552865628657286582865928660286612866228663286642866528666286672866828669286702867128672286732867428675286762867728678286792868028681286822868328684286852868628687286882868928690286912869228693286942869528696286972869828699287002870128702287032870428705287062870728708287092871028711287122871328714287152871628717287182871928720287212872228723287242872528726287272872828729287302873128732287332873428735287362873728738287392874028741287422874328744287452874628747287482874928750287512875228753287542875528756287572875828759287602876128762287632876428765287662876728768287692877028771287722877328774287752877628777287782877928780287812878228783287842878528786287872878828789287902879128792287932879428795287962879728798287992880028801288022880328804288052880628807288082880928810288112881228813288142881528816288172881828819288202882128822288232882428825288262882728828288292883028831288322883328834288352883628837288382883928840288412884228843288442884528846288472884828849288502885128852288532885428855288562885728858288592886028861288622886328864288652886628867288682886928870288712887228873288742887528876288772887828879288802888128882288832888428885288862888728888288892889028891288922889328894288952889628897288982889928900289012890228903289042890528906289072890828909289102891128912289132891428915289162891728918289192892028921289222892328924289252892628927289282892928930289312893228933289342893528936289372893828939289402894128942289432894428945289462894728948289492895028951289522895328954289552895628957289582895928960289612896228963289642896528966289672896828969289702897128972289732897428975289762897728978289792898028981289822898328984289852898628987289882898928990289912899228993289942899528996289972899828999290002900129002290032900429005290062900729008290092901029011290122901329014290152901629017290182901929020290212902229023290242902529026290272902829029290302903129032290332903429035290362903729038290392904029041290422904329044290452904629047290482904929050290512905229053290542905529056290572905829059290602906129062290632906429065290662906729068290692907029071290722907329074290752907629077290782907929080290812908229083290842908529086290872908829089290902909129092290932909429095290962909729098290992910029101291022910329104291052910629107291082910929110291112911229113291142911529116291172911829119291202912129122291232912429125291262912729128291292913029131291322913329134291352913629137291382913929140291412914229143291442914529146291472914829149291502915129152291532915429155291562915729158291592916029161291622916329164291652916629167291682916929170291712917229173291742917529176291772917829179291802918129182291832918429185291862918729188291892919029191291922919329194291952919629197291982919929200292012920229203292042920529206292072920829209292102921129212292132921429215292162921729218292192922029221292222922329224292252922629227292282922929230292312923229233292342923529236292372923829239292402924129242292432924429245292462924729248292492925029251292522925329254292552925629257292582925929260292612926229263292642926529266292672926829269292702927129272292732927429275292762927729278292792928029281292822928329284292852928629287292882928929290292912929229293292942929529296292972929829299293002930129302293032930429305293062930729308293092931029311293122931329314293152931629317293182931929320293212932229323293242932529326293272932829329293302933129332293332933429335293362933729338293392934029341293422934329344293452934629347293482934929350293512935229353293542935529356293572935829359293602936129362293632936429365293662936729368293692937029371293722937329374293752937629377293782937929380293812938229383293842938529386293872938829389293902939129392293932939429395293962939729398293992940029401294022940329404294052940629407294082940929410294112941229413294142941529416294172941829419294202942129422294232942429425294262942729428294292943029431294322943329434294352943629437294382943929440294412944229443294442944529446294472944829449294502945129452294532945429455294562945729458294592946029461294622946329464294652946629467294682946929470294712947229473294742947529476294772947829479294802948129482294832948429485294862948729488294892949029491294922949329494294952949629497294982949929500295012950229503295042950529506295072950829509295102951129512295132951429515295162951729518295192952029521295222952329524295252952629527295282952929530295312953229533295342953529536295372953829539295402954129542295432954429545295462954729548295492955029551295522955329554295552955629557295582955929560295612956229563295642956529566295672956829569295702957129572295732957429575295762957729578295792958029581295822958329584295852958629587295882958929590295912959229593295942959529596295972959829599296002960129602296032960429605296062960729608296092961029611296122961329614296152961629617296182961929620296212962229623296242962529626296272962829629296302963129632296332963429635296362963729638296392964029641296422964329644296452964629647296482964929650296512965229653296542965529656296572965829659296602966129662296632966429665296662966729668296692967029671296722967329674296752967629677296782967929680296812968229683296842968529686296872968829689296902969129692296932969429695296962969729698296992970029701297022970329704297052970629707297082970929710297112971229713297142971529716297172971829719297202972129722297232972429725297262972729728297292973029731297322973329734297352973629737297382973929740297412974229743297442974529746297472974829749297502975129752297532975429755297562975729758297592976029761297622976329764297652976629767297682976929770297712977229773297742977529776297772977829779297802978129782297832978429785297862978729788297892979029791297922979329794297952979629797297982979929800298012980229803298042980529806298072980829809298102981129812298132981429815298162981729818298192982029821298222982329824298252982629827298282982929830298312983229833298342983529836298372983829839298402984129842298432984429845298462984729848298492985029851298522985329854298552985629857298582985929860298612986229863298642986529866298672986829869298702987129872298732987429875298762987729878298792988029881298822988329884298852988629887298882988929890298912989229893298942989529896298972989829899299002990129902299032990429905299062990729908299092991029911299122991329914299152991629917299182991929920299212992229923299242992529926299272992829929299302993129932299332993429935299362993729938299392994029941299422994329944299452994629947299482994929950299512995229953299542995529956299572995829959299602996129962299632996429965299662996729968299692997029971299722997329974299752997629977299782997929980299812998229983299842998529986299872998829989299902999129992299932999429995299962999729998299993000030001300023000330004300053000630007300083000930010300113001230013300143001530016300173001830019300203002130022300233002430025300263002730028300293003030031300323003330034300353003630037300383003930040300413004230043300443004530046300473004830049300503005130052300533005430055300563005730058300593006030061300623006330064300653006630067300683006930070300713007230073300743007530076300773007830079300803008130082300833008430085300863008730088300893009030091300923009330094300953009630097300983009930100301013010230103301043010530106301073010830109301103011130112301133011430115301163011730118301193012030121301223012330124301253012630127301283012930130301313013230133301343013530136301373013830139301403014130142301433014430145301463014730148301493015030151301523015330154301553015630157301583015930160301613016230163301643016530166301673016830169301703017130172301733017430175301763017730178301793018030181301823018330184301853018630187301883018930190301913019230193301943019530196301973019830199302003020130202302033020430205302063020730208302093021030211302123021330214302153021630217302183021930220302213022230223302243022530226302273022830229302303023130232302333023430235302363023730238302393024030241302423024330244302453024630247302483024930250302513025230253302543025530256302573025830259302603026130262302633026430265302663026730268302693027030271302723027330274302753027630277302783027930280302813028230283302843028530286302873028830289302903029130292302933029430295302963029730298302993030030301303023030330304303053030630307303083030930310303113031230313303143031530316303173031830319303203032130322303233032430325303263032730328303293033030331303323033330334303353033630337303383033930340303413034230343303443034530346303473034830349303503035130352303533035430355303563035730358303593036030361303623036330364303653036630367303683036930370303713037230373303743037530376303773037830379303803038130382303833038430385303863038730388303893039030391303923039330394303953039630397303983039930400304013040230403304043040530406304073040830409304103041130412304133041430415304163041730418304193042030421304223042330424304253042630427304283042930430304313043230433304343043530436304373043830439304403044130442304433044430445304463044730448304493045030451304523045330454304553045630457304583045930460304613046230463304643046530466304673046830469304703047130472304733047430475304763047730478304793048030481304823048330484304853048630487304883048930490304913049230493304943049530496304973049830499305003050130502305033050430505305063050730508305093051030511305123051330514305153051630517305183051930520305213052230523305243052530526305273052830529305303053130532305333053430535305363053730538305393054030541305423054330544305453054630547305483054930550305513055230553305543055530556305573055830559305603056130562305633056430565305663056730568305693057030571305723057330574305753057630577305783057930580305813058230583305843058530586305873058830589305903059130592305933059430595305963059730598305993060030601306023060330604306053060630607306083060930610306113061230613306143061530616306173061830619306203062130622306233062430625306263062730628306293063030631306323063330634306353063630637306383063930640306413064230643306443064530646306473064830649306503065130652306533065430655306563065730658306593066030661306623066330664306653066630667306683066930670306713067230673306743067530676306773067830679306803068130682306833068430685306863068730688306893069030691306923069330694306953069630697306983069930700307013070230703307043070530706307073070830709307103071130712307133071430715307163071730718307193072030721307223072330724307253072630727307283072930730307313073230733307343073530736307373073830739307403074130742307433074430745307463074730748307493075030751307523075330754307553075630757307583075930760307613076230763307643076530766307673076830769307703077130772307733077430775307763077730778307793078030781307823078330784307853078630787307883078930790307913079230793307943079530796307973079830799308003080130802308033080430805308063080730808308093081030811308123081330814308153081630817308183081930820308213082230823308243082530826308273082830829308303083130832308333083430835308363083730838308393084030841308423084330844308453084630847308483084930850308513085230853308543085530856308573085830859308603086130862308633086430865308663086730868308693087030871308723087330874308753087630877308783087930880308813088230883308843088530886308873088830889308903089130892308933089430895308963089730898308993090030901309023090330904309053090630907309083090930910309113091230913309143091530916309173091830919309203092130922309233092430925309263092730928309293093030931309323093330934309353093630937309383093930940309413094230943309443094530946309473094830949309503095130952309533095430955309563095730958309593096030961309623096330964309653096630967309683096930970309713097230973309743097530976309773097830979309803098130982309833098430985309863098730988309893099030991309923099330994309953099630997309983099931000310013100231003310043100531006310073100831009310103101131012310133101431015310163101731018310193102031021310223102331024310253102631027310283102931030310313103231033310343103531036310373103831039310403104131042310433104431045310463104731048310493105031051310523105331054310553105631057310583105931060310613106231063310643106531066310673106831069310703107131072310733107431075310763107731078310793108031081310823108331084310853108631087310883108931090310913109231093310943109531096310973109831099311003110131102311033110431105311063110731108311093111031111311123111331114311153111631117311183111931120311213112231123311243112531126311273112831129311303113131132311333113431135311363113731138311393114031141311423114331144311453114631147311483114931150311513115231153311543115531156311573115831159311603116131162311633116431165311663116731168311693117031171311723117331174311753117631177311783117931180311813118231183311843118531186311873118831189311903119131192311933119431195311963119731198311993120031201312023120331204312053120631207312083120931210312113121231213312143121531216312173121831219312203122131222312233122431225312263122731228312293123031231312323123331234312353123631237312383123931240312413124231243312443124531246312473124831249312503125131252312533125431255312563125731258312593126031261312623126331264312653126631267312683126931270312713127231273312743127531276312773127831279312803128131282312833128431285312863128731288312893129031291312923129331294312953129631297312983129931300313013130231303313043130531306313073130831309313103131131312313133131431315313163131731318313193132031321313223132331324313253132631327313283132931330313313133231333313343133531336313373133831339313403134131342313433134431345313463134731348313493135031351313523135331354313553135631357313583135931360313613136231363313643136531366313673136831369313703137131372313733137431375313763137731378313793138031381313823138331384313853138631387313883138931390313913139231393313943139531396313973139831399314003140131402314033140431405314063140731408314093141031411314123141331414314153141631417314183141931420314213142231423314243142531426314273142831429314303143131432314333143431435314363143731438314393144031441314423144331444314453144631447314483144931450314513145231453314543145531456314573145831459314603146131462314633146431465314663146731468314693147031471314723147331474314753147631477314783147931480314813148231483314843148531486314873148831489314903149131492314933149431495314963149731498314993150031501315023150331504315053150631507315083150931510315113151231513315143151531516315173151831519315203152131522315233152431525315263152731528315293153031531315323153331534315353153631537315383153931540315413154231543315443154531546315473154831549315503155131552315533155431555315563155731558315593156031561315623156331564315653156631567315683156931570315713157231573315743157531576315773157831579315803158131582315833158431585315863158731588315893159031591315923159331594315953159631597315983159931600316013160231603316043160531606316073160831609316103161131612316133161431615316163161731618316193162031621316223162331624316253162631627316283162931630316313163231633316343163531636316373163831639316403164131642316433164431645316463164731648316493165031651316523165331654316553165631657316583165931660316613166231663316643166531666316673166831669316703167131672316733167431675316763167731678316793168031681316823168331684316853168631687316883168931690316913169231693316943169531696316973169831699317003170131702317033170431705317063170731708317093171031711317123171331714317153171631717317183171931720317213172231723317243172531726317273172831729317303173131732317333173431735317363173731738317393174031741317423174331744317453174631747317483174931750317513175231753317543175531756317573175831759317603176131762317633176431765317663176731768317693177031771317723177331774317753177631777317783177931780317813178231783317843178531786317873178831789317903179131792317933179431795317963179731798317993180031801318023180331804318053180631807318083180931810318113181231813318143181531816318173181831819318203182131822318233182431825318263182731828318293183031831318323183331834318353183631837318383183931840318413184231843318443184531846318473184831849318503185131852318533185431855318563185731858318593186031861318623186331864318653186631867318683186931870318713187231873318743187531876318773187831879318803188131882318833188431885318863188731888318893189031891318923189331894318953189631897318983189931900319013190231903319043190531906319073190831909319103191131912319133191431915319163191731918319193192031921319223192331924319253192631927319283192931930319313193231933319343193531936319373193831939319403194131942319433194431945319463194731948319493195031951319523195331954319553195631957319583195931960319613196231963319643196531966319673196831969319703197131972319733197431975319763197731978319793198031981319823198331984319853198631987319883198931990319913199231993319943199531996319973199831999320003200132002320033200432005320063200732008320093201032011320123201332014320153201632017320183201932020320213202232023320243202532026320273202832029320303203132032320333203432035320363203732038320393204032041320423204332044320453204632047320483204932050320513205232053320543205532056320573205832059320603206132062320633206432065320663206732068320693207032071320723207332074320753207632077320783207932080320813208232083320843208532086320873208832089320903209132092320933209432095320963209732098320993210032101321023210332104321053210632107321083210932110321113211232113321143211532116321173211832119321203212132122321233212432125321263212732128321293213032131321323213332134321353213632137321383213932140321413214232143321443214532146321473214832149321503215132152321533215432155321563215732158321593216032161321623216332164321653216632167321683216932170321713217232173321743217532176321773217832179321803218132182321833218432185321863218732188321893219032191321923219332194321953219632197321983219932200322013220232203322043220532206322073220832209322103221132212322133221432215322163221732218322193222032221322223222332224322253222632227322283222932230322313223232233322343223532236322373223832239322403224132242322433224432245322463224732248322493225032251322523225332254322553225632257322583225932260322613226232263322643226532266322673226832269322703227132272322733227432275322763227732278322793228032281322823228332284322853228632287322883228932290322913229232293322943229532296322973229832299323003230132302323033230432305323063230732308323093231032311323123231332314323153231632317323183231932320323213232232323323243232532326323273232832329323303233132332323333233432335323363233732338323393234032341323423234332344323453234632347323483234932350323513235232353323543235532356323573235832359323603236132362323633236432365323663236732368323693237032371323723237332374323753237632377323783237932380323813238232383323843238532386323873238832389323903239132392323933239432395323963239732398323993240032401324023240332404324053240632407324083240932410324113241232413324143241532416324173241832419324203242132422324233242432425324263242732428324293243032431324323243332434324353243632437324383243932440324413244232443324443244532446324473244832449324503245132452324533245432455324563245732458324593246032461324623246332464324653246632467324683246932470324713247232473324743247532476324773247832479324803248132482324833248432485324863248732488324893249032491324923249332494324953249632497324983249932500325013250232503325043250532506325073250832509325103251132512325133251432515325163251732518325193252032521325223252332524325253252632527325283252932530325313253232533325343253532536325373253832539325403254132542325433254432545325463254732548325493255032551325523255332554325553255632557325583255932560325613256232563325643256532566325673256832569325703257132572325733257432575325763257732578325793258032581325823258332584325853258632587325883258932590325913259232593325943259532596325973259832599326003260132602326033260432605326063260732608326093261032611326123261332614326153261632617326183261932620326213262232623326243262532626326273262832629326303263132632326333263432635326363263732638326393264032641326423264332644326453264632647326483264932650326513265232653326543265532656326573265832659326603266132662326633266432665326663266732668326693267032671326723267332674326753267632677326783267932680326813268232683326843268532686326873268832689326903269132692326933269432695326963269732698326993270032701327023270332704327053270632707327083270932710327113271232713327143271532716327173271832719327203272132722327233272432725327263272732728327293273032731327323273332734327353273632737327383273932740327413274232743327443274532746327473274832749327503275132752327533275432755327563275732758327593276032761327623276332764327653276632767327683276932770327713277232773327743277532776327773277832779327803278132782327833278432785327863278732788327893279032791327923279332794327953279632797327983279932800328013280232803328043280532806328073280832809328103281132812328133281432815328163281732818328193282032821328223282332824328253282632827328283282932830328313283232833328343283532836328373283832839328403284132842328433284432845328463284732848328493285032851328523285332854328553285632857328583285932860328613286232863328643286532866328673286832869328703287132872328733287432875328763287732878328793288032881328823288332884328853288632887328883288932890328913289232893328943289532896328973289832899329003290132902329033290432905329063290732908329093291032911329123291332914329153291632917329183291932920329213292232923329243292532926329273292832929329303293132932329333293432935329363293732938329393294032941329423294332944329453294632947329483294932950329513295232953329543295532956329573295832959329603296132962329633296432965329663296732968329693297032971329723297332974329753297632977329783297932980329813298232983329843298532986329873298832989329903299132992329933299432995329963299732998329993300033001330023300333004330053300633007330083300933010330113301233013330143301533016330173301833019330203302133022330233302433025330263302733028330293303033031330323303333034330353303633037330383303933040330413304233043330443304533046330473304833049330503305133052330533305433055330563305733058330593306033061330623306333064330653306633067330683306933070330713307233073330743307533076330773307833079330803308133082330833308433085330863308733088330893309033091330923309333094330953309633097330983309933100331013310233103331043310533106331073310833109331103311133112331133311433115331163311733118331193312033121331223312333124331253312633127331283312933130331313313233133331343313533136331373313833139331403314133142331433314433145331463314733148331493315033151331523315333154331553315633157331583315933160331613316233163331643316533166331673316833169331703317133172331733317433175331763317733178331793318033181331823318333184331853318633187331883318933190331913319233193331943319533196331973319833199332003320133202332033320433205332063320733208332093321033211332123321333214332153321633217332183321933220332213322233223332243322533226332273322833229332303323133232332333323433235332363323733238332393324033241332423324333244332453324633247332483324933250332513325233253332543325533256332573325833259332603326133262332633326433265332663326733268332693327033271332723327333274332753327633277332783327933280332813328233283332843328533286332873328833289332903329133292332933329433295332963329733298332993330033301333023330333304333053330633307333083330933310333113331233313333143331533316333173331833319333203332133322333233332433325333263332733328333293333033331333323333333334333353333633337333383333933340333413334233343333443334533346333473334833349333503335133352333533335433355333563335733358333593336033361333623336333364333653336633367333683336933370333713337233373333743337533376333773337833379333803338133382333833338433385333863338733388333893339033391333923339333394333953339633397333983339933400334013340233403334043340533406334073340833409334103341133412334133341433415334163341733418334193342033421334223342333424334253342633427334283342933430334313343233433334343343533436334373343833439334403344133442334433344433445334463344733448334493345033451334523345333454334553345633457334583345933460334613346233463334643346533466334673346833469334703347133472334733347433475334763347733478334793348033481334823348333484334853348633487334883348933490334913349233493334943349533496334973349833499335003350133502335033350433505335063350733508335093351033511335123351333514335153351633517335183351933520335213352233523335243352533526335273352833529335303353133532335333353433535335363353733538335393354033541335423354333544335453354633547335483354933550335513355233553335543355533556335573355833559335603356133562335633356433565335663356733568335693357033571335723357333574335753357633577335783357933580335813358233583335843358533586335873358833589335903359133592335933359433595335963359733598335993360033601336023360333604336053360633607336083360933610336113361233613336143361533616336173361833619336203362133622336233362433625336263362733628336293363033631336323363333634336353363633637336383363933640336413364233643336443364533646336473364833649336503365133652336533365433655336563365733658336593366033661336623366333664336653366633667336683366933670336713367233673336743367533676336773367833679336803368133682336833368433685336863368733688336893369033691336923369333694336953369633697336983369933700337013370233703337043370533706337073370833709337103371133712337133371433715337163371733718337193372033721337223372333724337253372633727337283372933730337313373233733337343373533736337373373833739337403374133742337433374433745337463374733748337493375033751337523375333754337553375633757337583375933760337613376233763337643376533766337673376833769337703377133772337733377433775337763377733778337793378033781337823378333784337853378633787337883378933790337913379233793337943379533796337973379833799338003380133802338033380433805338063380733808338093381033811338123381333814338153381633817338183381933820338213382233823338243382533826338273382833829338303383133832338333383433835338363383733838338393384033841338423384333844338453384633847338483384933850338513385233853338543385533856338573385833859338603386133862338633386433865338663386733868338693387033871338723387333874338753387633877338783387933880338813388233883338843388533886338873388833889338903389133892338933389433895338963389733898338993390033901339023390333904339053390633907339083390933910339113391233913339143391533916339173391833919339203392133922339233392433925339263392733928339293393033931339323393333934339353393633937339383393933940339413394233943339443394533946339473394833949339503395133952339533395433955339563395733958339593396033961339623396333964339653396633967339683396933970339713397233973339743397533976339773397833979339803398133982339833398433985339863398733988339893399033991339923399333994339953399633997339983399934000340013400234003340043400534006340073400834009340103401134012340133401434015340163401734018340193402034021340223402334024340253402634027340283402934030340313403234033340343403534036340373403834039340403404134042340433404434045340463404734048340493405034051340523405334054340553405634057340583405934060340613406234063340643406534066340673406834069340703407134072340733407434075340763407734078340793408034081340823408334084340853408634087340883408934090340913409234093340943409534096340973409834099341003410134102341033410434105341063410734108341093411034111341123411334114341153411634117341183411934120341213412234123341243412534126341273412834129341303413134132341333413434135341363413734138341393414034141341423414334144341453414634147341483414934150341513415234153341543415534156341573415834159341603416134162341633416434165341663416734168341693417034171341723417334174341753417634177341783417934180341813418234183341843418534186341873418834189341903419134192341933419434195341963419734198341993420034201342023420334204342053420634207342083420934210342113421234213342143421534216342173421834219342203422134222342233422434225342263422734228342293423034231342323423334234342353423634237342383423934240342413424234243342443424534246342473424834249342503425134252342533425434255342563425734258342593426034261342623426334264342653426634267342683426934270342713427234273342743427534276342773427834279342803428134282342833428434285342863428734288342893429034291342923429334294342953429634297342983429934300343013430234303343043430534306343073430834309343103431134312343133431434315343163431734318343193432034321343223432334324343253432634327343283432934330343313433234333343343433534336343373433834339343403434134342343433434434345343463434734348343493435034351343523435334354343553435634357343583435934360343613436234363343643436534366343673436834369343703437134372343733437434375343763437734378343793438034381343823438334384343853438634387343883438934390343913439234393343943439534396343973439834399344003440134402344033440434405344063440734408344093441034411344123441334414344153441634417344183441934420344213442234423344243442534426344273442834429344303443134432344333443434435344363443734438344393444034441344423444334444344453444634447344483444934450344513445234453344543445534456344573445834459344603446134462344633446434465344663446734468344693447034471344723447334474344753447634477344783447934480344813448234483344843448534486344873448834489344903449134492344933449434495344963449734498344993450034501345023450334504345053450634507345083450934510345113451234513345143451534516345173451834519345203452134522345233452434525345263452734528345293453034531345323453334534345353453634537345383453934540345413454234543345443454534546345473454834549345503455134552345533455434555345563455734558345593456034561345623456334564345653456634567345683456934570345713457234573345743457534576345773457834579345803458134582345833458434585345863458734588345893459034591345923459334594345953459634597345983459934600346013460234603346043460534606346073460834609346103461134612346133461434615346163461734618346193462034621346223462334624346253462634627346283462934630346313463234633346343463534636346373463834639346403464134642346433464434645346463464734648346493465034651346523465334654346553465634657346583465934660346613466234663346643466534666346673466834669346703467134672346733467434675346763467734678346793468034681346823468334684346853468634687346883468934690346913469234693346943469534696346973469834699347003470134702347033470434705347063470734708347093471034711347123471334714347153471634717347183471934720347213472234723347243472534726347273472834729347303473134732347333473434735347363473734738347393474034741347423474334744347453474634747347483474934750347513475234753347543475534756347573475834759347603476134762347633476434765347663476734768347693477034771347723477334774347753477634777347783477934780347813478234783347843478534786347873478834789347903479134792347933479434795347963479734798347993480034801348023480334804348053480634807348083480934810348113481234813348143481534816348173481834819348203482134822348233482434825348263482734828348293483034831348323483334834348353483634837348383483934840348413484234843348443484534846348473484834849348503485134852348533485434855348563485734858348593486034861348623486334864348653486634867348683486934870348713487234873348743487534876348773487834879348803488134882348833488434885348863488734888348893489034891348923489334894348953489634897348983489934900349013490234903349043490534906349073490834909349103491134912349133491434915349163491734918349193492034921349223492334924349253492634927349283492934930349313493234933349343493534936349373493834939349403494134942349433494434945349463494734948349493495034951349523495334954349553495634957349583495934960349613496234963349643496534966349673496834969349703497134972349733497434975349763497734978349793498034981349823498334984349853498634987349883498934990349913499234993349943499534996349973499834999350003500135002350033500435005350063500735008350093501035011350123501335014350153501635017350183501935020350213502235023350243502535026350273502835029350303503135032350333503435035350363503735038350393504035041350423504335044350453504635047350483504935050350513505235053350543505535056350573505835059350603506135062350633506435065350663506735068350693507035071350723507335074350753507635077350783507935080350813508235083350843508535086350873508835089350903509135092350933509435095350963509735098350993510035101351023510335104351053510635107351083510935110351113511235113351143511535116351173511835119351203512135122351233512435125351263512735128351293513035131351323513335134351353513635137351383513935140351413514235143351443514535146351473514835149351503515135152351533515435155351563515735158351593516035161351623516335164351653516635167351683516935170351713517235173351743517535176351773517835179351803518135182351833518435185351863518735188351893519035191351923519335194351953519635197351983519935200352013520235203352043520535206352073520835209352103521135212352133521435215352163521735218352193522035221352223522335224352253522635227352283522935230352313523235233352343523535236352373523835239352403524135242352433524435245352463524735248352493525035251352523525335254352553525635257352583525935260352613526235263352643526535266352673526835269352703527135272352733527435275352763527735278352793528035281352823528335284352853528635287352883528935290352913529235293352943529535296352973529835299353003530135302353033530435305353063530735308353093531035311353123531335314353153531635317353183531935320353213532235323353243532535326353273532835329353303533135332353333533435335353363533735338353393534035341353423534335344353453534635347353483534935350353513535235353353543535535356353573535835359353603536135362353633536435365353663536735368353693537035371353723537335374353753537635377353783537935380353813538235383353843538535386353873538835389353903539135392353933539435395353963539735398353993540035401354023540335404354053540635407354083540935410354113541235413354143541535416354173541835419354203542135422354233542435425354263542735428354293543035431354323543335434354353543635437354383543935440354413544235443354443544535446354473544835449354503545135452354533545435455354563545735458354593546035461354623546335464354653546635467354683546935470354713547235473354743547535476354773547835479354803548135482354833548435485354863548735488354893549035491354923549335494354953549635497354983549935500355013550235503355043550535506355073550835509355103551135512355133551435515355163551735518355193552035521355223552335524355253552635527355283552935530355313553235533355343553535536355373553835539355403554135542355433554435545355463554735548355493555035551355523555335554355553555635557355583555935560355613556235563355643556535566355673556835569355703557135572355733557435575355763557735578355793558035581355823558335584355853558635587355883558935590355913559235593355943559535596355973559835599356003560135602356033560435605356063560735608356093561035611356123561335614356153561635617356183561935620356213562235623356243562535626356273562835629356303563135632356333563435635356363563735638356393564035641356423564335644356453564635647356483564935650356513565235653356543565535656356573565835659356603566135662356633566435665356663566735668356693567035671356723567335674356753567635677356783567935680356813568235683356843568535686356873568835689356903569135692356933569435695356963569735698356993570035701357023570335704357053570635707357083570935710357113571235713357143571535716357173571835719357203572135722357233572435725357263572735728357293573035731357323573335734357353573635737357383573935740357413574235743357443574535746357473574835749357503575135752357533575435755357563575735758357593576035761357623576335764357653576635767357683576935770357713577235773357743577535776357773577835779357803578135782357833578435785357863578735788357893579035791357923579335794357953579635797357983579935800358013580235803358043580535806358073580835809358103581135812358133581435815358163581735818358193582035821358223582335824358253582635827358283582935830358313583235833358343583535836358373583835839358403584135842358433584435845358463584735848358493585035851358523585335854358553585635857358583585935860358613586235863358643586535866358673586835869358703587135872358733587435875358763587735878358793588035881358823588335884358853588635887358883588935890358913589235893358943589535896358973589835899359003590135902359033590435905359063590735908359093591035911359123591335914359153591635917359183591935920359213592235923359243592535926359273592835929359303593135932359333593435935359363593735938359393594035941359423594335944359453594635947359483594935950359513595235953359543595535956359573595835959359603596135962359633596435965359663596735968359693597035971359723597335974359753597635977359783597935980359813598235983359843598535986359873598835989359903599135992359933599435995359963599735998359993600036001360023600336004360053600636007360083600936010360113601236013360143601536016360173601836019360203602136022360233602436025360263602736028360293603036031360323603336034360353603636037360383603936040360413604236043360443604536046360473604836049360503605136052360533605436055360563605736058360593606036061360623606336064360653606636067360683606936070360713607236073360743607536076360773607836079360803608136082360833608436085360863608736088360893609036091360923609336094360953609636097360983609936100361013610236103361043610536106361073610836109361103611136112361133611436115361163611736118361193612036121361223612336124361253612636127361283612936130361313613236133361343613536136361373613836139361403614136142361433614436145361463614736148361493615036151361523615336154361553615636157361583615936160361613616236163361643616536166361673616836169361703617136172361733617436175361763617736178361793618036181361823618336184361853618636187361883618936190361913619236193361943619536196361973619836199362003620136202362033620436205362063620736208362093621036211362123621336214362153621636217362183621936220362213622236223362243622536226362273622836229362303623136232362333623436235362363623736238362393624036241362423624336244362453624636247362483624936250362513625236253362543625536256362573625836259362603626136262362633626436265362663626736268362693627036271362723627336274362753627636277362783627936280362813628236283362843628536286362873628836289362903629136292362933629436295362963629736298362993630036301363023630336304363053630636307363083630936310363113631236313363143631536316363173631836319363203632136322363233632436325363263632736328363293633036331363323633336334363353633636337363383633936340363413634236343363443634536346363473634836349363503635136352363533635436355363563635736358363593636036361363623636336364363653636636367363683636936370363713637236373363743637536376363773637836379363803638136382363833638436385363863638736388363893639036391363923639336394363953639636397363983639936400364013640236403364043640536406364073640836409364103641136412364133641436415364163641736418364193642036421364223642336424364253642636427364283642936430364313643236433364343643536436364373643836439364403644136442364433644436445364463644736448364493645036451364523645336454364553645636457364583645936460364613646236463364643646536466364673646836469364703647136472364733647436475364763647736478364793648036481364823648336484364853648636487364883648936490364913649236493364943649536496364973649836499365003650136502365033650436505365063650736508365093651036511365123651336514365153651636517365183651936520365213652236523365243652536526365273652836529365303653136532365333653436535365363653736538365393654036541365423654336544365453654636547365483654936550365513655236553365543655536556365573655836559365603656136562365633656436565365663656736568365693657036571365723657336574365753657636577365783657936580365813658236583365843658536586365873658836589365903659136592365933659436595365963659736598365993660036601366023660336604366053660636607366083660936610366113661236613366143661536616366173661836619366203662136622366233662436625366263662736628366293663036631366323663336634366353663636637366383663936640366413664236643366443664536646366473664836649366503665136652366533665436655366563665736658366593666036661366623666336664366653666636667366683666936670366713667236673366743667536676366773667836679366803668136682366833668436685366863668736688366893669036691366923669336694366953669636697366983669936700367013670236703367043670536706367073670836709367103671136712367133671436715367163671736718367193672036721367223672336724367253672636727367283672936730367313673236733367343673536736367373673836739367403674136742
  1. (function webpackUniversalModuleDefinition(root, factory) {
  2. if(typeof exports === 'object' && typeof module === 'object')
  3. module.exports = factory(require("Rx"), require("rxjs/observable/fromPromise"), require("rxjs/operator/toPromise"));
  4. else if(typeof define === 'function' && define.amd)
  5. define(["Rx", "rxjs/observable/fromPromise", "rxjs/operator/toPromise"], factory);
  6. else if(typeof exports === 'object')
  7. exports["ng"] = factory(require("Rx"), require("rxjs/observable/fromPromise"), require("rxjs/operator/toPromise"));
  8. else
  9. root["ng"] = factory(root["Rx"], root["Rx"]["Observable"], root["Rx"]["Observable"]["prototype"]);
  10. })(this, function(__WEBPACK_EXTERNAL_MODULE_62__, __WEBPACK_EXTERNAL_MODULE_63__, __WEBPACK_EXTERNAL_MODULE_64__) {
  11. return /******/ (function(modules) { // webpackBootstrap
  12. /******/ // The module cache
  13. /******/ var installedModules = {};
  14. /******/
  15. /******/ // The require function
  16. /******/ function __webpack_require__(moduleId) {
  17. /******/
  18. /******/ // Check if module is in cache
  19. /******/ if(installedModules[moduleId])
  20. /******/ return installedModules[moduleId].exports;
  21. /******/
  22. /******/ // Create a new module (and put it into the cache)
  23. /******/ var module = installedModules[moduleId] = {
  24. /******/ exports: {},
  25. /******/ id: moduleId,
  26. /******/ loaded: false
  27. /******/ };
  28. /******/
  29. /******/ // Execute the module function
  30. /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
  31. /******/
  32. /******/ // Flag the module as loaded
  33. /******/ module.loaded = true;
  34. /******/
  35. /******/ // Return the exports of the module
  36. /******/ return module.exports;
  37. /******/ }
  38. /******/
  39. /******/
  40. /******/ // expose the modules object (__webpack_modules__)
  41. /******/ __webpack_require__.m = modules;
  42. /******/
  43. /******/ // expose the module cache
  44. /******/ __webpack_require__.c = installedModules;
  45. /******/
  46. /******/ // __webpack_public_path__
  47. /******/ __webpack_require__.p = "";
  48. /******/
  49. /******/ // Load entry module and return exports
  50. /******/ return __webpack_require__(0);
  51. /******/ })
  52. /************************************************************************/
  53. /******/ ([
  54. /* 0 */
  55. /***/ function(module, exports, __webpack_require__) {
  56. module.exports = __webpack_require__(1);
  57. /***/ },
  58. /* 1 */
  59. /***/ function(module, exports, __webpack_require__) {
  60. exports.core = __webpack_require__(2);
  61. exports.common = __webpack_require__(104);
  62. exports.compiler = __webpack_require__(147);
  63. exports.platform = {
  64. browser: __webpack_require__(179),
  65. common_dom: __webpack_require__(203)
  66. };
  67. exports.http = __webpack_require__(209);
  68. exports.router = __webpack_require__(224);
  69. exports.router_link_dsl = __webpack_require__(248);
  70. exports.instrumentation = __webpack_require__(250);
  71. exports.upgrade = __webpack_require__(251);
  72. /***/ },
  73. /* 2 */
  74. /***/ function(module, exports, __webpack_require__) {
  75. function __export(m) {
  76. for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
  77. }
  78. /**
  79. * @module
  80. * @description
  81. * Starting point to import all public core APIs.
  82. */
  83. __export(__webpack_require__(3));
  84. __export(__webpack_require__(57));
  85. __export(__webpack_require__(58));
  86. __export(__webpack_require__(6));
  87. __export(__webpack_require__(59));
  88. var lang_1 = __webpack_require__(5);
  89. exports.enableProdMode = lang_1.enableProdMode;
  90. var application_ref_1 = __webpack_require__(65);
  91. exports.platform = application_ref_1.platform;
  92. exports.createNgZone = application_ref_1.createNgZone;
  93. exports.PlatformRef = application_ref_1.PlatformRef;
  94. exports.ApplicationRef = application_ref_1.ApplicationRef;
  95. var application_tokens_1 = __webpack_require__(67);
  96. exports.APP_ID = application_tokens_1.APP_ID;
  97. exports.APP_COMPONENT = application_tokens_1.APP_COMPONENT;
  98. exports.APP_INITIALIZER = application_tokens_1.APP_INITIALIZER;
  99. exports.PACKAGE_ROOT_URL = application_tokens_1.PACKAGE_ROOT_URL;
  100. exports.PLATFORM_INITIALIZER = application_tokens_1.PLATFORM_INITIALIZER;
  101. __export(__webpack_require__(98));
  102. __export(__webpack_require__(99));
  103. __export(__webpack_require__(100));
  104. var debug_element_1 = __webpack_require__(101);
  105. exports.DebugElement = debug_element_1.DebugElement;
  106. exports.Scope = debug_element_1.Scope;
  107. exports.inspectElement = debug_element_1.inspectElement;
  108. exports.asNativeElements = debug_element_1.asNativeElements;
  109. __export(__webpack_require__(68));
  110. __export(__webpack_require__(24));
  111. __export(__webpack_require__(95));
  112. __export(__webpack_require__(102));
  113. __export(__webpack_require__(103));
  114. __export(__webpack_require__(16));
  115. /***/ },
  116. /* 3 */
  117. /***/ function(module, exports, __webpack_require__) {
  118. /**
  119. * This indirection is needed to free up Component, etc symbols in the public API
  120. * to be used by the decorator versions of these annotations.
  121. */
  122. var di_1 = __webpack_require__(4);
  123. exports.QueryMetadata = di_1.QueryMetadata;
  124. exports.ContentChildrenMetadata = di_1.ContentChildrenMetadata;
  125. exports.ContentChildMetadata = di_1.ContentChildMetadata;
  126. exports.ViewChildrenMetadata = di_1.ViewChildrenMetadata;
  127. exports.ViewQueryMetadata = di_1.ViewQueryMetadata;
  128. exports.ViewChildMetadata = di_1.ViewChildMetadata;
  129. exports.AttributeMetadata = di_1.AttributeMetadata;
  130. var directives_1 = __webpack_require__(23);
  131. exports.ComponentMetadata = directives_1.ComponentMetadata;
  132. exports.DirectiveMetadata = directives_1.DirectiveMetadata;
  133. exports.PipeMetadata = directives_1.PipeMetadata;
  134. exports.InputMetadata = directives_1.InputMetadata;
  135. exports.OutputMetadata = directives_1.OutputMetadata;
  136. exports.HostBindingMetadata = directives_1.HostBindingMetadata;
  137. exports.HostListenerMetadata = directives_1.HostListenerMetadata;
  138. var view_1 = __webpack_require__(56);
  139. exports.ViewMetadata = view_1.ViewMetadata;
  140. exports.ViewEncapsulation = view_1.ViewEncapsulation;
  141. var di_2 = __webpack_require__(4);
  142. var directives_2 = __webpack_require__(23);
  143. var view_2 = __webpack_require__(56);
  144. var decorators_1 = __webpack_require__(9);
  145. // TODO(alexeagle): remove the duplication of this doc. It is copied from ComponentMetadata.
  146. /**
  147. * Declare reusable UI building blocks for an application.
  148. *
  149. * Each Angular component requires a single `@Component` and at least one `@View` annotation. The
  150. * `@Component`
  151. * annotation specifies when a component is instantiated, and which properties and hostListeners it
  152. * binds to.
  153. *
  154. * When a component is instantiated, Angular
  155. * - creates a shadow DOM for the component.
  156. * - loads the selected template into the shadow DOM.
  157. * - creates all the injectable objects configured with `providers` and `viewProviders`.
  158. *
  159. * All template expressions and statements are then evaluated against the component instance.
  160. *
  161. * For details on the `@View` annotation, see {@link ViewMetadata}.
  162. *
  163. * ## Lifecycle hooks
  164. *
  165. * When the component class implements some {@link angular2/lifecycle_hooks} the callbacks are
  166. * called by the change detection at defined points in time during the life of the component.
  167. *
  168. * ### Example
  169. *
  170. * {@example core/ts/metadata/metadata.ts region='component'}
  171. */
  172. exports.Component = decorators_1.makeDecorator(directives_2.ComponentMetadata, function (fn) { return fn.View = exports.View; });
  173. // TODO(alexeagle): remove the duplication of this doc. It is copied from DirectiveMetadata.
  174. /**
  175. * Directives allow you to attach behavior to elements in the DOM.
  176. *
  177. * {@link DirectiveMetadata}s with an embedded view are called {@link ComponentMetadata}s.
  178. *
  179. * A directive consists of a single directive annotation and a controller class. When the
  180. * directive's `selector` matches
  181. * elements in the DOM, the following steps occur:
  182. *
  183. * 1. For each directive, the `ElementInjector` attempts to resolve the directive's constructor
  184. * arguments.
  185. * 2. Angular instantiates directives for each matched element using `ElementInjector` in a
  186. * depth-first order,
  187. * as declared in the HTML.
  188. *
  189. * ## Understanding How Injection Works
  190. *
  191. * There are three stages of injection resolution.
  192. * - *Pre-existing Injectors*:
  193. * - The terminal {@link Injector} cannot resolve dependencies. It either throws an error or, if
  194. * the dependency was
  195. * specified as `@Optional`, returns `null`.
  196. * - The platform injector resolves browser singleton resources, such as: cookies, title,
  197. * location, and others.
  198. * - *Component Injectors*: Each component instance has its own {@link Injector}, and they follow
  199. * the same parent-child hierarchy
  200. * as the component instances in the DOM.
  201. * - *Element Injectors*: Each component instance has a Shadow DOM. Within the Shadow DOM each
  202. * element has an `ElementInjector`
  203. * which follow the same parent-child hierarchy as the DOM elements themselves.
  204. *
  205. * When a template is instantiated, it also must instantiate the corresponding directives in a
  206. * depth-first order. The
  207. * current `ElementInjector` resolves the constructor dependencies for each directive.
  208. *
  209. * Angular then resolves dependencies as follows, according to the order in which they appear in the
  210. * {@link ViewMetadata}:
  211. *
  212. * 1. Dependencies on the current element
  213. * 2. Dependencies on element injectors and their parents until it encounters a Shadow DOM boundary
  214. * 3. Dependencies on component injectors and their parents until it encounters the root component
  215. * 4. Dependencies on pre-existing injectors
  216. *
  217. *
  218. * The `ElementInjector` can inject other directives, element-specific special objects, or it can
  219. * delegate to the parent
  220. * injector.
  221. *
  222. * To inject other directives, declare the constructor parameter as:
  223. * - `directive:DirectiveType`: a directive on the current element only
  224. * - `@Host() directive:DirectiveType`: any directive that matches the type between the current
  225. * element and the
  226. * Shadow DOM root.
  227. * - `@Query(DirectiveType) query:QueryList<DirectiveType>`: A live collection of direct child
  228. * directives.
  229. * - `@QueryDescendants(DirectiveType) query:QueryList<DirectiveType>`: A live collection of any
  230. * child directives.
  231. *
  232. * To inject element-specific special objects, declare the constructor parameter as:
  233. * - `element: ElementRef` to obtain a reference to logical element in the view.
  234. * - `viewContainer: ViewContainerRef` to control child template instantiation, for
  235. * {@link DirectiveMetadata} directives only
  236. * - `bindingPropagation: BindingPropagation` to control change detection in a more granular way.
  237. *
  238. * ### Example
  239. *
  240. * The following example demonstrates how dependency injection resolves constructor arguments in
  241. * practice.
  242. *
  243. *
  244. * Assume this HTML template:
  245. *
  246. * ```
  247. * <div dependency="1">
  248. * <div dependency="2">
  249. * <div dependency="3" my-directive>
  250. * <div dependency="4">
  251. * <div dependency="5"></div>
  252. * </div>
  253. * <div dependency="6"></div>
  254. * </div>
  255. * </div>
  256. * </div>
  257. * ```
  258. *
  259. * With the following `dependency` decorator and `SomeService` injectable class.
  260. *
  261. * ```
  262. * @Injectable()
  263. * class SomeService {
  264. * }
  265. *
  266. * @Directive({
  267. * selector: '[dependency]',
  268. * inputs: [
  269. * 'id: dependency'
  270. * ]
  271. * })
  272. * class Dependency {
  273. * id:string;
  274. * }
  275. * ```
  276. *
  277. * Let's step through the different ways in which `MyDirective` could be declared...
  278. *
  279. *
  280. * ### No injection
  281. *
  282. * Here the constructor is declared with no arguments, therefore nothing is injected into
  283. * `MyDirective`.
  284. *
  285. * ```
  286. * @Directive({ selector: '[my-directive]' })
  287. * class MyDirective {
  288. * constructor() {
  289. * }
  290. * }
  291. * ```
  292. *
  293. * This directive would be instantiated with no dependencies.
  294. *
  295. *
  296. * ### Component-level injection
  297. *
  298. * Directives can inject any injectable instance from the closest component injector or any of its
  299. * parents.
  300. *
  301. * Here, the constructor declares a parameter, `someService`, and injects the `SomeService` type
  302. * from the parent
  303. * component's injector.
  304. * ```
  305. * @Directive({ selector: '[my-directive]' })
  306. * class MyDirective {
  307. * constructor(someService: SomeService) {
  308. * }
  309. * }
  310. * ```
  311. *
  312. * This directive would be instantiated with a dependency on `SomeService`.
  313. *
  314. *
  315. * ### Injecting a directive from the current element
  316. *
  317. * Directives can inject other directives declared on the current element.
  318. *
  319. * ```
  320. * @Directive({ selector: '[my-directive]' })
  321. * class MyDirective {
  322. * constructor(dependency: Dependency) {
  323. * expect(dependency.id).toEqual(3);
  324. * }
  325. * }
  326. * ```
  327. * This directive would be instantiated with `Dependency` declared at the same element, in this case
  328. * `dependency="3"`.
  329. *
  330. * ### Injecting a directive from any ancestor elements
  331. *
  332. * Directives can inject other directives declared on any ancestor element (in the current Shadow
  333. * DOM), i.e. on the current element, the
  334. * parent element, or its parents.
  335. * ```
  336. * @Directive({ selector: '[my-directive]' })
  337. * class MyDirective {
  338. * constructor(@Host() dependency: Dependency) {
  339. * expect(dependency.id).toEqual(2);
  340. * }
  341. * }
  342. * ```
  343. *
  344. * `@Host` checks the current element, the parent, as well as its parents recursively. If
  345. * `dependency="2"` didn't
  346. * exist on the direct parent, this injection would
  347. * have returned
  348. * `dependency="1"`.
  349. *
  350. *
  351. * ### Injecting a live collection of direct child directives
  352. *
  353. *
  354. * A directive can also query for other child directives. Since parent directives are instantiated
  355. * before child directives, a directive can't simply inject the list of child directives. Instead,
  356. * the directive injects a {@link QueryList}, which updates its contents as children are added,
  357. * removed, or moved by a directive that uses a {@link ViewContainerRef} such as a `ngFor`, an
  358. * `ngIf`, or an `ngSwitch`.
  359. *
  360. * ```
  361. * @Directive({ selector: '[my-directive]' })
  362. * class MyDirective {
  363. * constructor(@Query(Dependency) dependencies:QueryList<Dependency>) {
  364. * }
  365. * }
  366. * ```
  367. *
  368. * This directive would be instantiated with a {@link QueryList} which contains `Dependency` 4 and
  369. * 6. Here, `Dependency` 5 would not be included, because it is not a direct child.
  370. *
  371. * ### Injecting a live collection of descendant directives
  372. *
  373. * By passing the descendant flag to `@Query` above, we can include the children of the child
  374. * elements.
  375. *
  376. * ```
  377. * @Directive({ selector: '[my-directive]' })
  378. * class MyDirective {
  379. * constructor(@Query(Dependency, {descendants: true}) dependencies:QueryList<Dependency>) {
  380. * }
  381. * }
  382. * ```
  383. *
  384. * This directive would be instantiated with a Query which would contain `Dependency` 4, 5 and 6.
  385. *
  386. * ### Optional injection
  387. *
  388. * The normal behavior of directives is to return an error when a specified dependency cannot be
  389. * resolved. If you
  390. * would like to inject `null` on unresolved dependency instead, you can annotate that dependency
  391. * with `@Optional()`.
  392. * This explicitly permits the author of a template to treat some of the surrounding directives as
  393. * optional.
  394. *
  395. * ```
  396. * @Directive({ selector: '[my-directive]' })
  397. * class MyDirective {
  398. * constructor(@Optional() dependency:Dependency) {
  399. * }
  400. * }
  401. * ```
  402. *
  403. * This directive would be instantiated with a `Dependency` directive found on the current element.
  404. * If none can be
  405. * found, the injector supplies `null` instead of throwing an error.
  406. *
  407. * ### Example
  408. *
  409. * Here we use a decorator directive to simply define basic tool-tip behavior.
  410. *
  411. * ```
  412. * @Directive({
  413. * selector: '[tooltip]',
  414. * inputs: [
  415. * 'text: tooltip'
  416. * ],
  417. * host: {
  418. * '(mouseenter)': 'onMouseEnter()',
  419. * '(mouseleave)': 'onMouseLeave()'
  420. * }
  421. * })
  422. * class Tooltip{
  423. * text:string;
  424. * overlay:Overlay; // NOT YET IMPLEMENTED
  425. * overlayManager:OverlayManager; // NOT YET IMPLEMENTED
  426. *
  427. * constructor(overlayManager:OverlayManager) {
  428. * this.overlay = overlay;
  429. * }
  430. *
  431. * onMouseEnter() {
  432. * // exact signature to be determined
  433. * this.overlay = this.overlayManager.open(text, ...);
  434. * }
  435. *
  436. * onMouseLeave() {
  437. * this.overlay.close();
  438. * this.overlay = null;
  439. * }
  440. * }
  441. * ```
  442. * In our HTML template, we can then add this behavior to a `<div>` or any other element with the
  443. * `tooltip` selector,
  444. * like so:
  445. *
  446. * ```
  447. * <div tooltip="some text here"></div>
  448. * ```
  449. *
  450. * Directives can also control the instantiation, destruction, and positioning of inline template
  451. * elements:
  452. *
  453. * A directive uses a {@link ViewContainerRef} to instantiate, insert, move, and destroy views at
  454. * runtime.
  455. * The {@link ViewContainerRef} is created as a result of `<template>` element, and represents a
  456. * location in the current view
  457. * where these actions are performed.
  458. *
  459. * Views are always created as children of the current {@link ViewMetadata}, and as siblings of the
  460. * `<template>` element. Thus a
  461. * directive in a child view cannot inject the directive that created it.
  462. *
  463. * Since directives that create views via ViewContainers are common in Angular, and using the full
  464. * `<template>` element syntax is wordy, Angular
  465. * also supports a shorthand notation: `<li *foo="bar">` and `<li template="foo: bar">` are
  466. * equivalent.
  467. *
  468. * Thus,
  469. *
  470. * ```
  471. * <ul>
  472. * <li *foo="bar" title="text"></li>
  473. * </ul>
  474. * ```
  475. *
  476. * Expands in use to:
  477. *
  478. * ```
  479. * <ul>
  480. * <template [foo]="bar">
  481. * <li title="text"></li>
  482. * </template>
  483. * </ul>
  484. * ```
  485. *
  486. * Notice that although the shorthand places `*foo="bar"` within the `<li>` element, the binding for
  487. * the directive
  488. * controller is correctly instantiated on the `<template>` element rather than the `<li>` element.
  489. *
  490. * ## Lifecycle hooks
  491. *
  492. * When the directive class implements some {@link angular2/lifecycle_hooks} the callbacks are
  493. * called by the change detection at defined points in time during the life of the directive.
  494. *
  495. * ### Example
  496. *
  497. * Let's suppose we want to implement the `unless` behavior, to conditionally include a template.
  498. *
  499. * Here is a simple directive that triggers on an `unless` selector:
  500. *
  501. * ```
  502. * @Directive({
  503. * selector: '[unless]',
  504. * inputs: ['unless']
  505. * })
  506. * export class Unless {
  507. * viewContainer: ViewContainerRef;
  508. * templateRef: TemplateRef;
  509. * prevCondition: boolean;
  510. *
  511. * constructor(viewContainer: ViewContainerRef, templateRef: TemplateRef) {
  512. * this.viewContainer = viewContainer;
  513. * this.templateRef = templateRef;
  514. * this.prevCondition = null;
  515. * }
  516. *
  517. * set unless(newCondition) {
  518. * if (newCondition && (isBlank(this.prevCondition) || !this.prevCondition)) {
  519. * this.prevCondition = true;
  520. * this.viewContainer.clear();
  521. * } else if (!newCondition && (isBlank(this.prevCondition) || this.prevCondition)) {
  522. * this.prevCondition = false;
  523. * this.viewContainer.create(this.templateRef);
  524. * }
  525. * }
  526. * }
  527. * ```
  528. *
  529. * We can then use this `unless` selector in a template:
  530. * ```
  531. * <ul>
  532. * <li *unless="expr"></li>
  533. * </ul>
  534. * ```
  535. *
  536. * Once the directive instantiates the child view, the shorthand notation for the template expands
  537. * and the result is:
  538. *
  539. * ```
  540. * <ul>
  541. * <template [unless]="exp">
  542. * <li></li>
  543. * </template>
  544. * <li></li>
  545. * </ul>
  546. * ```
  547. *
  548. * Note also that although the `<li></li>` template still exists inside the `<template></template>`,
  549. * the instantiated
  550. * view occurs on the second `<li></li>` which is a sibling to the `<template>` element.
  551. */
  552. exports.Directive = decorators_1.makeDecorator(directives_2.DirectiveMetadata);
  553. // TODO(alexeagle): remove the duplication of this doc. It is copied from ViewMetadata.
  554. /**
  555. * Metadata properties available for configuring Views.
  556. *
  557. * Each Angular component requires a single `@Component` and at least one `@View` annotation. The
  558. * `@View` annotation specifies the HTML template to use, and lists the directives that are active
  559. * within the template.
  560. *
  561. * When a component is instantiated, the template is loaded into the component's shadow root, and
  562. * the expressions and statements in the template are evaluated against the component.
  563. *
  564. * For details on the `@Component` annotation, see {@link ComponentMetadata}.
  565. *
  566. * ### Example
  567. *
  568. * ```
  569. * @Component({
  570. * selector: 'greet',
  571. * template: 'Hello {{name}}!',
  572. * directives: [GreetUser, Bold]
  573. * })
  574. * class Greet {
  575. * name: string;
  576. *
  577. * constructor() {
  578. * this.name = 'World';
  579. * }
  580. * }
  581. * ```
  582. */
  583. exports.View = decorators_1.makeDecorator(view_2.ViewMetadata, function (fn) { return fn.View = exports.View; });
  584. /**
  585. * Specifies that a constant attribute value should be injected.
  586. *
  587. * The directive can inject constant string literals of host element attributes.
  588. *
  589. * ### Example
  590. *
  591. * Suppose we have an `<input>` element and want to know its `type`.
  592. *
  593. * ```html
  594. * <input type="text">
  595. * ```
  596. *
  597. * A decorator can inject string literal `text` like so:
  598. *
  599. * {@example core/ts/metadata/metadata.ts region='attributeMetadata'}
  600. */
  601. exports.Attribute = decorators_1.makeParamDecorator(di_2.AttributeMetadata);
  602. // TODO(alexeagle): remove the duplication of this doc. It is copied from QueryMetadata.
  603. /**
  604. * Declares an injectable parameter to be a live list of directives or variable
  605. * bindings from the content children of a directive.
  606. *
  607. * ### Example ([live demo](http://plnkr.co/edit/lY9m8HLy7z06vDoUaSN2?p=preview))
  608. *
  609. * Assume that `<tabs>` component would like to get a list its children `<pane>`
  610. * components as shown in this example:
  611. *
  612. * ```html
  613. * <tabs>
  614. * <pane title="Overview">...</pane>
  615. * <pane *ngFor="#o of objects" [title]="o.title">{{o.text}}</pane>
  616. * </tabs>
  617. * ```
  618. *
  619. * The preferred solution is to query for `Pane` directives using this decorator.
  620. *
  621. * ```javascript
  622. * @Component({
  623. * selector: 'pane',
  624. * inputs: ['title']
  625. * })
  626. * class Pane {
  627. * title:string;
  628. * }
  629. *
  630. * @Component({
  631. * selector: 'tabs',
  632. * template: `
  633. * <ul>
  634. * <li *ngFor="#pane of panes">{{pane.title}}</li>
  635. * </ul>
  636. * <content></content>
  637. * `
  638. * })
  639. * class Tabs {
  640. * panes: QueryList<Pane>;
  641. * constructor(@Query(Pane) panes:QueryList<Pane>) {
  642. * this.panes = panes;
  643. * }
  644. * }
  645. * ```
  646. *
  647. * A query can look for variable bindings by passing in a string with desired binding symbol.
  648. *
  649. * ### Example ([live demo](http://plnkr.co/edit/sT2j25cH1dURAyBRCKx1?p=preview))
  650. * ```html
  651. * <seeker>
  652. * <div #findme>...</div>
  653. * </seeker>
  654. *
  655. * @Component({ selector: 'foo' })
  656. * class seeker {
  657. * constructor(@Query('findme') elList: QueryList<ElementRef>) {...}
  658. * }
  659. * ```
  660. *
  661. * In this case the object that is injected depend on the type of the variable
  662. * binding. It can be an ElementRef, a directive or a component.
  663. *
  664. * Passing in a comma separated list of variable bindings will query for all of them.
  665. *
  666. * ```html
  667. * <seeker>
  668. * <div #findMe>...</div>
  669. * <div #findMeToo>...</div>
  670. * </seeker>
  671. *
  672. * @Component({
  673. * selector: 'foo'
  674. * })
  675. * class Seeker {
  676. * constructor(@Query('findMe, findMeToo') elList: QueryList<ElementRef>) {...}
  677. * }
  678. * ```
  679. *
  680. * Configure whether query looks for direct children or all descendants
  681. * of the querying element, by using the `descendants` parameter.
  682. * It is set to `false` by default.
  683. *
  684. * ### Example ([live demo](http://plnkr.co/edit/wtGeB977bv7qvA5FTYl9?p=preview))
  685. * ```html
  686. * <container #first>
  687. * <item>a</item>
  688. * <item>b</item>
  689. * <container #second>
  690. * <item>c</item>
  691. * </container>
  692. * </container>
  693. * ```
  694. *
  695. * When querying for items, the first container will see only `a` and `b` by default,
  696. * but with `Query(TextDirective, {descendants: true})` it will see `c` too.
  697. *
  698. * The queried directives are kept in a depth-first pre-order with respect to their
  699. * positions in the DOM.
  700. *
  701. * Query does not look deep into any subcomponent views.
  702. *
  703. * Query is updated as part of the change-detection cycle. Since change detection
  704. * happens after construction of a directive, QueryList will always be empty when observed in the
  705. * constructor.
  706. *
  707. * The injected object is an unmodifiable live list.
  708. * See {@link QueryList} for more details.
  709. */
  710. exports.Query = decorators_1.makeParamDecorator(di_2.QueryMetadata);
  711. // TODO(alexeagle): remove the duplication of this doc. It is copied from ContentChildrenMetadata.
  712. /**
  713. * Configures a content query.
  714. *
  715. * Content queries are set before the `ngAfterContentInit` callback is called.
  716. *
  717. * ### Example
  718. *
  719. * ```
  720. * @Directive({
  721. * selector: 'someDir'
  722. * })
  723. * class SomeDir {
  724. * @ContentChildren(ChildDirective) contentChildren: QueryList<ChildDirective>;
  725. *
  726. * ngAfterContentInit() {
  727. * // contentChildren is set
  728. * }
  729. * }
  730. * ```
  731. */
  732. exports.ContentChildren = decorators_1.makePropDecorator(di_2.ContentChildrenMetadata);
  733. // TODO(alexeagle): remove the duplication of this doc. It is copied from ContentChildMetadata.
  734. /**
  735. * Configures a content query.
  736. *
  737. * Content queries are set before the `ngAfterContentInit` callback is called.
  738. *
  739. * ### Example
  740. *
  741. * ```
  742. * @Directive({
  743. * selector: 'someDir'
  744. * })
  745. * class SomeDir {
  746. * @ContentChild(ChildDirective) contentChild;
  747. *
  748. * ngAfterContentInit() {
  749. * // contentChild is set
  750. * }
  751. * }
  752. * ```
  753. */
  754. exports.ContentChild = decorators_1.makePropDecorator(di_2.ContentChildMetadata);
  755. // TODO(alexeagle): remove the duplication of this doc. It is copied from ViewChildrenMetadata.
  756. /**
  757. * Configures a view query.
  758. *
  759. * View queries are set before the `ngAfterViewInit` callback is called.
  760. *
  761. * ### Example
  762. *
  763. * ```
  764. * @Component({
  765. * selector: 'someDir',
  766. * templateUrl: 'someTemplate',
  767. * directives: [ItemDirective]
  768. * })
  769. * class SomeDir {
  770. * @ViewChildren(ItemDirective) viewChildren: QueryList<ItemDirective>;
  771. *
  772. * ngAfterViewInit() {
  773. * // viewChildren is set
  774. * }
  775. * }
  776. * ```
  777. */
  778. exports.ViewChildren = decorators_1.makePropDecorator(di_2.ViewChildrenMetadata);
  779. // TODO(alexeagle): remove the duplication of this doc. It is copied from ViewChildMetadata.
  780. /**
  781. * Configures a view query.
  782. *
  783. * View queries are set before the `ngAfterViewInit` callback is called.
  784. *
  785. * ### Example
  786. *
  787. * ```
  788. * @Component({
  789. * selector: 'someDir',
  790. * templateUrl: 'someTemplate',
  791. * directives: [ItemDirective]
  792. * })
  793. * class SomeDir {
  794. * @ViewChild(ItemDirective) viewChild:ItemDirective;
  795. *
  796. * ngAfterViewInit() {
  797. * // viewChild is set
  798. * }
  799. * }
  800. * ```
  801. */
  802. exports.ViewChild = decorators_1.makePropDecorator(di_2.ViewChildMetadata);
  803. // TODO(alexeagle): remove the duplication of this doc. It is copied from ViewQueryMetadata.
  804. /**
  805. * Similar to {@link QueryMetadata}, but querying the component view, instead of
  806. * the content children.
  807. *
  808. * ### Example ([live demo](http://plnkr.co/edit/eNsFHDf7YjyM6IzKxM1j?p=preview))
  809. *
  810. * ```javascript
  811. * @Component({...})
  812. * @View({
  813. * template: `
  814. * <item> a </item>
  815. * <item> b </item>
  816. * <item> c </item>
  817. * `
  818. * })
  819. * class MyComponent {
  820. * shown: boolean;
  821. *
  822. * constructor(private @Query(Item) items:QueryList<Item>) {
  823. * items.onChange(() => console.log(items.length));
  824. * }
  825. * }
  826. * ```
  827. *
  828. * Supports the same querying parameters as {@link QueryMetadata}, except
  829. * `descendants`. This always queries the whole view.
  830. *
  831. * As `shown` is flipped between true and false, items will contain zero of one
  832. * items.
  833. *
  834. * Specifies that a {@link QueryList} should be injected.
  835. *
  836. * The injected object is an iterable and observable live list.
  837. * See {@link QueryList} for more details.
  838. */
  839. exports.ViewQuery = decorators_1.makeParamDecorator(di_2.ViewQueryMetadata);
  840. // TODO(alexeagle): remove the duplication of this doc. It is copied from PipeMetadata.
  841. /**
  842. * Declare reusable pipe function.
  843. *
  844. * ### Example
  845. *
  846. * {@example core/ts/metadata/metadata.ts region='pipe'}
  847. */
  848. exports.Pipe = decorators_1.makeDecorator(directives_2.PipeMetadata);
  849. // TODO(alexeagle): remove the duplication of this doc. It is copied from InputMetadata.
  850. /**
  851. * Declares a data-bound input property.
  852. *
  853. * Angular automatically updates data-bound properties during change detection.
  854. *
  855. * `InputMetadata` takes an optional parameter that specifies the name
  856. * used when instantiating a component in the template. When not provided,
  857. * the name of the decorated property is used.
  858. *
  859. * ### Example
  860. *
  861. * The following example creates a component with two input properties.
  862. *
  863. * ```typescript
  864. * @Component({
  865. * selector: 'bank-account',
  866. * template: `
  867. * Bank Name: {{bankName}}
  868. * Account Id: {{id}}
  869. * `
  870. * })
  871. * class BankAccount {
  872. * @Input() bankName: string;
  873. * @Input('account-id') id: string;
  874. *
  875. * // this property is not bound, and won't be automatically updated by Angular
  876. * normalizedBankName: string;
  877. * }
  878. *
  879. * @Component({
  880. * selector: 'app',
  881. * template: `
  882. * <bank-account bank-name="RBC" account-id="4747"></bank-account>
  883. * `,
  884. * directives: [BankAccount]
  885. * })
  886. * class App {}
  887. *
  888. * bootstrap(App);
  889. * ```
  890. */
  891. exports.Input = decorators_1.makePropDecorator(directives_2.InputMetadata);
  892. // TODO(alexeagle): remove the duplication of this doc. It is copied from OutputMetadata.
  893. /**
  894. * Declares an event-bound output property.
  895. *
  896. * When an output property emits an event, an event handler attached to that event
  897. * the template is invoked.
  898. *
  899. * `OutputMetadata` takes an optional parameter that specifies the name
  900. * used when instantiating a component in the template. When not provided,
  901. * the name of the decorated property is used.
  902. *
  903. * ### Example
  904. *
  905. * ```typescript
  906. * @Directive({
  907. * selector: 'interval-dir',
  908. * })
  909. * class IntervalDir {
  910. * @Output() everySecond = new EventEmitter();
  911. * @Output('everyFiveSeconds') five5Secs = new EventEmitter();
  912. *
  913. * constructor() {
  914. * setInterval(() => this.everySecond.emit("event"), 1000);
  915. * setInterval(() => this.five5Secs.emit("event"), 5000);
  916. * }
  917. * }
  918. *
  919. * @Component({
  920. * selector: 'app',
  921. * template: `
  922. * <interval-dir (every-second)="everySecond()" (every-five-seconds)="everyFiveSeconds()">
  923. * </interval-dir>
  924. * `,
  925. * directives: [IntervalDir]
  926. * })
  927. * class App {
  928. * everySecond() { console.log('second'); }
  929. * everyFiveSeconds() { console.log('five seconds'); }
  930. * }
  931. * bootstrap(App);
  932. * ```
  933. */
  934. exports.Output = decorators_1.makePropDecorator(directives_2.OutputMetadata);
  935. // TODO(alexeagle): remove the duplication of this doc. It is copied from HostBindingMetadata.
  936. /**
  937. * Declares a host property binding.
  938. *
  939. * Angular automatically checks host property bindings during change detection.
  940. * If a binding changes, it will update the host element of the directive.
  941. *
  942. * `HostBindingMetadata` takes an optional parameter that specifies the property
  943. * name of the host element that will be updated. When not provided,
  944. * the class property name is used.
  945. *
  946. * ### Example
  947. *
  948. * The following example creates a directive that sets the `valid` and `invalid` classes
  949. * on the DOM element that has ngModel directive on it.
  950. *
  951. * ```typescript
  952. * @Directive({selector: '[ngModel]'})
  953. * class NgModelStatus {
  954. * constructor(public control:NgModel) {}
  955. * @HostBinding('[class.valid]') get valid { return this.control.valid; }
  956. * @HostBinding('[class.invalid]') get invalid { return this.control.invalid; }
  957. * }
  958. *
  959. * @Component({
  960. * selector: 'app',
  961. * template: `<input [(ngModel)]="prop">`,
  962. * directives: [FORM_DIRECTIVES, NgModelStatus]
  963. * })
  964. * class App {
  965. * prop;
  966. * }
  967. *
  968. * bootstrap(App);
  969. * ```
  970. */
  971. exports.HostBinding = decorators_1.makePropDecorator(directives_2.HostBindingMetadata);
  972. // TODO(alexeagle): remove the duplication of this doc. It is copied from HostListenerMetadata.
  973. /**
  974. * Declares a host listener.
  975. *
  976. * Angular will invoke the decorated method when the host element emits the specified event.
  977. *
  978. * If the decorated method returns `false`, then `preventDefault` is applied on the DOM
  979. * event.
  980. *
  981. * ### Example
  982. *
  983. * The following example declares a directive that attaches a click listener to the button and
  984. * counts clicks.
  985. *
  986. * ```typescript
  987. * @Directive({selector: 'button[counting]'})
  988. * class CountClicks {
  989. * numberOfClicks = 0;
  990. *
  991. * @HostListener('click', ['$event.target'])
  992. * onClick(btn) {
  993. * console.log("button", btn, "number of clicks:", this.numberOfClicks++);
  994. * }
  995. * }
  996. *
  997. * @Component({
  998. * selector: 'app',
  999. * template: `<button counting>Increment</button>`,
  1000. * directives: [CountClicks]
  1001. * })
  1002. * class App {}
  1003. *
  1004. * bootstrap(App);
  1005. * ```
  1006. */
  1007. exports.HostListener = decorators_1.makePropDecorator(directives_2.HostListenerMetadata);
  1008. /***/ },
  1009. /* 4 */
  1010. /***/ function(module, exports, __webpack_require__) {
  1011. var __extends = (this && this.__extends) || function (d, b) {
  1012. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  1013. function __() { this.constructor = d; }
  1014. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  1015. };
  1016. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  1017. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  1018. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  1019. 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;
  1020. return c > 3 && r && Object.defineProperty(target, key, r), r;
  1021. };
  1022. var __metadata = (this && this.__metadata) || function (k, v) {
  1023. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  1024. };
  1025. var lang_1 = __webpack_require__(5);
  1026. var di_1 = __webpack_require__(6);
  1027. var metadata_1 = __webpack_require__(7);
  1028. /**
  1029. * Specifies that a constant attribute value should be injected.
  1030. *
  1031. * The directive can inject constant string literals of host element attributes.
  1032. *
  1033. * ### Example
  1034. *
  1035. * Suppose we have an `<input>` element and want to know its `type`.
  1036. *
  1037. * ```html
  1038. * <input type="text">
  1039. * ```
  1040. *
  1041. * A decorator can inject string literal `text` like so:
  1042. *
  1043. * {@example core/ts/metadata/metadata.ts region='attributeMetadata'}
  1044. */
  1045. var AttributeMetadata = (function (_super) {
  1046. __extends(AttributeMetadata, _super);
  1047. function AttributeMetadata(attributeName) {
  1048. _super.call(this);
  1049. this.attributeName = attributeName;
  1050. }
  1051. Object.defineProperty(AttributeMetadata.prototype, "token", {
  1052. get: function () {
  1053. // Normally one would default a token to a type of an injected value but here
  1054. // the type of a variable is "string" and we can't use primitive type as a return value
  1055. // so we use instance of Attribute instead. This doesn't matter much in practice as arguments
  1056. // with @Attribute annotation are injected by ElementInjector that doesn't take tokens into
  1057. // account.
  1058. return this;
  1059. },
  1060. enumerable: true,
  1061. configurable: true
  1062. });
  1063. AttributeMetadata.prototype.toString = function () { return "@Attribute(" + lang_1.stringify(this.attributeName) + ")"; };
  1064. AttributeMetadata = __decorate([
  1065. lang_1.CONST(),
  1066. __metadata('design:paramtypes', [String])
  1067. ], AttributeMetadata);
  1068. return AttributeMetadata;
  1069. })(metadata_1.DependencyMetadata);
  1070. exports.AttributeMetadata = AttributeMetadata;
  1071. /**
  1072. * Declares an injectable parameter to be a live list of directives or variable
  1073. * bindings from the content children of a directive.
  1074. *
  1075. * ### Example ([live demo](http://plnkr.co/edit/lY9m8HLy7z06vDoUaSN2?p=preview))
  1076. *
  1077. * Assume that `<tabs>` component would like to get a list its children `<pane>`
  1078. * components as shown in this example:
  1079. *
  1080. * ```html
  1081. * <tabs>
  1082. * <pane title="Overview">...</pane>
  1083. * <pane *ngFor="#o of objects" [title]="o.title">{{o.text}}</pane>
  1084. * </tabs>
  1085. * ```
  1086. *
  1087. * The preferred solution is to query for `Pane` directives using this decorator.
  1088. *
  1089. * ```javascript
  1090. * @Component({
  1091. * selector: 'pane',
  1092. * inputs: ['title']
  1093. * })
  1094. * class Pane {
  1095. * title:string;
  1096. * }
  1097. *
  1098. * @Component({
  1099. * selector: 'tabs',
  1100. * template: `
  1101. * <ul>
  1102. * <li *ngFor="#pane of panes">{{pane.title}}</li>
  1103. * </ul>
  1104. * <content></content>
  1105. * `
  1106. * })
  1107. * class Tabs {
  1108. * panes: QueryList<Pane>;
  1109. * constructor(@Query(Pane) panes:QueryList<Pane>) {
  1110. * this.panes = panes;
  1111. * }
  1112. * }
  1113. * ```
  1114. *
  1115. * A query can look for variable bindings by passing in a string with desired binding symbol.
  1116. *
  1117. * ### Example ([live demo](http://plnkr.co/edit/sT2j25cH1dURAyBRCKx1?p=preview))
  1118. * ```html
  1119. * <seeker>
  1120. * <div #findme>...</div>
  1121. * </seeker>
  1122. *
  1123. * @Component({ selector: 'seeker' })
  1124. * class Seeker {
  1125. * constructor(@Query('findme') elList: QueryList<ElementRef>) {...}
  1126. * }
  1127. * ```
  1128. *
  1129. * In this case the object that is injected depend on the type of the variable
  1130. * binding. It can be an ElementRef, a directive or a component.
  1131. *
  1132. * Passing in a comma separated list of variable bindings will query for all of them.
  1133. *
  1134. * ```html
  1135. * <seeker>
  1136. * <div #find-me>...</div>
  1137. * <div #find-me-too>...</div>
  1138. * </seeker>
  1139. *
  1140. * @Component({
  1141. * selector: 'seeker'
  1142. * })
  1143. * class Seeker {
  1144. * constructor(@Query('findMe, findMeToo') elList: QueryList<ElementRef>) {...}
  1145. * }
  1146. * ```
  1147. *
  1148. * Configure whether query looks for direct children or all descendants
  1149. * of the querying element, by using the `descendants` parameter.
  1150. * It is set to `false` by default.
  1151. *
  1152. * ### Example ([live demo](http://plnkr.co/edit/wtGeB977bv7qvA5FTYl9?p=preview))
  1153. * ```html
  1154. * <container #first>
  1155. * <item>a</item>
  1156. * <item>b</item>
  1157. * <container #second>
  1158. * <item>c</item>
  1159. * </container>
  1160. * </container>
  1161. * ```
  1162. *
  1163. * When querying for items, the first container will see only `a` and `b` by default,
  1164. * but with `Query(TextDirective, {descendants: true})` it will see `c` too.
  1165. *
  1166. * The queried directives are kept in a depth-first pre-order with respect to their
  1167. * positions in the DOM.
  1168. *
  1169. * Query does not look deep into any subcomponent views.
  1170. *
  1171. * Query is updated as part of the change-detection cycle. Since change detection
  1172. * happens after construction of a directive, QueryList will always be empty when observed in the
  1173. * constructor.
  1174. *
  1175. * The injected object is an unmodifiable live list.
  1176. * See {@link QueryList} for more details.
  1177. */
  1178. var QueryMetadata = (function (_super) {
  1179. __extends(QueryMetadata, _super);
  1180. function QueryMetadata(_selector, _a) {
  1181. var _b = _a === void 0 ? {} : _a, _c = _b.descendants, descendants = _c === void 0 ? false : _c, _d = _b.first, first = _d === void 0 ? false : _d;
  1182. _super.call(this);
  1183. this._selector = _selector;
  1184. this.descendants = descendants;
  1185. this.first = first;
  1186. }
  1187. Object.defineProperty(QueryMetadata.prototype, "isViewQuery", {
  1188. /**
  1189. * always `false` to differentiate it with {@link ViewQueryMetadata}.
  1190. */
  1191. get: function () { return false; },
  1192. enumerable: true,
  1193. configurable: true
  1194. });
  1195. Object.defineProperty(QueryMetadata.prototype, "selector", {
  1196. /**
  1197. * what this is querying for.
  1198. */
  1199. get: function () { return di_1.resolveForwardRef(this._selector); },
  1200. enumerable: true,
  1201. configurable: true
  1202. });
  1203. Object.defineProperty(QueryMetadata.prototype, "isVarBindingQuery", {
  1204. /**
  1205. * whether this is querying for a variable binding or a directive.
  1206. */
  1207. get: function () { return lang_1.isString(this.selector); },
  1208. enumerable: true,
  1209. configurable: true
  1210. });
  1211. Object.defineProperty(QueryMetadata.prototype, "varBindings", {
  1212. /**
  1213. * returns a list of variable bindings this is querying for.
  1214. * Only applicable if this is a variable bindings query.
  1215. */
  1216. get: function () { return this.selector.split(','); },
  1217. enumerable: true,
  1218. configurable: true
  1219. });
  1220. QueryMetadata.prototype.toString = function () { return "@Query(" + lang_1.stringify(this.selector) + ")"; };
  1221. QueryMetadata = __decorate([
  1222. lang_1.CONST(),
  1223. __metadata('design:paramtypes', [Object, Object])
  1224. ], QueryMetadata);
  1225. return QueryMetadata;
  1226. })(metadata_1.DependencyMetadata);
  1227. exports.QueryMetadata = QueryMetadata;
  1228. // TODO: add an example after ContentChildren and ViewChildren are in master
  1229. /**
  1230. * Configures a content query.
  1231. *
  1232. * Content queries are set before the `ngAfterContentInit` callback is called.
  1233. *
  1234. * ### Example
  1235. *
  1236. * ```
  1237. * @Directive({
  1238. * selector: 'someDir'
  1239. * })
  1240. * class SomeDir {
  1241. * @ContentChildren(ChildDirective) contentChildren: QueryList<ChildDirective>;
  1242. *
  1243. * ngAfterContentInit() {
  1244. * // contentChildren is set
  1245. * }
  1246. * }
  1247. * ```
  1248. */
  1249. var ContentChildrenMetadata = (function (_super) {
  1250. __extends(ContentChildrenMetadata, _super);
  1251. function ContentChildrenMetadata(_selector, _a) {
  1252. var _b = (_a === void 0 ? {} : _a).descendants, descendants = _b === void 0 ? false : _b;
  1253. _super.call(this, _selector, { descendants: descendants });
  1254. }
  1255. ContentChildrenMetadata = __decorate([
  1256. lang_1.CONST(),
  1257. __metadata('design:paramtypes', [Object, Object])
  1258. ], ContentChildrenMetadata);
  1259. return ContentChildrenMetadata;
  1260. })(QueryMetadata);
  1261. exports.ContentChildrenMetadata = ContentChildrenMetadata;
  1262. // TODO: add an example after ContentChild and ViewChild are in master
  1263. /**
  1264. * Configures a content query.
  1265. *
  1266. * Content queries are set before the `ngAfterContentInit` callback is called.
  1267. *
  1268. * ### Example
  1269. *
  1270. * ```
  1271. * @Directive({
  1272. * selector: 'someDir'
  1273. * })
  1274. * class SomeDir {
  1275. * @ContentChild(ChildDirective) contentChild;
  1276. *
  1277. * ngAfterContentInit() {
  1278. * // contentChild is set
  1279. * }
  1280. * }
  1281. * ```
  1282. */
  1283. var ContentChildMetadata = (function (_super) {
  1284. __extends(ContentChildMetadata, _super);
  1285. function ContentChildMetadata(_selector) {
  1286. _super.call(this, _selector, { descendants: true, first: true });
  1287. }
  1288. ContentChildMetadata = __decorate([
  1289. lang_1.CONST(),
  1290. __metadata('design:paramtypes', [Object])
  1291. ], ContentChildMetadata);
  1292. return ContentChildMetadata;
  1293. })(QueryMetadata);
  1294. exports.ContentChildMetadata = ContentChildMetadata;
  1295. /**
  1296. * Similar to {@link QueryMetadata}, but querying the component view, instead of
  1297. * the content children.
  1298. *
  1299. * ### Example ([live demo](http://plnkr.co/edit/eNsFHDf7YjyM6IzKxM1j?p=preview))
  1300. *
  1301. * ```javascript
  1302. * @Component({...})
  1303. * @View({
  1304. * template: `
  1305. * <item> a </item>
  1306. * <item> b </item>
  1307. * <item> c </item>
  1308. * `
  1309. * })
  1310. * class MyComponent {
  1311. * shown: boolean;
  1312. *
  1313. * constructor(private @Query(Item) items:QueryList<Item>) {
  1314. * items.onChange(() => console.log(items.length));
  1315. * }
  1316. * }
  1317. * ```
  1318. *
  1319. * Supports the same querying parameters as {@link QueryMetadata}, except
  1320. * `descendants`. This always queries the whole view.
  1321. *
  1322. * As `shown` is flipped between true and false, items will contain zero of one
  1323. * items.
  1324. *
  1325. * Specifies that a {@link QueryList} should be injected.
  1326. *
  1327. * The injected object is an iterable and observable live list.
  1328. * See {@link QueryList} for more details.
  1329. */
  1330. var ViewQueryMetadata = (function (_super) {
  1331. __extends(ViewQueryMetadata, _super);
  1332. function ViewQueryMetadata(_selector, _a) {
  1333. var _b = _a === void 0 ? {} : _a, _c = _b.descendants, descendants = _c === void 0 ? false : _c, _d = _b.first, first = _d === void 0 ? false : _d;
  1334. _super.call(this, _selector, { descendants: descendants, first: first });
  1335. }
  1336. Object.defineProperty(ViewQueryMetadata.prototype, "isViewQuery", {
  1337. /**
  1338. * always `true` to differentiate it with {@link QueryMetadata}.
  1339. */
  1340. get: function () { return true; },
  1341. enumerable: true,
  1342. configurable: true
  1343. });
  1344. ViewQueryMetadata.prototype.toString = function () { return "@ViewQuery(" + lang_1.stringify(this.selector) + ")"; };
  1345. ViewQueryMetadata = __decorate([
  1346. lang_1.CONST(),
  1347. __metadata('design:paramtypes', [Object, Object])
  1348. ], ViewQueryMetadata);
  1349. return ViewQueryMetadata;
  1350. })(QueryMetadata);
  1351. exports.ViewQueryMetadata = ViewQueryMetadata;
  1352. /**
  1353. * Configures a view query.
  1354. *
  1355. * View queries are set before the `ngAfterViewInit` callback is called.
  1356. *
  1357. * ### Example
  1358. *
  1359. * ```
  1360. * @Component({
  1361. * selector: 'someDir',
  1362. * templateUrl: 'someTemplate',
  1363. * directives: [ItemDirective]
  1364. * })
  1365. * class SomeDir {
  1366. * @ViewChildren(ItemDirective) viewChildren: QueryList<ItemDirective>;
  1367. *
  1368. * ngAfterViewInit() {
  1369. * // viewChildren is set
  1370. * }
  1371. * }
  1372. * ```
  1373. */
  1374. var ViewChildrenMetadata = (function (_super) {
  1375. __extends(ViewChildrenMetadata, _super);
  1376. function ViewChildrenMetadata(_selector) {
  1377. _super.call(this, _selector, { descendants: true });
  1378. }
  1379. ViewChildrenMetadata = __decorate([
  1380. lang_1.CONST(),
  1381. __metadata('design:paramtypes', [Object])
  1382. ], ViewChildrenMetadata);
  1383. return ViewChildrenMetadata;
  1384. })(ViewQueryMetadata);
  1385. exports.ViewChildrenMetadata = ViewChildrenMetadata;
  1386. /**
  1387. * Configures a view query.
  1388. *
  1389. * View queries are set before the `ngAfterViewInit` callback is called.
  1390. *
  1391. * ### Example
  1392. *
  1393. * ```
  1394. * @Component({
  1395. * selector: 'someDir',
  1396. * templateUrl: 'someTemplate',
  1397. * directives: [ItemDirective]
  1398. * })
  1399. * class SomeDir {
  1400. * @ViewChild(ItemDirective) viewChild:ItemDirective;
  1401. *
  1402. * ngAfterViewInit() {
  1403. * // viewChild is set
  1404. * }
  1405. * }
  1406. * ```
  1407. */
  1408. var ViewChildMetadata = (function (_super) {
  1409. __extends(ViewChildMetadata, _super);
  1410. function ViewChildMetadata(_selector) {
  1411. _super.call(this, _selector, { descendants: true, first: true });
  1412. }
  1413. ViewChildMetadata = __decorate([
  1414. lang_1.CONST(),
  1415. __metadata('design:paramtypes', [Object])
  1416. ], ViewChildMetadata);
  1417. return ViewChildMetadata;
  1418. })(ViewQueryMetadata);
  1419. exports.ViewChildMetadata = ViewChildMetadata;
  1420. /***/ },
  1421. /* 5 */
  1422. /***/ function(module, exports) {
  1423. /* WEBPACK VAR INJECTION */(function(global) {var __extends = (this && this.__extends) || function (d, b) {
  1424. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  1425. function __() { this.constructor = d; }
  1426. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  1427. };
  1428. var globalScope;
  1429. if (typeof window === 'undefined') {
  1430. if (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope) {
  1431. // TODO: Replace any with WorkerGlobalScope from lib.webworker.d.ts #3492
  1432. globalScope = self;
  1433. }
  1434. else {
  1435. globalScope = global;
  1436. }
  1437. }
  1438. else {
  1439. globalScope = window;
  1440. }
  1441. ;
  1442. exports.IS_DART = false;
  1443. // Need to declare a new variable for global here since TypeScript
  1444. // exports the original value of the symbol.
  1445. var _global = globalScope;
  1446. exports.global = _global;
  1447. exports.Type = Function;
  1448. function getTypeNameForDebugging(type) {
  1449. return type['name'];
  1450. }
  1451. exports.getTypeNameForDebugging = getTypeNameForDebugging;
  1452. exports.Math = _global.Math;
  1453. exports.Date = _global.Date;
  1454. var _devMode = true;
  1455. var _modeLocked = false;
  1456. function lockMode() {
  1457. _modeLocked = true;
  1458. }
  1459. exports.lockMode = lockMode;
  1460. /**
  1461. * Disable Angular's development mode, which turns off assertions and other
  1462. * checks within the framework.
  1463. *
  1464. * One important assertion this disables verifies that a change detection pass
  1465. * does not result in additional changes to any bindings (also known as
  1466. * unidirectional data flow).
  1467. */
  1468. function enableProdMode() {
  1469. if (_modeLocked) {
  1470. // Cannot use BaseException as that ends up importing from facade/lang.
  1471. throw 'Cannot enable prod mode after platform setup.';
  1472. }
  1473. _devMode = false;
  1474. }
  1475. exports.enableProdMode = enableProdMode;
  1476. function assertionsEnabled() {
  1477. return _devMode;
  1478. }
  1479. exports.assertionsEnabled = assertionsEnabled;
  1480. // TODO: remove calls to assert in production environment
  1481. // Note: Can't just export this and import in in other files
  1482. // as `assert` is a reserved keyword in Dart
  1483. _global.assert = function assert(condition) {
  1484. // TODO: to be fixed properly via #2830, noop for now
  1485. };
  1486. // This function is needed only to properly support Dart's const expressions
  1487. // see https://github.com/angular/ts2dart/pull/151 for more info
  1488. function CONST_EXPR(expr) {
  1489. return expr;
  1490. }
  1491. exports.CONST_EXPR = CONST_EXPR;
  1492. function CONST() {
  1493. return function (target) { return target; };
  1494. }
  1495. exports.CONST = CONST;
  1496. function isPresent(obj) {
  1497. return obj !== undefined && obj !== null;
  1498. }
  1499. exports.isPresent = isPresent;
  1500. function isBlank(obj) {
  1501. return obj === undefined || obj === null;
  1502. }
  1503. exports.isBlank = isBlank;
  1504. function isString(obj) {
  1505. return typeof obj === "string";
  1506. }
  1507. exports.isString = isString;
  1508. function isFunction(obj) {
  1509. return typeof obj === "function";
  1510. }
  1511. exports.isFunction = isFunction;
  1512. function isType(obj) {
  1513. return isFunction(obj);
  1514. }
  1515. exports.isType = isType;
  1516. function isStringMap(obj) {
  1517. return typeof obj === 'object' && obj !== null;
  1518. }
  1519. exports.isStringMap = isStringMap;
  1520. function isPromise(obj) {
  1521. return obj instanceof _global.Promise;
  1522. }
  1523. exports.isPromise = isPromise;
  1524. function isArray(obj) {
  1525. return Array.isArray(obj);
  1526. }
  1527. exports.isArray = isArray;
  1528. function isNumber(obj) {
  1529. return typeof obj === 'number';
  1530. }
  1531. exports.isNumber = isNumber;
  1532. function isDate(obj) {
  1533. return obj instanceof exports.Date && !isNaN(obj.valueOf());
  1534. }
  1535. exports.isDate = isDate;
  1536. function noop() { }
  1537. exports.noop = noop;
  1538. function stringify(token) {
  1539. if (typeof token === 'string') {
  1540. return token;
  1541. }
  1542. if (token === undefined || token === null) {
  1543. return '' + token;
  1544. }
  1545. if (token.name) {
  1546. return token.name;
  1547. }
  1548. var res = token.toString();
  1549. var newLineIndex = res.indexOf("\n");
  1550. return (newLineIndex === -1) ? res : res.substring(0, newLineIndex);
  1551. }
  1552. exports.stringify = stringify;
  1553. // serialize / deserialize enum exist only for consistency with dart API
  1554. // enums in typescript don't need to be serialized
  1555. function serializeEnum(val) {
  1556. return val;
  1557. }
  1558. exports.serializeEnum = serializeEnum;
  1559. function deserializeEnum(val, values) {
  1560. return val;
  1561. }
  1562. exports.deserializeEnum = deserializeEnum;
  1563. var StringWrapper = (function () {
  1564. function StringWrapper() {
  1565. }
  1566. StringWrapper.fromCharCode = function (code) { return String.fromCharCode(code); };
  1567. StringWrapper.charCodeAt = function (s, index) { return s.charCodeAt(index); };
  1568. StringWrapper.split = function (s, regExp) { return s.split(regExp); };
  1569. StringWrapper.equals = function (s, s2) { return s === s2; };
  1570. StringWrapper.stripLeft = function (s, charVal) {
  1571. if (s && s.length) {
  1572. var pos = 0;
  1573. for (var i = 0; i < s.length; i++) {
  1574. if (s[i] != charVal)
  1575. break;
  1576. pos++;
  1577. }
  1578. s = s.substring(pos);
  1579. }
  1580. return s;
  1581. };
  1582. StringWrapper.stripRight = function (s, charVal) {
  1583. if (s && s.length) {
  1584. var pos = s.length;
  1585. for (var i = s.length - 1; i >= 0; i--) {
  1586. if (s[i] != charVal)
  1587. break;
  1588. pos--;
  1589. }
  1590. s = s.substring(0, pos);
  1591. }
  1592. return s;
  1593. };
  1594. StringWrapper.replace = function (s, from, replace) {
  1595. return s.replace(from, replace);
  1596. };
  1597. StringWrapper.replaceAll = function (s, from, replace) {
  1598. return s.replace(from, replace);
  1599. };
  1600. StringWrapper.slice = function (s, from, to) {
  1601. if (from === void 0) { from = 0; }
  1602. if (to === void 0) { to = null; }
  1603. return s.slice(from, to === null ? undefined : to);
  1604. };
  1605. StringWrapper.replaceAllMapped = function (s, from, cb) {
  1606. return s.replace(from, function () {
  1607. var matches = [];
  1608. for (var _i = 0; _i < arguments.length; _i++) {
  1609. matches[_i - 0] = arguments[_i];
  1610. }
  1611. // Remove offset & string from the result array
  1612. matches.splice(-2, 2);
  1613. // The callback receives match, p1, ..., pn
  1614. return cb(matches);
  1615. });
  1616. };
  1617. StringWrapper.contains = function (s, substr) { return s.indexOf(substr) != -1; };
  1618. StringWrapper.compare = function (a, b) {
  1619. if (a < b) {
  1620. return -1;
  1621. }
  1622. else if (a > b) {
  1623. return 1;
  1624. }
  1625. else {
  1626. return 0;
  1627. }
  1628. };
  1629. return StringWrapper;
  1630. })();
  1631. exports.StringWrapper = StringWrapper;
  1632. var StringJoiner = (function () {
  1633. function StringJoiner(parts) {
  1634. if (parts === void 0) { parts = []; }
  1635. this.parts = parts;
  1636. }
  1637. StringJoiner.prototype.add = function (part) { this.parts.push(part); };
  1638. StringJoiner.prototype.toString = function () { return this.parts.join(""); };
  1639. return StringJoiner;
  1640. })();
  1641. exports.StringJoiner = StringJoiner;
  1642. var NumberParseError = (function (_super) {
  1643. __extends(NumberParseError, _super);
  1644. function NumberParseError(message) {
  1645. _super.call(this);
  1646. this.message = message;
  1647. }
  1648. NumberParseError.prototype.toString = function () { return this.message; };
  1649. return NumberParseError;
  1650. })(Error);
  1651. exports.NumberParseError = NumberParseError;
  1652. var NumberWrapper = (function () {
  1653. function NumberWrapper() {
  1654. }
  1655. NumberWrapper.toFixed = function (n, fractionDigits) { return n.toFixed(fractionDigits); };
  1656. NumberWrapper.equal = function (a, b) { return a === b; };
  1657. NumberWrapper.parseIntAutoRadix = function (text) {
  1658. var result = parseInt(text);
  1659. if (isNaN(result)) {
  1660. throw new NumberParseError("Invalid integer literal when parsing " + text);
  1661. }
  1662. return result;
  1663. };
  1664. NumberWrapper.parseInt = function (text, radix) {
  1665. if (radix == 10) {
  1666. if (/^(\-|\+)?[0-9]+$/.test(text)) {
  1667. return parseInt(text, radix);
  1668. }
  1669. }
  1670. else if (radix == 16) {
  1671. if (/^(\-|\+)?[0-9ABCDEFabcdef]+$/.test(text)) {
  1672. return parseInt(text, radix);
  1673. }
  1674. }
  1675. else {
  1676. var result = parseInt(text, radix);
  1677. if (!isNaN(result)) {
  1678. return result;
  1679. }
  1680. }
  1681. throw new NumberParseError("Invalid integer literal when parsing " + text + " in base " +
  1682. radix);
  1683. };
  1684. // TODO: NaN is a valid literal but is returned by parseFloat to indicate an error.
  1685. NumberWrapper.parseFloat = function (text) { return parseFloat(text); };
  1686. Object.defineProperty(NumberWrapper, "NaN", {
  1687. get: function () { return NaN; },
  1688. enumerable: true,
  1689. configurable: true
  1690. });
  1691. NumberWrapper.isNaN = function (value) { return isNaN(value); };
  1692. NumberWrapper.isInteger = function (value) { return Number.isInteger(value); };
  1693. return NumberWrapper;
  1694. })();
  1695. exports.NumberWrapper = NumberWrapper;
  1696. exports.RegExp = _global.RegExp;
  1697. var RegExpWrapper = (function () {
  1698. function RegExpWrapper() {
  1699. }
  1700. RegExpWrapper.create = function (regExpStr, flags) {
  1701. if (flags === void 0) { flags = ''; }
  1702. flags = flags.replace(/g/g, '');
  1703. return new _global.RegExp(regExpStr, flags + 'g');
  1704. };
  1705. RegExpWrapper.firstMatch = function (regExp, input) {
  1706. // Reset multimatch regex state
  1707. regExp.lastIndex = 0;
  1708. return regExp.exec(input);
  1709. };
  1710. RegExpWrapper.test = function (regExp, input) {
  1711. regExp.lastIndex = 0;
  1712. return regExp.test(input);
  1713. };
  1714. RegExpWrapper.matcher = function (regExp, input) {
  1715. // Reset regex state for the case
  1716. // someone did not loop over all matches
  1717. // last time.
  1718. regExp.lastIndex = 0;
  1719. return { re: regExp, input: input };
  1720. };
  1721. return RegExpWrapper;
  1722. })();
  1723. exports.RegExpWrapper = RegExpWrapper;
  1724. var RegExpMatcherWrapper = (function () {
  1725. function RegExpMatcherWrapper() {
  1726. }
  1727. RegExpMatcherWrapper.next = function (matcher) {
  1728. return matcher.re.exec(matcher.input);
  1729. };
  1730. return RegExpMatcherWrapper;
  1731. })();
  1732. exports.RegExpMatcherWrapper = RegExpMatcherWrapper;
  1733. var FunctionWrapper = (function () {
  1734. function FunctionWrapper() {
  1735. }
  1736. FunctionWrapper.apply = function (fn, posArgs) { return fn.apply(null, posArgs); };
  1737. return FunctionWrapper;
  1738. })();
  1739. exports.FunctionWrapper = FunctionWrapper;
  1740. // JS has NaN !== NaN
  1741. function looseIdentical(a, b) {
  1742. return a === b || typeof a === "number" && typeof b === "number" && isNaN(a) && isNaN(b);
  1743. }
  1744. exports.looseIdentical = looseIdentical;
  1745. // JS considers NaN is the same as NaN for map Key (while NaN !== NaN otherwise)
  1746. // see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
  1747. function getMapKey(value) {
  1748. return value;
  1749. }
  1750. exports.getMapKey = getMapKey;
  1751. function normalizeBlank(obj) {
  1752. return isBlank(obj) ? null : obj;
  1753. }
  1754. exports.normalizeBlank = normalizeBlank;
  1755. function normalizeBool(obj) {
  1756. return isBlank(obj) ? false : obj;
  1757. }
  1758. exports.normalizeBool = normalizeBool;
  1759. function isJsObject(o) {
  1760. return o !== null && (typeof o === "function" || typeof o === "object");
  1761. }
  1762. exports.isJsObject = isJsObject;
  1763. function print(obj) {
  1764. console.log(obj);
  1765. }
  1766. exports.print = print;
  1767. // Can't be all uppercase as our transpiler would think it is a special directive...
  1768. var Json = (function () {
  1769. function Json() {
  1770. }
  1771. Json.parse = function (s) { return _global.JSON.parse(s); };
  1772. Json.stringify = function (data) {
  1773. // Dart doesn't take 3 arguments
  1774. return _global.JSON.stringify(data, null, 2);
  1775. };
  1776. return Json;
  1777. })();
  1778. exports.Json = Json;
  1779. var DateWrapper = (function () {
  1780. function DateWrapper() {
  1781. }
  1782. DateWrapper.create = function (year, month, day, hour, minutes, seconds, milliseconds) {
  1783. if (month === void 0) { month = 1; }
  1784. if (day === void 0) { day = 1; }
  1785. if (hour === void 0) { hour = 0; }
  1786. if (minutes === void 0) { minutes = 0; }
  1787. if (seconds === void 0) { seconds = 0; }
  1788. if (milliseconds === void 0) { milliseconds = 0; }
  1789. return new exports.Date(year, month - 1, day, hour, minutes, seconds, milliseconds);
  1790. };
  1791. DateWrapper.fromISOString = function (str) { return new exports.Date(str); };
  1792. DateWrapper.fromMillis = function (ms) { return new exports.Date(ms); };
  1793. DateWrapper.toMillis = function (date) { return date.getTime(); };
  1794. DateWrapper.now = function () { return new exports.Date(); };
  1795. DateWrapper.toJson = function (date) { return date.toJSON(); };
  1796. return DateWrapper;
  1797. })();
  1798. exports.DateWrapper = DateWrapper;
  1799. function setValueOnPath(global, path, value) {
  1800. var parts = path.split('.');
  1801. var obj = global;
  1802. while (parts.length > 1) {
  1803. var name = parts.shift();
  1804. if (obj.hasOwnProperty(name) && isPresent(obj[name])) {
  1805. obj = obj[name];
  1806. }
  1807. else {
  1808. obj = obj[name] = {};
  1809. }
  1810. }
  1811. if (obj === undefined || obj === null) {
  1812. obj = {};
  1813. }
  1814. obj[parts.shift()] = value;
  1815. }
  1816. exports.setValueOnPath = setValueOnPath;
  1817. var _symbolIterator = null;
  1818. function getSymbolIterator() {
  1819. if (isBlank(_symbolIterator)) {
  1820. if (isPresent(Symbol) && isPresent(Symbol.iterator)) {
  1821. _symbolIterator = Symbol.iterator;
  1822. }
  1823. else {
  1824. // es6-shim specific logic
  1825. var keys = Object.getOwnPropertyNames(Map.prototype);
  1826. for (var i = 0; i < keys.length; ++i) {
  1827. var key = keys[i];
  1828. if (key !== 'entries' && key !== 'size' &&
  1829. Map.prototype[key] === Map.prototype['entries']) {
  1830. _symbolIterator = key;
  1831. }
  1832. }
  1833. }
  1834. }
  1835. return _symbolIterator;
  1836. }
  1837. exports.getSymbolIterator = getSymbolIterator;
  1838. /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))
  1839. /***/ },
  1840. /* 6 */
  1841. /***/ function(module, exports, __webpack_require__) {
  1842. /**
  1843. * @module
  1844. * @description
  1845. * The `di` module provides dependency injection container services.
  1846. */
  1847. function __export(m) {
  1848. for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
  1849. }
  1850. var metadata_1 = __webpack_require__(7);
  1851. exports.InjectMetadata = metadata_1.InjectMetadata;
  1852. exports.OptionalMetadata = metadata_1.OptionalMetadata;
  1853. exports.InjectableMetadata = metadata_1.InjectableMetadata;
  1854. exports.SelfMetadata = metadata_1.SelfMetadata;
  1855. exports.HostMetadata = metadata_1.HostMetadata;
  1856. exports.SkipSelfMetadata = metadata_1.SkipSelfMetadata;
  1857. exports.DependencyMetadata = metadata_1.DependencyMetadata;
  1858. // we have to reexport * because Dart and TS export two different sets of types
  1859. __export(__webpack_require__(8));
  1860. var forward_ref_1 = __webpack_require__(10);
  1861. exports.forwardRef = forward_ref_1.forwardRef;
  1862. exports.resolveForwardRef = forward_ref_1.resolveForwardRef;
  1863. var injector_1 = __webpack_require__(11);
  1864. exports.Injector = injector_1.Injector;
  1865. var provider_1 = __webpack_require__(13);
  1866. exports.Binding = provider_1.Binding;
  1867. exports.ProviderBuilder = provider_1.ProviderBuilder;
  1868. exports.ResolvedFactory = provider_1.ResolvedFactory;
  1869. exports.Dependency = provider_1.Dependency;
  1870. exports.bind = provider_1.bind;
  1871. exports.Provider = provider_1.Provider;
  1872. exports.provide = provider_1.provide;
  1873. var key_1 = __webpack_require__(19);
  1874. exports.Key = key_1.Key;
  1875. exports.TypeLiteral = key_1.TypeLiteral;
  1876. var exceptions_1 = __webpack_require__(21);
  1877. exports.NoProviderError = exceptions_1.NoProviderError;
  1878. exports.AbstractProviderError = exceptions_1.AbstractProviderError;
  1879. exports.CyclicDependencyError = exceptions_1.CyclicDependencyError;
  1880. exports.InstantiationError = exceptions_1.InstantiationError;
  1881. exports.InvalidProviderError = exceptions_1.InvalidProviderError;
  1882. exports.NoAnnotationError = exceptions_1.NoAnnotationError;
  1883. exports.OutOfBoundsError = exceptions_1.OutOfBoundsError;
  1884. var opaque_token_1 = __webpack_require__(22);
  1885. exports.OpaqueToken = opaque_token_1.OpaqueToken;
  1886. /***/ },
  1887. /* 7 */
  1888. /***/ function(module, exports, __webpack_require__) {
  1889. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  1890. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  1891. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  1892. 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;
  1893. return c > 3 && r && Object.defineProperty(target, key, r), r;
  1894. };
  1895. var __metadata = (this && this.__metadata) || function (k, v) {
  1896. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  1897. };
  1898. var lang_1 = __webpack_require__(5);
  1899. /**
  1900. * A parameter metadata that specifies a dependency.
  1901. *
  1902. * ### Example ([live demo](http://plnkr.co/edit/6uHYJK?p=preview))
  1903. *
  1904. * ```typescript
  1905. * class Engine {}
  1906. *
  1907. * @Injectable()
  1908. * class Car {
  1909. * engine;
  1910. * constructor(@Inject("MyEngine") engine:Engine) {
  1911. * this.engine = engine;
  1912. * }
  1913. * }
  1914. *
  1915. * var injector = Injector.resolveAndCreate([
  1916. * provide("MyEngine", {useClass: Engine}),
  1917. * Car
  1918. * ]);
  1919. *
  1920. * expect(injector.get(Car).engine instanceof Engine).toBe(true);
  1921. * ```
  1922. *
  1923. * When `@Inject()` is not present, {@link Injector} will use the type annotation of the parameter.
  1924. *
  1925. * ### Example
  1926. *
  1927. * ```typescript
  1928. * class Engine {}
  1929. *
  1930. * @Injectable()
  1931. * class Car {
  1932. * constructor(public engine: Engine) {} //same as constructor(@Inject(Engine) engine:Engine)
  1933. * }
  1934. *
  1935. * var injector = Injector.resolveAndCreate([Engine, Car]);
  1936. * expect(injector.get(Car).engine instanceof Engine).toBe(true);
  1937. * ```
  1938. */
  1939. var InjectMetadata = (function () {
  1940. function InjectMetadata(token) {
  1941. this.token = token;
  1942. }
  1943. InjectMetadata.prototype.toString = function () { return "@Inject(" + lang_1.stringify(this.token) + ")"; };
  1944. InjectMetadata = __decorate([
  1945. lang_1.CONST(),
  1946. __metadata('design:paramtypes', [Object])
  1947. ], InjectMetadata);
  1948. return InjectMetadata;
  1949. })();
  1950. exports.InjectMetadata = InjectMetadata;
  1951. /**
  1952. * A parameter metadata that marks a dependency as optional. {@link Injector} provides `null` if
  1953. * the dependency is not found.
  1954. *
  1955. * ### Example ([live demo](http://plnkr.co/edit/AsryOm?p=preview))
  1956. *
  1957. * ```typescript
  1958. * class Engine {}
  1959. *
  1960. * @Injectable()
  1961. * class Car {
  1962. * engine;
  1963. * constructor(@Optional() engine:Engine) {
  1964. * this.engine = engine;
  1965. * }
  1966. * }
  1967. *
  1968. * var injector = Injector.resolveAndCreate([Car]);
  1969. * expect(injector.get(Car).engine).toBeNull();
  1970. * ```
  1971. */
  1972. var OptionalMetadata = (function () {
  1973. function OptionalMetadata() {
  1974. }
  1975. OptionalMetadata.prototype.toString = function () { return "@Optional()"; };
  1976. OptionalMetadata = __decorate([
  1977. lang_1.CONST(),
  1978. __metadata('design:paramtypes', [])
  1979. ], OptionalMetadata);
  1980. return OptionalMetadata;
  1981. })();
  1982. exports.OptionalMetadata = OptionalMetadata;
  1983. /**
  1984. * `DependencyMetadata` is used by the framework to extend DI.
  1985. * This is internal to Angular and should not be used directly.
  1986. */
  1987. var DependencyMetadata = (function () {
  1988. function DependencyMetadata() {
  1989. }
  1990. Object.defineProperty(DependencyMetadata.prototype, "token", {
  1991. get: function () { return null; },
  1992. enumerable: true,
  1993. configurable: true
  1994. });
  1995. DependencyMetadata = __decorate([
  1996. lang_1.CONST(),
  1997. __metadata('design:paramtypes', [])
  1998. ], DependencyMetadata);
  1999. return DependencyMetadata;
  2000. })();
  2001. exports.DependencyMetadata = DependencyMetadata;
  2002. /**
  2003. * A marker metadata that marks a class as available to {@link Injector} for creation.
  2004. *
  2005. * ### Example ([live demo](http://plnkr.co/edit/Wk4DMQ?p=preview))
  2006. *
  2007. * ```typescript
  2008. * @Injectable()
  2009. * class UsefulService {}
  2010. *
  2011. * @Injectable()
  2012. * class NeedsService {
  2013. * constructor(public service:UsefulService) {}
  2014. * }
  2015. *
  2016. * var injector = Injector.resolveAndCreate([NeedsService, UsefulService]);
  2017. * expect(injector.get(NeedsService).service instanceof UsefulService).toBe(true);
  2018. * ```
  2019. * {@link Injector} will throw {@link NoAnnotationError} when trying to instantiate a class that
  2020. * does not have `@Injectable` marker, as shown in the example below.
  2021. *
  2022. * ```typescript
  2023. * class UsefulService {}
  2024. *
  2025. * class NeedsService {
  2026. * constructor(public service:UsefulService) {}
  2027. * }
  2028. *
  2029. * var injector = Injector.resolveAndCreate([NeedsService, UsefulService]);
  2030. * expect(() => injector.get(NeedsService)).toThrowError();
  2031. * ```
  2032. */
  2033. var InjectableMetadata = (function () {
  2034. function InjectableMetadata() {
  2035. }
  2036. InjectableMetadata = __decorate([
  2037. lang_1.CONST(),
  2038. __metadata('design:paramtypes', [])
  2039. ], InjectableMetadata);
  2040. return InjectableMetadata;
  2041. })();
  2042. exports.InjectableMetadata = InjectableMetadata;
  2043. /**
  2044. * Specifies that an {@link Injector} should retrieve a dependency only from itself.
  2045. *
  2046. * ### Example ([live demo](http://plnkr.co/edit/NeagAg?p=preview))
  2047. *
  2048. * ```typescript
  2049. * class Dependency {
  2050. * }
  2051. *
  2052. * @Injectable()
  2053. * class NeedsDependency {
  2054. * dependency;
  2055. * constructor(@Self() dependency:Dependency) {
  2056. * this.dependency = dependency;
  2057. * }
  2058. * }
  2059. *
  2060. * var inj = Injector.resolveAndCreate([Dependency, NeedsDependency]);
  2061. * var nd = inj.get(NeedsDependency);
  2062. *
  2063. * expect(nd.dependency instanceof Dependency).toBe(true);
  2064. *
  2065. * var inj = Injector.resolveAndCreate([Dependency]);
  2066. * var child = inj.resolveAndCreateChild([NeedsDependency]);
  2067. * expect(() => child.get(NeedsDependency)).toThrowError();
  2068. * ```
  2069. */
  2070. var SelfMetadata = (function () {
  2071. function SelfMetadata() {
  2072. }
  2073. SelfMetadata.prototype.toString = function () { return "@Self()"; };
  2074. SelfMetadata = __decorate([
  2075. lang_1.CONST(),
  2076. __metadata('design:paramtypes', [])
  2077. ], SelfMetadata);
  2078. return SelfMetadata;
  2079. })();
  2080. exports.SelfMetadata = SelfMetadata;
  2081. /**
  2082. * Specifies that the dependency resolution should start from the parent injector.
  2083. *
  2084. * ### Example ([live demo](http://plnkr.co/edit/Wchdzb?p=preview))
  2085. *
  2086. * ```typescript
  2087. * class Dependency {
  2088. * }
  2089. *
  2090. * @Injectable()
  2091. * class NeedsDependency {
  2092. * dependency;
  2093. * constructor(@SkipSelf() dependency:Dependency) {
  2094. * this.dependency = dependency;
  2095. * }
  2096. * }
  2097. *
  2098. * var parent = Injector.resolveAndCreate([Dependency]);
  2099. * var child = parent.resolveAndCreateChild([NeedsDependency]);
  2100. * expect(child.get(NeedsDependency).dependency instanceof Depedency).toBe(true);
  2101. *
  2102. * var inj = Injector.resolveAndCreate([Dependency, NeedsDependency]);
  2103. * expect(() => inj.get(NeedsDependency)).toThrowError();
  2104. * ```
  2105. */
  2106. var SkipSelfMetadata = (function () {
  2107. function SkipSelfMetadata() {
  2108. }
  2109. SkipSelfMetadata.prototype.toString = function () { return "@SkipSelf()"; };
  2110. SkipSelfMetadata = __decorate([
  2111. lang_1.CONST(),
  2112. __metadata('design:paramtypes', [])
  2113. ], SkipSelfMetadata);
  2114. return SkipSelfMetadata;
  2115. })();
  2116. exports.SkipSelfMetadata = SkipSelfMetadata;
  2117. /**
  2118. * Specifies that an injector should retrieve a dependency from any injector until reaching the
  2119. * closest host.
  2120. *
  2121. * In Angular, a component element is automatically declared as a host for all the injectors in
  2122. * its view.
  2123. *
  2124. * ### Example ([live demo](http://plnkr.co/edit/GX79pV?p=preview))
  2125. *
  2126. * In the following example `App` contains `ParentCmp`, which contains `ChildDirective`.
  2127. * So `ParentCmp` is the host of `ChildDirective`.
  2128. *
  2129. * `ChildDirective` depends on two services: `HostService` and `OtherService`.
  2130. * `HostService` is defined at `ParentCmp`, and `OtherService` is defined at `App`.
  2131. *
  2132. *```typescript
  2133. * class OtherService {}
  2134. * class HostService {}
  2135. *
  2136. * @Directive({
  2137. * selector: 'child-directive'
  2138. * })
  2139. * class ChildDirective {
  2140. * constructor(@Optional() @Host() os:OtherService, @Optional() @Host() hs:HostService){
  2141. * console.log("os is null", os);
  2142. * console.log("hs is NOT null", hs);
  2143. * }
  2144. * }
  2145. *
  2146. * @Component({
  2147. * selector: 'parent-cmp',
  2148. * providers: [HostService],
  2149. * template: `
  2150. * Dir: <child-directive></child-directive>
  2151. * `,
  2152. * directives: [ChildDirective]
  2153. * })
  2154. * class ParentCmp {
  2155. * }
  2156. *
  2157. * @Component({
  2158. * selector: 'app',
  2159. * providers: [OtherService],
  2160. * template: `
  2161. * Parent: <parent-cmp></parent-cmp>
  2162. * `,
  2163. * directives: [ParentCmp]
  2164. * })
  2165. * class App {
  2166. * }
  2167. *
  2168. * bootstrap(App);
  2169. *```
  2170. */
  2171. var HostMetadata = (function () {
  2172. function HostMetadata() {
  2173. }
  2174. HostMetadata.prototype.toString = function () { return "@Host()"; };
  2175. HostMetadata = __decorate([
  2176. lang_1.CONST(),
  2177. __metadata('design:paramtypes', [])
  2178. ], HostMetadata);
  2179. return HostMetadata;
  2180. })();
  2181. exports.HostMetadata = HostMetadata;
  2182. /***/ },
  2183. /* 8 */
  2184. /***/ function(module, exports, __webpack_require__) {
  2185. var metadata_1 = __webpack_require__(7);
  2186. var decorators_1 = __webpack_require__(9);
  2187. /**
  2188. * Factory for creating {@link InjectMetadata}.
  2189. */
  2190. exports.Inject = decorators_1.makeParamDecorator(metadata_1.InjectMetadata);
  2191. /**
  2192. * Factory for creating {@link OptionalMetadata}.
  2193. */
  2194. exports.Optional = decorators_1.makeParamDecorator(metadata_1.OptionalMetadata);
  2195. /**
  2196. * Factory for creating {@link InjectableMetadata}.
  2197. */
  2198. exports.Injectable = decorators_1.makeDecorator(metadata_1.InjectableMetadata);
  2199. /**
  2200. * Factory for creating {@link SelfMetadata}.
  2201. */
  2202. exports.Self = decorators_1.makeParamDecorator(metadata_1.SelfMetadata);
  2203. /**
  2204. * Factory for creating {@link HostMetadata}.
  2205. */
  2206. exports.Host = decorators_1.makeParamDecorator(metadata_1.HostMetadata);
  2207. /**
  2208. * Factory for creating {@link SkipSelfMetadata}.
  2209. */
  2210. exports.SkipSelf = decorators_1.makeParamDecorator(metadata_1.SkipSelfMetadata);
  2211. /***/ },
  2212. /* 9 */
  2213. /***/ function(module, exports, __webpack_require__) {
  2214. var lang_1 = __webpack_require__(5);
  2215. function extractAnnotation(annotation) {
  2216. if (lang_1.isFunction(annotation) && annotation.hasOwnProperty('annotation')) {
  2217. // it is a decorator, extract annotation
  2218. annotation = annotation.annotation;
  2219. }
  2220. return annotation;
  2221. }
  2222. function applyParams(fnOrArray, key) {
  2223. if (fnOrArray === Object || fnOrArray === String || fnOrArray === Function ||
  2224. fnOrArray === Number || fnOrArray === Array) {
  2225. throw new Error("Can not use native " + lang_1.stringify(fnOrArray) + " as constructor");
  2226. }
  2227. if (lang_1.isFunction(fnOrArray)) {
  2228. return fnOrArray;
  2229. }
  2230. else if (fnOrArray instanceof Array) {
  2231. var annotations = fnOrArray;
  2232. var fn = fnOrArray[fnOrArray.length - 1];
  2233. if (!lang_1.isFunction(fn)) {
  2234. throw new Error("Last position of Class method array must be Function in key " + key + " was '" + lang_1.stringify(fn) + "'");
  2235. }
  2236. var annoLength = annotations.length - 1;
  2237. if (annoLength != fn.length) {
  2238. throw new Error("Number of annotations (" + annoLength + ") does not match number of arguments (" + fn.length + ") in the function: " + lang_1.stringify(fn));
  2239. }
  2240. var paramsAnnotations = [];
  2241. for (var i = 0, ii = annotations.length - 1; i < ii; i++) {
  2242. var paramAnnotations = [];
  2243. paramsAnnotations.push(paramAnnotations);
  2244. var annotation = annotations[i];
  2245. if (annotation instanceof Array) {
  2246. for (var j = 0; j < annotation.length; j++) {
  2247. paramAnnotations.push(extractAnnotation(annotation[j]));
  2248. }
  2249. }
  2250. else if (lang_1.isFunction(annotation)) {
  2251. paramAnnotations.push(extractAnnotation(annotation));
  2252. }
  2253. else {
  2254. paramAnnotations.push(annotation);
  2255. }
  2256. }
  2257. Reflect.defineMetadata('parameters', paramsAnnotations, fn);
  2258. return fn;
  2259. }
  2260. else {
  2261. throw new Error("Only Function or Array is supported in Class definition for key '" + key + "' is '" + lang_1.stringify(fnOrArray) + "'");
  2262. }
  2263. }
  2264. /**
  2265. * Provides a way for expressing ES6 classes with parameter annotations in ES5.
  2266. *
  2267. * ## Basic Example
  2268. *
  2269. * ```
  2270. * var Greeter = ng.Class({
  2271. * constructor: function(name) {
  2272. * this.name = name;
  2273. * },
  2274. *
  2275. * greet: function() {
  2276. * alert('Hello ' + this.name + '!');
  2277. * }
  2278. * });
  2279. * ```
  2280. *
  2281. * is equivalent to ES6:
  2282. *
  2283. * ```
  2284. * class Greeter {
  2285. * constructor(name) {
  2286. * this.name = name;
  2287. * }
  2288. *
  2289. * greet() {
  2290. * alert('Hello ' + this.name + '!');
  2291. * }
  2292. * }
  2293. * ```
  2294. *
  2295. * or equivalent to ES5:
  2296. *
  2297. * ```
  2298. * var Greeter = function (name) {
  2299. * this.name = name;
  2300. * }
  2301. *
  2302. * Greeter.prototype.greet = function () {
  2303. * alert('Hello ' + this.name + '!');
  2304. * }
  2305. * ```
  2306. *
  2307. * ### Example with parameter annotations
  2308. *
  2309. * ```
  2310. * var MyService = ng.Class({
  2311. * constructor: [String, [new Query(), QueryList], function(name, queryList) {
  2312. * ...
  2313. * }]
  2314. * });
  2315. * ```
  2316. *
  2317. * is equivalent to ES6:
  2318. *
  2319. * ```
  2320. * class MyService {
  2321. * constructor(name: string, @Query() queryList: QueryList) {
  2322. * ...
  2323. * }
  2324. * }
  2325. * ```
  2326. *
  2327. * ### Example with inheritance
  2328. *
  2329. * ```
  2330. * var Shape = ng.Class({
  2331. * constructor: (color) {
  2332. * this.color = color;
  2333. * }
  2334. * });
  2335. *
  2336. * var Square = ng.Class({
  2337. * extends: Shape,
  2338. * constructor: function(color, size) {
  2339. * Shape.call(this, color);
  2340. * this.size = size;
  2341. * }
  2342. * });
  2343. * ```
  2344. */
  2345. function Class(clsDef) {
  2346. var constructor = applyParams(clsDef.hasOwnProperty('constructor') ? clsDef.constructor : undefined, 'constructor');
  2347. var proto = constructor.prototype;
  2348. if (clsDef.hasOwnProperty('extends')) {
  2349. if (lang_1.isFunction(clsDef.extends)) {
  2350. constructor.prototype = proto =
  2351. Object.create(clsDef.extends.prototype);
  2352. }
  2353. else {
  2354. throw new Error("Class definition 'extends' property must be a constructor function was: " + lang_1.stringify(clsDef.extends));
  2355. }
  2356. }
  2357. for (var key in clsDef) {
  2358. if (key != 'extends' && key != 'prototype' && clsDef.hasOwnProperty(key)) {
  2359. proto[key] = applyParams(clsDef[key], key);
  2360. }
  2361. }
  2362. if (this && this.annotations instanceof Array) {
  2363. Reflect.defineMetadata('annotations', this.annotations, constructor);
  2364. }
  2365. return constructor;
  2366. }
  2367. exports.Class = Class;
  2368. var Reflect = lang_1.global.Reflect;
  2369. if (!(Reflect && Reflect.getMetadata)) {
  2370. throw 'reflect-metadata shim is required when using class decorators';
  2371. }
  2372. function makeDecorator(annotationCls, chainFn) {
  2373. if (chainFn === void 0) { chainFn = null; }
  2374. function DecoratorFactory(objOrType) {
  2375. var annotationInstance = new annotationCls(objOrType);
  2376. if (this instanceof annotationCls) {
  2377. return annotationInstance;
  2378. }
  2379. else {
  2380. var chainAnnotation = lang_1.isFunction(this) && this.annotations instanceof Array ? this.annotations : [];
  2381. chainAnnotation.push(annotationInstance);
  2382. var TypeDecorator = function TypeDecorator(cls) {
  2383. var annotations = Reflect.getOwnMetadata('annotations', cls);
  2384. annotations = annotations || [];
  2385. annotations.push(annotationInstance);
  2386. Reflect.defineMetadata('annotations', annotations, cls);
  2387. return cls;
  2388. };
  2389. TypeDecorator.annotations = chainAnnotation;
  2390. TypeDecorator.Class = Class;
  2391. if (chainFn)
  2392. chainFn(TypeDecorator);
  2393. return TypeDecorator;
  2394. }
  2395. }
  2396. DecoratorFactory.prototype = Object.create(annotationCls.prototype);
  2397. return DecoratorFactory;
  2398. }
  2399. exports.makeDecorator = makeDecorator;
  2400. function makeParamDecorator(annotationCls) {
  2401. function ParamDecoratorFactory() {
  2402. var args = [];
  2403. for (var _i = 0; _i < arguments.length; _i++) {
  2404. args[_i - 0] = arguments[_i];
  2405. }
  2406. var annotationInstance = Object.create(annotationCls.prototype);
  2407. annotationCls.apply(annotationInstance, args);
  2408. if (this instanceof annotationCls) {
  2409. return annotationInstance;
  2410. }
  2411. else {
  2412. ParamDecorator.annotation = annotationInstance;
  2413. return ParamDecorator;
  2414. }
  2415. function ParamDecorator(cls, unusedKey, index) {
  2416. var parameters = Reflect.getMetadata('parameters', cls);
  2417. parameters = parameters || [];
  2418. // there might be gaps if some in between parameters do not have annotations.
  2419. // we pad with nulls.
  2420. while (parameters.length <= index) {
  2421. parameters.push(null);
  2422. }
  2423. parameters[index] = parameters[index] || [];
  2424. var annotationsForParam = parameters[index];
  2425. annotationsForParam.push(annotationInstance);
  2426. Reflect.defineMetadata('parameters', parameters, cls);
  2427. return cls;
  2428. }
  2429. }
  2430. ParamDecoratorFactory.prototype = Object.create(annotationCls.prototype);
  2431. return ParamDecoratorFactory;
  2432. }
  2433. exports.makeParamDecorator = makeParamDecorator;
  2434. function makePropDecorator(decoratorCls) {
  2435. function PropDecoratorFactory() {
  2436. var args = [];
  2437. for (var _i = 0; _i < arguments.length; _i++) {
  2438. args[_i - 0] = arguments[_i];
  2439. }
  2440. var decoratorInstance = Object.create(decoratorCls.prototype);
  2441. decoratorCls.apply(decoratorInstance, args);
  2442. if (this instanceof decoratorCls) {
  2443. return decoratorInstance;
  2444. }
  2445. else {
  2446. return function PropDecorator(target, name) {
  2447. var meta = Reflect.getOwnMetadata('propMetadata', target.constructor);
  2448. meta = meta || {};
  2449. meta[name] = meta[name] || [];
  2450. meta[name].unshift(decoratorInstance);
  2451. Reflect.defineMetadata('propMetadata', meta, target.constructor);
  2452. };
  2453. }
  2454. }
  2455. PropDecoratorFactory.prototype = Object.create(decoratorCls.prototype);
  2456. return PropDecoratorFactory;
  2457. }
  2458. exports.makePropDecorator = makePropDecorator;
  2459. /***/ },
  2460. /* 10 */
  2461. /***/ function(module, exports, __webpack_require__) {
  2462. var lang_1 = __webpack_require__(5);
  2463. /**
  2464. * Allows to refer to references which are not yet defined.
  2465. *
  2466. * For instance, `forwardRef` is used when the `token` which we need to refer to for the purposes of
  2467. * DI is declared,
  2468. * but not yet defined. It is also used when the `token` which we use when creating a query is not
  2469. * yet defined.
  2470. *
  2471. * ### Example
  2472. * {@example core/di/ts/forward_ref/forward_ref.ts region='forward_ref'}
  2473. */
  2474. function forwardRef(forwardRefFn) {
  2475. forwardRefFn.__forward_ref__ = forwardRef;
  2476. forwardRefFn.toString = function () { return lang_1.stringify(this()); };
  2477. return forwardRefFn;
  2478. }
  2479. exports.forwardRef = forwardRef;
  2480. /**
  2481. * Lazily retrieves the reference value from a forwardRef.
  2482. *
  2483. * Acts as the identity function when given a non-forward-ref value.
  2484. *
  2485. * ### Example ([live demo](http://plnkr.co/edit/GU72mJrk1fiodChcmiDR?p=preview))
  2486. *
  2487. * ```typescript
  2488. * var ref = forwardRef(() => "refValue");
  2489. * expect(resolveForwardRef(ref)).toEqual("refValue");
  2490. * expect(resolveForwardRef("regularValue")).toEqual("regularValue");
  2491. * ```
  2492. *
  2493. * See: {@link forwardRef}
  2494. */
  2495. function resolveForwardRef(type) {
  2496. if (lang_1.isFunction(type) && type.hasOwnProperty('__forward_ref__') &&
  2497. type.__forward_ref__ === forwardRef) {
  2498. return type();
  2499. }
  2500. else {
  2501. return type;
  2502. }
  2503. }
  2504. exports.resolveForwardRef = resolveForwardRef;
  2505. /***/ },
  2506. /* 11 */
  2507. /***/ function(module, exports, __webpack_require__) {
  2508. var collection_1 = __webpack_require__(12);
  2509. var provider_1 = __webpack_require__(13);
  2510. var exceptions_1 = __webpack_require__(21);
  2511. var lang_1 = __webpack_require__(5);
  2512. var key_1 = __webpack_require__(19);
  2513. var metadata_1 = __webpack_require__(7);
  2514. // Threshold for the dynamic version
  2515. var _MAX_CONSTRUCTION_COUNTER = 10;
  2516. exports.UNDEFINED = lang_1.CONST_EXPR(new Object());
  2517. /**
  2518. * Visibility of a {@link Provider}.
  2519. */
  2520. (function (Visibility) {
  2521. /**
  2522. * A `Public` {@link Provider} is only visible to regular (as opposed to host) child injectors.
  2523. */
  2524. Visibility[Visibility["Public"] = 0] = "Public";
  2525. /**
  2526. * A `Private` {@link Provider} is only visible to host (as opposed to regular) child injectors.
  2527. */
  2528. Visibility[Visibility["Private"] = 1] = "Private";
  2529. /**
  2530. * A `PublicAndPrivate` {@link Provider} is visible to both host and regular child injectors.
  2531. */
  2532. Visibility[Visibility["PublicAndPrivate"] = 2] = "PublicAndPrivate";
  2533. })(exports.Visibility || (exports.Visibility = {}));
  2534. var Visibility = exports.Visibility;
  2535. function canSee(src, dst) {
  2536. return (src === dst) ||
  2537. (dst === Visibility.PublicAndPrivate || src === Visibility.PublicAndPrivate);
  2538. }
  2539. var ProtoInjectorInlineStrategy = (function () {
  2540. function ProtoInjectorInlineStrategy(protoEI, bwv) {
  2541. this.provider0 = null;
  2542. this.provider1 = null;
  2543. this.provider2 = null;
  2544. this.provider3 = null;
  2545. this.provider4 = null;
  2546. this.provider5 = null;
  2547. this.provider6 = null;
  2548. this.provider7 = null;
  2549. this.provider8 = null;
  2550. this.provider9 = null;
  2551. this.keyId0 = null;
  2552. this.keyId1 = null;
  2553. this.keyId2 = null;
  2554. this.keyId3 = null;
  2555. this.keyId4 = null;
  2556. this.keyId5 = null;
  2557. this.keyId6 = null;
  2558. this.keyId7 = null;
  2559. this.keyId8 = null;
  2560. this.keyId9 = null;
  2561. this.visibility0 = null;
  2562. this.visibility1 = null;
  2563. this.visibility2 = null;
  2564. this.visibility3 = null;
  2565. this.visibility4 = null;
  2566. this.visibility5 = null;
  2567. this.visibility6 = null;
  2568. this.visibility7 = null;
  2569. this.visibility8 = null;
  2570. this.visibility9 = null;
  2571. var length = bwv.length;
  2572. if (length > 0) {
  2573. this.provider0 = bwv[0].provider;
  2574. this.keyId0 = bwv[0].getKeyId();
  2575. this.visibility0 = bwv[0].visibility;
  2576. }
  2577. if (length > 1) {
  2578. this.provider1 = bwv[1].provider;
  2579. this.keyId1 = bwv[1].getKeyId();
  2580. this.visibility1 = bwv[1].visibility;
  2581. }
  2582. if (length > 2) {
  2583. this.provider2 = bwv[2].provider;
  2584. this.keyId2 = bwv[2].getKeyId();
  2585. this.visibility2 = bwv[2].visibility;
  2586. }
  2587. if (length > 3) {
  2588. this.provider3 = bwv[3].provider;
  2589. this.keyId3 = bwv[3].getKeyId();
  2590. this.visibility3 = bwv[3].visibility;
  2591. }
  2592. if (length > 4) {
  2593. this.provider4 = bwv[4].provider;
  2594. this.keyId4 = bwv[4].getKeyId();
  2595. this.visibility4 = bwv[4].visibility;
  2596. }
  2597. if (length > 5) {
  2598. this.provider5 = bwv[5].provider;
  2599. this.keyId5 = bwv[5].getKeyId();
  2600. this.visibility5 = bwv[5].visibility;
  2601. }
  2602. if (length > 6) {
  2603. this.provider6 = bwv[6].provider;
  2604. this.keyId6 = bwv[6].getKeyId();
  2605. this.visibility6 = bwv[6].visibility;
  2606. }
  2607. if (length > 7) {
  2608. this.provider7 = bwv[7].provider;
  2609. this.keyId7 = bwv[7].getKeyId();
  2610. this.visibility7 = bwv[7].visibility;
  2611. }
  2612. if (length > 8) {
  2613. this.provider8 = bwv[8].provider;
  2614. this.keyId8 = bwv[8].getKeyId();
  2615. this.visibility8 = bwv[8].visibility;
  2616. }
  2617. if (length > 9) {
  2618. this.provider9 = bwv[9].provider;
  2619. this.keyId9 = bwv[9].getKeyId();
  2620. this.visibility9 = bwv[9].visibility;
  2621. }
  2622. }
  2623. ProtoInjectorInlineStrategy.prototype.getProviderAtIndex = function (index) {
  2624. if (index == 0)
  2625. return this.provider0;
  2626. if (index == 1)
  2627. return this.provider1;
  2628. if (index == 2)
  2629. return this.provider2;
  2630. if (index == 3)
  2631. return this.provider3;
  2632. if (index == 4)
  2633. return this.provider4;
  2634. if (index == 5)
  2635. return this.provider5;
  2636. if (index == 6)
  2637. return this.provider6;
  2638. if (index == 7)
  2639. return this.provider7;
  2640. if (index == 8)
  2641. return this.provider8;
  2642. if (index == 9)
  2643. return this.provider9;
  2644. throw new exceptions_1.OutOfBoundsError(index);
  2645. };
  2646. ProtoInjectorInlineStrategy.prototype.createInjectorStrategy = function (injector) {
  2647. return new InjectorInlineStrategy(injector, this);
  2648. };
  2649. return ProtoInjectorInlineStrategy;
  2650. })();
  2651. exports.ProtoInjectorInlineStrategy = ProtoInjectorInlineStrategy;
  2652. var ProtoInjectorDynamicStrategy = (function () {
  2653. function ProtoInjectorDynamicStrategy(protoInj, bwv) {
  2654. var len = bwv.length;
  2655. this.providers = collection_1.ListWrapper.createFixedSize(len);
  2656. this.keyIds = collection_1.ListWrapper.createFixedSize(len);
  2657. this.visibilities = collection_1.ListWrapper.createFixedSize(len);
  2658. for (var i = 0; i < len; i++) {
  2659. this.providers[i] = bwv[i].provider;
  2660. this.keyIds[i] = bwv[i].getKeyId();
  2661. this.visibilities[i] = bwv[i].visibility;
  2662. }
  2663. }
  2664. ProtoInjectorDynamicStrategy.prototype.getProviderAtIndex = function (index) {
  2665. if (index < 0 || index >= this.providers.length) {
  2666. throw new exceptions_1.OutOfBoundsError(index);
  2667. }
  2668. return this.providers[index];
  2669. };
  2670. ProtoInjectorDynamicStrategy.prototype.createInjectorStrategy = function (ei) {
  2671. return new InjectorDynamicStrategy(this, ei);
  2672. };
  2673. return ProtoInjectorDynamicStrategy;
  2674. })();
  2675. exports.ProtoInjectorDynamicStrategy = ProtoInjectorDynamicStrategy;
  2676. var ProtoInjector = (function () {
  2677. function ProtoInjector(bwv) {
  2678. this.numberOfProviders = bwv.length;
  2679. this._strategy = bwv.length > _MAX_CONSTRUCTION_COUNTER ?
  2680. new ProtoInjectorDynamicStrategy(this, bwv) :
  2681. new ProtoInjectorInlineStrategy(this, bwv);
  2682. }
  2683. ProtoInjector.prototype.getProviderAtIndex = function (index) { return this._strategy.getProviderAtIndex(index); };
  2684. return ProtoInjector;
  2685. })();
  2686. exports.ProtoInjector = ProtoInjector;
  2687. var InjectorInlineStrategy = (function () {
  2688. function InjectorInlineStrategy(injector, protoStrategy) {
  2689. this.injector = injector;
  2690. this.protoStrategy = protoStrategy;
  2691. this.obj0 = exports.UNDEFINED;
  2692. this.obj1 = exports.UNDEFINED;
  2693. this.obj2 = exports.UNDEFINED;
  2694. this.obj3 = exports.UNDEFINED;
  2695. this.obj4 = exports.UNDEFINED;
  2696. this.obj5 = exports.UNDEFINED;
  2697. this.obj6 = exports.UNDEFINED;
  2698. this.obj7 = exports.UNDEFINED;
  2699. this.obj8 = exports.UNDEFINED;
  2700. this.obj9 = exports.UNDEFINED;
  2701. }
  2702. InjectorInlineStrategy.prototype.resetConstructionCounter = function () { this.injector._constructionCounter = 0; };
  2703. InjectorInlineStrategy.prototype.instantiateProvider = function (provider, visibility) {
  2704. return this.injector._new(provider, visibility);
  2705. };
  2706. InjectorInlineStrategy.prototype.attach = function (parent, isHost) {
  2707. var inj = this.injector;
  2708. inj._parent = parent;
  2709. inj._isHost = isHost;
  2710. };
  2711. InjectorInlineStrategy.prototype.getObjByKeyId = function (keyId, visibility) {
  2712. var p = this.protoStrategy;
  2713. var inj = this.injector;
  2714. if (p.keyId0 === keyId && canSee(p.visibility0, visibility)) {
  2715. if (this.obj0 === exports.UNDEFINED) {
  2716. this.obj0 = inj._new(p.provider0, p.visibility0);
  2717. }
  2718. return this.obj0;
  2719. }
  2720. if (p.keyId1 === keyId && canSee(p.visibility1, visibility)) {
  2721. if (this.obj1 === exports.UNDEFINED) {
  2722. this.obj1 = inj._new(p.provider1, p.visibility1);
  2723. }
  2724. return this.obj1;
  2725. }
  2726. if (p.keyId2 === keyId && canSee(p.visibility2, visibility)) {
  2727. if (this.obj2 === exports.UNDEFINED) {
  2728. this.obj2 = inj._new(p.provider2, p.visibility2);
  2729. }
  2730. return this.obj2;
  2731. }
  2732. if (p.keyId3 === keyId && canSee(p.visibility3, visibility)) {
  2733. if (this.obj3 === exports.UNDEFINED) {
  2734. this.obj3 = inj._new(p.provider3, p.visibility3);
  2735. }
  2736. return this.obj3;
  2737. }
  2738. if (p.keyId4 === keyId && canSee(p.visibility4, visibility)) {
  2739. if (this.obj4 === exports.UNDEFINED) {
  2740. this.obj4 = inj._new(p.provider4, p.visibility4);
  2741. }
  2742. return this.obj4;
  2743. }
  2744. if (p.keyId5 === keyId && canSee(p.visibility5, visibility)) {
  2745. if (this.obj5 === exports.UNDEFINED) {
  2746. this.obj5 = inj._new(p.provider5, p.visibility5);
  2747. }
  2748. return this.obj5;
  2749. }
  2750. if (p.keyId6 === keyId && canSee(p.visibility6, visibility)) {
  2751. if (this.obj6 === exports.UNDEFINED) {
  2752. this.obj6 = inj._new(p.provider6, p.visibility6);
  2753. }
  2754. return this.obj6;
  2755. }
  2756. if (p.keyId7 === keyId && canSee(p.visibility7, visibility)) {
  2757. if (this.obj7 === exports.UNDEFINED) {
  2758. this.obj7 = inj._new(p.provider7, p.visibility7);
  2759. }
  2760. return this.obj7;
  2761. }
  2762. if (p.keyId8 === keyId && canSee(p.visibility8, visibility)) {
  2763. if (this.obj8 === exports.UNDEFINED) {
  2764. this.obj8 = inj._new(p.provider8, p.visibility8);
  2765. }
  2766. return this.obj8;
  2767. }
  2768. if (p.keyId9 === keyId && canSee(p.visibility9, visibility)) {
  2769. if (this.obj9 === exports.UNDEFINED) {
  2770. this.obj9 = inj._new(p.provider9, p.visibility9);
  2771. }
  2772. return this.obj9;
  2773. }
  2774. return exports.UNDEFINED;
  2775. };
  2776. InjectorInlineStrategy.prototype.getObjAtIndex = function (index) {
  2777. if (index == 0)
  2778. return this.obj0;
  2779. if (index == 1)
  2780. return this.obj1;
  2781. if (index == 2)
  2782. return this.obj2;
  2783. if (index == 3)
  2784. return this.obj3;
  2785. if (index == 4)
  2786. return this.obj4;
  2787. if (index == 5)
  2788. return this.obj5;
  2789. if (index == 6)
  2790. return this.obj6;
  2791. if (index == 7)
  2792. return this.obj7;
  2793. if (index == 8)
  2794. return this.obj8;
  2795. if (index == 9)
  2796. return this.obj9;
  2797. throw new exceptions_1.OutOfBoundsError(index);
  2798. };
  2799. InjectorInlineStrategy.prototype.getMaxNumberOfObjects = function () { return _MAX_CONSTRUCTION_COUNTER; };
  2800. return InjectorInlineStrategy;
  2801. })();
  2802. exports.InjectorInlineStrategy = InjectorInlineStrategy;
  2803. var InjectorDynamicStrategy = (function () {
  2804. function InjectorDynamicStrategy(protoStrategy, injector) {
  2805. this.protoStrategy = protoStrategy;
  2806. this.injector = injector;
  2807. this.objs = collection_1.ListWrapper.createFixedSize(protoStrategy.providers.length);
  2808. collection_1.ListWrapper.fill(this.objs, exports.UNDEFINED);
  2809. }
  2810. InjectorDynamicStrategy.prototype.resetConstructionCounter = function () { this.injector._constructionCounter = 0; };
  2811. InjectorDynamicStrategy.prototype.instantiateProvider = function (provider, visibility) {
  2812. return this.injector._new(provider, visibility);
  2813. };
  2814. InjectorDynamicStrategy.prototype.attach = function (parent, isHost) {
  2815. var inj = this.injector;
  2816. inj._parent = parent;
  2817. inj._isHost = isHost;
  2818. };
  2819. InjectorDynamicStrategy.prototype.getObjByKeyId = function (keyId, visibility) {
  2820. var p = this.protoStrategy;
  2821. for (var i = 0; i < p.keyIds.length; i++) {
  2822. if (p.keyIds[i] === keyId && canSee(p.visibilities[i], visibility)) {
  2823. if (this.objs[i] === exports.UNDEFINED) {
  2824. this.objs[i] = this.injector._new(p.providers[i], p.visibilities[i]);
  2825. }
  2826. return this.objs[i];
  2827. }
  2828. }
  2829. return exports.UNDEFINED;
  2830. };
  2831. InjectorDynamicStrategy.prototype.getObjAtIndex = function (index) {
  2832. if (index < 0 || index >= this.objs.length) {
  2833. throw new exceptions_1.OutOfBoundsError(index);
  2834. }
  2835. return this.objs[index];
  2836. };
  2837. InjectorDynamicStrategy.prototype.getMaxNumberOfObjects = function () { return this.objs.length; };
  2838. return InjectorDynamicStrategy;
  2839. })();
  2840. exports.InjectorDynamicStrategy = InjectorDynamicStrategy;
  2841. var ProviderWithVisibility = (function () {
  2842. function ProviderWithVisibility(provider, visibility) {
  2843. this.provider = provider;
  2844. this.visibility = visibility;
  2845. }
  2846. ;
  2847. ProviderWithVisibility.prototype.getKeyId = function () { return this.provider.key.id; };
  2848. return ProviderWithVisibility;
  2849. })();
  2850. exports.ProviderWithVisibility = ProviderWithVisibility;
  2851. /**
  2852. * A dependency injection container used for instantiating objects and resolving dependencies.
  2853. *
  2854. * An `Injector` is a replacement for a `new` operator, which can automatically resolve the
  2855. * constructor dependencies.
  2856. *
  2857. * In typical use, application code asks for the dependencies in the constructor and they are
  2858. * resolved by the `Injector`.
  2859. *
  2860. * ### Example ([live demo](http://plnkr.co/edit/jzjec0?p=preview))
  2861. *
  2862. * The following example creates an `Injector` configured to create `Engine` and `Car`.
  2863. *
  2864. * ```typescript
  2865. * @Injectable()
  2866. * class Engine {
  2867. * }
  2868. *
  2869. * @Injectable()
  2870. * class Car {
  2871. * constructor(public engine:Engine) {}
  2872. * }
  2873. *
  2874. * var injector = Injector.resolveAndCreate([Car, Engine]);
  2875. * var car = injector.get(Car);
  2876. * expect(car instanceof Car).toBe(true);
  2877. * expect(car.engine instanceof Engine).toBe(true);
  2878. * ```
  2879. *
  2880. * Notice, we don't use the `new` operator because we explicitly want to have the `Injector`
  2881. * resolve all of the object's dependencies automatically.
  2882. */
  2883. var Injector = (function () {
  2884. /**
  2885. * Private
  2886. */
  2887. function Injector(_proto /* ProtoInjector */, _parent, _depProvider, _debugContext) {
  2888. if (_parent === void 0) { _parent = null; }
  2889. if (_depProvider === void 0) { _depProvider = null; }
  2890. if (_debugContext === void 0) { _debugContext = null; }
  2891. this._depProvider = _depProvider;
  2892. this._debugContext = _debugContext;
  2893. /** @internal */
  2894. this._isHost = false;
  2895. /** @internal */
  2896. this._constructionCounter = 0;
  2897. this._proto = _proto;
  2898. this._parent = _parent;
  2899. this._strategy = _proto._strategy.createInjectorStrategy(this);
  2900. }
  2901. /**
  2902. * Turns an array of provider definitions into an array of resolved providers.
  2903. *
  2904. * A resolution is a process of flattening multiple nested arrays and converting individual
  2905. * providers into an array of {@link ResolvedProvider}s.
  2906. *
  2907. * ### Example ([live demo](http://plnkr.co/edit/AiXTHi?p=preview))
  2908. *
  2909. * ```typescript
  2910. * @Injectable()
  2911. * class Engine {
  2912. * }
  2913. *
  2914. * @Injectable()
  2915. * class Car {
  2916. * constructor(public engine:Engine) {}
  2917. * }
  2918. *
  2919. * var providers = Injector.resolve([Car, [[Engine]]]);
  2920. *
  2921. * expect(providers.length).toEqual(2);
  2922. *
  2923. * expect(providers[0] instanceof ResolvedProvider).toBe(true);
  2924. * expect(providers[0].key.displayName).toBe("Car");
  2925. * expect(providers[0].dependencies.length).toEqual(1);
  2926. * expect(providers[0].factory).toBeDefined();
  2927. *
  2928. * expect(providers[1].key.displayName).toBe("Engine");
  2929. * });
  2930. * ```
  2931. *
  2932. * See {@link Injector#fromResolvedProviders} for more info.
  2933. */
  2934. Injector.resolve = function (providers) {
  2935. return provider_1.resolveProviders(providers);
  2936. };
  2937. /**
  2938. * Resolves an array of providers and creates an injector from those providers.
  2939. *
  2940. * The passed-in providers can be an array of `Type`, {@link Provider},
  2941. * or a recursive array of more providers.
  2942. *
  2943. * ### Example ([live demo](http://plnkr.co/edit/ePOccA?p=preview))
  2944. *
  2945. * ```typescript
  2946. * @Injectable()
  2947. * class Engine {
  2948. * }
  2949. *
  2950. * @Injectable()
  2951. * class Car {
  2952. * constructor(public engine:Engine) {}
  2953. * }
  2954. *
  2955. * var injector = Injector.resolveAndCreate([Car, Engine]);
  2956. * expect(injector.get(Car) instanceof Car).toBe(true);
  2957. * ```
  2958. *
  2959. * This function is slower than the corresponding `fromResolvedProviders`
  2960. * because it needs to resolve the passed-in providers first.
  2961. * See {@link Injector#resolve} and {@link Injector#fromResolvedProviders}.
  2962. */
  2963. Injector.resolveAndCreate = function (providers) {
  2964. var resolvedProviders = Injector.resolve(providers);
  2965. return Injector.fromResolvedProviders(resolvedProviders);
  2966. };
  2967. /**
  2968. * Creates an injector from previously resolved providers.
  2969. *
  2970. * This API is the recommended way to construct injectors in performance-sensitive parts.
  2971. *
  2972. * ### Example ([live demo](http://plnkr.co/edit/KrSMci?p=preview))
  2973. *
  2974. * ```typescript
  2975. * @Injectable()
  2976. * class Engine {
  2977. * }
  2978. *
  2979. * @Injectable()
  2980. * class Car {
  2981. * constructor(public engine:Engine) {}
  2982. * }
  2983. *
  2984. * var providers = Injector.resolve([Car, Engine]);
  2985. * var injector = Injector.fromResolvedProviders(providers);
  2986. * expect(injector.get(Car) instanceof Car).toBe(true);
  2987. * ```
  2988. */
  2989. Injector.fromResolvedProviders = function (providers) {
  2990. var bd = providers.map(function (b) { return new ProviderWithVisibility(b, Visibility.Public); });
  2991. var proto = new ProtoInjector(bd);
  2992. return new Injector(proto, null, null);
  2993. };
  2994. /**
  2995. * @deprecated
  2996. */
  2997. Injector.fromResolvedBindings = function (providers) {
  2998. return Injector.fromResolvedProviders(providers);
  2999. };
  3000. /**
  3001. * @internal
  3002. */
  3003. Injector.prototype.debugContext = function () { return this._debugContext(); };
  3004. /**
  3005. * Retrieves an instance from the injector based on the provided token.
  3006. * Throws {@link NoProviderError} if not found.
  3007. *
  3008. * ### Example ([live demo](http://plnkr.co/edit/HeXSHg?p=preview))
  3009. *
  3010. * ```typescript
  3011. * var injector = Injector.resolveAndCreate([
  3012. * provide("validToken", {useValue: "Value"})
  3013. * ]);
  3014. * expect(injector.get("validToken")).toEqual("Value");
  3015. * expect(() => injector.get("invalidToken")).toThrowError();
  3016. * ```
  3017. *
  3018. * `Injector` returns itself when given `Injector` as a token.
  3019. *
  3020. * ```typescript
  3021. * var injector = Injector.resolveAndCreate([]);
  3022. * expect(injector.get(Injector)).toBe(injector);
  3023. * ```
  3024. */
  3025. Injector.prototype.get = function (token) {
  3026. return this._getByKey(key_1.Key.get(token), null, null, false, Visibility.PublicAndPrivate);
  3027. };
  3028. /**
  3029. * Retrieves an instance from the injector based on the provided token.
  3030. * Returns null if not found.
  3031. *
  3032. * ### Example ([live demo](http://plnkr.co/edit/tpEbEy?p=preview))
  3033. *
  3034. * ```typescript
  3035. * var injector = Injector.resolveAndCreate([
  3036. * provide("validToken", {useValue: "Value"})
  3037. * ]);
  3038. * expect(injector.getOptional("validToken")).toEqual("Value");
  3039. * expect(injector.getOptional("invalidToken")).toBe(null);
  3040. * ```
  3041. *
  3042. * `Injector` returns itself when given `Injector` as a token.
  3043. *
  3044. * ```typescript
  3045. * var injector = Injector.resolveAndCreate([]);
  3046. * expect(injector.getOptional(Injector)).toBe(injector);
  3047. * ```
  3048. */
  3049. Injector.prototype.getOptional = function (token) {
  3050. return this._getByKey(key_1.Key.get(token), null, null, true, Visibility.PublicAndPrivate);
  3051. };
  3052. /**
  3053. * @internal
  3054. */
  3055. Injector.prototype.getAt = function (index) { return this._strategy.getObjAtIndex(index); };
  3056. Object.defineProperty(Injector.prototype, "parent", {
  3057. /**
  3058. * Parent of this injector.
  3059. *
  3060. * <!-- TODO: Add a link to the section of the user guide talking about hierarchical injection.
  3061. * -->
  3062. *
  3063. * ### Example ([live demo](http://plnkr.co/edit/eosMGo?p=preview))
  3064. *
  3065. * ```typescript
  3066. * var parent = Injector.resolveAndCreate([]);
  3067. * var child = parent.resolveAndCreateChild([]);
  3068. * expect(child.parent).toBe(parent);
  3069. * ```
  3070. */
  3071. get: function () { return this._parent; },
  3072. enumerable: true,
  3073. configurable: true
  3074. });
  3075. Object.defineProperty(Injector.prototype, "internalStrategy", {
  3076. /**
  3077. * @internal
  3078. * Internal. Do not use.
  3079. * We return `any` not to export the InjectorStrategy type.
  3080. */
  3081. get: function () { return this._strategy; },
  3082. enumerable: true,
  3083. configurable: true
  3084. });
  3085. /**
  3086. * Resolves an array of providers and creates a child injector from those providers.
  3087. *
  3088. * <!-- TODO: Add a link to the section of the user guide talking about hierarchical injection.
  3089. * -->
  3090. *
  3091. * The passed-in providers can be an array of `Type`, {@link Provider},
  3092. * or a recursive array of more providers.
  3093. *
  3094. * ### Example ([live demo](http://plnkr.co/edit/opB3T4?p=preview))
  3095. *
  3096. * ```typescript
  3097. * class ParentProvider {}
  3098. * class ChildProvider {}
  3099. *
  3100. * var parent = Injector.resolveAndCreate([ParentProvider]);
  3101. * var child = parent.resolveAndCreateChild([ChildProvider]);
  3102. *
  3103. * expect(child.get(ParentProvider) instanceof ParentProvider).toBe(true);
  3104. * expect(child.get(ChildProvider) instanceof ChildProvider).toBe(true);
  3105. * expect(child.get(ParentProvider)).toBe(parent.get(ParentProvider));
  3106. * ```
  3107. *
  3108. * This function is slower than the corresponding `createChildFromResolved`
  3109. * because it needs to resolve the passed-in providers first.
  3110. * See {@link Injector#resolve} and {@link Injector#createChildFromResolved}.
  3111. */
  3112. Injector.prototype.resolveAndCreateChild = function (providers) {
  3113. var resolvedProviders = Injector.resolve(providers);
  3114. return this.createChildFromResolved(resolvedProviders);
  3115. };
  3116. /**
  3117. * Creates a child injector from previously resolved providers.
  3118. *
  3119. * <!-- TODO: Add a link to the section of the user guide talking about hierarchical injection.
  3120. * -->
  3121. *
  3122. * This API is the recommended way to construct injectors in performance-sensitive parts.
  3123. *
  3124. * ### Example ([live demo](http://plnkr.co/edit/VhyfjN?p=preview))
  3125. *
  3126. * ```typescript
  3127. * class ParentProvider {}
  3128. * class ChildProvider {}
  3129. *
  3130. * var parentProviders = Injector.resolve([ParentProvider]);
  3131. * var childProviders = Injector.resolve([ChildProvider]);
  3132. *
  3133. * var parent = Injector.fromResolvedProviders(parentProviders);
  3134. * var child = parent.createChildFromResolved(childProviders);
  3135. *
  3136. * expect(child.get(ParentProvider) instanceof ParentProvider).toBe(true);
  3137. * expect(child.get(ChildProvider) instanceof ChildProvider).toBe(true);
  3138. * expect(child.get(ParentProvider)).toBe(parent.get(ParentProvider));
  3139. * ```
  3140. */
  3141. Injector.prototype.createChildFromResolved = function (providers) {
  3142. var bd = providers.map(function (b) { return new ProviderWithVisibility(b, Visibility.Public); });
  3143. var proto = new ProtoInjector(bd);
  3144. var inj = new Injector(proto, null, null);
  3145. inj._parent = this;
  3146. return inj;
  3147. };
  3148. /**
  3149. * Resolves a provider and instantiates an object in the context of the injector.
  3150. *
  3151. * The created object does not get cached by the injector.
  3152. *
  3153. * ### Example ([live demo](http://plnkr.co/edit/yvVXoB?p=preview))
  3154. *
  3155. * ```typescript
  3156. * @Injectable()
  3157. * class Engine {
  3158. * }
  3159. *
  3160. * @Injectable()
  3161. * class Car {
  3162. * constructor(public engine:Engine) {}
  3163. * }
  3164. *
  3165. * var injector = Injector.resolveAndCreate([Engine]);
  3166. *
  3167. * var car = injector.resolveAndInstantiate(Car);
  3168. * expect(car.engine).toBe(injector.get(Engine));
  3169. * expect(car).not.toBe(injector.resolveAndInstantiate(Car));
  3170. * ```
  3171. */
  3172. Injector.prototype.resolveAndInstantiate = function (provider) {
  3173. return this.instantiateResolved(Injector.resolve([provider])[0]);
  3174. };
  3175. /**
  3176. * Instantiates an object using a resolved provider in the context of the injector.
  3177. *
  3178. * The created object does not get cached by the injector.
  3179. *
  3180. * ### Example ([live demo](http://plnkr.co/edit/ptCImQ?p=preview))
  3181. *
  3182. * ```typescript
  3183. * @Injectable()
  3184. * class Engine {
  3185. * }
  3186. *
  3187. * @Injectable()
  3188. * class Car {
  3189. * constructor(public engine:Engine) {}
  3190. * }
  3191. *
  3192. * var injector = Injector.resolveAndCreate([Engine]);
  3193. * var carProvider = Injector.resolve([Car])[0];
  3194. * var car = injector.instantiateResolved(carProvider);
  3195. * expect(car.engine).toBe(injector.get(Engine));
  3196. * expect(car).not.toBe(injector.instantiateResolved(carProvider));
  3197. * ```
  3198. */
  3199. Injector.prototype.instantiateResolved = function (provider) {
  3200. return this._instantiateProvider(provider, Visibility.PublicAndPrivate);
  3201. };
  3202. /** @internal */
  3203. Injector.prototype._new = function (provider, visibility) {
  3204. if (this._constructionCounter++ > this._strategy.getMaxNumberOfObjects()) {
  3205. throw new exceptions_1.CyclicDependencyError(this, provider.key);
  3206. }
  3207. return this._instantiateProvider(provider, visibility);
  3208. };
  3209. Injector.prototype._instantiateProvider = function (provider, visibility) {
  3210. if (provider.multiProvider) {
  3211. var res = collection_1.ListWrapper.createFixedSize(provider.resolvedFactories.length);
  3212. for (var i = 0; i < provider.resolvedFactories.length; ++i) {
  3213. res[i] = this._instantiate(provider, provider.resolvedFactories[i], visibility);
  3214. }
  3215. return res;
  3216. }
  3217. else {
  3218. return this._instantiate(provider, provider.resolvedFactories[0], visibility);
  3219. }
  3220. };
  3221. Injector.prototype._instantiate = function (provider, resolvedFactory, visibility) {
  3222. var factory = resolvedFactory.factory;
  3223. var deps = resolvedFactory.dependencies;
  3224. var length = deps.length;
  3225. var d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15, d16, d17, d18, d19;
  3226. try {
  3227. d0 = length > 0 ? this._getByDependency(provider, deps[0], visibility) : null;
  3228. d1 = length > 1 ? this._getByDependency(provider, deps[1], visibility) : null;
  3229. d2 = length > 2 ? this._getByDependency(provider, deps[2], visibility) : null;
  3230. d3 = length > 3 ? this._getByDependency(provider, deps[3], visibility) : null;
  3231. d4 = length > 4 ? this._getByDependency(provider, deps[4], visibility) : null;
  3232. d5 = length > 5 ? this._getByDependency(provider, deps[5], visibility) : null;
  3233. d6 = length > 6 ? this._getByDependency(provider, deps[6], visibility) : null;
  3234. d7 = length > 7 ? this._getByDependency(provider, deps[7], visibility) : null;
  3235. d8 = length > 8 ? this._getByDependency(provider, deps[8], visibility) : null;
  3236. d9 = length > 9 ? this._getByDependency(provider, deps[9], visibility) : null;
  3237. d10 = length > 10 ? this._getByDependency(provider, deps[10], visibility) : null;
  3238. d11 = length > 11 ? this._getByDependency(provider, deps[11], visibility) : null;
  3239. d12 = length > 12 ? this._getByDependency(provider, deps[12], visibility) : null;
  3240. d13 = length > 13 ? this._getByDependency(provider, deps[13], visibility) : null;
  3241. d14 = length > 14 ? this._getByDependency(provider, deps[14], visibility) : null;
  3242. d15 = length > 15 ? this._getByDependency(provider, deps[15], visibility) : null;
  3243. d16 = length > 16 ? this._getByDependency(provider, deps[16], visibility) : null;
  3244. d17 = length > 17 ? this._getByDependency(provider, deps[17], visibility) : null;
  3245. d18 = length > 18 ? this._getByDependency(provider, deps[18], visibility) : null;
  3246. d19 = length > 19 ? this._getByDependency(provider, deps[19], visibility) : null;
  3247. }
  3248. catch (e) {
  3249. if (e instanceof exceptions_1.AbstractProviderError || e instanceof exceptions_1.InstantiationError) {
  3250. e.addKey(this, provider.key);
  3251. }
  3252. throw e;
  3253. }
  3254. var obj;
  3255. try {
  3256. switch (length) {
  3257. case 0:
  3258. obj = factory();
  3259. break;
  3260. case 1:
  3261. obj = factory(d0);
  3262. break;
  3263. case 2:
  3264. obj = factory(d0, d1);
  3265. break;
  3266. case 3:
  3267. obj = factory(d0, d1, d2);
  3268. break;
  3269. case 4:
  3270. obj = factory(d0, d1, d2, d3);
  3271. break;
  3272. case 5:
  3273. obj = factory(d0, d1, d2, d3, d4);
  3274. break;
  3275. case 6:
  3276. obj = factory(d0, d1, d2, d3, d4, d5);
  3277. break;
  3278. case 7:
  3279. obj = factory(d0, d1, d2, d3, d4, d5, d6);
  3280. break;
  3281. case 8:
  3282. obj = factory(d0, d1, d2, d3, d4, d5, d6, d7);
  3283. break;
  3284. case 9:
  3285. obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8);
  3286. break;
  3287. case 10:
  3288. obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9);
  3289. break;
  3290. case 11:
  3291. obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10);
  3292. break;
  3293. case 12:
  3294. obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11);
  3295. break;
  3296. case 13:
  3297. obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12);
  3298. break;
  3299. case 14:
  3300. obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13);
  3301. break;
  3302. case 15:
  3303. obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14);
  3304. break;
  3305. case 16:
  3306. obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15);
  3307. break;
  3308. case 17:
  3309. obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15, d16);
  3310. break;
  3311. case 18:
  3312. obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15, d16, d17);
  3313. break;
  3314. case 19:
  3315. obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15, d16, d17, d18);
  3316. break;
  3317. case 20:
  3318. obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15, d16, d17, d18, d19);
  3319. break;
  3320. }
  3321. }
  3322. catch (e) {
  3323. throw new exceptions_1.InstantiationError(this, e, e.stack, provider.key);
  3324. }
  3325. return obj;
  3326. };
  3327. Injector.prototype._getByDependency = function (provider, dep, providerVisibility) {
  3328. var special = lang_1.isPresent(this._depProvider) ?
  3329. this._depProvider.getDependency(this, provider, dep) :
  3330. exports.UNDEFINED;
  3331. if (special !== exports.UNDEFINED) {
  3332. return special;
  3333. }
  3334. else {
  3335. return this._getByKey(dep.key, dep.lowerBoundVisibility, dep.upperBoundVisibility, dep.optional, providerVisibility);
  3336. }
  3337. };
  3338. Injector.prototype._getByKey = function (key, lowerBoundVisibility, upperBoundVisibility, optional, providerVisibility) {
  3339. if (key === INJECTOR_KEY) {
  3340. return this;
  3341. }
  3342. if (upperBoundVisibility instanceof metadata_1.SelfMetadata) {
  3343. return this._getByKeySelf(key, optional, providerVisibility);
  3344. }
  3345. else if (upperBoundVisibility instanceof metadata_1.HostMetadata) {
  3346. return this._getByKeyHost(key, optional, providerVisibility, lowerBoundVisibility);
  3347. }
  3348. else {
  3349. return this._getByKeyDefault(key, optional, providerVisibility, lowerBoundVisibility);
  3350. }
  3351. };
  3352. /** @internal */
  3353. Injector.prototype._throwOrNull = function (key, optional) {
  3354. if (optional) {
  3355. return null;
  3356. }
  3357. else {
  3358. throw new exceptions_1.NoProviderError(this, key);
  3359. }
  3360. };
  3361. /** @internal */
  3362. Injector.prototype._getByKeySelf = function (key, optional, providerVisibility) {
  3363. var obj = this._strategy.getObjByKeyId(key.id, providerVisibility);
  3364. return (obj !== exports.UNDEFINED) ? obj : this._throwOrNull(key, optional);
  3365. };
  3366. /** @internal */
  3367. Injector.prototype._getByKeyHost = function (key, optional, providerVisibility, lowerBoundVisibility) {
  3368. var inj = this;
  3369. if (lowerBoundVisibility instanceof metadata_1.SkipSelfMetadata) {
  3370. if (inj._isHost) {
  3371. return this._getPrivateDependency(key, optional, inj);
  3372. }
  3373. else {
  3374. inj = inj._parent;
  3375. }
  3376. }
  3377. while (inj != null) {
  3378. var obj = inj._strategy.getObjByKeyId(key.id, providerVisibility);
  3379. if (obj !== exports.UNDEFINED)
  3380. return obj;
  3381. if (lang_1.isPresent(inj._parent) && inj._isHost) {
  3382. return this._getPrivateDependency(key, optional, inj);
  3383. }
  3384. else {
  3385. inj = inj._parent;
  3386. }
  3387. }
  3388. return this._throwOrNull(key, optional);
  3389. };
  3390. /** @internal */
  3391. Injector.prototype._getPrivateDependency = function (key, optional, inj) {
  3392. var obj = inj._parent._strategy.getObjByKeyId(key.id, Visibility.Private);
  3393. return (obj !== exports.UNDEFINED) ? obj : this._throwOrNull(key, optional);
  3394. };
  3395. /** @internal */
  3396. Injector.prototype._getByKeyDefault = function (key, optional, providerVisibility, lowerBoundVisibility) {
  3397. var inj = this;
  3398. if (lowerBoundVisibility instanceof metadata_1.SkipSelfMetadata) {
  3399. providerVisibility = inj._isHost ? Visibility.PublicAndPrivate : Visibility.Public;
  3400. inj = inj._parent;
  3401. }
  3402. while (inj != null) {
  3403. var obj = inj._strategy.getObjByKeyId(key.id, providerVisibility);
  3404. if (obj !== exports.UNDEFINED)
  3405. return obj;
  3406. providerVisibility = inj._isHost ? Visibility.PublicAndPrivate : Visibility.Public;
  3407. inj = inj._parent;
  3408. }
  3409. return this._throwOrNull(key, optional);
  3410. };
  3411. Object.defineProperty(Injector.prototype, "displayName", {
  3412. get: function () {
  3413. return "Injector(providers: [" + _mapProviders(this, function (b) { return (" \"" + b.key.displayName + "\" "); }).join(", ") + "])";
  3414. },
  3415. enumerable: true,
  3416. configurable: true
  3417. });
  3418. Injector.prototype.toString = function () { return this.displayName; };
  3419. return Injector;
  3420. })();
  3421. exports.Injector = Injector;
  3422. var INJECTOR_KEY = key_1.Key.get(Injector);
  3423. function _mapProviders(injector, fn) {
  3424. var res = [];
  3425. for (var i = 0; i < injector._proto.numberOfProviders; ++i) {
  3426. res.push(fn(injector._proto.getProviderAtIndex(i)));
  3427. }
  3428. return res;
  3429. }
  3430. /***/ },
  3431. /* 12 */
  3432. /***/ function(module, exports, __webpack_require__) {
  3433. var lang_1 = __webpack_require__(5);
  3434. exports.Map = lang_1.global.Map;
  3435. exports.Set = lang_1.global.Set;
  3436. // Safari and Internet Explorer do not support the iterable parameter to the
  3437. // Map constructor. We work around that by manually adding the items.
  3438. var createMapFromPairs = (function () {
  3439. try {
  3440. if (new exports.Map([[1, 2]]).size === 1) {
  3441. return function createMapFromPairs(pairs) { return new exports.Map(pairs); };
  3442. }
  3443. }
  3444. catch (e) {
  3445. }
  3446. return function createMapAndPopulateFromPairs(pairs) {
  3447. var map = new exports.Map();
  3448. for (var i = 0; i < pairs.length; i++) {
  3449. var pair = pairs[i];
  3450. map.set(pair[0], pair[1]);
  3451. }
  3452. return map;
  3453. };
  3454. })();
  3455. var createMapFromMap = (function () {
  3456. try {
  3457. if (new exports.Map(new exports.Map())) {
  3458. return function createMapFromMap(m) { return new exports.Map(m); };
  3459. }
  3460. }
  3461. catch (e) {
  3462. }
  3463. return function createMapAndPopulateFromMap(m) {
  3464. var map = new exports.Map();
  3465. m.forEach(function (v, k) { map.set(k, v); });
  3466. return map;
  3467. };
  3468. })();
  3469. var _clearValues = (function () {
  3470. if ((new exports.Map()).keys().next) {
  3471. return function _clearValues(m) {
  3472. var keyIterator = m.keys();
  3473. var k;
  3474. while (!((k = keyIterator.next()).done)) {
  3475. m.set(k.value, null);
  3476. }
  3477. };
  3478. }
  3479. else {
  3480. return function _clearValuesWithForeEach(m) {
  3481. m.forEach(function (v, k) { m.set(k, null); });
  3482. };
  3483. }
  3484. })();
  3485. // Safari doesn't implement MapIterator.next(), which is used is Traceur's polyfill of Array.from
  3486. // TODO(mlaval): remove the work around once we have a working polyfill of Array.from
  3487. var _arrayFromMap = (function () {
  3488. try {
  3489. if ((new exports.Map()).values().next) {
  3490. return function createArrayFromMap(m, getValues) {
  3491. return getValues ? Array.from(m.values()) : Array.from(m.keys());
  3492. };
  3493. }
  3494. }
  3495. catch (e) {
  3496. }
  3497. return function createArrayFromMapWithForeach(m, getValues) {
  3498. var res = ListWrapper.createFixedSize(m.size), i = 0;
  3499. m.forEach(function (v, k) {
  3500. res[i] = getValues ? v : k;
  3501. i++;
  3502. });
  3503. return res;
  3504. };
  3505. })();
  3506. var MapWrapper = (function () {
  3507. function MapWrapper() {
  3508. }
  3509. MapWrapper.clone = function (m) { return createMapFromMap(m); };
  3510. MapWrapper.createFromStringMap = function (stringMap) {
  3511. var result = new exports.Map();
  3512. for (var prop in stringMap) {
  3513. result.set(prop, stringMap[prop]);
  3514. }
  3515. return result;
  3516. };
  3517. MapWrapper.toStringMap = function (m) {
  3518. var r = {};
  3519. m.forEach(function (v, k) { return r[k] = v; });
  3520. return r;
  3521. };
  3522. MapWrapper.createFromPairs = function (pairs) { return createMapFromPairs(pairs); };
  3523. MapWrapper.clearValues = function (m) { _clearValues(m); };
  3524. MapWrapper.iterable = function (m) { return m; };
  3525. MapWrapper.keys = function (m) { return _arrayFromMap(m, false); };
  3526. MapWrapper.values = function (m) { return _arrayFromMap(m, true); };
  3527. return MapWrapper;
  3528. })();
  3529. exports.MapWrapper = MapWrapper;
  3530. /**
  3531. * Wraps Javascript Objects
  3532. */
  3533. var StringMapWrapper = (function () {
  3534. function StringMapWrapper() {
  3535. }
  3536. StringMapWrapper.create = function () {
  3537. // Note: We are not using Object.create(null) here due to
  3538. // performance!
  3539. // http://jsperf.com/ng2-object-create-null
  3540. return {};
  3541. };
  3542. StringMapWrapper.contains = function (map, key) {
  3543. return map.hasOwnProperty(key);
  3544. };
  3545. StringMapWrapper.get = function (map, key) {
  3546. return map.hasOwnProperty(key) ? map[key] : undefined;
  3547. };
  3548. StringMapWrapper.set = function (map, key, value) { map[key] = value; };
  3549. StringMapWrapper.keys = function (map) { return Object.keys(map); };
  3550. StringMapWrapper.isEmpty = function (map) {
  3551. for (var prop in map) {
  3552. return false;
  3553. }
  3554. return true;
  3555. };
  3556. StringMapWrapper.delete = function (map, key) { delete map[key]; };
  3557. StringMapWrapper.forEach = function (map, callback) {
  3558. for (var prop in map) {
  3559. if (map.hasOwnProperty(prop)) {
  3560. callback(map[prop], prop);
  3561. }
  3562. }
  3563. };
  3564. StringMapWrapper.merge = function (m1, m2) {
  3565. var m = {};
  3566. for (var attr in m1) {
  3567. if (m1.hasOwnProperty(attr)) {
  3568. m[attr] = m1[attr];
  3569. }
  3570. }
  3571. for (var attr in m2) {
  3572. if (m2.hasOwnProperty(attr)) {
  3573. m[attr] = m2[attr];
  3574. }
  3575. }
  3576. return m;
  3577. };
  3578. StringMapWrapper.equals = function (m1, m2) {
  3579. var k1 = Object.keys(m1);
  3580. var k2 = Object.keys(m2);
  3581. if (k1.length != k2.length) {
  3582. return false;
  3583. }
  3584. var key;
  3585. for (var i = 0; i < k1.length; i++) {
  3586. key = k1[i];
  3587. if (m1[key] !== m2[key]) {
  3588. return false;
  3589. }
  3590. }
  3591. return true;
  3592. };
  3593. return StringMapWrapper;
  3594. })();
  3595. exports.StringMapWrapper = StringMapWrapper;
  3596. var ListWrapper = (function () {
  3597. function ListWrapper() {
  3598. }
  3599. // JS has no way to express a statically fixed size list, but dart does so we
  3600. // keep both methods.
  3601. ListWrapper.createFixedSize = function (size) { return new Array(size); };
  3602. ListWrapper.createGrowableSize = function (size) { return new Array(size); };
  3603. ListWrapper.clone = function (array) { return array.slice(0); };
  3604. ListWrapper.forEachWithIndex = function (array, fn) {
  3605. for (var i = 0; i < array.length; i++) {
  3606. fn(array[i], i);
  3607. }
  3608. };
  3609. ListWrapper.first = function (array) {
  3610. if (!array)
  3611. return null;
  3612. return array[0];
  3613. };
  3614. ListWrapper.last = function (array) {
  3615. if (!array || array.length == 0)
  3616. return null;
  3617. return array[array.length - 1];
  3618. };
  3619. ListWrapper.indexOf = function (array, value, startIndex) {
  3620. if (startIndex === void 0) { startIndex = 0; }
  3621. return array.indexOf(value, startIndex);
  3622. };
  3623. ListWrapper.contains = function (list, el) { return list.indexOf(el) !== -1; };
  3624. ListWrapper.reversed = function (array) {
  3625. var a = ListWrapper.clone(array);
  3626. return a.reverse();
  3627. };
  3628. ListWrapper.concat = function (a, b) { return a.concat(b); };
  3629. ListWrapper.insert = function (list, index, value) { list.splice(index, 0, value); };
  3630. ListWrapper.removeAt = function (list, index) {
  3631. var res = list[index];
  3632. list.splice(index, 1);
  3633. return res;
  3634. };
  3635. ListWrapper.removeAll = function (list, items) {
  3636. for (var i = 0; i < items.length; ++i) {
  3637. var index = list.indexOf(items[i]);
  3638. list.splice(index, 1);
  3639. }
  3640. };
  3641. ListWrapper.remove = function (list, el) {
  3642. var index = list.indexOf(el);
  3643. if (index > -1) {
  3644. list.splice(index, 1);
  3645. return true;
  3646. }
  3647. return false;
  3648. };
  3649. ListWrapper.clear = function (list) { list.length = 0; };
  3650. ListWrapper.isEmpty = function (list) { return list.length == 0; };
  3651. ListWrapper.fill = function (list, value, start, end) {
  3652. if (start === void 0) { start = 0; }
  3653. if (end === void 0) { end = null; }
  3654. list.fill(value, start, end === null ? list.length : end);
  3655. };
  3656. ListWrapper.equals = function (a, b) {
  3657. if (a.length != b.length)
  3658. return false;
  3659. for (var i = 0; i < a.length; ++i) {
  3660. if (a[i] !== b[i])
  3661. return false;
  3662. }
  3663. return true;
  3664. };
  3665. ListWrapper.slice = function (l, from, to) {
  3666. if (from === void 0) { from = 0; }
  3667. if (to === void 0) { to = null; }
  3668. return l.slice(from, to === null ? undefined : to);
  3669. };
  3670. ListWrapper.splice = function (l, from, length) { return l.splice(from, length); };
  3671. ListWrapper.sort = function (l, compareFn) {
  3672. if (lang_1.isPresent(compareFn)) {
  3673. l.sort(compareFn);
  3674. }
  3675. else {
  3676. l.sort();
  3677. }
  3678. };
  3679. ListWrapper.toString = function (l) { return l.toString(); };
  3680. ListWrapper.toJSON = function (l) { return JSON.stringify(l); };
  3681. ListWrapper.maximum = function (list, predicate) {
  3682. if (list.length == 0) {
  3683. return null;
  3684. }
  3685. var solution = null;
  3686. var maxValue = -Infinity;
  3687. for (var index = 0; index < list.length; index++) {
  3688. var candidate = list[index];
  3689. if (lang_1.isBlank(candidate)) {
  3690. continue;
  3691. }
  3692. var candidateValue = predicate(candidate);
  3693. if (candidateValue > maxValue) {
  3694. solution = candidate;
  3695. maxValue = candidateValue;
  3696. }
  3697. }
  3698. return solution;
  3699. };
  3700. return ListWrapper;
  3701. })();
  3702. exports.ListWrapper = ListWrapper;
  3703. function isListLikeIterable(obj) {
  3704. if (!lang_1.isJsObject(obj))
  3705. return false;
  3706. return lang_1.isArray(obj) ||
  3707. (!(obj instanceof exports.Map) &&
  3708. lang_1.getSymbolIterator() in obj); // JS Iterable have a Symbol.iterator prop
  3709. }
  3710. exports.isListLikeIterable = isListLikeIterable;
  3711. function iterateListLike(obj, fn) {
  3712. if (lang_1.isArray(obj)) {
  3713. for (var i = 0; i < obj.length; i++) {
  3714. fn(obj[i]);
  3715. }
  3716. }
  3717. else {
  3718. var iterator = obj[lang_1.getSymbolIterator()]();
  3719. var item;
  3720. while (!((item = iterator.next()).done)) {
  3721. fn(item.value);
  3722. }
  3723. }
  3724. }
  3725. exports.iterateListLike = iterateListLike;
  3726. // Safari and Internet Explorer do not support the iterable parameter to the
  3727. // Set constructor. We work around that by manually adding the items.
  3728. var createSetFromList = (function () {
  3729. var test = new exports.Set([1, 2, 3]);
  3730. if (test.size === 3) {
  3731. return function createSetFromList(lst) { return new exports.Set(lst); };
  3732. }
  3733. else {
  3734. return function createSetAndPopulateFromList(lst) {
  3735. var res = new exports.Set(lst);
  3736. if (res.size !== lst.length) {
  3737. for (var i = 0; i < lst.length; i++) {
  3738. res.add(lst[i]);
  3739. }
  3740. }
  3741. return res;
  3742. };
  3743. }
  3744. })();
  3745. var SetWrapper = (function () {
  3746. function SetWrapper() {
  3747. }
  3748. SetWrapper.createFromList = function (lst) { return createSetFromList(lst); };
  3749. SetWrapper.has = function (s, key) { return s.has(key); };
  3750. SetWrapper.delete = function (m, k) { m.delete(k); };
  3751. return SetWrapper;
  3752. })();
  3753. exports.SetWrapper = SetWrapper;
  3754. /***/ },
  3755. /* 13 */
  3756. /***/ function(module, exports, __webpack_require__) {
  3757. var __extends = (this && this.__extends) || function (d, b) {
  3758. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  3759. function __() { this.constructor = d; }
  3760. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  3761. };
  3762. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  3763. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  3764. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  3765. 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;
  3766. return c > 3 && r && Object.defineProperty(target, key, r), r;
  3767. };
  3768. var __metadata = (this && this.__metadata) || function (k, v) {
  3769. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  3770. };
  3771. var lang_1 = __webpack_require__(5);
  3772. var exceptions_1 = __webpack_require__(14);
  3773. var collection_1 = __webpack_require__(12);
  3774. var reflection_1 = __webpack_require__(16);
  3775. var key_1 = __webpack_require__(19);
  3776. var metadata_1 = __webpack_require__(7);
  3777. var exceptions_2 = __webpack_require__(21);
  3778. var forward_ref_1 = __webpack_require__(10);
  3779. /**
  3780. * `Dependency` is used by the framework to extend DI.
  3781. * This is internal to Angular and should not be used directly.
  3782. */
  3783. var Dependency = (function () {
  3784. function Dependency(key, optional, lowerBoundVisibility, upperBoundVisibility, properties) {
  3785. this.key = key;
  3786. this.optional = optional;
  3787. this.lowerBoundVisibility = lowerBoundVisibility;
  3788. this.upperBoundVisibility = upperBoundVisibility;
  3789. this.properties = properties;
  3790. }
  3791. Dependency.fromKey = function (key) { return new Dependency(key, false, null, null, []); };
  3792. return Dependency;
  3793. })();
  3794. exports.Dependency = Dependency;
  3795. var _EMPTY_LIST = lang_1.CONST_EXPR([]);
  3796. /**
  3797. * Describes how the {@link Injector} should instantiate a given token.
  3798. *
  3799. * See {@link provide}.
  3800. *
  3801. * ### Example ([live demo](http://plnkr.co/edit/GNAyj6K6PfYg2NBzgwZ5?p%3Dpreview&p=preview))
  3802. *
  3803. * ```javascript
  3804. * var injector = Injector.resolveAndCreate([
  3805. * new Provider("message", { useValue: 'Hello' })
  3806. * ]);
  3807. *
  3808. * expect(injector.get("message")).toEqual('Hello');
  3809. * ```
  3810. */
  3811. var Provider = (function () {
  3812. function Provider(token, _a) {
  3813. var useClass = _a.useClass, useValue = _a.useValue, useExisting = _a.useExisting, useFactory = _a.useFactory, deps = _a.deps, multi = _a.multi;
  3814. this.token = token;
  3815. this.useClass = useClass;
  3816. this.useValue = useValue;
  3817. this.useExisting = useExisting;
  3818. this.useFactory = useFactory;
  3819. this.dependencies = deps;
  3820. this._multi = multi;
  3821. }
  3822. Object.defineProperty(Provider.prototype, "multi", {
  3823. // TODO: Provide a full working example after alpha38 is released.
  3824. /**
  3825. * Creates multiple providers matching the same token (a multi-provider).
  3826. *
  3827. * Multi-providers are used for creating pluggable service, where the system comes
  3828. * with some default providers, and the user can register additonal providers.
  3829. * The combination of the default providers and the additional providers will be
  3830. * used to drive the behavior of the system.
  3831. *
  3832. * ### Example
  3833. *
  3834. * ```typescript
  3835. * var injector = Injector.resolveAndCreate([
  3836. * new Provider("Strings", { useValue: "String1", multi: true}),
  3837. * new Provider("Strings", { useValue: "String2", multi: true})
  3838. * ]);
  3839. *
  3840. * expect(injector.get("Strings")).toEqual(["String1", "String2"]);
  3841. * ```
  3842. *
  3843. * Multi-providers and regular providers cannot be mixed. The following
  3844. * will throw an exception:
  3845. *
  3846. * ```typescript
  3847. * var injector = Injector.resolveAndCreate([
  3848. * new Provider("Strings", { useValue: "String1", multi: true }),
  3849. * new Provider("Strings", { useValue: "String2"})
  3850. * ]);
  3851. * ```
  3852. */
  3853. get: function () { return lang_1.normalizeBool(this._multi); },
  3854. enumerable: true,
  3855. configurable: true
  3856. });
  3857. Provider = __decorate([
  3858. lang_1.CONST(),
  3859. __metadata('design:paramtypes', [Object, Object])
  3860. ], Provider);
  3861. return Provider;
  3862. })();
  3863. exports.Provider = Provider;
  3864. /**
  3865. * See {@link Provider} instead.
  3866. *
  3867. * @deprecated
  3868. */
  3869. var Binding = (function (_super) {
  3870. __extends(Binding, _super);
  3871. function Binding(token, _a) {
  3872. var toClass = _a.toClass, toValue = _a.toValue, toAlias = _a.toAlias, toFactory = _a.toFactory, deps = _a.deps, multi = _a.multi;
  3873. _super.call(this, token, {
  3874. useClass: toClass,
  3875. useValue: toValue,
  3876. useExisting: toAlias,
  3877. useFactory: toFactory,
  3878. deps: deps,
  3879. multi: multi
  3880. });
  3881. }
  3882. Object.defineProperty(Binding.prototype, "toClass", {
  3883. /**
  3884. * @deprecated
  3885. */
  3886. get: function () { return this.useClass; },
  3887. enumerable: true,
  3888. configurable: true
  3889. });
  3890. Object.defineProperty(Binding.prototype, "toAlias", {
  3891. /**
  3892. * @deprecated
  3893. */
  3894. get: function () { return this.useExisting; },
  3895. enumerable: true,
  3896. configurable: true
  3897. });
  3898. Object.defineProperty(Binding.prototype, "toFactory", {
  3899. /**
  3900. * @deprecated
  3901. */
  3902. get: function () { return this.useFactory; },
  3903. enumerable: true,
  3904. configurable: true
  3905. });
  3906. Object.defineProperty(Binding.prototype, "toValue", {
  3907. /**
  3908. * @deprecated
  3909. */
  3910. get: function () { return this.useValue; },
  3911. enumerable: true,
  3912. configurable: true
  3913. });
  3914. Binding = __decorate([
  3915. lang_1.CONST(),
  3916. __metadata('design:paramtypes', [Object, Object])
  3917. ], Binding);
  3918. return Binding;
  3919. })(Provider);
  3920. exports.Binding = Binding;
  3921. var ResolvedProvider_ = (function () {
  3922. function ResolvedProvider_(key, resolvedFactories, multiProvider) {
  3923. this.key = key;
  3924. this.resolvedFactories = resolvedFactories;
  3925. this.multiProvider = multiProvider;
  3926. }
  3927. Object.defineProperty(ResolvedProvider_.prototype, "resolvedFactory", {
  3928. get: function () { return this.resolvedFactories[0]; },
  3929. enumerable: true,
  3930. configurable: true
  3931. });
  3932. return ResolvedProvider_;
  3933. })();
  3934. exports.ResolvedProvider_ = ResolvedProvider_;
  3935. /**
  3936. * An internal resolved representation of a factory function created by resolving {@link Provider}.
  3937. */
  3938. var ResolvedFactory = (function () {
  3939. function ResolvedFactory(
  3940. /**
  3941. * Factory function which can return an instance of an object represented by a key.
  3942. */
  3943. factory,
  3944. /**
  3945. * Arguments (dependencies) to the `factory` function.
  3946. */
  3947. dependencies) {
  3948. this.factory = factory;
  3949. this.dependencies = dependencies;
  3950. }
  3951. return ResolvedFactory;
  3952. })();
  3953. exports.ResolvedFactory = ResolvedFactory;
  3954. /**
  3955. * Creates a {@link Provider}.
  3956. *
  3957. * To construct a {@link Provider}, bind a `token` to either a class, a value, a factory function,
  3958. * or
  3959. * to an existing `token`.
  3960. * See {@link ProviderBuilder} for more details.
  3961. *
  3962. * The `token` is most commonly a class or {@link angular2/di/OpaqueToken}.
  3963. *
  3964. * @deprecated
  3965. */
  3966. function bind(token) {
  3967. return new ProviderBuilder(token);
  3968. }
  3969. exports.bind = bind;
  3970. /**
  3971. * Creates a {@link Provider}.
  3972. *
  3973. * See {@link Provider} for more details.
  3974. *
  3975. * <!-- TODO: improve the docs -->
  3976. */
  3977. function provide(token, _a) {
  3978. var useClass = _a.useClass, useValue = _a.useValue, useExisting = _a.useExisting, useFactory = _a.useFactory, deps = _a.deps, multi = _a.multi;
  3979. return new Provider(token, {
  3980. useClass: useClass,
  3981. useValue: useValue,
  3982. useExisting: useExisting,
  3983. useFactory: useFactory,
  3984. deps: deps,
  3985. multi: multi
  3986. });
  3987. }
  3988. exports.provide = provide;
  3989. /**
  3990. * Helper class for the {@link bind} function.
  3991. */
  3992. var ProviderBuilder = (function () {
  3993. function ProviderBuilder(token) {
  3994. this.token = token;
  3995. }
  3996. /**
  3997. * Binds a DI token to a class.
  3998. *
  3999. * ### Example ([live demo](http://plnkr.co/edit/ZpBCSYqv6e2ud5KXLdxQ?p=preview))
  4000. *
  4001. * Because `toAlias` and `toClass` are often confused, the example contains
  4002. * both use cases for easy comparison.
  4003. *
  4004. * ```typescript
  4005. * class Vehicle {}
  4006. *
  4007. * class Car extends Vehicle {}
  4008. *
  4009. * var injectorClass = Injector.resolveAndCreate([
  4010. * Car,
  4011. * provide(Vehicle, {useClass: Car})
  4012. * ]);
  4013. * var injectorAlias = Injector.resolveAndCreate([
  4014. * Car,
  4015. * provide(Vehicle, {useExisting: Car})
  4016. * ]);
  4017. *
  4018. * expect(injectorClass.get(Vehicle)).not.toBe(injectorClass.get(Car));
  4019. * expect(injectorClass.get(Vehicle) instanceof Car).toBe(true);
  4020. *
  4021. * expect(injectorAlias.get(Vehicle)).toBe(injectorAlias.get(Car));
  4022. * expect(injectorAlias.get(Vehicle) instanceof Car).toBe(true);
  4023. * ```
  4024. */
  4025. ProviderBuilder.prototype.toClass = function (type) {
  4026. if (!lang_1.isType(type)) {
  4027. throw new exceptions_1.BaseException("Trying to create a class provider but \"" + lang_1.stringify(type) + "\" is not a class!");
  4028. }
  4029. return new Provider(this.token, { useClass: type });
  4030. };
  4031. /**
  4032. * Binds a DI token to a value.
  4033. *
  4034. * ### Example ([live demo](http://plnkr.co/edit/G024PFHmDL0cJFgfZK8O?p=preview))
  4035. *
  4036. * ```typescript
  4037. * var injector = Injector.resolveAndCreate([
  4038. * provide('message', {useValue: 'Hello'})
  4039. * ]);
  4040. *
  4041. * expect(injector.get('message')).toEqual('Hello');
  4042. * ```
  4043. */
  4044. ProviderBuilder.prototype.toValue = function (value) { return new Provider(this.token, { useValue: value }); };
  4045. /**
  4046. * Binds a DI token to an existing token.
  4047. *
  4048. * Angular will return the same instance as if the provided token was used. (This is
  4049. * in contrast to `useClass` where a separate instance of `useClass` will be returned.)
  4050. *
  4051. * ### Example ([live demo](http://plnkr.co/edit/uBaoF2pN5cfc5AfZapNw?p=preview))
  4052. *
  4053. * Because `toAlias` and `toClass` are often confused, the example contains
  4054. * both use cases for easy comparison.
  4055. *
  4056. * ```typescript
  4057. * class Vehicle {}
  4058. *
  4059. * class Car extends Vehicle {}
  4060. *
  4061. * var injectorAlias = Injector.resolveAndCreate([
  4062. * Car,
  4063. * provide(Vehicle, {useExisting: Car})
  4064. * ]);
  4065. * var injectorClass = Injector.resolveAndCreate([
  4066. * Car,
  4067. * provide(Vehicle, {useClass: Car})
  4068. * ]);
  4069. *
  4070. * expect(injectorAlias.get(Vehicle)).toBe(injectorAlias.get(Car));
  4071. * expect(injectorAlias.get(Vehicle) instanceof Car).toBe(true);
  4072. *
  4073. * expect(injectorClass.get(Vehicle)).not.toBe(injectorClass.get(Car));
  4074. * expect(injectorClass.get(Vehicle) instanceof Car).toBe(true);
  4075. * ```
  4076. */
  4077. ProviderBuilder.prototype.toAlias = function (aliasToken) {
  4078. if (lang_1.isBlank(aliasToken)) {
  4079. throw new exceptions_1.BaseException("Can not alias " + lang_1.stringify(this.token) + " to a blank value!");
  4080. }
  4081. return new Provider(this.token, { useExisting: aliasToken });
  4082. };
  4083. /**
  4084. * Binds a DI token to a function which computes the value.
  4085. *
  4086. * ### Example ([live demo](http://plnkr.co/edit/OejNIfTT3zb1iBxaIYOb?p=preview))
  4087. *
  4088. * ```typescript
  4089. * var injector = Injector.resolveAndCreate([
  4090. * provide(Number, {useFactory: () => { return 1+2; }}),
  4091. * provide(String, {useFactory: (v) => { return "Value: " + v; }, deps: [Number]})
  4092. * ]);
  4093. *
  4094. * expect(injector.get(Number)).toEqual(3);
  4095. * expect(injector.get(String)).toEqual('Value: 3');
  4096. * ```
  4097. */
  4098. ProviderBuilder.prototype.toFactory = function (factory, dependencies) {
  4099. if (!lang_1.isFunction(factory)) {
  4100. throw new exceptions_1.BaseException("Trying to create a factory provider but \"" + lang_1.stringify(factory) + "\" is not a function!");
  4101. }
  4102. return new Provider(this.token, { useFactory: factory, deps: dependencies });
  4103. };
  4104. return ProviderBuilder;
  4105. })();
  4106. exports.ProviderBuilder = ProviderBuilder;
  4107. /**
  4108. * Resolve a single provider.
  4109. */
  4110. function resolveFactory(provider) {
  4111. var factoryFn;
  4112. var resolvedDeps;
  4113. if (lang_1.isPresent(provider.useClass)) {
  4114. var useClass = forward_ref_1.resolveForwardRef(provider.useClass);
  4115. factoryFn = reflection_1.reflector.factory(useClass);
  4116. resolvedDeps = _dependenciesFor(useClass);
  4117. }
  4118. else if (lang_1.isPresent(provider.useExisting)) {
  4119. factoryFn = function (aliasInstance) { return aliasInstance; };
  4120. resolvedDeps = [Dependency.fromKey(key_1.Key.get(provider.useExisting))];
  4121. }
  4122. else if (lang_1.isPresent(provider.useFactory)) {
  4123. factoryFn = provider.useFactory;
  4124. resolvedDeps = _constructDependencies(provider.useFactory, provider.dependencies);
  4125. }
  4126. else {
  4127. factoryFn = function () { return provider.useValue; };
  4128. resolvedDeps = _EMPTY_LIST;
  4129. }
  4130. return new ResolvedFactory(factoryFn, resolvedDeps);
  4131. }
  4132. exports.resolveFactory = resolveFactory;
  4133. /**
  4134. * Converts the {@link Provider} into {@link ResolvedProvider}.
  4135. *
  4136. * {@link Injector} internally only uses {@link ResolvedProvider}, {@link Provider} contains
  4137. * convenience provider syntax.
  4138. */
  4139. function resolveProvider(provider) {
  4140. return new ResolvedProvider_(key_1.Key.get(provider.token), [resolveFactory(provider)], false);
  4141. }
  4142. exports.resolveProvider = resolveProvider;
  4143. /**
  4144. * Resolve a list of Providers.
  4145. */
  4146. function resolveProviders(providers) {
  4147. var normalized = _createListOfProviders(_normalizeProviders(providers, new Map()));
  4148. return normalized.map(function (b) {
  4149. if (b instanceof _NormalizedProvider) {
  4150. return new ResolvedProvider_(b.key, [b.resolvedFactory], false);
  4151. }
  4152. else {
  4153. var arr = b;
  4154. return new ResolvedProvider_(arr[0].key, arr.map(function (_) { return _.resolvedFactory; }), true);
  4155. }
  4156. });
  4157. }
  4158. exports.resolveProviders = resolveProviders;
  4159. /**
  4160. * The algorithm works as follows:
  4161. *
  4162. * [Provider] -> [_NormalizedProvider|[_NormalizedProvider]] -> [ResolvedProvider]
  4163. *
  4164. * _NormalizedProvider is essentially a resolved provider before it was grouped by key.
  4165. */
  4166. var _NormalizedProvider = (function () {
  4167. function _NormalizedProvider(key, resolvedFactory) {
  4168. this.key = key;
  4169. this.resolvedFactory = resolvedFactory;
  4170. }
  4171. return _NormalizedProvider;
  4172. })();
  4173. function _createListOfProviders(flattenedProviders) {
  4174. return collection_1.MapWrapper.values(flattenedProviders);
  4175. }
  4176. function _normalizeProviders(providers, res) {
  4177. providers.forEach(function (b) {
  4178. if (b instanceof lang_1.Type) {
  4179. _normalizeProvider(provide(b, { useClass: b }), res);
  4180. }
  4181. else if (b instanceof Provider) {
  4182. _normalizeProvider(b, res);
  4183. }
  4184. else if (b instanceof Array) {
  4185. _normalizeProviders(b, res);
  4186. }
  4187. else if (b instanceof ProviderBuilder) {
  4188. throw new exceptions_2.InvalidProviderError(b.token);
  4189. }
  4190. else {
  4191. throw new exceptions_2.InvalidProviderError(b);
  4192. }
  4193. });
  4194. return res;
  4195. }
  4196. function _normalizeProvider(b, res) {
  4197. var key = key_1.Key.get(b.token);
  4198. var factory = resolveFactory(b);
  4199. var normalized = new _NormalizedProvider(key, factory);
  4200. if (b.multi) {
  4201. var existingProvider = res.get(key.id);
  4202. if (existingProvider instanceof Array) {
  4203. existingProvider.push(normalized);
  4204. }
  4205. else if (lang_1.isBlank(existingProvider)) {
  4206. res.set(key.id, [normalized]);
  4207. }
  4208. else {
  4209. throw new exceptions_2.MixingMultiProvidersWithRegularProvidersError(existingProvider, b);
  4210. }
  4211. }
  4212. else {
  4213. var existingProvider = res.get(key.id);
  4214. if (existingProvider instanceof Array) {
  4215. throw new exceptions_2.MixingMultiProvidersWithRegularProvidersError(existingProvider, b);
  4216. }
  4217. res.set(key.id, normalized);
  4218. }
  4219. }
  4220. function _constructDependencies(factoryFunction, dependencies) {
  4221. if (lang_1.isBlank(dependencies)) {
  4222. return _dependenciesFor(factoryFunction);
  4223. }
  4224. else {
  4225. var params = dependencies.map(function (t) { return [t]; });
  4226. return dependencies.map(function (t) { return _extractToken(factoryFunction, t, params); });
  4227. }
  4228. }
  4229. function _dependenciesFor(typeOrFunc) {
  4230. var params = reflection_1.reflector.parameters(typeOrFunc);
  4231. if (lang_1.isBlank(params))
  4232. return [];
  4233. if (params.some(lang_1.isBlank)) {
  4234. throw new exceptions_2.NoAnnotationError(typeOrFunc, params);
  4235. }
  4236. return params.map(function (p) { return _extractToken(typeOrFunc, p, params); });
  4237. }
  4238. function _extractToken(typeOrFunc, metadata /*any[] | any*/, params) {
  4239. var depProps = [];
  4240. var token = null;
  4241. var optional = false;
  4242. if (!lang_1.isArray(metadata)) {
  4243. if (metadata instanceof metadata_1.InjectMetadata) {
  4244. return _createDependency(metadata.token, optional, null, null, depProps);
  4245. }
  4246. else {
  4247. return _createDependency(metadata, optional, null, null, depProps);
  4248. }
  4249. }
  4250. var lowerBoundVisibility = null;
  4251. var upperBoundVisibility = null;
  4252. for (var i = 0; i < metadata.length; ++i) {
  4253. var paramMetadata = metadata[i];
  4254. if (paramMetadata instanceof lang_1.Type) {
  4255. token = paramMetadata;
  4256. }
  4257. else if (paramMetadata instanceof metadata_1.InjectMetadata) {
  4258. token = paramMetadata.token;
  4259. }
  4260. else if (paramMetadata instanceof metadata_1.OptionalMetadata) {
  4261. optional = true;
  4262. }
  4263. else if (paramMetadata instanceof metadata_1.SelfMetadata) {
  4264. upperBoundVisibility = paramMetadata;
  4265. }
  4266. else if (paramMetadata instanceof metadata_1.HostMetadata) {
  4267. upperBoundVisibility = paramMetadata;
  4268. }
  4269. else if (paramMetadata instanceof metadata_1.SkipSelfMetadata) {
  4270. lowerBoundVisibility = paramMetadata;
  4271. }
  4272. else if (paramMetadata instanceof metadata_1.DependencyMetadata) {
  4273. if (lang_1.isPresent(paramMetadata.token)) {
  4274. token = paramMetadata.token;
  4275. }
  4276. depProps.push(paramMetadata);
  4277. }
  4278. }
  4279. token = forward_ref_1.resolveForwardRef(token);
  4280. if (lang_1.isPresent(token)) {
  4281. return _createDependency(token, optional, lowerBoundVisibility, upperBoundVisibility, depProps);
  4282. }
  4283. else {
  4284. throw new exceptions_2.NoAnnotationError(typeOrFunc, params);
  4285. }
  4286. }
  4287. function _createDependency(token, optional, lowerBoundVisibility, upperBoundVisibility, depProps) {
  4288. return new Dependency(key_1.Key.get(token), optional, lowerBoundVisibility, upperBoundVisibility, depProps);
  4289. }
  4290. /***/ },
  4291. /* 14 */
  4292. /***/ function(module, exports, __webpack_require__) {
  4293. var __extends = (this && this.__extends) || function (d, b) {
  4294. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  4295. function __() { this.constructor = d; }
  4296. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  4297. };
  4298. var exception_handler_1 = __webpack_require__(15);
  4299. var exception_handler_2 = __webpack_require__(15);
  4300. exports.ExceptionHandler = exception_handler_2.ExceptionHandler;
  4301. var BaseException = (function (_super) {
  4302. __extends(BaseException, _super);
  4303. function BaseException(message) {
  4304. if (message === void 0) { message = "--"; }
  4305. _super.call(this, message);
  4306. this.message = message;
  4307. this.stack = (new Error(message)).stack;
  4308. }
  4309. BaseException.prototype.toString = function () { return this.message; };
  4310. return BaseException;
  4311. })(Error);
  4312. exports.BaseException = BaseException;
  4313. /**
  4314. * Wraps an exception and provides additional context or information.
  4315. */
  4316. var WrappedException = (function (_super) {
  4317. __extends(WrappedException, _super);
  4318. function WrappedException(_wrapperMessage, _originalException, _originalStack, _context) {
  4319. _super.call(this, _wrapperMessage);
  4320. this._wrapperMessage = _wrapperMessage;
  4321. this._originalException = _originalException;
  4322. this._originalStack = _originalStack;
  4323. this._context = _context;
  4324. this._wrapperStack = (new Error(_wrapperMessage)).stack;
  4325. }
  4326. Object.defineProperty(WrappedException.prototype, "wrapperMessage", {
  4327. get: function () { return this._wrapperMessage; },
  4328. enumerable: true,
  4329. configurable: true
  4330. });
  4331. Object.defineProperty(WrappedException.prototype, "wrapperStack", {
  4332. get: function () { return this._wrapperStack; },
  4333. enumerable: true,
  4334. configurable: true
  4335. });
  4336. Object.defineProperty(WrappedException.prototype, "originalException", {
  4337. get: function () { return this._originalException; },
  4338. enumerable: true,
  4339. configurable: true
  4340. });
  4341. Object.defineProperty(WrappedException.prototype, "originalStack", {
  4342. get: function () { return this._originalStack; },
  4343. enumerable: true,
  4344. configurable: true
  4345. });
  4346. Object.defineProperty(WrappedException.prototype, "context", {
  4347. get: function () { return this._context; },
  4348. enumerable: true,
  4349. configurable: true
  4350. });
  4351. Object.defineProperty(WrappedException.prototype, "message", {
  4352. get: function () { return exception_handler_1.ExceptionHandler.exceptionToString(this); },
  4353. enumerable: true,
  4354. configurable: true
  4355. });
  4356. WrappedException.prototype.toString = function () { return this.message; };
  4357. return WrappedException;
  4358. })(Error);
  4359. exports.WrappedException = WrappedException;
  4360. function makeTypeError(message) {
  4361. return new TypeError(message);
  4362. }
  4363. exports.makeTypeError = makeTypeError;
  4364. function unimplemented() {
  4365. throw new BaseException('unimplemented');
  4366. }
  4367. exports.unimplemented = unimplemented;
  4368. /***/ },
  4369. /* 15 */
  4370. /***/ function(module, exports, __webpack_require__) {
  4371. var lang_1 = __webpack_require__(5);
  4372. var exceptions_1 = __webpack_require__(14);
  4373. var collection_1 = __webpack_require__(12);
  4374. var _ArrayLogger = (function () {
  4375. function _ArrayLogger() {
  4376. this.res = [];
  4377. }
  4378. _ArrayLogger.prototype.log = function (s) { this.res.push(s); };
  4379. _ArrayLogger.prototype.logError = function (s) { this.res.push(s); };
  4380. _ArrayLogger.prototype.logGroup = function (s) { this.res.push(s); };
  4381. _ArrayLogger.prototype.logGroupEnd = function () { };
  4382. ;
  4383. return _ArrayLogger;
  4384. })();
  4385. /**
  4386. * Provides a hook for centralized exception handling.
  4387. *
  4388. * The default implementation of `ExceptionHandler` prints error messages to the `Console`. To
  4389. * intercept error handling,
  4390. * write a custom exception handler that replaces this default as appropriate for your app.
  4391. *
  4392. * ### Example
  4393. *
  4394. * ```javascript
  4395. *
  4396. * class MyExceptionHandler implements ExceptionHandler {
  4397. * call(error, stackTrace = null, reason = null) {
  4398. * // do something with the exception
  4399. * }
  4400. * }
  4401. *
  4402. * bootstrap(MyApp, [provide(ExceptionHandler, {useClass: MyExceptionHandler})])
  4403. *
  4404. * ```
  4405. */
  4406. var ExceptionHandler = (function () {
  4407. function ExceptionHandler(_logger, _rethrowException) {
  4408. if (_rethrowException === void 0) { _rethrowException = true; }
  4409. this._logger = _logger;
  4410. this._rethrowException = _rethrowException;
  4411. }
  4412. ExceptionHandler.exceptionToString = function (exception, stackTrace, reason) {
  4413. if (stackTrace === void 0) { stackTrace = null; }
  4414. if (reason === void 0) { reason = null; }
  4415. var l = new _ArrayLogger();
  4416. var e = new ExceptionHandler(l, false);
  4417. e.call(exception, stackTrace, reason);
  4418. return l.res.join("\n");
  4419. };
  4420. ExceptionHandler.prototype.call = function (exception, stackTrace, reason) {
  4421. if (stackTrace === void 0) { stackTrace = null; }
  4422. if (reason === void 0) { reason = null; }
  4423. var originalException = this._findOriginalException(exception);
  4424. var originalStack = this._findOriginalStack(exception);
  4425. var context = this._findContext(exception);
  4426. this._logger.logGroup("EXCEPTION: " + this._extractMessage(exception));
  4427. if (lang_1.isPresent(stackTrace) && lang_1.isBlank(originalStack)) {
  4428. this._logger.logError("STACKTRACE:");
  4429. this._logger.logError(this._longStackTrace(stackTrace));
  4430. }
  4431. if (lang_1.isPresent(reason)) {
  4432. this._logger.logError("REASON: " + reason);
  4433. }
  4434. if (lang_1.isPresent(originalException)) {
  4435. this._logger.logError("ORIGINAL EXCEPTION: " + this._extractMessage(originalException));
  4436. }
  4437. if (lang_1.isPresent(originalStack)) {
  4438. this._logger.logError("ORIGINAL STACKTRACE:");
  4439. this._logger.logError(this._longStackTrace(originalStack));
  4440. }
  4441. if (lang_1.isPresent(context)) {
  4442. this._logger.logError("ERROR CONTEXT:");
  4443. this._logger.logError(context);
  4444. }
  4445. this._logger.logGroupEnd();
  4446. // We rethrow exceptions, so operations like 'bootstrap' will result in an error
  4447. // when an exception happens. If we do not rethrow, bootstrap will always succeed.
  4448. if (this._rethrowException)
  4449. throw exception;
  4450. };
  4451. /** @internal */
  4452. ExceptionHandler.prototype._extractMessage = function (exception) {
  4453. return exception instanceof exceptions_1.WrappedException ? exception.wrapperMessage : exception.toString();
  4454. };
  4455. /** @internal */
  4456. ExceptionHandler.prototype._longStackTrace = function (stackTrace) {
  4457. return collection_1.isListLikeIterable(stackTrace) ? stackTrace.join("\n\n-----async gap-----\n") :
  4458. stackTrace.toString();
  4459. };
  4460. /** @internal */
  4461. ExceptionHandler.prototype._findContext = function (exception) {
  4462. try {
  4463. if (!(exception instanceof exceptions_1.WrappedException))
  4464. return null;
  4465. return lang_1.isPresent(exception.context) ? exception.context :
  4466. this._findContext(exception.originalException);
  4467. }
  4468. catch (e) {
  4469. // exception.context can throw an exception. if it happens, we ignore the context.
  4470. return null;
  4471. }
  4472. };
  4473. /** @internal */
  4474. ExceptionHandler.prototype._findOriginalException = function (exception) {
  4475. if (!(exception instanceof exceptions_1.WrappedException))
  4476. return null;
  4477. var e = exception.originalException;
  4478. while (e instanceof exceptions_1.WrappedException && lang_1.isPresent(e.originalException)) {
  4479. e = e.originalException;
  4480. }
  4481. return e;
  4482. };
  4483. /** @internal */
  4484. ExceptionHandler.prototype._findOriginalStack = function (exception) {
  4485. if (!(exception instanceof exceptions_1.WrappedException))
  4486. return null;
  4487. var e = exception;
  4488. var stack = exception.originalStack;
  4489. while (e instanceof exceptions_1.WrappedException && lang_1.isPresent(e.originalException)) {
  4490. e = e.originalException;
  4491. if (e instanceof exceptions_1.WrappedException && lang_1.isPresent(e.originalException)) {
  4492. stack = e.originalStack;
  4493. }
  4494. }
  4495. return stack;
  4496. };
  4497. return ExceptionHandler;
  4498. })();
  4499. exports.ExceptionHandler = ExceptionHandler;
  4500. /***/ },
  4501. /* 16 */
  4502. /***/ function(module, exports, __webpack_require__) {
  4503. var reflector_1 = __webpack_require__(17);
  4504. var reflector_2 = __webpack_require__(17);
  4505. exports.Reflector = reflector_2.Reflector;
  4506. exports.ReflectionInfo = reflector_2.ReflectionInfo;
  4507. var reflection_capabilities_1 = __webpack_require__(18);
  4508. /**
  4509. * The {@link Reflector} used internally in Angular to access metadata
  4510. * about symbols.
  4511. */
  4512. exports.reflector = new reflector_1.Reflector(new reflection_capabilities_1.ReflectionCapabilities());
  4513. /***/ },
  4514. /* 17 */
  4515. /***/ function(module, exports, __webpack_require__) {
  4516. var lang_1 = __webpack_require__(5);
  4517. var exceptions_1 = __webpack_require__(14);
  4518. var collection_1 = __webpack_require__(12);
  4519. /**
  4520. * Reflective information about a symbol, including annotations, interfaces, and other metadata.
  4521. */
  4522. var ReflectionInfo = (function () {
  4523. function ReflectionInfo(annotations, parameters, factory, interfaces, propMetadata) {
  4524. this.annotations = annotations;
  4525. this.parameters = parameters;
  4526. this.factory = factory;
  4527. this.interfaces = interfaces;
  4528. this.propMetadata = propMetadata;
  4529. }
  4530. return ReflectionInfo;
  4531. })();
  4532. exports.ReflectionInfo = ReflectionInfo;
  4533. /**
  4534. * Provides access to reflection data about symbols. Used internally by Angular
  4535. * to power dependency injection and compilation.
  4536. */
  4537. var Reflector = (function () {
  4538. function Reflector(reflectionCapabilities) {
  4539. /** @internal */
  4540. this._injectableInfo = new collection_1.Map();
  4541. /** @internal */
  4542. this._getters = new collection_1.Map();
  4543. /** @internal */
  4544. this._setters = new collection_1.Map();
  4545. /** @internal */
  4546. this._methods = new collection_1.Map();
  4547. this._usedKeys = null;
  4548. this.reflectionCapabilities = reflectionCapabilities;
  4549. }
  4550. Reflector.prototype.isReflectionEnabled = function () { return this.reflectionCapabilities.isReflectionEnabled(); };
  4551. /**
  4552. * Causes `this` reflector to track keys used to access
  4553. * {@link ReflectionInfo} objects.
  4554. */
  4555. Reflector.prototype.trackUsage = function () { this._usedKeys = new collection_1.Set(); };
  4556. /**
  4557. * Lists types for which reflection information was not requested since
  4558. * {@link #trackUsage} was called. This list could later be audited as
  4559. * potential dead code.
  4560. */
  4561. Reflector.prototype.listUnusedKeys = function () {
  4562. var _this = this;
  4563. if (this._usedKeys == null) {
  4564. throw new exceptions_1.BaseException('Usage tracking is disabled');
  4565. }
  4566. var allTypes = collection_1.MapWrapper.keys(this._injectableInfo);
  4567. return allTypes.filter(function (key) { return !collection_1.SetWrapper.has(_this._usedKeys, key); });
  4568. };
  4569. Reflector.prototype.registerFunction = function (func, funcInfo) {
  4570. this._injectableInfo.set(func, funcInfo);
  4571. };
  4572. Reflector.prototype.registerType = function (type, typeInfo) {
  4573. this._injectableInfo.set(type, typeInfo);
  4574. };
  4575. Reflector.prototype.registerGetters = function (getters) { _mergeMaps(this._getters, getters); };
  4576. Reflector.prototype.registerSetters = function (setters) { _mergeMaps(this._setters, setters); };
  4577. Reflector.prototype.registerMethods = function (methods) { _mergeMaps(this._methods, methods); };
  4578. Reflector.prototype.factory = function (type) {
  4579. if (this._containsReflectionInfo(type)) {
  4580. var res = this._getReflectionInfo(type).factory;
  4581. return lang_1.isPresent(res) ? res : null;
  4582. }
  4583. else {
  4584. return this.reflectionCapabilities.factory(type);
  4585. }
  4586. };
  4587. Reflector.prototype.parameters = function (typeOrFunc) {
  4588. if (this._injectableInfo.has(typeOrFunc)) {
  4589. var res = this._getReflectionInfo(typeOrFunc).parameters;
  4590. return lang_1.isPresent(res) ? res : [];
  4591. }
  4592. else {
  4593. return this.reflectionCapabilities.parameters(typeOrFunc);
  4594. }
  4595. };
  4596. Reflector.prototype.annotations = function (typeOrFunc) {
  4597. if (this._injectableInfo.has(typeOrFunc)) {
  4598. var res = this._getReflectionInfo(typeOrFunc).annotations;
  4599. return lang_1.isPresent(res) ? res : [];
  4600. }
  4601. else {
  4602. return this.reflectionCapabilities.annotations(typeOrFunc);
  4603. }
  4604. };
  4605. Reflector.prototype.propMetadata = function (typeOrFunc) {
  4606. if (this._injectableInfo.has(typeOrFunc)) {
  4607. var res = this._getReflectionInfo(typeOrFunc).propMetadata;
  4608. return lang_1.isPresent(res) ? res : {};
  4609. }
  4610. else {
  4611. return this.reflectionCapabilities.propMetadata(typeOrFunc);
  4612. }
  4613. };
  4614. Reflector.prototype.interfaces = function (type) {
  4615. if (this._injectableInfo.has(type)) {
  4616. var res = this._getReflectionInfo(type).interfaces;
  4617. return lang_1.isPresent(res) ? res : [];
  4618. }
  4619. else {
  4620. return this.reflectionCapabilities.interfaces(type);
  4621. }
  4622. };
  4623. Reflector.prototype.getter = function (name) {
  4624. if (this._getters.has(name)) {
  4625. return this._getters.get(name);
  4626. }
  4627. else {
  4628. return this.reflectionCapabilities.getter(name);
  4629. }
  4630. };
  4631. Reflector.prototype.setter = function (name) {
  4632. if (this._setters.has(name)) {
  4633. return this._setters.get(name);
  4634. }
  4635. else {
  4636. return this.reflectionCapabilities.setter(name);
  4637. }
  4638. };
  4639. Reflector.prototype.method = function (name) {
  4640. if (this._methods.has(name)) {
  4641. return this._methods.get(name);
  4642. }
  4643. else {
  4644. return this.reflectionCapabilities.method(name);
  4645. }
  4646. };
  4647. /** @internal */
  4648. Reflector.prototype._getReflectionInfo = function (typeOrFunc) {
  4649. if (lang_1.isPresent(this._usedKeys)) {
  4650. this._usedKeys.add(typeOrFunc);
  4651. }
  4652. return this._injectableInfo.get(typeOrFunc);
  4653. };
  4654. /** @internal */
  4655. Reflector.prototype._containsReflectionInfo = function (typeOrFunc) { return this._injectableInfo.has(typeOrFunc); };
  4656. Reflector.prototype.importUri = function (type) { return this.reflectionCapabilities.importUri(type); };
  4657. return Reflector;
  4658. })();
  4659. exports.Reflector = Reflector;
  4660. function _mergeMaps(target, config) {
  4661. collection_1.StringMapWrapper.forEach(config, function (v, k) { return target.set(k, v); });
  4662. }
  4663. /***/ },
  4664. /* 18 */
  4665. /***/ function(module, exports, __webpack_require__) {
  4666. var lang_1 = __webpack_require__(5);
  4667. var exceptions_1 = __webpack_require__(14);
  4668. var ReflectionCapabilities = (function () {
  4669. function ReflectionCapabilities(reflect) {
  4670. this._reflect = lang_1.isPresent(reflect) ? reflect : lang_1.global.Reflect;
  4671. }
  4672. ReflectionCapabilities.prototype.isReflectionEnabled = function () { return true; };
  4673. ReflectionCapabilities.prototype.factory = function (t) {
  4674. switch (t.length) {
  4675. case 0:
  4676. return function () { return new t(); };
  4677. case 1:
  4678. return function (a1) { return new t(a1); };
  4679. case 2:
  4680. return function (a1, a2) { return new t(a1, a2); };
  4681. case 3:
  4682. return function (a1, a2, a3) { return new t(a1, a2, a3); };
  4683. case 4:
  4684. return function (a1, a2, a3, a4) { return new t(a1, a2, a3, a4); };
  4685. case 5:
  4686. return function (a1, a2, a3, a4, a5) { return new t(a1, a2, a3, a4, a5); };
  4687. case 6:
  4688. return function (a1, a2, a3, a4, a5, a6) { return new t(a1, a2, a3, a4, a5, a6); };
  4689. case 7:
  4690. return function (a1, a2, a3, a4, a5, a6, a7) { return new t(a1, a2, a3, a4, a5, a6, a7); };
  4691. case 8:
  4692. return function (a1, a2, a3, a4, a5, a6, a7, a8) { return new t(a1, a2, a3, a4, a5, a6, a7, a8); };
  4693. case 9:
  4694. return function (a1, a2, a3, a4, a5, a6, a7, a8, a9) { return new t(a1, a2, a3, a4, a5, a6, a7, a8, a9); };
  4695. case 10:
  4696. return function (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) {
  4697. return new t(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
  4698. };
  4699. case 11:
  4700. return function (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) {
  4701. return new t(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
  4702. };
  4703. case 12:
  4704. return function (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) {
  4705. return new t(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12);
  4706. };
  4707. case 13:
  4708. return function (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) {
  4709. return new t(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13);
  4710. };
  4711. case 14:
  4712. return function (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) {
  4713. return new t(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14);
  4714. };
  4715. case 15:
  4716. return function (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) {
  4717. return new t(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15);
  4718. };
  4719. case 16:
  4720. return function (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) {
  4721. return new t(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16);
  4722. };
  4723. case 17:
  4724. return function (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17) {
  4725. return new t(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17);
  4726. };
  4727. case 18:
  4728. return function (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18) {
  4729. return new t(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18);
  4730. };
  4731. case 19:
  4732. return function (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19) {
  4733. return new t(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19);
  4734. };
  4735. case 20:
  4736. return function (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) {
  4737. return new t(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);
  4738. };
  4739. }
  4740. ;
  4741. throw new Error("Cannot create a factory for '" + lang_1.stringify(t) + "' because its constructor has more than 20 arguments");
  4742. };
  4743. /** @internal */
  4744. ReflectionCapabilities.prototype._zipTypesAndAnnotaions = function (paramTypes, paramAnnotations) {
  4745. var result;
  4746. if (typeof paramTypes === 'undefined') {
  4747. result = new Array(paramAnnotations.length);
  4748. }
  4749. else {
  4750. result = new Array(paramTypes.length);
  4751. }
  4752. for (var i = 0; i < result.length; i++) {
  4753. // TS outputs Object for parameters without types, while Traceur omits
  4754. // the annotations. For now we preserve the Traceur behavior to aid
  4755. // migration, but this can be revisited.
  4756. if (typeof paramTypes === 'undefined') {
  4757. result[i] = [];
  4758. }
  4759. else if (paramTypes[i] != Object) {
  4760. result[i] = [paramTypes[i]];
  4761. }
  4762. else {
  4763. result[i] = [];
  4764. }
  4765. if (lang_1.isPresent(paramAnnotations) && lang_1.isPresent(paramAnnotations[i])) {
  4766. result[i] = result[i].concat(paramAnnotations[i]);
  4767. }
  4768. }
  4769. return result;
  4770. };
  4771. ReflectionCapabilities.prototype.parameters = function (typeOrFunc) {
  4772. // Prefer the direct API.
  4773. if (lang_1.isPresent(typeOrFunc.parameters)) {
  4774. return typeOrFunc.parameters;
  4775. }
  4776. if (lang_1.isPresent(this._reflect) && lang_1.isPresent(this._reflect.getMetadata)) {
  4777. var paramAnnotations = this._reflect.getMetadata('parameters', typeOrFunc);
  4778. var paramTypes = this._reflect.getMetadata('design:paramtypes', typeOrFunc);
  4779. if (lang_1.isPresent(paramTypes) || lang_1.isPresent(paramAnnotations)) {
  4780. return this._zipTypesAndAnnotaions(paramTypes, paramAnnotations);
  4781. }
  4782. }
  4783. // The array has to be filled with `undefined` because holes would be skipped by `some`
  4784. var parameters = new Array(typeOrFunc.length);
  4785. parameters.fill(undefined);
  4786. return parameters;
  4787. };
  4788. ReflectionCapabilities.prototype.annotations = function (typeOrFunc) {
  4789. // Prefer the direct API.
  4790. if (lang_1.isPresent(typeOrFunc.annotations)) {
  4791. var annotations = typeOrFunc.annotations;
  4792. if (lang_1.isFunction(annotations) && annotations.annotations) {
  4793. annotations = annotations.annotations;
  4794. }
  4795. return annotations;
  4796. }
  4797. if (lang_1.isPresent(this._reflect) && lang_1.isPresent(this._reflect.getMetadata)) {
  4798. var annotations = this._reflect.getMetadata('annotations', typeOrFunc);
  4799. if (lang_1.isPresent(annotations))
  4800. return annotations;
  4801. }
  4802. return [];
  4803. };
  4804. ReflectionCapabilities.prototype.propMetadata = function (typeOrFunc) {
  4805. // Prefer the direct API.
  4806. if (lang_1.isPresent(typeOrFunc.propMetadata)) {
  4807. var propMetadata = typeOrFunc.propMetadata;
  4808. if (lang_1.isFunction(propMetadata) && propMetadata.propMetadata) {
  4809. propMetadata = propMetadata.propMetadata;
  4810. }
  4811. return propMetadata;
  4812. }
  4813. if (lang_1.isPresent(this._reflect) && lang_1.isPresent(this._reflect.getMetadata)) {
  4814. var propMetadata = this._reflect.getMetadata('propMetadata', typeOrFunc);
  4815. if (lang_1.isPresent(propMetadata))
  4816. return propMetadata;
  4817. }
  4818. return {};
  4819. };
  4820. ReflectionCapabilities.prototype.interfaces = function (type) {
  4821. throw new exceptions_1.BaseException("JavaScript does not support interfaces");
  4822. };
  4823. ReflectionCapabilities.prototype.getter = function (name) { return new Function('o', 'return o.' + name + ';'); };
  4824. ReflectionCapabilities.prototype.setter = function (name) {
  4825. return new Function('o', 'v', 'return o.' + name + ' = v;');
  4826. };
  4827. ReflectionCapabilities.prototype.method = function (name) {
  4828. var functionBody = "if (!o." + name + ") throw new Error('\"" + name + "\" is undefined');\n return o." + name + ".apply(o, args);";
  4829. return new Function('o', 'args', functionBody);
  4830. };
  4831. // There is not a concept of import uri in Js, but this is useful in developing Dart applications.
  4832. ReflectionCapabilities.prototype.importUri = function (type) { return './'; };
  4833. return ReflectionCapabilities;
  4834. })();
  4835. exports.ReflectionCapabilities = ReflectionCapabilities;
  4836. /***/ },
  4837. /* 19 */
  4838. /***/ function(module, exports, __webpack_require__) {
  4839. var lang_1 = __webpack_require__(5);
  4840. var exceptions_1 = __webpack_require__(14);
  4841. var type_literal_1 = __webpack_require__(20);
  4842. var forward_ref_1 = __webpack_require__(10);
  4843. var type_literal_2 = __webpack_require__(20);
  4844. exports.TypeLiteral = type_literal_2.TypeLiteral;
  4845. /**
  4846. * A unique object used for retrieving items from the {@link Injector}.
  4847. *
  4848. * Keys have:
  4849. * - a system-wide unique `id`.
  4850. * - a `token`.
  4851. *
  4852. * `Key` is used internally by {@link Injector} because its system-wide unique `id` allows the
  4853. * injector to store created objects in a more efficient way.
  4854. *
  4855. * `Key` should not be created directly. {@link Injector} creates keys automatically when resolving
  4856. * providers.
  4857. */
  4858. var Key = (function () {
  4859. /**
  4860. * Private
  4861. */
  4862. function Key(token, id) {
  4863. this.token = token;
  4864. this.id = id;
  4865. if (lang_1.isBlank(token)) {
  4866. throw new exceptions_1.BaseException('Token must be defined!');
  4867. }
  4868. }
  4869. Object.defineProperty(Key.prototype, "displayName", {
  4870. /**
  4871. * Returns a stringified token.
  4872. */
  4873. get: function () { return lang_1.stringify(this.token); },
  4874. enumerable: true,
  4875. configurable: true
  4876. });
  4877. /**
  4878. * Retrieves a `Key` for a token.
  4879. */
  4880. Key.get = function (token) { return _globalKeyRegistry.get(forward_ref_1.resolveForwardRef(token)); };
  4881. Object.defineProperty(Key, "numberOfKeys", {
  4882. /**
  4883. * @returns the number of keys registered in the system.
  4884. */
  4885. get: function () { return _globalKeyRegistry.numberOfKeys; },
  4886. enumerable: true,
  4887. configurable: true
  4888. });
  4889. return Key;
  4890. })();
  4891. exports.Key = Key;
  4892. /**
  4893. * @internal
  4894. */
  4895. var KeyRegistry = (function () {
  4896. function KeyRegistry() {
  4897. this._allKeys = new Map();
  4898. }
  4899. KeyRegistry.prototype.get = function (token) {
  4900. if (token instanceof Key)
  4901. return token;
  4902. // TODO: workaround for https://github.com/Microsoft/TypeScript/issues/3123
  4903. var theToken = token;
  4904. if (token instanceof type_literal_1.TypeLiteral) {
  4905. theToken = token.type;
  4906. }
  4907. token = theToken;
  4908. if (this._allKeys.has(token)) {
  4909. return this._allKeys.get(token);
  4910. }
  4911. var newKey = new Key(token, Key.numberOfKeys);
  4912. this._allKeys.set(token, newKey);
  4913. return newKey;
  4914. };
  4915. Object.defineProperty(KeyRegistry.prototype, "numberOfKeys", {
  4916. get: function () { return this._allKeys.size; },
  4917. enumerable: true,
  4918. configurable: true
  4919. });
  4920. return KeyRegistry;
  4921. })();
  4922. exports.KeyRegistry = KeyRegistry;
  4923. var _globalKeyRegistry = new KeyRegistry();
  4924. /***/ },
  4925. /* 20 */
  4926. /***/ function(module, exports) {
  4927. /**
  4928. * Type literals is a Dart-only feature. This is here only so we can x-compile
  4929. * to multiple languages.
  4930. */
  4931. var TypeLiteral = (function () {
  4932. function TypeLiteral() {
  4933. }
  4934. Object.defineProperty(TypeLiteral.prototype, "type", {
  4935. get: function () { throw new Error("Type literals are only supported in Dart"); },
  4936. enumerable: true,
  4937. configurable: true
  4938. });
  4939. return TypeLiteral;
  4940. })();
  4941. exports.TypeLiteral = TypeLiteral;
  4942. /***/ },
  4943. /* 21 */
  4944. /***/ function(module, exports, __webpack_require__) {
  4945. var __extends = (this && this.__extends) || function (d, b) {
  4946. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  4947. function __() { this.constructor = d; }
  4948. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  4949. };
  4950. var collection_1 = __webpack_require__(12);
  4951. var lang_1 = __webpack_require__(5);
  4952. var exceptions_1 = __webpack_require__(14);
  4953. function findFirstClosedCycle(keys) {
  4954. var res = [];
  4955. for (var i = 0; i < keys.length; ++i) {
  4956. if (collection_1.ListWrapper.contains(res, keys[i])) {
  4957. res.push(keys[i]);
  4958. return res;
  4959. }
  4960. else {
  4961. res.push(keys[i]);
  4962. }
  4963. }
  4964. return res;
  4965. }
  4966. function constructResolvingPath(keys) {
  4967. if (keys.length > 1) {
  4968. var reversed = findFirstClosedCycle(collection_1.ListWrapper.reversed(keys));
  4969. var tokenStrs = reversed.map(function (k) { return lang_1.stringify(k.token); });
  4970. return " (" + tokenStrs.join(' -> ') + ")";
  4971. }
  4972. else {
  4973. return "";
  4974. }
  4975. }
  4976. /**
  4977. * Base class for all errors arising from misconfigured providers.
  4978. */
  4979. var AbstractProviderError = (function (_super) {
  4980. __extends(AbstractProviderError, _super);
  4981. function AbstractProviderError(injector, key, constructResolvingMessage) {
  4982. _super.call(this, "DI Exception");
  4983. this.keys = [key];
  4984. this.injectors = [injector];
  4985. this.constructResolvingMessage = constructResolvingMessage;
  4986. this.message = this.constructResolvingMessage(this.keys);
  4987. }
  4988. AbstractProviderError.prototype.addKey = function (injector, key) {
  4989. this.injectors.push(injector);
  4990. this.keys.push(key);
  4991. this.message = this.constructResolvingMessage(this.keys);
  4992. };
  4993. Object.defineProperty(AbstractProviderError.prototype, "context", {
  4994. get: function () { return this.injectors[this.injectors.length - 1].debugContext(); },
  4995. enumerable: true,
  4996. configurable: true
  4997. });
  4998. return AbstractProviderError;
  4999. })(exceptions_1.BaseException);
  5000. exports.AbstractProviderError = AbstractProviderError;
  5001. /**
  5002. * Thrown when trying to retrieve a dependency by `Key` from {@link Injector}, but the
  5003. * {@link Injector} does not have a {@link Provider} for {@link Key}.
  5004. *
  5005. * ### Example ([live demo](http://plnkr.co/edit/vq8D3FRB9aGbnWJqtEPE?p=preview))
  5006. *
  5007. * ```typescript
  5008. * class A {
  5009. * constructor(b:B) {}
  5010. * }
  5011. *
  5012. * expect(() => Injector.resolveAndCreate([A])).toThrowError();
  5013. * ```
  5014. */
  5015. var NoProviderError = (function (_super) {
  5016. __extends(NoProviderError, _super);
  5017. function NoProviderError(injector, key) {
  5018. _super.call(this, injector, key, function (keys) {
  5019. var first = lang_1.stringify(collection_1.ListWrapper.first(keys).token);
  5020. return "No provider for " + first + "!" + constructResolvingPath(keys);
  5021. });
  5022. }
  5023. return NoProviderError;
  5024. })(AbstractProviderError);
  5025. exports.NoProviderError = NoProviderError;
  5026. /**
  5027. * Thrown when dependencies form a cycle.
  5028. *
  5029. * ### Example ([live demo](http://plnkr.co/edit/wYQdNos0Tzql3ei1EV9j?p=info))
  5030. *
  5031. * ```typescript
  5032. * var injector = Injector.resolveAndCreate([
  5033. * provide("one", {useFactory: (two) => "two", deps: [[new Inject("two")]]}),
  5034. * provide("two", {useFactory: (one) => "one", deps: [[new Inject("one")]]})
  5035. * ]);
  5036. *
  5037. * expect(() => injector.get("one")).toThrowError();
  5038. * ```
  5039. *
  5040. * Retrieving `A` or `B` throws a `CyclicDependencyError` as the graph above cannot be constructed.
  5041. */
  5042. var CyclicDependencyError = (function (_super) {
  5043. __extends(CyclicDependencyError, _super);
  5044. function CyclicDependencyError(injector, key) {
  5045. _super.call(this, injector, key, function (keys) {
  5046. return "Cannot instantiate cyclic dependency!" + constructResolvingPath(keys);
  5047. });
  5048. }
  5049. return CyclicDependencyError;
  5050. })(AbstractProviderError);
  5051. exports.CyclicDependencyError = CyclicDependencyError;
  5052. /**
  5053. * Thrown when a constructing type returns with an Error.
  5054. *
  5055. * The `InstantiationError` class contains the original error plus the dependency graph which caused
  5056. * this object to be instantiated.
  5057. *
  5058. * ### Example ([live demo](http://plnkr.co/edit/7aWYdcqTQsP0eNqEdUAf?p=preview))
  5059. *
  5060. * ```typescript
  5061. * class A {
  5062. * constructor() {
  5063. * throw new Error('message');
  5064. * }
  5065. * }
  5066. *
  5067. * var injector = Injector.resolveAndCreate([A]);
  5068. * try {
  5069. * injector.get(A);
  5070. * } catch (e) {
  5071. * expect(e instanceof InstantiationError).toBe(true);
  5072. * expect(e.originalException.message).toEqual("message");
  5073. * expect(e.originalStack).toBeDefined();
  5074. * }
  5075. * ```
  5076. */
  5077. var InstantiationError = (function (_super) {
  5078. __extends(InstantiationError, _super);
  5079. function InstantiationError(injector, originalException, originalStack, key) {
  5080. _super.call(this, "DI Exception", originalException, originalStack, null);
  5081. this.keys = [key];
  5082. this.injectors = [injector];
  5083. }
  5084. InstantiationError.prototype.addKey = function (injector, key) {
  5085. this.injectors.push(injector);
  5086. this.keys.push(key);
  5087. };
  5088. Object.defineProperty(InstantiationError.prototype, "wrapperMessage", {
  5089. get: function () {
  5090. var first = lang_1.stringify(collection_1.ListWrapper.first(this.keys).token);
  5091. return "Error during instantiation of " + first + "!" + constructResolvingPath(this.keys) + ".";
  5092. },
  5093. enumerable: true,
  5094. configurable: true
  5095. });
  5096. Object.defineProperty(InstantiationError.prototype, "causeKey", {
  5097. get: function () { return this.keys[0]; },
  5098. enumerable: true,
  5099. configurable: true
  5100. });
  5101. Object.defineProperty(InstantiationError.prototype, "context", {
  5102. get: function () { return this.injectors[this.injectors.length - 1].debugContext(); },
  5103. enumerable: true,
  5104. configurable: true
  5105. });
  5106. return InstantiationError;
  5107. })(exceptions_1.WrappedException);
  5108. exports.InstantiationError = InstantiationError;
  5109. /**
  5110. * Thrown when an object other then {@link Provider} (or `Type`) is passed to {@link Injector}
  5111. * creation.
  5112. *
  5113. * ### Example ([live demo](http://plnkr.co/edit/YatCFbPAMCL0JSSQ4mvH?p=preview))
  5114. *
  5115. * ```typescript
  5116. * expect(() => Injector.resolveAndCreate(["not a type"])).toThrowError();
  5117. * ```
  5118. */
  5119. var InvalidProviderError = (function (_super) {
  5120. __extends(InvalidProviderError, _super);
  5121. function InvalidProviderError(provider) {
  5122. _super.call(this, "Invalid provider - only instances of Provider and Type are allowed, got: " +
  5123. provider.toString());
  5124. }
  5125. return InvalidProviderError;
  5126. })(exceptions_1.BaseException);
  5127. exports.InvalidProviderError = InvalidProviderError;
  5128. /**
  5129. * Thrown when the class has no annotation information.
  5130. *
  5131. * Lack of annotation information prevents the {@link Injector} from determining which dependencies
  5132. * need to be injected into the constructor.
  5133. *
  5134. * ### Example ([live demo](http://plnkr.co/edit/rHnZtlNS7vJOPQ6pcVkm?p=preview))
  5135. *
  5136. * ```typescript
  5137. * class A {
  5138. * constructor(b) {}
  5139. * }
  5140. *
  5141. * expect(() => Injector.resolveAndCreate([A])).toThrowError();
  5142. * ```
  5143. *
  5144. * This error is also thrown when the class not marked with {@link Injectable} has parameter types.
  5145. *
  5146. * ```typescript
  5147. * class B {}
  5148. *
  5149. * class A {
  5150. * constructor(b:B) {} // no information about the parameter types of A is available at runtime.
  5151. * }
  5152. *
  5153. * expect(() => Injector.resolveAndCreate([A,B])).toThrowError();
  5154. * ```
  5155. */
  5156. var NoAnnotationError = (function (_super) {
  5157. __extends(NoAnnotationError, _super);
  5158. function NoAnnotationError(typeOrFunc, params) {
  5159. _super.call(this, NoAnnotationError._genMessage(typeOrFunc, params));
  5160. }
  5161. NoAnnotationError._genMessage = function (typeOrFunc, params) {
  5162. var signature = [];
  5163. for (var i = 0, ii = params.length; i < ii; i++) {
  5164. var parameter = params[i];
  5165. if (lang_1.isBlank(parameter) || parameter.length == 0) {
  5166. signature.push('?');
  5167. }
  5168. else {
  5169. signature.push(parameter.map(lang_1.stringify).join(' '));
  5170. }
  5171. }
  5172. return "Cannot resolve all parameters for " + lang_1.stringify(typeOrFunc) + "(" +
  5173. signature.join(', ') + "). " + 'Make sure they all have valid type or annotations.';
  5174. };
  5175. return NoAnnotationError;
  5176. })(exceptions_1.BaseException);
  5177. exports.NoAnnotationError = NoAnnotationError;
  5178. /**
  5179. * Thrown when getting an object by index.
  5180. *
  5181. * ### Example ([live demo](http://plnkr.co/edit/bRs0SX2OTQiJzqvjgl8P?p=preview))
  5182. *
  5183. * ```typescript
  5184. * class A {}
  5185. *
  5186. * var injector = Injector.resolveAndCreate([A]);
  5187. *
  5188. * expect(() => injector.getAt(100)).toThrowError();
  5189. * ```
  5190. */
  5191. var OutOfBoundsError = (function (_super) {
  5192. __extends(OutOfBoundsError, _super);
  5193. function OutOfBoundsError(index) {
  5194. _super.call(this, "Index " + index + " is out-of-bounds.");
  5195. }
  5196. return OutOfBoundsError;
  5197. })(exceptions_1.BaseException);
  5198. exports.OutOfBoundsError = OutOfBoundsError;
  5199. // TODO: add a working example after alpha38 is released
  5200. /**
  5201. * Thrown when a multi provider and a regular provider are bound to the same token.
  5202. *
  5203. * ### Example
  5204. *
  5205. * ```typescript
  5206. * expect(() => Injector.resolveAndCreate([
  5207. * new Provider("Strings", {useValue: "string1", multi: true}),
  5208. * new Provider("Strings", {useValue: "string2", multi: false})
  5209. * ])).toThrowError();
  5210. * ```
  5211. */
  5212. var MixingMultiProvidersWithRegularProvidersError = (function (_super) {
  5213. __extends(MixingMultiProvidersWithRegularProvidersError, _super);
  5214. function MixingMultiProvidersWithRegularProvidersError(provider1, provider2) {
  5215. _super.call(this, "Cannot mix multi providers and regular providers, got: " + provider1.toString() + " " +
  5216. provider2.toString());
  5217. }
  5218. return MixingMultiProvidersWithRegularProvidersError;
  5219. })(exceptions_1.BaseException);
  5220. exports.MixingMultiProvidersWithRegularProvidersError = MixingMultiProvidersWithRegularProvidersError;
  5221. /***/ },
  5222. /* 22 */
  5223. /***/ function(module, exports, __webpack_require__) {
  5224. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  5225. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  5226. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  5227. 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;
  5228. return c > 3 && r && Object.defineProperty(target, key, r), r;
  5229. };
  5230. var __metadata = (this && this.__metadata) || function (k, v) {
  5231. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  5232. };
  5233. var lang_1 = __webpack_require__(5);
  5234. /**
  5235. * Creates a token that can be used in a DI Provider.
  5236. *
  5237. * ### Example ([live demo](http://plnkr.co/edit/Ys9ezXpj2Mnoy3Uc8KBp?p=preview))
  5238. *
  5239. * ```typescript
  5240. * var t = new OpaqueToken("value");
  5241. *
  5242. * var injector = Injector.resolveAndCreate([
  5243. * provide(t, {useValue: "providedValue"})
  5244. * ]);
  5245. *
  5246. * expect(injector.get(t)).toEqual("bindingValue");
  5247. * ```
  5248. *
  5249. * Using an `OpaqueToken` is preferable to using strings as tokens because of possible collisions
  5250. * caused by multiple providers using the same string as two different tokens.
  5251. *
  5252. * Using an `OpaqueToken` is preferable to using an `Object` as tokens because it provides better
  5253. * error messages.
  5254. */
  5255. var OpaqueToken = (function () {
  5256. function OpaqueToken(_desc) {
  5257. this._desc = _desc;
  5258. }
  5259. OpaqueToken.prototype.toString = function () { return "Token " + this._desc; };
  5260. OpaqueToken = __decorate([
  5261. lang_1.CONST(),
  5262. __metadata('design:paramtypes', [String])
  5263. ], OpaqueToken);
  5264. return OpaqueToken;
  5265. })();
  5266. exports.OpaqueToken = OpaqueToken;
  5267. /***/ },
  5268. /* 23 */
  5269. /***/ function(module, exports, __webpack_require__) {
  5270. var __extends = (this && this.__extends) || function (d, b) {
  5271. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  5272. function __() { this.constructor = d; }
  5273. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  5274. };
  5275. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  5276. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  5277. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  5278. 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;
  5279. return c > 3 && r && Object.defineProperty(target, key, r), r;
  5280. };
  5281. var __metadata = (this && this.__metadata) || function (k, v) {
  5282. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  5283. };
  5284. var lang_1 = __webpack_require__(5);
  5285. var metadata_1 = __webpack_require__(7);
  5286. var change_detection_1 = __webpack_require__(24);
  5287. /**
  5288. * Directives allow you to attach behavior to elements in the DOM.
  5289. *
  5290. * {@link DirectiveMetadata}s with an embedded view are called {@link ComponentMetadata}s.
  5291. *
  5292. * A directive consists of a single directive annotation and a controller class. When the
  5293. * directive's `selector` matches
  5294. * elements in the DOM, the following steps occur:
  5295. *
  5296. * 1. For each directive, the `ElementInjector` attempts to resolve the directive's constructor
  5297. * arguments.
  5298. * 2. Angular instantiates directives for each matched element using `ElementInjector` in a
  5299. * depth-first order,
  5300. * as declared in the HTML.
  5301. *
  5302. * ## Understanding How Injection Works
  5303. *
  5304. * There are three stages of injection resolution.
  5305. * - *Pre-existing Injectors*:
  5306. * - The terminal {@link Injector} cannot resolve dependencies. It either throws an error or, if
  5307. * the dependency was
  5308. * specified as `@Optional`, returns `null`.
  5309. * - The platform injector resolves browser singleton resources, such as: cookies, title,
  5310. * location, and others.
  5311. * - *Component Injectors*: Each component instance has its own {@link Injector}, and they follow
  5312. * the same parent-child hierarchy
  5313. * as the component instances in the DOM.
  5314. * - *Element Injectors*: Each component instance has a Shadow DOM. Within the Shadow DOM each
  5315. * element has an `ElementInjector`
  5316. * which follow the same parent-child hierarchy as the DOM elements themselves.
  5317. *
  5318. * When a template is instantiated, it also must instantiate the corresponding directives in a
  5319. * depth-first order. The
  5320. * current `ElementInjector` resolves the constructor dependencies for each directive.
  5321. *
  5322. * Angular then resolves dependencies as follows, according to the order in which they appear in the
  5323. * {@link ViewMetadata}:
  5324. *
  5325. * 1. Dependencies on the current element
  5326. * 2. Dependencies on element injectors and their parents until it encounters a Shadow DOM boundary
  5327. * 3. Dependencies on component injectors and their parents until it encounters the root component
  5328. * 4. Dependencies on pre-existing injectors
  5329. *
  5330. *
  5331. * The `ElementInjector` can inject other directives, element-specific special objects, or it can
  5332. * delegate to the parent
  5333. * injector.
  5334. *
  5335. * To inject other directives, declare the constructor parameter as:
  5336. * - `directive:DirectiveType`: a directive on the current element only
  5337. * - `@Host() directive:DirectiveType`: any directive that matches the type between the current
  5338. * element and the
  5339. * Shadow DOM root.
  5340. * - `@Query(DirectiveType) query:QueryList<DirectiveType>`: A live collection of direct child
  5341. * directives.
  5342. * - `@QueryDescendants(DirectiveType) query:QueryList<DirectiveType>`: A live collection of any
  5343. * child directives.
  5344. *
  5345. * To inject element-specific special objects, declare the constructor parameter as:
  5346. * - `element: ElementRef` to obtain a reference to logical element in the view.
  5347. * - `viewContainer: ViewContainerRef` to control child template instantiation, for
  5348. * {@link DirectiveMetadata} directives only
  5349. * - `bindingPropagation: BindingPropagation` to control change detection in a more granular way.
  5350. *
  5351. * ### Example
  5352. *
  5353. * The following example demonstrates how dependency injection resolves constructor arguments in
  5354. * practice.
  5355. *
  5356. *
  5357. * Assume this HTML template:
  5358. *
  5359. * ```
  5360. * <div dependency="1">
  5361. * <div dependency="2">
  5362. * <div dependency="3" my-directive>
  5363. * <div dependency="4">
  5364. * <div dependency="5"></div>
  5365. * </div>
  5366. * <div dependency="6"></div>
  5367. * </div>
  5368. * </div>
  5369. * </div>
  5370. * ```
  5371. *
  5372. * With the following `dependency` decorator and `SomeService` injectable class.
  5373. *
  5374. * ```
  5375. * @Injectable()
  5376. * class SomeService {
  5377. * }
  5378. *
  5379. * @Directive({
  5380. * selector: '[dependency]',
  5381. * inputs: [
  5382. * 'id: dependency'
  5383. * ]
  5384. * })
  5385. * class Dependency {
  5386. * id:string;
  5387. * }
  5388. * ```
  5389. *
  5390. * Let's step through the different ways in which `MyDirective` could be declared...
  5391. *
  5392. *
  5393. * ### No injection
  5394. *
  5395. * Here the constructor is declared with no arguments, therefore nothing is injected into
  5396. * `MyDirective`.
  5397. *
  5398. * ```
  5399. * @Directive({ selector: '[my-directive]' })
  5400. * class MyDirective {
  5401. * constructor() {
  5402. * }
  5403. * }
  5404. * ```
  5405. *
  5406. * This directive would be instantiated with no dependencies.
  5407. *
  5408. *
  5409. * ### Component-level injection
  5410. *
  5411. * Directives can inject any injectable instance from the closest component injector or any of its
  5412. * parents.
  5413. *
  5414. * Here, the constructor declares a parameter, `someService`, and injects the `SomeService` type
  5415. * from the parent
  5416. * component's injector.
  5417. * ```
  5418. * @Directive({ selector: '[my-directive]' })
  5419. * class MyDirective {
  5420. * constructor(someService: SomeService) {
  5421. * }
  5422. * }
  5423. * ```
  5424. *
  5425. * This directive would be instantiated with a dependency on `SomeService`.
  5426. *
  5427. *
  5428. * ### Injecting a directive from the current element
  5429. *
  5430. * Directives can inject other directives declared on the current element.
  5431. *
  5432. * ```
  5433. * @Directive({ selector: '[my-directive]' })
  5434. * class MyDirective {
  5435. * constructor(dependency: Dependency) {
  5436. * expect(dependency.id).toEqual(3);
  5437. * }
  5438. * }
  5439. * ```
  5440. * This directive would be instantiated with `Dependency` declared at the same element, in this case
  5441. * `dependency="3"`.
  5442. *
  5443. * ### Injecting a directive from any ancestor elements
  5444. *
  5445. * Directives can inject other directives declared on any ancestor element (in the current Shadow
  5446. * DOM), i.e. on the current element, the
  5447. * parent element, or its parents.
  5448. * ```
  5449. * @Directive({ selector: '[my-directive]' })
  5450. * class MyDirective {
  5451. * constructor(@Host() dependency: Dependency) {
  5452. * expect(dependency.id).toEqual(2);
  5453. * }
  5454. * }
  5455. * ```
  5456. *
  5457. * `@Host` checks the current element, the parent, as well as its parents recursively. If
  5458. * `dependency="2"` didn't
  5459. * exist on the direct parent, this injection would
  5460. * have returned
  5461. * `dependency="1"`.
  5462. *
  5463. *
  5464. * ### Injecting a live collection of direct child directives
  5465. *
  5466. *
  5467. * A directive can also query for other child directives. Since parent directives are instantiated
  5468. * before child directives, a directive can't simply inject the list of child directives. Instead,
  5469. * the directive injects a {@link QueryList}, which updates its contents as children are added,
  5470. * removed, or moved by a directive that uses a {@link ViewContainerRef} such as a `ngFor`, an
  5471. * `ngIf`, or an `ngSwitch`.
  5472. *
  5473. * ```
  5474. * @Directive({ selector: '[my-directive]' })
  5475. * class MyDirective {
  5476. * constructor(@Query(Dependency) dependencies:QueryList<Dependency>) {
  5477. * }
  5478. * }
  5479. * ```
  5480. *
  5481. * This directive would be instantiated with a {@link QueryList} which contains `Dependency` 4 and
  5482. * `Dependency` 6. Here, `Dependency` 5 would not be included, because it is not a direct child.
  5483. *
  5484. * ### Injecting a live collection of descendant directives
  5485. *
  5486. * By passing the descendant flag to `@Query` above, we can include the children of the child
  5487. * elements.
  5488. *
  5489. * ```
  5490. * @Directive({ selector: '[my-directive]' })
  5491. * class MyDirective {
  5492. * constructor(@Query(Dependency, {descendants: true}) dependencies:QueryList<Dependency>) {
  5493. * }
  5494. * }
  5495. * ```
  5496. *
  5497. * This directive would be instantiated with a Query which would contain `Dependency` 4, 5 and 6.
  5498. *
  5499. * ### Optional injection
  5500. *
  5501. * The normal behavior of directives is to return an error when a specified dependency cannot be
  5502. * resolved. If you
  5503. * would like to inject `null` on unresolved dependency instead, you can annotate that dependency
  5504. * with `@Optional()`.
  5505. * This explicitly permits the author of a template to treat some of the surrounding directives as
  5506. * optional.
  5507. *
  5508. * ```
  5509. * @Directive({ selector: '[my-directive]' })
  5510. * class MyDirective {
  5511. * constructor(@Optional() dependency:Dependency) {
  5512. * }
  5513. * }
  5514. * ```
  5515. *
  5516. * This directive would be instantiated with a `Dependency` directive found on the current element.
  5517. * If none can be
  5518. * found, the injector supplies `null` instead of throwing an error.
  5519. *
  5520. * ### Example
  5521. *
  5522. * Here we use a decorator directive to simply define basic tool-tip behavior.
  5523. *
  5524. * ```
  5525. * @Directive({
  5526. * selector: '[tooltip]',
  5527. * inputs: [
  5528. * 'text: tooltip'
  5529. * ],
  5530. * host: {
  5531. * '(mouseenter)': 'onMouseEnter()',
  5532. * '(mouseleave)': 'onMouseLeave()'
  5533. * }
  5534. * })
  5535. * class Tooltip{
  5536. * text:string;
  5537. * overlay:Overlay; // NOT YET IMPLEMENTED
  5538. * overlayManager:OverlayManager; // NOT YET IMPLEMENTED
  5539. *
  5540. * constructor(overlayManager:OverlayManager) {
  5541. * this.overlay = overlay;
  5542. * }
  5543. *
  5544. * onMouseEnter() {
  5545. * // exact signature to be determined
  5546. * this.overlay = this.overlayManager.open(text, ...);
  5547. * }
  5548. *
  5549. * onMouseLeave() {
  5550. * this.overlay.close();
  5551. * this.overlay = null;
  5552. * }
  5553. * }
  5554. * ```
  5555. * In our HTML template, we can then add this behavior to a `<div>` or any other element with the
  5556. * `tooltip` selector,
  5557. * like so:
  5558. *
  5559. * ```
  5560. * <div tooltip="some text here"></div>
  5561. * ```
  5562. *
  5563. * Directives can also control the instantiation, destruction, and positioning of inline template
  5564. * elements:
  5565. *
  5566. * A directive uses a {@link ViewContainerRef} to instantiate, insert, move, and destroy views at
  5567. * runtime.
  5568. * The {@link ViewContainerRef} is created as a result of `<template>` element, and represents a
  5569. * location in the current view
  5570. * where these actions are performed.
  5571. *
  5572. * Views are always created as children of the current {@link ViewMetadata}, and as siblings of the
  5573. * `<template>` element. Thus a
  5574. * directive in a child view cannot inject the directive that created it.
  5575. *
  5576. * Since directives that create views via ViewContainers are common in Angular, and using the full
  5577. * `<template>` element syntax is wordy, Angular
  5578. * also supports a shorthand notation: `<li *foo="bar">` and `<li template="foo: bar">` are
  5579. * equivalent.
  5580. *
  5581. * Thus,
  5582. *
  5583. * ```
  5584. * <ul>
  5585. * <li *foo="bar" title="text"></li>
  5586. * </ul>
  5587. * ```
  5588. *
  5589. * Expands in use to:
  5590. *
  5591. * ```
  5592. * <ul>
  5593. * <template [foo]="bar">
  5594. * <li title="text"></li>
  5595. * </template>
  5596. * </ul>
  5597. * ```
  5598. *
  5599. * Notice that although the shorthand places `*foo="bar"` within the `<li>` element, the binding for
  5600. * the directive
  5601. * controller is correctly instantiated on the `<template>` element rather than the `<li>` element.
  5602. *
  5603. * ## Lifecycle hooks
  5604. *
  5605. * When the directive class implements some {@link angular2/lifecycle_hooks} the callbacks are
  5606. * called by the change detection at defined points in time during the life of the directive.
  5607. *
  5608. * ### Example
  5609. *
  5610. * Let's suppose we want to implement the `unless` behavior, to conditionally include a template.
  5611. *
  5612. * Here is a simple directive that triggers on an `unless` selector:
  5613. *
  5614. * ```
  5615. * @Directive({
  5616. * selector: '[unless]',
  5617. * inputs: ['unless']
  5618. * })
  5619. * export class Unless {
  5620. * viewContainer: ViewContainerRef;
  5621. * templateRef: TemplateRef;
  5622. * prevCondition: boolean;
  5623. *
  5624. * constructor(viewContainer: ViewContainerRef, templateRef: TemplateRef) {
  5625. * this.viewContainer = viewContainer;
  5626. * this.templateRef = templateRef;
  5627. * this.prevCondition = null;
  5628. * }
  5629. *
  5630. * set unless(newCondition) {
  5631. * if (newCondition && (isBlank(this.prevCondition) || !this.prevCondition)) {
  5632. * this.prevCondition = true;
  5633. * this.viewContainer.clear();
  5634. * } else if (!newCondition && (isBlank(this.prevCondition) || this.prevCondition)) {
  5635. * this.prevCondition = false;
  5636. * this.viewContainer.create(this.templateRef);
  5637. * }
  5638. * }
  5639. * }
  5640. * ```
  5641. *
  5642. * We can then use this `unless` selector in a template:
  5643. * ```
  5644. * <ul>
  5645. * <li *unless="expr"></li>
  5646. * </ul>
  5647. * ```
  5648. *
  5649. * Once the directive instantiates the child view, the shorthand notation for the template expands
  5650. * and the result is:
  5651. *
  5652. * ```
  5653. * <ul>
  5654. * <template [unless]="exp">
  5655. * <li></li>
  5656. * </template>
  5657. * <li></li>
  5658. * </ul>
  5659. * ```
  5660. *
  5661. * Note also that although the `<li></li>` template still exists inside the `<template></template>`,
  5662. * the instantiated
  5663. * view occurs on the second `<li></li>` which is a sibling to the `<template>` element.
  5664. */
  5665. var DirectiveMetadata = (function (_super) {
  5666. __extends(DirectiveMetadata, _super);
  5667. function DirectiveMetadata(_a) {
  5668. 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;
  5669. _super.call(this);
  5670. this.selector = selector;
  5671. this._inputs = inputs;
  5672. this._properties = properties;
  5673. this._outputs = outputs;
  5674. this._events = events;
  5675. this.host = host;
  5676. this.exportAs = exportAs;
  5677. this.queries = queries;
  5678. this._providers = providers;
  5679. this._bindings = bindings;
  5680. }
  5681. Object.defineProperty(DirectiveMetadata.prototype, "inputs", {
  5682. /**
  5683. * Enumerates the set of data-bound input properties for a directive
  5684. *
  5685. * Angular automatically updates input properties during change detection.
  5686. *
  5687. * The `inputs` property defines a set of `directiveProperty` to `bindingProperty`
  5688. * configuration:
  5689. *
  5690. * - `directiveProperty` specifies the component property where the value is written.
  5691. * - `bindingProperty` specifies the DOM property where the value is read from.
  5692. *
  5693. * When `bindingProperty` is not provided, it is assumed to be equal to `directiveProperty`.
  5694. *
  5695. * ### Example ([live demo](http://plnkr.co/edit/ivhfXY?p=preview))
  5696. *
  5697. * The following example creates a component with two data-bound properties.
  5698. *
  5699. * ```typescript
  5700. * @Component({
  5701. * selector: 'bank-account',
  5702. * inputs: ['bankName', 'id: account-id'],
  5703. * template: `
  5704. * Bank Name: {{bankName}}
  5705. * Account Id: {{id}}
  5706. * `
  5707. * })
  5708. * class BankAccount {
  5709. * bankName: string;
  5710. * id: string;
  5711. *
  5712. * // this property is not bound, and won't be automatically updated by Angular
  5713. * normalizedBankName: string;
  5714. * }
  5715. *
  5716. * @Component({
  5717. * selector: 'app',
  5718. * template: `
  5719. * <bank-account bank-name="RBC" account-id="4747"></bank-account>
  5720. * `,
  5721. * directives: [BankAccount]
  5722. * })
  5723. * class App {}
  5724. *
  5725. * bootstrap(App);
  5726. * ```
  5727. *
  5728. */
  5729. get: function () {
  5730. return lang_1.isPresent(this._properties) && this._properties.length > 0 ? this._properties :
  5731. this._inputs;
  5732. },
  5733. enumerable: true,
  5734. configurable: true
  5735. });
  5736. Object.defineProperty(DirectiveMetadata.prototype, "properties", {
  5737. get: function () { return this.inputs; },
  5738. enumerable: true,
  5739. configurable: true
  5740. });
  5741. Object.defineProperty(DirectiveMetadata.prototype, "outputs", {
  5742. /**
  5743. * Enumerates the set of event-bound output properties.
  5744. *
  5745. * When an output property emits an event, an event handler attached to that event
  5746. * the template is invoked.
  5747. *
  5748. * The `outputs` property defines a set of `directiveProperty` to `bindingProperty`
  5749. * configuration:
  5750. *
  5751. * - `directiveProperty` specifies the component property that emits events.
  5752. * - `bindingProperty` specifies the DOM property the event handler is attached to.
  5753. *
  5754. * ### Example ([live demo](http://plnkr.co/edit/d5CNq7?p=preview))
  5755. *
  5756. * ```typescript
  5757. * @Directive({
  5758. * selector: 'interval-dir',
  5759. * outputs: ['everySecond', 'five5Secs: everyFiveSeconds']
  5760. * })
  5761. * class IntervalDir {
  5762. * everySecond = new EventEmitter();
  5763. * five5Secs = new EventEmitter();
  5764. *
  5765. * constructor() {
  5766. * setInterval(() => this.everySecond.emit("event"), 1000);
  5767. * setInterval(() => this.five5Secs.emit("event"), 5000);
  5768. * }
  5769. * }
  5770. *
  5771. * @Component({
  5772. * selector: 'app',
  5773. * template: `
  5774. * <interval-dir (every-second)="everySecond()" (every-five-seconds)="everyFiveSeconds()">
  5775. * </interval-dir>
  5776. * `,
  5777. * directives: [IntervalDir]
  5778. * })
  5779. * class App {
  5780. * everySecond() { console.log('second'); }
  5781. * everyFiveSeconds() { console.log('five seconds'); }
  5782. * }
  5783. * bootstrap(App);
  5784. * ```
  5785. *
  5786. */
  5787. get: function () {
  5788. return lang_1.isPresent(this._events) && this._events.length > 0 ? this._events : this._outputs;
  5789. },
  5790. enumerable: true,
  5791. configurable: true
  5792. });
  5793. Object.defineProperty(DirectiveMetadata.prototype, "events", {
  5794. get: function () { return this.outputs; },
  5795. enumerable: true,
  5796. configurable: true
  5797. });
  5798. Object.defineProperty(DirectiveMetadata.prototype, "providers", {
  5799. /**
  5800. * Defines the set of injectable objects that are visible to a Directive and its light DOM
  5801. * children.
  5802. *
  5803. * ## Simple Example
  5804. *
  5805. * Here is an example of a class that can be injected:
  5806. *
  5807. * ```
  5808. * class Greeter {
  5809. * greet(name:string) {
  5810. * return 'Hello ' + name + '!';
  5811. * }
  5812. * }
  5813. *
  5814. * @Directive({
  5815. * selector: 'greet',
  5816. * bindings: [
  5817. * Greeter
  5818. * ]
  5819. * })
  5820. * class HelloWorld {
  5821. * greeter:Greeter;
  5822. *
  5823. * constructor(greeter:Greeter) {
  5824. * this.greeter = greeter;
  5825. * }
  5826. * }
  5827. * ```
  5828. */
  5829. get: function () {
  5830. return lang_1.isPresent(this._bindings) && this._bindings.length > 0 ? this._bindings :
  5831. this._providers;
  5832. },
  5833. enumerable: true,
  5834. configurable: true
  5835. });
  5836. Object.defineProperty(DirectiveMetadata.prototype, "bindings", {
  5837. /** @deprecated */
  5838. get: function () { return this.providers; },
  5839. enumerable: true,
  5840. configurable: true
  5841. });
  5842. DirectiveMetadata = __decorate([
  5843. lang_1.CONST(),
  5844. __metadata('design:paramtypes', [Object])
  5845. ], DirectiveMetadata);
  5846. return DirectiveMetadata;
  5847. })(metadata_1.InjectableMetadata);
  5848. exports.DirectiveMetadata = DirectiveMetadata;
  5849. /**
  5850. * Declare reusable UI building blocks for an application.
  5851. *
  5852. * Each Angular component requires a single `@Component` annotation. The
  5853. * `@Component`
  5854. * annotation specifies when a component is instantiated, and which properties and hostListeners it
  5855. * binds to.
  5856. *
  5857. * When a component is instantiated, Angular
  5858. * - creates a shadow DOM for the component.
  5859. * - loads the selected template into the shadow DOM.
  5860. * - creates all the injectable objects configured with `providers` and `viewProviders`.
  5861. *
  5862. * All template expressions and statements are then evaluated against the component instance.
  5863. *
  5864. * For details on the `@View` annotation, see {@link ViewMetadata}.
  5865. *
  5866. * ## Lifecycle hooks
  5867. *
  5868. * When the component class implements some {@link angular2/lifecycle_hooks} the callbacks are
  5869. * called by the change detection at defined points in time during the life of the component.
  5870. *
  5871. * ### Example
  5872. *
  5873. * {@example core/ts/metadata/metadata.ts region='component'}
  5874. */
  5875. var ComponentMetadata = (function (_super) {
  5876. __extends(ComponentMetadata, _super);
  5877. function ComponentMetadata(_a) {
  5878. 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;
  5879. _super.call(this, {
  5880. selector: selector,
  5881. inputs: inputs,
  5882. outputs: outputs,
  5883. properties: properties,
  5884. events: events,
  5885. host: host,
  5886. exportAs: exportAs,
  5887. bindings: bindings,
  5888. providers: providers,
  5889. queries: queries
  5890. });
  5891. this.changeDetection = changeDetection;
  5892. this._viewProviders = viewProviders;
  5893. this._viewBindings = viewBindings;
  5894. this.templateUrl = templateUrl;
  5895. this.template = template;
  5896. this.styleUrls = styleUrls;
  5897. this.styles = styles;
  5898. this.directives = directives;
  5899. this.pipes = pipes;
  5900. this.encapsulation = encapsulation;
  5901. this.moduleId = moduleId;
  5902. }
  5903. Object.defineProperty(ComponentMetadata.prototype, "viewProviders", {
  5904. /**
  5905. * Defines the set of injectable objects that are visible to its view DOM children.
  5906. *
  5907. * ## Simple Example
  5908. *
  5909. * Here is an example of a class that can be injected:
  5910. *
  5911. * ```
  5912. * class Greeter {
  5913. * greet(name:string) {
  5914. * return 'Hello ' + name + '!';
  5915. * }
  5916. * }
  5917. *
  5918. * @Directive({
  5919. * selector: 'needs-greeter'
  5920. * })
  5921. * class NeedsGreeter {
  5922. * greeter:Greeter;
  5923. *
  5924. * constructor(greeter:Greeter) {
  5925. * this.greeter = greeter;
  5926. * }
  5927. * }
  5928. *
  5929. * @Component({
  5930. * selector: 'greet',
  5931. * viewProviders: [
  5932. * Greeter
  5933. * ],
  5934. * template: `<needs-greeter></needs-greeter>`,
  5935. * directives: [NeedsGreeter]
  5936. * })
  5937. * class HelloWorld {
  5938. * }
  5939. *
  5940. * ```
  5941. */
  5942. get: function () {
  5943. return lang_1.isPresent(this._viewBindings) && this._viewBindings.length > 0 ? this._viewBindings :
  5944. this._viewProviders;
  5945. },
  5946. enumerable: true,
  5947. configurable: true
  5948. });
  5949. Object.defineProperty(ComponentMetadata.prototype, "viewBindings", {
  5950. get: function () { return this.viewProviders; },
  5951. enumerable: true,
  5952. configurable: true
  5953. });
  5954. ComponentMetadata = __decorate([
  5955. lang_1.CONST(),
  5956. __metadata('design:paramtypes', [Object])
  5957. ], ComponentMetadata);
  5958. return ComponentMetadata;
  5959. })(DirectiveMetadata);
  5960. exports.ComponentMetadata = ComponentMetadata;
  5961. /**
  5962. * Declare reusable pipe function.
  5963. *
  5964. * A "pure" pipe is only re-evaluated when either the input or any of the arguments change.
  5965. *
  5966. * When not specified, pipes default to being pure.
  5967. *
  5968. * ### Example
  5969. *
  5970. * {@example core/ts/metadata/metadata.ts region='pipe'}
  5971. */
  5972. var PipeMetadata = (function (_super) {
  5973. __extends(PipeMetadata, _super);
  5974. function PipeMetadata(_a) {
  5975. var name = _a.name, pure = _a.pure;
  5976. _super.call(this);
  5977. this.name = name;
  5978. this._pure = pure;
  5979. }
  5980. Object.defineProperty(PipeMetadata.prototype, "pure", {
  5981. get: function () { return lang_1.isPresent(this._pure) ? this._pure : true; },
  5982. enumerable: true,
  5983. configurable: true
  5984. });
  5985. PipeMetadata = __decorate([
  5986. lang_1.CONST(),
  5987. __metadata('design:paramtypes', [Object])
  5988. ], PipeMetadata);
  5989. return PipeMetadata;
  5990. })(metadata_1.InjectableMetadata);
  5991. exports.PipeMetadata = PipeMetadata;
  5992. /**
  5993. * Declares a data-bound input property.
  5994. *
  5995. * Angular automatically updates data-bound properties during change detection.
  5996. *
  5997. * `InputMetadata` takes an optional parameter that specifies the name
  5998. * used when instantiating a component in the template. When not provided,
  5999. * the name of the decorated property is used.
  6000. *
  6001. * ### Example
  6002. *
  6003. * The following example creates a component with two input properties.
  6004. *
  6005. * ```typescript
  6006. * @Component({
  6007. * selector: 'bank-account',
  6008. * template: `
  6009. * Bank Name: {{bankName}}
  6010. * Account Id: {{id}}
  6011. * `
  6012. * })
  6013. * class BankAccount {
  6014. * @Input() bankName: string;
  6015. * @Input('account-id') id: string;
  6016. *
  6017. * // this property is not bound, and won't be automatically updated by Angular
  6018. * normalizedBankName: string;
  6019. * }
  6020. *
  6021. * @Component({
  6022. * selector: 'app',
  6023. * template: `
  6024. * <bank-account bank-name="RBC" account-id="4747"></bank-account>
  6025. * `,
  6026. * directives: [BankAccount]
  6027. * })
  6028. * class App {}
  6029. *
  6030. * bootstrap(App);
  6031. * ```
  6032. */
  6033. var InputMetadata = (function () {
  6034. function InputMetadata(
  6035. /**
  6036. * Name used when instantiating a component in the temlate.
  6037. */
  6038. bindingPropertyName) {
  6039. this.bindingPropertyName = bindingPropertyName;
  6040. }
  6041. InputMetadata = __decorate([
  6042. lang_1.CONST(),
  6043. __metadata('design:paramtypes', [String])
  6044. ], InputMetadata);
  6045. return InputMetadata;
  6046. })();
  6047. exports.InputMetadata = InputMetadata;
  6048. /**
  6049. * Declares an event-bound output property.
  6050. *
  6051. * When an output property emits an event, an event handler attached to that event
  6052. * the template is invoked.
  6053. *
  6054. * `OutputMetadata` takes an optional parameter that specifies the name
  6055. * used when instantiating a component in the template. When not provided,
  6056. * the name of the decorated property is used.
  6057. *
  6058. * ### Example
  6059. *
  6060. * ```typescript
  6061. * @Directive({
  6062. * selector: 'interval-dir',
  6063. * })
  6064. * class IntervalDir {
  6065. * @Output() everySecond = new EventEmitter();
  6066. * @Output('everyFiveSeconds') five5Secs = new EventEmitter();
  6067. *
  6068. * constructor() {
  6069. * setInterval(() => this.everySecond.emit("event"), 1000);
  6070. * setInterval(() => this.five5Secs.emit("event"), 5000);
  6071. * }
  6072. * }
  6073. *
  6074. * @Component({
  6075. * selector: 'app',
  6076. * template: `
  6077. * <interval-dir (every-second)="everySecond()" (every-five-seconds)="everyFiveSeconds()">
  6078. * </interval-dir>
  6079. * `,
  6080. * directives: [IntervalDir]
  6081. * })
  6082. * class App {
  6083. * everySecond() { console.log('second'); }
  6084. * everyFiveSeconds() { console.log('five seconds'); }
  6085. * }
  6086. * bootstrap(App);
  6087. * ```
  6088. */
  6089. var OutputMetadata = (function () {
  6090. function OutputMetadata(bindingPropertyName) {
  6091. this.bindingPropertyName = bindingPropertyName;
  6092. }
  6093. OutputMetadata = __decorate([
  6094. lang_1.CONST(),
  6095. __metadata('design:paramtypes', [String])
  6096. ], OutputMetadata);
  6097. return OutputMetadata;
  6098. })();
  6099. exports.OutputMetadata = OutputMetadata;
  6100. /**
  6101. * Declares a host property binding.
  6102. *
  6103. * Angular automatically checks host property bindings during change detection.
  6104. * If a binding changes, it will update the host element of the directive.
  6105. *
  6106. * `HostBindingMetadata` takes an optional parameter that specifies the property
  6107. * name of the host element that will be updated. When not provided,
  6108. * the class property name is used.
  6109. *
  6110. * ### Example
  6111. *
  6112. * The following example creates a directive that sets the `valid` and `invalid` classes
  6113. * on the DOM element that has ngModel directive on it.
  6114. *
  6115. * ```typescript
  6116. * @Directive({selector: '[ngModel]'})
  6117. * class NgModelStatus {
  6118. * constructor(public control:NgModel) {}
  6119. * @HostBinding('[class.valid]') get valid { return this.control.valid; }
  6120. * @HostBinding('[class.invalid]') get invalid { return this.control.invalid; }
  6121. * }
  6122. *
  6123. * @Component({
  6124. * selector: 'app',
  6125. * template: `<input [(ngModel)]="prop">`,
  6126. * directives: [FORM_DIRECTIVES, NgModelStatus]
  6127. * })
  6128. * class App {
  6129. * prop;
  6130. * }
  6131. *
  6132. * bootstrap(App);
  6133. * ```
  6134. */
  6135. var HostBindingMetadata = (function () {
  6136. function HostBindingMetadata(hostPropertyName) {
  6137. this.hostPropertyName = hostPropertyName;
  6138. }
  6139. HostBindingMetadata = __decorate([
  6140. lang_1.CONST(),
  6141. __metadata('design:paramtypes', [String])
  6142. ], HostBindingMetadata);
  6143. return HostBindingMetadata;
  6144. })();
  6145. exports.HostBindingMetadata = HostBindingMetadata;
  6146. /**
  6147. * Declares a host listener.
  6148. *
  6149. * Angular will invoke the decorated method when the host element emits the specified event.
  6150. *
  6151. * If the decorated method returns `false`, then `preventDefault` is applied on the DOM
  6152. * event.
  6153. *
  6154. * ### Example
  6155. *
  6156. * The following example declares a directive that attaches a click listener to the button and
  6157. * counts clicks.
  6158. *
  6159. * ```typescript
  6160. * @Directive({selector: 'button[counting]'})
  6161. * class CountClicks {
  6162. * numberOfClicks = 0;
  6163. *
  6164. * @HostListener('click', ['$event.target'])
  6165. * onClick(btn) {
  6166. * console.log("button", btn, "number of clicks:", this.numberOfClicks++);
  6167. * }
  6168. * }
  6169. *
  6170. * @Component({
  6171. * selector: 'app',
  6172. * template: `<button counting>Increment</button>`,
  6173. * directives: [CountClicks]
  6174. * })
  6175. * class App {}
  6176. *
  6177. * bootstrap(App);
  6178. * ```
  6179. */
  6180. var HostListenerMetadata = (function () {
  6181. function HostListenerMetadata(eventName, args) {
  6182. this.eventName = eventName;
  6183. this.args = args;
  6184. }
  6185. HostListenerMetadata = __decorate([
  6186. lang_1.CONST(),
  6187. __metadata('design:paramtypes', [String, Array])
  6188. ], HostListenerMetadata);
  6189. return HostListenerMetadata;
  6190. })();
  6191. exports.HostListenerMetadata = HostListenerMetadata;
  6192. /***/ },
  6193. /* 24 */
  6194. /***/ function(module, exports, __webpack_require__) {
  6195. /**
  6196. * @module
  6197. * @description
  6198. * Change detection enables data binding in Angular.
  6199. */
  6200. var change_detection_1 = __webpack_require__(25);
  6201. exports.ChangeDetectionStrategy = change_detection_1.ChangeDetectionStrategy;
  6202. exports.ExpressionChangedAfterItHasBeenCheckedException = change_detection_1.ExpressionChangedAfterItHasBeenCheckedException;
  6203. exports.ChangeDetectionError = change_detection_1.ChangeDetectionError;
  6204. exports.ChangeDetectorRef = change_detection_1.ChangeDetectorRef;
  6205. exports.WrappedValue = change_detection_1.WrappedValue;
  6206. exports.SimpleChange = change_detection_1.SimpleChange;
  6207. exports.IterableDiffers = change_detection_1.IterableDiffers;
  6208. exports.KeyValueDiffers = change_detection_1.KeyValueDiffers;
  6209. /***/ },
  6210. /* 25 */
  6211. /***/ function(module, exports, __webpack_require__) {
  6212. var iterable_differs_1 = __webpack_require__(26);
  6213. var default_iterable_differ_1 = __webpack_require__(27);
  6214. var keyvalue_differs_1 = __webpack_require__(28);
  6215. var default_keyvalue_differ_1 = __webpack_require__(29);
  6216. var lang_1 = __webpack_require__(5);
  6217. var ast_1 = __webpack_require__(30);
  6218. exports.ASTWithSource = ast_1.ASTWithSource;
  6219. exports.AST = ast_1.AST;
  6220. exports.AstTransformer = ast_1.AstTransformer;
  6221. exports.PropertyRead = ast_1.PropertyRead;
  6222. exports.LiteralArray = ast_1.LiteralArray;
  6223. exports.ImplicitReceiver = ast_1.ImplicitReceiver;
  6224. var lexer_1 = __webpack_require__(31);
  6225. exports.Lexer = lexer_1.Lexer;
  6226. var parser_1 = __webpack_require__(32);
  6227. exports.Parser = parser_1.Parser;
  6228. var locals_1 = __webpack_require__(33);
  6229. exports.Locals = locals_1.Locals;
  6230. var exceptions_1 = __webpack_require__(34);
  6231. exports.DehydratedException = exceptions_1.DehydratedException;
  6232. exports.ExpressionChangedAfterItHasBeenCheckedException = exceptions_1.ExpressionChangedAfterItHasBeenCheckedException;
  6233. exports.ChangeDetectionError = exceptions_1.ChangeDetectionError;
  6234. var interfaces_1 = __webpack_require__(35);
  6235. exports.ChangeDetectorDefinition = interfaces_1.ChangeDetectorDefinition;
  6236. exports.DebugContext = interfaces_1.DebugContext;
  6237. exports.ChangeDetectorGenConfig = interfaces_1.ChangeDetectorGenConfig;
  6238. var constants_1 = __webpack_require__(36);
  6239. exports.ChangeDetectionStrategy = constants_1.ChangeDetectionStrategy;
  6240. exports.CHANGE_DETECTION_STRATEGY_VALUES = constants_1.CHANGE_DETECTION_STRATEGY_VALUES;
  6241. var proto_change_detector_1 = __webpack_require__(37);
  6242. exports.DynamicProtoChangeDetector = proto_change_detector_1.DynamicProtoChangeDetector;
  6243. var jit_proto_change_detector_1 = __webpack_require__(51);
  6244. exports.JitProtoChangeDetector = jit_proto_change_detector_1.JitProtoChangeDetector;
  6245. var binding_record_1 = __webpack_require__(40);
  6246. exports.BindingRecord = binding_record_1.BindingRecord;
  6247. exports.BindingTarget = binding_record_1.BindingTarget;
  6248. var directive_record_1 = __webpack_require__(41);
  6249. exports.DirectiveIndex = directive_record_1.DirectiveIndex;
  6250. exports.DirectiveRecord = directive_record_1.DirectiveRecord;
  6251. var dynamic_change_detector_1 = __webpack_require__(42);
  6252. exports.DynamicChangeDetector = dynamic_change_detector_1.DynamicChangeDetector;
  6253. var change_detector_ref_1 = __webpack_require__(44);
  6254. exports.ChangeDetectorRef = change_detector_ref_1.ChangeDetectorRef;
  6255. var iterable_differs_2 = __webpack_require__(26);
  6256. exports.IterableDiffers = iterable_differs_2.IterableDiffers;
  6257. var keyvalue_differs_2 = __webpack_require__(28);
  6258. exports.KeyValueDiffers = keyvalue_differs_2.KeyValueDiffers;
  6259. var change_detection_util_1 = __webpack_require__(38);
  6260. exports.WrappedValue = change_detection_util_1.WrappedValue;
  6261. exports.SimpleChange = change_detection_util_1.SimpleChange;
  6262. /**
  6263. * Structural diffing for `Object`s and `Map`s.
  6264. */
  6265. exports.keyValDiff = lang_1.CONST_EXPR([lang_1.CONST_EXPR(new default_keyvalue_differ_1.DefaultKeyValueDifferFactory())]);
  6266. /**
  6267. * Structural diffing for `Iterable` types such as `Array`s.
  6268. */
  6269. exports.iterableDiff = lang_1.CONST_EXPR([lang_1.CONST_EXPR(new default_iterable_differ_1.DefaultIterableDifferFactory())]);
  6270. exports.defaultIterableDiffers = lang_1.CONST_EXPR(new iterable_differs_1.IterableDiffers(exports.iterableDiff));
  6271. exports.defaultKeyValueDiffers = lang_1.CONST_EXPR(new keyvalue_differs_1.KeyValueDiffers(exports.keyValDiff));
  6272. /***/ },
  6273. /* 26 */
  6274. /***/ function(module, exports, __webpack_require__) {
  6275. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  6276. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  6277. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  6278. 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;
  6279. return c > 3 && r && Object.defineProperty(target, key, r), r;
  6280. };
  6281. var __metadata = (this && this.__metadata) || function (k, v) {
  6282. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  6283. };
  6284. var lang_1 = __webpack_require__(5);
  6285. var exceptions_1 = __webpack_require__(14);
  6286. var collection_1 = __webpack_require__(12);
  6287. var di_1 = __webpack_require__(6);
  6288. /**
  6289. * A repository of different iterable diffing strategies used by NgFor, NgClass, and others.
  6290. */
  6291. var IterableDiffers = (function () {
  6292. function IterableDiffers(factories) {
  6293. this.factories = factories;
  6294. }
  6295. IterableDiffers.create = function (factories, parent) {
  6296. if (lang_1.isPresent(parent)) {
  6297. var copied = collection_1.ListWrapper.clone(parent.factories);
  6298. factories = factories.concat(copied);
  6299. return new IterableDiffers(factories);
  6300. }
  6301. else {
  6302. return new IterableDiffers(factories);
  6303. }
  6304. };
  6305. /**
  6306. * Takes an array of {@link IterableDifferFactory} and returns a provider used to extend the
  6307. * inherited {@link IterableDiffers} instance with the provided factories and return a new
  6308. * {@link IterableDiffers} instance.
  6309. *
  6310. * The following example shows how to extend an existing list of factories,
  6311. * which will only be applied to the injector for this component and its children.
  6312. * This step is all that's required to make a new {@link IterableDiffer} available.
  6313. *
  6314. * ### Example
  6315. *
  6316. * ```
  6317. * @Component({
  6318. * viewProviders: [
  6319. * IterableDiffers.extend([new ImmutableListDiffer()])
  6320. * ]
  6321. * })
  6322. * ```
  6323. */
  6324. IterableDiffers.extend = function (factories) {
  6325. return new di_1.Provider(IterableDiffers, {
  6326. useFactory: function (parent) {
  6327. if (lang_1.isBlank(parent)) {
  6328. // Typically would occur when calling IterableDiffers.extend inside of dependencies passed
  6329. // to
  6330. // bootstrap(), which would override default pipes instead of extending them.
  6331. throw new exceptions_1.BaseException('Cannot extend IterableDiffers without a parent injector');
  6332. }
  6333. return IterableDiffers.create(factories, parent);
  6334. },
  6335. // Dependency technically isn't optional, but we can provide a better error message this way.
  6336. deps: [[IterableDiffers, new di_1.SkipSelfMetadata(), new di_1.OptionalMetadata()]]
  6337. });
  6338. };
  6339. IterableDiffers.prototype.find = function (iterable) {
  6340. var factory = this.factories.find(function (f) { return f.supports(iterable); });
  6341. if (lang_1.isPresent(factory)) {
  6342. return factory;
  6343. }
  6344. else {
  6345. throw new exceptions_1.BaseException("Cannot find a differ supporting object '" + iterable + "'");
  6346. }
  6347. };
  6348. IterableDiffers = __decorate([
  6349. di_1.Injectable(),
  6350. lang_1.CONST(),
  6351. __metadata('design:paramtypes', [Array])
  6352. ], IterableDiffers);
  6353. return IterableDiffers;
  6354. })();
  6355. exports.IterableDiffers = IterableDiffers;
  6356. /***/ },
  6357. /* 27 */
  6358. /***/ function(module, exports, __webpack_require__) {
  6359. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  6360. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  6361. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  6362. 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;
  6363. return c > 3 && r && Object.defineProperty(target, key, r), r;
  6364. };
  6365. var __metadata = (this && this.__metadata) || function (k, v) {
  6366. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  6367. };
  6368. var lang_1 = __webpack_require__(5);
  6369. var exceptions_1 = __webpack_require__(14);
  6370. var collection_1 = __webpack_require__(12);
  6371. var lang_2 = __webpack_require__(5);
  6372. var DefaultIterableDifferFactory = (function () {
  6373. function DefaultIterableDifferFactory() {
  6374. }
  6375. DefaultIterableDifferFactory.prototype.supports = function (obj) { return collection_1.isListLikeIterable(obj); };
  6376. DefaultIterableDifferFactory.prototype.create = function (cdRef) { return new DefaultIterableDiffer(); };
  6377. DefaultIterableDifferFactory = __decorate([
  6378. lang_1.CONST(),
  6379. __metadata('design:paramtypes', [])
  6380. ], DefaultIterableDifferFactory);
  6381. return DefaultIterableDifferFactory;
  6382. })();
  6383. exports.DefaultIterableDifferFactory = DefaultIterableDifferFactory;
  6384. var DefaultIterableDiffer = (function () {
  6385. function DefaultIterableDiffer() {
  6386. this._collection = null;
  6387. this._length = null;
  6388. // Keeps track of the used records at any point in time (during & across `_check()` calls)
  6389. this._linkedRecords = null;
  6390. // Keeps track of the removed records at any point in time during `_check()` calls.
  6391. this._unlinkedRecords = null;
  6392. this._previousItHead = null;
  6393. this._itHead = null;
  6394. this._itTail = null;
  6395. this._additionsHead = null;
  6396. this._additionsTail = null;
  6397. this._movesHead = null;
  6398. this._movesTail = null;
  6399. this._removalsHead = null;
  6400. this._removalsTail = null;
  6401. }
  6402. Object.defineProperty(DefaultIterableDiffer.prototype, "collection", {
  6403. get: function () { return this._collection; },
  6404. enumerable: true,
  6405. configurable: true
  6406. });
  6407. Object.defineProperty(DefaultIterableDiffer.prototype, "length", {
  6408. get: function () { return this._length; },
  6409. enumerable: true,
  6410. configurable: true
  6411. });
  6412. DefaultIterableDiffer.prototype.forEachItem = function (fn) {
  6413. var record;
  6414. for (record = this._itHead; record !== null; record = record._next) {
  6415. fn(record);
  6416. }
  6417. };
  6418. DefaultIterableDiffer.prototype.forEachPreviousItem = function (fn) {
  6419. var record;
  6420. for (record = this._previousItHead; record !== null; record = record._nextPrevious) {
  6421. fn(record);
  6422. }
  6423. };
  6424. DefaultIterableDiffer.prototype.forEachAddedItem = function (fn) {
  6425. var record;
  6426. for (record = this._additionsHead; record !== null; record = record._nextAdded) {
  6427. fn(record);
  6428. }
  6429. };
  6430. DefaultIterableDiffer.prototype.forEachMovedItem = function (fn) {
  6431. var record;
  6432. for (record = this._movesHead; record !== null; record = record._nextMoved) {
  6433. fn(record);
  6434. }
  6435. };
  6436. DefaultIterableDiffer.prototype.forEachRemovedItem = function (fn) {
  6437. var record;
  6438. for (record = this._removalsHead; record !== null; record = record._nextRemoved) {
  6439. fn(record);
  6440. }
  6441. };
  6442. DefaultIterableDiffer.prototype.diff = function (collection) {
  6443. if (lang_2.isBlank(collection))
  6444. collection = [];
  6445. if (!collection_1.isListLikeIterable(collection)) {
  6446. throw new exceptions_1.BaseException("Error trying to diff '" + collection + "'");
  6447. }
  6448. if (this.check(collection)) {
  6449. return this;
  6450. }
  6451. else {
  6452. return null;
  6453. }
  6454. };
  6455. DefaultIterableDiffer.prototype.onDestroy = function () { };
  6456. // todo(vicb): optim for UnmodifiableListView (frozen arrays)
  6457. DefaultIterableDiffer.prototype.check = function (collection) {
  6458. var _this = this;
  6459. this._reset();
  6460. var record = this._itHead;
  6461. var mayBeDirty = false;
  6462. var index;
  6463. var item;
  6464. if (lang_2.isArray(collection)) {
  6465. var list = collection;
  6466. this._length = collection.length;
  6467. for (index = 0; index < this._length; index++) {
  6468. item = list[index];
  6469. if (record === null || !lang_2.looseIdentical(record.item, item)) {
  6470. record = this._mismatch(record, item, index);
  6471. mayBeDirty = true;
  6472. }
  6473. else if (mayBeDirty) {
  6474. // TODO(misko): can we limit this to duplicates only?
  6475. record = this._verifyReinsertion(record, item, index);
  6476. }
  6477. record = record._next;
  6478. }
  6479. }
  6480. else {
  6481. index = 0;
  6482. collection_1.iterateListLike(collection, function (item) {
  6483. if (record === null || !lang_2.looseIdentical(record.item, item)) {
  6484. record = _this._mismatch(record, item, index);
  6485. mayBeDirty = true;
  6486. }
  6487. else if (mayBeDirty) {
  6488. // TODO(misko): can we limit this to duplicates only?
  6489. record = _this._verifyReinsertion(record, item, index);
  6490. }
  6491. record = record._next;
  6492. index++;
  6493. });
  6494. this._length = index;
  6495. }
  6496. this._truncate(record);
  6497. this._collection = collection;
  6498. return this.isDirty;
  6499. };
  6500. Object.defineProperty(DefaultIterableDiffer.prototype, "isDirty", {
  6501. // CollectionChanges is considered dirty if it has any additions, moves or removals.
  6502. get: function () {
  6503. return this._additionsHead !== null || this._movesHead !== null || this._removalsHead !== null;
  6504. },
  6505. enumerable: true,
  6506. configurable: true
  6507. });
  6508. /**
  6509. * Reset the state of the change objects to show no changes. This means set previousKey to
  6510. * currentKey, and clear all of the queues (additions, moves, removals).
  6511. * Set the previousIndexes of moved and added items to their currentIndexes
  6512. * Reset the list of additions, moves and removals
  6513. *
  6514. * @internal
  6515. */
  6516. DefaultIterableDiffer.prototype._reset = function () {
  6517. if (this.isDirty) {
  6518. var record;
  6519. var nextRecord;
  6520. for (record = this._previousItHead = this._itHead; record !== null; record = record._next) {
  6521. record._nextPrevious = record._next;
  6522. }
  6523. for (record = this._additionsHead; record !== null; record = record._nextAdded) {
  6524. record.previousIndex = record.currentIndex;
  6525. }
  6526. this._additionsHead = this._additionsTail = null;
  6527. for (record = this._movesHead; record !== null; record = nextRecord) {
  6528. record.previousIndex = record.currentIndex;
  6529. nextRecord = record._nextMoved;
  6530. }
  6531. this._movesHead = this._movesTail = null;
  6532. this._removalsHead = this._removalsTail = null;
  6533. }
  6534. };
  6535. /**
  6536. * This is the core function which handles differences between collections.
  6537. *
  6538. * - `record` is the record which we saw at this position last time. If null then it is a new
  6539. * item.
  6540. * - `item` is the current item in the collection
  6541. * - `index` is the position of the item in the collection
  6542. *
  6543. * @internal
  6544. */
  6545. DefaultIterableDiffer.prototype._mismatch = function (record, item, index) {
  6546. // The previous record after which we will append the current one.
  6547. var previousRecord;
  6548. if (record === null) {
  6549. previousRecord = this._itTail;
  6550. }
  6551. else {
  6552. previousRecord = record._prev;
  6553. // Remove the record from the collection since we know it does not match the item.
  6554. this._remove(record);
  6555. }
  6556. // Attempt to see if we have seen the item before.
  6557. record = this._linkedRecords === null ? null : this._linkedRecords.get(item, index);
  6558. if (record !== null) {
  6559. // We have seen this before, we need to move it forward in the collection.
  6560. this._moveAfter(record, previousRecord, index);
  6561. }
  6562. else {
  6563. // Never seen it, check evicted list.
  6564. record = this._unlinkedRecords === null ? null : this._unlinkedRecords.get(item);
  6565. if (record !== null) {
  6566. // It is an item which we have evicted earlier: reinsert it back into the list.
  6567. this._reinsertAfter(record, previousRecord, index);
  6568. }
  6569. else {
  6570. // It is a new item: add it.
  6571. record = this._addAfter(new CollectionChangeRecord(item), previousRecord, index);
  6572. }
  6573. }
  6574. return record;
  6575. };
  6576. /**
  6577. * This check is only needed if an array contains duplicates. (Short circuit of nothing dirty)
  6578. *
  6579. * Use case: `[a, a]` => `[b, a, a]`
  6580. *
  6581. * If we did not have this check then the insertion of `b` would:
  6582. * 1) evict first `a`
  6583. * 2) insert `b` at `0` index.
  6584. * 3) leave `a` at index `1` as is. <-- this is wrong!
  6585. * 3) reinsert `a` at index 2. <-- this is wrong!
  6586. *
  6587. * The correct behavior is:
  6588. * 1) evict first `a`
  6589. * 2) insert `b` at `0` index.
  6590. * 3) reinsert `a` at index 1.
  6591. * 3) move `a` at from `1` to `2`.
  6592. *
  6593. *
  6594. * Double check that we have not evicted a duplicate item. We need to check if the item type may
  6595. * have already been removed:
  6596. * The insertion of b will evict the first 'a'. If we don't reinsert it now it will be reinserted
  6597. * at the end. Which will show up as the two 'a's switching position. This is incorrect, since a
  6598. * better way to think of it is as insert of 'b' rather then switch 'a' with 'b' and then add 'a'
  6599. * at the end.
  6600. *
  6601. * @internal
  6602. */
  6603. DefaultIterableDiffer.prototype._verifyReinsertion = function (record, item, index) {
  6604. var reinsertRecord = this._unlinkedRecords === null ? null : this._unlinkedRecords.get(item);
  6605. if (reinsertRecord !== null) {
  6606. record = this._reinsertAfter(reinsertRecord, record._prev, index);
  6607. }
  6608. else if (record.currentIndex != index) {
  6609. record.currentIndex = index;
  6610. this._addToMoves(record, index);
  6611. }
  6612. return record;
  6613. };
  6614. /**
  6615. * Get rid of any excess {@link CollectionChangeRecord}s from the previous collection
  6616. *
  6617. * - `record` The first excess {@link CollectionChangeRecord}.
  6618. *
  6619. * @internal
  6620. */
  6621. DefaultIterableDiffer.prototype._truncate = function (record) {
  6622. // Anything after that needs to be removed;
  6623. while (record !== null) {
  6624. var nextRecord = record._next;
  6625. this._addToRemovals(this._unlink(record));
  6626. record = nextRecord;
  6627. }
  6628. if (this._unlinkedRecords !== null) {
  6629. this._unlinkedRecords.clear();
  6630. }
  6631. if (this._additionsTail !== null) {
  6632. this._additionsTail._nextAdded = null;
  6633. }
  6634. if (this._movesTail !== null) {
  6635. this._movesTail._nextMoved = null;
  6636. }
  6637. if (this._itTail !== null) {
  6638. this._itTail._next = null;
  6639. }
  6640. if (this._removalsTail !== null) {
  6641. this._removalsTail._nextRemoved = null;
  6642. }
  6643. };
  6644. /** @internal */
  6645. DefaultIterableDiffer.prototype._reinsertAfter = function (record, prevRecord, index) {
  6646. if (this._unlinkedRecords !== null) {
  6647. this._unlinkedRecords.remove(record);
  6648. }
  6649. var prev = record._prevRemoved;
  6650. var next = record._nextRemoved;
  6651. if (prev === null) {
  6652. this._removalsHead = next;
  6653. }
  6654. else {
  6655. prev._nextRemoved = next;
  6656. }
  6657. if (next === null) {
  6658. this._removalsTail = prev;
  6659. }
  6660. else {
  6661. next._prevRemoved = prev;
  6662. }
  6663. this._insertAfter(record, prevRecord, index);
  6664. this._addToMoves(record, index);
  6665. return record;
  6666. };
  6667. /** @internal */
  6668. DefaultIterableDiffer.prototype._moveAfter = function (record, prevRecord, index) {
  6669. this._unlink(record);
  6670. this._insertAfter(record, prevRecord, index);
  6671. this._addToMoves(record, index);
  6672. return record;
  6673. };
  6674. /** @internal */
  6675. DefaultIterableDiffer.prototype._addAfter = function (record, prevRecord, index) {
  6676. this._insertAfter(record, prevRecord, index);
  6677. if (this._additionsTail === null) {
  6678. // todo(vicb)
  6679. // assert(this._additionsHead === null);
  6680. this._additionsTail = this._additionsHead = record;
  6681. }
  6682. else {
  6683. // todo(vicb)
  6684. // assert(_additionsTail._nextAdded === null);
  6685. // assert(record._nextAdded === null);
  6686. this._additionsTail = this._additionsTail._nextAdded = record;
  6687. }
  6688. return record;
  6689. };
  6690. /** @internal */
  6691. DefaultIterableDiffer.prototype._insertAfter = function (record, prevRecord, index) {
  6692. // todo(vicb)
  6693. // assert(record != prevRecord);
  6694. // assert(record._next === null);
  6695. // assert(record._prev === null);
  6696. var next = prevRecord === null ? this._itHead : prevRecord._next;
  6697. // todo(vicb)
  6698. // assert(next != record);
  6699. // assert(prevRecord != record);
  6700. record._next = next;
  6701. record._prev = prevRecord;
  6702. if (next === null) {
  6703. this._itTail = record;
  6704. }
  6705. else {
  6706. next._prev = record;
  6707. }
  6708. if (prevRecord === null) {
  6709. this._itHead = record;
  6710. }
  6711. else {
  6712. prevRecord._next = record;
  6713. }
  6714. if (this._linkedRecords === null) {
  6715. this._linkedRecords = new _DuplicateMap();
  6716. }
  6717. this._linkedRecords.put(record);
  6718. record.currentIndex = index;
  6719. return record;
  6720. };
  6721. /** @internal */
  6722. DefaultIterableDiffer.prototype._remove = function (record) {
  6723. return this._addToRemovals(this._unlink(record));
  6724. };
  6725. /** @internal */
  6726. DefaultIterableDiffer.prototype._unlink = function (record) {
  6727. if (this._linkedRecords !== null) {
  6728. this._linkedRecords.remove(record);
  6729. }
  6730. var prev = record._prev;
  6731. var next = record._next;
  6732. // todo(vicb)
  6733. // assert((record._prev = null) === null);
  6734. // assert((record._next = null) === null);
  6735. if (prev === null) {
  6736. this._itHead = next;
  6737. }
  6738. else {
  6739. prev._next = next;
  6740. }
  6741. if (next === null) {
  6742. this._itTail = prev;
  6743. }
  6744. else {
  6745. next._prev = prev;
  6746. }
  6747. return record;
  6748. };
  6749. /** @internal */
  6750. DefaultIterableDiffer.prototype._addToMoves = function (record, toIndex) {
  6751. // todo(vicb)
  6752. // assert(record._nextMoved === null);
  6753. if (record.previousIndex === toIndex) {
  6754. return record;
  6755. }
  6756. if (this._movesTail === null) {
  6757. // todo(vicb)
  6758. // assert(_movesHead === null);
  6759. this._movesTail = this._movesHead = record;
  6760. }
  6761. else {
  6762. // todo(vicb)
  6763. // assert(_movesTail._nextMoved === null);
  6764. this._movesTail = this._movesTail._nextMoved = record;
  6765. }
  6766. return record;
  6767. };
  6768. /** @internal */
  6769. DefaultIterableDiffer.prototype._addToRemovals = function (record) {
  6770. if (this._unlinkedRecords === null) {
  6771. this._unlinkedRecords = new _DuplicateMap();
  6772. }
  6773. this._unlinkedRecords.put(record);
  6774. record.currentIndex = null;
  6775. record._nextRemoved = null;
  6776. if (this._removalsTail === null) {
  6777. // todo(vicb)
  6778. // assert(_removalsHead === null);
  6779. this._removalsTail = this._removalsHead = record;
  6780. record._prevRemoved = null;
  6781. }
  6782. else {
  6783. // todo(vicb)
  6784. // assert(_removalsTail._nextRemoved === null);
  6785. // assert(record._nextRemoved === null);
  6786. record._prevRemoved = this._removalsTail;
  6787. this._removalsTail = this._removalsTail._nextRemoved = record;
  6788. }
  6789. return record;
  6790. };
  6791. DefaultIterableDiffer.prototype.toString = function () {
  6792. var record;
  6793. var list = [];
  6794. for (record = this._itHead; record !== null; record = record._next) {
  6795. list.push(record);
  6796. }
  6797. var previous = [];
  6798. for (record = this._previousItHead; record !== null; record = record._nextPrevious) {
  6799. previous.push(record);
  6800. }
  6801. var additions = [];
  6802. for (record = this._additionsHead; record !== null; record = record._nextAdded) {
  6803. additions.push(record);
  6804. }
  6805. var moves = [];
  6806. for (record = this._movesHead; record !== null; record = record._nextMoved) {
  6807. moves.push(record);
  6808. }
  6809. var removals = [];
  6810. for (record = this._removalsHead; record !== null; record = record._nextRemoved) {
  6811. removals.push(record);
  6812. }
  6813. return "collection: " + list.join(', ') + "\n" + "previous: " + previous.join(', ') + "\n" +
  6814. "additions: " + additions.join(', ') + "\n" + "moves: " + moves.join(', ') + "\n" +
  6815. "removals: " + removals.join(', ') + "\n";
  6816. };
  6817. return DefaultIterableDiffer;
  6818. })();
  6819. exports.DefaultIterableDiffer = DefaultIterableDiffer;
  6820. var CollectionChangeRecord = (function () {
  6821. function CollectionChangeRecord(item) {
  6822. this.item = item;
  6823. this.currentIndex = null;
  6824. this.previousIndex = null;
  6825. /** @internal */
  6826. this._nextPrevious = null;
  6827. /** @internal */
  6828. this._prev = null;
  6829. /** @internal */
  6830. this._next = null;
  6831. /** @internal */
  6832. this._prevDup = null;
  6833. /** @internal */
  6834. this._nextDup = null;
  6835. /** @internal */
  6836. this._prevRemoved = null;
  6837. /** @internal */
  6838. this._nextRemoved = null;
  6839. /** @internal */
  6840. this._nextAdded = null;
  6841. /** @internal */
  6842. this._nextMoved = null;
  6843. }
  6844. CollectionChangeRecord.prototype.toString = function () {
  6845. return this.previousIndex === this.currentIndex ?
  6846. lang_2.stringify(this.item) :
  6847. lang_2.stringify(this.item) + '[' + lang_2.stringify(this.previousIndex) + '->' +
  6848. lang_2.stringify(this.currentIndex) + ']';
  6849. };
  6850. return CollectionChangeRecord;
  6851. })();
  6852. exports.CollectionChangeRecord = CollectionChangeRecord;
  6853. // A linked list of CollectionChangeRecords with the same CollectionChangeRecord.item
  6854. var _DuplicateItemRecordList = (function () {
  6855. function _DuplicateItemRecordList() {
  6856. /** @internal */
  6857. this._head = null;
  6858. /** @internal */
  6859. this._tail = null;
  6860. }
  6861. /**
  6862. * Append the record to the list of duplicates.
  6863. *
  6864. * Note: by design all records in the list of duplicates hold the same value in record.item.
  6865. */
  6866. _DuplicateItemRecordList.prototype.add = function (record) {
  6867. if (this._head === null) {
  6868. this._head = this._tail = record;
  6869. record._nextDup = null;
  6870. record._prevDup = null;
  6871. }
  6872. else {
  6873. // todo(vicb)
  6874. // assert(record.item == _head.item ||
  6875. // record.item is num && record.item.isNaN && _head.item is num && _head.item.isNaN);
  6876. this._tail._nextDup = record;
  6877. record._prevDup = this._tail;
  6878. record._nextDup = null;
  6879. this._tail = record;
  6880. }
  6881. };
  6882. // Returns a CollectionChangeRecord having CollectionChangeRecord.item == item and
  6883. // CollectionChangeRecord.currentIndex >= afterIndex
  6884. _DuplicateItemRecordList.prototype.get = function (item, afterIndex) {
  6885. var record;
  6886. for (record = this._head; record !== null; record = record._nextDup) {
  6887. if ((afterIndex === null || afterIndex < record.currentIndex) &&
  6888. lang_2.looseIdentical(record.item, item)) {
  6889. return record;
  6890. }
  6891. }
  6892. return null;
  6893. };
  6894. /**
  6895. * Remove one {@link CollectionChangeRecord} from the list of duplicates.
  6896. *
  6897. * Returns whether the list of duplicates is empty.
  6898. */
  6899. _DuplicateItemRecordList.prototype.remove = function (record) {
  6900. // todo(vicb)
  6901. // assert(() {
  6902. // // verify that the record being removed is in the list.
  6903. // for (CollectionChangeRecord cursor = _head; cursor != null; cursor = cursor._nextDup) {
  6904. // if (identical(cursor, record)) return true;
  6905. // }
  6906. // return false;
  6907. //});
  6908. var prev = record._prevDup;
  6909. var next = record._nextDup;
  6910. if (prev === null) {
  6911. this._head = next;
  6912. }
  6913. else {
  6914. prev._nextDup = next;
  6915. }
  6916. if (next === null) {
  6917. this._tail = prev;
  6918. }
  6919. else {
  6920. next._prevDup = prev;
  6921. }
  6922. return this._head === null;
  6923. };
  6924. return _DuplicateItemRecordList;
  6925. })();
  6926. var _DuplicateMap = (function () {
  6927. function _DuplicateMap() {
  6928. this.map = new Map();
  6929. }
  6930. _DuplicateMap.prototype.put = function (record) {
  6931. // todo(vicb) handle corner cases
  6932. var key = lang_2.getMapKey(record.item);
  6933. var duplicates = this.map.get(key);
  6934. if (!lang_2.isPresent(duplicates)) {
  6935. duplicates = new _DuplicateItemRecordList();
  6936. this.map.set(key, duplicates);
  6937. }
  6938. duplicates.add(record);
  6939. };
  6940. /**
  6941. * Retrieve the `value` using key. Because the CollectionChangeRecord value maybe one which we
  6942. * have already iterated over, we use the afterIndex to pretend it is not there.
  6943. *
  6944. * Use case: `[a, b, c, a, a]` if we are at index `3` which is the second `a` then asking if we
  6945. * have any more `a`s needs to return the last `a` not the first or second.
  6946. */
  6947. _DuplicateMap.prototype.get = function (value, afterIndex) {
  6948. if (afterIndex === void 0) { afterIndex = null; }
  6949. var key = lang_2.getMapKey(value);
  6950. var recordList = this.map.get(key);
  6951. return lang_2.isBlank(recordList) ? null : recordList.get(value, afterIndex);
  6952. };
  6953. /**
  6954. * Removes a {@link CollectionChangeRecord} from the list of duplicates.
  6955. *
  6956. * The list of duplicates also is removed from the map if it gets empty.
  6957. */
  6958. _DuplicateMap.prototype.remove = function (record) {
  6959. var key = lang_2.getMapKey(record.item);
  6960. // todo(vicb)
  6961. // assert(this.map.containsKey(key));
  6962. var recordList = this.map.get(key);
  6963. // Remove the list of duplicates when it gets empty
  6964. if (recordList.remove(record)) {
  6965. this.map.delete(key);
  6966. }
  6967. return record;
  6968. };
  6969. Object.defineProperty(_DuplicateMap.prototype, "isEmpty", {
  6970. get: function () { return this.map.size === 0; },
  6971. enumerable: true,
  6972. configurable: true
  6973. });
  6974. _DuplicateMap.prototype.clear = function () { this.map.clear(); };
  6975. _DuplicateMap.prototype.toString = function () { return '_DuplicateMap(' + lang_2.stringify(this.map) + ')'; };
  6976. return _DuplicateMap;
  6977. })();
  6978. /***/ },
  6979. /* 28 */
  6980. /***/ function(module, exports, __webpack_require__) {
  6981. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  6982. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  6983. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  6984. 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;
  6985. return c > 3 && r && Object.defineProperty(target, key, r), r;
  6986. };
  6987. var __metadata = (this && this.__metadata) || function (k, v) {
  6988. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  6989. };
  6990. var lang_1 = __webpack_require__(5);
  6991. var exceptions_1 = __webpack_require__(14);
  6992. var collection_1 = __webpack_require__(12);
  6993. var di_1 = __webpack_require__(6);
  6994. /**
  6995. * A repository of different Map diffing strategies used by NgClass, NgStyle, and others.
  6996. */
  6997. var KeyValueDiffers = (function () {
  6998. function KeyValueDiffers(factories) {
  6999. this.factories = factories;
  7000. }
  7001. KeyValueDiffers.create = function (factories, parent) {
  7002. if (lang_1.isPresent(parent)) {
  7003. var copied = collection_1.ListWrapper.clone(parent.factories);
  7004. factories = factories.concat(copied);
  7005. return new KeyValueDiffers(factories);
  7006. }
  7007. else {
  7008. return new KeyValueDiffers(factories);
  7009. }
  7010. };
  7011. /**
  7012. * Takes an array of {@link KeyValueDifferFactory} and returns a provider used to extend the
  7013. * inherited {@link KeyValueDiffers} instance with the provided factories and return a new
  7014. * {@link KeyValueDiffers} instance.
  7015. *
  7016. * The following example shows how to extend an existing list of factories,
  7017. * which will only be applied to the injector for this component and its children.
  7018. * This step is all that's required to make a new {@link KeyValueDiffer} available.
  7019. *
  7020. * ### Example
  7021. *
  7022. * ```
  7023. * @Component({
  7024. * viewProviders: [
  7025. * KeyValueDiffers.extend([new ImmutableMapDiffer()])
  7026. * ]
  7027. * })
  7028. * ```
  7029. */
  7030. KeyValueDiffers.extend = function (factories) {
  7031. return new di_1.Provider(KeyValueDiffers, {
  7032. useFactory: function (parent) {
  7033. if (lang_1.isBlank(parent)) {
  7034. // Typically would occur when calling KeyValueDiffers.extend inside of dependencies passed
  7035. // to
  7036. // bootstrap(), which would override default pipes instead of extending them.
  7037. throw new exceptions_1.BaseException('Cannot extend KeyValueDiffers without a parent injector');
  7038. }
  7039. return KeyValueDiffers.create(factories, parent);
  7040. },
  7041. // Dependency technically isn't optional, but we can provide a better error message this way.
  7042. deps: [[KeyValueDiffers, new di_1.SkipSelfMetadata(), new di_1.OptionalMetadata()]]
  7043. });
  7044. };
  7045. KeyValueDiffers.prototype.find = function (kv) {
  7046. var factory = this.factories.find(function (f) { return f.supports(kv); });
  7047. if (lang_1.isPresent(factory)) {
  7048. return factory;
  7049. }
  7050. else {
  7051. throw new exceptions_1.BaseException("Cannot find a differ supporting object '" + kv + "'");
  7052. }
  7053. };
  7054. KeyValueDiffers = __decorate([
  7055. di_1.Injectable(),
  7056. lang_1.CONST(),
  7057. __metadata('design:paramtypes', [Array])
  7058. ], KeyValueDiffers);
  7059. return KeyValueDiffers;
  7060. })();
  7061. exports.KeyValueDiffers = KeyValueDiffers;
  7062. /***/ },
  7063. /* 29 */
  7064. /***/ function(module, exports, __webpack_require__) {
  7065. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  7066. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  7067. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  7068. 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;
  7069. return c > 3 && r && Object.defineProperty(target, key, r), r;
  7070. };
  7071. var __metadata = (this && this.__metadata) || function (k, v) {
  7072. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  7073. };
  7074. var collection_1 = __webpack_require__(12);
  7075. var lang_1 = __webpack_require__(5);
  7076. var exceptions_1 = __webpack_require__(14);
  7077. var DefaultKeyValueDifferFactory = (function () {
  7078. function DefaultKeyValueDifferFactory() {
  7079. }
  7080. DefaultKeyValueDifferFactory.prototype.supports = function (obj) { return obj instanceof Map || lang_1.isJsObject(obj); };
  7081. DefaultKeyValueDifferFactory.prototype.create = function (cdRef) { return new DefaultKeyValueDiffer(); };
  7082. DefaultKeyValueDifferFactory = __decorate([
  7083. lang_1.CONST(),
  7084. __metadata('design:paramtypes', [])
  7085. ], DefaultKeyValueDifferFactory);
  7086. return DefaultKeyValueDifferFactory;
  7087. })();
  7088. exports.DefaultKeyValueDifferFactory = DefaultKeyValueDifferFactory;
  7089. var DefaultKeyValueDiffer = (function () {
  7090. function DefaultKeyValueDiffer() {
  7091. this._records = new Map();
  7092. this._mapHead = null;
  7093. this._previousMapHead = null;
  7094. this._changesHead = null;
  7095. this._changesTail = null;
  7096. this._additionsHead = null;
  7097. this._additionsTail = null;
  7098. this._removalsHead = null;
  7099. this._removalsTail = null;
  7100. }
  7101. Object.defineProperty(DefaultKeyValueDiffer.prototype, "isDirty", {
  7102. get: function () {
  7103. return this._additionsHead !== null || this._changesHead !== null ||
  7104. this._removalsHead !== null;
  7105. },
  7106. enumerable: true,
  7107. configurable: true
  7108. });
  7109. DefaultKeyValueDiffer.prototype.forEachItem = function (fn) {
  7110. var record;
  7111. for (record = this._mapHead; record !== null; record = record._next) {
  7112. fn(record);
  7113. }
  7114. };
  7115. DefaultKeyValueDiffer.prototype.forEachPreviousItem = function (fn) {
  7116. var record;
  7117. for (record = this._previousMapHead; record !== null; record = record._nextPrevious) {
  7118. fn(record);
  7119. }
  7120. };
  7121. DefaultKeyValueDiffer.prototype.forEachChangedItem = function (fn) {
  7122. var record;
  7123. for (record = this._changesHead; record !== null; record = record._nextChanged) {
  7124. fn(record);
  7125. }
  7126. };
  7127. DefaultKeyValueDiffer.prototype.forEachAddedItem = function (fn) {
  7128. var record;
  7129. for (record = this._additionsHead; record !== null; record = record._nextAdded) {
  7130. fn(record);
  7131. }
  7132. };
  7133. DefaultKeyValueDiffer.prototype.forEachRemovedItem = function (fn) {
  7134. var record;
  7135. for (record = this._removalsHead; record !== null; record = record._nextRemoved) {
  7136. fn(record);
  7137. }
  7138. };
  7139. DefaultKeyValueDiffer.prototype.diff = function (map) {
  7140. if (lang_1.isBlank(map))
  7141. map = collection_1.MapWrapper.createFromPairs([]);
  7142. if (!(map instanceof Map || lang_1.isJsObject(map))) {
  7143. throw new exceptions_1.BaseException("Error trying to diff '" + map + "'");
  7144. }
  7145. if (this.check(map)) {
  7146. return this;
  7147. }
  7148. else {
  7149. return null;
  7150. }
  7151. };
  7152. DefaultKeyValueDiffer.prototype.onDestroy = function () { };
  7153. DefaultKeyValueDiffer.prototype.check = function (map) {
  7154. var _this = this;
  7155. this._reset();
  7156. var records = this._records;
  7157. var oldSeqRecord = this._mapHead;
  7158. var lastOldSeqRecord = null;
  7159. var lastNewSeqRecord = null;
  7160. var seqChanged = false;
  7161. this._forEach(map, function (value, key) {
  7162. var newSeqRecord;
  7163. if (oldSeqRecord !== null && key === oldSeqRecord.key) {
  7164. newSeqRecord = oldSeqRecord;
  7165. if (!lang_1.looseIdentical(value, oldSeqRecord.currentValue)) {
  7166. oldSeqRecord.previousValue = oldSeqRecord.currentValue;
  7167. oldSeqRecord.currentValue = value;
  7168. _this._addToChanges(oldSeqRecord);
  7169. }
  7170. }
  7171. else {
  7172. seqChanged = true;
  7173. if (oldSeqRecord !== null) {
  7174. oldSeqRecord._next = null;
  7175. _this._removeFromSeq(lastOldSeqRecord, oldSeqRecord);
  7176. _this._addToRemovals(oldSeqRecord);
  7177. }
  7178. if (records.has(key)) {
  7179. newSeqRecord = records.get(key);
  7180. }
  7181. else {
  7182. newSeqRecord = new KVChangeRecord(key);
  7183. records.set(key, newSeqRecord);
  7184. newSeqRecord.currentValue = value;
  7185. _this._addToAdditions(newSeqRecord);
  7186. }
  7187. }
  7188. if (seqChanged) {
  7189. if (_this._isInRemovals(newSeqRecord)) {
  7190. _this._removeFromRemovals(newSeqRecord);
  7191. }
  7192. if (lastNewSeqRecord == null) {
  7193. _this._mapHead = newSeqRecord;
  7194. }
  7195. else {
  7196. lastNewSeqRecord._next = newSeqRecord;
  7197. }
  7198. }
  7199. lastOldSeqRecord = oldSeqRecord;
  7200. lastNewSeqRecord = newSeqRecord;
  7201. oldSeqRecord = oldSeqRecord === null ? null : oldSeqRecord._next;
  7202. });
  7203. this._truncate(lastOldSeqRecord, oldSeqRecord);
  7204. return this.isDirty;
  7205. };
  7206. /** @internal */
  7207. DefaultKeyValueDiffer.prototype._reset = function () {
  7208. if (this.isDirty) {
  7209. var record;
  7210. // Record the state of the mapping
  7211. for (record = this._previousMapHead = this._mapHead; record !== null; record = record._next) {
  7212. record._nextPrevious = record._next;
  7213. }
  7214. for (record = this._changesHead; record !== null; record = record._nextChanged) {
  7215. record.previousValue = record.currentValue;
  7216. }
  7217. for (record = this._additionsHead; record != null; record = record._nextAdded) {
  7218. record.previousValue = record.currentValue;
  7219. }
  7220. // todo(vicb) once assert is supported
  7221. // assert(() {
  7222. // var r = _changesHead;
  7223. // while (r != null) {
  7224. // var nextRecord = r._nextChanged;
  7225. // r._nextChanged = null;
  7226. // r = nextRecord;
  7227. // }
  7228. //
  7229. // r = _additionsHead;
  7230. // while (r != null) {
  7231. // var nextRecord = r._nextAdded;
  7232. // r._nextAdded = null;
  7233. // r = nextRecord;
  7234. // }
  7235. //
  7236. // r = _removalsHead;
  7237. // while (r != null) {
  7238. // var nextRecord = r._nextRemoved;
  7239. // r._nextRemoved = null;
  7240. // r = nextRecord;
  7241. // }
  7242. //
  7243. // return true;
  7244. //});
  7245. this._changesHead = this._changesTail = null;
  7246. this._additionsHead = this._additionsTail = null;
  7247. this._removalsHead = this._removalsTail = null;
  7248. }
  7249. };
  7250. /** @internal */
  7251. DefaultKeyValueDiffer.prototype._truncate = function (lastRecord, record) {
  7252. while (record !== null) {
  7253. if (lastRecord === null) {
  7254. this._mapHead = null;
  7255. }
  7256. else {
  7257. lastRecord._next = null;
  7258. }
  7259. var nextRecord = record._next;
  7260. // todo(vicb) assert
  7261. // assert((() {
  7262. // record._next = null;
  7263. // return true;
  7264. //}));
  7265. this._addToRemovals(record);
  7266. lastRecord = record;
  7267. record = nextRecord;
  7268. }
  7269. for (var rec = this._removalsHead; rec !== null; rec = rec._nextRemoved) {
  7270. rec.previousValue = rec.currentValue;
  7271. rec.currentValue = null;
  7272. this._records.delete(rec.key);
  7273. }
  7274. };
  7275. /** @internal */
  7276. DefaultKeyValueDiffer.prototype._isInRemovals = function (record) {
  7277. return record === this._removalsHead || record._nextRemoved !== null ||
  7278. record._prevRemoved !== null;
  7279. };
  7280. /** @internal */
  7281. DefaultKeyValueDiffer.prototype._addToRemovals = function (record) {
  7282. // todo(vicb) assert
  7283. // assert(record._next == null);
  7284. // assert(record._nextAdded == null);
  7285. // assert(record._nextChanged == null);
  7286. // assert(record._nextRemoved == null);
  7287. // assert(record._prevRemoved == null);
  7288. if (this._removalsHead === null) {
  7289. this._removalsHead = this._removalsTail = record;
  7290. }
  7291. else {
  7292. this._removalsTail._nextRemoved = record;
  7293. record._prevRemoved = this._removalsTail;
  7294. this._removalsTail = record;
  7295. }
  7296. };
  7297. /** @internal */
  7298. DefaultKeyValueDiffer.prototype._removeFromSeq = function (prev, record) {
  7299. var next = record._next;
  7300. if (prev === null) {
  7301. this._mapHead = next;
  7302. }
  7303. else {
  7304. prev._next = next;
  7305. }
  7306. // todo(vicb) assert
  7307. // assert((() {
  7308. // record._next = null;
  7309. // return true;
  7310. //})());
  7311. };
  7312. /** @internal */
  7313. DefaultKeyValueDiffer.prototype._removeFromRemovals = function (record) {
  7314. // todo(vicb) assert
  7315. // assert(record._next == null);
  7316. // assert(record._nextAdded == null);
  7317. // assert(record._nextChanged == null);
  7318. var prev = record._prevRemoved;
  7319. var next = record._nextRemoved;
  7320. if (prev === null) {
  7321. this._removalsHead = next;
  7322. }
  7323. else {
  7324. prev._nextRemoved = next;
  7325. }
  7326. if (next === null) {
  7327. this._removalsTail = prev;
  7328. }
  7329. else {
  7330. next._prevRemoved = prev;
  7331. }
  7332. record._prevRemoved = record._nextRemoved = null;
  7333. };
  7334. /** @internal */
  7335. DefaultKeyValueDiffer.prototype._addToAdditions = function (record) {
  7336. // todo(vicb): assert
  7337. // assert(record._next == null);
  7338. // assert(record._nextAdded == null);
  7339. // assert(record._nextChanged == null);
  7340. // assert(record._nextRemoved == null);
  7341. // assert(record._prevRemoved == null);
  7342. if (this._additionsHead === null) {
  7343. this._additionsHead = this._additionsTail = record;
  7344. }
  7345. else {
  7346. this._additionsTail._nextAdded = record;
  7347. this._additionsTail = record;
  7348. }
  7349. };
  7350. /** @internal */
  7351. DefaultKeyValueDiffer.prototype._addToChanges = function (record) {
  7352. // todo(vicb) assert
  7353. // assert(record._nextAdded == null);
  7354. // assert(record._nextChanged == null);
  7355. // assert(record._nextRemoved == null);
  7356. // assert(record._prevRemoved == null);
  7357. if (this._changesHead === null) {
  7358. this._changesHead = this._changesTail = record;
  7359. }
  7360. else {
  7361. this._changesTail._nextChanged = record;
  7362. this._changesTail = record;
  7363. }
  7364. };
  7365. DefaultKeyValueDiffer.prototype.toString = function () {
  7366. var items = [];
  7367. var previous = [];
  7368. var changes = [];
  7369. var additions = [];
  7370. var removals = [];
  7371. var record;
  7372. for (record = this._mapHead; record !== null; record = record._next) {
  7373. items.push(lang_1.stringify(record));
  7374. }
  7375. for (record = this._previousMapHead; record !== null; record = record._nextPrevious) {
  7376. previous.push(lang_1.stringify(record));
  7377. }
  7378. for (record = this._changesHead; record !== null; record = record._nextChanged) {
  7379. changes.push(lang_1.stringify(record));
  7380. }
  7381. for (record = this._additionsHead; record !== null; record = record._nextAdded) {
  7382. additions.push(lang_1.stringify(record));
  7383. }
  7384. for (record = this._removalsHead; record !== null; record = record._nextRemoved) {
  7385. removals.push(lang_1.stringify(record));
  7386. }
  7387. return "map: " + items.join(', ') + "\n" + "previous: " + previous.join(', ') + "\n" +
  7388. "additions: " + additions.join(', ') + "\n" + "changes: " + changes.join(', ') + "\n" +
  7389. "removals: " + removals.join(', ') + "\n";
  7390. };
  7391. /** @internal */
  7392. DefaultKeyValueDiffer.prototype._forEach = function (obj, fn) {
  7393. if (obj instanceof Map) {
  7394. obj.forEach(fn);
  7395. }
  7396. else {
  7397. collection_1.StringMapWrapper.forEach(obj, fn);
  7398. }
  7399. };
  7400. return DefaultKeyValueDiffer;
  7401. })();
  7402. exports.DefaultKeyValueDiffer = DefaultKeyValueDiffer;
  7403. var KVChangeRecord = (function () {
  7404. function KVChangeRecord(key) {
  7405. this.key = key;
  7406. this.previousValue = null;
  7407. this.currentValue = null;
  7408. /** @internal */
  7409. this._nextPrevious = null;
  7410. /** @internal */
  7411. this._next = null;
  7412. /** @internal */
  7413. this._nextAdded = null;
  7414. /** @internal */
  7415. this._nextRemoved = null;
  7416. /** @internal */
  7417. this._prevRemoved = null;
  7418. /** @internal */
  7419. this._nextChanged = null;
  7420. }
  7421. KVChangeRecord.prototype.toString = function () {
  7422. return lang_1.looseIdentical(this.previousValue, this.currentValue) ?
  7423. lang_1.stringify(this.key) :
  7424. (lang_1.stringify(this.key) + '[' + lang_1.stringify(this.previousValue) + '->' +
  7425. lang_1.stringify(this.currentValue) + ']');
  7426. };
  7427. return KVChangeRecord;
  7428. })();
  7429. exports.KVChangeRecord = KVChangeRecord;
  7430. /***/ },
  7431. /* 30 */
  7432. /***/ function(module, exports, __webpack_require__) {
  7433. var __extends = (this && this.__extends) || function (d, b) {
  7434. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  7435. function __() { this.constructor = d; }
  7436. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  7437. };
  7438. var collection_1 = __webpack_require__(12);
  7439. var AST = (function () {
  7440. function AST() {
  7441. }
  7442. AST.prototype.visit = function (visitor) { return null; };
  7443. AST.prototype.toString = function () { return "AST"; };
  7444. return AST;
  7445. })();
  7446. exports.AST = AST;
  7447. /**
  7448. * Represents a quoted expression of the form:
  7449. *
  7450. * quote = prefix `:` uninterpretedExpression
  7451. * prefix = identifier
  7452. * uninterpretedExpression = arbitrary string
  7453. *
  7454. * A quoted expression is meant to be pre-processed by an AST transformer that
  7455. * converts it into another AST that no longer contains quoted expressions.
  7456. * It is meant to allow third-party developers to extend Angular template
  7457. * expression language. The `uninterpretedExpression` part of the quote is
  7458. * therefore not interpreted by the Angular's own expression parser.
  7459. */
  7460. var Quote = (function (_super) {
  7461. __extends(Quote, _super);
  7462. function Quote(prefix, uninterpretedExpression, location) {
  7463. _super.call(this);
  7464. this.prefix = prefix;
  7465. this.uninterpretedExpression = uninterpretedExpression;
  7466. this.location = location;
  7467. }
  7468. Quote.prototype.visit = function (visitor) { return visitor.visitQuote(this); };
  7469. Quote.prototype.toString = function () { return "Quote"; };
  7470. return Quote;
  7471. })(AST);
  7472. exports.Quote = Quote;
  7473. var EmptyExpr = (function (_super) {
  7474. __extends(EmptyExpr, _super);
  7475. function EmptyExpr() {
  7476. _super.apply(this, arguments);
  7477. }
  7478. EmptyExpr.prototype.visit = function (visitor) {
  7479. // do nothing
  7480. };
  7481. return EmptyExpr;
  7482. })(AST);
  7483. exports.EmptyExpr = EmptyExpr;
  7484. var ImplicitReceiver = (function (_super) {
  7485. __extends(ImplicitReceiver, _super);
  7486. function ImplicitReceiver() {
  7487. _super.apply(this, arguments);
  7488. }
  7489. ImplicitReceiver.prototype.visit = function (visitor) { return visitor.visitImplicitReceiver(this); };
  7490. return ImplicitReceiver;
  7491. })(AST);
  7492. exports.ImplicitReceiver = ImplicitReceiver;
  7493. /**
  7494. * Multiple expressions separated by a semicolon.
  7495. */
  7496. var Chain = (function (_super) {
  7497. __extends(Chain, _super);
  7498. function Chain(expressions) {
  7499. _super.call(this);
  7500. this.expressions = expressions;
  7501. }
  7502. Chain.prototype.visit = function (visitor) { return visitor.visitChain(this); };
  7503. return Chain;
  7504. })(AST);
  7505. exports.Chain = Chain;
  7506. var Conditional = (function (_super) {
  7507. __extends(Conditional, _super);
  7508. function Conditional(condition, trueExp, falseExp) {
  7509. _super.call(this);
  7510. this.condition = condition;
  7511. this.trueExp = trueExp;
  7512. this.falseExp = falseExp;
  7513. }
  7514. Conditional.prototype.visit = function (visitor) { return visitor.visitConditional(this); };
  7515. return Conditional;
  7516. })(AST);
  7517. exports.Conditional = Conditional;
  7518. var PropertyRead = (function (_super) {
  7519. __extends(PropertyRead, _super);
  7520. function PropertyRead(receiver, name, getter) {
  7521. _super.call(this);
  7522. this.receiver = receiver;
  7523. this.name = name;
  7524. this.getter = getter;
  7525. }
  7526. PropertyRead.prototype.visit = function (visitor) { return visitor.visitPropertyRead(this); };
  7527. return PropertyRead;
  7528. })(AST);
  7529. exports.PropertyRead = PropertyRead;
  7530. var PropertyWrite = (function (_super) {
  7531. __extends(PropertyWrite, _super);
  7532. function PropertyWrite(receiver, name, setter, value) {
  7533. _super.call(this);
  7534. this.receiver = receiver;
  7535. this.name = name;
  7536. this.setter = setter;
  7537. this.value = value;
  7538. }
  7539. PropertyWrite.prototype.visit = function (visitor) { return visitor.visitPropertyWrite(this); };
  7540. return PropertyWrite;
  7541. })(AST);
  7542. exports.PropertyWrite = PropertyWrite;
  7543. var SafePropertyRead = (function (_super) {
  7544. __extends(SafePropertyRead, _super);
  7545. function SafePropertyRead(receiver, name, getter) {
  7546. _super.call(this);
  7547. this.receiver = receiver;
  7548. this.name = name;
  7549. this.getter = getter;
  7550. }
  7551. SafePropertyRead.prototype.visit = function (visitor) { return visitor.visitSafePropertyRead(this); };
  7552. return SafePropertyRead;
  7553. })(AST);
  7554. exports.SafePropertyRead = SafePropertyRead;
  7555. var KeyedRead = (function (_super) {
  7556. __extends(KeyedRead, _super);
  7557. function KeyedRead(obj, key) {
  7558. _super.call(this);
  7559. this.obj = obj;
  7560. this.key = key;
  7561. }
  7562. KeyedRead.prototype.visit = function (visitor) { return visitor.visitKeyedRead(this); };
  7563. return KeyedRead;
  7564. })(AST);
  7565. exports.KeyedRead = KeyedRead;
  7566. var KeyedWrite = (function (_super) {
  7567. __extends(KeyedWrite, _super);
  7568. function KeyedWrite(obj, key, value) {
  7569. _super.call(this);
  7570. this.obj = obj;
  7571. this.key = key;
  7572. this.value = value;
  7573. }
  7574. KeyedWrite.prototype.visit = function (visitor) { return visitor.visitKeyedWrite(this); };
  7575. return KeyedWrite;
  7576. })(AST);
  7577. exports.KeyedWrite = KeyedWrite;
  7578. var BindingPipe = (function (_super) {
  7579. __extends(BindingPipe, _super);
  7580. function BindingPipe(exp, name, args) {
  7581. _super.call(this);
  7582. this.exp = exp;
  7583. this.name = name;
  7584. this.args = args;
  7585. }
  7586. BindingPipe.prototype.visit = function (visitor) { return visitor.visitPipe(this); };
  7587. return BindingPipe;
  7588. })(AST);
  7589. exports.BindingPipe = BindingPipe;
  7590. var LiteralPrimitive = (function (_super) {
  7591. __extends(LiteralPrimitive, _super);
  7592. function LiteralPrimitive(value) {
  7593. _super.call(this);
  7594. this.value = value;
  7595. }
  7596. LiteralPrimitive.prototype.visit = function (visitor) { return visitor.visitLiteralPrimitive(this); };
  7597. return LiteralPrimitive;
  7598. })(AST);
  7599. exports.LiteralPrimitive = LiteralPrimitive;
  7600. var LiteralArray = (function (_super) {
  7601. __extends(LiteralArray, _super);
  7602. function LiteralArray(expressions) {
  7603. _super.call(this);
  7604. this.expressions = expressions;
  7605. }
  7606. LiteralArray.prototype.visit = function (visitor) { return visitor.visitLiteralArray(this); };
  7607. return LiteralArray;
  7608. })(AST);
  7609. exports.LiteralArray = LiteralArray;
  7610. var LiteralMap = (function (_super) {
  7611. __extends(LiteralMap, _super);
  7612. function LiteralMap(keys, values) {
  7613. _super.call(this);
  7614. this.keys = keys;
  7615. this.values = values;
  7616. }
  7617. LiteralMap.prototype.visit = function (visitor) { return visitor.visitLiteralMap(this); };
  7618. return LiteralMap;
  7619. })(AST);
  7620. exports.LiteralMap = LiteralMap;
  7621. var Interpolation = (function (_super) {
  7622. __extends(Interpolation, _super);
  7623. function Interpolation(strings, expressions) {
  7624. _super.call(this);
  7625. this.strings = strings;
  7626. this.expressions = expressions;
  7627. }
  7628. Interpolation.prototype.visit = function (visitor) { return visitor.visitInterpolation(this); };
  7629. return Interpolation;
  7630. })(AST);
  7631. exports.Interpolation = Interpolation;
  7632. var Binary = (function (_super) {
  7633. __extends(Binary, _super);
  7634. function Binary(operation, left, right) {
  7635. _super.call(this);
  7636. this.operation = operation;
  7637. this.left = left;
  7638. this.right = right;
  7639. }
  7640. Binary.prototype.visit = function (visitor) { return visitor.visitBinary(this); };
  7641. return Binary;
  7642. })(AST);
  7643. exports.Binary = Binary;
  7644. var PrefixNot = (function (_super) {
  7645. __extends(PrefixNot, _super);
  7646. function PrefixNot(expression) {
  7647. _super.call(this);
  7648. this.expression = expression;
  7649. }
  7650. PrefixNot.prototype.visit = function (visitor) { return visitor.visitPrefixNot(this); };
  7651. return PrefixNot;
  7652. })(AST);
  7653. exports.PrefixNot = PrefixNot;
  7654. var MethodCall = (function (_super) {
  7655. __extends(MethodCall, _super);
  7656. function MethodCall(receiver, name, fn, args) {
  7657. _super.call(this);
  7658. this.receiver = receiver;
  7659. this.name = name;
  7660. this.fn = fn;
  7661. this.args = args;
  7662. }
  7663. MethodCall.prototype.visit = function (visitor) { return visitor.visitMethodCall(this); };
  7664. return MethodCall;
  7665. })(AST);
  7666. exports.MethodCall = MethodCall;
  7667. var SafeMethodCall = (function (_super) {
  7668. __extends(SafeMethodCall, _super);
  7669. function SafeMethodCall(receiver, name, fn, args) {
  7670. _super.call(this);
  7671. this.receiver = receiver;
  7672. this.name = name;
  7673. this.fn = fn;
  7674. this.args = args;
  7675. }
  7676. SafeMethodCall.prototype.visit = function (visitor) { return visitor.visitSafeMethodCall(this); };
  7677. return SafeMethodCall;
  7678. })(AST);
  7679. exports.SafeMethodCall = SafeMethodCall;
  7680. var FunctionCall = (function (_super) {
  7681. __extends(FunctionCall, _super);
  7682. function FunctionCall(target, args) {
  7683. _super.call(this);
  7684. this.target = target;
  7685. this.args = args;
  7686. }
  7687. FunctionCall.prototype.visit = function (visitor) { return visitor.visitFunctionCall(this); };
  7688. return FunctionCall;
  7689. })(AST);
  7690. exports.FunctionCall = FunctionCall;
  7691. var ASTWithSource = (function (_super) {
  7692. __extends(ASTWithSource, _super);
  7693. function ASTWithSource(ast, source, location) {
  7694. _super.call(this);
  7695. this.ast = ast;
  7696. this.source = source;
  7697. this.location = location;
  7698. }
  7699. ASTWithSource.prototype.visit = function (visitor) { return this.ast.visit(visitor); };
  7700. ASTWithSource.prototype.toString = function () { return this.source + " in " + this.location; };
  7701. return ASTWithSource;
  7702. })(AST);
  7703. exports.ASTWithSource = ASTWithSource;
  7704. var TemplateBinding = (function () {
  7705. function TemplateBinding(key, keyIsVar, name, expression) {
  7706. this.key = key;
  7707. this.keyIsVar = keyIsVar;
  7708. this.name = name;
  7709. this.expression = expression;
  7710. }
  7711. return TemplateBinding;
  7712. })();
  7713. exports.TemplateBinding = TemplateBinding;
  7714. var RecursiveAstVisitor = (function () {
  7715. function RecursiveAstVisitor() {
  7716. }
  7717. RecursiveAstVisitor.prototype.visitBinary = function (ast) {
  7718. ast.left.visit(this);
  7719. ast.right.visit(this);
  7720. return null;
  7721. };
  7722. RecursiveAstVisitor.prototype.visitChain = function (ast) { return this.visitAll(ast.expressions); };
  7723. RecursiveAstVisitor.prototype.visitConditional = function (ast) {
  7724. ast.condition.visit(this);
  7725. ast.trueExp.visit(this);
  7726. ast.falseExp.visit(this);
  7727. return null;
  7728. };
  7729. RecursiveAstVisitor.prototype.visitPipe = function (ast) {
  7730. ast.exp.visit(this);
  7731. this.visitAll(ast.args);
  7732. return null;
  7733. };
  7734. RecursiveAstVisitor.prototype.visitFunctionCall = function (ast) {
  7735. ast.target.visit(this);
  7736. this.visitAll(ast.args);
  7737. return null;
  7738. };
  7739. RecursiveAstVisitor.prototype.visitImplicitReceiver = function (ast) { return null; };
  7740. RecursiveAstVisitor.prototype.visitInterpolation = function (ast) { return this.visitAll(ast.expressions); };
  7741. RecursiveAstVisitor.prototype.visitKeyedRead = function (ast) {
  7742. ast.obj.visit(this);
  7743. ast.key.visit(this);
  7744. return null;
  7745. };
  7746. RecursiveAstVisitor.prototype.visitKeyedWrite = function (ast) {
  7747. ast.obj.visit(this);
  7748. ast.key.visit(this);
  7749. ast.value.visit(this);
  7750. return null;
  7751. };
  7752. RecursiveAstVisitor.prototype.visitLiteralArray = function (ast) { return this.visitAll(ast.expressions); };
  7753. RecursiveAstVisitor.prototype.visitLiteralMap = function (ast) { return this.visitAll(ast.values); };
  7754. RecursiveAstVisitor.prototype.visitLiteralPrimitive = function (ast) { return null; };
  7755. RecursiveAstVisitor.prototype.visitMethodCall = function (ast) {
  7756. ast.receiver.visit(this);
  7757. return this.visitAll(ast.args);
  7758. };
  7759. RecursiveAstVisitor.prototype.visitPrefixNot = function (ast) {
  7760. ast.expression.visit(this);
  7761. return null;
  7762. };
  7763. RecursiveAstVisitor.prototype.visitPropertyRead = function (ast) {
  7764. ast.receiver.visit(this);
  7765. return null;
  7766. };
  7767. RecursiveAstVisitor.prototype.visitPropertyWrite = function (ast) {
  7768. ast.receiver.visit(this);
  7769. ast.value.visit(this);
  7770. return null;
  7771. };
  7772. RecursiveAstVisitor.prototype.visitSafePropertyRead = function (ast) {
  7773. ast.receiver.visit(this);
  7774. return null;
  7775. };
  7776. RecursiveAstVisitor.prototype.visitSafeMethodCall = function (ast) {
  7777. ast.receiver.visit(this);
  7778. return this.visitAll(ast.args);
  7779. };
  7780. RecursiveAstVisitor.prototype.visitAll = function (asts) {
  7781. var _this = this;
  7782. asts.forEach(function (ast) { return ast.visit(_this); });
  7783. return null;
  7784. };
  7785. RecursiveAstVisitor.prototype.visitQuote = function (ast) { return null; };
  7786. return RecursiveAstVisitor;
  7787. })();
  7788. exports.RecursiveAstVisitor = RecursiveAstVisitor;
  7789. var AstTransformer = (function () {
  7790. function AstTransformer() {
  7791. }
  7792. AstTransformer.prototype.visitImplicitReceiver = function (ast) { return ast; };
  7793. AstTransformer.prototype.visitInterpolation = function (ast) {
  7794. return new Interpolation(ast.strings, this.visitAll(ast.expressions));
  7795. };
  7796. AstTransformer.prototype.visitLiteralPrimitive = function (ast) { return new LiteralPrimitive(ast.value); };
  7797. AstTransformer.prototype.visitPropertyRead = function (ast) {
  7798. return new PropertyRead(ast.receiver.visit(this), ast.name, ast.getter);
  7799. };
  7800. AstTransformer.prototype.visitPropertyWrite = function (ast) {
  7801. return new PropertyWrite(ast.receiver.visit(this), ast.name, ast.setter, ast.value);
  7802. };
  7803. AstTransformer.prototype.visitSafePropertyRead = function (ast) {
  7804. return new SafePropertyRead(ast.receiver.visit(this), ast.name, ast.getter);
  7805. };
  7806. AstTransformer.prototype.visitMethodCall = function (ast) {
  7807. return new MethodCall(ast.receiver.visit(this), ast.name, ast.fn, this.visitAll(ast.args));
  7808. };
  7809. AstTransformer.prototype.visitSafeMethodCall = function (ast) {
  7810. return new SafeMethodCall(ast.receiver.visit(this), ast.name, ast.fn, this.visitAll(ast.args));
  7811. };
  7812. AstTransformer.prototype.visitFunctionCall = function (ast) {
  7813. return new FunctionCall(ast.target.visit(this), this.visitAll(ast.args));
  7814. };
  7815. AstTransformer.prototype.visitLiteralArray = function (ast) {
  7816. return new LiteralArray(this.visitAll(ast.expressions));
  7817. };
  7818. AstTransformer.prototype.visitLiteralMap = function (ast) {
  7819. return new LiteralMap(ast.keys, this.visitAll(ast.values));
  7820. };
  7821. AstTransformer.prototype.visitBinary = function (ast) {
  7822. return new Binary(ast.operation, ast.left.visit(this), ast.right.visit(this));
  7823. };
  7824. AstTransformer.prototype.visitPrefixNot = function (ast) { return new PrefixNot(ast.expression.visit(this)); };
  7825. AstTransformer.prototype.visitConditional = function (ast) {
  7826. return new Conditional(ast.condition.visit(this), ast.trueExp.visit(this), ast.falseExp.visit(this));
  7827. };
  7828. AstTransformer.prototype.visitPipe = function (ast) {
  7829. return new BindingPipe(ast.exp.visit(this), ast.name, this.visitAll(ast.args));
  7830. };
  7831. AstTransformer.prototype.visitKeyedRead = function (ast) {
  7832. return new KeyedRead(ast.obj.visit(this), ast.key.visit(this));
  7833. };
  7834. AstTransformer.prototype.visitKeyedWrite = function (ast) {
  7835. return new KeyedWrite(ast.obj.visit(this), ast.key.visit(this), ast.value.visit(this));
  7836. };
  7837. AstTransformer.prototype.visitAll = function (asts) {
  7838. var res = collection_1.ListWrapper.createFixedSize(asts.length);
  7839. for (var i = 0; i < asts.length; ++i) {
  7840. res[i] = asts[i].visit(this);
  7841. }
  7842. return res;
  7843. };
  7844. AstTransformer.prototype.visitChain = function (ast) { return new Chain(this.visitAll(ast.expressions)); };
  7845. AstTransformer.prototype.visitQuote = function (ast) {
  7846. return new Quote(ast.prefix, ast.uninterpretedExpression, ast.location);
  7847. };
  7848. return AstTransformer;
  7849. })();
  7850. exports.AstTransformer = AstTransformer;
  7851. /***/ },
  7852. /* 31 */
  7853. /***/ function(module, exports, __webpack_require__) {
  7854. var __extends = (this && this.__extends) || function (d, b) {
  7855. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  7856. function __() { this.constructor = d; }
  7857. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  7858. };
  7859. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  7860. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  7861. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  7862. 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;
  7863. return c > 3 && r && Object.defineProperty(target, key, r), r;
  7864. };
  7865. var __metadata = (this && this.__metadata) || function (k, v) {
  7866. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  7867. };
  7868. var decorators_1 = __webpack_require__(8);
  7869. var collection_1 = __webpack_require__(12);
  7870. var lang_1 = __webpack_require__(5);
  7871. var exceptions_1 = __webpack_require__(14);
  7872. (function (TokenType) {
  7873. TokenType[TokenType["Character"] = 0] = "Character";
  7874. TokenType[TokenType["Identifier"] = 1] = "Identifier";
  7875. TokenType[TokenType["Keyword"] = 2] = "Keyword";
  7876. TokenType[TokenType["String"] = 3] = "String";
  7877. TokenType[TokenType["Operator"] = 4] = "Operator";
  7878. TokenType[TokenType["Number"] = 5] = "Number";
  7879. })(exports.TokenType || (exports.TokenType = {}));
  7880. var TokenType = exports.TokenType;
  7881. var Lexer = (function () {
  7882. function Lexer() {
  7883. }
  7884. Lexer.prototype.tokenize = function (text) {
  7885. var scanner = new _Scanner(text);
  7886. var tokens = [];
  7887. var token = scanner.scanToken();
  7888. while (token != null) {
  7889. tokens.push(token);
  7890. token = scanner.scanToken();
  7891. }
  7892. return tokens;
  7893. };
  7894. Lexer = __decorate([
  7895. decorators_1.Injectable(),
  7896. __metadata('design:paramtypes', [])
  7897. ], Lexer);
  7898. return Lexer;
  7899. })();
  7900. exports.Lexer = Lexer;
  7901. var Token = (function () {
  7902. function Token(index, type, numValue, strValue) {
  7903. this.index = index;
  7904. this.type = type;
  7905. this.numValue = numValue;
  7906. this.strValue = strValue;
  7907. }
  7908. Token.prototype.isCharacter = function (code) {
  7909. return (this.type == TokenType.Character && this.numValue == code);
  7910. };
  7911. Token.prototype.isNumber = function () { return (this.type == TokenType.Number); };
  7912. Token.prototype.isString = function () { return (this.type == TokenType.String); };
  7913. Token.prototype.isOperator = function (operater) {
  7914. return (this.type == TokenType.Operator && this.strValue == operater);
  7915. };
  7916. Token.prototype.isIdentifier = function () { return (this.type == TokenType.Identifier); };
  7917. Token.prototype.isKeyword = function () { return (this.type == TokenType.Keyword); };
  7918. Token.prototype.isKeywordVar = function () { return (this.type == TokenType.Keyword && this.strValue == "var"); };
  7919. Token.prototype.isKeywordNull = function () { return (this.type == TokenType.Keyword && this.strValue == "null"); };
  7920. Token.prototype.isKeywordUndefined = function () {
  7921. return (this.type == TokenType.Keyword && this.strValue == "undefined");
  7922. };
  7923. Token.prototype.isKeywordTrue = function () { return (this.type == TokenType.Keyword && this.strValue == "true"); };
  7924. Token.prototype.isKeywordFalse = function () { return (this.type == TokenType.Keyword && this.strValue == "false"); };
  7925. Token.prototype.toNumber = function () {
  7926. // -1 instead of NULL ok?
  7927. return (this.type == TokenType.Number) ? this.numValue : -1;
  7928. };
  7929. Token.prototype.toString = function () {
  7930. switch (this.type) {
  7931. case TokenType.Character:
  7932. case TokenType.Identifier:
  7933. case TokenType.Keyword:
  7934. case TokenType.Operator:
  7935. case TokenType.String:
  7936. return this.strValue;
  7937. case TokenType.Number:
  7938. return this.numValue.toString();
  7939. default:
  7940. return null;
  7941. }
  7942. };
  7943. return Token;
  7944. })();
  7945. exports.Token = Token;
  7946. function newCharacterToken(index, code) {
  7947. return new Token(index, TokenType.Character, code, lang_1.StringWrapper.fromCharCode(code));
  7948. }
  7949. function newIdentifierToken(index, text) {
  7950. return new Token(index, TokenType.Identifier, 0, text);
  7951. }
  7952. function newKeywordToken(index, text) {
  7953. return new Token(index, TokenType.Keyword, 0, text);
  7954. }
  7955. function newOperatorToken(index, text) {
  7956. return new Token(index, TokenType.Operator, 0, text);
  7957. }
  7958. function newStringToken(index, text) {
  7959. return new Token(index, TokenType.String, 0, text);
  7960. }
  7961. function newNumberToken(index, n) {
  7962. return new Token(index, TokenType.Number, n, "");
  7963. }
  7964. exports.EOF = new Token(-1, TokenType.Character, 0, "");
  7965. exports.$EOF = 0;
  7966. exports.$TAB = 9;
  7967. exports.$LF = 10;
  7968. exports.$VTAB = 11;
  7969. exports.$FF = 12;
  7970. exports.$CR = 13;
  7971. exports.$SPACE = 32;
  7972. exports.$BANG = 33;
  7973. exports.$DQ = 34;
  7974. exports.$HASH = 35;
  7975. exports.$$ = 36;
  7976. exports.$PERCENT = 37;
  7977. exports.$AMPERSAND = 38;
  7978. exports.$SQ = 39;
  7979. exports.$LPAREN = 40;
  7980. exports.$RPAREN = 41;
  7981. exports.$STAR = 42;
  7982. exports.$PLUS = 43;
  7983. exports.$COMMA = 44;
  7984. exports.$MINUS = 45;
  7985. exports.$PERIOD = 46;
  7986. exports.$SLASH = 47;
  7987. exports.$COLON = 58;
  7988. exports.$SEMICOLON = 59;
  7989. exports.$LT = 60;
  7990. exports.$EQ = 61;
  7991. exports.$GT = 62;
  7992. exports.$QUESTION = 63;
  7993. var $0 = 48;
  7994. var $9 = 57;
  7995. var $A = 65, $E = 69, $Z = 90;
  7996. exports.$LBRACKET = 91;
  7997. exports.$BACKSLASH = 92;
  7998. exports.$RBRACKET = 93;
  7999. var $CARET = 94;
  8000. var $_ = 95;
  8001. var $a = 97, $e = 101, $f = 102, $n = 110, $r = 114, $t = 116, $u = 117, $v = 118, $z = 122;
  8002. exports.$LBRACE = 123;
  8003. exports.$BAR = 124;
  8004. exports.$RBRACE = 125;
  8005. var $NBSP = 160;
  8006. var ScannerError = (function (_super) {
  8007. __extends(ScannerError, _super);
  8008. function ScannerError(message) {
  8009. _super.call(this);
  8010. this.message = message;
  8011. }
  8012. ScannerError.prototype.toString = function () { return this.message; };
  8013. return ScannerError;
  8014. })(exceptions_1.BaseException);
  8015. exports.ScannerError = ScannerError;
  8016. var _Scanner = (function () {
  8017. function _Scanner(input) {
  8018. this.input = input;
  8019. this.peek = 0;
  8020. this.index = -1;
  8021. this.length = input.length;
  8022. this.advance();
  8023. }
  8024. _Scanner.prototype.advance = function () {
  8025. this.peek =
  8026. ++this.index >= this.length ? exports.$EOF : lang_1.StringWrapper.charCodeAt(this.input, this.index);
  8027. };
  8028. _Scanner.prototype.scanToken = function () {
  8029. var input = this.input, length = this.length, peek = this.peek, index = this.index;
  8030. // Skip whitespace.
  8031. while (peek <= exports.$SPACE) {
  8032. if (++index >= length) {
  8033. peek = exports.$EOF;
  8034. break;
  8035. }
  8036. else {
  8037. peek = lang_1.StringWrapper.charCodeAt(input, index);
  8038. }
  8039. }
  8040. this.peek = peek;
  8041. this.index = index;
  8042. if (index >= length) {
  8043. return null;
  8044. }
  8045. // Handle identifiers and numbers.
  8046. if (isIdentifierStart(peek))
  8047. return this.scanIdentifier();
  8048. if (isDigit(peek))
  8049. return this.scanNumber(index);
  8050. var start = index;
  8051. switch (peek) {
  8052. case exports.$PERIOD:
  8053. this.advance();
  8054. return isDigit(this.peek) ? this.scanNumber(start) : newCharacterToken(start, exports.$PERIOD);
  8055. case exports.$LPAREN:
  8056. case exports.$RPAREN:
  8057. case exports.$LBRACE:
  8058. case exports.$RBRACE:
  8059. case exports.$LBRACKET:
  8060. case exports.$RBRACKET:
  8061. case exports.$COMMA:
  8062. case exports.$COLON:
  8063. case exports.$SEMICOLON:
  8064. return this.scanCharacter(start, peek);
  8065. case exports.$SQ:
  8066. case exports.$DQ:
  8067. return this.scanString();
  8068. case exports.$HASH:
  8069. case exports.$PLUS:
  8070. case exports.$MINUS:
  8071. case exports.$STAR:
  8072. case exports.$SLASH:
  8073. case exports.$PERCENT:
  8074. case $CARET:
  8075. return this.scanOperator(start, lang_1.StringWrapper.fromCharCode(peek));
  8076. case exports.$QUESTION:
  8077. return this.scanComplexOperator(start, '?', exports.$PERIOD, '.');
  8078. case exports.$LT:
  8079. case exports.$GT:
  8080. return this.scanComplexOperator(start, lang_1.StringWrapper.fromCharCode(peek), exports.$EQ, '=');
  8081. case exports.$BANG:
  8082. case exports.$EQ:
  8083. return this.scanComplexOperator(start, lang_1.StringWrapper.fromCharCode(peek), exports.$EQ, '=', exports.$EQ, '=');
  8084. case exports.$AMPERSAND:
  8085. return this.scanComplexOperator(start, '&', exports.$AMPERSAND, '&');
  8086. case exports.$BAR:
  8087. return this.scanComplexOperator(start, '|', exports.$BAR, '|');
  8088. case $NBSP:
  8089. while (isWhitespace(this.peek))
  8090. this.advance();
  8091. return this.scanToken();
  8092. }
  8093. this.error("Unexpected character [" + lang_1.StringWrapper.fromCharCode(peek) + "]", 0);
  8094. return null;
  8095. };
  8096. _Scanner.prototype.scanCharacter = function (start, code) {
  8097. assert(this.peek == code);
  8098. this.advance();
  8099. return newCharacterToken(start, code);
  8100. };
  8101. _Scanner.prototype.scanOperator = function (start, str) {
  8102. assert(this.peek == lang_1.StringWrapper.charCodeAt(str, 0));
  8103. assert(collection_1.SetWrapper.has(OPERATORS, str));
  8104. this.advance();
  8105. return newOperatorToken(start, str);
  8106. };
  8107. /**
  8108. * Tokenize a 2/3 char long operator
  8109. *
  8110. * @param start start index in the expression
  8111. * @param one first symbol (always part of the operator)
  8112. * @param twoCode code point for the second symbol
  8113. * @param two second symbol (part of the operator when the second code point matches)
  8114. * @param threeCode code point for the third symbol
  8115. * @param three third symbol (part of the operator when provided and matches source expression)
  8116. * @returns {Token}
  8117. */
  8118. _Scanner.prototype.scanComplexOperator = function (start, one, twoCode, two, threeCode, three) {
  8119. assert(this.peek == lang_1.StringWrapper.charCodeAt(one, 0));
  8120. this.advance();
  8121. var str = one;
  8122. if (this.peek == twoCode) {
  8123. this.advance();
  8124. str += two;
  8125. }
  8126. if (lang_1.isPresent(threeCode) && this.peek == threeCode) {
  8127. this.advance();
  8128. str += three;
  8129. }
  8130. assert(collection_1.SetWrapper.has(OPERATORS, str));
  8131. return newOperatorToken(start, str);
  8132. };
  8133. _Scanner.prototype.scanIdentifier = function () {
  8134. assert(isIdentifierStart(this.peek));
  8135. var start = this.index;
  8136. this.advance();
  8137. while (isIdentifierPart(this.peek))
  8138. this.advance();
  8139. var str = this.input.substring(start, this.index);
  8140. if (collection_1.SetWrapper.has(KEYWORDS, str)) {
  8141. return newKeywordToken(start, str);
  8142. }
  8143. else {
  8144. return newIdentifierToken(start, str);
  8145. }
  8146. };
  8147. _Scanner.prototype.scanNumber = function (start) {
  8148. assert(isDigit(this.peek));
  8149. var simple = (this.index === start);
  8150. this.advance(); // Skip initial digit.
  8151. while (true) {
  8152. if (isDigit(this.peek)) {
  8153. }
  8154. else if (this.peek == exports.$PERIOD) {
  8155. simple = false;
  8156. }
  8157. else if (isExponentStart(this.peek)) {
  8158. this.advance();
  8159. if (isExponentSign(this.peek))
  8160. this.advance();
  8161. if (!isDigit(this.peek))
  8162. this.error('Invalid exponent', -1);
  8163. simple = false;
  8164. }
  8165. else {
  8166. break;
  8167. }
  8168. this.advance();
  8169. }
  8170. var str = this.input.substring(start, this.index);
  8171. // TODO
  8172. var value = simple ? lang_1.NumberWrapper.parseIntAutoRadix(str) : lang_1.NumberWrapper.parseFloat(str);
  8173. return newNumberToken(start, value);
  8174. };
  8175. _Scanner.prototype.scanString = function () {
  8176. assert(this.peek == exports.$SQ || this.peek == exports.$DQ);
  8177. var start = this.index;
  8178. var quote = this.peek;
  8179. this.advance(); // Skip initial quote.
  8180. var buffer;
  8181. var marker = this.index;
  8182. var input = this.input;
  8183. while (this.peek != quote) {
  8184. if (this.peek == exports.$BACKSLASH) {
  8185. if (buffer == null)
  8186. buffer = new lang_1.StringJoiner();
  8187. buffer.add(input.substring(marker, this.index));
  8188. this.advance();
  8189. var unescapedCode;
  8190. if (this.peek == $u) {
  8191. // 4 character hex code for unicode character.
  8192. var hex = input.substring(this.index + 1, this.index + 5);
  8193. try {
  8194. unescapedCode = lang_1.NumberWrapper.parseInt(hex, 16);
  8195. }
  8196. catch (e) {
  8197. this.error("Invalid unicode escape [\\u" + hex + "]", 0);
  8198. }
  8199. for (var i = 0; i < 5; i++) {
  8200. this.advance();
  8201. }
  8202. }
  8203. else {
  8204. unescapedCode = unescape(this.peek);
  8205. this.advance();
  8206. }
  8207. buffer.add(lang_1.StringWrapper.fromCharCode(unescapedCode));
  8208. marker = this.index;
  8209. }
  8210. else if (this.peek == exports.$EOF) {
  8211. this.error('Unterminated quote', 0);
  8212. }
  8213. else {
  8214. this.advance();
  8215. }
  8216. }
  8217. var last = input.substring(marker, this.index);
  8218. this.advance(); // Skip terminating quote.
  8219. // Compute the unescaped string value.
  8220. var unescaped = last;
  8221. if (buffer != null) {
  8222. buffer.add(last);
  8223. unescaped = buffer.toString();
  8224. }
  8225. return newStringToken(start, unescaped);
  8226. };
  8227. _Scanner.prototype.error = function (message, offset) {
  8228. var position = this.index + offset;
  8229. throw new ScannerError("Lexer Error: " + message + " at column " + position + " in expression [" + this.input + "]");
  8230. };
  8231. return _Scanner;
  8232. })();
  8233. function isWhitespace(code) {
  8234. return (code >= exports.$TAB && code <= exports.$SPACE) || (code == $NBSP);
  8235. }
  8236. function isIdentifierStart(code) {
  8237. return ($a <= code && code <= $z) || ($A <= code && code <= $Z) || (code == $_) || (code == exports.$$);
  8238. }
  8239. function isIdentifier(input) {
  8240. if (input.length == 0)
  8241. return false;
  8242. var scanner = new _Scanner(input);
  8243. if (!isIdentifierStart(scanner.peek))
  8244. return false;
  8245. scanner.advance();
  8246. while (scanner.peek !== exports.$EOF) {
  8247. if (!isIdentifierPart(scanner.peek))
  8248. return false;
  8249. scanner.advance();
  8250. }
  8251. return true;
  8252. }
  8253. exports.isIdentifier = isIdentifier;
  8254. function isIdentifierPart(code) {
  8255. return ($a <= code && code <= $z) || ($A <= code && code <= $Z) || ($0 <= code && code <= $9) ||
  8256. (code == $_) || (code == exports.$$);
  8257. }
  8258. function isDigit(code) {
  8259. return $0 <= code && code <= $9;
  8260. }
  8261. function isExponentStart(code) {
  8262. return code == $e || code == $E;
  8263. }
  8264. function isExponentSign(code) {
  8265. return code == exports.$MINUS || code == exports.$PLUS;
  8266. }
  8267. function unescape(code) {
  8268. switch (code) {
  8269. case $n:
  8270. return exports.$LF;
  8271. case $f:
  8272. return exports.$FF;
  8273. case $r:
  8274. return exports.$CR;
  8275. case $t:
  8276. return exports.$TAB;
  8277. case $v:
  8278. return exports.$VTAB;
  8279. default:
  8280. return code;
  8281. }
  8282. }
  8283. var OPERATORS = collection_1.SetWrapper.createFromList([
  8284. '+',
  8285. '-',
  8286. '*',
  8287. '/',
  8288. '%',
  8289. '^',
  8290. '=',
  8291. '==',
  8292. '!=',
  8293. '===',
  8294. '!==',
  8295. '<',
  8296. '>',
  8297. '<=',
  8298. '>=',
  8299. '&&',
  8300. '||',
  8301. '&',
  8302. '|',
  8303. '!',
  8304. '?',
  8305. '#',
  8306. '?.'
  8307. ]);
  8308. var KEYWORDS = collection_1.SetWrapper.createFromList(['var', 'null', 'undefined', 'true', 'false', 'if', 'else']);
  8309. /***/ },
  8310. /* 32 */
  8311. /***/ function(module, exports, __webpack_require__) {
  8312. var __extends = (this && this.__extends) || function (d, b) {
  8313. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  8314. function __() { this.constructor = d; }
  8315. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  8316. };
  8317. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  8318. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  8319. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  8320. 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;
  8321. return c > 3 && r && Object.defineProperty(target, key, r), r;
  8322. };
  8323. var __metadata = (this && this.__metadata) || function (k, v) {
  8324. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  8325. };
  8326. var decorators_1 = __webpack_require__(8);
  8327. var lang_1 = __webpack_require__(5);
  8328. var exceptions_1 = __webpack_require__(14);
  8329. var collection_1 = __webpack_require__(12);
  8330. var lexer_1 = __webpack_require__(31);
  8331. var reflection_1 = __webpack_require__(16);
  8332. var ast_1 = __webpack_require__(30);
  8333. var _implicitReceiver = new ast_1.ImplicitReceiver();
  8334. // TODO(tbosch): Cannot make this const/final right now because of the transpiler...
  8335. var INTERPOLATION_REGEXP = /\{\{(.*?)\}\}/g;
  8336. var ParseException = (function (_super) {
  8337. __extends(ParseException, _super);
  8338. function ParseException(message, input, errLocation, ctxLocation) {
  8339. _super.call(this, "Parser Error: " + message + " " + errLocation + " [" + input + "] in " + ctxLocation);
  8340. }
  8341. return ParseException;
  8342. })(exceptions_1.BaseException);
  8343. var Parser = (function () {
  8344. function Parser(/** @internal */ _lexer, providedReflector) {
  8345. if (providedReflector === void 0) { providedReflector = null; }
  8346. this._lexer = _lexer;
  8347. this._reflector = lang_1.isPresent(providedReflector) ? providedReflector : reflection_1.reflector;
  8348. }
  8349. Parser.prototype.parseAction = function (input, location) {
  8350. this._checkNoInterpolation(input, location);
  8351. var tokens = this._lexer.tokenize(input);
  8352. var ast = new _ParseAST(input, location, tokens, this._reflector, true).parseChain();
  8353. return new ast_1.ASTWithSource(ast, input, location);
  8354. };
  8355. Parser.prototype.parseBinding = function (input, location) {
  8356. var ast = this._parseBindingAst(input, location);
  8357. return new ast_1.ASTWithSource(ast, input, location);
  8358. };
  8359. Parser.prototype.parseSimpleBinding = function (input, location) {
  8360. var ast = this._parseBindingAst(input, location);
  8361. if (!SimpleExpressionChecker.check(ast)) {
  8362. throw new ParseException('Host binding expression can only contain field access and constants', input, location);
  8363. }
  8364. return new ast_1.ASTWithSource(ast, input, location);
  8365. };
  8366. Parser.prototype._parseBindingAst = function (input, location) {
  8367. // Quotes expressions use 3rd-party expression language. We don't want to use
  8368. // our lexer or parser for that, so we check for that ahead of time.
  8369. var quote = this._parseQuote(input, location);
  8370. if (lang_1.isPresent(quote)) {
  8371. return quote;
  8372. }
  8373. this._checkNoInterpolation(input, location);
  8374. var tokens = this._lexer.tokenize(input);
  8375. return new _ParseAST(input, location, tokens, this._reflector, false).parseChain();
  8376. };
  8377. Parser.prototype._parseQuote = function (input, location) {
  8378. if (lang_1.isBlank(input))
  8379. return null;
  8380. var prefixSeparatorIndex = input.indexOf(':');
  8381. if (prefixSeparatorIndex == -1)
  8382. return null;
  8383. var prefix = input.substring(0, prefixSeparatorIndex).trim();
  8384. if (!lexer_1.isIdentifier(prefix))
  8385. return null;
  8386. var uninterpretedExpression = input.substring(prefixSeparatorIndex + 1);
  8387. return new ast_1.Quote(prefix, uninterpretedExpression, location);
  8388. };
  8389. Parser.prototype.parseTemplateBindings = function (input, location) {
  8390. var tokens = this._lexer.tokenize(input);
  8391. return new _ParseAST(input, location, tokens, this._reflector, false).parseTemplateBindings();
  8392. };
  8393. Parser.prototype.parseInterpolation = function (input, location) {
  8394. var parts = lang_1.StringWrapper.split(input, INTERPOLATION_REGEXP);
  8395. if (parts.length <= 1) {
  8396. return null;
  8397. }
  8398. var strings = [];
  8399. var expressions = [];
  8400. for (var i = 0; i < parts.length; i++) {
  8401. var part = parts[i];
  8402. if (i % 2 === 0) {
  8403. // fixed string
  8404. strings.push(part);
  8405. }
  8406. else if (part.trim().length > 0) {
  8407. var tokens = this._lexer.tokenize(part);
  8408. var ast = new _ParseAST(input, location, tokens, this._reflector, false).parseChain();
  8409. expressions.push(ast);
  8410. }
  8411. else {
  8412. throw new ParseException('Blank expressions are not allowed in interpolated strings', input, "at column " + this._findInterpolationErrorColumn(parts, i) + " in", location);
  8413. }
  8414. }
  8415. return new ast_1.ASTWithSource(new ast_1.Interpolation(strings, expressions), input, location);
  8416. };
  8417. Parser.prototype.wrapLiteralPrimitive = function (input, location) {
  8418. return new ast_1.ASTWithSource(new ast_1.LiteralPrimitive(input), input, location);
  8419. };
  8420. Parser.prototype._checkNoInterpolation = function (input, location) {
  8421. var parts = lang_1.StringWrapper.split(input, INTERPOLATION_REGEXP);
  8422. if (parts.length > 1) {
  8423. throw new ParseException('Got interpolation ({{}}) where expression was expected', input, "at column " + this._findInterpolationErrorColumn(parts, 1) + " in", location);
  8424. }
  8425. };
  8426. Parser.prototype._findInterpolationErrorColumn = function (parts, partInErrIdx) {
  8427. var errLocation = '';
  8428. for (var j = 0; j < partInErrIdx; j++) {
  8429. errLocation += j % 2 === 0 ? parts[j] : "{{" + parts[j] + "}}";
  8430. }
  8431. return errLocation.length;
  8432. };
  8433. Parser = __decorate([
  8434. decorators_1.Injectable(),
  8435. __metadata('design:paramtypes', [lexer_1.Lexer, reflection_1.Reflector])
  8436. ], Parser);
  8437. return Parser;
  8438. })();
  8439. exports.Parser = Parser;
  8440. var _ParseAST = (function () {
  8441. function _ParseAST(input, location, tokens, reflector, parseAction) {
  8442. this.input = input;
  8443. this.location = location;
  8444. this.tokens = tokens;
  8445. this.reflector = reflector;
  8446. this.parseAction = parseAction;
  8447. this.index = 0;
  8448. }
  8449. _ParseAST.prototype.peek = function (offset) {
  8450. var i = this.index + offset;
  8451. return i < this.tokens.length ? this.tokens[i] : lexer_1.EOF;
  8452. };
  8453. Object.defineProperty(_ParseAST.prototype, "next", {
  8454. get: function () { return this.peek(0); },
  8455. enumerable: true,
  8456. configurable: true
  8457. });
  8458. Object.defineProperty(_ParseAST.prototype, "inputIndex", {
  8459. get: function () {
  8460. return (this.index < this.tokens.length) ? this.next.index : this.input.length;
  8461. },
  8462. enumerable: true,
  8463. configurable: true
  8464. });
  8465. _ParseAST.prototype.advance = function () { this.index++; };
  8466. _ParseAST.prototype.optionalCharacter = function (code) {
  8467. if (this.next.isCharacter(code)) {
  8468. this.advance();
  8469. return true;
  8470. }
  8471. else {
  8472. return false;
  8473. }
  8474. };
  8475. _ParseAST.prototype.optionalKeywordVar = function () {
  8476. if (this.peekKeywordVar()) {
  8477. this.advance();
  8478. return true;
  8479. }
  8480. else {
  8481. return false;
  8482. }
  8483. };
  8484. _ParseAST.prototype.peekKeywordVar = function () { return this.next.isKeywordVar() || this.next.isOperator('#'); };
  8485. _ParseAST.prototype.expectCharacter = function (code) {
  8486. if (this.optionalCharacter(code))
  8487. return;
  8488. this.error("Missing expected " + lang_1.StringWrapper.fromCharCode(code));
  8489. };
  8490. _ParseAST.prototype.optionalOperator = function (op) {
  8491. if (this.next.isOperator(op)) {
  8492. this.advance();
  8493. return true;
  8494. }
  8495. else {
  8496. return false;
  8497. }
  8498. };
  8499. _ParseAST.prototype.expectOperator = function (operator) {
  8500. if (this.optionalOperator(operator))
  8501. return;
  8502. this.error("Missing expected operator " + operator);
  8503. };
  8504. _ParseAST.prototype.expectIdentifierOrKeyword = function () {
  8505. var n = this.next;
  8506. if (!n.isIdentifier() && !n.isKeyword()) {
  8507. this.error("Unexpected token " + n + ", expected identifier or keyword");
  8508. }
  8509. this.advance();
  8510. return n.toString();
  8511. };
  8512. _ParseAST.prototype.expectIdentifierOrKeywordOrString = function () {
  8513. var n = this.next;
  8514. if (!n.isIdentifier() && !n.isKeyword() && !n.isString()) {
  8515. this.error("Unexpected token " + n + ", expected identifier, keyword, or string");
  8516. }
  8517. this.advance();
  8518. return n.toString();
  8519. };
  8520. _ParseAST.prototype.parseChain = function () {
  8521. var exprs = [];
  8522. while (this.index < this.tokens.length) {
  8523. var expr = this.parsePipe();
  8524. exprs.push(expr);
  8525. if (this.optionalCharacter(lexer_1.$SEMICOLON)) {
  8526. if (!this.parseAction) {
  8527. this.error("Binding expression cannot contain chained expression");
  8528. }
  8529. while (this.optionalCharacter(lexer_1.$SEMICOLON)) {
  8530. } // read all semicolons
  8531. }
  8532. else if (this.index < this.tokens.length) {
  8533. this.error("Unexpected token '" + this.next + "'");
  8534. }
  8535. }
  8536. if (exprs.length == 0)
  8537. return new ast_1.EmptyExpr();
  8538. if (exprs.length == 1)
  8539. return exprs[0];
  8540. return new ast_1.Chain(exprs);
  8541. };
  8542. _ParseAST.prototype.parsePipe = function () {
  8543. var result = this.parseExpression();
  8544. if (this.optionalOperator("|")) {
  8545. if (this.parseAction) {
  8546. this.error("Cannot have a pipe in an action expression");
  8547. }
  8548. do {
  8549. var name = this.expectIdentifierOrKeyword();
  8550. var args = [];
  8551. while (this.optionalCharacter(lexer_1.$COLON)) {
  8552. args.push(this.parseExpression());
  8553. }
  8554. result = new ast_1.BindingPipe(result, name, args);
  8555. } while (this.optionalOperator("|"));
  8556. }
  8557. return result;
  8558. };
  8559. _ParseAST.prototype.parseExpression = function () { return this.parseConditional(); };
  8560. _ParseAST.prototype.parseConditional = function () {
  8561. var start = this.inputIndex;
  8562. var result = this.parseLogicalOr();
  8563. if (this.optionalOperator('?')) {
  8564. var yes = this.parsePipe();
  8565. if (!this.optionalCharacter(lexer_1.$COLON)) {
  8566. var end = this.inputIndex;
  8567. var expression = this.input.substring(start, end);
  8568. this.error("Conditional expression " + expression + " requires all 3 expressions");
  8569. }
  8570. var no = this.parsePipe();
  8571. return new ast_1.Conditional(result, yes, no);
  8572. }
  8573. else {
  8574. return result;
  8575. }
  8576. };
  8577. _ParseAST.prototype.parseLogicalOr = function () {
  8578. // '||'
  8579. var result = this.parseLogicalAnd();
  8580. while (this.optionalOperator('||')) {
  8581. result = new ast_1.Binary('||', result, this.parseLogicalAnd());
  8582. }
  8583. return result;
  8584. };
  8585. _ParseAST.prototype.parseLogicalAnd = function () {
  8586. // '&&'
  8587. var result = this.parseEquality();
  8588. while (this.optionalOperator('&&')) {
  8589. result = new ast_1.Binary('&&', result, this.parseEquality());
  8590. }
  8591. return result;
  8592. };
  8593. _ParseAST.prototype.parseEquality = function () {
  8594. // '==','!=','===','!=='
  8595. var result = this.parseRelational();
  8596. while (true) {
  8597. if (this.optionalOperator('==')) {
  8598. result = new ast_1.Binary('==', result, this.parseRelational());
  8599. }
  8600. else if (this.optionalOperator('===')) {
  8601. result = new ast_1.Binary('===', result, this.parseRelational());
  8602. }
  8603. else if (this.optionalOperator('!=')) {
  8604. result = new ast_1.Binary('!=', result, this.parseRelational());
  8605. }
  8606. else if (this.optionalOperator('!==')) {
  8607. result = new ast_1.Binary('!==', result, this.parseRelational());
  8608. }
  8609. else {
  8610. return result;
  8611. }
  8612. }
  8613. };
  8614. _ParseAST.prototype.parseRelational = function () {
  8615. // '<', '>', '<=', '>='
  8616. var result = this.parseAdditive();
  8617. while (true) {
  8618. if (this.optionalOperator('<')) {
  8619. result = new ast_1.Binary('<', result, this.parseAdditive());
  8620. }
  8621. else if (this.optionalOperator('>')) {
  8622. result = new ast_1.Binary('>', result, this.parseAdditive());
  8623. }
  8624. else if (this.optionalOperator('<=')) {
  8625. result = new ast_1.Binary('<=', result, this.parseAdditive());
  8626. }
  8627. else if (this.optionalOperator('>=')) {
  8628. result = new ast_1.Binary('>=', result, this.parseAdditive());
  8629. }
  8630. else {
  8631. return result;
  8632. }
  8633. }
  8634. };
  8635. _ParseAST.prototype.parseAdditive = function () {
  8636. // '+', '-'
  8637. var result = this.parseMultiplicative();
  8638. while (true) {
  8639. if (this.optionalOperator('+')) {
  8640. result = new ast_1.Binary('+', result, this.parseMultiplicative());
  8641. }
  8642. else if (this.optionalOperator('-')) {
  8643. result = new ast_1.Binary('-', result, this.parseMultiplicative());
  8644. }
  8645. else {
  8646. return result;
  8647. }
  8648. }
  8649. };
  8650. _ParseAST.prototype.parseMultiplicative = function () {
  8651. // '*', '%', '/'
  8652. var result = this.parsePrefix();
  8653. while (true) {
  8654. if (this.optionalOperator('*')) {
  8655. result = new ast_1.Binary('*', result, this.parsePrefix());
  8656. }
  8657. else if (this.optionalOperator('%')) {
  8658. result = new ast_1.Binary('%', result, this.parsePrefix());
  8659. }
  8660. else if (this.optionalOperator('/')) {
  8661. result = new ast_1.Binary('/', result, this.parsePrefix());
  8662. }
  8663. else {
  8664. return result;
  8665. }
  8666. }
  8667. };
  8668. _ParseAST.prototype.parsePrefix = function () {
  8669. if (this.optionalOperator('+')) {
  8670. return this.parsePrefix();
  8671. }
  8672. else if (this.optionalOperator('-')) {
  8673. return new ast_1.Binary('-', new ast_1.LiteralPrimitive(0), this.parsePrefix());
  8674. }
  8675. else if (this.optionalOperator('!')) {
  8676. return new ast_1.PrefixNot(this.parsePrefix());
  8677. }
  8678. else {
  8679. return this.parseCallChain();
  8680. }
  8681. };
  8682. _ParseAST.prototype.parseCallChain = function () {
  8683. var result = this.parsePrimary();
  8684. while (true) {
  8685. if (this.optionalCharacter(lexer_1.$PERIOD)) {
  8686. result = this.parseAccessMemberOrMethodCall(result, false);
  8687. }
  8688. else if (this.optionalOperator('?.')) {
  8689. result = this.parseAccessMemberOrMethodCall(result, true);
  8690. }
  8691. else if (this.optionalCharacter(lexer_1.$LBRACKET)) {
  8692. var key = this.parsePipe();
  8693. this.expectCharacter(lexer_1.$RBRACKET);
  8694. if (this.optionalOperator("=")) {
  8695. var value = this.parseConditional();
  8696. result = new ast_1.KeyedWrite(result, key, value);
  8697. }
  8698. else {
  8699. result = new ast_1.KeyedRead(result, key);
  8700. }
  8701. }
  8702. else if (this.optionalCharacter(lexer_1.$LPAREN)) {
  8703. var args = this.parseCallArguments();
  8704. this.expectCharacter(lexer_1.$RPAREN);
  8705. result = new ast_1.FunctionCall(result, args);
  8706. }
  8707. else {
  8708. return result;
  8709. }
  8710. }
  8711. };
  8712. _ParseAST.prototype.parsePrimary = function () {
  8713. if (this.optionalCharacter(lexer_1.$LPAREN)) {
  8714. var result = this.parsePipe();
  8715. this.expectCharacter(lexer_1.$RPAREN);
  8716. return result;
  8717. }
  8718. else if (this.next.isKeywordNull() || this.next.isKeywordUndefined()) {
  8719. this.advance();
  8720. return new ast_1.LiteralPrimitive(null);
  8721. }
  8722. else if (this.next.isKeywordTrue()) {
  8723. this.advance();
  8724. return new ast_1.LiteralPrimitive(true);
  8725. }
  8726. else if (this.next.isKeywordFalse()) {
  8727. this.advance();
  8728. return new ast_1.LiteralPrimitive(false);
  8729. }
  8730. else if (this.optionalCharacter(lexer_1.$LBRACKET)) {
  8731. var elements = this.parseExpressionList(lexer_1.$RBRACKET);
  8732. this.expectCharacter(lexer_1.$RBRACKET);
  8733. return new ast_1.LiteralArray(elements);
  8734. }
  8735. else if (this.next.isCharacter(lexer_1.$LBRACE)) {
  8736. return this.parseLiteralMap();
  8737. }
  8738. else if (this.next.isIdentifier()) {
  8739. return this.parseAccessMemberOrMethodCall(_implicitReceiver, false);
  8740. }
  8741. else if (this.next.isNumber()) {
  8742. var value = this.next.toNumber();
  8743. this.advance();
  8744. return new ast_1.LiteralPrimitive(value);
  8745. }
  8746. else if (this.next.isString()) {
  8747. var literalValue = this.next.toString();
  8748. this.advance();
  8749. return new ast_1.LiteralPrimitive(literalValue);
  8750. }
  8751. else if (this.index >= this.tokens.length) {
  8752. this.error("Unexpected end of expression: " + this.input);
  8753. }
  8754. else {
  8755. this.error("Unexpected token " + this.next);
  8756. }
  8757. // error() throws, so we don't reach here.
  8758. throw new exceptions_1.BaseException("Fell through all cases in parsePrimary");
  8759. };
  8760. _ParseAST.prototype.parseExpressionList = function (terminator) {
  8761. var result = [];
  8762. if (!this.next.isCharacter(terminator)) {
  8763. do {
  8764. result.push(this.parsePipe());
  8765. } while (this.optionalCharacter(lexer_1.$COMMA));
  8766. }
  8767. return result;
  8768. };
  8769. _ParseAST.prototype.parseLiteralMap = function () {
  8770. var keys = [];
  8771. var values = [];
  8772. this.expectCharacter(lexer_1.$LBRACE);
  8773. if (!this.optionalCharacter(lexer_1.$RBRACE)) {
  8774. do {
  8775. var key = this.expectIdentifierOrKeywordOrString();
  8776. keys.push(key);
  8777. this.expectCharacter(lexer_1.$COLON);
  8778. values.push(this.parsePipe());
  8779. } while (this.optionalCharacter(lexer_1.$COMMA));
  8780. this.expectCharacter(lexer_1.$RBRACE);
  8781. }
  8782. return new ast_1.LiteralMap(keys, values);
  8783. };
  8784. _ParseAST.prototype.parseAccessMemberOrMethodCall = function (receiver, isSafe) {
  8785. if (isSafe === void 0) { isSafe = false; }
  8786. var id = this.expectIdentifierOrKeyword();
  8787. if (this.optionalCharacter(lexer_1.$LPAREN)) {
  8788. var args = this.parseCallArguments();
  8789. this.expectCharacter(lexer_1.$RPAREN);
  8790. var fn = this.reflector.method(id);
  8791. return isSafe ? new ast_1.SafeMethodCall(receiver, id, fn, args) :
  8792. new ast_1.MethodCall(receiver, id, fn, args);
  8793. }
  8794. else {
  8795. if (isSafe) {
  8796. if (this.optionalOperator("=")) {
  8797. this.error("The '?.' operator cannot be used in the assignment");
  8798. }
  8799. else {
  8800. return new ast_1.SafePropertyRead(receiver, id, this.reflector.getter(id));
  8801. }
  8802. }
  8803. else {
  8804. if (this.optionalOperator("=")) {
  8805. if (!this.parseAction) {
  8806. this.error("Bindings cannot contain assignments");
  8807. }
  8808. var value = this.parseConditional();
  8809. return new ast_1.PropertyWrite(receiver, id, this.reflector.setter(id), value);
  8810. }
  8811. else {
  8812. return new ast_1.PropertyRead(receiver, id, this.reflector.getter(id));
  8813. }
  8814. }
  8815. }
  8816. return null;
  8817. };
  8818. _ParseAST.prototype.parseCallArguments = function () {
  8819. if (this.next.isCharacter(lexer_1.$RPAREN))
  8820. return [];
  8821. var positionals = [];
  8822. do {
  8823. positionals.push(this.parsePipe());
  8824. } while (this.optionalCharacter(lexer_1.$COMMA));
  8825. return positionals;
  8826. };
  8827. _ParseAST.prototype.parseBlockContent = function () {
  8828. if (!this.parseAction) {
  8829. this.error("Binding expression cannot contain chained expression");
  8830. }
  8831. var exprs = [];
  8832. while (this.index < this.tokens.length && !this.next.isCharacter(lexer_1.$RBRACE)) {
  8833. var expr = this.parseExpression();
  8834. exprs.push(expr);
  8835. if (this.optionalCharacter(lexer_1.$SEMICOLON)) {
  8836. while (this.optionalCharacter(lexer_1.$SEMICOLON)) {
  8837. } // read all semicolons
  8838. }
  8839. }
  8840. if (exprs.length == 0)
  8841. return new ast_1.EmptyExpr();
  8842. if (exprs.length == 1)
  8843. return exprs[0];
  8844. return new ast_1.Chain(exprs);
  8845. };
  8846. /**
  8847. * An identifier, a keyword, a string with an optional `-` inbetween.
  8848. */
  8849. _ParseAST.prototype.expectTemplateBindingKey = function () {
  8850. var result = '';
  8851. var operatorFound = false;
  8852. do {
  8853. result += this.expectIdentifierOrKeywordOrString();
  8854. operatorFound = this.optionalOperator('-');
  8855. if (operatorFound) {
  8856. result += '-';
  8857. }
  8858. } while (operatorFound);
  8859. return result.toString();
  8860. };
  8861. _ParseAST.prototype.parseTemplateBindings = function () {
  8862. var bindings = [];
  8863. var prefix = null;
  8864. while (this.index < this.tokens.length) {
  8865. var keyIsVar = this.optionalKeywordVar();
  8866. var key = this.expectTemplateBindingKey();
  8867. if (!keyIsVar) {
  8868. if (prefix == null) {
  8869. prefix = key;
  8870. }
  8871. else {
  8872. key = prefix + key[0].toUpperCase() + key.substring(1);
  8873. }
  8874. }
  8875. this.optionalCharacter(lexer_1.$COLON);
  8876. var name = null;
  8877. var expression = null;
  8878. if (keyIsVar) {
  8879. if (this.optionalOperator("=")) {
  8880. name = this.expectTemplateBindingKey();
  8881. }
  8882. else {
  8883. name = '\$implicit';
  8884. }
  8885. }
  8886. else if (this.next !== lexer_1.EOF && !this.peekKeywordVar()) {
  8887. var start = this.inputIndex;
  8888. var ast = this.parsePipe();
  8889. var source = this.input.substring(start, this.inputIndex);
  8890. expression = new ast_1.ASTWithSource(ast, source, this.location);
  8891. }
  8892. bindings.push(new ast_1.TemplateBinding(key, keyIsVar, name, expression));
  8893. if (!this.optionalCharacter(lexer_1.$SEMICOLON)) {
  8894. this.optionalCharacter(lexer_1.$COMMA);
  8895. }
  8896. }
  8897. return bindings;
  8898. };
  8899. _ParseAST.prototype.error = function (message, index) {
  8900. if (index === void 0) { index = null; }
  8901. if (lang_1.isBlank(index))
  8902. index = this.index;
  8903. var location = (index < this.tokens.length) ? "at column " + (this.tokens[index].index + 1) + " in" :
  8904. "at the end of the expression";
  8905. throw new ParseException(message, this.input, location, this.location);
  8906. };
  8907. return _ParseAST;
  8908. })();
  8909. exports._ParseAST = _ParseAST;
  8910. var SimpleExpressionChecker = (function () {
  8911. function SimpleExpressionChecker() {
  8912. this.simple = true;
  8913. }
  8914. SimpleExpressionChecker.check = function (ast) {
  8915. var s = new SimpleExpressionChecker();
  8916. ast.visit(s);
  8917. return s.simple;
  8918. };
  8919. SimpleExpressionChecker.prototype.visitImplicitReceiver = function (ast) { };
  8920. SimpleExpressionChecker.prototype.visitInterpolation = function (ast) { this.simple = false; };
  8921. SimpleExpressionChecker.prototype.visitLiteralPrimitive = function (ast) { };
  8922. SimpleExpressionChecker.prototype.visitPropertyRead = function (ast) { };
  8923. SimpleExpressionChecker.prototype.visitPropertyWrite = function (ast) { this.simple = false; };
  8924. SimpleExpressionChecker.prototype.visitSafePropertyRead = function (ast) { this.simple = false; };
  8925. SimpleExpressionChecker.prototype.visitMethodCall = function (ast) { this.simple = false; };
  8926. SimpleExpressionChecker.prototype.visitSafeMethodCall = function (ast) { this.simple = false; };
  8927. SimpleExpressionChecker.prototype.visitFunctionCall = function (ast) { this.simple = false; };
  8928. SimpleExpressionChecker.prototype.visitLiteralArray = function (ast) { this.visitAll(ast.expressions); };
  8929. SimpleExpressionChecker.prototype.visitLiteralMap = function (ast) { this.visitAll(ast.values); };
  8930. SimpleExpressionChecker.prototype.visitBinary = function (ast) { this.simple = false; };
  8931. SimpleExpressionChecker.prototype.visitPrefixNot = function (ast) { this.simple = false; };
  8932. SimpleExpressionChecker.prototype.visitConditional = function (ast) { this.simple = false; };
  8933. SimpleExpressionChecker.prototype.visitPipe = function (ast) { this.simple = false; };
  8934. SimpleExpressionChecker.prototype.visitKeyedRead = function (ast) { this.simple = false; };
  8935. SimpleExpressionChecker.prototype.visitKeyedWrite = function (ast) { this.simple = false; };
  8936. SimpleExpressionChecker.prototype.visitAll = function (asts) {
  8937. var res = collection_1.ListWrapper.createFixedSize(asts.length);
  8938. for (var i = 0; i < asts.length; ++i) {
  8939. res[i] = asts[i].visit(this);
  8940. }
  8941. return res;
  8942. };
  8943. SimpleExpressionChecker.prototype.visitChain = function (ast) { this.simple = false; };
  8944. SimpleExpressionChecker.prototype.visitQuote = function (ast) { this.simple = false; };
  8945. return SimpleExpressionChecker;
  8946. })();
  8947. /***/ },
  8948. /* 33 */
  8949. /***/ function(module, exports, __webpack_require__) {
  8950. var lang_1 = __webpack_require__(5);
  8951. var exceptions_1 = __webpack_require__(14);
  8952. var collection_1 = __webpack_require__(12);
  8953. var Locals = (function () {
  8954. function Locals(parent, current) {
  8955. this.parent = parent;
  8956. this.current = current;
  8957. }
  8958. Locals.prototype.contains = function (name) {
  8959. if (this.current.has(name)) {
  8960. return true;
  8961. }
  8962. if (lang_1.isPresent(this.parent)) {
  8963. return this.parent.contains(name);
  8964. }
  8965. return false;
  8966. };
  8967. Locals.prototype.get = function (name) {
  8968. if (this.current.has(name)) {
  8969. return this.current.get(name);
  8970. }
  8971. if (lang_1.isPresent(this.parent)) {
  8972. return this.parent.get(name);
  8973. }
  8974. throw new exceptions_1.BaseException("Cannot find '" + name + "'");
  8975. };
  8976. Locals.prototype.set = function (name, value) {
  8977. // TODO(rado): consider removing this check if we can guarantee this is not
  8978. // exposed to the public API.
  8979. // TODO: vsavkin maybe it should check only the local map
  8980. if (this.current.has(name)) {
  8981. this.current.set(name, value);
  8982. }
  8983. else {
  8984. throw new exceptions_1.BaseException("Setting of new keys post-construction is not supported. Key: " + name + ".");
  8985. }
  8986. };
  8987. Locals.prototype.clearValues = function () { collection_1.MapWrapper.clearValues(this.current); };
  8988. return Locals;
  8989. })();
  8990. exports.Locals = Locals;
  8991. /***/ },
  8992. /* 34 */
  8993. /***/ function(module, exports, __webpack_require__) {
  8994. var __extends = (this && this.__extends) || function (d, b) {
  8995. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  8996. function __() { this.constructor = d; }
  8997. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  8998. };
  8999. var exceptions_1 = __webpack_require__(14);
  9000. /**
  9001. * An error thrown if application changes model breaking the top-down data flow.
  9002. *
  9003. * This exception is only thrown in dev mode.
  9004. *
  9005. * <!-- TODO: Add a link once the dev mode option is configurable -->
  9006. *
  9007. * ### Example
  9008. *
  9009. * ```typescript
  9010. * @Component({
  9011. * selector: 'parent',
  9012. * template: `
  9013. * <child [prop]="parentProp"></child>
  9014. * `,
  9015. * directives: [forwardRef(() => Child)]
  9016. * })
  9017. * class Parent {
  9018. * parentProp = "init";
  9019. * }
  9020. *
  9021. * @Directive({selector: 'child', inputs: ['prop']})
  9022. * class Child {
  9023. * constructor(public parent: Parent) {}
  9024. *
  9025. * set prop(v) {
  9026. * // this updates the parent property, which is disallowed during change detection
  9027. * // this will result in ExpressionChangedAfterItHasBeenCheckedException
  9028. * this.parent.parentProp = "updated";
  9029. * }
  9030. * }
  9031. * ```
  9032. */
  9033. var ExpressionChangedAfterItHasBeenCheckedException = (function (_super) {
  9034. __extends(ExpressionChangedAfterItHasBeenCheckedException, _super);
  9035. function ExpressionChangedAfterItHasBeenCheckedException(exp, oldValue, currValue, context) {
  9036. _super.call(this, ("Expression '" + exp + "' has changed after it was checked. ") +
  9037. ("Previous value: '" + oldValue + "'. Current value: '" + currValue + "'"));
  9038. }
  9039. return ExpressionChangedAfterItHasBeenCheckedException;
  9040. })(exceptions_1.BaseException);
  9041. exports.ExpressionChangedAfterItHasBeenCheckedException = ExpressionChangedAfterItHasBeenCheckedException;
  9042. /**
  9043. * Thrown when an expression evaluation raises an exception.
  9044. *
  9045. * This error wraps the original exception to attach additional contextual information that can
  9046. * be useful for debugging.
  9047. *
  9048. * ### Example ([live demo](http://plnkr.co/edit/2Kywoz?p=preview))
  9049. *
  9050. * ```typescript
  9051. * @Directive({selector: 'child', inputs: ['prop']})
  9052. * class Child {
  9053. * prop;
  9054. * }
  9055. *
  9056. * @Component({
  9057. * selector: 'app',
  9058. * template: `
  9059. * <child [prop]="field.first"></child>
  9060. * `,
  9061. * directives: [Child]
  9062. * })
  9063. * class App {
  9064. * field = null;
  9065. * }
  9066. *
  9067. * bootstrap(App);
  9068. * ```
  9069. *
  9070. * You can access the original exception and stack through the `originalException` and
  9071. * `originalStack` properties.
  9072. */
  9073. var ChangeDetectionError = (function (_super) {
  9074. __extends(ChangeDetectionError, _super);
  9075. function ChangeDetectionError(exp, originalException, originalStack, context) {
  9076. _super.call(this, originalException + " in [" + exp + "]", originalException, originalStack, context);
  9077. this.location = exp;
  9078. }
  9079. return ChangeDetectionError;
  9080. })(exceptions_1.WrappedException);
  9081. exports.ChangeDetectionError = ChangeDetectionError;
  9082. /**
  9083. * Thrown when change detector executes on dehydrated view.
  9084. *
  9085. * This error indicates a bug in the framework.
  9086. *
  9087. * This is an internal Angular error.
  9088. */
  9089. var DehydratedException = (function (_super) {
  9090. __extends(DehydratedException, _super);
  9091. function DehydratedException() {
  9092. _super.call(this, 'Attempt to detect changes on a dehydrated detector.');
  9093. }
  9094. return DehydratedException;
  9095. })(exceptions_1.BaseException);
  9096. exports.DehydratedException = DehydratedException;
  9097. /***/ },
  9098. /* 35 */
  9099. /***/ function(module, exports) {
  9100. var DebugContext = (function () {
  9101. function DebugContext(element, componentElement, directive, context, locals, injector) {
  9102. this.element = element;
  9103. this.componentElement = componentElement;
  9104. this.directive = directive;
  9105. this.context = context;
  9106. this.locals = locals;
  9107. this.injector = injector;
  9108. }
  9109. return DebugContext;
  9110. })();
  9111. exports.DebugContext = DebugContext;
  9112. var ChangeDetectorGenConfig = (function () {
  9113. function ChangeDetectorGenConfig(genDebugInfo, logBindingUpdate, useJit) {
  9114. this.genDebugInfo = genDebugInfo;
  9115. this.logBindingUpdate = logBindingUpdate;
  9116. this.useJit = useJit;
  9117. }
  9118. return ChangeDetectorGenConfig;
  9119. })();
  9120. exports.ChangeDetectorGenConfig = ChangeDetectorGenConfig;
  9121. var ChangeDetectorDefinition = (function () {
  9122. function ChangeDetectorDefinition(id, strategy, variableNames, bindingRecords, eventRecords, directiveRecords, genConfig) {
  9123. this.id = id;
  9124. this.strategy = strategy;
  9125. this.variableNames = variableNames;
  9126. this.bindingRecords = bindingRecords;
  9127. this.eventRecords = eventRecords;
  9128. this.directiveRecords = directiveRecords;
  9129. this.genConfig = genConfig;
  9130. }
  9131. return ChangeDetectorDefinition;
  9132. })();
  9133. exports.ChangeDetectorDefinition = ChangeDetectorDefinition;
  9134. /***/ },
  9135. /* 36 */
  9136. /***/ function(module, exports, __webpack_require__) {
  9137. var lang_1 = __webpack_require__(5);
  9138. /**
  9139. * Describes the current state of the change detector.
  9140. */
  9141. (function (ChangeDetectorState) {
  9142. /**
  9143. * `NeverChecked` means that the change detector has not been checked yet, and
  9144. * initialization methods should be called during detection.
  9145. */
  9146. ChangeDetectorState[ChangeDetectorState["NeverChecked"] = 0] = "NeverChecked";
  9147. /**
  9148. * `CheckedBefore` means that the change detector has successfully completed at least
  9149. * one detection previously.
  9150. */
  9151. ChangeDetectorState[ChangeDetectorState["CheckedBefore"] = 1] = "CheckedBefore";
  9152. /**
  9153. * `Errored` means that the change detector encountered an error checking a binding
  9154. * or calling a directive lifecycle method and is now in an inconsistent state. Change
  9155. * detectors in this state will no longer detect changes.
  9156. */
  9157. ChangeDetectorState[ChangeDetectorState["Errored"] = 2] = "Errored";
  9158. })(exports.ChangeDetectorState || (exports.ChangeDetectorState = {}));
  9159. var ChangeDetectorState = exports.ChangeDetectorState;
  9160. /**
  9161. * Describes within the change detector which strategy will be used the next time change
  9162. * detection is triggered.
  9163. */
  9164. (function (ChangeDetectionStrategy) {
  9165. /**
  9166. * `CheckedOnce` means that after calling detectChanges the mode of the change detector
  9167. * will become `Checked`.
  9168. */
  9169. ChangeDetectionStrategy[ChangeDetectionStrategy["CheckOnce"] = 0] = "CheckOnce";
  9170. /**
  9171. * `Checked` means that the change detector should be skipped until its mode changes to
  9172. * `CheckOnce`.
  9173. */
  9174. ChangeDetectionStrategy[ChangeDetectionStrategy["Checked"] = 1] = "Checked";
  9175. /**
  9176. * `CheckAlways` means that after calling detectChanges the mode of the change detector
  9177. * will remain `CheckAlways`.
  9178. */
  9179. ChangeDetectionStrategy[ChangeDetectionStrategy["CheckAlways"] = 2] = "CheckAlways";
  9180. /**
  9181. * `Detached` means that the change detector sub tree is not a part of the main tree and
  9182. * should be skipped.
  9183. */
  9184. ChangeDetectionStrategy[ChangeDetectionStrategy["Detached"] = 3] = "Detached";
  9185. /**
  9186. * `OnPush` means that the change detector's mode will be set to `CheckOnce` during hydration.
  9187. */
  9188. ChangeDetectionStrategy[ChangeDetectionStrategy["OnPush"] = 4] = "OnPush";
  9189. /**
  9190. * `Default` means that the change detector's mode will be set to `CheckAlways` during hydration.
  9191. */
  9192. ChangeDetectionStrategy[ChangeDetectionStrategy["Default"] = 5] = "Default";
  9193. /**
  9194. * This is an experimental feature. Works only in Dart.
  9195. */
  9196. ChangeDetectionStrategy[ChangeDetectionStrategy["OnPushObserve"] = 6] = "OnPushObserve";
  9197. })(exports.ChangeDetectionStrategy || (exports.ChangeDetectionStrategy = {}));
  9198. var ChangeDetectionStrategy = exports.ChangeDetectionStrategy;
  9199. /**
  9200. * List of possible {@link ChangeDetectionStrategy} values.
  9201. */
  9202. exports.CHANGE_DETECTION_STRATEGY_VALUES = [
  9203. ChangeDetectionStrategy.CheckOnce,
  9204. ChangeDetectionStrategy.Checked,
  9205. ChangeDetectionStrategy.CheckAlways,
  9206. ChangeDetectionStrategy.Detached,
  9207. ChangeDetectionStrategy.OnPush,
  9208. ChangeDetectionStrategy.Default,
  9209. ChangeDetectionStrategy.OnPushObserve
  9210. ];
  9211. /**
  9212. * List of possible {@link ChangeDetectorState} values.
  9213. */
  9214. exports.CHANGE_DETECTOR_STATE_VALUES = [
  9215. ChangeDetectorState.NeverChecked,
  9216. ChangeDetectorState.CheckedBefore,
  9217. ChangeDetectorState.Errored
  9218. ];
  9219. function isDefaultChangeDetectionStrategy(changeDetectionStrategy) {
  9220. return lang_1.isBlank(changeDetectionStrategy) ||
  9221. changeDetectionStrategy === ChangeDetectionStrategy.Default;
  9222. }
  9223. exports.isDefaultChangeDetectionStrategy = isDefaultChangeDetectionStrategy;
  9224. /***/ },
  9225. /* 37 */
  9226. /***/ function(module, exports, __webpack_require__) {
  9227. var lang_1 = __webpack_require__(5);
  9228. var exceptions_1 = __webpack_require__(14);
  9229. var collection_1 = __webpack_require__(12);
  9230. var ast_1 = __webpack_require__(30);
  9231. var change_detection_util_1 = __webpack_require__(38);
  9232. var dynamic_change_detector_1 = __webpack_require__(42);
  9233. var directive_record_1 = __webpack_require__(41);
  9234. var event_binding_1 = __webpack_require__(49);
  9235. var coalesce_1 = __webpack_require__(50);
  9236. var proto_record_1 = __webpack_require__(48);
  9237. var DynamicProtoChangeDetector = (function () {
  9238. function DynamicProtoChangeDetector(_definition) {
  9239. this._definition = _definition;
  9240. this._propertyBindingRecords = createPropertyRecords(_definition);
  9241. this._eventBindingRecords = createEventRecords(_definition);
  9242. this._propertyBindingTargets = this._definition.bindingRecords.map(function (b) { return b.target; });
  9243. this._directiveIndices = this._definition.directiveRecords.map(function (d) { return d.directiveIndex; });
  9244. }
  9245. DynamicProtoChangeDetector.prototype.instantiate = function (dispatcher) {
  9246. 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);
  9247. };
  9248. return DynamicProtoChangeDetector;
  9249. })();
  9250. exports.DynamicProtoChangeDetector = DynamicProtoChangeDetector;
  9251. function createPropertyRecords(definition) {
  9252. var recordBuilder = new ProtoRecordBuilder();
  9253. collection_1.ListWrapper.forEachWithIndex(definition.bindingRecords, function (b, index) { return recordBuilder.add(b, definition.variableNames, index); });
  9254. return coalesce_1.coalesce(recordBuilder.records);
  9255. }
  9256. exports.createPropertyRecords = createPropertyRecords;
  9257. function createEventRecords(definition) {
  9258. // TODO: vsavkin: remove $event when the compiler handles render-side variables properly
  9259. var varNames = collection_1.ListWrapper.concat(['$event'], definition.variableNames);
  9260. return definition.eventRecords.map(function (er) {
  9261. var records = _ConvertAstIntoProtoRecords.create(er, varNames);
  9262. var dirIndex = er.implicitReceiver instanceof directive_record_1.DirectiveIndex ? er.implicitReceiver : null;
  9263. return new event_binding_1.EventBinding(er.target.name, er.target.elementIndex, dirIndex, records);
  9264. });
  9265. }
  9266. exports.createEventRecords = createEventRecords;
  9267. var ProtoRecordBuilder = (function () {
  9268. function ProtoRecordBuilder() {
  9269. this.records = [];
  9270. }
  9271. ProtoRecordBuilder.prototype.add = function (b, variableNames, bindingIndex) {
  9272. var oldLast = collection_1.ListWrapper.last(this.records);
  9273. if (lang_1.isPresent(oldLast) && oldLast.bindingRecord.directiveRecord == b.directiveRecord) {
  9274. oldLast.lastInDirective = false;
  9275. }
  9276. var numberOfRecordsBefore = this.records.length;
  9277. this._appendRecords(b, variableNames, bindingIndex);
  9278. var newLast = collection_1.ListWrapper.last(this.records);
  9279. if (lang_1.isPresent(newLast) && newLast !== oldLast) {
  9280. newLast.lastInBinding = true;
  9281. newLast.lastInDirective = true;
  9282. this._setArgumentToPureFunction(numberOfRecordsBefore);
  9283. }
  9284. };
  9285. /** @internal */
  9286. ProtoRecordBuilder.prototype._setArgumentToPureFunction = function (startIndex) {
  9287. var _this = this;
  9288. for (var i = startIndex; i < this.records.length; ++i) {
  9289. var rec = this.records[i];
  9290. if (rec.isPureFunction()) {
  9291. rec.args.forEach(function (recordIndex) { return _this.records[recordIndex - 1].argumentToPureFunction =
  9292. true; });
  9293. }
  9294. if (rec.mode === proto_record_1.RecordType.Pipe) {
  9295. rec.args.forEach(function (recordIndex) { return _this.records[recordIndex - 1].argumentToPureFunction =
  9296. true; });
  9297. this.records[rec.contextIndex - 1].argumentToPureFunction = true;
  9298. }
  9299. }
  9300. };
  9301. /** @internal */
  9302. ProtoRecordBuilder.prototype._appendRecords = function (b, variableNames, bindingIndex) {
  9303. if (b.isDirectiveLifecycle()) {
  9304. 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));
  9305. }
  9306. else {
  9307. _ConvertAstIntoProtoRecords.append(this.records, b, variableNames, bindingIndex);
  9308. }
  9309. };
  9310. return ProtoRecordBuilder;
  9311. })();
  9312. exports.ProtoRecordBuilder = ProtoRecordBuilder;
  9313. var _ConvertAstIntoProtoRecords = (function () {
  9314. function _ConvertAstIntoProtoRecords(_records, _bindingRecord, _variableNames, _bindingIndex) {
  9315. this._records = _records;
  9316. this._bindingRecord = _bindingRecord;
  9317. this._variableNames = _variableNames;
  9318. this._bindingIndex = _bindingIndex;
  9319. }
  9320. _ConvertAstIntoProtoRecords.append = function (records, b, variableNames, bindingIndex) {
  9321. var c = new _ConvertAstIntoProtoRecords(records, b, variableNames, bindingIndex);
  9322. b.ast.visit(c);
  9323. };
  9324. _ConvertAstIntoProtoRecords.create = function (b, variableNames) {
  9325. var rec = [];
  9326. _ConvertAstIntoProtoRecords.append(rec, b, variableNames, null);
  9327. rec[rec.length - 1].lastInBinding = true;
  9328. return rec;
  9329. };
  9330. _ConvertAstIntoProtoRecords.prototype.visitImplicitReceiver = function (ast) { return this._bindingRecord.implicitReceiver; };
  9331. _ConvertAstIntoProtoRecords.prototype.visitInterpolation = function (ast) {
  9332. var args = this._visitAll(ast.expressions);
  9333. return this._addRecord(proto_record_1.RecordType.Interpolate, "interpolate", _interpolationFn(ast.strings), args, ast.strings, 0);
  9334. };
  9335. _ConvertAstIntoProtoRecords.prototype.visitLiteralPrimitive = function (ast) {
  9336. return this._addRecord(proto_record_1.RecordType.Const, "literal", ast.value, [], null, 0);
  9337. };
  9338. _ConvertAstIntoProtoRecords.prototype.visitPropertyRead = function (ast) {
  9339. var receiver = ast.receiver.visit(this);
  9340. if (lang_1.isPresent(this._variableNames) && collection_1.ListWrapper.contains(this._variableNames, ast.name) &&
  9341. ast.receiver instanceof ast_1.ImplicitReceiver) {
  9342. return this._addRecord(proto_record_1.RecordType.Local, ast.name, ast.name, [], null, receiver);
  9343. }
  9344. else {
  9345. return this._addRecord(proto_record_1.RecordType.PropertyRead, ast.name, ast.getter, [], null, receiver);
  9346. }
  9347. };
  9348. _ConvertAstIntoProtoRecords.prototype.visitPropertyWrite = function (ast) {
  9349. if (lang_1.isPresent(this._variableNames) && collection_1.ListWrapper.contains(this._variableNames, ast.name) &&
  9350. ast.receiver instanceof ast_1.ImplicitReceiver) {
  9351. throw new exceptions_1.BaseException("Cannot reassign a variable binding " + ast.name);
  9352. }
  9353. else {
  9354. var receiver = ast.receiver.visit(this);
  9355. var value = ast.value.visit(this);
  9356. return this._addRecord(proto_record_1.RecordType.PropertyWrite, ast.name, ast.setter, [value], null, receiver);
  9357. }
  9358. };
  9359. _ConvertAstIntoProtoRecords.prototype.visitKeyedWrite = function (ast) {
  9360. var obj = ast.obj.visit(this);
  9361. var key = ast.key.visit(this);
  9362. var value = ast.value.visit(this);
  9363. return this._addRecord(proto_record_1.RecordType.KeyedWrite, null, null, [key, value], null, obj);
  9364. };
  9365. _ConvertAstIntoProtoRecords.prototype.visitSafePropertyRead = function (ast) {
  9366. var receiver = ast.receiver.visit(this);
  9367. return this._addRecord(proto_record_1.RecordType.SafeProperty, ast.name, ast.getter, [], null, receiver);
  9368. };
  9369. _ConvertAstIntoProtoRecords.prototype.visitMethodCall = function (ast) {
  9370. var receiver = ast.receiver.visit(this);
  9371. var args = this._visitAll(ast.args);
  9372. if (lang_1.isPresent(this._variableNames) && collection_1.ListWrapper.contains(this._variableNames, ast.name)) {
  9373. var target = this._addRecord(proto_record_1.RecordType.Local, ast.name, ast.name, [], null, receiver);
  9374. return this._addRecord(proto_record_1.RecordType.InvokeClosure, "closure", null, args, null, target);
  9375. }
  9376. else {
  9377. return this._addRecord(proto_record_1.RecordType.InvokeMethod, ast.name, ast.fn, args, null, receiver);
  9378. }
  9379. };
  9380. _ConvertAstIntoProtoRecords.prototype.visitSafeMethodCall = function (ast) {
  9381. var receiver = ast.receiver.visit(this);
  9382. var args = this._visitAll(ast.args);
  9383. return this._addRecord(proto_record_1.RecordType.SafeMethodInvoke, ast.name, ast.fn, args, null, receiver);
  9384. };
  9385. _ConvertAstIntoProtoRecords.prototype.visitFunctionCall = function (ast) {
  9386. var target = ast.target.visit(this);
  9387. var args = this._visitAll(ast.args);
  9388. return this._addRecord(proto_record_1.RecordType.InvokeClosure, "closure", null, args, null, target);
  9389. };
  9390. _ConvertAstIntoProtoRecords.prototype.visitLiteralArray = function (ast) {
  9391. var primitiveName = "arrayFn" + ast.expressions.length;
  9392. return this._addRecord(proto_record_1.RecordType.CollectionLiteral, primitiveName, _arrayFn(ast.expressions.length), this._visitAll(ast.expressions), null, 0);
  9393. };
  9394. _ConvertAstIntoProtoRecords.prototype.visitLiteralMap = function (ast) {
  9395. 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);
  9396. };
  9397. _ConvertAstIntoProtoRecords.prototype.visitBinary = function (ast) {
  9398. var left = ast.left.visit(this);
  9399. switch (ast.operation) {
  9400. case '&&':
  9401. var branchEnd = [null];
  9402. this._addRecord(proto_record_1.RecordType.SkipRecordsIfNot, "SkipRecordsIfNot", null, [], branchEnd, left);
  9403. var right = ast.right.visit(this);
  9404. branchEnd[0] = right;
  9405. return this._addRecord(proto_record_1.RecordType.PrimitiveOp, "cond", change_detection_util_1.ChangeDetectionUtil.cond, [left, right, left], null, 0);
  9406. case '||':
  9407. var branchEnd = [null];
  9408. this._addRecord(proto_record_1.RecordType.SkipRecordsIf, "SkipRecordsIf", null, [], branchEnd, left);
  9409. var right = ast.right.visit(this);
  9410. branchEnd[0] = right;
  9411. return this._addRecord(proto_record_1.RecordType.PrimitiveOp, "cond", change_detection_util_1.ChangeDetectionUtil.cond, [left, left, right], null, 0);
  9412. default:
  9413. var right = ast.right.visit(this);
  9414. return this._addRecord(proto_record_1.RecordType.PrimitiveOp, _operationToPrimitiveName(ast.operation), _operationToFunction(ast.operation), [left, right], null, 0);
  9415. }
  9416. };
  9417. _ConvertAstIntoProtoRecords.prototype.visitPrefixNot = function (ast) {
  9418. var exp = ast.expression.visit(this);
  9419. return this._addRecord(proto_record_1.RecordType.PrimitiveOp, "operation_negate", change_detection_util_1.ChangeDetectionUtil.operation_negate, [exp], null, 0);
  9420. };
  9421. _ConvertAstIntoProtoRecords.prototype.visitConditional = function (ast) {
  9422. var condition = ast.condition.visit(this);
  9423. var startOfFalseBranch = [null];
  9424. var endOfFalseBranch = [null];
  9425. this._addRecord(proto_record_1.RecordType.SkipRecordsIfNot, "SkipRecordsIfNot", null, [], startOfFalseBranch, condition);
  9426. var whenTrue = ast.trueExp.visit(this);
  9427. var skip = this._addRecord(proto_record_1.RecordType.SkipRecords, "SkipRecords", null, [], endOfFalseBranch, 0);
  9428. var whenFalse = ast.falseExp.visit(this);
  9429. startOfFalseBranch[0] = skip;
  9430. endOfFalseBranch[0] = whenFalse;
  9431. return this._addRecord(proto_record_1.RecordType.PrimitiveOp, "cond", change_detection_util_1.ChangeDetectionUtil.cond, [condition, whenTrue, whenFalse], null, 0);
  9432. };
  9433. _ConvertAstIntoProtoRecords.prototype.visitPipe = function (ast) {
  9434. var value = ast.exp.visit(this);
  9435. var args = this._visitAll(ast.args);
  9436. return this._addRecord(proto_record_1.RecordType.Pipe, ast.name, ast.name, args, null, value);
  9437. };
  9438. _ConvertAstIntoProtoRecords.prototype.visitKeyedRead = function (ast) {
  9439. var obj = ast.obj.visit(this);
  9440. var key = ast.key.visit(this);
  9441. return this._addRecord(proto_record_1.RecordType.KeyedRead, "keyedAccess", change_detection_util_1.ChangeDetectionUtil.keyedAccess, [key], null, obj);
  9442. };
  9443. _ConvertAstIntoProtoRecords.prototype.visitChain = function (ast) {
  9444. var _this = this;
  9445. var args = ast.expressions.map(function (e) { return e.visit(_this); });
  9446. return this._addRecord(proto_record_1.RecordType.Chain, "chain", null, args, null, 0);
  9447. };
  9448. _ConvertAstIntoProtoRecords.prototype.visitQuote = function (ast) {
  9449. throw new exceptions_1.BaseException(("Caught uninterpreted expression at " + ast.location + ": " + ast.uninterpretedExpression + ". ") +
  9450. ("Expression prefix " + ast.prefix + " did not match a template transformer to interpret the expression."));
  9451. };
  9452. _ConvertAstIntoProtoRecords.prototype._visitAll = function (asts) {
  9453. var res = collection_1.ListWrapper.createFixedSize(asts.length);
  9454. for (var i = 0; i < asts.length; ++i) {
  9455. res[i] = asts[i].visit(this);
  9456. }
  9457. return res;
  9458. };
  9459. /**
  9460. * Adds a `ProtoRecord` and returns its selfIndex.
  9461. */
  9462. _ConvertAstIntoProtoRecords.prototype._addRecord = function (type, name, funcOrValue, args, fixedArgs, context) {
  9463. var selfIndex = this._records.length + 1;
  9464. if (context instanceof directive_record_1.DirectiveIndex) {
  9465. this._records.push(new proto_record_1.ProtoRecord(type, name, funcOrValue, args, fixedArgs, -1, context, selfIndex, this._bindingRecord, false, false, false, false, this._bindingIndex));
  9466. }
  9467. else {
  9468. this._records.push(new proto_record_1.ProtoRecord(type, name, funcOrValue, args, fixedArgs, context, null, selfIndex, this._bindingRecord, false, false, false, false, this._bindingIndex));
  9469. }
  9470. return selfIndex;
  9471. };
  9472. return _ConvertAstIntoProtoRecords;
  9473. })();
  9474. function _arrayFn(length) {
  9475. switch (length) {
  9476. case 0:
  9477. return change_detection_util_1.ChangeDetectionUtil.arrayFn0;
  9478. case 1:
  9479. return change_detection_util_1.ChangeDetectionUtil.arrayFn1;
  9480. case 2:
  9481. return change_detection_util_1.ChangeDetectionUtil.arrayFn2;
  9482. case 3:
  9483. return change_detection_util_1.ChangeDetectionUtil.arrayFn3;
  9484. case 4:
  9485. return change_detection_util_1.ChangeDetectionUtil.arrayFn4;
  9486. case 5:
  9487. return change_detection_util_1.ChangeDetectionUtil.arrayFn5;
  9488. case 6:
  9489. return change_detection_util_1.ChangeDetectionUtil.arrayFn6;
  9490. case 7:
  9491. return change_detection_util_1.ChangeDetectionUtil.arrayFn7;
  9492. case 8:
  9493. return change_detection_util_1.ChangeDetectionUtil.arrayFn8;
  9494. case 9:
  9495. return change_detection_util_1.ChangeDetectionUtil.arrayFn9;
  9496. default:
  9497. throw new exceptions_1.BaseException("Does not support literal maps with more than 9 elements");
  9498. }
  9499. }
  9500. function _mapPrimitiveName(keys) {
  9501. var stringifiedKeys = keys.map(function (k) { return lang_1.isString(k) ? "\"" + k + "\"" : "" + k; }).join(', ');
  9502. return "mapFn([" + stringifiedKeys + "])";
  9503. }
  9504. function _operationToPrimitiveName(operation) {
  9505. switch (operation) {
  9506. case '+':
  9507. return "operation_add";
  9508. case '-':
  9509. return "operation_subtract";
  9510. case '*':
  9511. return "operation_multiply";
  9512. case '/':
  9513. return "operation_divide";
  9514. case '%':
  9515. return "operation_remainder";
  9516. case '==':
  9517. return "operation_equals";
  9518. case '!=':
  9519. return "operation_not_equals";
  9520. case '===':
  9521. return "operation_identical";
  9522. case '!==':
  9523. return "operation_not_identical";
  9524. case '<':
  9525. return "operation_less_then";
  9526. case '>':
  9527. return "operation_greater_then";
  9528. case '<=':
  9529. return "operation_less_or_equals_then";
  9530. case '>=':
  9531. return "operation_greater_or_equals_then";
  9532. default:
  9533. throw new exceptions_1.BaseException("Unsupported operation " + operation);
  9534. }
  9535. }
  9536. function _operationToFunction(operation) {
  9537. switch (operation) {
  9538. case '+':
  9539. return change_detection_util_1.ChangeDetectionUtil.operation_add;
  9540. case '-':
  9541. return change_detection_util_1.ChangeDetectionUtil.operation_subtract;
  9542. case '*':
  9543. return change_detection_util_1.ChangeDetectionUtil.operation_multiply;
  9544. case '/':
  9545. return change_detection_util_1.ChangeDetectionUtil.operation_divide;
  9546. case '%':
  9547. return change_detection_util_1.ChangeDetectionUtil.operation_remainder;
  9548. case '==':
  9549. return change_detection_util_1.ChangeDetectionUtil.operation_equals;
  9550. case '!=':
  9551. return change_detection_util_1.ChangeDetectionUtil.operation_not_equals;
  9552. case '===':
  9553. return change_detection_util_1.ChangeDetectionUtil.operation_identical;
  9554. case '!==':
  9555. return change_detection_util_1.ChangeDetectionUtil.operation_not_identical;
  9556. case '<':
  9557. return change_detection_util_1.ChangeDetectionUtil.operation_less_then;
  9558. case '>':
  9559. return change_detection_util_1.ChangeDetectionUtil.operation_greater_then;
  9560. case '<=':
  9561. return change_detection_util_1.ChangeDetectionUtil.operation_less_or_equals_then;
  9562. case '>=':
  9563. return change_detection_util_1.ChangeDetectionUtil.operation_greater_or_equals_then;
  9564. default:
  9565. throw new exceptions_1.BaseException("Unsupported operation " + operation);
  9566. }
  9567. }
  9568. function s(v) {
  9569. return lang_1.isPresent(v) ? "" + v : '';
  9570. }
  9571. function _interpolationFn(strings) {
  9572. var length = strings.length;
  9573. var c0 = length > 0 ? strings[0] : null;
  9574. var c1 = length > 1 ? strings[1] : null;
  9575. var c2 = length > 2 ? strings[2] : null;
  9576. var c3 = length > 3 ? strings[3] : null;
  9577. var c4 = length > 4 ? strings[4] : null;
  9578. var c5 = length > 5 ? strings[5] : null;
  9579. var c6 = length > 6 ? strings[6] : null;
  9580. var c7 = length > 7 ? strings[7] : null;
  9581. var c8 = length > 8 ? strings[8] : null;
  9582. var c9 = length > 9 ? strings[9] : null;
  9583. switch (length - 1) {
  9584. case 1:
  9585. return function (a1) { return c0 + s(a1) + c1; };
  9586. case 2:
  9587. return function (a1, a2) { return c0 + s(a1) + c1 + s(a2) + c2; };
  9588. case 3:
  9589. return function (a1, a2, a3) { return c0 + s(a1) + c1 + s(a2) + c2 + s(a3) + c3; };
  9590. case 4:
  9591. return function (a1, a2, a3, a4) { return c0 + s(a1) + c1 + s(a2) + c2 + s(a3) + c3 + s(a4) + c4; };
  9592. case 5:
  9593. return function (a1, a2, a3, a4, a5) {
  9594. return c0 + s(a1) + c1 + s(a2) + c2 + s(a3) + c3 + s(a4) + c4 + s(a5) + c5;
  9595. };
  9596. case 6:
  9597. return function (a1, a2, a3, a4, a5, a6) {
  9598. return c0 + s(a1) + c1 + s(a2) + c2 + s(a3) + c3 + s(a4) + c4 + s(a5) + c5 + s(a6) + c6;
  9599. };
  9600. case 7:
  9601. return function (a1, a2, a3, a4, a5, a6, a7) { return c0 + s(a1) + c1 + s(a2) + c2 + s(a3) + c3 + s(a4) +
  9602. c4 + s(a5) + c5 + s(a6) + c6 + s(a7) + c7; };
  9603. case 8:
  9604. return function (a1, a2, a3, a4, a5, a6, a7, a8) { return c0 + s(a1) + c1 + s(a2) + c2 + s(a3) + c3 + s(a4) +
  9605. c4 + s(a5) + c5 + s(a6) + c6 + s(a7) + c7 + s(a8) +
  9606. c8; };
  9607. case 9:
  9608. return function (a1, a2, a3, a4, a5, a6, a7, a8, a9) { return c0 + s(a1) + c1 + s(a2) + c2 + s(a3) + c3 +
  9609. s(a4) + c4 + s(a5) + c5 + s(a6) + c6 + s(a7) +
  9610. c7 + s(a8) + c8 + s(a9) + c9; };
  9611. default:
  9612. throw new exceptions_1.BaseException("Does not support more than 9 expressions");
  9613. }
  9614. }
  9615. /***/ },
  9616. /* 38 */
  9617. /***/ function(module, exports, __webpack_require__) {
  9618. var lang_1 = __webpack_require__(5);
  9619. var exceptions_1 = __webpack_require__(14);
  9620. var collection_1 = __webpack_require__(12);
  9621. var constants_1 = __webpack_require__(36);
  9622. var pipe_lifecycle_reflector_1 = __webpack_require__(39);
  9623. var binding_record_1 = __webpack_require__(40);
  9624. var directive_record_1 = __webpack_require__(41);
  9625. /**
  9626. * Indicates that the result of a {@link PipeMetadata} transformation has changed even though the
  9627. * reference
  9628. * has not changed.
  9629. *
  9630. * The wrapped value will be unwrapped by change detection, and the unwrapped value will be stored.
  9631. *
  9632. * Example:
  9633. *
  9634. * ```
  9635. * if (this._latestValue === this._latestReturnedValue) {
  9636. * return this._latestReturnedValue;
  9637. * } else {
  9638. * this._latestReturnedValue = this._latestValue;
  9639. * return WrappedValue.wrap(this._latestValue); // this will force update
  9640. * }
  9641. * ```
  9642. */
  9643. var WrappedValue = (function () {
  9644. function WrappedValue(wrapped) {
  9645. this.wrapped = wrapped;
  9646. }
  9647. WrappedValue.wrap = function (value) {
  9648. var w = _wrappedValues[_wrappedIndex++ % 5];
  9649. w.wrapped = value;
  9650. return w;
  9651. };
  9652. return WrappedValue;
  9653. })();
  9654. exports.WrappedValue = WrappedValue;
  9655. var _wrappedValues = [
  9656. new WrappedValue(null),
  9657. new WrappedValue(null),
  9658. new WrappedValue(null),
  9659. new WrappedValue(null),
  9660. new WrappedValue(null)
  9661. ];
  9662. var _wrappedIndex = 0;
  9663. /**
  9664. * Represents a basic change from a previous to a new value.
  9665. */
  9666. var SimpleChange = (function () {
  9667. function SimpleChange(previousValue, currentValue) {
  9668. this.previousValue = previousValue;
  9669. this.currentValue = currentValue;
  9670. }
  9671. /**
  9672. * Check whether the new value is the first value assigned.
  9673. */
  9674. SimpleChange.prototype.isFirstChange = function () { return this.previousValue === ChangeDetectionUtil.uninitialized; };
  9675. return SimpleChange;
  9676. })();
  9677. exports.SimpleChange = SimpleChange;
  9678. var _simpleChangesIndex = 0;
  9679. var _simpleChanges = [
  9680. new SimpleChange(null, null),
  9681. new SimpleChange(null, null),
  9682. new SimpleChange(null, null),
  9683. new SimpleChange(null, null),
  9684. new SimpleChange(null, null),
  9685. new SimpleChange(null, null),
  9686. new SimpleChange(null, null),
  9687. new SimpleChange(null, null),
  9688. new SimpleChange(null, null),
  9689. new SimpleChange(null, null),
  9690. new SimpleChange(null, null),
  9691. new SimpleChange(null, null),
  9692. new SimpleChange(null, null),
  9693. new SimpleChange(null, null),
  9694. new SimpleChange(null, null),
  9695. new SimpleChange(null, null),
  9696. new SimpleChange(null, null),
  9697. new SimpleChange(null, null),
  9698. new SimpleChange(null, null),
  9699. new SimpleChange(null, null)
  9700. ];
  9701. function _simpleChange(previousValue, currentValue) {
  9702. var index = _simpleChangesIndex++ % 20;
  9703. var s = _simpleChanges[index];
  9704. s.previousValue = previousValue;
  9705. s.currentValue = currentValue;
  9706. return s;
  9707. }
  9708. /* tslint:disable:requireParameterType */
  9709. var ChangeDetectionUtil = (function () {
  9710. function ChangeDetectionUtil() {
  9711. }
  9712. ChangeDetectionUtil.arrayFn0 = function () { return []; };
  9713. ChangeDetectionUtil.arrayFn1 = function (a1) { return [a1]; };
  9714. ChangeDetectionUtil.arrayFn2 = function (a1, a2) { return [a1, a2]; };
  9715. ChangeDetectionUtil.arrayFn3 = function (a1, a2, a3) { return [a1, a2, a3]; };
  9716. ChangeDetectionUtil.arrayFn4 = function (a1, a2, a3, a4) { return [a1, a2, a3, a4]; };
  9717. ChangeDetectionUtil.arrayFn5 = function (a1, a2, a3, a4, a5) { return [a1, a2, a3, a4, a5]; };
  9718. ChangeDetectionUtil.arrayFn6 = function (a1, a2, a3, a4, a5, a6) { return [a1, a2, a3, a4, a5, a6]; };
  9719. ChangeDetectionUtil.arrayFn7 = function (a1, a2, a3, a4, a5, a6, a7) { return [a1, a2, a3, a4, a5, a6, a7]; };
  9720. ChangeDetectionUtil.arrayFn8 = function (a1, a2, a3, a4, a5, a6, a7, a8) {
  9721. return [a1, a2, a3, a4, a5, a6, a7, a8];
  9722. };
  9723. ChangeDetectionUtil.arrayFn9 = function (a1, a2, a3, a4, a5, a6, a7, a8, a9) {
  9724. return [a1, a2, a3, a4, a5, a6, a7, a8, a9];
  9725. };
  9726. ChangeDetectionUtil.operation_negate = function (value) { return !value; };
  9727. ChangeDetectionUtil.operation_add = function (left, right) { return left + right; };
  9728. ChangeDetectionUtil.operation_subtract = function (left, right) { return left - right; };
  9729. ChangeDetectionUtil.operation_multiply = function (left, right) { return left * right; };
  9730. ChangeDetectionUtil.operation_divide = function (left, right) { return left / right; };
  9731. ChangeDetectionUtil.operation_remainder = function (left, right) { return left % right; };
  9732. ChangeDetectionUtil.operation_equals = function (left, right) { return left == right; };
  9733. ChangeDetectionUtil.operation_not_equals = function (left, right) { return left != right; };
  9734. ChangeDetectionUtil.operation_identical = function (left, right) { return left === right; };
  9735. ChangeDetectionUtil.operation_not_identical = function (left, right) { return left !== right; };
  9736. ChangeDetectionUtil.operation_less_then = function (left, right) { return left < right; };
  9737. ChangeDetectionUtil.operation_greater_then = function (left, right) { return left > right; };
  9738. ChangeDetectionUtil.operation_less_or_equals_then = function (left, right) { return left <= right; };
  9739. ChangeDetectionUtil.operation_greater_or_equals_then = function (left, right) { return left >= right; };
  9740. ChangeDetectionUtil.cond = function (cond, trueVal, falseVal) { return cond ? trueVal : falseVal; };
  9741. ChangeDetectionUtil.mapFn = function (keys) {
  9742. function buildMap(values) {
  9743. var res = collection_1.StringMapWrapper.create();
  9744. for (var i = 0; i < keys.length; ++i) {
  9745. collection_1.StringMapWrapper.set(res, keys[i], values[i]);
  9746. }
  9747. return res;
  9748. }
  9749. switch (keys.length) {
  9750. case 0:
  9751. return function () { return []; };
  9752. case 1:
  9753. return function (a1) { return buildMap([a1]); };
  9754. case 2:
  9755. return function (a1, a2) { return buildMap([a1, a2]); };
  9756. case 3:
  9757. return function (a1, a2, a3) { return buildMap([a1, a2, a3]); };
  9758. case 4:
  9759. return function (a1, a2, a3, a4) { return buildMap([a1, a2, a3, a4]); };
  9760. case 5:
  9761. return function (a1, a2, a3, a4, a5) { return buildMap([a1, a2, a3, a4, a5]); };
  9762. case 6:
  9763. return function (a1, a2, a3, a4, a5, a6) { return buildMap([a1, a2, a3, a4, a5, a6]); };
  9764. case 7:
  9765. return function (a1, a2, a3, a4, a5, a6, a7) { return buildMap([a1, a2, a3, a4, a5, a6, a7]); };
  9766. case 8:
  9767. return function (a1, a2, a3, a4, a5, a6, a7, a8) { return buildMap([a1, a2, a3, a4, a5, a6, a7, a8]); };
  9768. case 9:
  9769. return function (a1, a2, a3, a4, a5, a6, a7, a8, a9) {
  9770. return buildMap([a1, a2, a3, a4, a5, a6, a7, a8, a9]);
  9771. };
  9772. default:
  9773. throw new exceptions_1.BaseException("Does not support literal maps with more than 9 elements");
  9774. }
  9775. };
  9776. ChangeDetectionUtil.keyedAccess = function (obj, args) { return obj[args[0]]; };
  9777. ChangeDetectionUtil.unwrapValue = function (value) {
  9778. if (value instanceof WrappedValue) {
  9779. return value.wrapped;
  9780. }
  9781. else {
  9782. return value;
  9783. }
  9784. };
  9785. ChangeDetectionUtil.changeDetectionMode = function (strategy) {
  9786. return constants_1.isDefaultChangeDetectionStrategy(strategy) ? constants_1.ChangeDetectionStrategy.CheckAlways :
  9787. constants_1.ChangeDetectionStrategy.CheckOnce;
  9788. };
  9789. ChangeDetectionUtil.simpleChange = function (previousValue, currentValue) {
  9790. return _simpleChange(previousValue, currentValue);
  9791. };
  9792. ChangeDetectionUtil.isValueBlank = function (value) { return lang_1.isBlank(value); };
  9793. ChangeDetectionUtil.s = function (value) { return lang_1.isPresent(value) ? "" + value : ''; };
  9794. ChangeDetectionUtil.protoByIndex = function (protos, selfIndex) {
  9795. return selfIndex < 1 ?
  9796. null :
  9797. protos[selfIndex - 1]; // self index is shifted by one because of context
  9798. };
  9799. ChangeDetectionUtil.callPipeOnDestroy = function (selectedPipe) {
  9800. if (pipe_lifecycle_reflector_1.implementsOnDestroy(selectedPipe.pipe)) {
  9801. selectedPipe.pipe.ngOnDestroy();
  9802. }
  9803. };
  9804. ChangeDetectionUtil.bindingTarget = function (mode, elementIndex, name, unit, debug) {
  9805. return new binding_record_1.BindingTarget(mode, elementIndex, name, unit, debug);
  9806. };
  9807. ChangeDetectionUtil.directiveIndex = function (elementIndex, directiveIndex) {
  9808. return new directive_record_1.DirectiveIndex(elementIndex, directiveIndex);
  9809. };
  9810. ChangeDetectionUtil.looseNotIdentical = function (a, b) { return !lang_1.looseIdentical(a, b); };
  9811. ChangeDetectionUtil.uninitialized = lang_1.CONST_EXPR(new Object());
  9812. return ChangeDetectionUtil;
  9813. })();
  9814. exports.ChangeDetectionUtil = ChangeDetectionUtil;
  9815. /***/ },
  9816. /* 39 */
  9817. /***/ function(module, exports) {
  9818. function implementsOnDestroy(pipe) {
  9819. return pipe.constructor.prototype.ngOnDestroy;
  9820. }
  9821. exports.implementsOnDestroy = implementsOnDestroy;
  9822. /***/ },
  9823. /* 40 */
  9824. /***/ function(module, exports, __webpack_require__) {
  9825. var lang_1 = __webpack_require__(5);
  9826. var DIRECTIVE_LIFECYCLE = "directiveLifecycle";
  9827. var BINDING = "native";
  9828. var DIRECTIVE = "directive";
  9829. var ELEMENT_PROPERTY = "elementProperty";
  9830. var ELEMENT_ATTRIBUTE = "elementAttribute";
  9831. var ELEMENT_CLASS = "elementClass";
  9832. var ELEMENT_STYLE = "elementStyle";
  9833. var TEXT_NODE = "textNode";
  9834. var EVENT = "event";
  9835. var HOST_EVENT = "hostEvent";
  9836. var BindingTarget = (function () {
  9837. function BindingTarget(mode, elementIndex, name, unit, debug) {
  9838. this.mode = mode;
  9839. this.elementIndex = elementIndex;
  9840. this.name = name;
  9841. this.unit = unit;
  9842. this.debug = debug;
  9843. }
  9844. BindingTarget.prototype.isDirective = function () { return this.mode === DIRECTIVE; };
  9845. BindingTarget.prototype.isElementProperty = function () { return this.mode === ELEMENT_PROPERTY; };
  9846. BindingTarget.prototype.isElementAttribute = function () { return this.mode === ELEMENT_ATTRIBUTE; };
  9847. BindingTarget.prototype.isElementClass = function () { return this.mode === ELEMENT_CLASS; };
  9848. BindingTarget.prototype.isElementStyle = function () { return this.mode === ELEMENT_STYLE; };
  9849. BindingTarget.prototype.isTextNode = function () { return this.mode === TEXT_NODE; };
  9850. return BindingTarget;
  9851. })();
  9852. exports.BindingTarget = BindingTarget;
  9853. var BindingRecord = (function () {
  9854. function BindingRecord(mode, target, implicitReceiver, ast, setter, lifecycleEvent, directiveRecord) {
  9855. this.mode = mode;
  9856. this.target = target;
  9857. this.implicitReceiver = implicitReceiver;
  9858. this.ast = ast;
  9859. this.setter = setter;
  9860. this.lifecycleEvent = lifecycleEvent;
  9861. this.directiveRecord = directiveRecord;
  9862. }
  9863. BindingRecord.prototype.isDirectiveLifecycle = function () { return this.mode === DIRECTIVE_LIFECYCLE; };
  9864. BindingRecord.prototype.callOnChanges = function () {
  9865. return lang_1.isPresent(this.directiveRecord) && this.directiveRecord.callOnChanges;
  9866. };
  9867. BindingRecord.prototype.isDefaultChangeDetection = function () {
  9868. return lang_1.isBlank(this.directiveRecord) || this.directiveRecord.isDefaultChangeDetection();
  9869. };
  9870. BindingRecord.createDirectiveDoCheck = function (directiveRecord) {
  9871. return new BindingRecord(DIRECTIVE_LIFECYCLE, null, 0, null, null, "DoCheck", directiveRecord);
  9872. };
  9873. BindingRecord.createDirectiveOnInit = function (directiveRecord) {
  9874. return new BindingRecord(DIRECTIVE_LIFECYCLE, null, 0, null, null, "OnInit", directiveRecord);
  9875. };
  9876. BindingRecord.createDirectiveOnChanges = function (directiveRecord) {
  9877. return new BindingRecord(DIRECTIVE_LIFECYCLE, null, 0, null, null, "OnChanges", directiveRecord);
  9878. };
  9879. BindingRecord.createForDirective = function (ast, propertyName, setter, directiveRecord) {
  9880. var elementIndex = directiveRecord.directiveIndex.elementIndex;
  9881. var t = new BindingTarget(DIRECTIVE, elementIndex, propertyName, null, ast.toString());
  9882. return new BindingRecord(DIRECTIVE, t, 0, ast, setter, null, directiveRecord);
  9883. };
  9884. BindingRecord.createForElementProperty = function (ast, elementIndex, propertyName) {
  9885. var t = new BindingTarget(ELEMENT_PROPERTY, elementIndex, propertyName, null, ast.toString());
  9886. return new BindingRecord(BINDING, t, 0, ast, null, null, null);
  9887. };
  9888. BindingRecord.createForElementAttribute = function (ast, elementIndex, attributeName) {
  9889. var t = new BindingTarget(ELEMENT_ATTRIBUTE, elementIndex, attributeName, null, ast.toString());
  9890. return new BindingRecord(BINDING, t, 0, ast, null, null, null);
  9891. };
  9892. BindingRecord.createForElementClass = function (ast, elementIndex, className) {
  9893. var t = new BindingTarget(ELEMENT_CLASS, elementIndex, className, null, ast.toString());
  9894. return new BindingRecord(BINDING, t, 0, ast, null, null, null);
  9895. };
  9896. BindingRecord.createForElementStyle = function (ast, elementIndex, styleName, unit) {
  9897. var t = new BindingTarget(ELEMENT_STYLE, elementIndex, styleName, unit, ast.toString());
  9898. return new BindingRecord(BINDING, t, 0, ast, null, null, null);
  9899. };
  9900. BindingRecord.createForHostProperty = function (directiveIndex, ast, propertyName) {
  9901. var t = new BindingTarget(ELEMENT_PROPERTY, directiveIndex.elementIndex, propertyName, null, ast.toString());
  9902. return new BindingRecord(BINDING, t, directiveIndex, ast, null, null, null);
  9903. };
  9904. BindingRecord.createForHostAttribute = function (directiveIndex, ast, attributeName) {
  9905. var t = new BindingTarget(ELEMENT_ATTRIBUTE, directiveIndex.elementIndex, attributeName, null, ast.toString());
  9906. return new BindingRecord(BINDING, t, directiveIndex, ast, null, null, null);
  9907. };
  9908. BindingRecord.createForHostClass = function (directiveIndex, ast, className) {
  9909. var t = new BindingTarget(ELEMENT_CLASS, directiveIndex.elementIndex, className, null, ast.toString());
  9910. return new BindingRecord(BINDING, t, directiveIndex, ast, null, null, null);
  9911. };
  9912. BindingRecord.createForHostStyle = function (directiveIndex, ast, styleName, unit) {
  9913. var t = new BindingTarget(ELEMENT_STYLE, directiveIndex.elementIndex, styleName, unit, ast.toString());
  9914. return new BindingRecord(BINDING, t, directiveIndex, ast, null, null, null);
  9915. };
  9916. BindingRecord.createForTextNode = function (ast, elementIndex) {
  9917. var t = new BindingTarget(TEXT_NODE, elementIndex, null, null, ast.toString());
  9918. return new BindingRecord(BINDING, t, 0, ast, null, null, null);
  9919. };
  9920. BindingRecord.createForEvent = function (ast, eventName, elementIndex) {
  9921. var t = new BindingTarget(EVENT, elementIndex, eventName, null, ast.toString());
  9922. return new BindingRecord(EVENT, t, 0, ast, null, null, null);
  9923. };
  9924. BindingRecord.createForHostEvent = function (ast, eventName, directiveRecord) {
  9925. var directiveIndex = directiveRecord.directiveIndex;
  9926. var t = new BindingTarget(HOST_EVENT, directiveIndex.elementIndex, eventName, null, ast.toString());
  9927. return new BindingRecord(HOST_EVENT, t, directiveIndex, ast, null, null, directiveRecord);
  9928. };
  9929. return BindingRecord;
  9930. })();
  9931. exports.BindingRecord = BindingRecord;
  9932. /***/ },
  9933. /* 41 */
  9934. /***/ function(module, exports, __webpack_require__) {
  9935. var lang_1 = __webpack_require__(5);
  9936. var constants_1 = __webpack_require__(36);
  9937. var DirectiveIndex = (function () {
  9938. function DirectiveIndex(elementIndex, directiveIndex) {
  9939. this.elementIndex = elementIndex;
  9940. this.directiveIndex = directiveIndex;
  9941. }
  9942. Object.defineProperty(DirectiveIndex.prototype, "name", {
  9943. get: function () { return this.elementIndex + "_" + this.directiveIndex; },
  9944. enumerable: true,
  9945. configurable: true
  9946. });
  9947. return DirectiveIndex;
  9948. })();
  9949. exports.DirectiveIndex = DirectiveIndex;
  9950. var DirectiveRecord = (function () {
  9951. function DirectiveRecord(_a) {
  9952. 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;
  9953. this.directiveIndex = directiveIndex;
  9954. this.callAfterContentInit = lang_1.normalizeBool(callAfterContentInit);
  9955. this.callAfterContentChecked = lang_1.normalizeBool(callAfterContentChecked);
  9956. this.callOnChanges = lang_1.normalizeBool(callOnChanges);
  9957. this.callAfterViewInit = lang_1.normalizeBool(callAfterViewInit);
  9958. this.callAfterViewChecked = lang_1.normalizeBool(callAfterViewChecked);
  9959. this.callDoCheck = lang_1.normalizeBool(callDoCheck);
  9960. this.callOnInit = lang_1.normalizeBool(callOnInit);
  9961. this.changeDetection = changeDetection;
  9962. }
  9963. DirectiveRecord.prototype.isDefaultChangeDetection = function () {
  9964. return constants_1.isDefaultChangeDetectionStrategy(this.changeDetection);
  9965. };
  9966. return DirectiveRecord;
  9967. })();
  9968. exports.DirectiveRecord = DirectiveRecord;
  9969. /***/ },
  9970. /* 42 */
  9971. /***/ function(module, exports, __webpack_require__) {
  9972. var __extends = (this && this.__extends) || function (d, b) {
  9973. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  9974. function __() { this.constructor = d; }
  9975. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  9976. };
  9977. var lang_1 = __webpack_require__(5);
  9978. var exceptions_1 = __webpack_require__(14);
  9979. var collection_1 = __webpack_require__(12);
  9980. var abstract_change_detector_1 = __webpack_require__(43);
  9981. var change_detection_util_1 = __webpack_require__(38);
  9982. var constants_1 = __webpack_require__(36);
  9983. var proto_record_1 = __webpack_require__(48);
  9984. var DynamicChangeDetector = (function (_super) {
  9985. __extends(DynamicChangeDetector, _super);
  9986. function DynamicChangeDetector(id, dispatcher, numberOfPropertyProtoRecords, propertyBindingTargets, directiveIndices, strategy, _records, _eventBindings, _directiveRecords, _genConfig) {
  9987. _super.call(this, id, dispatcher, numberOfPropertyProtoRecords, propertyBindingTargets, directiveIndices, strategy);
  9988. this._records = _records;
  9989. this._eventBindings = _eventBindings;
  9990. this._directiveRecords = _directiveRecords;
  9991. this._genConfig = _genConfig;
  9992. this.directives = null;
  9993. var len = _records.length + 1;
  9994. this.values = collection_1.ListWrapper.createFixedSize(len);
  9995. this.localPipes = collection_1.ListWrapper.createFixedSize(len);
  9996. this.prevContexts = collection_1.ListWrapper.createFixedSize(len);
  9997. this.changes = collection_1.ListWrapper.createFixedSize(len);
  9998. this.dehydrateDirectives(false);
  9999. }
  10000. DynamicChangeDetector.prototype.handleEventInternal = function (eventName, elIndex, locals) {
  10001. var _this = this;
  10002. var preventDefault = false;
  10003. this._matchingEventBindings(eventName, elIndex)
  10004. .forEach(function (rec) {
  10005. var res = _this._processEventBinding(rec, locals);
  10006. if (res === false) {
  10007. preventDefault = true;
  10008. }
  10009. });
  10010. return preventDefault;
  10011. };
  10012. /** @internal */
  10013. DynamicChangeDetector.prototype._processEventBinding = function (eb, locals) {
  10014. var values = collection_1.ListWrapper.createFixedSize(eb.records.length);
  10015. values[0] = this.values[0];
  10016. for (var protoIdx = 0; protoIdx < eb.records.length; ++protoIdx) {
  10017. var proto = eb.records[protoIdx];
  10018. if (proto.isSkipRecord()) {
  10019. protoIdx += this._computeSkipLength(protoIdx, proto, values);
  10020. }
  10021. else {
  10022. var res = this._calculateCurrValue(proto, values, locals);
  10023. if (proto.lastInBinding) {
  10024. this._markPathAsCheckOnce(proto);
  10025. return res;
  10026. }
  10027. else {
  10028. this._writeSelf(proto, res, values);
  10029. }
  10030. }
  10031. }
  10032. throw new exceptions_1.BaseException("Cannot be reached");
  10033. };
  10034. DynamicChangeDetector.prototype._computeSkipLength = function (protoIndex, proto, values) {
  10035. if (proto.mode === proto_record_1.RecordType.SkipRecords) {
  10036. return proto.fixedArgs[0] - protoIndex - 1;
  10037. }
  10038. if (proto.mode === proto_record_1.RecordType.SkipRecordsIf) {
  10039. var condition = this._readContext(proto, values);
  10040. return condition ? proto.fixedArgs[0] - protoIndex - 1 : 0;
  10041. }
  10042. if (proto.mode === proto_record_1.RecordType.SkipRecordsIfNot) {
  10043. var condition = this._readContext(proto, values);
  10044. return condition ? 0 : proto.fixedArgs[0] - protoIndex - 1;
  10045. }
  10046. throw new exceptions_1.BaseException("Cannot be reached");
  10047. };
  10048. /** @internal */
  10049. DynamicChangeDetector.prototype._markPathAsCheckOnce = function (proto) {
  10050. if (!proto.bindingRecord.isDefaultChangeDetection()) {
  10051. var dir = proto.bindingRecord.directiveRecord;
  10052. this._getDetectorFor(dir.directiveIndex).markPathToRootAsCheckOnce();
  10053. }
  10054. };
  10055. /** @internal */
  10056. DynamicChangeDetector.prototype._matchingEventBindings = function (eventName, elIndex) {
  10057. return this._eventBindings.filter(function (eb) { return eb.eventName == eventName && eb.elIndex === elIndex; });
  10058. };
  10059. DynamicChangeDetector.prototype.hydrateDirectives = function (directives) {
  10060. this.values[0] = this.context;
  10061. this.directives = directives;
  10062. if (this.strategy === constants_1.ChangeDetectionStrategy.OnPushObserve) {
  10063. for (var i = 0; i < this.directiveIndices.length; ++i) {
  10064. var index = this.directiveIndices[i];
  10065. _super.prototype.observeDirective.call(this, directives.getDirectiveFor(index), i);
  10066. }
  10067. }
  10068. };
  10069. DynamicChangeDetector.prototype.dehydrateDirectives = function (destroyPipes) {
  10070. if (destroyPipes) {
  10071. this._destroyPipes();
  10072. }
  10073. this.values[0] = null;
  10074. this.directives = null;
  10075. collection_1.ListWrapper.fill(this.values, change_detection_util_1.ChangeDetectionUtil.uninitialized, 1);
  10076. collection_1.ListWrapper.fill(this.changes, false);
  10077. collection_1.ListWrapper.fill(this.localPipes, null);
  10078. collection_1.ListWrapper.fill(this.prevContexts, change_detection_util_1.ChangeDetectionUtil.uninitialized);
  10079. };
  10080. /** @internal */
  10081. DynamicChangeDetector.prototype._destroyPipes = function () {
  10082. for (var i = 0; i < this.localPipes.length; ++i) {
  10083. if (lang_1.isPresent(this.localPipes[i])) {
  10084. change_detection_util_1.ChangeDetectionUtil.callPipeOnDestroy(this.localPipes[i]);
  10085. }
  10086. }
  10087. };
  10088. DynamicChangeDetector.prototype.checkNoChanges = function () { this.runDetectChanges(true); };
  10089. DynamicChangeDetector.prototype.detectChangesInRecordsInternal = function (throwOnChange) {
  10090. var protos = this._records;
  10091. var changes = null;
  10092. var isChanged = false;
  10093. for (var protoIdx = 0; protoIdx < protos.length; ++protoIdx) {
  10094. var proto = protos[protoIdx];
  10095. var bindingRecord = proto.bindingRecord;
  10096. var directiveRecord = bindingRecord.directiveRecord;
  10097. if (this._firstInBinding(proto)) {
  10098. this.propertyBindingIndex = proto.propertyBindingIndex;
  10099. }
  10100. if (proto.isLifeCycleRecord()) {
  10101. if (proto.name === "DoCheck" && !throwOnChange) {
  10102. this._getDirectiveFor(directiveRecord.directiveIndex).ngDoCheck();
  10103. }
  10104. else if (proto.name === "OnInit" && !throwOnChange &&
  10105. this.state == constants_1.ChangeDetectorState.NeverChecked) {
  10106. this._getDirectiveFor(directiveRecord.directiveIndex).ngOnInit();
  10107. }
  10108. else if (proto.name === "OnChanges" && lang_1.isPresent(changes) && !throwOnChange) {
  10109. this._getDirectiveFor(directiveRecord.directiveIndex).ngOnChanges(changes);
  10110. }
  10111. }
  10112. else if (proto.isSkipRecord()) {
  10113. protoIdx += this._computeSkipLength(protoIdx, proto, this.values);
  10114. }
  10115. else {
  10116. var change = this._check(proto, throwOnChange, this.values, this.locals);
  10117. if (lang_1.isPresent(change)) {
  10118. this._updateDirectiveOrElement(change, bindingRecord);
  10119. isChanged = true;
  10120. changes = this._addChange(bindingRecord, change, changes);
  10121. }
  10122. }
  10123. if (proto.lastInDirective) {
  10124. changes = null;
  10125. if (isChanged && !bindingRecord.isDefaultChangeDetection()) {
  10126. this._getDetectorFor(directiveRecord.directiveIndex).markAsCheckOnce();
  10127. }
  10128. isChanged = false;
  10129. }
  10130. }
  10131. };
  10132. /** @internal */
  10133. DynamicChangeDetector.prototype._firstInBinding = function (r) {
  10134. var prev = change_detection_util_1.ChangeDetectionUtil.protoByIndex(this._records, r.selfIndex - 1);
  10135. return lang_1.isBlank(prev) || prev.bindingRecord !== r.bindingRecord;
  10136. };
  10137. DynamicChangeDetector.prototype.afterContentLifecycleCallbacksInternal = function () {
  10138. var dirs = this._directiveRecords;
  10139. for (var i = dirs.length - 1; i >= 0; --i) {
  10140. var dir = dirs[i];
  10141. if (dir.callAfterContentInit && this.state == constants_1.ChangeDetectorState.NeverChecked) {
  10142. this._getDirectiveFor(dir.directiveIndex).ngAfterContentInit();
  10143. }
  10144. if (dir.callAfterContentChecked) {
  10145. this._getDirectiveFor(dir.directiveIndex).ngAfterContentChecked();
  10146. }
  10147. }
  10148. };
  10149. DynamicChangeDetector.prototype.afterViewLifecycleCallbacksInternal = function () {
  10150. var dirs = this._directiveRecords;
  10151. for (var i = dirs.length - 1; i >= 0; --i) {
  10152. var dir = dirs[i];
  10153. if (dir.callAfterViewInit && this.state == constants_1.ChangeDetectorState.NeverChecked) {
  10154. this._getDirectiveFor(dir.directiveIndex).ngAfterViewInit();
  10155. }
  10156. if (dir.callAfterViewChecked) {
  10157. this._getDirectiveFor(dir.directiveIndex).ngAfterViewChecked();
  10158. }
  10159. }
  10160. };
  10161. /** @internal */
  10162. DynamicChangeDetector.prototype._updateDirectiveOrElement = function (change, bindingRecord) {
  10163. if (lang_1.isBlank(bindingRecord.directiveRecord)) {
  10164. _super.prototype.notifyDispatcher.call(this, change.currentValue);
  10165. }
  10166. else {
  10167. var directiveIndex = bindingRecord.directiveRecord.directiveIndex;
  10168. bindingRecord.setter(this._getDirectiveFor(directiveIndex), change.currentValue);
  10169. }
  10170. if (this._genConfig.logBindingUpdate) {
  10171. _super.prototype.logBindingUpdate.call(this, change.currentValue);
  10172. }
  10173. };
  10174. /** @internal */
  10175. DynamicChangeDetector.prototype._addChange = function (bindingRecord, change, changes) {
  10176. if (bindingRecord.callOnChanges()) {
  10177. return _super.prototype.addChange.call(this, changes, change.previousValue, change.currentValue);
  10178. }
  10179. else {
  10180. return changes;
  10181. }
  10182. };
  10183. /** @internal */
  10184. DynamicChangeDetector.prototype._getDirectiveFor = function (directiveIndex) {
  10185. return this.directives.getDirectiveFor(directiveIndex);
  10186. };
  10187. /** @internal */
  10188. DynamicChangeDetector.prototype._getDetectorFor = function (directiveIndex) { return this.directives.getDetectorFor(directiveIndex); };
  10189. /** @internal */
  10190. DynamicChangeDetector.prototype._check = function (proto, throwOnChange, values, locals) {
  10191. if (proto.isPipeRecord()) {
  10192. return this._pipeCheck(proto, throwOnChange, values);
  10193. }
  10194. else {
  10195. return this._referenceCheck(proto, throwOnChange, values, locals);
  10196. }
  10197. };
  10198. /** @internal */
  10199. DynamicChangeDetector.prototype._referenceCheck = function (proto, throwOnChange, values, locals) {
  10200. if (this._pureFuncAndArgsDidNotChange(proto)) {
  10201. this._setChanged(proto, false);
  10202. return null;
  10203. }
  10204. var currValue = this._calculateCurrValue(proto, values, locals);
  10205. if (this.strategy === constants_1.ChangeDetectionStrategy.OnPushObserve) {
  10206. _super.prototype.observeValue.call(this, currValue, proto.selfIndex);
  10207. }
  10208. if (proto.shouldBeChecked()) {
  10209. var prevValue = this._readSelf(proto, values);
  10210. if (change_detection_util_1.ChangeDetectionUtil.looseNotIdentical(prevValue, currValue)) {
  10211. if (proto.lastInBinding) {
  10212. var change = change_detection_util_1.ChangeDetectionUtil.simpleChange(prevValue, currValue);
  10213. if (throwOnChange)
  10214. this.throwOnChangeError(prevValue, currValue);
  10215. this._writeSelf(proto, currValue, values);
  10216. this._setChanged(proto, true);
  10217. return change;
  10218. }
  10219. else {
  10220. this._writeSelf(proto, currValue, values);
  10221. this._setChanged(proto, true);
  10222. return null;
  10223. }
  10224. }
  10225. else {
  10226. this._setChanged(proto, false);
  10227. return null;
  10228. }
  10229. }
  10230. else {
  10231. this._writeSelf(proto, currValue, values);
  10232. this._setChanged(proto, true);
  10233. return null;
  10234. }
  10235. };
  10236. DynamicChangeDetector.prototype._calculateCurrValue = function (proto, values, locals) {
  10237. switch (proto.mode) {
  10238. case proto_record_1.RecordType.Self:
  10239. return this._readContext(proto, values);
  10240. case proto_record_1.RecordType.Const:
  10241. return proto.funcOrValue;
  10242. case proto_record_1.RecordType.PropertyRead:
  10243. var context = this._readContext(proto, values);
  10244. return proto.funcOrValue(context);
  10245. case proto_record_1.RecordType.SafeProperty:
  10246. var context = this._readContext(proto, values);
  10247. return lang_1.isBlank(context) ? null : proto.funcOrValue(context);
  10248. case proto_record_1.RecordType.PropertyWrite:
  10249. var context = this._readContext(proto, values);
  10250. var value = this._readArgs(proto, values)[0];
  10251. proto.funcOrValue(context, value);
  10252. return value;
  10253. case proto_record_1.RecordType.KeyedWrite:
  10254. var context = this._readContext(proto, values);
  10255. var key = this._readArgs(proto, values)[0];
  10256. var value = this._readArgs(proto, values)[1];
  10257. context[key] = value;
  10258. return value;
  10259. case proto_record_1.RecordType.Local:
  10260. return locals.get(proto.name);
  10261. case proto_record_1.RecordType.InvokeMethod:
  10262. var context = this._readContext(proto, values);
  10263. var args = this._readArgs(proto, values);
  10264. return proto.funcOrValue(context, args);
  10265. case proto_record_1.RecordType.SafeMethodInvoke:
  10266. var context = this._readContext(proto, values);
  10267. if (lang_1.isBlank(context)) {
  10268. return null;
  10269. }
  10270. var args = this._readArgs(proto, values);
  10271. return proto.funcOrValue(context, args);
  10272. case proto_record_1.RecordType.KeyedRead:
  10273. var arg = this._readArgs(proto, values)[0];
  10274. return this._readContext(proto, values)[arg];
  10275. case proto_record_1.RecordType.Chain:
  10276. var args = this._readArgs(proto, values);
  10277. return args[args.length - 1];
  10278. case proto_record_1.RecordType.InvokeClosure:
  10279. return lang_1.FunctionWrapper.apply(this._readContext(proto, values), this._readArgs(proto, values));
  10280. case proto_record_1.RecordType.Interpolate:
  10281. case proto_record_1.RecordType.PrimitiveOp:
  10282. case proto_record_1.RecordType.CollectionLiteral:
  10283. return lang_1.FunctionWrapper.apply(proto.funcOrValue, this._readArgs(proto, values));
  10284. default:
  10285. throw new exceptions_1.BaseException("Unknown operation " + proto.mode);
  10286. }
  10287. };
  10288. DynamicChangeDetector.prototype._pipeCheck = function (proto, throwOnChange, values) {
  10289. var context = this._readContext(proto, values);
  10290. var selectedPipe = this._pipeFor(proto, context);
  10291. if (!selectedPipe.pure || this._argsOrContextChanged(proto)) {
  10292. var args = this._readArgs(proto, values);
  10293. var currValue = selectedPipe.pipe.transform(context, args);
  10294. if (proto.shouldBeChecked()) {
  10295. var prevValue = this._readSelf(proto, values);
  10296. if (change_detection_util_1.ChangeDetectionUtil.looseNotIdentical(prevValue, currValue)) {
  10297. currValue = change_detection_util_1.ChangeDetectionUtil.unwrapValue(currValue);
  10298. if (proto.lastInBinding) {
  10299. var change = change_detection_util_1.ChangeDetectionUtil.simpleChange(prevValue, currValue);
  10300. if (throwOnChange)
  10301. this.throwOnChangeError(prevValue, currValue);
  10302. this._writeSelf(proto, currValue, values);
  10303. this._setChanged(proto, true);
  10304. return change;
  10305. }
  10306. else {
  10307. this._writeSelf(proto, currValue, values);
  10308. this._setChanged(proto, true);
  10309. return null;
  10310. }
  10311. }
  10312. else {
  10313. this._setChanged(proto, false);
  10314. return null;
  10315. }
  10316. }
  10317. else {
  10318. this._writeSelf(proto, currValue, values);
  10319. this._setChanged(proto, true);
  10320. return null;
  10321. }
  10322. }
  10323. };
  10324. DynamicChangeDetector.prototype._pipeFor = function (proto, context) {
  10325. var storedPipe = this._readPipe(proto);
  10326. if (lang_1.isPresent(storedPipe))
  10327. return storedPipe;
  10328. var pipe = this.pipes.get(proto.name);
  10329. this._writePipe(proto, pipe);
  10330. return pipe;
  10331. };
  10332. DynamicChangeDetector.prototype._readContext = function (proto, values) {
  10333. if (proto.contextIndex == -1) {
  10334. return this._getDirectiveFor(proto.directiveIndex);
  10335. }
  10336. return values[proto.contextIndex];
  10337. };
  10338. DynamicChangeDetector.prototype._readSelf = function (proto, values) { return values[proto.selfIndex]; };
  10339. DynamicChangeDetector.prototype._writeSelf = function (proto, value, values) { values[proto.selfIndex] = value; };
  10340. DynamicChangeDetector.prototype._readPipe = function (proto) { return this.localPipes[proto.selfIndex]; };
  10341. DynamicChangeDetector.prototype._writePipe = function (proto, value) { this.localPipes[proto.selfIndex] = value; };
  10342. DynamicChangeDetector.prototype._setChanged = function (proto, value) {
  10343. if (proto.argumentToPureFunction)
  10344. this.changes[proto.selfIndex] = value;
  10345. };
  10346. DynamicChangeDetector.prototype._pureFuncAndArgsDidNotChange = function (proto) {
  10347. return proto.isPureFunction() && !this._argsChanged(proto);
  10348. };
  10349. DynamicChangeDetector.prototype._argsChanged = function (proto) {
  10350. var args = proto.args;
  10351. for (var i = 0; i < args.length; ++i) {
  10352. if (this.changes[args[i]]) {
  10353. return true;
  10354. }
  10355. }
  10356. return false;
  10357. };
  10358. DynamicChangeDetector.prototype._argsOrContextChanged = function (proto) {
  10359. return this._argsChanged(proto) || this.changes[proto.contextIndex];
  10360. };
  10361. DynamicChangeDetector.prototype._readArgs = function (proto, values) {
  10362. var res = collection_1.ListWrapper.createFixedSize(proto.args.length);
  10363. var args = proto.args;
  10364. for (var i = 0; i < args.length; ++i) {
  10365. res[i] = values[args[i]];
  10366. }
  10367. return res;
  10368. };
  10369. return DynamicChangeDetector;
  10370. })(abstract_change_detector_1.AbstractChangeDetector);
  10371. exports.DynamicChangeDetector = DynamicChangeDetector;
  10372. /***/ },
  10373. /* 43 */
  10374. /***/ function(module, exports, __webpack_require__) {
  10375. var lang_1 = __webpack_require__(5);
  10376. var collection_1 = __webpack_require__(12);
  10377. var change_detection_util_1 = __webpack_require__(38);
  10378. var change_detector_ref_1 = __webpack_require__(44);
  10379. var exceptions_1 = __webpack_require__(34);
  10380. var constants_1 = __webpack_require__(36);
  10381. var profile_1 = __webpack_require__(45);
  10382. var observable_facade_1 = __webpack_require__(47);
  10383. var _scope_check = profile_1.wtfCreateScope("ChangeDetector#check(ascii id, bool throwOnChange)");
  10384. var _Context = (function () {
  10385. function _Context(element, componentElement, context, locals, injector, expression) {
  10386. this.element = element;
  10387. this.componentElement = componentElement;
  10388. this.context = context;
  10389. this.locals = locals;
  10390. this.injector = injector;
  10391. this.expression = expression;
  10392. }
  10393. return _Context;
  10394. })();
  10395. var AbstractChangeDetector = (function () {
  10396. function AbstractChangeDetector(id, dispatcher, numberOfPropertyProtoRecords, bindingTargets, directiveIndices, strategy) {
  10397. this.id = id;
  10398. this.dispatcher = dispatcher;
  10399. this.numberOfPropertyProtoRecords = numberOfPropertyProtoRecords;
  10400. this.bindingTargets = bindingTargets;
  10401. this.directiveIndices = directiveIndices;
  10402. this.strategy = strategy;
  10403. this.contentChildren = [];
  10404. this.viewChildren = [];
  10405. // The names of the below fields must be kept in sync with codegen_name_util.ts or
  10406. // change detection will fail.
  10407. this.state = constants_1.ChangeDetectorState.NeverChecked;
  10408. this.locals = null;
  10409. this.mode = null;
  10410. this.pipes = null;
  10411. this.ref = new change_detector_ref_1.ChangeDetectorRef_(this);
  10412. }
  10413. AbstractChangeDetector.prototype.addContentChild = function (cd) {
  10414. this.contentChildren.push(cd);
  10415. cd.parent = this;
  10416. };
  10417. AbstractChangeDetector.prototype.removeContentChild = function (cd) { collection_1.ListWrapper.remove(this.contentChildren, cd); };
  10418. AbstractChangeDetector.prototype.addViewChild = function (cd) {
  10419. this.viewChildren.push(cd);
  10420. cd.parent = this;
  10421. };
  10422. AbstractChangeDetector.prototype.removeViewChild = function (cd) { collection_1.ListWrapper.remove(this.viewChildren, cd); };
  10423. AbstractChangeDetector.prototype.remove = function () { this.parent.removeContentChild(this); };
  10424. AbstractChangeDetector.prototype.handleEvent = function (eventName, elIndex, locals) {
  10425. var res = this.handleEventInternal(eventName, elIndex, locals);
  10426. this.markPathToRootAsCheckOnce();
  10427. return res;
  10428. };
  10429. AbstractChangeDetector.prototype.handleEventInternal = function (eventName, elIndex, locals) { return false; };
  10430. AbstractChangeDetector.prototype.detectChanges = function () { this.runDetectChanges(false); };
  10431. AbstractChangeDetector.prototype.checkNoChanges = function () {
  10432. if (lang_1.assertionsEnabled()) {
  10433. this.runDetectChanges(true);
  10434. }
  10435. };
  10436. AbstractChangeDetector.prototype.runDetectChanges = function (throwOnChange) {
  10437. if (this.mode === constants_1.ChangeDetectionStrategy.Detached ||
  10438. this.mode === constants_1.ChangeDetectionStrategy.Checked || this.state === constants_1.ChangeDetectorState.Errored)
  10439. return;
  10440. var s = _scope_check(this.id, throwOnChange);
  10441. this.detectChangesInRecords(throwOnChange);
  10442. this._detectChangesContentChildren(throwOnChange);
  10443. if (!throwOnChange)
  10444. this.afterContentLifecycleCallbacks();
  10445. this._detectChangesInViewChildren(throwOnChange);
  10446. if (!throwOnChange)
  10447. this.afterViewLifecycleCallbacks();
  10448. if (this.mode === constants_1.ChangeDetectionStrategy.CheckOnce)
  10449. this.mode = constants_1.ChangeDetectionStrategy.Checked;
  10450. this.state = constants_1.ChangeDetectorState.CheckedBefore;
  10451. profile_1.wtfLeave(s);
  10452. };
  10453. // This method is not intended to be overridden. Subclasses should instead provide an
  10454. // implementation of `detectChangesInRecordsInternal` which does the work of detecting changes
  10455. // and which this method will call.
  10456. // This method expects that `detectChangesInRecordsInternal` will set the property
  10457. // `this.propertyBindingIndex` to the propertyBindingIndex of the first proto record. This is to
  10458. // facilitate error reporting.
  10459. AbstractChangeDetector.prototype.detectChangesInRecords = function (throwOnChange) {
  10460. if (!this.hydrated()) {
  10461. this.throwDehydratedError();
  10462. }
  10463. try {
  10464. this.detectChangesInRecordsInternal(throwOnChange);
  10465. }
  10466. catch (e) {
  10467. // throwOnChange errors aren't counted as fatal errors.
  10468. if (!(e instanceof exceptions_1.ExpressionChangedAfterItHasBeenCheckedException)) {
  10469. this.state = constants_1.ChangeDetectorState.Errored;
  10470. }
  10471. this._throwError(e, e.stack);
  10472. }
  10473. };
  10474. // Subclasses should override this method to perform any work necessary to detect and report
  10475. // changes. For example, changes should be reported via `ChangeDetectionUtil.addChange`, lifecycle
  10476. // methods should be called, etc.
  10477. // This implementation should also set `this.propertyBindingIndex` to the propertyBindingIndex of
  10478. // the
  10479. // first proto record to facilitate error reporting. See {@link #detectChangesInRecords}.
  10480. AbstractChangeDetector.prototype.detectChangesInRecordsInternal = function (throwOnChange) { };
  10481. // This method is not intended to be overridden. Subclasses should instead provide an
  10482. // implementation of `hydrateDirectives`.
  10483. AbstractChangeDetector.prototype.hydrate = function (context, locals, directives, pipes) {
  10484. this.mode = change_detection_util_1.ChangeDetectionUtil.changeDetectionMode(this.strategy);
  10485. this.context = context;
  10486. if (this.strategy === constants_1.ChangeDetectionStrategy.OnPushObserve) {
  10487. this.observeComponent(context);
  10488. }
  10489. this.locals = locals;
  10490. this.pipes = pipes;
  10491. this.hydrateDirectives(directives);
  10492. this.state = constants_1.ChangeDetectorState.NeverChecked;
  10493. };
  10494. // Subclasses should override this method to hydrate any directives.
  10495. AbstractChangeDetector.prototype.hydrateDirectives = function (directives) { };
  10496. // This method is not intended to be overridden. Subclasses should instead provide an
  10497. // implementation of `dehydrateDirectives`.
  10498. AbstractChangeDetector.prototype.dehydrate = function () {
  10499. this.dehydrateDirectives(true);
  10500. // This is an experimental feature. Works only in Dart.
  10501. if (this.strategy === constants_1.ChangeDetectionStrategy.OnPushObserve) {
  10502. this._unsubsribeFromObservables();
  10503. }
  10504. this.context = null;
  10505. this.locals = null;
  10506. this.pipes = null;
  10507. };
  10508. // Subclasses should override this method to dehydrate any directives. This method should reverse
  10509. // any work done in `hydrateDirectives`.
  10510. AbstractChangeDetector.prototype.dehydrateDirectives = function (destroyPipes) { };
  10511. AbstractChangeDetector.prototype.hydrated = function () { return lang_1.isPresent(this.context); };
  10512. AbstractChangeDetector.prototype.afterContentLifecycleCallbacks = function () {
  10513. this.dispatcher.notifyAfterContentChecked();
  10514. this.afterContentLifecycleCallbacksInternal();
  10515. };
  10516. AbstractChangeDetector.prototype.afterContentLifecycleCallbacksInternal = function () { };
  10517. AbstractChangeDetector.prototype.afterViewLifecycleCallbacks = function () {
  10518. this.dispatcher.notifyAfterViewChecked();
  10519. this.afterViewLifecycleCallbacksInternal();
  10520. };
  10521. AbstractChangeDetector.prototype.afterViewLifecycleCallbacksInternal = function () { };
  10522. /** @internal */
  10523. AbstractChangeDetector.prototype._detectChangesContentChildren = function (throwOnChange) {
  10524. var c = this.contentChildren;
  10525. for (var i = 0; i < c.length; ++i) {
  10526. c[i].runDetectChanges(throwOnChange);
  10527. }
  10528. };
  10529. /** @internal */
  10530. AbstractChangeDetector.prototype._detectChangesInViewChildren = function (throwOnChange) {
  10531. var c = this.viewChildren;
  10532. for (var i = 0; i < c.length; ++i) {
  10533. c[i].runDetectChanges(throwOnChange);
  10534. }
  10535. };
  10536. AbstractChangeDetector.prototype.markAsCheckOnce = function () { this.mode = constants_1.ChangeDetectionStrategy.CheckOnce; };
  10537. AbstractChangeDetector.prototype.markPathToRootAsCheckOnce = function () {
  10538. var c = this;
  10539. while (lang_1.isPresent(c) && c.mode !== constants_1.ChangeDetectionStrategy.Detached) {
  10540. if (c.mode === constants_1.ChangeDetectionStrategy.Checked)
  10541. c.mode = constants_1.ChangeDetectionStrategy.CheckOnce;
  10542. c = c.parent;
  10543. }
  10544. };
  10545. // This is an experimental feature. Works only in Dart.
  10546. AbstractChangeDetector.prototype._unsubsribeFromObservables = function () {
  10547. if (lang_1.isPresent(this.subscriptions)) {
  10548. for (var i = 0; i < this.subscriptions.length; ++i) {
  10549. var s = this.subscriptions[i];
  10550. if (lang_1.isPresent(this.subscriptions[i])) {
  10551. s.cancel();
  10552. this.subscriptions[i] = null;
  10553. }
  10554. }
  10555. }
  10556. };
  10557. // This is an experimental feature. Works only in Dart.
  10558. AbstractChangeDetector.prototype.observeValue = function (value, index) {
  10559. var _this = this;
  10560. if (observable_facade_1.isObservable(value)) {
  10561. this._createArrayToStoreObservables();
  10562. if (lang_1.isBlank(this.subscriptions[index])) {
  10563. this.streams[index] = value.changes;
  10564. this.subscriptions[index] = value.changes.listen(function (_) { return _this.ref.markForCheck(); });
  10565. }
  10566. else if (this.streams[index] !== value.changes) {
  10567. this.subscriptions[index].cancel();
  10568. this.streams[index] = value.changes;
  10569. this.subscriptions[index] = value.changes.listen(function (_) { return _this.ref.markForCheck(); });
  10570. }
  10571. }
  10572. return value;
  10573. };
  10574. // This is an experimental feature. Works only in Dart.
  10575. AbstractChangeDetector.prototype.observeDirective = function (value, index) {
  10576. var _this = this;
  10577. if (observable_facade_1.isObservable(value)) {
  10578. this._createArrayToStoreObservables();
  10579. var arrayIndex = this.numberOfPropertyProtoRecords + index + 2; // +1 is component
  10580. this.streams[arrayIndex] = value.changes;
  10581. this.subscriptions[arrayIndex] = value.changes.listen(function (_) { return _this.ref.markForCheck(); });
  10582. }
  10583. return value;
  10584. };
  10585. // This is an experimental feature. Works only in Dart.
  10586. AbstractChangeDetector.prototype.observeComponent = function (value) {
  10587. var _this = this;
  10588. if (observable_facade_1.isObservable(value)) {
  10589. this._createArrayToStoreObservables();
  10590. var index = this.numberOfPropertyProtoRecords + 1;
  10591. this.streams[index] = value.changes;
  10592. this.subscriptions[index] = value.changes.listen(function (_) { return _this.ref.markForCheck(); });
  10593. }
  10594. return value;
  10595. };
  10596. AbstractChangeDetector.prototype._createArrayToStoreObservables = function () {
  10597. if (lang_1.isBlank(this.subscriptions)) {
  10598. this.subscriptions = collection_1.ListWrapper.createFixedSize(this.numberOfPropertyProtoRecords +
  10599. this.directiveIndices.length + 2);
  10600. this.streams = collection_1.ListWrapper.createFixedSize(this.numberOfPropertyProtoRecords +
  10601. this.directiveIndices.length + 2);
  10602. }
  10603. };
  10604. AbstractChangeDetector.prototype.getDirectiveFor = function (directives, index) {
  10605. return directives.getDirectiveFor(this.directiveIndices[index]);
  10606. };
  10607. AbstractChangeDetector.prototype.getDetectorFor = function (directives, index) {
  10608. return directives.getDetectorFor(this.directiveIndices[index]);
  10609. };
  10610. AbstractChangeDetector.prototype.notifyDispatcher = function (value) {
  10611. this.dispatcher.notifyOnBinding(this._currentBinding(), value);
  10612. };
  10613. AbstractChangeDetector.prototype.logBindingUpdate = function (value) {
  10614. this.dispatcher.logBindingUpdate(this._currentBinding(), value);
  10615. };
  10616. AbstractChangeDetector.prototype.addChange = function (changes, oldValue, newValue) {
  10617. if (lang_1.isBlank(changes)) {
  10618. changes = {};
  10619. }
  10620. changes[this._currentBinding().name] = change_detection_util_1.ChangeDetectionUtil.simpleChange(oldValue, newValue);
  10621. return changes;
  10622. };
  10623. AbstractChangeDetector.prototype._throwError = function (exception, stack) {
  10624. var error;
  10625. try {
  10626. var c = this.dispatcher.getDebugContext(this._currentBinding().elementIndex, null);
  10627. var context = lang_1.isPresent(c) ? new _Context(c.element, c.componentElement, c.context, c.locals, c.injector, this._currentBinding().debug) :
  10628. null;
  10629. error = new exceptions_1.ChangeDetectionError(this._currentBinding().debug, exception, stack, context);
  10630. }
  10631. catch (e) {
  10632. // if an error happens during getting the debug context, we throw a ChangeDetectionError
  10633. // without the extra information.
  10634. error = new exceptions_1.ChangeDetectionError(null, exception, stack, null);
  10635. }
  10636. throw error;
  10637. };
  10638. AbstractChangeDetector.prototype.throwOnChangeError = function (oldValue, newValue) {
  10639. throw new exceptions_1.ExpressionChangedAfterItHasBeenCheckedException(this._currentBinding().debug, oldValue, newValue, null);
  10640. };
  10641. AbstractChangeDetector.prototype.throwDehydratedError = function () { throw new exceptions_1.DehydratedException(); };
  10642. AbstractChangeDetector.prototype._currentBinding = function () {
  10643. return this.bindingTargets[this.propertyBindingIndex];
  10644. };
  10645. return AbstractChangeDetector;
  10646. })();
  10647. exports.AbstractChangeDetector = AbstractChangeDetector;
  10648. /***/ },
  10649. /* 44 */
  10650. /***/ function(module, exports, __webpack_require__) {
  10651. var __extends = (this && this.__extends) || function (d, b) {
  10652. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  10653. function __() { this.constructor = d; }
  10654. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  10655. };
  10656. var constants_1 = __webpack_require__(36);
  10657. var ChangeDetectorRef = (function () {
  10658. function ChangeDetectorRef() {
  10659. }
  10660. return ChangeDetectorRef;
  10661. })();
  10662. exports.ChangeDetectorRef = ChangeDetectorRef;
  10663. var ChangeDetectorRef_ = (function (_super) {
  10664. __extends(ChangeDetectorRef_, _super);
  10665. function ChangeDetectorRef_(_cd) {
  10666. _super.call(this);
  10667. this._cd = _cd;
  10668. }
  10669. ChangeDetectorRef_.prototype.markForCheck = function () { this._cd.markPathToRootAsCheckOnce(); };
  10670. ChangeDetectorRef_.prototype.detach = function () { this._cd.mode = constants_1.ChangeDetectionStrategy.Detached; };
  10671. ChangeDetectorRef_.prototype.detectChanges = function () { this._cd.detectChanges(); };
  10672. ChangeDetectorRef_.prototype.checkNoChanges = function () { this._cd.checkNoChanges(); };
  10673. ChangeDetectorRef_.prototype.reattach = function () {
  10674. this._cd.mode = constants_1.ChangeDetectionStrategy.CheckAlways;
  10675. this.markForCheck();
  10676. };
  10677. return ChangeDetectorRef_;
  10678. })(ChangeDetectorRef);
  10679. exports.ChangeDetectorRef_ = ChangeDetectorRef_;
  10680. /***/ },
  10681. /* 45 */
  10682. /***/ function(module, exports, __webpack_require__) {
  10683. var impl = __webpack_require__(46);
  10684. // Change exports to const once https://github.com/angular/ts2dart/issues/150
  10685. /**
  10686. * True if WTF is enabled.
  10687. */
  10688. exports.wtfEnabled = impl.detectWTF();
  10689. function noopScope(arg0, arg1) {
  10690. return null;
  10691. }
  10692. /**
  10693. * Create trace scope.
  10694. *
  10695. * Scopes must be strictly nested and are analogous to stack frames, but
  10696. * do not have to follow the stack frames. Instead it is recommended that they follow logical
  10697. * nesting. You may want to use
  10698. * [Event
  10699. * Signatures](http://google.github.io/tracing-framework/instrumenting-code.html#custom-events)
  10700. * as they are defined in WTF.
  10701. *
  10702. * Used to mark scope entry. The return value is used to leave the scope.
  10703. *
  10704. * var myScope = wtfCreateScope('MyClass#myMethod(ascii someVal)');
  10705. *
  10706. * someMethod() {
  10707. * var s = myScope('Foo'); // 'Foo' gets stored in tracing UI
  10708. * // DO SOME WORK HERE
  10709. * return wtfLeave(s, 123); // Return value 123
  10710. * }
  10711. *
  10712. * Note, adding try-finally block around the work to ensure that `wtfLeave` gets called can
  10713. * negatively impact the performance of your application. For this reason we recommend that
  10714. * you don't add them to ensure that `wtfLeave` gets called. In production `wtfLeave` is a noop and
  10715. * so try-finally block has no value. When debugging perf issues, skipping `wtfLeave`, do to
  10716. * exception, will produce incorrect trace, but presence of exception signifies logic error which
  10717. * needs to be fixed before the app should be profiled. Add try-finally only when you expect that
  10718. * an exception is expected during normal execution while profiling.
  10719. *
  10720. */
  10721. exports.wtfCreateScope = exports.wtfEnabled ? impl.createScope : function (signature, flags) { return noopScope; };
  10722. /**
  10723. * Used to mark end of Scope.
  10724. *
  10725. * - `scope` to end.
  10726. * - `returnValue` (optional) to be passed to the WTF.
  10727. *
  10728. * Returns the `returnValue for easy chaining.
  10729. */
  10730. exports.wtfLeave = exports.wtfEnabled ? impl.leave : function (s, r) { return r; };
  10731. /**
  10732. * Used to mark Async start. Async are similar to scope but they don't have to be strictly nested.
  10733. * The return value is used in the call to [endAsync]. Async ranges only work if WTF has been
  10734. * enabled.
  10735. *
  10736. * someMethod() {
  10737. * var s = wtfStartTimeRange('HTTP:GET', 'some.url');
  10738. * var future = new Future.delay(5).then((_) {
  10739. * wtfEndTimeRange(s);
  10740. * });
  10741. * }
  10742. */
  10743. exports.wtfStartTimeRange = exports.wtfEnabled ? impl.startTimeRange : function (rangeType, action) { return null; };
  10744. /**
  10745. * Ends a async time range operation.
  10746. * [range] is the return value from [wtfStartTimeRange] Async ranges only work if WTF has been
  10747. * enabled.
  10748. */
  10749. exports.wtfEndTimeRange = exports.wtfEnabled ? impl.endTimeRange : function (r) {
  10750. return null;
  10751. };
  10752. /***/ },
  10753. /* 46 */
  10754. /***/ function(module, exports, __webpack_require__) {
  10755. var lang_1 = __webpack_require__(5);
  10756. var trace;
  10757. var events;
  10758. function detectWTF() {
  10759. var wtf = lang_1.global['wtf'];
  10760. if (wtf) {
  10761. trace = wtf['trace'];
  10762. if (trace) {
  10763. events = trace['events'];
  10764. return true;
  10765. }
  10766. }
  10767. return false;
  10768. }
  10769. exports.detectWTF = detectWTF;
  10770. function createScope(signature, flags) {
  10771. if (flags === void 0) { flags = null; }
  10772. return events.createScope(signature, flags);
  10773. }
  10774. exports.createScope = createScope;
  10775. function leave(scope, returnValue) {
  10776. trace.leaveScope(scope, returnValue);
  10777. return returnValue;
  10778. }
  10779. exports.leave = leave;
  10780. function startTimeRange(rangeType, action) {
  10781. return trace.beginTimeRange(rangeType, action);
  10782. }
  10783. exports.startTimeRange = startTimeRange;
  10784. function endTimeRange(range) {
  10785. trace.endTimeRange(range);
  10786. }
  10787. exports.endTimeRange = endTimeRange;
  10788. /***/ },
  10789. /* 47 */
  10790. /***/ function(module, exports) {
  10791. function isObservable(value) {
  10792. return false;
  10793. }
  10794. exports.isObservable = isObservable;
  10795. /***/ },
  10796. /* 48 */
  10797. /***/ function(module, exports) {
  10798. (function (RecordType) {
  10799. RecordType[RecordType["Self"] = 0] = "Self";
  10800. RecordType[RecordType["Const"] = 1] = "Const";
  10801. RecordType[RecordType["PrimitiveOp"] = 2] = "PrimitiveOp";
  10802. RecordType[RecordType["PropertyRead"] = 3] = "PropertyRead";
  10803. RecordType[RecordType["PropertyWrite"] = 4] = "PropertyWrite";
  10804. RecordType[RecordType["Local"] = 5] = "Local";
  10805. RecordType[RecordType["InvokeMethod"] = 6] = "InvokeMethod";
  10806. RecordType[RecordType["InvokeClosure"] = 7] = "InvokeClosure";
  10807. RecordType[RecordType["KeyedRead"] = 8] = "KeyedRead";
  10808. RecordType[RecordType["KeyedWrite"] = 9] = "KeyedWrite";
  10809. RecordType[RecordType["Pipe"] = 10] = "Pipe";
  10810. RecordType[RecordType["Interpolate"] = 11] = "Interpolate";
  10811. RecordType[RecordType["SafeProperty"] = 12] = "SafeProperty";
  10812. RecordType[RecordType["CollectionLiteral"] = 13] = "CollectionLiteral";
  10813. RecordType[RecordType["SafeMethodInvoke"] = 14] = "SafeMethodInvoke";
  10814. RecordType[RecordType["DirectiveLifecycle"] = 15] = "DirectiveLifecycle";
  10815. RecordType[RecordType["Chain"] = 16] = "Chain";
  10816. RecordType[RecordType["SkipRecordsIf"] = 17] = "SkipRecordsIf";
  10817. RecordType[RecordType["SkipRecordsIfNot"] = 18] = "SkipRecordsIfNot";
  10818. RecordType[RecordType["SkipRecords"] = 19] = "SkipRecords"; // Skip records unconditionally
  10819. })(exports.RecordType || (exports.RecordType = {}));
  10820. var RecordType = exports.RecordType;
  10821. var ProtoRecord = (function () {
  10822. function ProtoRecord(mode, name, funcOrValue, args, fixedArgs, contextIndex, directiveIndex, selfIndex, bindingRecord, lastInBinding, lastInDirective, argumentToPureFunction, referencedBySelf, propertyBindingIndex) {
  10823. this.mode = mode;
  10824. this.name = name;
  10825. this.funcOrValue = funcOrValue;
  10826. this.args = args;
  10827. this.fixedArgs = fixedArgs;
  10828. this.contextIndex = contextIndex;
  10829. this.directiveIndex = directiveIndex;
  10830. this.selfIndex = selfIndex;
  10831. this.bindingRecord = bindingRecord;
  10832. this.lastInBinding = lastInBinding;
  10833. this.lastInDirective = lastInDirective;
  10834. this.argumentToPureFunction = argumentToPureFunction;
  10835. this.referencedBySelf = referencedBySelf;
  10836. this.propertyBindingIndex = propertyBindingIndex;
  10837. }
  10838. ProtoRecord.prototype.isPureFunction = function () {
  10839. return this.mode === RecordType.Interpolate || this.mode === RecordType.CollectionLiteral;
  10840. };
  10841. ProtoRecord.prototype.isUsedByOtherRecord = function () { return !this.lastInBinding || this.referencedBySelf; };
  10842. ProtoRecord.prototype.shouldBeChecked = function () {
  10843. return this.argumentToPureFunction || this.lastInBinding || this.isPureFunction() ||
  10844. this.isPipeRecord();
  10845. };
  10846. ProtoRecord.prototype.isPipeRecord = function () { return this.mode === RecordType.Pipe; };
  10847. ProtoRecord.prototype.isConditionalSkipRecord = function () {
  10848. return this.mode === RecordType.SkipRecordsIfNot || this.mode === RecordType.SkipRecordsIf;
  10849. };
  10850. ProtoRecord.prototype.isUnconditionalSkipRecord = function () { return this.mode === RecordType.SkipRecords; };
  10851. ProtoRecord.prototype.isSkipRecord = function () {
  10852. return this.isConditionalSkipRecord() || this.isUnconditionalSkipRecord();
  10853. };
  10854. ProtoRecord.prototype.isLifeCycleRecord = function () { return this.mode === RecordType.DirectiveLifecycle; };
  10855. return ProtoRecord;
  10856. })();
  10857. exports.ProtoRecord = ProtoRecord;
  10858. /***/ },
  10859. /* 49 */
  10860. /***/ function(module, exports) {
  10861. var EventBinding = (function () {
  10862. function EventBinding(eventName, elIndex, dirIndex, records) {
  10863. this.eventName = eventName;
  10864. this.elIndex = elIndex;
  10865. this.dirIndex = dirIndex;
  10866. this.records = records;
  10867. }
  10868. return EventBinding;
  10869. })();
  10870. exports.EventBinding = EventBinding;
  10871. /***/ },
  10872. /* 50 */
  10873. /***/ function(module, exports, __webpack_require__) {
  10874. var lang_1 = __webpack_require__(5);
  10875. var collection_1 = __webpack_require__(12);
  10876. var proto_record_1 = __webpack_require__(48);
  10877. /**
  10878. * Removes "duplicate" records. It assumes that record evaluation does not have side-effects.
  10879. *
  10880. * Records that are not last in bindings are removed and all the indices of the records that depend
  10881. * on them are updated.
  10882. *
  10883. * Records that are last in bindings CANNOT be removed, and instead are replaced with very cheap
  10884. * SELF records.
  10885. *
  10886. * @internal
  10887. */
  10888. function coalesce(srcRecords) {
  10889. var dstRecords = [];
  10890. var excludedIdxs = [];
  10891. var indexMap = new collection_1.Map();
  10892. var skipDepth = 0;
  10893. var skipSources = collection_1.ListWrapper.createFixedSize(srcRecords.length);
  10894. for (var protoIndex = 0; protoIndex < srcRecords.length; protoIndex++) {
  10895. var skipRecord = skipSources[protoIndex];
  10896. if (lang_1.isPresent(skipRecord)) {
  10897. skipDepth--;
  10898. skipRecord.fixedArgs[0] = dstRecords.length;
  10899. }
  10900. var src = srcRecords[protoIndex];
  10901. var dst = _cloneAndUpdateIndexes(src, dstRecords, indexMap);
  10902. if (dst.isSkipRecord()) {
  10903. dstRecords.push(dst);
  10904. skipDepth++;
  10905. skipSources[dst.fixedArgs[0]] = dst;
  10906. }
  10907. else {
  10908. var record = _mayBeAddRecord(dst, dstRecords, excludedIdxs, skipDepth > 0);
  10909. indexMap.set(src.selfIndex, record.selfIndex);
  10910. }
  10911. }
  10912. return _optimizeSkips(dstRecords);
  10913. }
  10914. exports.coalesce = coalesce;
  10915. /**
  10916. * - Conditional skip of 1 record followed by an unconditional skip of N are replaced by a
  10917. * conditional skip of N with the negated condition,
  10918. * - Skips of 0 records are removed
  10919. */
  10920. function _optimizeSkips(srcRecords) {
  10921. var dstRecords = [];
  10922. var skipSources = collection_1.ListWrapper.createFixedSize(srcRecords.length);
  10923. var indexMap = new collection_1.Map();
  10924. for (var protoIndex = 0; protoIndex < srcRecords.length; protoIndex++) {
  10925. var skipRecord = skipSources[protoIndex];
  10926. if (lang_1.isPresent(skipRecord)) {
  10927. skipRecord.fixedArgs[0] = dstRecords.length;
  10928. }
  10929. var src = srcRecords[protoIndex];
  10930. if (src.isSkipRecord()) {
  10931. if (src.isConditionalSkipRecord() && src.fixedArgs[0] === protoIndex + 2 &&
  10932. protoIndex < srcRecords.length - 1 &&
  10933. srcRecords[protoIndex + 1].mode === proto_record_1.RecordType.SkipRecords) {
  10934. src.mode = src.mode === proto_record_1.RecordType.SkipRecordsIf ? proto_record_1.RecordType.SkipRecordsIfNot :
  10935. proto_record_1.RecordType.SkipRecordsIf;
  10936. src.fixedArgs[0] = srcRecords[protoIndex + 1].fixedArgs[0];
  10937. protoIndex++;
  10938. }
  10939. if (src.fixedArgs[0] > protoIndex + 1) {
  10940. var dst = _cloneAndUpdateIndexes(src, dstRecords, indexMap);
  10941. dstRecords.push(dst);
  10942. skipSources[dst.fixedArgs[0]] = dst;
  10943. }
  10944. }
  10945. else {
  10946. var dst = _cloneAndUpdateIndexes(src, dstRecords, indexMap);
  10947. dstRecords.push(dst);
  10948. indexMap.set(src.selfIndex, dst.selfIndex);
  10949. }
  10950. }
  10951. return dstRecords;
  10952. }
  10953. /**
  10954. * Add a new record or re-use one of the existing records.
  10955. */
  10956. function _mayBeAddRecord(record, dstRecords, excludedIdxs, excluded) {
  10957. var match = _findFirstMatch(record, dstRecords, excludedIdxs);
  10958. if (lang_1.isPresent(match)) {
  10959. if (record.lastInBinding) {
  10960. dstRecords.push(_createSelfRecord(record, match.selfIndex, dstRecords.length + 1));
  10961. match.referencedBySelf = true;
  10962. }
  10963. else {
  10964. if (record.argumentToPureFunction) {
  10965. match.argumentToPureFunction = true;
  10966. }
  10967. }
  10968. return match;
  10969. }
  10970. if (excluded) {
  10971. excludedIdxs.push(record.selfIndex);
  10972. }
  10973. dstRecords.push(record);
  10974. return record;
  10975. }
  10976. /**
  10977. * Returns the first `ProtoRecord` that matches the record.
  10978. */
  10979. function _findFirstMatch(record, dstRecords, excludedIdxs) {
  10980. return dstRecords.find(
  10981. // TODO(vicb): optimize excludedIdxs.indexOf (sorted array)
  10982. function (rr) { return excludedIdxs.indexOf(rr.selfIndex) == -1 && rr.mode !== proto_record_1.RecordType.DirectiveLifecycle &&
  10983. _haveSameDirIndex(rr, record) && rr.mode === record.mode &&
  10984. lang_1.looseIdentical(rr.funcOrValue, record.funcOrValue) &&
  10985. rr.contextIndex === record.contextIndex && lang_1.looseIdentical(rr.name, record.name) &&
  10986. collection_1.ListWrapper.equals(rr.args, record.args); });
  10987. }
  10988. /**
  10989. * Clone the `ProtoRecord` and changes the indexes for the ones in the destination array for:
  10990. * - the arguments,
  10991. * - the context,
  10992. * - self
  10993. */
  10994. function _cloneAndUpdateIndexes(record, dstRecords, indexMap) {
  10995. var args = record.args.map(function (src) { return _srcToDstSelfIndex(indexMap, src); });
  10996. var contextIndex = _srcToDstSelfIndex(indexMap, record.contextIndex);
  10997. var selfIndex = dstRecords.length + 1;
  10998. 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);
  10999. }
  11000. /**
  11001. * Returns the index in the destination array corresponding to the index in the src array.
  11002. * When the element is not present in the destination array, return the source index.
  11003. */
  11004. function _srcToDstSelfIndex(indexMap, srcIdx) {
  11005. var dstIdx = indexMap.get(srcIdx);
  11006. return lang_1.isPresent(dstIdx) ? dstIdx : srcIdx;
  11007. }
  11008. function _createSelfRecord(r, contextIndex, selfIndex) {
  11009. 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);
  11010. }
  11011. function _haveSameDirIndex(a, b) {
  11012. var di1 = lang_1.isBlank(a.directiveIndex) ? null : a.directiveIndex.directiveIndex;
  11013. var ei1 = lang_1.isBlank(a.directiveIndex) ? null : a.directiveIndex.elementIndex;
  11014. var di2 = lang_1.isBlank(b.directiveIndex) ? null : b.directiveIndex.directiveIndex;
  11015. var ei2 = lang_1.isBlank(b.directiveIndex) ? null : b.directiveIndex.elementIndex;
  11016. return di1 === di2 && ei1 === ei2;
  11017. }
  11018. /***/ },
  11019. /* 51 */
  11020. /***/ function(module, exports, __webpack_require__) {
  11021. var change_detection_jit_generator_1 = __webpack_require__(52);
  11022. var JitProtoChangeDetector = (function () {
  11023. function JitProtoChangeDetector(definition) {
  11024. this.definition = definition;
  11025. this._factory = this._createFactory(definition);
  11026. }
  11027. JitProtoChangeDetector.isSupported = function () { return true; };
  11028. JitProtoChangeDetector.prototype.instantiate = function (dispatcher) { return this._factory(dispatcher); };
  11029. /** @internal */
  11030. JitProtoChangeDetector.prototype._createFactory = function (definition) {
  11031. return new change_detection_jit_generator_1.ChangeDetectorJITGenerator(definition, 'util', 'AbstractChangeDetector', 'ChangeDetectorStatus')
  11032. .generate();
  11033. };
  11034. return JitProtoChangeDetector;
  11035. })();
  11036. exports.JitProtoChangeDetector = JitProtoChangeDetector;
  11037. /***/ },
  11038. /* 52 */
  11039. /***/ function(module, exports, __webpack_require__) {
  11040. var lang_1 = __webpack_require__(5);
  11041. var exceptions_1 = __webpack_require__(14);
  11042. var collection_1 = __webpack_require__(12);
  11043. var abstract_change_detector_1 = __webpack_require__(43);
  11044. var change_detection_util_1 = __webpack_require__(38);
  11045. var proto_record_1 = __webpack_require__(48);
  11046. var codegen_name_util_1 = __webpack_require__(53);
  11047. var codegen_logic_util_1 = __webpack_require__(54);
  11048. var codegen_facade_1 = __webpack_require__(55);
  11049. var constants_1 = __webpack_require__(36);
  11050. var proto_change_detector_1 = __webpack_require__(37);
  11051. /**
  11052. * The code generator takes a list of proto records and creates a function/class
  11053. * that "emulates" what the developer would write by hand to implement the same
  11054. * kind of behaviour.
  11055. *
  11056. * This code should be kept in sync with the Dart transformer's
  11057. * `angular2.transform.template_compiler.change_detector_codegen` library. If you make updates
  11058. * here, please make equivalent changes there.
  11059. */
  11060. var IS_CHANGED_LOCAL = "isChanged";
  11061. var CHANGES_LOCAL = "changes";
  11062. var ChangeDetectorJITGenerator = (function () {
  11063. function ChangeDetectorJITGenerator(definition, changeDetectionUtilVarName, abstractChangeDetectorVarName, changeDetectorStateVarName) {
  11064. this.changeDetectionUtilVarName = changeDetectionUtilVarName;
  11065. this.abstractChangeDetectorVarName = abstractChangeDetectorVarName;
  11066. this.changeDetectorStateVarName = changeDetectorStateVarName;
  11067. var propertyBindingRecords = proto_change_detector_1.createPropertyRecords(definition);
  11068. var eventBindingRecords = proto_change_detector_1.createEventRecords(definition);
  11069. var propertyBindingTargets = definition.bindingRecords.map(function (b) { return b.target; });
  11070. this.id = definition.id;
  11071. this.changeDetectionStrategy = definition.strategy;
  11072. this.genConfig = definition.genConfig;
  11073. this.records = propertyBindingRecords;
  11074. this.propertyBindingTargets = propertyBindingTargets;
  11075. this.eventBindings = eventBindingRecords;
  11076. this.directiveRecords = definition.directiveRecords;
  11077. this._names = new codegen_name_util_1.CodegenNameUtil(this.records, this.eventBindings, this.directiveRecords, this.changeDetectionUtilVarName);
  11078. this._logic =
  11079. new codegen_logic_util_1.CodegenLogicUtil(this._names, this.changeDetectionUtilVarName, this.changeDetectorStateVarName, this.changeDetectionStrategy);
  11080. this.typeName = codegen_name_util_1.sanitizeName("ChangeDetector_" + this.id);
  11081. }
  11082. ChangeDetectorJITGenerator.prototype.generate = function () {
  11083. var factorySource = "\n " + this.generateSource() + "\n return function(dispatcher) {\n return new " + this.typeName + "(dispatcher);\n }\n ";
  11084. return new Function(this.abstractChangeDetectorVarName, this.changeDetectionUtilVarName, this.changeDetectorStateVarName, factorySource)(abstract_change_detector_1.AbstractChangeDetector, change_detection_util_1.ChangeDetectionUtil, constants_1.ChangeDetectorState);
  11085. };
  11086. ChangeDetectorJITGenerator.prototype.generateSource = function () {
  11087. 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 ";
  11088. };
  11089. /** @internal */
  11090. ChangeDetectorJITGenerator.prototype._genPropertyBindingTargets = function () {
  11091. var targets = this._logic.genPropertyBindingTargets(this.propertyBindingTargets, this.genConfig.genDebugInfo);
  11092. return this.typeName + ".gen_propertyBindingTargets = " + targets + ";";
  11093. };
  11094. /** @internal */
  11095. ChangeDetectorJITGenerator.prototype._genDirectiveIndices = function () {
  11096. var indices = this._logic.genDirectiveIndices(this.directiveRecords);
  11097. return this.typeName + ".gen_directiveIndices = " + indices + ";";
  11098. };
  11099. /** @internal */
  11100. ChangeDetectorJITGenerator.prototype._maybeGenHandleEventInternal = function () {
  11101. var _this = this;
  11102. if (this.eventBindings.length > 0) {
  11103. var handlers = this.eventBindings.map(function (eb) { return _this._genEventBinding(eb); }).join("\n");
  11104. 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 ";
  11105. }
  11106. else {
  11107. return '';
  11108. }
  11109. };
  11110. /** @internal */
  11111. ChangeDetectorJITGenerator.prototype._genEventBinding = function (eb) {
  11112. var _this = this;
  11113. var codes = [];
  11114. this._endOfBlockIdxs = [];
  11115. collection_1.ListWrapper.forEachWithIndex(eb.records, function (r, i) {
  11116. var code;
  11117. if (r.isConditionalSkipRecord()) {
  11118. code = _this._genConditionalSkip(r, _this._names.getEventLocalName(eb, i));
  11119. }
  11120. else if (r.isUnconditionalSkipRecord()) {
  11121. code = _this._genUnconditionalSkip(r);
  11122. }
  11123. else {
  11124. code = _this._genEventBindingEval(eb, r);
  11125. }
  11126. code += _this._genEndOfSkipBlock(i);
  11127. codes.push(code);
  11128. });
  11129. return "\n if (eventName === \"" + eb.eventName + "\" && elIndex === " + eb.elIndex + ") {\n " + codes.join("\n") + "\n }";
  11130. };
  11131. /** @internal */
  11132. ChangeDetectorJITGenerator.prototype._genEventBindingEval = function (eb, r) {
  11133. if (r.lastInBinding) {
  11134. var evalRecord = this._logic.genEventBindingEvalValue(eb, r);
  11135. var markPath = this._genMarkPathToRootAsCheckOnce(r);
  11136. var prevDefault = this._genUpdatePreventDefault(eb, r);
  11137. return evalRecord + "\n" + markPath + "\n" + prevDefault;
  11138. }
  11139. else {
  11140. return this._logic.genEventBindingEvalValue(eb, r);
  11141. }
  11142. };
  11143. /** @internal */
  11144. ChangeDetectorJITGenerator.prototype._genMarkPathToRootAsCheckOnce = function (r) {
  11145. var br = r.bindingRecord;
  11146. if (br.isDefaultChangeDetection()) {
  11147. return "";
  11148. }
  11149. else {
  11150. return this._names.getDetectorName(br.directiveRecord.directiveIndex) + ".markPathToRootAsCheckOnce();";
  11151. }
  11152. };
  11153. /** @internal */
  11154. ChangeDetectorJITGenerator.prototype._genUpdatePreventDefault = function (eb, r) {
  11155. var local = this._names.getEventLocalName(eb, r.selfIndex);
  11156. return "if (" + local + " === false) { " + this._names.getPreventDefaultAccesor() + " = true};";
  11157. };
  11158. /** @internal */
  11159. ChangeDetectorJITGenerator.prototype._maybeGenDehydrateDirectives = function () {
  11160. var destroyPipesCode = this._names.genPipeOnDestroy();
  11161. if (destroyPipesCode) {
  11162. destroyPipesCode = "if (destroyPipes) { " + destroyPipesCode + " }";
  11163. }
  11164. var dehydrateFieldsCode = this._names.genDehydrateFields();
  11165. if (!destroyPipesCode && !dehydrateFieldsCode)
  11166. return '';
  11167. return this.typeName + ".prototype.dehydrateDirectives = function(destroyPipes) {\n " + destroyPipesCode + "\n " + dehydrateFieldsCode + "\n }";
  11168. };
  11169. /** @internal */
  11170. ChangeDetectorJITGenerator.prototype._maybeGenHydrateDirectives = function () {
  11171. var hydrateDirectivesCode = this._logic.genHydrateDirectives(this.directiveRecords);
  11172. var hydrateDetectorsCode = this._logic.genHydrateDetectors(this.directiveRecords);
  11173. if (!hydrateDirectivesCode && !hydrateDetectorsCode)
  11174. return '';
  11175. return this.typeName + ".prototype.hydrateDirectives = function(directives) {\n " + hydrateDirectivesCode + "\n " + hydrateDetectorsCode + "\n }";
  11176. };
  11177. /** @internal */
  11178. ChangeDetectorJITGenerator.prototype._maybeGenAfterContentLifecycleCallbacks = function () {
  11179. var notifications = this._logic.genContentLifecycleCallbacks(this.directiveRecords);
  11180. if (notifications.length > 0) {
  11181. var directiveNotifications = notifications.join("\n");
  11182. return "\n " + this.typeName + ".prototype.afterContentLifecycleCallbacksInternal = function() {\n " + directiveNotifications + "\n }\n ";
  11183. }
  11184. else {
  11185. return '';
  11186. }
  11187. };
  11188. /** @internal */
  11189. ChangeDetectorJITGenerator.prototype._maybeGenAfterViewLifecycleCallbacks = function () {
  11190. var notifications = this._logic.genViewLifecycleCallbacks(this.directiveRecords);
  11191. if (notifications.length > 0) {
  11192. var directiveNotifications = notifications.join("\n");
  11193. return "\n " + this.typeName + ".prototype.afterViewLifecycleCallbacksInternal = function() {\n " + directiveNotifications + "\n }\n ";
  11194. }
  11195. else {
  11196. return '';
  11197. }
  11198. };
  11199. /** @internal */
  11200. ChangeDetectorJITGenerator.prototype._genAllRecords = function (rs) {
  11201. var codes = [];
  11202. this._endOfBlockIdxs = [];
  11203. for (var i = 0; i < rs.length; i++) {
  11204. var code = void 0;
  11205. var r = rs[i];
  11206. if (r.isLifeCycleRecord()) {
  11207. code = this._genDirectiveLifecycle(r);
  11208. }
  11209. else if (r.isPipeRecord()) {
  11210. code = this._genPipeCheck(r);
  11211. }
  11212. else if (r.isConditionalSkipRecord()) {
  11213. code = this._genConditionalSkip(r, this._names.getLocalName(r.contextIndex));
  11214. }
  11215. else if (r.isUnconditionalSkipRecord()) {
  11216. code = this._genUnconditionalSkip(r);
  11217. }
  11218. else {
  11219. code = this._genReferenceCheck(r);
  11220. }
  11221. code = "\n " + this._maybeFirstInBinding(r) + "\n " + code + "\n " + this._maybeGenLastInDirective(r) + "\n " + this._genEndOfSkipBlock(i) + "\n ";
  11222. codes.push(code);
  11223. }
  11224. return codes.join("\n");
  11225. };
  11226. /** @internal */
  11227. ChangeDetectorJITGenerator.prototype._genConditionalSkip = function (r, condition) {
  11228. var maybeNegate = r.mode === proto_record_1.RecordType.SkipRecordsIf ? '!' : '';
  11229. this._endOfBlockIdxs.push(r.fixedArgs[0] - 1);
  11230. return "if (" + maybeNegate + condition + ") {";
  11231. };
  11232. /** @internal */
  11233. ChangeDetectorJITGenerator.prototype._genUnconditionalSkip = function (r) {
  11234. this._endOfBlockIdxs.pop();
  11235. this._endOfBlockIdxs.push(r.fixedArgs[0] - 1);
  11236. return "} else {";
  11237. };
  11238. /** @internal */
  11239. ChangeDetectorJITGenerator.prototype._genEndOfSkipBlock = function (protoIndex) {
  11240. if (!collection_1.ListWrapper.isEmpty(this._endOfBlockIdxs)) {
  11241. var endOfBlock = collection_1.ListWrapper.last(this._endOfBlockIdxs);
  11242. if (protoIndex === endOfBlock) {
  11243. this._endOfBlockIdxs.pop();
  11244. return '}';
  11245. }
  11246. }
  11247. return '';
  11248. };
  11249. /** @internal */
  11250. ChangeDetectorJITGenerator.prototype._genDirectiveLifecycle = function (r) {
  11251. if (r.name === "DoCheck") {
  11252. return this._genOnCheck(r);
  11253. }
  11254. else if (r.name === "OnInit") {
  11255. return this._genOnInit(r);
  11256. }
  11257. else if (r.name === "OnChanges") {
  11258. return this._genOnChange(r);
  11259. }
  11260. else {
  11261. throw new exceptions_1.BaseException("Unknown lifecycle event '" + r.name + "'");
  11262. }
  11263. };
  11264. /** @internal */
  11265. ChangeDetectorJITGenerator.prototype._genPipeCheck = function (r) {
  11266. var _this = this;
  11267. var context = this._names.getLocalName(r.contextIndex);
  11268. var argString = r.args.map(function (arg) { return _this._names.getLocalName(arg); }).join(", ");
  11269. var oldValue = this._names.getFieldName(r.selfIndex);
  11270. var newValue = this._names.getLocalName(r.selfIndex);
  11271. var pipe = this._names.getPipeName(r.selfIndex);
  11272. var pipeName = r.name;
  11273. var init = "\n if (" + pipe + " === " + this.changeDetectionUtilVarName + ".uninitialized) {\n " + pipe + " = " + this._names.getPipesAccessorName() + ".get('" + pipeName + "');\n }\n ";
  11274. var read = newValue + " = " + pipe + ".pipe.transform(" + context + ", [" + argString + "]);";
  11275. var contexOrArgCheck = r.args.map(function (a) { return _this._names.getChangeName(a); });
  11276. contexOrArgCheck.push(this._names.getChangeName(r.contextIndex));
  11277. var condition = "!" + pipe + ".pure || (" + contexOrArgCheck.join(" || ") + ")";
  11278. 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 ";
  11279. var genCode = r.shouldBeChecked() ? "" + read + check : read;
  11280. if (r.isUsedByOtherRecord()) {
  11281. return init + " if (" + condition + ") { " + genCode + " } else { " + newValue + " = " + oldValue + "; }";
  11282. }
  11283. else {
  11284. return init + " if (" + condition + ") { " + genCode + " }";
  11285. }
  11286. };
  11287. /** @internal */
  11288. ChangeDetectorJITGenerator.prototype._genReferenceCheck = function (r) {
  11289. var _this = this;
  11290. var oldValue = this._names.getFieldName(r.selfIndex);
  11291. var newValue = this._names.getLocalName(r.selfIndex);
  11292. var read = "\n " + this._logic.genPropertyBindingEvalValue(r) + "\n ";
  11293. 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 ";
  11294. var genCode = r.shouldBeChecked() ? "" + read + check : read;
  11295. if (r.isPureFunction()) {
  11296. var condition = r.args.map(function (a) { return _this._names.getChangeName(a); }).join(" || ");
  11297. if (r.isUsedByOtherRecord()) {
  11298. return "if (" + condition + ") { " + genCode + " } else { " + newValue + " = " + oldValue + "; }";
  11299. }
  11300. else {
  11301. return "if (" + condition + ") { " + genCode + " }";
  11302. }
  11303. }
  11304. else {
  11305. return genCode;
  11306. }
  11307. };
  11308. /** @internal */
  11309. ChangeDetectorJITGenerator.prototype._genChangeMarker = function (r) {
  11310. return r.argumentToPureFunction ? this._names.getChangeName(r.selfIndex) + " = true" : "";
  11311. };
  11312. /** @internal */
  11313. ChangeDetectorJITGenerator.prototype._genUpdateDirectiveOrElement = function (r) {
  11314. if (!r.lastInBinding)
  11315. return "";
  11316. var newValue = this._names.getLocalName(r.selfIndex);
  11317. var oldValue = this._names.getFieldName(r.selfIndex);
  11318. var notifyDebug = this.genConfig.logBindingUpdate ? "this.logBindingUpdate(" + newValue + ");" : "";
  11319. var br = r.bindingRecord;
  11320. if (br.target.isDirective()) {
  11321. var directiveProperty = this._names.getDirectiveName(br.directiveRecord.directiveIndex) + "." + br.target.name;
  11322. return "\n " + this._genThrowOnChangeCheck(oldValue, newValue) + "\n " + directiveProperty + " = " + newValue + ";\n " + notifyDebug + "\n " + IS_CHANGED_LOCAL + " = true;\n ";
  11323. }
  11324. else {
  11325. return "\n " + this._genThrowOnChangeCheck(oldValue, newValue) + "\n this.notifyDispatcher(" + newValue + ");\n " + notifyDebug + "\n ";
  11326. }
  11327. };
  11328. /** @internal */
  11329. ChangeDetectorJITGenerator.prototype._genThrowOnChangeCheck = function (oldValue, newValue) {
  11330. if (lang_1.assertionsEnabled()) {
  11331. return "\n if(throwOnChange) {\n this.throwOnChangeError(" + oldValue + ", " + newValue + ");\n }\n ";
  11332. }
  11333. else {
  11334. return '';
  11335. }
  11336. };
  11337. /** @internal */
  11338. ChangeDetectorJITGenerator.prototype._genAddToChanges = function (r) {
  11339. var newValue = this._names.getLocalName(r.selfIndex);
  11340. var oldValue = this._names.getFieldName(r.selfIndex);
  11341. if (!r.bindingRecord.callOnChanges())
  11342. return "";
  11343. return CHANGES_LOCAL + " = this.addChange(" + CHANGES_LOCAL + ", " + oldValue + ", " + newValue + ");";
  11344. };
  11345. /** @internal */
  11346. ChangeDetectorJITGenerator.prototype._maybeFirstInBinding = function (r) {
  11347. var prev = change_detection_util_1.ChangeDetectionUtil.protoByIndex(this.records, r.selfIndex - 1);
  11348. var firstInBinding = lang_1.isBlank(prev) || prev.bindingRecord !== r.bindingRecord;
  11349. return firstInBinding && !r.bindingRecord.isDirectiveLifecycle() ?
  11350. this._names.getPropertyBindingIndex() + " = " + r.propertyBindingIndex + ";" :
  11351. '';
  11352. };
  11353. /** @internal */
  11354. ChangeDetectorJITGenerator.prototype._maybeGenLastInDirective = function (r) {
  11355. if (!r.lastInDirective)
  11356. return "";
  11357. return "\n " + CHANGES_LOCAL + " = null;\n " + this._genNotifyOnPushDetectors(r) + "\n " + IS_CHANGED_LOCAL + " = false;\n ";
  11358. };
  11359. /** @internal */
  11360. ChangeDetectorJITGenerator.prototype._genOnCheck = function (r) {
  11361. var br = r.bindingRecord;
  11362. return "if (!throwOnChange) " + this._names.getDirectiveName(br.directiveRecord.directiveIndex) + ".ngDoCheck();";
  11363. };
  11364. /** @internal */
  11365. ChangeDetectorJITGenerator.prototype._genOnInit = function (r) {
  11366. var br = r.bindingRecord;
  11367. return "if (!throwOnChange && " + this._names.getStateName() + " === " + this.changeDetectorStateVarName + ".NeverChecked) " + this._names.getDirectiveName(br.directiveRecord.directiveIndex) + ".ngOnInit();";
  11368. };
  11369. /** @internal */
  11370. ChangeDetectorJITGenerator.prototype._genOnChange = function (r) {
  11371. var br = r.bindingRecord;
  11372. return "if (!throwOnChange && " + CHANGES_LOCAL + ") " + this._names.getDirectiveName(br.directiveRecord.directiveIndex) + ".ngOnChanges(" + CHANGES_LOCAL + ");";
  11373. };
  11374. /** @internal */
  11375. ChangeDetectorJITGenerator.prototype._genNotifyOnPushDetectors = function (r) {
  11376. var br = r.bindingRecord;
  11377. if (!r.lastInDirective || br.isDefaultChangeDetection())
  11378. return "";
  11379. var retVal = "\n if(" + IS_CHANGED_LOCAL + ") {\n " + this._names.getDetectorName(br.directiveRecord.directiveIndex) + ".markAsCheckOnce();\n }\n ";
  11380. return retVal;
  11381. };
  11382. return ChangeDetectorJITGenerator;
  11383. })();
  11384. exports.ChangeDetectorJITGenerator = ChangeDetectorJITGenerator;
  11385. /***/ },
  11386. /* 53 */
  11387. /***/ function(module, exports, __webpack_require__) {
  11388. var lang_1 = __webpack_require__(5);
  11389. var collection_1 = __webpack_require__(12);
  11390. // The names of these fields must be kept in sync with abstract_change_detector.ts or change
  11391. // detection will fail.
  11392. var _STATE_ACCESSOR = "state";
  11393. var _CONTEXT_ACCESSOR = "context";
  11394. var _PROP_BINDING_INDEX = "propertyBindingIndex";
  11395. var _DIRECTIVES_ACCESSOR = "directiveIndices";
  11396. var _DISPATCHER_ACCESSOR = "dispatcher";
  11397. var _LOCALS_ACCESSOR = "locals";
  11398. var _MODE_ACCESSOR = "mode";
  11399. var _PIPES_ACCESSOR = "pipes";
  11400. var _PROTOS_ACCESSOR = "protos";
  11401. exports.CONTEXT_ACCESSOR = "context";
  11402. // `context` is always first.
  11403. exports.CONTEXT_INDEX = 0;
  11404. var _FIELD_PREFIX = 'this.';
  11405. var _whiteSpaceRegExp = /\W/g;
  11406. /**
  11407. * Returns `s` with all non-identifier characters removed.
  11408. */
  11409. function sanitizeName(s) {
  11410. return lang_1.StringWrapper.replaceAll(s, _whiteSpaceRegExp, '');
  11411. }
  11412. exports.sanitizeName = sanitizeName;
  11413. /**
  11414. * Class responsible for providing field and local variable names for change detector classes.
  11415. * Also provides some convenience functions, for example, declaring variables, destroying pipes,
  11416. * and dehydrating the detector.
  11417. */
  11418. var CodegenNameUtil = (function () {
  11419. function CodegenNameUtil(_records, _eventBindings, _directiveRecords, _utilName) {
  11420. this._records = _records;
  11421. this._eventBindings = _eventBindings;
  11422. this._directiveRecords = _directiveRecords;
  11423. this._utilName = _utilName;
  11424. /** @internal */
  11425. this._sanitizedEventNames = new collection_1.Map();
  11426. this._sanitizedNames = collection_1.ListWrapper.createFixedSize(this._records.length + 1);
  11427. this._sanitizedNames[exports.CONTEXT_INDEX] = exports.CONTEXT_ACCESSOR;
  11428. for (var i = 0, iLen = this._records.length; i < iLen; ++i) {
  11429. this._sanitizedNames[i + 1] = sanitizeName("" + this._records[i].name + i);
  11430. }
  11431. for (var ebIndex = 0; ebIndex < _eventBindings.length; ++ebIndex) {
  11432. var eb = _eventBindings[ebIndex];
  11433. var names = [exports.CONTEXT_ACCESSOR];
  11434. for (var i = 0, iLen = eb.records.length; i < iLen; ++i) {
  11435. names.push(sanitizeName("" + eb.records[i].name + i + "_" + ebIndex));
  11436. }
  11437. this._sanitizedEventNames.set(eb, names);
  11438. }
  11439. }
  11440. /** @internal */
  11441. CodegenNameUtil.prototype._addFieldPrefix = function (name) { return "" + _FIELD_PREFIX + name; };
  11442. CodegenNameUtil.prototype.getDispatcherName = function () { return this._addFieldPrefix(_DISPATCHER_ACCESSOR); };
  11443. CodegenNameUtil.prototype.getPipesAccessorName = function () { return this._addFieldPrefix(_PIPES_ACCESSOR); };
  11444. CodegenNameUtil.prototype.getProtosName = function () { return this._addFieldPrefix(_PROTOS_ACCESSOR); };
  11445. CodegenNameUtil.prototype.getDirectivesAccessorName = function () { return this._addFieldPrefix(_DIRECTIVES_ACCESSOR); };
  11446. CodegenNameUtil.prototype.getLocalsAccessorName = function () { return this._addFieldPrefix(_LOCALS_ACCESSOR); };
  11447. CodegenNameUtil.prototype.getStateName = function () { return this._addFieldPrefix(_STATE_ACCESSOR); };
  11448. CodegenNameUtil.prototype.getModeName = function () { return this._addFieldPrefix(_MODE_ACCESSOR); };
  11449. CodegenNameUtil.prototype.getPropertyBindingIndex = function () { return this._addFieldPrefix(_PROP_BINDING_INDEX); };
  11450. CodegenNameUtil.prototype.getLocalName = function (idx) { return "l_" + this._sanitizedNames[idx]; };
  11451. CodegenNameUtil.prototype.getEventLocalName = function (eb, idx) {
  11452. return "l_" + this._sanitizedEventNames.get(eb)[idx];
  11453. };
  11454. CodegenNameUtil.prototype.getChangeName = function (idx) { return "c_" + this._sanitizedNames[idx]; };
  11455. /**
  11456. * Generate a statement initializing local variables used when detecting changes.
  11457. */
  11458. CodegenNameUtil.prototype.genInitLocals = function () {
  11459. var declarations = [];
  11460. var assignments = [];
  11461. for (var i = 0, iLen = this.getFieldCount(); i < iLen; ++i) {
  11462. if (i == exports.CONTEXT_INDEX) {
  11463. declarations.push(this.getLocalName(i) + " = " + this.getFieldName(i));
  11464. }
  11465. else {
  11466. var rec = this._records[i - 1];
  11467. if (rec.argumentToPureFunction) {
  11468. var changeName = this.getChangeName(i);
  11469. declarations.push(this.getLocalName(i) + "," + changeName);
  11470. assignments.push(changeName);
  11471. }
  11472. else {
  11473. declarations.push("" + this.getLocalName(i));
  11474. }
  11475. }
  11476. }
  11477. var assignmentsCode = collection_1.ListWrapper.isEmpty(assignments) ? '' : assignments.join('=') + " = false;";
  11478. return "var " + declarations.join(',') + ";" + assignmentsCode;
  11479. };
  11480. /**
  11481. * Generate a statement initializing local variables for event handlers.
  11482. */
  11483. CodegenNameUtil.prototype.genInitEventLocals = function () {
  11484. var _this = this;
  11485. var res = [(this.getLocalName(exports.CONTEXT_INDEX) + " = " + this.getFieldName(exports.CONTEXT_INDEX))];
  11486. this._sanitizedEventNames.forEach(function (names, eb) {
  11487. for (var i = 0; i < names.length; ++i) {
  11488. if (i !== exports.CONTEXT_INDEX) {
  11489. res.push("" + _this.getEventLocalName(eb, i));
  11490. }
  11491. }
  11492. });
  11493. return res.length > 1 ? "var " + res.join(',') + ";" : '';
  11494. };
  11495. CodegenNameUtil.prototype.getPreventDefaultAccesor = function () { return "preventDefault"; };
  11496. CodegenNameUtil.prototype.getFieldCount = function () { return this._sanitizedNames.length; };
  11497. CodegenNameUtil.prototype.getFieldName = function (idx) { return this._addFieldPrefix(this._sanitizedNames[idx]); };
  11498. CodegenNameUtil.prototype.getAllFieldNames = function () {
  11499. var fieldList = [];
  11500. for (var k = 0, kLen = this.getFieldCount(); k < kLen; ++k) {
  11501. if (k === 0 || this._records[k - 1].shouldBeChecked()) {
  11502. fieldList.push(this.getFieldName(k));
  11503. }
  11504. }
  11505. for (var i = 0, iLen = this._records.length; i < iLen; ++i) {
  11506. var rec = this._records[i];
  11507. if (rec.isPipeRecord()) {
  11508. fieldList.push(this.getPipeName(rec.selfIndex));
  11509. }
  11510. }
  11511. for (var j = 0, jLen = this._directiveRecords.length; j < jLen; ++j) {
  11512. var dRec = this._directiveRecords[j];
  11513. fieldList.push(this.getDirectiveName(dRec.directiveIndex));
  11514. if (!dRec.isDefaultChangeDetection()) {
  11515. fieldList.push(this.getDetectorName(dRec.directiveIndex));
  11516. }
  11517. }
  11518. return fieldList;
  11519. };
  11520. /**
  11521. * Generates statements which clear all fields so that the change detector is dehydrated.
  11522. */
  11523. CodegenNameUtil.prototype.genDehydrateFields = function () {
  11524. var fields = this.getAllFieldNames();
  11525. collection_1.ListWrapper.removeAt(fields, exports.CONTEXT_INDEX);
  11526. if (collection_1.ListWrapper.isEmpty(fields))
  11527. return '';
  11528. // At least one assignment.
  11529. fields.push(this._utilName + ".uninitialized;");
  11530. return fields.join(' = ');
  11531. };
  11532. /**
  11533. * Generates statements destroying all pipe variables.
  11534. */
  11535. CodegenNameUtil.prototype.genPipeOnDestroy = function () {
  11536. var _this = this;
  11537. return this._records.filter(function (r) { return r.isPipeRecord(); })
  11538. .map(function (r) { return (_this._utilName + ".callPipeOnDestroy(" + _this.getPipeName(r.selfIndex) + ");"); })
  11539. .join('\n');
  11540. };
  11541. CodegenNameUtil.prototype.getPipeName = function (idx) {
  11542. return this._addFieldPrefix(this._sanitizedNames[idx] + "_pipe");
  11543. };
  11544. CodegenNameUtil.prototype.getDirectiveName = function (d) {
  11545. return this._addFieldPrefix("directive_" + d.name);
  11546. };
  11547. CodegenNameUtil.prototype.getDetectorName = function (d) { return this._addFieldPrefix("detector_" + d.name); };
  11548. return CodegenNameUtil;
  11549. })();
  11550. exports.CodegenNameUtil = CodegenNameUtil;
  11551. /***/ },
  11552. /* 54 */
  11553. /***/ function(module, exports, __webpack_require__) {
  11554. var lang_1 = __webpack_require__(5);
  11555. var codegen_facade_1 = __webpack_require__(55);
  11556. var proto_record_1 = __webpack_require__(48);
  11557. var constants_1 = __webpack_require__(36);
  11558. var exceptions_1 = __webpack_require__(14);
  11559. /**
  11560. * Class responsible for providing change detection logic for change detector classes.
  11561. */
  11562. var CodegenLogicUtil = (function () {
  11563. function CodegenLogicUtil(_names, _utilName, _changeDetectorStateName, _changeDetection) {
  11564. this._names = _names;
  11565. this._utilName = _utilName;
  11566. this._changeDetectorStateName = _changeDetectorStateName;
  11567. this._changeDetection = _changeDetection;
  11568. }
  11569. /**
  11570. * Generates a statement which updates the local variable representing `protoRec` with the current
  11571. * value of the record. Used by property bindings.
  11572. */
  11573. CodegenLogicUtil.prototype.genPropertyBindingEvalValue = function (protoRec) {
  11574. var _this = this;
  11575. return this._genEvalValue(protoRec, function (idx) { return _this._names.getLocalName(idx); }, this._names.getLocalsAccessorName());
  11576. };
  11577. /**
  11578. * Generates a statement which updates the local variable representing `protoRec` with the current
  11579. * value of the record. Used by event bindings.
  11580. */
  11581. CodegenLogicUtil.prototype.genEventBindingEvalValue = function (eventRecord, protoRec) {
  11582. var _this = this;
  11583. return this._genEvalValue(protoRec, function (idx) { return _this._names.getEventLocalName(eventRecord, idx); }, "locals");
  11584. };
  11585. CodegenLogicUtil.prototype._genEvalValue = function (protoRec, getLocalName, localsAccessor) {
  11586. var context = (protoRec.contextIndex == -1) ?
  11587. this._names.getDirectiveName(protoRec.directiveIndex) :
  11588. getLocalName(protoRec.contextIndex);
  11589. var argString = protoRec.args.map(function (arg) { return getLocalName(arg); }).join(", ");
  11590. var rhs;
  11591. switch (protoRec.mode) {
  11592. case proto_record_1.RecordType.Self:
  11593. rhs = context;
  11594. break;
  11595. case proto_record_1.RecordType.Const:
  11596. rhs = codegen_facade_1.codify(protoRec.funcOrValue);
  11597. break;
  11598. case proto_record_1.RecordType.PropertyRead:
  11599. rhs = this._observe(context + "." + protoRec.name, protoRec);
  11600. break;
  11601. case proto_record_1.RecordType.SafeProperty:
  11602. var read = this._observe(context + "." + protoRec.name, protoRec);
  11603. rhs =
  11604. this._utilName + ".isValueBlank(" + context + ") ? null : " + this._observe(read, protoRec);
  11605. break;
  11606. case proto_record_1.RecordType.PropertyWrite:
  11607. rhs = context + "." + protoRec.name + " = " + getLocalName(protoRec.args[0]);
  11608. break;
  11609. case proto_record_1.RecordType.Local:
  11610. rhs = this._observe(localsAccessor + ".get(" + codegen_facade_1.rawString(protoRec.name) + ")", protoRec);
  11611. break;
  11612. case proto_record_1.RecordType.InvokeMethod:
  11613. rhs = this._observe(context + "." + protoRec.name + "(" + argString + ")", protoRec);
  11614. break;
  11615. case proto_record_1.RecordType.SafeMethodInvoke:
  11616. var invoke = context + "." + protoRec.name + "(" + argString + ")";
  11617. rhs =
  11618. this._utilName + ".isValueBlank(" + context + ") ? null : " + this._observe(invoke, protoRec);
  11619. break;
  11620. case proto_record_1.RecordType.InvokeClosure:
  11621. rhs = context + "(" + argString + ")";
  11622. break;
  11623. case proto_record_1.RecordType.PrimitiveOp:
  11624. rhs = this._utilName + "." + protoRec.name + "(" + argString + ")";
  11625. break;
  11626. case proto_record_1.RecordType.CollectionLiteral:
  11627. rhs = this._utilName + "." + protoRec.name + "(" + argString + ")";
  11628. break;
  11629. case proto_record_1.RecordType.Interpolate:
  11630. rhs = this._genInterpolation(protoRec);
  11631. break;
  11632. case proto_record_1.RecordType.KeyedRead:
  11633. rhs = this._observe(context + "[" + getLocalName(protoRec.args[0]) + "]", protoRec);
  11634. break;
  11635. case proto_record_1.RecordType.KeyedWrite:
  11636. rhs = context + "[" + getLocalName(protoRec.args[0]) + "] = " + getLocalName(protoRec.args[1]);
  11637. break;
  11638. case proto_record_1.RecordType.Chain:
  11639. rhs = 'null';
  11640. break;
  11641. default:
  11642. throw new exceptions_1.BaseException("Unknown operation " + protoRec.mode);
  11643. }
  11644. return getLocalName(protoRec.selfIndex) + " = " + rhs + ";";
  11645. };
  11646. /** @internal */
  11647. CodegenLogicUtil.prototype._observe = function (exp, rec) {
  11648. // This is an experimental feature. Works only in Dart.
  11649. if (this._changeDetection === constants_1.ChangeDetectionStrategy.OnPushObserve) {
  11650. return "this.observeValue(" + exp + ", " + rec.selfIndex + ")";
  11651. }
  11652. else {
  11653. return exp;
  11654. }
  11655. };
  11656. CodegenLogicUtil.prototype.genPropertyBindingTargets = function (propertyBindingTargets, genDebugInfo) {
  11657. var _this = this;
  11658. var bs = propertyBindingTargets.map(function (b) {
  11659. if (lang_1.isBlank(b))
  11660. return "null";
  11661. var debug = genDebugInfo ? codegen_facade_1.codify(b.debug) : "null";
  11662. 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 + ")";
  11663. });
  11664. return "[" + bs.join(", ") + "]";
  11665. };
  11666. CodegenLogicUtil.prototype.genDirectiveIndices = function (directiveRecords) {
  11667. var _this = this;
  11668. var bs = directiveRecords.map(function (b) {
  11669. return (_this._utilName + ".directiveIndex(" + b.directiveIndex.elementIndex + ", " + b.directiveIndex.directiveIndex + ")");
  11670. });
  11671. return "[" + bs.join(", ") + "]";
  11672. };
  11673. /** @internal */
  11674. CodegenLogicUtil.prototype._genInterpolation = function (protoRec) {
  11675. var iVals = [];
  11676. for (var i = 0; i < protoRec.args.length; ++i) {
  11677. iVals.push(codegen_facade_1.codify(protoRec.fixedArgs[i]));
  11678. iVals.push(this._utilName + ".s(" + this._names.getLocalName(protoRec.args[i]) + ")");
  11679. }
  11680. iVals.push(codegen_facade_1.codify(protoRec.fixedArgs[protoRec.args.length]));
  11681. return codegen_facade_1.combineGeneratedStrings(iVals);
  11682. };
  11683. CodegenLogicUtil.prototype.genHydrateDirectives = function (directiveRecords) {
  11684. var res = [];
  11685. for (var i = 0; i < directiveRecords.length; ++i) {
  11686. var r = directiveRecords[i];
  11687. res.push(this._names.getDirectiveName(r.directiveIndex) + " = " + this._genReadDirective(i) + ";");
  11688. }
  11689. return res.join("\n");
  11690. };
  11691. CodegenLogicUtil.prototype._genReadDirective = function (index) {
  11692. // This is an experimental feature. Works only in Dart.
  11693. if (this._changeDetection === constants_1.ChangeDetectionStrategy.OnPushObserve) {
  11694. return "this.observeDirective(this.getDirectiveFor(directives, " + index + "), " + index + ")";
  11695. }
  11696. else {
  11697. return "this.getDirectiveFor(directives, " + index + ")";
  11698. }
  11699. };
  11700. CodegenLogicUtil.prototype.genHydrateDetectors = function (directiveRecords) {
  11701. var res = [];
  11702. for (var i = 0; i < directiveRecords.length; ++i) {
  11703. var r = directiveRecords[i];
  11704. if (!r.isDefaultChangeDetection()) {
  11705. res.push(this._names.getDetectorName(r.directiveIndex) + " = this.getDetectorFor(directives, " + i + ");");
  11706. }
  11707. }
  11708. return res.join("\n");
  11709. };
  11710. CodegenLogicUtil.prototype.genContentLifecycleCallbacks = function (directiveRecords) {
  11711. var res = [];
  11712. var eq = lang_1.IS_DART ? '==' : '===';
  11713. // NOTE(kegluneq): Order is important!
  11714. for (var i = directiveRecords.length - 1; i >= 0; --i) {
  11715. var dir = directiveRecords[i];
  11716. if (dir.callAfterContentInit) {
  11717. res.push("if(" + this._names.getStateName() + " " + eq + " " + this._changeDetectorStateName + ".NeverChecked) " + this._names.getDirectiveName(dir.directiveIndex) + ".ngAfterContentInit();");
  11718. }
  11719. if (dir.callAfterContentChecked) {
  11720. res.push(this._names.getDirectiveName(dir.directiveIndex) + ".ngAfterContentChecked();");
  11721. }
  11722. }
  11723. return res;
  11724. };
  11725. CodegenLogicUtil.prototype.genViewLifecycleCallbacks = function (directiveRecords) {
  11726. var res = [];
  11727. var eq = lang_1.IS_DART ? '==' : '===';
  11728. // NOTE(kegluneq): Order is important!
  11729. for (var i = directiveRecords.length - 1; i >= 0; --i) {
  11730. var dir = directiveRecords[i];
  11731. if (dir.callAfterViewInit) {
  11732. res.push("if(" + this._names.getStateName() + " " + eq + " " + this._changeDetectorStateName + ".NeverChecked) " + this._names.getDirectiveName(dir.directiveIndex) + ".ngAfterViewInit();");
  11733. }
  11734. if (dir.callAfterViewChecked) {
  11735. res.push(this._names.getDirectiveName(dir.directiveIndex) + ".ngAfterViewChecked();");
  11736. }
  11737. }
  11738. return res;
  11739. };
  11740. return CodegenLogicUtil;
  11741. })();
  11742. exports.CodegenLogicUtil = CodegenLogicUtil;
  11743. /***/ },
  11744. /* 55 */
  11745. /***/ function(module, exports) {
  11746. /**
  11747. * Converts `funcOrValue` to a string which can be used in generated code.
  11748. */
  11749. function codify(obj) {
  11750. return JSON.stringify(obj);
  11751. }
  11752. exports.codify = codify;
  11753. function rawString(str) {
  11754. return "'" + str + "'";
  11755. }
  11756. exports.rawString = rawString;
  11757. /**
  11758. * Combine the strings of generated code into a single interpolated string.
  11759. * Each element of `vals` is expected to be a string literal or a codegen'd
  11760. * call to a method returning a string.
  11761. */
  11762. function combineGeneratedStrings(vals) {
  11763. return vals.join(' + ');
  11764. }
  11765. exports.combineGeneratedStrings = combineGeneratedStrings;
  11766. /***/ },
  11767. /* 56 */
  11768. /***/ function(module, exports, __webpack_require__) {
  11769. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  11770. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  11771. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  11772. 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;
  11773. return c > 3 && r && Object.defineProperty(target, key, r), r;
  11774. };
  11775. var __metadata = (this && this.__metadata) || function (k, v) {
  11776. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  11777. };
  11778. var lang_1 = __webpack_require__(5);
  11779. /**
  11780. * Defines template and style encapsulation options available for Component's {@link View}.
  11781. *
  11782. * See {@link ViewMetadata#encapsulation}.
  11783. */
  11784. (function (ViewEncapsulation) {
  11785. /**
  11786. * Emulate `Native` scoping of styles by adding an attribute containing surrogate id to the Host
  11787. * Element and pre-processing the style rules provided via
  11788. * {@link ViewMetadata#styles} or {@link ViewMetadata#stylesUrls}, and adding the new Host Element
  11789. * attribute to all selectors.
  11790. *
  11791. * This is the default option.
  11792. */
  11793. ViewEncapsulation[ViewEncapsulation["Emulated"] = 0] = "Emulated";
  11794. /**
  11795. * Use the native encapsulation mechanism of the renderer.
  11796. *
  11797. * For the DOM this means using [Shadow DOM](https://w3c.github.io/webcomponents/spec/shadow/) and
  11798. * creating a ShadowRoot for Component's Host Element.
  11799. */
  11800. ViewEncapsulation[ViewEncapsulation["Native"] = 1] = "Native";
  11801. /**
  11802. * Don't provide any template or style encapsulation.
  11803. */
  11804. ViewEncapsulation[ViewEncapsulation["None"] = 2] = "None";
  11805. })(exports.ViewEncapsulation || (exports.ViewEncapsulation = {}));
  11806. var ViewEncapsulation = exports.ViewEncapsulation;
  11807. exports.VIEW_ENCAPSULATION_VALUES = [ViewEncapsulation.Emulated, ViewEncapsulation.Native, ViewEncapsulation.None];
  11808. /**
  11809. * Metadata properties available for configuring Views.
  11810. *
  11811. * Each Angular component requires a single `@Component` and at least one `@View` annotation. The
  11812. * `@View` annotation specifies the HTML template to use, and lists the directives that are active
  11813. * within the template.
  11814. *
  11815. * When a component is instantiated, the template is loaded into the component's shadow root, and
  11816. * the expressions and statements in the template are evaluated against the component.
  11817. *
  11818. * For details on the `@Component` annotation, see {@link ComponentMetadata}.
  11819. *
  11820. * ### Example
  11821. *
  11822. * ```
  11823. * @Component({
  11824. * selector: 'greet',
  11825. * template: 'Hello {{name}}!',
  11826. * directives: [GreetUser, Bold]
  11827. * })
  11828. * class Greet {
  11829. * name: string;
  11830. *
  11831. * constructor() {
  11832. * this.name = 'World';
  11833. * }
  11834. * }
  11835. * ```
  11836. */
  11837. var ViewMetadata = (function () {
  11838. function ViewMetadata(_a) {
  11839. 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;
  11840. this.templateUrl = templateUrl;
  11841. this.template = template;
  11842. this.styleUrls = styleUrls;
  11843. this.styles = styles;
  11844. this.directives = directives;
  11845. this.pipes = pipes;
  11846. this.encapsulation = encapsulation;
  11847. }
  11848. ViewMetadata = __decorate([
  11849. lang_1.CONST(),
  11850. __metadata('design:paramtypes', [Object])
  11851. ], ViewMetadata);
  11852. return ViewMetadata;
  11853. })();
  11854. exports.ViewMetadata = ViewMetadata;
  11855. /***/ },
  11856. /* 57 */
  11857. /***/ function(module, exports, __webpack_require__) {
  11858. // Public API for util
  11859. var decorators_1 = __webpack_require__(9);
  11860. exports.Class = decorators_1.Class;
  11861. /***/ },
  11862. /* 58 */
  11863. /***/ function(module, exports, __webpack_require__) {
  11864. var lang_1 = __webpack_require__(5);
  11865. exports.enableProdMode = lang_1.enableProdMode;
  11866. /***/ },
  11867. /* 59 */
  11868. /***/ function(module, exports, __webpack_require__) {
  11869. // Public API for Facade
  11870. var lang_1 = __webpack_require__(5);
  11871. exports.Type = lang_1.Type;
  11872. var async_1 = __webpack_require__(60);
  11873. exports.EventEmitter = async_1.EventEmitter;
  11874. var exceptions_1 = __webpack_require__(14);
  11875. exports.WrappedException = exceptions_1.WrappedException;
  11876. var exception_handler_1 = __webpack_require__(15);
  11877. exports.ExceptionHandler = exception_handler_1.ExceptionHandler;
  11878. /***/ },
  11879. /* 60 */
  11880. /***/ function(module, exports, __webpack_require__) {
  11881. var __extends = (this && this.__extends) || function (d, b) {
  11882. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  11883. function __() { this.constructor = d; }
  11884. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  11885. };
  11886. var lang_1 = __webpack_require__(5);
  11887. var promise_1 = __webpack_require__(61);
  11888. exports.PromiseWrapper = promise_1.PromiseWrapper;
  11889. exports.Promise = promise_1.Promise;
  11890. var Subject_1 = __webpack_require__(62);
  11891. var fromPromise_1 = __webpack_require__(63);
  11892. var toPromise_1 = __webpack_require__(64);
  11893. var Observable_1 = __webpack_require__(62);
  11894. exports.Observable = Observable_1.Observable;
  11895. var Subject_2 = __webpack_require__(62);
  11896. exports.Subject = Subject_2.Subject;
  11897. var TimerWrapper = (function () {
  11898. function TimerWrapper() {
  11899. }
  11900. TimerWrapper.setTimeout = function (fn, millis) {
  11901. return lang_1.global.setTimeout(fn, millis);
  11902. };
  11903. TimerWrapper.clearTimeout = function (id) { lang_1.global.clearTimeout(id); };
  11904. TimerWrapper.setInterval = function (fn, millis) {
  11905. return lang_1.global.setInterval(fn, millis);
  11906. };
  11907. TimerWrapper.clearInterval = function (id) { lang_1.global.clearInterval(id); };
  11908. return TimerWrapper;
  11909. })();
  11910. exports.TimerWrapper = TimerWrapper;
  11911. var ObservableWrapper = (function () {
  11912. function ObservableWrapper() {
  11913. }
  11914. // TODO(vsavkin): when we use rxnext, try inferring the generic type from the first arg
  11915. ObservableWrapper.subscribe = function (emitter, onNext, onError, onComplete) {
  11916. if (onComplete === void 0) { onComplete = function () { }; }
  11917. onError = (typeof onError === "function") && onError || lang_1.noop;
  11918. onComplete = (typeof onComplete === "function") && onComplete || lang_1.noop;
  11919. return emitter.subscribe({ next: onNext, error: onError, complete: onComplete });
  11920. };
  11921. ObservableWrapper.isObservable = function (obs) { return !!obs.subscribe; };
  11922. /**
  11923. * Returns whether `obs` has any subscribers listening to events.
  11924. */
  11925. ObservableWrapper.hasSubscribers = function (obs) { return obs.observers.length > 0; };
  11926. ObservableWrapper.dispose = function (subscription) { subscription.unsubscribe(); };
  11927. /**
  11928. * @deprecated - use callEmit() instead
  11929. */
  11930. ObservableWrapper.callNext = function (emitter, value) { emitter.next(value); };
  11931. ObservableWrapper.callEmit = function (emitter, value) { emitter.emit(value); };
  11932. ObservableWrapper.callError = function (emitter, error) { emitter.error(error); };
  11933. ObservableWrapper.callComplete = function (emitter) { emitter.complete(); };
  11934. ObservableWrapper.fromPromise = function (promise) {
  11935. return fromPromise_1.PromiseObservable.create(promise);
  11936. };
  11937. ObservableWrapper.toPromise = function (obj) { return toPromise_1.toPromise.call(obj); };
  11938. return ObservableWrapper;
  11939. })();
  11940. exports.ObservableWrapper = ObservableWrapper;
  11941. /**
  11942. * Use by directives and components to emit custom Events.
  11943. *
  11944. * ### Examples
  11945. *
  11946. * In the following example, `Zippy` alternatively emits `open` and `close` events when its
  11947. * title gets clicked:
  11948. *
  11949. * ```
  11950. * @Component({
  11951. * selector: 'zippy',
  11952. * template: `
  11953. * <div class="zippy">
  11954. * <div (click)="toggle()">Toggle</div>
  11955. * <div [hidden]="!visible">
  11956. * <ng-content></ng-content>
  11957. * </div>
  11958. * </div>`})
  11959. * export class Zippy {
  11960. * visible: boolean = true;
  11961. * @Output() open: EventEmitter<any> = new EventEmitter();
  11962. * @Output() close: EventEmitter<any> = new EventEmitter();
  11963. *
  11964. * toggle() {
  11965. * this.visible = !this.visible;
  11966. * if (this.visible) {
  11967. * this.open.emit(null);
  11968. * } else {
  11969. * this.close.emit(null);
  11970. * }
  11971. * }
  11972. * }
  11973. * ```
  11974. *
  11975. * Use Rx.Observable but provides an adapter to make it work as specified here:
  11976. * https://github.com/jhusain/observable-spec
  11977. *
  11978. * Once a reference implementation of the spec is available, switch to it.
  11979. */
  11980. var EventEmitter = (function (_super) {
  11981. __extends(EventEmitter, _super);
  11982. /**
  11983. * Creates an instance of [EventEmitter], which depending on [isAsync],
  11984. * delivers events synchronously or asynchronously.
  11985. */
  11986. function EventEmitter(isAsync) {
  11987. if (isAsync === void 0) { isAsync = true; }
  11988. _super.call(this);
  11989. this._isAsync = isAsync;
  11990. }
  11991. EventEmitter.prototype.emit = function (value) { _super.prototype.next.call(this, value); };
  11992. /**
  11993. * @deprecated - use .emit(value) instead
  11994. */
  11995. EventEmitter.prototype.next = function (value) { _super.prototype.next.call(this, value); };
  11996. EventEmitter.prototype.subscribe = function (generatorOrNext, error, complete) {
  11997. var schedulerFn;
  11998. var errorFn = function (err) { return null; };
  11999. var completeFn = function () { return null; };
  12000. if (generatorOrNext && typeof generatorOrNext === 'object') {
  12001. schedulerFn = this._isAsync ? function (value) { setTimeout(function () { return generatorOrNext.next(value); }); } :
  12002. function (value) { generatorOrNext.next(value); };
  12003. if (generatorOrNext.error) {
  12004. errorFn = this._isAsync ? function (err) { setTimeout(function () { return generatorOrNext.error(err); }); } :
  12005. function (err) { generatorOrNext.error(err); };
  12006. }
  12007. if (generatorOrNext.complete) {
  12008. completeFn = this._isAsync ? function () { setTimeout(function () { return generatorOrNext.complete(); }); } :
  12009. function () { generatorOrNext.complete(); };
  12010. }
  12011. }
  12012. else {
  12013. schedulerFn = this._isAsync ? function (value) { setTimeout(function () { return generatorOrNext(value); }); } :
  12014. function (value) { generatorOrNext(value); };
  12015. if (error) {
  12016. errorFn =
  12017. this._isAsync ? function (err) { setTimeout(function () { return error(err); }); } : function (err) { error(err); };
  12018. }
  12019. if (complete) {
  12020. completeFn =
  12021. this._isAsync ? function () { setTimeout(function () { return complete(); }); } : function () { complete(); };
  12022. }
  12023. }
  12024. return _super.prototype.subscribe.call(this, schedulerFn, errorFn, completeFn);
  12025. };
  12026. return EventEmitter;
  12027. })(Subject_1.Subject);
  12028. exports.EventEmitter = EventEmitter;
  12029. /***/ },
  12030. /* 61 */
  12031. /***/ function(module, exports) {
  12032. // Promises are put into their own facade file so that they can be used without
  12033. // introducing a dependency on rxjs. They are re-exported through facade/async.
  12034. var PromiseWrapper = (function () {
  12035. function PromiseWrapper() {
  12036. }
  12037. PromiseWrapper.resolve = function (obj) { return Promise.resolve(obj); };
  12038. PromiseWrapper.reject = function (obj, _) { return Promise.reject(obj); };
  12039. // Note: We can't rename this method into `catch`, as this is not a valid
  12040. // method name in Dart.
  12041. PromiseWrapper.catchError = function (promise, onError) {
  12042. return promise.catch(onError);
  12043. };
  12044. PromiseWrapper.all = function (promises) {
  12045. if (promises.length == 0)
  12046. return Promise.resolve([]);
  12047. return Promise.all(promises);
  12048. };
  12049. PromiseWrapper.then = function (promise, success, rejection) {
  12050. return promise.then(success, rejection);
  12051. };
  12052. PromiseWrapper.wrap = function (computation) {
  12053. return new Promise(function (res, rej) {
  12054. try {
  12055. res(computation());
  12056. }
  12057. catch (e) {
  12058. rej(e);
  12059. }
  12060. });
  12061. };
  12062. PromiseWrapper.scheduleMicrotask = function (computation) {
  12063. PromiseWrapper.then(PromiseWrapper.resolve(null), computation, function (_) { });
  12064. };
  12065. PromiseWrapper.isPromise = function (obj) { return obj instanceof Promise; };
  12066. PromiseWrapper.completer = function () {
  12067. var resolve;
  12068. var reject;
  12069. var p = new Promise(function (res, rej) {
  12070. resolve = res;
  12071. reject = rej;
  12072. });
  12073. return { promise: p, resolve: resolve, reject: reject };
  12074. };
  12075. return PromiseWrapper;
  12076. })();
  12077. exports.PromiseWrapper = PromiseWrapper;
  12078. /***/ },
  12079. /* 62 */
  12080. /***/ function(module, exports) {
  12081. module.exports = __WEBPACK_EXTERNAL_MODULE_62__;
  12082. /***/ },
  12083. /* 63 */
  12084. /***/ function(module, exports) {
  12085. module.exports = __WEBPACK_EXTERNAL_MODULE_63__;
  12086. /***/ },
  12087. /* 64 */
  12088. /***/ function(module, exports) {
  12089. module.exports = __WEBPACK_EXTERNAL_MODULE_64__;
  12090. /***/ },
  12091. /* 65 */
  12092. /***/ function(module, exports, __webpack_require__) {
  12093. var __extends = (this && this.__extends) || function (d, b) {
  12094. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  12095. function __() { this.constructor = d; }
  12096. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  12097. };
  12098. var ng_zone_1 = __webpack_require__(66);
  12099. var lang_1 = __webpack_require__(5);
  12100. var di_1 = __webpack_require__(6);
  12101. var application_tokens_1 = __webpack_require__(67);
  12102. var async_1 = __webpack_require__(60);
  12103. var collection_1 = __webpack_require__(12);
  12104. var testability_1 = __webpack_require__(68);
  12105. var dynamic_component_loader_1 = __webpack_require__(69);
  12106. var exceptions_1 = __webpack_require__(14);
  12107. var view_ref_1 = __webpack_require__(77);
  12108. var console_1 = __webpack_require__(97);
  12109. var profile_1 = __webpack_require__(45);
  12110. var lang_2 = __webpack_require__(5);
  12111. /**
  12112. * Construct providers specific to an individual root component.
  12113. */
  12114. function _componentProviders(appComponentType) {
  12115. return [
  12116. di_1.provide(application_tokens_1.APP_COMPONENT, { useValue: appComponentType }),
  12117. di_1.provide(application_tokens_1.APP_COMPONENT_REF_PROMISE, {
  12118. useFactory: function (dynamicComponentLoader, appRef, injector) {
  12119. // Save the ComponentRef for disposal later.
  12120. var ref;
  12121. // TODO(rado): investigate whether to support providers on root component.
  12122. return dynamicComponentLoader.loadAsRoot(appComponentType, null, injector, function () { appRef._unloadComponent(ref); })
  12123. .then(function (componentRef) {
  12124. ref = componentRef;
  12125. if (lang_1.isPresent(componentRef.location.nativeElement)) {
  12126. injector.get(testability_1.TestabilityRegistry)
  12127. .registerApplication(componentRef.location.nativeElement, injector.get(testability_1.Testability));
  12128. }
  12129. return componentRef;
  12130. });
  12131. },
  12132. deps: [dynamic_component_loader_1.DynamicComponentLoader, ApplicationRef, di_1.Injector]
  12133. }),
  12134. di_1.provide(appComponentType, {
  12135. useFactory: function (p) { return p.then(function (ref) { return ref.instance; }); },
  12136. deps: [application_tokens_1.APP_COMPONENT_REF_PROMISE]
  12137. }),
  12138. ];
  12139. }
  12140. /**
  12141. * Create an Angular zone.
  12142. */
  12143. function createNgZone() {
  12144. return new ng_zone_1.NgZone({ enableLongStackTrace: lang_1.assertionsEnabled() });
  12145. }
  12146. exports.createNgZone = createNgZone;
  12147. var _platform;
  12148. var _platformProviders;
  12149. /**
  12150. * Initialize the Angular 'platform' on the page.
  12151. *
  12152. * See {@link PlatformRef} for details on the Angular platform.
  12153. *
  12154. * It is also possible to specify providers to be made in the new platform. These providers
  12155. * will be shared between all applications on the page. For example, an abstraction for
  12156. * the browser cookie jar should be bound at the platform level, because there is only one
  12157. * cookie jar regardless of how many applications on the page will be accessing it.
  12158. *
  12159. * The platform function can be called multiple times as long as the same list of providers
  12160. * is passed into each call. If the platform function is called with a different set of
  12161. * provides, Angular will throw an exception.
  12162. */
  12163. function platform(providers) {
  12164. lang_2.lockMode();
  12165. if (lang_1.isPresent(_platform)) {
  12166. if (collection_1.ListWrapper.equals(_platformProviders, providers)) {
  12167. return _platform;
  12168. }
  12169. else {
  12170. throw new exceptions_1.BaseException("platform cannot be initialized with different sets of providers.");
  12171. }
  12172. }
  12173. else {
  12174. return _createPlatform(providers);
  12175. }
  12176. }
  12177. exports.platform = platform;
  12178. /**
  12179. * Dispose the existing platform.
  12180. */
  12181. function disposePlatform() {
  12182. if (lang_1.isPresent(_platform)) {
  12183. _platform.dispose();
  12184. _platform = null;
  12185. }
  12186. }
  12187. exports.disposePlatform = disposePlatform;
  12188. function _createPlatform(providers) {
  12189. _platformProviders = providers;
  12190. var injector = di_1.Injector.resolveAndCreate(providers);
  12191. _platform = new PlatformRef_(injector, function () {
  12192. _platform = null;
  12193. _platformProviders = null;
  12194. });
  12195. _runPlatformInitializers(injector);
  12196. return _platform;
  12197. }
  12198. function _runPlatformInitializers(injector) {
  12199. var inits = injector.getOptional(application_tokens_1.PLATFORM_INITIALIZER);
  12200. if (lang_1.isPresent(inits))
  12201. inits.forEach(function (init) { return init(); });
  12202. }
  12203. /**
  12204. * The Angular platform is the entry point for Angular on a web page. Each page
  12205. * has exactly one platform, and services (such as reflection) which are common
  12206. * to every Angular application running on the page are bound in its scope.
  12207. *
  12208. * A page's platform is initialized implicitly when {@link bootstrap}() is called, or
  12209. * explicitly by calling {@link platform}().
  12210. */
  12211. var PlatformRef = (function () {
  12212. function PlatformRef() {
  12213. }
  12214. Object.defineProperty(PlatformRef.prototype, "injector", {
  12215. /**
  12216. * Retrieve the platform {@link Injector}, which is the parent injector for
  12217. * every Angular application on the page and provides singleton providers.
  12218. */
  12219. get: function () { return exceptions_1.unimplemented(); },
  12220. enumerable: true,
  12221. configurable: true
  12222. });
  12223. ;
  12224. return PlatformRef;
  12225. })();
  12226. exports.PlatformRef = PlatformRef;
  12227. var PlatformRef_ = (function (_super) {
  12228. __extends(PlatformRef_, _super);
  12229. function PlatformRef_(_injector, _dispose) {
  12230. _super.call(this);
  12231. this._injector = _injector;
  12232. this._dispose = _dispose;
  12233. /** @internal */
  12234. this._applications = [];
  12235. /** @internal */
  12236. this._disposeListeners = [];
  12237. }
  12238. PlatformRef_.prototype.registerDisposeListener = function (dispose) { this._disposeListeners.push(dispose); };
  12239. Object.defineProperty(PlatformRef_.prototype, "injector", {
  12240. get: function () { return this._injector; },
  12241. enumerable: true,
  12242. configurable: true
  12243. });
  12244. PlatformRef_.prototype.application = function (providers) {
  12245. var app = this._initApp(createNgZone(), providers);
  12246. return app;
  12247. };
  12248. PlatformRef_.prototype.asyncApplication = function (bindingFn, additionalProviders) {
  12249. var _this = this;
  12250. var zone = createNgZone();
  12251. var completer = async_1.PromiseWrapper.completer();
  12252. zone.run(function () {
  12253. async_1.PromiseWrapper.then(bindingFn(zone), function (providers) {
  12254. if (lang_1.isPresent(additionalProviders)) {
  12255. providers = collection_1.ListWrapper.concat(providers, additionalProviders);
  12256. }
  12257. completer.resolve(_this._initApp(zone, providers));
  12258. });
  12259. });
  12260. return completer.promise;
  12261. };
  12262. PlatformRef_.prototype._initApp = function (zone, providers) {
  12263. var _this = this;
  12264. var injector;
  12265. var app;
  12266. zone.run(function () {
  12267. providers = collection_1.ListWrapper.concat(providers, [
  12268. di_1.provide(ng_zone_1.NgZone, { useValue: zone }),
  12269. di_1.provide(ApplicationRef, { useFactory: function () { return app; }, deps: [] })
  12270. ]);
  12271. var exceptionHandler;
  12272. try {
  12273. injector = _this.injector.resolveAndCreateChild(providers);
  12274. exceptionHandler = injector.get(exceptions_1.ExceptionHandler);
  12275. zone.overrideOnErrorHandler(function (e, s) { return exceptionHandler.call(e, s); });
  12276. }
  12277. catch (e) {
  12278. if (lang_1.isPresent(exceptionHandler)) {
  12279. exceptionHandler.call(e, e.stack);
  12280. }
  12281. else {
  12282. lang_1.print(e.toString());
  12283. }
  12284. }
  12285. });
  12286. app = new ApplicationRef_(this, zone, injector);
  12287. this._applications.push(app);
  12288. _runAppInitializers(injector);
  12289. return app;
  12290. };
  12291. PlatformRef_.prototype.dispose = function () {
  12292. collection_1.ListWrapper.clone(this._applications).forEach(function (app) { return app.dispose(); });
  12293. this._disposeListeners.forEach(function (dispose) { return dispose(); });
  12294. this._dispose();
  12295. };
  12296. /** @internal */
  12297. PlatformRef_.prototype._applicationDisposed = function (app) { collection_1.ListWrapper.remove(this._applications, app); };
  12298. return PlatformRef_;
  12299. })(PlatformRef);
  12300. exports.PlatformRef_ = PlatformRef_;
  12301. function _runAppInitializers(injector) {
  12302. var inits = injector.getOptional(application_tokens_1.APP_INITIALIZER);
  12303. if (lang_1.isPresent(inits))
  12304. inits.forEach(function (init) { return init(); });
  12305. }
  12306. /**
  12307. * A reference to an Angular application running on a page.
  12308. *
  12309. * For more about Angular applications, see the documentation for {@link bootstrap}.
  12310. */
  12311. var ApplicationRef = (function () {
  12312. function ApplicationRef() {
  12313. }
  12314. Object.defineProperty(ApplicationRef.prototype, "injector", {
  12315. /**
  12316. * Retrieve the application {@link Injector}.
  12317. */
  12318. get: function () { return exceptions_1.unimplemented(); },
  12319. enumerable: true,
  12320. configurable: true
  12321. });
  12322. ;
  12323. Object.defineProperty(ApplicationRef.prototype, "zone", {
  12324. /**
  12325. * Retrieve the application {@link NgZone}.
  12326. */
  12327. get: function () { return exceptions_1.unimplemented(); },
  12328. enumerable: true,
  12329. configurable: true
  12330. });
  12331. ;
  12332. Object.defineProperty(ApplicationRef.prototype, "componentTypes", {
  12333. /**
  12334. * Get a list of component types registered to this application.
  12335. */
  12336. get: function () { return exceptions_1.unimplemented(); },
  12337. enumerable: true,
  12338. configurable: true
  12339. });
  12340. ;
  12341. return ApplicationRef;
  12342. })();
  12343. exports.ApplicationRef = ApplicationRef;
  12344. var ApplicationRef_ = (function (_super) {
  12345. __extends(ApplicationRef_, _super);
  12346. function ApplicationRef_(_platform, _zone, _injector) {
  12347. var _this = this;
  12348. _super.call(this);
  12349. this._platform = _platform;
  12350. this._zone = _zone;
  12351. this._injector = _injector;
  12352. /** @internal */
  12353. this._bootstrapListeners = [];
  12354. /** @internal */
  12355. this._disposeListeners = [];
  12356. /** @internal */
  12357. this._rootComponents = [];
  12358. /** @internal */
  12359. this._rootComponentTypes = [];
  12360. /** @internal */
  12361. this._changeDetectorRefs = [];
  12362. /** @internal */
  12363. this._runningTick = false;
  12364. /** @internal */
  12365. this._enforceNoNewChanges = false;
  12366. if (lang_1.isPresent(this._zone)) {
  12367. async_1.ObservableWrapper.subscribe(this._zone.onTurnDone, function (_) { _this._zone.run(function () { _this.tick(); }); });
  12368. }
  12369. this._enforceNoNewChanges = lang_1.assertionsEnabled();
  12370. }
  12371. ApplicationRef_.prototype.registerBootstrapListener = function (listener) {
  12372. this._bootstrapListeners.push(listener);
  12373. };
  12374. ApplicationRef_.prototype.registerDisposeListener = function (dispose) { this._disposeListeners.push(dispose); };
  12375. ApplicationRef_.prototype.registerChangeDetector = function (changeDetector) {
  12376. this._changeDetectorRefs.push(changeDetector);
  12377. };
  12378. ApplicationRef_.prototype.unregisterChangeDetector = function (changeDetector) {
  12379. collection_1.ListWrapper.remove(this._changeDetectorRefs, changeDetector);
  12380. };
  12381. ApplicationRef_.prototype.bootstrap = function (componentType, providers) {
  12382. var _this = this;
  12383. var completer = async_1.PromiseWrapper.completer();
  12384. this._zone.run(function () {
  12385. var componentProviders = _componentProviders(componentType);
  12386. if (lang_1.isPresent(providers)) {
  12387. componentProviders.push(providers);
  12388. }
  12389. var exceptionHandler = _this._injector.get(exceptions_1.ExceptionHandler);
  12390. _this._rootComponentTypes.push(componentType);
  12391. try {
  12392. var injector = _this._injector.resolveAndCreateChild(componentProviders);
  12393. var compRefToken = injector.get(application_tokens_1.APP_COMPONENT_REF_PROMISE);
  12394. var tick = function (componentRef) {
  12395. _this._loadComponent(componentRef);
  12396. completer.resolve(componentRef);
  12397. };
  12398. var tickResult = async_1.PromiseWrapper.then(compRefToken, tick);
  12399. // THIS MUST ONLY RUN IN DART.
  12400. // This is required to report an error when no components with a matching selector found.
  12401. // Otherwise the promise will never be completed.
  12402. // Doing this in JS causes an extra error message to appear.
  12403. if (lang_1.IS_DART) {
  12404. async_1.PromiseWrapper.then(tickResult, function (_) { });
  12405. }
  12406. async_1.PromiseWrapper.then(tickResult, null, function (err, stackTrace) { return completer.reject(err, stackTrace); });
  12407. }
  12408. catch (e) {
  12409. exceptionHandler.call(e, e.stack);
  12410. completer.reject(e, e.stack);
  12411. }
  12412. });
  12413. return completer.promise.then(function (_) {
  12414. var c = _this._injector.get(console_1.Console);
  12415. var modeDescription = lang_1.assertionsEnabled() ?
  12416. "in the development mode. Call enableProdMode() to enable the production mode." :
  12417. "in the production mode. Call enableDevMode() to enable the development mode.";
  12418. c.log("Angular 2 is running " + modeDescription);
  12419. return _;
  12420. });
  12421. };
  12422. /** @internal */
  12423. ApplicationRef_.prototype._loadComponent = function (ref) {
  12424. var appChangeDetector = view_ref_1.internalView(ref.hostView).changeDetector;
  12425. this._changeDetectorRefs.push(appChangeDetector.ref);
  12426. this.tick();
  12427. this._rootComponents.push(ref);
  12428. this._bootstrapListeners.forEach(function (listener) { return listener(ref); });
  12429. };
  12430. /** @internal */
  12431. ApplicationRef_.prototype._unloadComponent = function (ref) {
  12432. if (!collection_1.ListWrapper.contains(this._rootComponents, ref)) {
  12433. return;
  12434. }
  12435. this.unregisterChangeDetector(view_ref_1.internalView(ref.hostView).changeDetector.ref);
  12436. collection_1.ListWrapper.remove(this._rootComponents, ref);
  12437. };
  12438. Object.defineProperty(ApplicationRef_.prototype, "injector", {
  12439. get: function () { return this._injector; },
  12440. enumerable: true,
  12441. configurable: true
  12442. });
  12443. Object.defineProperty(ApplicationRef_.prototype, "zone", {
  12444. get: function () { return this._zone; },
  12445. enumerable: true,
  12446. configurable: true
  12447. });
  12448. ApplicationRef_.prototype.tick = function () {
  12449. if (this._runningTick) {
  12450. throw new exceptions_1.BaseException("ApplicationRef.tick is called recursively");
  12451. }
  12452. var s = ApplicationRef_._tickScope();
  12453. try {
  12454. this._runningTick = true;
  12455. this._changeDetectorRefs.forEach(function (detector) { return detector.detectChanges(); });
  12456. if (this._enforceNoNewChanges) {
  12457. this._changeDetectorRefs.forEach(function (detector) { return detector.checkNoChanges(); });
  12458. }
  12459. }
  12460. finally {
  12461. this._runningTick = false;
  12462. profile_1.wtfLeave(s);
  12463. }
  12464. };
  12465. ApplicationRef_.prototype.dispose = function () {
  12466. // TODO(alxhub): Dispose of the NgZone.
  12467. collection_1.ListWrapper.clone(this._rootComponents).forEach(function (ref) { return ref.dispose(); });
  12468. this._disposeListeners.forEach(function (dispose) { return dispose(); });
  12469. this._platform._applicationDisposed(this);
  12470. };
  12471. Object.defineProperty(ApplicationRef_.prototype, "componentTypes", {
  12472. get: function () { return this._rootComponentTypes; },
  12473. enumerable: true,
  12474. configurable: true
  12475. });
  12476. /** @internal */
  12477. ApplicationRef_._tickScope = profile_1.wtfCreateScope('ApplicationRef#tick()');
  12478. return ApplicationRef_;
  12479. })(ApplicationRef);
  12480. exports.ApplicationRef_ = ApplicationRef_;
  12481. /***/ },
  12482. /* 66 */
  12483. /***/ function(module, exports, __webpack_require__) {
  12484. var collection_1 = __webpack_require__(12);
  12485. var lang_1 = __webpack_require__(5);
  12486. var async_1 = __webpack_require__(60);
  12487. var profile_1 = __webpack_require__(45);
  12488. /**
  12489. * Stores error information; delivered via [NgZone.onError] stream.
  12490. */
  12491. var NgZoneError = (function () {
  12492. function NgZoneError(error, stackTrace) {
  12493. this.error = error;
  12494. this.stackTrace = stackTrace;
  12495. }
  12496. return NgZoneError;
  12497. })();
  12498. exports.NgZoneError = NgZoneError;
  12499. /**
  12500. * An injectable service for executing work inside or outside of the Angular zone.
  12501. *
  12502. * The most common use of this service is to optimize performance when starting a work consisting of
  12503. * one or more asynchronous tasks that don't require UI updates or error handling to be handled by
  12504. * Angular. Such tasks can be kicked off via {@link #runOutsideAngular} and if needed, these tasks
  12505. * can reenter the Angular zone via {@link #run}.
  12506. *
  12507. * <!-- TODO: add/fix links to:
  12508. * - docs explaining zones and the use of zones in Angular and change-detection
  12509. * - link to runOutsideAngular/run (throughout this file!)
  12510. * -->
  12511. *
  12512. * ### Example ([live demo](http://plnkr.co/edit/lY9m8HLy7z06vDoUaSN2?p=preview))
  12513. * ```
  12514. * import {Component, View, NgZone} from 'angular2/core';
  12515. * import {NgIf} from 'angular2/common';
  12516. *
  12517. * @Component({
  12518. * selector: 'ng-zone-demo'.
  12519. * template: `
  12520. * <h2>Demo: NgZone</h2>
  12521. *
  12522. * <p>Progress: {{progress}}%</p>
  12523. * <p *ngIf="progress >= 100">Done processing {{label}} of Angular zone!</p>
  12524. *
  12525. * <button (click)="processWithinAngularZone()">Process within Angular zone</button>
  12526. * <button (click)="processOutsideOfAngularZone()">Process outside of Angular zone</button>
  12527. * `,
  12528. * directives: [NgIf]
  12529. * })
  12530. * export class NgZoneDemo {
  12531. * progress: number = 0;
  12532. * label: string;
  12533. *
  12534. * constructor(private _ngZone: NgZone) {}
  12535. *
  12536. * // Loop inside the Angular zone
  12537. * // so the UI DOES refresh after each setTimeout cycle
  12538. * processWithinAngularZone() {
  12539. * this.label = 'inside';
  12540. * this.progress = 0;
  12541. * this._increaseProgress(() => console.log('Inside Done!'));
  12542. * }
  12543. *
  12544. * // Loop outside of the Angular zone
  12545. * // so the UI DOES NOT refresh after each setTimeout cycle
  12546. * processOutsideOfAngularZone() {
  12547. * this.label = 'outside';
  12548. * this.progress = 0;
  12549. * this._ngZone.runOutsideAngular(() => {
  12550. * this._increaseProgress(() => {
  12551. * // reenter the Angular zone and display done
  12552. * this._ngZone.run(() => {console.log('Outside Done!') });
  12553. * }}));
  12554. * }
  12555. *
  12556. *
  12557. * _increaseProgress(doneCallback: () => void) {
  12558. * this.progress += 1;
  12559. * console.log(`Current progress: ${this.progress}%`);
  12560. *
  12561. * if (this.progress < 100) {
  12562. * window.setTimeout(() => this._increaseProgress(doneCallback)), 10)
  12563. * } else {
  12564. * doneCallback();
  12565. * }
  12566. * }
  12567. * }
  12568. * ```
  12569. */
  12570. var NgZone = (function () {
  12571. /**
  12572. * @param {bool} enableLongStackTrace whether to enable long stack trace. They should only be
  12573. * enabled in development mode as they significantly impact perf.
  12574. */
  12575. function NgZone(_a) {
  12576. var enableLongStackTrace = _a.enableLongStackTrace;
  12577. /** @internal */
  12578. this._runScope = profile_1.wtfCreateScope("NgZone#run()");
  12579. /** @internal */
  12580. this._microtaskScope = profile_1.wtfCreateScope("NgZone#microtask()");
  12581. // Number of microtasks pending from _innerZone (& descendants)
  12582. /** @internal */
  12583. this._pendingMicrotasks = 0;
  12584. // Whether some code has been executed in the _innerZone (& descendants) in the current turn
  12585. /** @internal */
  12586. this._hasExecutedCodeInInnerZone = false;
  12587. // run() call depth in _mountZone. 0 at the end of a macrotask
  12588. // zone.run(() => { // top-level call
  12589. // zone.run(() => {}); // nested call -> in-turn
  12590. // });
  12591. /** @internal */
  12592. this._nestedRun = 0;
  12593. /** @internal */
  12594. this._inVmTurnDone = false;
  12595. /** @internal */
  12596. this._pendingTimeouts = [];
  12597. if (lang_1.global.zone) {
  12598. this._disabled = false;
  12599. this._mountZone = lang_1.global.zone;
  12600. this._innerZone = this._createInnerZone(this._mountZone, enableLongStackTrace);
  12601. }
  12602. else {
  12603. this._disabled = true;
  12604. this._mountZone = null;
  12605. }
  12606. this._onTurnStartEvents = new async_1.EventEmitter(false);
  12607. this._onTurnDoneEvents = new async_1.EventEmitter(false);
  12608. this._onEventDoneEvents = new async_1.EventEmitter(false);
  12609. this._onErrorEvents = new async_1.EventEmitter(false);
  12610. }
  12611. /**
  12612. * Sets the zone hook that is called just before a browser task that is handled by Angular
  12613. * executes.
  12614. *
  12615. * The hook is called once per browser task that is handled by Angular.
  12616. *
  12617. * Setting the hook overrides any previously set hook.
  12618. *
  12619. * @deprecated this API will be removed in the future. Use `onTurnStart` instead.
  12620. */
  12621. NgZone.prototype.overrideOnTurnStart = function (onTurnStartHook) {
  12622. this._onTurnStart = lang_1.normalizeBlank(onTurnStartHook);
  12623. };
  12624. Object.defineProperty(NgZone.prototype, "onTurnStart", {
  12625. /**
  12626. * Notifies subscribers just before Angular event turn starts.
  12627. *
  12628. * Emits an event once per browser task that is handled by Angular.
  12629. */
  12630. get: function () { return this._onTurnStartEvents; },
  12631. enumerable: true,
  12632. configurable: true
  12633. });
  12634. /** @internal */
  12635. NgZone.prototype._notifyOnTurnStart = function (parentRun) {
  12636. var _this = this;
  12637. parentRun.call(this._innerZone, function () { _this._onTurnStartEvents.emit(null); });
  12638. };
  12639. /**
  12640. * Sets the zone hook that is called immediately after Angular zone is done processing the current
  12641. * task and any microtasks scheduled from that task.
  12642. *
  12643. * This is where we typically do change-detection.
  12644. *
  12645. * The hook is called once per browser task that is handled by Angular.
  12646. *
  12647. * Setting the hook overrides any previously set hook.
  12648. *
  12649. * @deprecated this API will be removed in the future. Use `onTurnDone` instead.
  12650. */
  12651. NgZone.prototype.overrideOnTurnDone = function (onTurnDoneHook) {
  12652. this._onTurnDone = lang_1.normalizeBlank(onTurnDoneHook);
  12653. };
  12654. Object.defineProperty(NgZone.prototype, "onTurnDone", {
  12655. /**
  12656. * Notifies subscribers immediately after Angular zone is done processing
  12657. * the current turn and any microtasks scheduled from that turn.
  12658. *
  12659. * Used by Angular as a signal to kick off change-detection.
  12660. */
  12661. get: function () { return this._onTurnDoneEvents; },
  12662. enumerable: true,
  12663. configurable: true
  12664. });
  12665. /** @internal */
  12666. NgZone.prototype._notifyOnTurnDone = function (parentRun) {
  12667. var _this = this;
  12668. parentRun.call(this._innerZone, function () { _this._onTurnDoneEvents.emit(null); });
  12669. };
  12670. /**
  12671. * Sets the zone hook that is called immediately after the `onTurnDone` callback is called and any
  12672. * microstasks scheduled from within that callback are drained.
  12673. *
  12674. * `onEventDoneFn` is executed outside Angular zone, which means that we will no longer attempt to
  12675. * sync the UI with any model changes that occur within this callback.
  12676. *
  12677. * This hook is useful for validating application state (e.g. in a test).
  12678. *
  12679. * Setting the hook overrides any previously set hook.
  12680. *
  12681. * @deprecated this API will be removed in the future. Use `onEventDone` instead.
  12682. */
  12683. NgZone.prototype.overrideOnEventDone = function (onEventDoneFn, opt_waitForAsync) {
  12684. var _this = this;
  12685. if (opt_waitForAsync === void 0) { opt_waitForAsync = false; }
  12686. var normalizedOnEventDone = lang_1.normalizeBlank(onEventDoneFn);
  12687. if (opt_waitForAsync) {
  12688. this._onEventDone = function () {
  12689. if (!_this._pendingTimeouts.length) {
  12690. normalizedOnEventDone();
  12691. }
  12692. };
  12693. }
  12694. else {
  12695. this._onEventDone = normalizedOnEventDone;
  12696. }
  12697. };
  12698. Object.defineProperty(NgZone.prototype, "onEventDone", {
  12699. /**
  12700. * Notifies subscribers immediately after the final `onTurnDone` callback
  12701. * before ending VM event.
  12702. *
  12703. * This event is useful for validating application state (e.g. in a test).
  12704. */
  12705. get: function () { return this._onEventDoneEvents; },
  12706. enumerable: true,
  12707. configurable: true
  12708. });
  12709. /** @internal */
  12710. NgZone.prototype._notifyOnEventDone = function () {
  12711. var _this = this;
  12712. this.runOutsideAngular(function () { _this._onEventDoneEvents.emit(null); });
  12713. };
  12714. Object.defineProperty(NgZone.prototype, "hasPendingMicrotasks", {
  12715. /**
  12716. * Whether there are any outstanding microtasks.
  12717. */
  12718. get: function () { return this._pendingMicrotasks > 0; },
  12719. enumerable: true,
  12720. configurable: true
  12721. });
  12722. Object.defineProperty(NgZone.prototype, "hasPendingTimers", {
  12723. /**
  12724. * Whether there are any outstanding timers.
  12725. */
  12726. get: function () { return this._pendingTimeouts.length > 0; },
  12727. enumerable: true,
  12728. configurable: true
  12729. });
  12730. Object.defineProperty(NgZone.prototype, "hasPendingAsyncTasks", {
  12731. /**
  12732. * Whether there are any outstanding asychnronous tasks of any kind that are
  12733. * scheduled to run within Angular zone.
  12734. *
  12735. * Useful as a signal of UI stability. For example, when a test reaches a
  12736. * point when [hasPendingAsyncTasks] is `false` it might be a good time to run
  12737. * test expectations.
  12738. */
  12739. get: function () { return this.hasPendingMicrotasks || this.hasPendingTimers; },
  12740. enumerable: true,
  12741. configurable: true
  12742. });
  12743. /**
  12744. * Sets the zone hook that is called when an error is thrown in the Angular zone.
  12745. *
  12746. * Setting the hook overrides any previously set hook.
  12747. *
  12748. * @deprecated this API will be removed in the future. Use `onError` instead.
  12749. */
  12750. NgZone.prototype.overrideOnErrorHandler = function (errorHandler) {
  12751. this._onErrorHandler = lang_1.normalizeBlank(errorHandler);
  12752. };
  12753. Object.defineProperty(NgZone.prototype, "onError", {
  12754. get: function () { return this._onErrorEvents; },
  12755. enumerable: true,
  12756. configurable: true
  12757. });
  12758. /**
  12759. * Executes the `fn` function synchronously within the Angular zone and returns value returned by
  12760. * the function.
  12761. *
  12762. * Running functions via `run` allows you to reenter Angular zone from a task that was executed
  12763. * outside of the Angular zone (typically started via {@link #runOutsideAngular}).
  12764. *
  12765. * Any future tasks or microtasks scheduled from within this function will continue executing from
  12766. * within the Angular zone.
  12767. */
  12768. NgZone.prototype.run = function (fn) {
  12769. if (this._disabled) {
  12770. return fn();
  12771. }
  12772. else {
  12773. var s = this._runScope();
  12774. try {
  12775. return this._innerZone.run(fn);
  12776. }
  12777. finally {
  12778. profile_1.wtfLeave(s);
  12779. }
  12780. }
  12781. };
  12782. /**
  12783. * Executes the `fn` function synchronously in Angular's parent zone and returns value returned by
  12784. * the function.
  12785. *
  12786. * Running functions via `runOutsideAngular` allows you to escape Angular's zone and do work that
  12787. * doesn't trigger Angular change-detection or is subject to Angular's error handling.
  12788. *
  12789. * Any future tasks or microtasks scheduled from within this function will continue executing from
  12790. * outside of the Angular zone.
  12791. *
  12792. * Use {@link #run} to reenter the Angular zone and do work that updates the application model.
  12793. */
  12794. NgZone.prototype.runOutsideAngular = function (fn) {
  12795. if (this._disabled) {
  12796. return fn();
  12797. }
  12798. else {
  12799. return this._mountZone.run(fn);
  12800. }
  12801. };
  12802. /** @internal */
  12803. NgZone.prototype._createInnerZone = function (zone, enableLongStackTrace) {
  12804. var microtaskScope = this._microtaskScope;
  12805. var ngZone = this;
  12806. var errorHandling;
  12807. if (enableLongStackTrace) {
  12808. errorHandling = collection_1.StringMapWrapper.merge(Zone.longStackTraceZone, { onError: function (e) { ngZone._notifyOnError(this, e); } });
  12809. }
  12810. else {
  12811. errorHandling = { onError: function (e) { ngZone._notifyOnError(this, e); } };
  12812. }
  12813. return zone.fork(errorHandling)
  12814. .fork({
  12815. '$run': function (parentRun) {
  12816. return function () {
  12817. try {
  12818. ngZone._nestedRun++;
  12819. if (!ngZone._hasExecutedCodeInInnerZone) {
  12820. ngZone._hasExecutedCodeInInnerZone = true;
  12821. ngZone._notifyOnTurnStart(parentRun);
  12822. if (ngZone._onTurnStart) {
  12823. parentRun.call(ngZone._innerZone, ngZone._onTurnStart);
  12824. }
  12825. }
  12826. return parentRun.apply(this, arguments);
  12827. }
  12828. finally {
  12829. ngZone._nestedRun--;
  12830. // If there are no more pending microtasks, we are at the end of a VM turn (or in
  12831. // onTurnStart)
  12832. // _nestedRun will be 0 at the end of a macrotasks (it could be > 0 when there are
  12833. // nested calls
  12834. // to run()).
  12835. if (ngZone._pendingMicrotasks == 0 && ngZone._nestedRun == 0 &&
  12836. !this._inVmTurnDone) {
  12837. if (ngZone._hasExecutedCodeInInnerZone) {
  12838. try {
  12839. this._inVmTurnDone = true;
  12840. ngZone._notifyOnTurnDone(parentRun);
  12841. if (ngZone._onTurnDone) {
  12842. parentRun.call(ngZone._innerZone, ngZone._onTurnDone);
  12843. }
  12844. }
  12845. finally {
  12846. this._inVmTurnDone = false;
  12847. ngZone._hasExecutedCodeInInnerZone = false;
  12848. }
  12849. }
  12850. if (ngZone._pendingMicrotasks === 0) {
  12851. ngZone._notifyOnEventDone();
  12852. if (lang_1.isPresent(ngZone._onEventDone)) {
  12853. ngZone.runOutsideAngular(ngZone._onEventDone);
  12854. }
  12855. }
  12856. }
  12857. }
  12858. };
  12859. },
  12860. '$scheduleMicrotask': function (parentScheduleMicrotask) {
  12861. return function (fn) {
  12862. ngZone._pendingMicrotasks++;
  12863. var microtask = function () {
  12864. var s = microtaskScope();
  12865. try {
  12866. fn();
  12867. }
  12868. finally {
  12869. ngZone._pendingMicrotasks--;
  12870. profile_1.wtfLeave(s);
  12871. }
  12872. };
  12873. parentScheduleMicrotask.call(this, microtask);
  12874. };
  12875. },
  12876. '$setTimeout': function (parentSetTimeout) {
  12877. return function (fn, delay) {
  12878. var args = [];
  12879. for (var _i = 2; _i < arguments.length; _i++) {
  12880. args[_i - 2] = arguments[_i];
  12881. }
  12882. var id;
  12883. var cb = function () {
  12884. fn();
  12885. collection_1.ListWrapper.remove(ngZone._pendingTimeouts, id);
  12886. };
  12887. id = parentSetTimeout(cb, delay, args);
  12888. ngZone._pendingTimeouts.push(id);
  12889. return id;
  12890. };
  12891. },
  12892. '$clearTimeout': function (parentClearTimeout) {
  12893. return function (id) {
  12894. parentClearTimeout(id);
  12895. collection_1.ListWrapper.remove(ngZone._pendingTimeouts, id);
  12896. };
  12897. },
  12898. _innerZone: true
  12899. });
  12900. };
  12901. /** @internal */
  12902. NgZone.prototype._notifyOnError = function (zone, e) {
  12903. if (lang_1.isPresent(this._onErrorHandler) || async_1.ObservableWrapper.hasSubscribers(this._onErrorEvents)) {
  12904. var trace = [lang_1.normalizeBlank(e.stack)];
  12905. while (zone && zone.constructedAtException) {
  12906. trace.push(zone.constructedAtException.get());
  12907. zone = zone.parent;
  12908. }
  12909. if (async_1.ObservableWrapper.hasSubscribers(this._onErrorEvents)) {
  12910. async_1.ObservableWrapper.callEmit(this._onErrorEvents, new NgZoneError(e, trace));
  12911. }
  12912. if (lang_1.isPresent(this._onErrorHandler)) {
  12913. this._onErrorHandler(e, trace);
  12914. }
  12915. }
  12916. else {
  12917. console.log('## _notifyOnError ##');
  12918. console.log(e.stack);
  12919. throw e;
  12920. }
  12921. };
  12922. return NgZone;
  12923. })();
  12924. exports.NgZone = NgZone;
  12925. /***/ },
  12926. /* 67 */
  12927. /***/ function(module, exports, __webpack_require__) {
  12928. var di_1 = __webpack_require__(6);
  12929. var lang_1 = __webpack_require__(5);
  12930. /**
  12931. * @internal
  12932. */
  12933. exports.APP_COMPONENT_REF_PROMISE = lang_1.CONST_EXPR(new di_1.OpaqueToken('Promise<ComponentRef>'));
  12934. /**
  12935. * An {@link angular2/di/OpaqueToken} representing the application root type in the {@link
  12936. * Injector}.
  12937. *
  12938. * ```
  12939. * @Component(...)
  12940. * class MyApp {
  12941. * ...
  12942. * }
  12943. *
  12944. * bootstrap(MyApp).then((appRef:ApplicationRef) {
  12945. * expect(appRef.injector.get(appComponentTypeToken)).toEqual(MyApp);
  12946. * });
  12947. *
  12948. * ```
  12949. */
  12950. exports.APP_COMPONENT = lang_1.CONST_EXPR(new di_1.OpaqueToken('AppComponent'));
  12951. /**
  12952. * A DI Token representing a unique string id assigned to the application by Angular and used
  12953. * primarily for prefixing application attributes and CSS styles when
  12954. * {@link ViewEncapsulation#Emulated} is being used.
  12955. *
  12956. * If you need to avoid randomly generated value to be used as an application id, you can provide
  12957. * a custom value via a DI provider <!-- TODO: provider --> configuring the root {@link Injector}
  12958. * using this token.
  12959. */
  12960. exports.APP_ID = lang_1.CONST_EXPR(new di_1.OpaqueToken('AppId'));
  12961. function _appIdRandomProviderFactory() {
  12962. return "" + _randomChar() + _randomChar() + _randomChar();
  12963. }
  12964. /**
  12965. * Providers that will generate a random APP_ID_TOKEN.
  12966. */
  12967. exports.APP_ID_RANDOM_PROVIDER = lang_1.CONST_EXPR(new di_1.Provider(exports.APP_ID, { useFactory: _appIdRandomProviderFactory, deps: [] }));
  12968. function _randomChar() {
  12969. return lang_1.StringWrapper.fromCharCode(97 + lang_1.Math.floor(lang_1.Math.random() * 25));
  12970. }
  12971. /**
  12972. * A function that will be executed when a platform is initialized.
  12973. */
  12974. exports.PLATFORM_INITIALIZER = lang_1.CONST_EXPR(new di_1.OpaqueToken("Platform Initializer"));
  12975. /**
  12976. * A function that will be executed when an application is initialized.
  12977. */
  12978. exports.APP_INITIALIZER = lang_1.CONST_EXPR(new di_1.OpaqueToken("Application Initializer"));
  12979. /**
  12980. * A token which indicates the root directory of the application
  12981. */
  12982. exports.PACKAGE_ROOT_URL = lang_1.CONST_EXPR(new di_1.OpaqueToken("Application Packages Root URL"));
  12983. /***/ },
  12984. /* 68 */
  12985. /***/ function(module, exports, __webpack_require__) {
  12986. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  12987. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  12988. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  12989. 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;
  12990. return c > 3 && r && Object.defineProperty(target, key, r), r;
  12991. };
  12992. var __metadata = (this && this.__metadata) || function (k, v) {
  12993. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  12994. };
  12995. var di_1 = __webpack_require__(6);
  12996. var collection_1 = __webpack_require__(12);
  12997. var lang_1 = __webpack_require__(5);
  12998. var exceptions_1 = __webpack_require__(14);
  12999. var ng_zone_1 = __webpack_require__(66);
  13000. var async_1 = __webpack_require__(60);
  13001. /**
  13002. * The Testability service provides testing hooks that can be accessed from
  13003. * the browser and by services such as Protractor. Each bootstrapped Angular
  13004. * application on the page will have an instance of Testability.
  13005. */
  13006. var Testability = (function () {
  13007. function Testability(_ngZone) {
  13008. /** @internal */
  13009. this._pendingCount = 0;
  13010. /** @internal */
  13011. this._callbacks = [];
  13012. /** @internal */
  13013. this._isAngularEventPending = false;
  13014. this._watchAngularEvents(_ngZone);
  13015. }
  13016. /** @internal */
  13017. Testability.prototype._watchAngularEvents = function (_ngZone) {
  13018. var _this = this;
  13019. async_1.ObservableWrapper.subscribe(_ngZone.onTurnStart, function (_) { _this._isAngularEventPending = true; });
  13020. _ngZone.runOutsideAngular(function () {
  13021. async_1.ObservableWrapper.subscribe(_ngZone.onEventDone, function (_) {
  13022. if (!_ngZone.hasPendingTimers) {
  13023. _this._isAngularEventPending = false;
  13024. _this._runCallbacksIfReady();
  13025. }
  13026. });
  13027. });
  13028. };
  13029. Testability.prototype.increasePendingRequestCount = function () {
  13030. this._pendingCount += 1;
  13031. return this._pendingCount;
  13032. };
  13033. Testability.prototype.decreasePendingRequestCount = function () {
  13034. this._pendingCount -= 1;
  13035. if (this._pendingCount < 0) {
  13036. throw new exceptions_1.BaseException('pending async requests below zero');
  13037. }
  13038. this._runCallbacksIfReady();
  13039. return this._pendingCount;
  13040. };
  13041. Testability.prototype.isStable = function () { return this._pendingCount == 0 && !this._isAngularEventPending; };
  13042. /** @internal */
  13043. Testability.prototype._runCallbacksIfReady = function () {
  13044. var _this = this;
  13045. if (!this.isStable()) {
  13046. return; // Not ready
  13047. }
  13048. // Schedules the call backs in a new frame so that it is always async.
  13049. async_1.PromiseWrapper.resolve(null).then(function (_) {
  13050. while (_this._callbacks.length !== 0) {
  13051. (_this._callbacks.pop())();
  13052. }
  13053. });
  13054. };
  13055. Testability.prototype.whenStable = function (callback) {
  13056. this._callbacks.push(callback);
  13057. this._runCallbacksIfReady();
  13058. };
  13059. Testability.prototype.getPendingRequestCount = function () { return this._pendingCount; };
  13060. // This only accounts for ngZone, and not pending counts. Use `whenStable` to
  13061. // check for stability.
  13062. Testability.prototype.isAngularEventPending = function () { return this._isAngularEventPending; };
  13063. Testability.prototype.findBindings = function (using, provider, exactMatch) {
  13064. // TODO(juliemr): implement.
  13065. return [];
  13066. };
  13067. Testability.prototype.findProviders = function (using, provider, exactMatch) {
  13068. // TODO(juliemr): implement.
  13069. return [];
  13070. };
  13071. Testability = __decorate([
  13072. di_1.Injectable(),
  13073. __metadata('design:paramtypes', [ng_zone_1.NgZone])
  13074. ], Testability);
  13075. return Testability;
  13076. })();
  13077. exports.Testability = Testability;
  13078. /**
  13079. * A global registry of {@link Testability} instances for specific elements.
  13080. */
  13081. var TestabilityRegistry = (function () {
  13082. function TestabilityRegistry() {
  13083. /** @internal */
  13084. this._applications = new collection_1.Map();
  13085. _testabilityGetter.addToWindow(this);
  13086. }
  13087. TestabilityRegistry.prototype.registerApplication = function (token, testability) {
  13088. this._applications.set(token, testability);
  13089. };
  13090. TestabilityRegistry.prototype.getTestability = function (elem) { return this._applications.get(elem); };
  13091. TestabilityRegistry.prototype.getAllTestabilities = function () { return collection_1.MapWrapper.values(this._applications); };
  13092. TestabilityRegistry.prototype.findTestabilityInTree = function (elem, findInAncestors) {
  13093. if (findInAncestors === void 0) { findInAncestors = true; }
  13094. return _testabilityGetter.findTestabilityInTree(this, elem, findInAncestors);
  13095. };
  13096. TestabilityRegistry = __decorate([
  13097. di_1.Injectable(),
  13098. __metadata('design:paramtypes', [])
  13099. ], TestabilityRegistry);
  13100. return TestabilityRegistry;
  13101. })();
  13102. exports.TestabilityRegistry = TestabilityRegistry;
  13103. var _NoopGetTestability = (function () {
  13104. function _NoopGetTestability() {
  13105. }
  13106. _NoopGetTestability.prototype.addToWindow = function (registry) { };
  13107. _NoopGetTestability.prototype.findTestabilityInTree = function (registry, elem, findInAncestors) {
  13108. return null;
  13109. };
  13110. _NoopGetTestability = __decorate([
  13111. lang_1.CONST(),
  13112. __metadata('design:paramtypes', [])
  13113. ], _NoopGetTestability);
  13114. return _NoopGetTestability;
  13115. })();
  13116. /**
  13117. * Set the {@link GetTestability} implementation used by the Angular testing framework.
  13118. */
  13119. function setTestabilityGetter(getter) {
  13120. _testabilityGetter = getter;
  13121. }
  13122. exports.setTestabilityGetter = setTestabilityGetter;
  13123. var _testabilityGetter = lang_1.CONST_EXPR(new _NoopGetTestability());
  13124. /***/ },
  13125. /* 69 */
  13126. /***/ function(module, exports, __webpack_require__) {
  13127. var __extends = (this && this.__extends) || function (d, b) {
  13128. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  13129. function __() { this.constructor = d; }
  13130. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  13131. };
  13132. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  13133. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  13134. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  13135. 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;
  13136. return c > 3 && r && Object.defineProperty(target, key, r), r;
  13137. };
  13138. var __metadata = (this && this.__metadata) || function (k, v) {
  13139. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  13140. };
  13141. var di_1 = __webpack_require__(6);
  13142. var compiler_1 = __webpack_require__(70);
  13143. var lang_1 = __webpack_require__(5);
  13144. var view_manager_1 = __webpack_require__(81);
  13145. /**
  13146. * Represents an instance of a Component created via {@link DynamicComponentLoader}.
  13147. *
  13148. * `ComponentRef` provides access to the Component Instance as well other objects related to this
  13149. * Component Instance and allows you to destroy the Component Instance via the {@link #dispose}
  13150. * method.
  13151. */
  13152. var ComponentRef = (function () {
  13153. function ComponentRef() {
  13154. }
  13155. Object.defineProperty(ComponentRef.prototype, "hostView", {
  13156. /**
  13157. * The {@link ViewRef} of the Host View of this Component instance.
  13158. */
  13159. get: function () { return this.location.parentView; },
  13160. enumerable: true,
  13161. configurable: true
  13162. });
  13163. Object.defineProperty(ComponentRef.prototype, "hostComponent", {
  13164. /**
  13165. * @internal
  13166. *
  13167. * The instance of the component.
  13168. *
  13169. * TODO(i): this api should be removed
  13170. */
  13171. get: function () { return this.instance; },
  13172. enumerable: true,
  13173. configurable: true
  13174. });
  13175. return ComponentRef;
  13176. })();
  13177. exports.ComponentRef = ComponentRef;
  13178. var ComponentRef_ = (function (_super) {
  13179. __extends(ComponentRef_, _super);
  13180. /**
  13181. * TODO(i): refactor into public/private fields
  13182. */
  13183. function ComponentRef_(location, instance, componentType, injector, _dispose) {
  13184. _super.call(this);
  13185. this._dispose = _dispose;
  13186. this.location = location;
  13187. this.instance = instance;
  13188. this.componentType = componentType;
  13189. this.injector = injector;
  13190. }
  13191. Object.defineProperty(ComponentRef_.prototype, "hostComponentType", {
  13192. /**
  13193. * @internal
  13194. *
  13195. * Returns the type of this Component instance.
  13196. *
  13197. * TODO(i): this api should be removed
  13198. */
  13199. get: function () { return this.componentType; },
  13200. enumerable: true,
  13201. configurable: true
  13202. });
  13203. ComponentRef_.prototype.dispose = function () { this._dispose(); };
  13204. return ComponentRef_;
  13205. })(ComponentRef);
  13206. exports.ComponentRef_ = ComponentRef_;
  13207. /**
  13208. * Service for instantiating a Component and attaching it to a View at a specified location.
  13209. */
  13210. var DynamicComponentLoader = (function () {
  13211. function DynamicComponentLoader() {
  13212. }
  13213. return DynamicComponentLoader;
  13214. })();
  13215. exports.DynamicComponentLoader = DynamicComponentLoader;
  13216. var DynamicComponentLoader_ = (function (_super) {
  13217. __extends(DynamicComponentLoader_, _super);
  13218. function DynamicComponentLoader_(_compiler, _viewManager) {
  13219. _super.call(this);
  13220. this._compiler = _compiler;
  13221. this._viewManager = _viewManager;
  13222. }
  13223. DynamicComponentLoader_.prototype.loadAsRoot = function (type, overrideSelector, injector, onDispose) {
  13224. var _this = this;
  13225. return this._compiler.compileInHost(type).then(function (hostProtoViewRef) {
  13226. var hostViewRef = _this._viewManager.createRootHostView(hostProtoViewRef, overrideSelector, injector);
  13227. var newLocation = _this._viewManager.getHostElement(hostViewRef);
  13228. var component = _this._viewManager.getComponent(newLocation);
  13229. var dispose = function () {
  13230. if (lang_1.isPresent(onDispose)) {
  13231. onDispose();
  13232. }
  13233. _this._viewManager.destroyRootHostView(hostViewRef);
  13234. };
  13235. return new ComponentRef_(newLocation, component, type, injector, dispose);
  13236. });
  13237. };
  13238. DynamicComponentLoader_.prototype.loadIntoLocation = function (type, hostLocation, anchorName, providers) {
  13239. if (providers === void 0) { providers = null; }
  13240. return this.loadNextToLocation(type, this._viewManager.getNamedElementInComponentView(hostLocation, anchorName), providers);
  13241. };
  13242. DynamicComponentLoader_.prototype.loadNextToLocation = function (type, location, providers) {
  13243. var _this = this;
  13244. if (providers === void 0) { providers = null; }
  13245. return this._compiler.compileInHost(type).then(function (hostProtoViewRef) {
  13246. var viewContainer = _this._viewManager.getViewContainer(location);
  13247. var hostViewRef = viewContainer.createHostView(hostProtoViewRef, viewContainer.length, providers);
  13248. var newLocation = _this._viewManager.getHostElement(hostViewRef);
  13249. var component = _this._viewManager.getComponent(newLocation);
  13250. var dispose = function () {
  13251. var index = viewContainer.indexOf(hostViewRef);
  13252. if (index !== -1) {
  13253. viewContainer.remove(index);
  13254. }
  13255. };
  13256. return new ComponentRef_(newLocation, component, type, null, dispose);
  13257. });
  13258. };
  13259. DynamicComponentLoader_ = __decorate([
  13260. di_1.Injectable(),
  13261. __metadata('design:paramtypes', [compiler_1.Compiler, view_manager_1.AppViewManager])
  13262. ], DynamicComponentLoader_);
  13263. return DynamicComponentLoader_;
  13264. })(DynamicComponentLoader);
  13265. exports.DynamicComponentLoader_ = DynamicComponentLoader_;
  13266. /***/ },
  13267. /* 70 */
  13268. /***/ function(module, exports, __webpack_require__) {
  13269. var __extends = (this && this.__extends) || function (d, b) {
  13270. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  13271. function __() { this.constructor = d; }
  13272. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  13273. };
  13274. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  13275. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  13276. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  13277. 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;
  13278. return c > 3 && r && Object.defineProperty(target, key, r), r;
  13279. };
  13280. var __metadata = (this && this.__metadata) || function (k, v) {
  13281. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  13282. };
  13283. var proto_view_factory_1 = __webpack_require__(71);
  13284. var di_1 = __webpack_require__(6);
  13285. var lang_1 = __webpack_require__(5);
  13286. var exceptions_1 = __webpack_require__(14);
  13287. var async_1 = __webpack_require__(60);
  13288. var reflection_1 = __webpack_require__(16);
  13289. var template_commands_1 = __webpack_require__(96);
  13290. /**
  13291. * Low-level service for compiling {@link Component}s into {@link ProtoViewRef ProtoViews}s, which
  13292. * can later be used to create and render a Component instance.
  13293. *
  13294. * Most applications should instead use higher-level {@link DynamicComponentLoader} service, which
  13295. * both compiles and instantiates a Component.
  13296. */
  13297. var Compiler = (function () {
  13298. function Compiler() {
  13299. }
  13300. return Compiler;
  13301. })();
  13302. exports.Compiler = Compiler;
  13303. function _isCompiledHostTemplate(type) {
  13304. return type instanceof template_commands_1.CompiledHostTemplate;
  13305. }
  13306. var Compiler_ = (function (_super) {
  13307. __extends(Compiler_, _super);
  13308. function Compiler_(_protoViewFactory) {
  13309. _super.call(this);
  13310. this._protoViewFactory = _protoViewFactory;
  13311. }
  13312. Compiler_.prototype.compileInHost = function (componentType) {
  13313. var metadatas = reflection_1.reflector.annotations(componentType);
  13314. var compiledHostTemplate = metadatas.find(_isCompiledHostTemplate);
  13315. if (lang_1.isBlank(compiledHostTemplate)) {
  13316. throw new exceptions_1.BaseException("No precompiled template for component " + lang_1.stringify(componentType) + " found");
  13317. }
  13318. return async_1.PromiseWrapper.resolve(this._createProtoView(compiledHostTemplate));
  13319. };
  13320. Compiler_.prototype._createProtoView = function (compiledHostTemplate) {
  13321. return this._protoViewFactory.createHost(compiledHostTemplate).ref;
  13322. };
  13323. Compiler_.prototype.clearCache = function () { this._protoViewFactory.clearCache(); };
  13324. Compiler_ = __decorate([
  13325. di_1.Injectable(),
  13326. __metadata('design:paramtypes', [proto_view_factory_1.ProtoViewFactory])
  13327. ], Compiler_);
  13328. return Compiler_;
  13329. })(Compiler);
  13330. exports.Compiler_ = Compiler_;
  13331. function internalCreateProtoView(compiler, compiledHostTemplate) {
  13332. return compiler._createProtoView(compiledHostTemplate);
  13333. }
  13334. exports.internalCreateProtoView = internalCreateProtoView;
  13335. /***/ },
  13336. /* 71 */
  13337. /***/ function(module, exports, __webpack_require__) {
  13338. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  13339. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  13340. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  13341. 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;
  13342. return c > 3 && r && Object.defineProperty(target, key, r), r;
  13343. };
  13344. var __metadata = (this && this.__metadata) || function (k, v) {
  13345. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  13346. };
  13347. var __param = (this && this.__param) || function (paramIndex, decorator) {
  13348. return function (target, key) { decorator(target, key, paramIndex); }
  13349. };
  13350. var lang_1 = __webpack_require__(5);
  13351. var api_1 = __webpack_require__(72);
  13352. var di_1 = __webpack_require__(6);
  13353. var pipe_provider_1 = __webpack_require__(73);
  13354. var pipes_1 = __webpack_require__(74);
  13355. var view_1 = __webpack_require__(76);
  13356. var element_binder_1 = __webpack_require__(79);
  13357. var element_injector_1 = __webpack_require__(80);
  13358. var directive_resolver_1 = __webpack_require__(92);
  13359. var view_resolver_1 = __webpack_require__(93);
  13360. var pipe_resolver_1 = __webpack_require__(94);
  13361. var view_2 = __webpack_require__(56);
  13362. var platform_directives_and_pipes_1 = __webpack_require__(95);
  13363. var template_commands_1 = __webpack_require__(96);
  13364. var api_2 = __webpack_require__(72);
  13365. var application_tokens_1 = __webpack_require__(67);
  13366. var ProtoViewFactory = (function () {
  13367. function ProtoViewFactory(_renderer, _platformPipes, _directiveResolver, _viewResolver, _pipeResolver, _appId) {
  13368. this._renderer = _renderer;
  13369. this._platformPipes = _platformPipes;
  13370. this._directiveResolver = _directiveResolver;
  13371. this._viewResolver = _viewResolver;
  13372. this._pipeResolver = _pipeResolver;
  13373. this._appId = _appId;
  13374. this._cache = new Map();
  13375. this._nextTemplateId = 0;
  13376. }
  13377. ProtoViewFactory.prototype.clearCache = function () { this._cache.clear(); };
  13378. ProtoViewFactory.prototype.createHost = function (compiledHostTemplate) {
  13379. var compiledTemplate = compiledHostTemplate.template;
  13380. var result = this._cache.get(compiledTemplate.id);
  13381. if (lang_1.isBlank(result)) {
  13382. var emptyMap = {};
  13383. var shortId = this._appId + "-" + this._nextTemplateId++;
  13384. this._renderer.registerComponentTemplate(new api_1.RenderComponentTemplate(compiledTemplate.id, shortId, view_2.ViewEncapsulation.None, compiledTemplate.commands, []));
  13385. result =
  13386. new view_1.AppProtoView(compiledTemplate.id, compiledTemplate.commands, view_1.ViewType.HOST, true, compiledTemplate.changeDetectorFactory, null, new pipes_1.ProtoPipes(emptyMap));
  13387. this._cache.set(compiledTemplate.id, result);
  13388. }
  13389. return result;
  13390. };
  13391. ProtoViewFactory.prototype._createComponent = function (cmd) {
  13392. var _this = this;
  13393. var nestedProtoView = this._cache.get(cmd.templateId);
  13394. if (lang_1.isBlank(nestedProtoView)) {
  13395. var component = cmd.directives[0];
  13396. var view = this._viewResolver.resolve(component);
  13397. var compiledTemplate = cmd.templateGetter();
  13398. var styles = _flattenStyleArr(compiledTemplate.styles, []);
  13399. var shortId = this._appId + "-" + this._nextTemplateId++;
  13400. this._renderer.registerComponentTemplate(new api_1.RenderComponentTemplate(compiledTemplate.id, shortId, cmd.encapsulation, compiledTemplate.commands, styles));
  13401. var boundPipes = this._flattenPipes(view).map(function (pipe) { return _this._bindPipe(pipe); });
  13402. nestedProtoView = new view_1.AppProtoView(compiledTemplate.id, compiledTemplate.commands, view_1.ViewType.COMPONENT, true, compiledTemplate.changeDetectorFactory, null, pipes_1.ProtoPipes.fromProviders(boundPipes));
  13403. // Note: The cache is updated before recursing
  13404. // to be able to resolve cycles
  13405. this._cache.set(compiledTemplate.id, nestedProtoView);
  13406. this._initializeProtoView(nestedProtoView, null);
  13407. }
  13408. return nestedProtoView;
  13409. };
  13410. ProtoViewFactory.prototype._createEmbeddedTemplate = function (cmd, parent) {
  13411. 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));
  13412. if (cmd.isMerged) {
  13413. this.initializeProtoViewIfNeeded(nestedProtoView);
  13414. }
  13415. return nestedProtoView;
  13416. };
  13417. ProtoViewFactory.prototype.initializeProtoViewIfNeeded = function (protoView) {
  13418. if (!protoView.isInitialized()) {
  13419. var render = this._renderer.createProtoView(protoView.templateId, protoView.templateCmds);
  13420. this._initializeProtoView(protoView, render);
  13421. }
  13422. };
  13423. ProtoViewFactory.prototype._initializeProtoView = function (protoView, render) {
  13424. var initializer = new _ProtoViewInitializer(protoView, this._directiveResolver, this);
  13425. template_commands_1.visitAllCommands(initializer, protoView.templateCmds);
  13426. var mergeInfo = new view_1.AppProtoViewMergeInfo(initializer.mergeEmbeddedViewCount, initializer.mergeElementCount, initializer.mergeViewCount);
  13427. protoView.init(render, initializer.elementBinders, initializer.boundTextCount, mergeInfo, initializer.variableLocations);
  13428. };
  13429. ProtoViewFactory.prototype._bindPipe = function (typeOrProvider) {
  13430. var meta = this._pipeResolver.resolve(typeOrProvider);
  13431. return pipe_provider_1.PipeProvider.createFromType(typeOrProvider, meta);
  13432. };
  13433. ProtoViewFactory.prototype._flattenPipes = function (view) {
  13434. var pipes = [];
  13435. if (lang_1.isPresent(this._platformPipes)) {
  13436. _flattenArray(this._platformPipes, pipes);
  13437. }
  13438. if (lang_1.isPresent(view.pipes)) {
  13439. _flattenArray(view.pipes, pipes);
  13440. }
  13441. return pipes;
  13442. };
  13443. ProtoViewFactory = __decorate([
  13444. di_1.Injectable(),
  13445. __param(1, di_1.Optional()),
  13446. __param(1, di_1.Inject(platform_directives_and_pipes_1.PLATFORM_PIPES)),
  13447. __param(5, di_1.Inject(application_tokens_1.APP_ID)),
  13448. __metadata('design:paramtypes', [api_2.Renderer, Array, directive_resolver_1.DirectiveResolver, view_resolver_1.ViewResolver, pipe_resolver_1.PipeResolver, String])
  13449. ], ProtoViewFactory);
  13450. return ProtoViewFactory;
  13451. })();
  13452. exports.ProtoViewFactory = ProtoViewFactory;
  13453. function createComponent(protoViewFactory, cmd) {
  13454. return protoViewFactory._createComponent(cmd);
  13455. }
  13456. function createEmbeddedTemplate(protoViewFactory, cmd, parent) {
  13457. return protoViewFactory._createEmbeddedTemplate(cmd, parent);
  13458. }
  13459. var _ProtoViewInitializer = (function () {
  13460. function _ProtoViewInitializer(_protoView, _directiveResolver, _protoViewFactory) {
  13461. this._protoView = _protoView;
  13462. this._directiveResolver = _directiveResolver;
  13463. this._protoViewFactory = _protoViewFactory;
  13464. this.variableLocations = new Map();
  13465. this.boundTextCount = 0;
  13466. this.boundElementIndex = 0;
  13467. this.elementBinderStack = [];
  13468. this.distanceToParentElementBinder = 0;
  13469. this.distanceToParentProtoElementInjector = 0;
  13470. this.elementBinders = [];
  13471. this.mergeEmbeddedViewCount = 0;
  13472. this.mergeElementCount = 0;
  13473. this.mergeViewCount = 1;
  13474. }
  13475. _ProtoViewInitializer.prototype.visitText = function (cmd, context) {
  13476. if (cmd.isBound) {
  13477. this.boundTextCount++;
  13478. }
  13479. return null;
  13480. };
  13481. _ProtoViewInitializer.prototype.visitNgContent = function (cmd, context) { return null; };
  13482. _ProtoViewInitializer.prototype.visitBeginElement = function (cmd, context) {
  13483. if (cmd.isBound) {
  13484. this._visitBeginBoundElement(cmd, null);
  13485. }
  13486. else {
  13487. this._visitBeginElement(cmd, null, null);
  13488. }
  13489. return null;
  13490. };
  13491. _ProtoViewInitializer.prototype.visitEndElement = function (context) { return this._visitEndElement(); };
  13492. _ProtoViewInitializer.prototype.visitBeginComponent = function (cmd, context) {
  13493. var nestedProtoView = createComponent(this._protoViewFactory, cmd);
  13494. return this._visitBeginBoundElement(cmd, nestedProtoView);
  13495. };
  13496. _ProtoViewInitializer.prototype.visitEndComponent = function (context) { return this._visitEndElement(); };
  13497. _ProtoViewInitializer.prototype.visitEmbeddedTemplate = function (cmd, context) {
  13498. var nestedProtoView = createEmbeddedTemplate(this._protoViewFactory, cmd, this._protoView);
  13499. if (cmd.isMerged) {
  13500. this.mergeEmbeddedViewCount++;
  13501. }
  13502. this._visitBeginBoundElement(cmd, nestedProtoView);
  13503. return this._visitEndElement();
  13504. };
  13505. _ProtoViewInitializer.prototype._visitBeginBoundElement = function (cmd, nestedProtoView) {
  13506. if (lang_1.isPresent(nestedProtoView) && nestedProtoView.isMergable) {
  13507. this.mergeElementCount += nestedProtoView.mergeInfo.elementCount;
  13508. this.mergeViewCount += nestedProtoView.mergeInfo.viewCount;
  13509. this.mergeEmbeddedViewCount += nestedProtoView.mergeInfo.embeddedViewCount;
  13510. }
  13511. var elementBinder = _createElementBinder(this._directiveResolver, nestedProtoView, this.elementBinderStack, this.boundElementIndex, this.distanceToParentElementBinder, this.distanceToParentProtoElementInjector, cmd);
  13512. this.elementBinders.push(elementBinder);
  13513. var protoElementInjector = elementBinder.protoElementInjector;
  13514. for (var i = 0; i < cmd.variableNameAndValues.length; i += 2) {
  13515. this.variableLocations.set(cmd.variableNameAndValues[i], this.boundElementIndex);
  13516. }
  13517. this.boundElementIndex++;
  13518. this.mergeElementCount++;
  13519. return this._visitBeginElement(cmd, elementBinder, protoElementInjector);
  13520. };
  13521. _ProtoViewInitializer.prototype._visitBeginElement = function (cmd, elementBinder, protoElementInjector) {
  13522. this.distanceToParentElementBinder =
  13523. lang_1.isPresent(elementBinder) ? 1 : this.distanceToParentElementBinder + 1;
  13524. this.distanceToParentProtoElementInjector =
  13525. lang_1.isPresent(protoElementInjector) ? 1 : this.distanceToParentProtoElementInjector + 1;
  13526. this.elementBinderStack.push(elementBinder);
  13527. return null;
  13528. };
  13529. _ProtoViewInitializer.prototype._visitEndElement = function () {
  13530. var parentElementBinder = this.elementBinderStack.pop();
  13531. var parentProtoElementInjector = lang_1.isPresent(parentElementBinder) ? parentElementBinder.protoElementInjector : null;
  13532. this.distanceToParentElementBinder = lang_1.isPresent(parentElementBinder) ?
  13533. parentElementBinder.distanceToParent :
  13534. this.distanceToParentElementBinder - 1;
  13535. this.distanceToParentProtoElementInjector = lang_1.isPresent(parentProtoElementInjector) ?
  13536. parentProtoElementInjector.distanceToParent :
  13537. this.distanceToParentProtoElementInjector - 1;
  13538. return null;
  13539. };
  13540. return _ProtoViewInitializer;
  13541. })();
  13542. function _createElementBinder(directiveResolver, nestedProtoView, elementBinderStack, boundElementIndex, distanceToParentBinder, distanceToParentPei, beginElementCmd) {
  13543. var parentElementBinder = null;
  13544. var parentProtoElementInjector = null;
  13545. if (distanceToParentBinder > 0) {
  13546. parentElementBinder = elementBinderStack[elementBinderStack.length - distanceToParentBinder];
  13547. }
  13548. if (lang_1.isBlank(parentElementBinder)) {
  13549. distanceToParentBinder = -1;
  13550. }
  13551. if (distanceToParentPei > 0) {
  13552. var peiBinder = elementBinderStack[elementBinderStack.length - distanceToParentPei];
  13553. if (lang_1.isPresent(peiBinder)) {
  13554. parentProtoElementInjector = peiBinder.protoElementInjector;
  13555. }
  13556. }
  13557. if (lang_1.isBlank(parentProtoElementInjector)) {
  13558. distanceToParentPei = -1;
  13559. }
  13560. var componentDirectiveProvider = null;
  13561. var isEmbeddedTemplate = false;
  13562. var directiveProviders = beginElementCmd.directives.map(function (type) { return provideDirective(directiveResolver, type); });
  13563. if (beginElementCmd instanceof template_commands_1.BeginComponentCmd) {
  13564. componentDirectiveProvider = directiveProviders[0];
  13565. }
  13566. else if (beginElementCmd instanceof template_commands_1.EmbeddedTemplateCmd) {
  13567. isEmbeddedTemplate = true;
  13568. }
  13569. var protoElementInjector = null;
  13570. // Create a protoElementInjector for any element that either has bindings *or* has one
  13571. // or more var- defined *or* for <template> elements:
  13572. // - Elements with a var- defined need a their own element injector
  13573. // so that, when hydrating, $implicit can be set to the element.
  13574. // - <template> elements need their own ElementInjector so that we can query their TemplateRef
  13575. var hasVariables = beginElementCmd.variableNameAndValues.length > 0;
  13576. if (directiveProviders.length > 0 || hasVariables || isEmbeddedTemplate) {
  13577. var directiveVariableBindings = new Map();
  13578. if (!isEmbeddedTemplate) {
  13579. directiveVariableBindings = createDirectiveVariableBindings(beginElementCmd.variableNameAndValues, directiveProviders);
  13580. }
  13581. protoElementInjector = element_injector_1.ProtoElementInjector.create(parentProtoElementInjector, boundElementIndex, directiveProviders, lang_1.isPresent(componentDirectiveProvider), distanceToParentPei, directiveVariableBindings);
  13582. protoElementInjector.attributes = arrayToMap(beginElementCmd.attrNameAndValues, false);
  13583. }
  13584. return new element_binder_1.ElementBinder(boundElementIndex, parentElementBinder, distanceToParentBinder, protoElementInjector, componentDirectiveProvider, nestedProtoView);
  13585. }
  13586. function provideDirective(directiveResolver, type) {
  13587. var annotation = directiveResolver.resolve(type);
  13588. return element_injector_1.DirectiveProvider.createFromType(type, annotation);
  13589. }
  13590. function createDirectiveVariableBindings(variableNameAndValues, directiveProviders) {
  13591. var directiveVariableBindings = new Map();
  13592. for (var i = 0; i < variableNameAndValues.length; i += 2) {
  13593. var templateName = variableNameAndValues[i];
  13594. var dirIndex = variableNameAndValues[i + 1];
  13595. if (lang_1.isNumber(dirIndex)) {
  13596. directiveVariableBindings.set(templateName, dirIndex);
  13597. }
  13598. else {
  13599. // a variable without a directive index -> reference the element
  13600. directiveVariableBindings.set(templateName, null);
  13601. }
  13602. }
  13603. return directiveVariableBindings;
  13604. }
  13605. exports.createDirectiveVariableBindings = createDirectiveVariableBindings;
  13606. function arrayToMap(arr, inverse) {
  13607. var result = new Map();
  13608. for (var i = 0; i < arr.length; i += 2) {
  13609. if (inverse) {
  13610. result.set(arr[i + 1], arr[i]);
  13611. }
  13612. else {
  13613. result.set(arr[i], arr[i + 1]);
  13614. }
  13615. }
  13616. return result;
  13617. }
  13618. function _flattenArray(tree, out) {
  13619. for (var i = 0; i < tree.length; i++) {
  13620. var item = di_1.resolveForwardRef(tree[i]);
  13621. if (lang_1.isArray(item)) {
  13622. _flattenArray(item, out);
  13623. }
  13624. else {
  13625. out.push(item);
  13626. }
  13627. }
  13628. }
  13629. function _flattenStyleArr(arr, out) {
  13630. for (var i = 0; i < arr.length; i++) {
  13631. var entry = arr[i];
  13632. if (lang_1.isArray(entry)) {
  13633. _flattenStyleArr(entry, out);
  13634. }
  13635. else {
  13636. out.push(entry);
  13637. }
  13638. }
  13639. return out;
  13640. }
  13641. /***/ },
  13642. /* 72 */
  13643. /***/ function(module, exports, __webpack_require__) {
  13644. var __extends = (this && this.__extends) || function (d, b) {
  13645. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  13646. function __() { this.constructor = d; }
  13647. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  13648. };
  13649. var exceptions_1 = __webpack_require__(14);
  13650. /**
  13651. * Represents an Angular ProtoView in the Rendering Context.
  13652. *
  13653. * When you implement a custom {@link Renderer}, `RenderProtoViewRef` specifies what Render View
  13654. * your renderer should create.
  13655. *
  13656. * `RenderProtoViewRef` is a counterpart to {@link ProtoViewRef} available in the Application
  13657. * Context. But unlike `ProtoViewRef`, `RenderProtoViewRef` contains all static nested Proto Views
  13658. * that are recursively merged into a single Render Proto View.
  13659. *
  13660. * <!-- TODO: this is created by Renderer#createProtoView in the new compiler -->
  13661. */
  13662. var RenderProtoViewRef = (function () {
  13663. function RenderProtoViewRef() {
  13664. }
  13665. return RenderProtoViewRef;
  13666. })();
  13667. exports.RenderProtoViewRef = RenderProtoViewRef;
  13668. /**
  13669. * Represents a list of sibling Nodes that can be moved by the {@link Renderer} independently of
  13670. * other Render Fragments.
  13671. *
  13672. * Any {@link RenderViewRef} has one Render Fragment.
  13673. *
  13674. * Additionally any View with an Embedded View that contains a {@link NgContentAst View Projection}
  13675. * results in additional Render Fragment.
  13676. */
  13677. /*
  13678. <div>foo</div>
  13679. {{bar}}
  13680. <div>foo</div> -> view 1 / fragment 1
  13681. <ul>
  13682. <template ngFor>
  13683. <li>{{fg}}</li> -> view 2 / fragment 1
  13684. </template>
  13685. </ul>
  13686. {{bar}}
  13687. <div>foo</div> -> view 1 / fragment 1
  13688. <ul>
  13689. <template ngIf>
  13690. <li><ng-content></></li> -> view 1 / fragment 2
  13691. </template>
  13692. <template ngFor>
  13693. <li><ng-content></></li> ->
  13694. <li></li> -> view 1 / fragment 2 + view 2 / fragment 1..n-1
  13695. </template>
  13696. </ul>
  13697. {{bar}}
  13698. */
  13699. // TODO(i): refactor into an interface
  13700. var RenderFragmentRef = (function () {
  13701. function RenderFragmentRef() {
  13702. }
  13703. return RenderFragmentRef;
  13704. })();
  13705. exports.RenderFragmentRef = RenderFragmentRef;
  13706. /**
  13707. * Represents an Angular View in the Rendering Context.
  13708. *
  13709. * `RenderViewRef` specifies to the {@link Renderer} what View to update or destroy.
  13710. *
  13711. * Unlike a {@link ViewRef} available in the Application Context, Render View contains all the
  13712. * static Component Views that have been recursively merged into a single Render View.
  13713. *
  13714. * Each `RenderViewRef` contains one or more {@link RenderFragmentRef Render Fragments}, these
  13715. * Fragments are created, hydrated, dehydrated and destroyed as a single unit together with the
  13716. * View.
  13717. */
  13718. // TODO(i): refactor into an interface
  13719. var RenderViewRef = (function () {
  13720. function RenderViewRef() {
  13721. }
  13722. return RenderViewRef;
  13723. })();
  13724. exports.RenderViewRef = RenderViewRef;
  13725. /**
  13726. * Abstract base class for commands to the Angular renderer, using the visitor pattern.
  13727. */
  13728. var RenderTemplateCmd = (function () {
  13729. function RenderTemplateCmd() {
  13730. }
  13731. return RenderTemplateCmd;
  13732. })();
  13733. exports.RenderTemplateCmd = RenderTemplateCmd;
  13734. /**
  13735. * Command to begin rendering.
  13736. */
  13737. var RenderBeginCmd = (function (_super) {
  13738. __extends(RenderBeginCmd, _super);
  13739. function RenderBeginCmd() {
  13740. _super.apply(this, arguments);
  13741. }
  13742. Object.defineProperty(RenderBeginCmd.prototype, "ngContentIndex", {
  13743. get: function () { return exceptions_1.unimplemented(); },
  13744. enumerable: true,
  13745. configurable: true
  13746. });
  13747. ;
  13748. Object.defineProperty(RenderBeginCmd.prototype, "isBound", {
  13749. get: function () { return exceptions_1.unimplemented(); },
  13750. enumerable: true,
  13751. configurable: true
  13752. });
  13753. ;
  13754. return RenderBeginCmd;
  13755. })(RenderTemplateCmd);
  13756. exports.RenderBeginCmd = RenderBeginCmd;
  13757. /**
  13758. * Command to render text.
  13759. */
  13760. var RenderTextCmd = (function (_super) {
  13761. __extends(RenderTextCmd, _super);
  13762. function RenderTextCmd() {
  13763. _super.apply(this, arguments);
  13764. }
  13765. Object.defineProperty(RenderTextCmd.prototype, "value", {
  13766. get: function () { return exceptions_1.unimplemented(); },
  13767. enumerable: true,
  13768. configurable: true
  13769. });
  13770. ;
  13771. return RenderTextCmd;
  13772. })(RenderBeginCmd);
  13773. exports.RenderTextCmd = RenderTextCmd;
  13774. /**
  13775. * Command to render projected content.
  13776. */
  13777. var RenderNgContentCmd = (function (_super) {
  13778. __extends(RenderNgContentCmd, _super);
  13779. function RenderNgContentCmd() {
  13780. _super.apply(this, arguments);
  13781. }
  13782. Object.defineProperty(RenderNgContentCmd.prototype, "index", {
  13783. // The index of this NgContent element
  13784. get: function () { return exceptions_1.unimplemented(); },
  13785. enumerable: true,
  13786. configurable: true
  13787. });
  13788. ;
  13789. Object.defineProperty(RenderNgContentCmd.prototype, "ngContentIndex", {
  13790. // The index of the NgContent element into which this
  13791. // NgContent element should be projected (if any)
  13792. get: function () { return exceptions_1.unimplemented(); },
  13793. enumerable: true,
  13794. configurable: true
  13795. });
  13796. ;
  13797. return RenderNgContentCmd;
  13798. })(RenderTemplateCmd);
  13799. exports.RenderNgContentCmd = RenderNgContentCmd;
  13800. /**
  13801. * Command to begin rendering an element.
  13802. */
  13803. var RenderBeginElementCmd = (function (_super) {
  13804. __extends(RenderBeginElementCmd, _super);
  13805. function RenderBeginElementCmd() {
  13806. _super.apply(this, arguments);
  13807. }
  13808. Object.defineProperty(RenderBeginElementCmd.prototype, "name", {
  13809. get: function () { return exceptions_1.unimplemented(); },
  13810. enumerable: true,
  13811. configurable: true
  13812. });
  13813. ;
  13814. Object.defineProperty(RenderBeginElementCmd.prototype, "attrNameAndValues", {
  13815. get: function () { return exceptions_1.unimplemented(); },
  13816. enumerable: true,
  13817. configurable: true
  13818. });
  13819. ;
  13820. Object.defineProperty(RenderBeginElementCmd.prototype, "eventTargetAndNames", {
  13821. get: function () { return exceptions_1.unimplemented(); },
  13822. enumerable: true,
  13823. configurable: true
  13824. });
  13825. ;
  13826. return RenderBeginElementCmd;
  13827. })(RenderBeginCmd);
  13828. exports.RenderBeginElementCmd = RenderBeginElementCmd;
  13829. /**
  13830. * Command to begin rendering a component.
  13831. */
  13832. var RenderBeginComponentCmd = (function (_super) {
  13833. __extends(RenderBeginComponentCmd, _super);
  13834. function RenderBeginComponentCmd() {
  13835. _super.apply(this, arguments);
  13836. }
  13837. Object.defineProperty(RenderBeginComponentCmd.prototype, "templateId", {
  13838. get: function () { return exceptions_1.unimplemented(); },
  13839. enumerable: true,
  13840. configurable: true
  13841. });
  13842. ;
  13843. return RenderBeginComponentCmd;
  13844. })(RenderBeginElementCmd);
  13845. exports.RenderBeginComponentCmd = RenderBeginComponentCmd;
  13846. /**
  13847. * Command to render a component's template.
  13848. */
  13849. var RenderEmbeddedTemplateCmd = (function (_super) {
  13850. __extends(RenderEmbeddedTemplateCmd, _super);
  13851. function RenderEmbeddedTemplateCmd() {
  13852. _super.apply(this, arguments);
  13853. }
  13854. Object.defineProperty(RenderEmbeddedTemplateCmd.prototype, "isMerged", {
  13855. get: function () { return exceptions_1.unimplemented(); },
  13856. enumerable: true,
  13857. configurable: true
  13858. });
  13859. ;
  13860. Object.defineProperty(RenderEmbeddedTemplateCmd.prototype, "children", {
  13861. get: function () { return exceptions_1.unimplemented(); },
  13862. enumerable: true,
  13863. configurable: true
  13864. });
  13865. ;
  13866. return RenderEmbeddedTemplateCmd;
  13867. })(RenderBeginElementCmd);
  13868. exports.RenderEmbeddedTemplateCmd = RenderEmbeddedTemplateCmd;
  13869. /**
  13870. * Container class produced by a {@link Renderer} when creating a Render View.
  13871. *
  13872. * An instance of `RenderViewWithFragments` contains a {@link RenderViewRef} and an array of
  13873. * {@link RenderFragmentRef}s belonging to this Render View.
  13874. */
  13875. // TODO(i): refactor this by RenderViewWithFragments and adding fragments directly to RenderViewRef
  13876. var RenderViewWithFragments = (function () {
  13877. function RenderViewWithFragments(
  13878. /**
  13879. * Reference to the {@link RenderViewRef}.
  13880. */
  13881. viewRef,
  13882. /**
  13883. * Array of {@link RenderFragmentRef}s ordered in the depth-first order.
  13884. */
  13885. fragmentRefs) {
  13886. this.viewRef = viewRef;
  13887. this.fragmentRefs = fragmentRefs;
  13888. }
  13889. return RenderViewWithFragments;
  13890. })();
  13891. exports.RenderViewWithFragments = RenderViewWithFragments;
  13892. /**
  13893. * Template for rendering a component, including commands and styles.
  13894. */
  13895. var RenderComponentTemplate = (function () {
  13896. function RenderComponentTemplate(id, shortId, encapsulation, commands, styles) {
  13897. this.id = id;
  13898. this.shortId = shortId;
  13899. this.encapsulation = encapsulation;
  13900. this.commands = commands;
  13901. this.styles = styles;
  13902. }
  13903. return RenderComponentTemplate;
  13904. })();
  13905. exports.RenderComponentTemplate = RenderComponentTemplate;
  13906. /**
  13907. * Injectable service that provides a low-level interface for modifying the UI.
  13908. *
  13909. * Use this service to bypass Angular's templating and make custom UI changes that can't be
  13910. * expressed declaratively. For example if you need to set a property or an attribute whose name is
  13911. * not statically known, use {@link #setElementProperty} or {@link #setElementAttribute}
  13912. * respectively.
  13913. *
  13914. * If you are implementing a custom renderer, you must implement this interface.
  13915. *
  13916. * The default Renderer implementation is `DomRenderer`. Also available is `WebWorkerRenderer`.
  13917. */
  13918. var Renderer = (function () {
  13919. function Renderer() {
  13920. }
  13921. return Renderer;
  13922. })();
  13923. exports.Renderer = Renderer;
  13924. /***/ },
  13925. /* 73 */
  13926. /***/ function(module, exports, __webpack_require__) {
  13927. var __extends = (this && this.__extends) || function (d, b) {
  13928. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  13929. function __() { this.constructor = d; }
  13930. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  13931. };
  13932. var provider_1 = __webpack_require__(13);
  13933. var di_1 = __webpack_require__(6);
  13934. var PipeProvider = (function (_super) {
  13935. __extends(PipeProvider, _super);
  13936. function PipeProvider(name, pure, key, resolvedFactories, multiBinding) {
  13937. _super.call(this, key, resolvedFactories, multiBinding);
  13938. this.name = name;
  13939. this.pure = pure;
  13940. }
  13941. PipeProvider.createFromType = function (type, metadata) {
  13942. var provider = new di_1.Provider(type, { useClass: type });
  13943. var rb = provider_1.resolveProvider(provider);
  13944. return new PipeProvider(metadata.name, metadata.pure, rb.key, rb.resolvedFactories, rb.multiProvider);
  13945. };
  13946. return PipeProvider;
  13947. })(provider_1.ResolvedProvider_);
  13948. exports.PipeProvider = PipeProvider;
  13949. /***/ },
  13950. /* 74 */
  13951. /***/ function(module, exports, __webpack_require__) {
  13952. var lang_1 = __webpack_require__(5);
  13953. var exceptions_1 = __webpack_require__(14);
  13954. var collection_1 = __webpack_require__(12);
  13955. var cd = __webpack_require__(75);
  13956. var ProtoPipes = (function () {
  13957. function ProtoPipes(
  13958. /**
  13959. * Map of {@link PipeMetadata} names to {@link PipeMetadata} implementations.
  13960. */
  13961. config) {
  13962. this.config = config;
  13963. this.config = config;
  13964. }
  13965. ProtoPipes.fromProviders = function (providers) {
  13966. var config = {};
  13967. providers.forEach(function (b) { return config[b.name] = b; });
  13968. return new ProtoPipes(config);
  13969. };
  13970. ProtoPipes.prototype.get = function (name) {
  13971. var provider = this.config[name];
  13972. if (lang_1.isBlank(provider))
  13973. throw new exceptions_1.BaseException("Cannot find pipe '" + name + "'.");
  13974. return provider;
  13975. };
  13976. return ProtoPipes;
  13977. })();
  13978. exports.ProtoPipes = ProtoPipes;
  13979. var Pipes = (function () {
  13980. function Pipes(proto, injector) {
  13981. this.proto = proto;
  13982. this.injector = injector;
  13983. /** @internal */
  13984. this._config = {};
  13985. }
  13986. Pipes.prototype.get = function (name) {
  13987. var cached = collection_1.StringMapWrapper.get(this._config, name);
  13988. if (lang_1.isPresent(cached))
  13989. return cached;
  13990. var p = this.proto.get(name);
  13991. var transform = this.injector.instantiateResolved(p);
  13992. var res = new cd.SelectedPipe(transform, p.pure);
  13993. if (p.pure) {
  13994. collection_1.StringMapWrapper.set(this._config, name, res);
  13995. }
  13996. return res;
  13997. };
  13998. return Pipes;
  13999. })();
  14000. exports.Pipes = Pipes;
  14001. /***/ },
  14002. /* 75 */
  14003. /***/ function(module, exports) {
  14004. var SelectedPipe = (function () {
  14005. function SelectedPipe(pipe, pure) {
  14006. this.pipe = pipe;
  14007. this.pure = pure;
  14008. }
  14009. return SelectedPipe;
  14010. })();
  14011. exports.SelectedPipe = SelectedPipe;
  14012. /***/ },
  14013. /* 76 */
  14014. /***/ function(module, exports, __webpack_require__) {
  14015. var __extends = (this && this.__extends) || function (d, b) {
  14016. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  14017. function __() { this.constructor = d; }
  14018. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  14019. };
  14020. var collection_1 = __webpack_require__(12);
  14021. var change_detection_1 = __webpack_require__(25);
  14022. var interfaces_1 = __webpack_require__(35);
  14023. var lang_1 = __webpack_require__(5);
  14024. var exceptions_1 = __webpack_require__(14);
  14025. var view_ref_1 = __webpack_require__(77);
  14026. var util_1 = __webpack_require__(78);
  14027. var view_ref_2 = __webpack_require__(77);
  14028. var interfaces_2 = __webpack_require__(35);
  14029. exports.DebugContext = interfaces_2.DebugContext;
  14030. var REFLECT_PREFIX = 'ng-reflect-';
  14031. (function (ViewType) {
  14032. // A view that contains the host element with bound component directive.
  14033. // Contains a COMPONENT view
  14034. ViewType[ViewType["HOST"] = 0] = "HOST";
  14035. // The view of the component
  14036. // Can contain 0 to n EMBEDDED views
  14037. ViewType[ViewType["COMPONENT"] = 1] = "COMPONENT";
  14038. // A view that is embedded into another View via a <template> element
  14039. // inside of a COMPONENT view
  14040. ViewType[ViewType["EMBEDDED"] = 2] = "EMBEDDED";
  14041. })(exports.ViewType || (exports.ViewType = {}));
  14042. var ViewType = exports.ViewType;
  14043. var AppViewContainer = (function () {
  14044. function AppViewContainer() {
  14045. // The order in this list matches the DOM order.
  14046. this.views = [];
  14047. }
  14048. return AppViewContainer;
  14049. })();
  14050. exports.AppViewContainer = AppViewContainer;
  14051. /**
  14052. * Cost of making objects: http://jsperf.com/instantiate-size-of-object
  14053. *
  14054. */
  14055. var AppView = (function () {
  14056. function AppView(renderer, proto, viewOffset, elementOffset, textOffset, protoLocals, render, renderFragment, containerElementInjector) {
  14057. this.renderer = renderer;
  14058. this.proto = proto;
  14059. this.viewOffset = viewOffset;
  14060. this.elementOffset = elementOffset;
  14061. this.textOffset = textOffset;
  14062. this.render = render;
  14063. this.renderFragment = renderFragment;
  14064. this.containerElementInjector = containerElementInjector;
  14065. // AppViews that have been merged in depth first order.
  14066. // This list is shared between all merged views. Use this.elementOffset to get the local
  14067. // entries.
  14068. this.views = null;
  14069. // ElementInjectors of all AppViews in views grouped by view.
  14070. // This list is shared between all merged views. Use this.elementOffset to get the local
  14071. // entries.
  14072. this.elementInjectors = null;
  14073. // ViewContainers of all AppViews in views grouped by view.
  14074. // This list is shared between all merged views. Use this.elementOffset to get the local
  14075. // entries.
  14076. this.viewContainers = null;
  14077. // PreBuiltObjects of all AppViews in views grouped by view.
  14078. // This list is shared between all merged views. Use this.elementOffset to get the local
  14079. // entries.
  14080. this.preBuiltObjects = null;
  14081. this.changeDetector = null;
  14082. /**
  14083. * The context against which data-binding expressions in this view are evaluated against.
  14084. * This is always a component instance.
  14085. */
  14086. this.context = null;
  14087. this.ref = new view_ref_2.ViewRef_(this);
  14088. this.locals = new change_detection_1.Locals(null, collection_1.MapWrapper.clone(protoLocals)); // TODO optimize this
  14089. }
  14090. AppView.prototype.init = function (changeDetector, elementInjectors, rootElementInjectors, preBuiltObjects, views, elementRefs, viewContainers) {
  14091. this.changeDetector = changeDetector;
  14092. this.elementInjectors = elementInjectors;
  14093. this.rootElementInjectors = rootElementInjectors;
  14094. this.preBuiltObjects = preBuiltObjects;
  14095. this.views = views;
  14096. this.elementRefs = elementRefs;
  14097. this.viewContainers = viewContainers;
  14098. };
  14099. AppView.prototype.setLocal = function (contextName, value) {
  14100. if (!this.hydrated())
  14101. throw new exceptions_1.BaseException('Cannot set locals on dehydrated view.');
  14102. if (!this.proto.templateVariableBindings.has(contextName)) {
  14103. return;
  14104. }
  14105. var templateName = this.proto.templateVariableBindings.get(contextName);
  14106. this.locals.set(templateName, value);
  14107. };
  14108. AppView.prototype.hydrated = function () { return lang_1.isPresent(this.context); };
  14109. /**
  14110. * Triggers the event handlers for the element and the directives.
  14111. *
  14112. * This method is intended to be called from directive EventEmitters.
  14113. *
  14114. * @param {string} eventName
  14115. * @param {*} eventObj
  14116. * @param {number} boundElementIndex
  14117. */
  14118. AppView.prototype.triggerEventHandlers = function (eventName, eventObj, boundElementIndex) {
  14119. var locals = new collection_1.Map();
  14120. locals.set('$event', eventObj);
  14121. this.dispatchEvent(boundElementIndex, eventName, locals);
  14122. };
  14123. // dispatch to element injector or text nodes based on context
  14124. AppView.prototype.notifyOnBinding = function (b, currentValue) {
  14125. if (b.isTextNode()) {
  14126. this.renderer.setText(this.render, b.elementIndex + this.textOffset, currentValue);
  14127. }
  14128. else {
  14129. var elementRef = this.elementRefs[this.elementOffset + b.elementIndex];
  14130. if (b.isElementProperty()) {
  14131. this.renderer.setElementProperty(elementRef, b.name, currentValue);
  14132. }
  14133. else if (b.isElementAttribute()) {
  14134. this.renderer.setElementAttribute(elementRef, b.name, lang_1.isPresent(currentValue) ? "" + currentValue : null);
  14135. }
  14136. else if (b.isElementClass()) {
  14137. this.renderer.setElementClass(elementRef, b.name, currentValue);
  14138. }
  14139. else if (b.isElementStyle()) {
  14140. var unit = lang_1.isPresent(b.unit) ? b.unit : '';
  14141. this.renderer.setElementStyle(elementRef, b.name, lang_1.isPresent(currentValue) ? "" + currentValue + unit : null);
  14142. }
  14143. else {
  14144. throw new exceptions_1.BaseException('Unsupported directive record');
  14145. }
  14146. }
  14147. };
  14148. AppView.prototype.logBindingUpdate = function (b, value) {
  14149. if (b.isDirective() || b.isElementProperty()) {
  14150. var elementRef = this.elementRefs[this.elementOffset + b.elementIndex];
  14151. this.renderer.setBindingDebugInfo(elementRef, "" + REFLECT_PREFIX + util_1.camelCaseToDashCase(b.name), "" + value);
  14152. }
  14153. };
  14154. AppView.prototype.notifyAfterContentChecked = function () {
  14155. var eiCount = this.proto.elementBinders.length;
  14156. var ei = this.elementInjectors;
  14157. for (var i = eiCount - 1; i >= 0; i--) {
  14158. if (lang_1.isPresent(ei[i + this.elementOffset]))
  14159. ei[i + this.elementOffset].ngAfterContentChecked();
  14160. }
  14161. };
  14162. AppView.prototype.notifyAfterViewChecked = function () {
  14163. var eiCount = this.proto.elementBinders.length;
  14164. var ei = this.elementInjectors;
  14165. for (var i = eiCount - 1; i >= 0; i--) {
  14166. if (lang_1.isPresent(ei[i + this.elementOffset]))
  14167. ei[i + this.elementOffset].ngAfterViewChecked();
  14168. }
  14169. };
  14170. AppView.prototype.getDirectiveFor = function (directive) {
  14171. var elementInjector = this.elementInjectors[this.elementOffset + directive.elementIndex];
  14172. return elementInjector.getDirectiveAtIndex(directive.directiveIndex);
  14173. };
  14174. AppView.prototype.getNestedView = function (boundElementIndex) {
  14175. var eli = this.elementInjectors[boundElementIndex];
  14176. return lang_1.isPresent(eli) ? eli.getNestedView() : null;
  14177. };
  14178. AppView.prototype.getContainerElement = function () {
  14179. return lang_1.isPresent(this.containerElementInjector) ?
  14180. this.containerElementInjector.getElementRef() :
  14181. null;
  14182. };
  14183. AppView.prototype.getDebugContext = function (elementIndex, directiveIndex) {
  14184. try {
  14185. var offsettedIndex = this.elementOffset + elementIndex;
  14186. var hasRefForIndex = offsettedIndex < this.elementRefs.length;
  14187. var elementRef = hasRefForIndex ? this.elementRefs[this.elementOffset + elementIndex] : null;
  14188. var container = this.getContainerElement();
  14189. var ei = hasRefForIndex ? this.elementInjectors[this.elementOffset + elementIndex] : null;
  14190. var element = lang_1.isPresent(elementRef) ? elementRef.nativeElement : null;
  14191. var componentElement = lang_1.isPresent(container) ? container.nativeElement : null;
  14192. var directive = lang_1.isPresent(directiveIndex) ? this.getDirectiveFor(directiveIndex) : null;
  14193. var injector = lang_1.isPresent(ei) ? ei.getInjector() : null;
  14194. return new interfaces_1.DebugContext(element, componentElement, directive, this.context, _localsToStringMap(this.locals), injector);
  14195. }
  14196. catch (e) {
  14197. // TODO: vsavkin log the exception once we have a good way to log errors and warnings
  14198. // if an error happens during getting the debug context, we return null.
  14199. return null;
  14200. }
  14201. };
  14202. AppView.prototype.getDetectorFor = function (directive) {
  14203. var childView = this.getNestedView(this.elementOffset + directive.elementIndex);
  14204. return lang_1.isPresent(childView) ? childView.changeDetector : null;
  14205. };
  14206. AppView.prototype.invokeElementMethod = function (elementIndex, methodName, args) {
  14207. this.renderer.invokeElementMethod(this.elementRefs[elementIndex], methodName, args);
  14208. };
  14209. // implementation of RenderEventDispatcher#dispatchRenderEvent
  14210. AppView.prototype.dispatchRenderEvent = function (boundElementIndex, eventName, locals) {
  14211. var elementRef = this.elementRefs[boundElementIndex];
  14212. var view = view_ref_1.internalView(elementRef.parentView);
  14213. return view.dispatchEvent(elementRef.boundElementIndex, eventName, locals);
  14214. };
  14215. // returns false if preventDefault must be applied to the DOM event
  14216. AppView.prototype.dispatchEvent = function (boundElementIndex, eventName, locals) {
  14217. try {
  14218. if (this.hydrated()) {
  14219. return !this.changeDetector.handleEvent(eventName, boundElementIndex - this.elementOffset, new change_detection_1.Locals(this.locals, locals));
  14220. }
  14221. else {
  14222. return true;
  14223. }
  14224. }
  14225. catch (e) {
  14226. var c = this.getDebugContext(boundElementIndex - this.elementOffset, null);
  14227. var context = lang_1.isPresent(c) ? new _Context(c.element, c.componentElement, c.context, c.locals, c.injector) :
  14228. null;
  14229. throw new EventEvaluationError(eventName, e, e.stack, context);
  14230. }
  14231. };
  14232. Object.defineProperty(AppView.prototype, "ownBindersCount", {
  14233. get: function () { return this.proto.elementBinders.length; },
  14234. enumerable: true,
  14235. configurable: true
  14236. });
  14237. return AppView;
  14238. })();
  14239. exports.AppView = AppView;
  14240. function _localsToStringMap(locals) {
  14241. var res = {};
  14242. var c = locals;
  14243. while (lang_1.isPresent(c)) {
  14244. res = collection_1.StringMapWrapper.merge(res, collection_1.MapWrapper.toStringMap(c.current));
  14245. c = c.parent;
  14246. }
  14247. return res;
  14248. }
  14249. /**
  14250. * Error context included when an event handler throws an exception.
  14251. */
  14252. var _Context = (function () {
  14253. function _Context(element, componentElement, context, locals, injector) {
  14254. this.element = element;
  14255. this.componentElement = componentElement;
  14256. this.context = context;
  14257. this.locals = locals;
  14258. this.injector = injector;
  14259. }
  14260. return _Context;
  14261. })();
  14262. /**
  14263. * Wraps an exception thrown by an event handler.
  14264. */
  14265. var EventEvaluationError = (function (_super) {
  14266. __extends(EventEvaluationError, _super);
  14267. function EventEvaluationError(eventName, originalException, originalStack, context) {
  14268. _super.call(this, "Error during evaluation of \"" + eventName + "\"", originalException, originalStack, context);
  14269. }
  14270. return EventEvaluationError;
  14271. })(exceptions_1.WrappedException);
  14272. var AppProtoViewMergeInfo = (function () {
  14273. function AppProtoViewMergeInfo(embeddedViewCount, elementCount, viewCount) {
  14274. this.embeddedViewCount = embeddedViewCount;
  14275. this.elementCount = elementCount;
  14276. this.viewCount = viewCount;
  14277. }
  14278. return AppProtoViewMergeInfo;
  14279. })();
  14280. exports.AppProtoViewMergeInfo = AppProtoViewMergeInfo;
  14281. /**
  14282. *
  14283. */
  14284. var AppProtoView = (function () {
  14285. function AppProtoView(templateId, templateCmds, type, isMergable, changeDetectorFactory, templateVariableBindings, pipes) {
  14286. this.templateId = templateId;
  14287. this.templateCmds = templateCmds;
  14288. this.type = type;
  14289. this.isMergable = isMergable;
  14290. this.changeDetectorFactory = changeDetectorFactory;
  14291. this.templateVariableBindings = templateVariableBindings;
  14292. this.pipes = pipes;
  14293. this.elementBinders = null;
  14294. this.mergeInfo = null;
  14295. this.variableLocations = null;
  14296. this.textBindingCount = null;
  14297. this.render = null;
  14298. this.ref = new view_ref_2.ProtoViewRef_(this);
  14299. }
  14300. AppProtoView.prototype.init = function (render, elementBinders, textBindingCount, mergeInfo, variableLocations) {
  14301. var _this = this;
  14302. this.render = render;
  14303. this.elementBinders = elementBinders;
  14304. this.textBindingCount = textBindingCount;
  14305. this.mergeInfo = mergeInfo;
  14306. this.variableLocations = variableLocations;
  14307. this.protoLocals = new collection_1.Map();
  14308. if (lang_1.isPresent(this.templateVariableBindings)) {
  14309. this.templateVariableBindings.forEach(function (templateName, _) { _this.protoLocals.set(templateName, null); });
  14310. }
  14311. if (lang_1.isPresent(variableLocations)) {
  14312. // The view's locals needs to have a full set of variable names at construction time
  14313. // in order to prevent new variables from being set later in the lifecycle. Since we don't
  14314. // want
  14315. // to actually create variable bindings for the $implicit bindings, add to the
  14316. // protoLocals manually.
  14317. variableLocations.forEach(function (_, templateName) { _this.protoLocals.set(templateName, null); });
  14318. }
  14319. };
  14320. AppProtoView.prototype.isInitialized = function () { return lang_1.isPresent(this.elementBinders); };
  14321. return AppProtoView;
  14322. })();
  14323. exports.AppProtoView = AppProtoView;
  14324. /***/ },
  14325. /* 77 */
  14326. /***/ function(module, exports, __webpack_require__) {
  14327. var __extends = (this && this.__extends) || function (d, b) {
  14328. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  14329. function __() { this.constructor = d; }
  14330. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  14331. };
  14332. var lang_1 = __webpack_require__(5);
  14333. var exceptions_1 = __webpack_require__(14);
  14334. // This is a workaround for privacy in Dart as we don't have library parts
  14335. function internalView(viewRef) {
  14336. return viewRef._view;
  14337. }
  14338. exports.internalView = internalView;
  14339. // This is a workaround for privacy in Dart as we don't have library parts
  14340. function internalProtoView(protoViewRef) {
  14341. return lang_1.isPresent(protoViewRef) ? protoViewRef._protoView : null;
  14342. }
  14343. exports.internalProtoView = internalProtoView;
  14344. /**
  14345. * Represents an Angular View.
  14346. *
  14347. * <!-- TODO: move the next two paragraphs to the dev guide -->
  14348. * A View is a fundamental building block of the application UI. It is the smallest grouping of
  14349. * Elements which are created and destroyed together.
  14350. *
  14351. * Properties of elements in a View can change, but the structure (number and order) of elements in
  14352. * a View cannot. Changing the structure of Elements can only be done by inserting, moving or
  14353. * removing nested Views via a {@link ViewContainerRef}. Each View can contain many View Containers.
  14354. * <!-- /TODO -->
  14355. *
  14356. * ### Example
  14357. *
  14358. * Given this template...
  14359. *
  14360. * ```
  14361. * Count: {{items.length}}
  14362. * <ul>
  14363. * <li *ngFor="var item of items">{{item}}</li>
  14364. * </ul>
  14365. * ```
  14366. *
  14367. * ... we have two {@link ProtoViewRef}s:
  14368. *
  14369. * Outer {@link ProtoViewRef}:
  14370. * ```
  14371. * Count: {{items.length}}
  14372. * <ul>
  14373. * <template ngFor var-item [ngForOf]="items"></template>
  14374. * </ul>
  14375. * ```
  14376. *
  14377. * Inner {@link ProtoViewRef}:
  14378. * ```
  14379. * <li>{{item}}</li>
  14380. * ```
  14381. *
  14382. * Notice that the original template is broken down into two separate {@link ProtoViewRef}s.
  14383. *
  14384. * The outer/inner {@link ProtoViewRef}s are then assembled into views like so:
  14385. *
  14386. * ```
  14387. * <!-- ViewRef: outer-0 -->
  14388. * Count: 2
  14389. * <ul>
  14390. * <template view-container-ref></template>
  14391. * <!-- ViewRef: inner-1 --><li>first</li><!-- /ViewRef: inner-1 -->
  14392. * <!-- ViewRef: inner-2 --><li>second</li><!-- /ViewRef: inner-2 -->
  14393. * </ul>
  14394. * <!-- /ViewRef: outer-0 -->
  14395. * ```
  14396. */
  14397. var ViewRef = (function () {
  14398. function ViewRef() {
  14399. }
  14400. Object.defineProperty(ViewRef.prototype, "changeDetectorRef", {
  14401. get: function () { return exceptions_1.unimplemented(); },
  14402. set: function (value) {
  14403. exceptions_1.unimplemented(); // TODO: https://github.com/Microsoft/TypeScript/issues/12
  14404. },
  14405. enumerable: true,
  14406. configurable: true
  14407. });
  14408. return ViewRef;
  14409. })();
  14410. exports.ViewRef = ViewRef;
  14411. var ViewRef_ = (function (_super) {
  14412. __extends(ViewRef_, _super);
  14413. function ViewRef_(_view) {
  14414. _super.call(this);
  14415. this._changeDetectorRef = null;
  14416. this._view = _view;
  14417. }
  14418. Object.defineProperty(ViewRef_.prototype, "render", {
  14419. /**
  14420. * Return `RenderViewRef`
  14421. */
  14422. get: function () { return this._view.render; },
  14423. enumerable: true,
  14424. configurable: true
  14425. });
  14426. Object.defineProperty(ViewRef_.prototype, "renderFragment", {
  14427. /**
  14428. * Return `RenderFragmentRef`
  14429. */
  14430. get: function () { return this._view.renderFragment; },
  14431. enumerable: true,
  14432. configurable: true
  14433. });
  14434. Object.defineProperty(ViewRef_.prototype, "changeDetectorRef", {
  14435. /**
  14436. * Return `ChangeDetectorRef`
  14437. */
  14438. get: function () {
  14439. if (this._changeDetectorRef === null) {
  14440. this._changeDetectorRef = this._view.changeDetector.ref;
  14441. }
  14442. return this._changeDetectorRef;
  14443. },
  14444. enumerable: true,
  14445. configurable: true
  14446. });
  14447. ViewRef_.prototype.setLocal = function (variableName, value) { this._view.setLocal(variableName, value); };
  14448. return ViewRef_;
  14449. })(ViewRef);
  14450. exports.ViewRef_ = ViewRef_;
  14451. /**
  14452. * Represents an Angular ProtoView.
  14453. *
  14454. * A ProtoView is a prototypical {@link ViewRef View} that is the result of Template compilation and
  14455. * is used by Angular to efficiently create an instance of this View based on the compiled Template.
  14456. *
  14457. * Most ProtoViews are created and used internally by Angular and you don't need to know about them,
  14458. * except in advanced use-cases where you compile components yourself via the low-level
  14459. * {@link Compiler#compileInHost} API.
  14460. *
  14461. *
  14462. * ### Example
  14463. *
  14464. * Given this template:
  14465. *
  14466. * ```
  14467. * Count: {{items.length}}
  14468. * <ul>
  14469. * <li *ngFor="var item of items">{{item}}</li>
  14470. * </ul>
  14471. * ```
  14472. *
  14473. * Angular desugars and compiles the template into two ProtoViews:
  14474. *
  14475. * Outer ProtoView:
  14476. * ```
  14477. * Count: {{items.length}}
  14478. * <ul>
  14479. * <template ngFor var-item [ngForOf]="items"></template>
  14480. * </ul>
  14481. * ```
  14482. *
  14483. * Inner ProtoView:
  14484. * ```
  14485. * <li>{{item}}</li>
  14486. * ```
  14487. *
  14488. * Notice that the original template is broken down into two separate ProtoViews.
  14489. */
  14490. var ProtoViewRef = (function () {
  14491. function ProtoViewRef() {
  14492. }
  14493. return ProtoViewRef;
  14494. })();
  14495. exports.ProtoViewRef = ProtoViewRef;
  14496. var ProtoViewRef_ = (function (_super) {
  14497. __extends(ProtoViewRef_, _super);
  14498. function ProtoViewRef_(_protoView) {
  14499. _super.call(this);
  14500. this._protoView = _protoView;
  14501. }
  14502. return ProtoViewRef_;
  14503. })(ProtoViewRef);
  14504. exports.ProtoViewRef_ = ProtoViewRef_;
  14505. /***/ },
  14506. /* 78 */
  14507. /***/ function(module, exports, __webpack_require__) {
  14508. var lang_1 = __webpack_require__(5);
  14509. var CAMEL_CASE_REGEXP = /([A-Z])/g;
  14510. var DASH_CASE_REGEXP = /-([a-z])/g;
  14511. function camelCaseToDashCase(input) {
  14512. return lang_1.StringWrapper.replaceAllMapped(input, CAMEL_CASE_REGEXP, function (m) { return '-' + m[1].toLowerCase(); });
  14513. }
  14514. exports.camelCaseToDashCase = camelCaseToDashCase;
  14515. function dashCaseToCamelCase(input) {
  14516. return lang_1.StringWrapper.replaceAllMapped(input, DASH_CASE_REGEXP, function (m) { return m[1].toUpperCase(); });
  14517. }
  14518. exports.dashCaseToCamelCase = dashCaseToCamelCase;
  14519. /***/ },
  14520. /* 79 */
  14521. /***/ function(module, exports, __webpack_require__) {
  14522. var lang_1 = __webpack_require__(5);
  14523. var exceptions_1 = __webpack_require__(14);
  14524. var ElementBinder = (function () {
  14525. function ElementBinder(index, parent, distanceToParent, protoElementInjector, componentDirective, nestedProtoView) {
  14526. this.index = index;
  14527. this.parent = parent;
  14528. this.distanceToParent = distanceToParent;
  14529. this.protoElementInjector = protoElementInjector;
  14530. this.componentDirective = componentDirective;
  14531. this.nestedProtoView = nestedProtoView;
  14532. if (lang_1.isBlank(index)) {
  14533. throw new exceptions_1.BaseException('null index not allowed.');
  14534. }
  14535. }
  14536. return ElementBinder;
  14537. })();
  14538. exports.ElementBinder = ElementBinder;
  14539. /***/ },
  14540. /* 80 */
  14541. /***/ function(module, exports, __webpack_require__) {
  14542. var __extends = (this && this.__extends) || function (d, b) {
  14543. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  14544. function __() { this.constructor = d; }
  14545. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  14546. };
  14547. var lang_1 = __webpack_require__(5);
  14548. var exceptions_1 = __webpack_require__(14);
  14549. var async_1 = __webpack_require__(60);
  14550. var collection_1 = __webpack_require__(12);
  14551. var di_1 = __webpack_require__(6);
  14552. var injector_1 = __webpack_require__(11);
  14553. var provider_1 = __webpack_require__(13);
  14554. var di_2 = __webpack_require__(4);
  14555. /* circular */ var avmModule = __webpack_require__(81);
  14556. var view_container_ref_1 = __webpack_require__(87);
  14557. var element_ref_1 = __webpack_require__(83);
  14558. var template_ref_1 = __webpack_require__(84);
  14559. var directives_1 = __webpack_require__(23);
  14560. var directive_lifecycle_reflector_1 = __webpack_require__(88);
  14561. var change_detection_1 = __webpack_require__(25);
  14562. var query_list_1 = __webpack_require__(90);
  14563. var reflection_1 = __webpack_require__(16);
  14564. var event_config_1 = __webpack_require__(91);
  14565. var pipe_provider_1 = __webpack_require__(73);
  14566. var interfaces_1 = __webpack_require__(89);
  14567. var view_container_ref_2 = __webpack_require__(87);
  14568. var _staticKeys;
  14569. var StaticKeys = (function () {
  14570. function StaticKeys() {
  14571. this.viewManagerId = di_1.Key.get(avmModule.AppViewManager).id;
  14572. this.templateRefId = di_1.Key.get(template_ref_1.TemplateRef).id;
  14573. this.viewContainerId = di_1.Key.get(view_container_ref_1.ViewContainerRef).id;
  14574. this.changeDetectorRefId = di_1.Key.get(change_detection_1.ChangeDetectorRef).id;
  14575. this.elementRefId = di_1.Key.get(element_ref_1.ElementRef).id;
  14576. }
  14577. StaticKeys.instance = function () {
  14578. if (lang_1.isBlank(_staticKeys))
  14579. _staticKeys = new StaticKeys();
  14580. return _staticKeys;
  14581. };
  14582. return StaticKeys;
  14583. })();
  14584. exports.StaticKeys = StaticKeys;
  14585. var TreeNode = (function () {
  14586. function TreeNode(parent) {
  14587. if (lang_1.isPresent(parent)) {
  14588. parent.addChild(this);
  14589. }
  14590. else {
  14591. this._parent = null;
  14592. }
  14593. }
  14594. TreeNode.prototype.addChild = function (child) { child._parent = this; };
  14595. TreeNode.prototype.remove = function () { this._parent = null; };
  14596. Object.defineProperty(TreeNode.prototype, "parent", {
  14597. get: function () { return this._parent; },
  14598. enumerable: true,
  14599. configurable: true
  14600. });
  14601. return TreeNode;
  14602. })();
  14603. exports.TreeNode = TreeNode;
  14604. var DirectiveDependency = (function (_super) {
  14605. __extends(DirectiveDependency, _super);
  14606. function DirectiveDependency(key, optional, lowerBoundVisibility, upperBoundVisibility, properties, attributeName, queryDecorator) {
  14607. _super.call(this, key, optional, lowerBoundVisibility, upperBoundVisibility, properties);
  14608. this.attributeName = attributeName;
  14609. this.queryDecorator = queryDecorator;
  14610. this._verify();
  14611. }
  14612. /** @internal */
  14613. DirectiveDependency.prototype._verify = function () {
  14614. var count = 0;
  14615. if (lang_1.isPresent(this.queryDecorator))
  14616. count++;
  14617. if (lang_1.isPresent(this.attributeName))
  14618. count++;
  14619. if (count > 1)
  14620. throw new exceptions_1.BaseException('A directive injectable can contain only one of the following @Attribute or @Query.');
  14621. };
  14622. DirectiveDependency.createFrom = function (d) {
  14623. return new DirectiveDependency(d.key, d.optional, d.lowerBoundVisibility, d.upperBoundVisibility, d.properties, DirectiveDependency._attributeName(d.properties), DirectiveDependency._query(d.properties));
  14624. };
  14625. /** @internal */
  14626. DirectiveDependency._attributeName = function (properties) {
  14627. var p = properties.find(function (p) { return p instanceof di_2.AttributeMetadata; });
  14628. return lang_1.isPresent(p) ? p.attributeName : null;
  14629. };
  14630. /** @internal */
  14631. DirectiveDependency._query = function (properties) {
  14632. return properties.find(function (p) { return p instanceof di_2.QueryMetadata; });
  14633. };
  14634. return DirectiveDependency;
  14635. })(di_1.Dependency);
  14636. exports.DirectiveDependency = DirectiveDependency;
  14637. var DirectiveProvider = (function (_super) {
  14638. __extends(DirectiveProvider, _super);
  14639. function DirectiveProvider(key, factory, deps, metadata, providers, viewProviders) {
  14640. _super.call(this, key, [new provider_1.ResolvedFactory(factory, deps)], false);
  14641. this.metadata = metadata;
  14642. this.providers = providers;
  14643. this.viewProviders = viewProviders;
  14644. this.callOnDestroy = directive_lifecycle_reflector_1.hasLifecycleHook(interfaces_1.LifecycleHooks.OnDestroy, key.token);
  14645. }
  14646. Object.defineProperty(DirectiveProvider.prototype, "displayName", {
  14647. get: function () { return this.key.displayName; },
  14648. enumerable: true,
  14649. configurable: true
  14650. });
  14651. Object.defineProperty(DirectiveProvider.prototype, "queries", {
  14652. get: function () {
  14653. if (lang_1.isBlank(this.metadata.queries))
  14654. return [];
  14655. var res = [];
  14656. collection_1.StringMapWrapper.forEach(this.metadata.queries, function (meta, fieldName) {
  14657. var setter = reflection_1.reflector.setter(fieldName);
  14658. res.push(new QueryMetadataWithSetter(setter, meta));
  14659. });
  14660. return res;
  14661. },
  14662. enumerable: true,
  14663. configurable: true
  14664. });
  14665. Object.defineProperty(DirectiveProvider.prototype, "eventEmitters", {
  14666. get: function () {
  14667. return lang_1.isPresent(this.metadata) && lang_1.isPresent(this.metadata.outputs) ? this.metadata.outputs :
  14668. [];
  14669. },
  14670. enumerable: true,
  14671. configurable: true
  14672. });
  14673. DirectiveProvider.createFromProvider = function (provider, meta) {
  14674. if (lang_1.isBlank(meta)) {
  14675. meta = new directives_1.DirectiveMetadata();
  14676. }
  14677. var rb = provider_1.resolveProvider(provider);
  14678. var rf = rb.resolvedFactories[0];
  14679. var deps = rf.dependencies.map(DirectiveDependency.createFrom);
  14680. var providers = lang_1.isPresent(meta.providers) ? meta.providers : [];
  14681. var viewBindigs = meta instanceof directives_1.ComponentMetadata && lang_1.isPresent(meta.viewProviders) ?
  14682. meta.viewProviders :
  14683. [];
  14684. return new DirectiveProvider(rb.key, rf.factory, deps, meta, providers, viewBindigs);
  14685. };
  14686. DirectiveProvider.createFromType = function (type, annotation) {
  14687. var provider = new di_1.Provider(type, { useClass: type });
  14688. return DirectiveProvider.createFromProvider(provider, annotation);
  14689. };
  14690. return DirectiveProvider;
  14691. })(provider_1.ResolvedProvider_);
  14692. exports.DirectiveProvider = DirectiveProvider;
  14693. // TODO(rado): benchmark and consider rolling in as ElementInjector fields.
  14694. var PreBuiltObjects = (function () {
  14695. function PreBuiltObjects(viewManager, view, elementRef, templateRef) {
  14696. this.viewManager = viewManager;
  14697. this.view = view;
  14698. this.elementRef = elementRef;
  14699. this.templateRef = templateRef;
  14700. this.nestedView = null;
  14701. }
  14702. return PreBuiltObjects;
  14703. })();
  14704. exports.PreBuiltObjects = PreBuiltObjects;
  14705. var QueryMetadataWithSetter = (function () {
  14706. function QueryMetadataWithSetter(setter, metadata) {
  14707. this.setter = setter;
  14708. this.metadata = metadata;
  14709. }
  14710. return QueryMetadataWithSetter;
  14711. })();
  14712. exports.QueryMetadataWithSetter = QueryMetadataWithSetter;
  14713. var EventEmitterAccessor = (function () {
  14714. function EventEmitterAccessor(eventName, getter) {
  14715. this.eventName = eventName;
  14716. this.getter = getter;
  14717. }
  14718. EventEmitterAccessor.prototype.subscribe = function (view, boundElementIndex, directive) {
  14719. var _this = this;
  14720. var eventEmitter = this.getter(directive);
  14721. return async_1.ObservableWrapper.subscribe(eventEmitter, function (eventObj) { return view.triggerEventHandlers(_this.eventName, eventObj, boundElementIndex); });
  14722. };
  14723. return EventEmitterAccessor;
  14724. })();
  14725. exports.EventEmitterAccessor = EventEmitterAccessor;
  14726. function _createEventEmitterAccessors(bwv) {
  14727. var provider = bwv.provider;
  14728. if (!(provider instanceof DirectiveProvider))
  14729. return [];
  14730. var db = provider;
  14731. return db.eventEmitters.map(function (eventConfig) {
  14732. var parsedEvent = event_config_1.EventConfig.parse(eventConfig);
  14733. return new EventEmitterAccessor(parsedEvent.eventName, reflection_1.reflector.getter(parsedEvent.fieldName));
  14734. });
  14735. }
  14736. function _createProtoQueryRefs(providers) {
  14737. var res = [];
  14738. collection_1.ListWrapper.forEachWithIndex(providers, function (b, i) {
  14739. if (b.provider instanceof DirectiveProvider) {
  14740. var directiveProvider = b.provider;
  14741. // field queries
  14742. var queries = directiveProvider.queries;
  14743. queries.forEach(function (q) { return res.push(new ProtoQueryRef(i, q.setter, q.metadata)); });
  14744. // queries passed into the constructor.
  14745. // TODO: remove this after constructor queries are no longer supported
  14746. var deps = directiveProvider.resolvedFactory.dependencies;
  14747. deps.forEach(function (d) {
  14748. if (lang_1.isPresent(d.queryDecorator))
  14749. res.push(new ProtoQueryRef(i, null, d.queryDecorator));
  14750. });
  14751. }
  14752. });
  14753. return res;
  14754. }
  14755. var ProtoElementInjector = (function () {
  14756. function ProtoElementInjector(parent, index, bwv, distanceToParent, _firstProviderIsComponent, directiveVariableBindings) {
  14757. this.parent = parent;
  14758. this.index = index;
  14759. this.distanceToParent = distanceToParent;
  14760. this.directiveVariableBindings = directiveVariableBindings;
  14761. this._firstProviderIsComponent = _firstProviderIsComponent;
  14762. var length = bwv.length;
  14763. this.protoInjector = new injector_1.ProtoInjector(bwv);
  14764. this.eventEmitterAccessors = collection_1.ListWrapper.createFixedSize(length);
  14765. for (var i = 0; i < length; ++i) {
  14766. this.eventEmitterAccessors[i] = _createEventEmitterAccessors(bwv[i]);
  14767. }
  14768. this.protoQueryRefs = _createProtoQueryRefs(bwv);
  14769. }
  14770. ProtoElementInjector.create = function (parent, index, providers, firstProviderIsComponent, distanceToParent, directiveVariableBindings) {
  14771. var bd = [];
  14772. ProtoElementInjector._createDirectiveProviderWithVisibility(providers, bd, firstProviderIsComponent);
  14773. if (firstProviderIsComponent) {
  14774. ProtoElementInjector._createViewProvidersWithVisibility(providers, bd);
  14775. }
  14776. ProtoElementInjector._createProvidersWithVisibility(providers, bd);
  14777. return new ProtoElementInjector(parent, index, bd, distanceToParent, firstProviderIsComponent, directiveVariableBindings);
  14778. };
  14779. ProtoElementInjector._createDirectiveProviderWithVisibility = function (dirProviders, bd, firstProviderIsComponent) {
  14780. dirProviders.forEach(function (dirProvider) {
  14781. bd.push(ProtoElementInjector._createProviderWithVisibility(firstProviderIsComponent, dirProvider, dirProviders, dirProvider));
  14782. });
  14783. };
  14784. ProtoElementInjector._createProvidersWithVisibility = function (dirProviders, bd) {
  14785. var providersFromAllDirectives = [];
  14786. dirProviders.forEach(function (dirProvider) {
  14787. providersFromAllDirectives =
  14788. collection_1.ListWrapper.concat(providersFromAllDirectives, dirProvider.providers);
  14789. });
  14790. var resolved = di_1.Injector.resolve(providersFromAllDirectives);
  14791. resolved.forEach(function (b) { return bd.push(new injector_1.ProviderWithVisibility(b, injector_1.Visibility.Public)); });
  14792. };
  14793. ProtoElementInjector._createProviderWithVisibility = function (firstProviderIsComponent, dirProvider, dirProviders, provider) {
  14794. var isComponent = firstProviderIsComponent && dirProviders[0] === dirProvider;
  14795. return new injector_1.ProviderWithVisibility(provider, isComponent ? injector_1.Visibility.PublicAndPrivate : injector_1.Visibility.Public);
  14796. };
  14797. ProtoElementInjector._createViewProvidersWithVisibility = function (dirProviders, bd) {
  14798. var resolvedViewProviders = di_1.Injector.resolve(dirProviders[0].viewProviders);
  14799. resolvedViewProviders.forEach(function (b) { return bd.push(new injector_1.ProviderWithVisibility(b, injector_1.Visibility.Private)); });
  14800. };
  14801. ProtoElementInjector.prototype.instantiate = function (parent) {
  14802. return new ElementInjector(this, parent);
  14803. };
  14804. ProtoElementInjector.prototype.directParent = function () { return this.distanceToParent < 2 ? this.parent : null; };
  14805. Object.defineProperty(ProtoElementInjector.prototype, "hasBindings", {
  14806. get: function () { return this.eventEmitterAccessors.length > 0; },
  14807. enumerable: true,
  14808. configurable: true
  14809. });
  14810. ProtoElementInjector.prototype.getProviderAtIndex = function (index) { return this.protoInjector.getProviderAtIndex(index); };
  14811. return ProtoElementInjector;
  14812. })();
  14813. exports.ProtoElementInjector = ProtoElementInjector;
  14814. var _Context = (function () {
  14815. function _Context(element, componentElement, injector) {
  14816. this.element = element;
  14817. this.componentElement = componentElement;
  14818. this.injector = injector;
  14819. }
  14820. return _Context;
  14821. })();
  14822. var ElementInjector = (function (_super) {
  14823. __extends(ElementInjector, _super);
  14824. function ElementInjector(_proto, parent) {
  14825. var _this = this;
  14826. _super.call(this, parent);
  14827. this._preBuiltObjects = null;
  14828. this._proto = _proto;
  14829. this._injector =
  14830. new di_1.Injector(this._proto.protoInjector, null, this, function () { return _this._debugContext(); });
  14831. // we couple ourselves to the injector strategy to avoid polymoprhic calls
  14832. var injectorStrategy = this._injector.internalStrategy;
  14833. this._strategy = injectorStrategy instanceof injector_1.InjectorInlineStrategy ?
  14834. new ElementInjectorInlineStrategy(injectorStrategy, this) :
  14835. new ElementInjectorDynamicStrategy(injectorStrategy, this);
  14836. this.hydrated = false;
  14837. this._queryStrategy = this._buildQueryStrategy();
  14838. }
  14839. ElementInjector.prototype.dehydrate = function () {
  14840. this.hydrated = false;
  14841. this._host = null;
  14842. this._preBuiltObjects = null;
  14843. this._strategy.callOnDestroy();
  14844. this._strategy.dehydrate();
  14845. this._queryStrategy.dehydrate();
  14846. };
  14847. ElementInjector.prototype.hydrate = function (imperativelyCreatedInjector, host, preBuiltObjects) {
  14848. this._host = host;
  14849. this._preBuiltObjects = preBuiltObjects;
  14850. this._reattachInjectors(imperativelyCreatedInjector);
  14851. this._queryStrategy.hydrate();
  14852. this._strategy.hydrate();
  14853. this.hydrated = true;
  14854. };
  14855. ElementInjector.prototype._debugContext = function () {
  14856. var p = this._preBuiltObjects;
  14857. var index = p.elementRef.boundElementIndex - p.view.elementOffset;
  14858. var c = this._preBuiltObjects.view.getDebugContext(index, null);
  14859. return lang_1.isPresent(c) ? new _Context(c.element, c.componentElement, c.injector) : null;
  14860. };
  14861. ElementInjector.prototype._reattachInjectors = function (imperativelyCreatedInjector) {
  14862. // Dynamically-loaded component in the template. Not a root ElementInjector.
  14863. if (lang_1.isPresent(this._parent)) {
  14864. if (lang_1.isPresent(imperativelyCreatedInjector)) {
  14865. // The imperative injector is similar to having an element between
  14866. // the dynamic-loaded component and its parent => no boundaries.
  14867. this._reattachInjector(this._injector, imperativelyCreatedInjector, false);
  14868. this._reattachInjector(imperativelyCreatedInjector, this._parent._injector, false);
  14869. }
  14870. else {
  14871. this._reattachInjector(this._injector, this._parent._injector, false);
  14872. }
  14873. }
  14874. else if (lang_1.isPresent(this._host)) {
  14875. // The imperative injector is similar to having an element between
  14876. // the dynamic-loaded component and its parent => no boundary between
  14877. // the component and imperativelyCreatedInjector.
  14878. // But since it is a root ElementInjector, we need to create a boundary
  14879. // between imperativelyCreatedInjector and _host.
  14880. if (lang_1.isPresent(imperativelyCreatedInjector)) {
  14881. this._reattachInjector(this._injector, imperativelyCreatedInjector, false);
  14882. this._reattachInjector(imperativelyCreatedInjector, this._host._injector, true);
  14883. }
  14884. else {
  14885. this._reattachInjector(this._injector, this._host._injector, true);
  14886. }
  14887. }
  14888. else {
  14889. if (lang_1.isPresent(imperativelyCreatedInjector)) {
  14890. this._reattachInjector(this._injector, imperativelyCreatedInjector, true);
  14891. }
  14892. }
  14893. };
  14894. ElementInjector.prototype._reattachInjector = function (injector, parentInjector, isBoundary) {
  14895. injector.internalStrategy.attach(parentInjector, isBoundary);
  14896. };
  14897. ElementInjector.prototype.hasVariableBinding = function (name) {
  14898. var vb = this._proto.directiveVariableBindings;
  14899. return lang_1.isPresent(vb) && vb.has(name);
  14900. };
  14901. ElementInjector.prototype.getVariableBinding = function (name) {
  14902. var index = this._proto.directiveVariableBindings.get(name);
  14903. return lang_1.isPresent(index) ? this.getDirectiveAtIndex(index) : this.getElementRef();
  14904. };
  14905. ElementInjector.prototype.get = function (token) { return this._injector.get(token); };
  14906. ElementInjector.prototype.hasDirective = function (type) { return lang_1.isPresent(this._injector.getOptional(type)); };
  14907. ElementInjector.prototype.getEventEmitterAccessors = function () { return this._proto.eventEmitterAccessors; };
  14908. ElementInjector.prototype.getDirectiveVariableBindings = function () {
  14909. return this._proto.directiveVariableBindings;
  14910. };
  14911. ElementInjector.prototype.getComponent = function () { return this._strategy.getComponent(); };
  14912. ElementInjector.prototype.getInjector = function () { return this._injector; };
  14913. ElementInjector.prototype.getElementRef = function () { return this._preBuiltObjects.elementRef; };
  14914. ElementInjector.prototype.getViewContainerRef = function () {
  14915. return new view_container_ref_2.ViewContainerRef_(this._preBuiltObjects.viewManager, this.getElementRef());
  14916. };
  14917. ElementInjector.prototype.getNestedView = function () { return this._preBuiltObjects.nestedView; };
  14918. ElementInjector.prototype.getView = function () { return this._preBuiltObjects.view; };
  14919. ElementInjector.prototype.directParent = function () { return this._proto.distanceToParent < 2 ? this.parent : null; };
  14920. ElementInjector.prototype.isComponentKey = function (key) { return this._strategy.isComponentKey(key); };
  14921. ElementInjector.prototype.getDependency = function (injector, provider, dep) {
  14922. var key = dep.key;
  14923. if (provider instanceof DirectiveProvider) {
  14924. var dirDep = dep;
  14925. var dirProvider = provider;
  14926. var staticKeys = StaticKeys.instance();
  14927. if (key.id === staticKeys.viewManagerId)
  14928. return this._preBuiltObjects.viewManager;
  14929. if (lang_1.isPresent(dirDep.attributeName))
  14930. return this._buildAttribute(dirDep);
  14931. if (lang_1.isPresent(dirDep.queryDecorator))
  14932. return this._queryStrategy.findQuery(dirDep.queryDecorator).list;
  14933. if (dirDep.key.id === StaticKeys.instance().changeDetectorRefId) {
  14934. // We provide the component's view change detector to components and
  14935. // the surrounding component's change detector to directives.
  14936. if (dirProvider.metadata instanceof directives_1.ComponentMetadata) {
  14937. var componentView = this._preBuiltObjects.view.getNestedView(this._preBuiltObjects.elementRef.boundElementIndex);
  14938. return componentView.changeDetector.ref;
  14939. }
  14940. else {
  14941. return this._preBuiltObjects.view.changeDetector.ref;
  14942. }
  14943. }
  14944. if (dirDep.key.id === StaticKeys.instance().elementRefId) {
  14945. return this.getElementRef();
  14946. }
  14947. if (dirDep.key.id === StaticKeys.instance().viewContainerId) {
  14948. return this.getViewContainerRef();
  14949. }
  14950. if (dirDep.key.id === StaticKeys.instance().templateRefId) {
  14951. if (lang_1.isBlank(this._preBuiltObjects.templateRef)) {
  14952. if (dirDep.optional) {
  14953. return null;
  14954. }
  14955. throw new di_1.NoProviderError(null, dirDep.key);
  14956. }
  14957. return this._preBuiltObjects.templateRef;
  14958. }
  14959. }
  14960. else if (provider instanceof pipe_provider_1.PipeProvider) {
  14961. if (dep.key.id === StaticKeys.instance().changeDetectorRefId) {
  14962. var componentView = this._preBuiltObjects.view.getNestedView(this._preBuiltObjects.elementRef.boundElementIndex);
  14963. return componentView.changeDetector.ref;
  14964. }
  14965. }
  14966. return injector_1.UNDEFINED;
  14967. };
  14968. ElementInjector.prototype._buildAttribute = function (dep) {
  14969. var attributes = this._proto.attributes;
  14970. if (lang_1.isPresent(attributes) && attributes.has(dep.attributeName)) {
  14971. return attributes.get(dep.attributeName);
  14972. }
  14973. else {
  14974. return null;
  14975. }
  14976. };
  14977. ElementInjector.prototype.addDirectivesMatchingQuery = function (query, list) {
  14978. var templateRef = lang_1.isBlank(this._preBuiltObjects) ? null : this._preBuiltObjects.templateRef;
  14979. if (query.selector === template_ref_1.TemplateRef && lang_1.isPresent(templateRef)) {
  14980. list.push(templateRef);
  14981. }
  14982. this._strategy.addDirectivesMatchingQuery(query, list);
  14983. };
  14984. ElementInjector.prototype._buildQueryStrategy = function () {
  14985. if (this._proto.protoQueryRefs.length === 0) {
  14986. return _emptyQueryStrategy;
  14987. }
  14988. else if (this._proto.protoQueryRefs.length <=
  14989. InlineQueryStrategy.NUMBER_OF_SUPPORTED_QUERIES) {
  14990. return new InlineQueryStrategy(this);
  14991. }
  14992. else {
  14993. return new DynamicQueryStrategy(this);
  14994. }
  14995. };
  14996. ElementInjector.prototype.link = function (parent) { parent.addChild(this); };
  14997. ElementInjector.prototype.unlink = function () { this.remove(); };
  14998. ElementInjector.prototype.getDirectiveAtIndex = function (index) { return this._injector.getAt(index); };
  14999. ElementInjector.prototype.hasInstances = function () { return this._proto.hasBindings && this.hydrated; };
  15000. ElementInjector.prototype.getHost = function () { return this._host; };
  15001. ElementInjector.prototype.getBoundElementIndex = function () { return this._proto.index; };
  15002. ElementInjector.prototype.getRootViewInjectors = function () {
  15003. if (!this.hydrated)
  15004. return [];
  15005. var view = this._preBuiltObjects.view;
  15006. var nestedView = view.getNestedView(view.elementOffset + this.getBoundElementIndex());
  15007. return lang_1.isPresent(nestedView) ? nestedView.rootElementInjectors : [];
  15008. };
  15009. ElementInjector.prototype.ngAfterViewChecked = function () { this._queryStrategy.updateViewQueries(); };
  15010. ElementInjector.prototype.ngAfterContentChecked = function () { this._queryStrategy.updateContentQueries(); };
  15011. ElementInjector.prototype.traverseAndSetQueriesAsDirty = function () {
  15012. var inj = this;
  15013. while (lang_1.isPresent(inj)) {
  15014. inj._setQueriesAsDirty();
  15015. inj = inj.parent;
  15016. }
  15017. };
  15018. ElementInjector.prototype._setQueriesAsDirty = function () {
  15019. this._queryStrategy.setContentQueriesAsDirty();
  15020. if (lang_1.isPresent(this._host))
  15021. this._host._queryStrategy.setViewQueriesAsDirty();
  15022. };
  15023. return ElementInjector;
  15024. })(TreeNode);
  15025. exports.ElementInjector = ElementInjector;
  15026. var _EmptyQueryStrategy = (function () {
  15027. function _EmptyQueryStrategy() {
  15028. }
  15029. _EmptyQueryStrategy.prototype.setContentQueriesAsDirty = function () { };
  15030. _EmptyQueryStrategy.prototype.setViewQueriesAsDirty = function () { };
  15031. _EmptyQueryStrategy.prototype.hydrate = function () { };
  15032. _EmptyQueryStrategy.prototype.dehydrate = function () { };
  15033. _EmptyQueryStrategy.prototype.updateContentQueries = function () { };
  15034. _EmptyQueryStrategy.prototype.updateViewQueries = function () { };
  15035. _EmptyQueryStrategy.prototype.findQuery = function (query) {
  15036. throw new exceptions_1.BaseException("Cannot find query for directive " + query + ".");
  15037. };
  15038. return _EmptyQueryStrategy;
  15039. })();
  15040. var _emptyQueryStrategy = new _EmptyQueryStrategy();
  15041. var InlineQueryStrategy = (function () {
  15042. function InlineQueryStrategy(ei) {
  15043. var protoRefs = ei._proto.protoQueryRefs;
  15044. if (protoRefs.length > 0)
  15045. this.query0 = new QueryRef(protoRefs[0], ei);
  15046. if (protoRefs.length > 1)
  15047. this.query1 = new QueryRef(protoRefs[1], ei);
  15048. if (protoRefs.length > 2)
  15049. this.query2 = new QueryRef(protoRefs[2], ei);
  15050. }
  15051. InlineQueryStrategy.prototype.setContentQueriesAsDirty = function () {
  15052. if (lang_1.isPresent(this.query0) && !this.query0.isViewQuery)
  15053. this.query0.dirty = true;
  15054. if (lang_1.isPresent(this.query1) && !this.query1.isViewQuery)
  15055. this.query1.dirty = true;
  15056. if (lang_1.isPresent(this.query2) && !this.query2.isViewQuery)
  15057. this.query2.dirty = true;
  15058. };
  15059. InlineQueryStrategy.prototype.setViewQueriesAsDirty = function () {
  15060. if (lang_1.isPresent(this.query0) && this.query0.isViewQuery)
  15061. this.query0.dirty = true;
  15062. if (lang_1.isPresent(this.query1) && this.query1.isViewQuery)
  15063. this.query1.dirty = true;
  15064. if (lang_1.isPresent(this.query2) && this.query2.isViewQuery)
  15065. this.query2.dirty = true;
  15066. };
  15067. InlineQueryStrategy.prototype.hydrate = function () {
  15068. if (lang_1.isPresent(this.query0))
  15069. this.query0.hydrate();
  15070. if (lang_1.isPresent(this.query1))
  15071. this.query1.hydrate();
  15072. if (lang_1.isPresent(this.query2))
  15073. this.query2.hydrate();
  15074. };
  15075. InlineQueryStrategy.prototype.dehydrate = function () {
  15076. if (lang_1.isPresent(this.query0))
  15077. this.query0.dehydrate();
  15078. if (lang_1.isPresent(this.query1))
  15079. this.query1.dehydrate();
  15080. if (lang_1.isPresent(this.query2))
  15081. this.query2.dehydrate();
  15082. };
  15083. InlineQueryStrategy.prototype.updateContentQueries = function () {
  15084. if (lang_1.isPresent(this.query0) && !this.query0.isViewQuery) {
  15085. this.query0.update();
  15086. }
  15087. if (lang_1.isPresent(this.query1) && !this.query1.isViewQuery) {
  15088. this.query1.update();
  15089. }
  15090. if (lang_1.isPresent(this.query2) && !this.query2.isViewQuery) {
  15091. this.query2.update();
  15092. }
  15093. };
  15094. InlineQueryStrategy.prototype.updateViewQueries = function () {
  15095. if (lang_1.isPresent(this.query0) && this.query0.isViewQuery) {
  15096. this.query0.update();
  15097. }
  15098. if (lang_1.isPresent(this.query1) && this.query1.isViewQuery) {
  15099. this.query1.update();
  15100. }
  15101. if (lang_1.isPresent(this.query2) && this.query2.isViewQuery) {
  15102. this.query2.update();
  15103. }
  15104. };
  15105. InlineQueryStrategy.prototype.findQuery = function (query) {
  15106. if (lang_1.isPresent(this.query0) && this.query0.protoQueryRef.query === query) {
  15107. return this.query0;
  15108. }
  15109. if (lang_1.isPresent(this.query1) && this.query1.protoQueryRef.query === query) {
  15110. return this.query1;
  15111. }
  15112. if (lang_1.isPresent(this.query2) && this.query2.protoQueryRef.query === query) {
  15113. return this.query2;
  15114. }
  15115. throw new exceptions_1.BaseException("Cannot find query for directive " + query + ".");
  15116. };
  15117. InlineQueryStrategy.NUMBER_OF_SUPPORTED_QUERIES = 3;
  15118. return InlineQueryStrategy;
  15119. })();
  15120. var DynamicQueryStrategy = (function () {
  15121. function DynamicQueryStrategy(ei) {
  15122. this.queries = ei._proto.protoQueryRefs.map(function (p) { return new QueryRef(p, ei); });
  15123. }
  15124. DynamicQueryStrategy.prototype.setContentQueriesAsDirty = function () {
  15125. for (var i = 0; i < this.queries.length; ++i) {
  15126. var q = this.queries[i];
  15127. if (!q.isViewQuery)
  15128. q.dirty = true;
  15129. }
  15130. };
  15131. DynamicQueryStrategy.prototype.setViewQueriesAsDirty = function () {
  15132. for (var i = 0; i < this.queries.length; ++i) {
  15133. var q = this.queries[i];
  15134. if (q.isViewQuery)
  15135. q.dirty = true;
  15136. }
  15137. };
  15138. DynamicQueryStrategy.prototype.hydrate = function () {
  15139. for (var i = 0; i < this.queries.length; ++i) {
  15140. var q = this.queries[i];
  15141. q.hydrate();
  15142. }
  15143. };
  15144. DynamicQueryStrategy.prototype.dehydrate = function () {
  15145. for (var i = 0; i < this.queries.length; ++i) {
  15146. var q = this.queries[i];
  15147. q.dehydrate();
  15148. }
  15149. };
  15150. DynamicQueryStrategy.prototype.updateContentQueries = function () {
  15151. for (var i = 0; i < this.queries.length; ++i) {
  15152. var q = this.queries[i];
  15153. if (!q.isViewQuery) {
  15154. q.update();
  15155. }
  15156. }
  15157. };
  15158. DynamicQueryStrategy.prototype.updateViewQueries = function () {
  15159. for (var i = 0; i < this.queries.length; ++i) {
  15160. var q = this.queries[i];
  15161. if (q.isViewQuery) {
  15162. q.update();
  15163. }
  15164. }
  15165. };
  15166. DynamicQueryStrategy.prototype.findQuery = function (query) {
  15167. for (var i = 0; i < this.queries.length; ++i) {
  15168. var q = this.queries[i];
  15169. if (q.protoQueryRef.query === query) {
  15170. return q;
  15171. }
  15172. }
  15173. throw new exceptions_1.BaseException("Cannot find query for directive " + query + ".");
  15174. };
  15175. return DynamicQueryStrategy;
  15176. })();
  15177. /**
  15178. * Strategy used by the `ElementInjector` when the number of providers is 10 or less.
  15179. * In such a case, inlining fields is beneficial for performances.
  15180. */
  15181. var ElementInjectorInlineStrategy = (function () {
  15182. function ElementInjectorInlineStrategy(injectorStrategy, _ei) {
  15183. this.injectorStrategy = injectorStrategy;
  15184. this._ei = _ei;
  15185. }
  15186. ElementInjectorInlineStrategy.prototype.hydrate = function () {
  15187. var i = this.injectorStrategy;
  15188. var p = i.protoStrategy;
  15189. i.resetConstructionCounter();
  15190. if (p.provider0 instanceof DirectiveProvider && lang_1.isPresent(p.keyId0) && i.obj0 === injector_1.UNDEFINED)
  15191. i.obj0 = i.instantiateProvider(p.provider0, p.visibility0);
  15192. if (p.provider1 instanceof DirectiveProvider && lang_1.isPresent(p.keyId1) && i.obj1 === injector_1.UNDEFINED)
  15193. i.obj1 = i.instantiateProvider(p.provider1, p.visibility1);
  15194. if (p.provider2 instanceof DirectiveProvider && lang_1.isPresent(p.keyId2) && i.obj2 === injector_1.UNDEFINED)
  15195. i.obj2 = i.instantiateProvider(p.provider2, p.visibility2);
  15196. if (p.provider3 instanceof DirectiveProvider && lang_1.isPresent(p.keyId3) && i.obj3 === injector_1.UNDEFINED)
  15197. i.obj3 = i.instantiateProvider(p.provider3, p.visibility3);
  15198. if (p.provider4 instanceof DirectiveProvider && lang_1.isPresent(p.keyId4) && i.obj4 === injector_1.UNDEFINED)
  15199. i.obj4 = i.instantiateProvider(p.provider4, p.visibility4);
  15200. if (p.provider5 instanceof DirectiveProvider && lang_1.isPresent(p.keyId5) && i.obj5 === injector_1.UNDEFINED)
  15201. i.obj5 = i.instantiateProvider(p.provider5, p.visibility5);
  15202. if (p.provider6 instanceof DirectiveProvider && lang_1.isPresent(p.keyId6) && i.obj6 === injector_1.UNDEFINED)
  15203. i.obj6 = i.instantiateProvider(p.provider6, p.visibility6);
  15204. if (p.provider7 instanceof DirectiveProvider && lang_1.isPresent(p.keyId7) && i.obj7 === injector_1.UNDEFINED)
  15205. i.obj7 = i.instantiateProvider(p.provider7, p.visibility7);
  15206. if (p.provider8 instanceof DirectiveProvider && lang_1.isPresent(p.keyId8) && i.obj8 === injector_1.UNDEFINED)
  15207. i.obj8 = i.instantiateProvider(p.provider8, p.visibility8);
  15208. if (p.provider9 instanceof DirectiveProvider && lang_1.isPresent(p.keyId9) && i.obj9 === injector_1.UNDEFINED)
  15209. i.obj9 = i.instantiateProvider(p.provider9, p.visibility9);
  15210. };
  15211. ElementInjectorInlineStrategy.prototype.dehydrate = function () {
  15212. var i = this.injectorStrategy;
  15213. i.obj0 = injector_1.UNDEFINED;
  15214. i.obj1 = injector_1.UNDEFINED;
  15215. i.obj2 = injector_1.UNDEFINED;
  15216. i.obj3 = injector_1.UNDEFINED;
  15217. i.obj4 = injector_1.UNDEFINED;
  15218. i.obj5 = injector_1.UNDEFINED;
  15219. i.obj6 = injector_1.UNDEFINED;
  15220. i.obj7 = injector_1.UNDEFINED;
  15221. i.obj8 = injector_1.UNDEFINED;
  15222. i.obj9 = injector_1.UNDEFINED;
  15223. };
  15224. ElementInjectorInlineStrategy.prototype.callOnDestroy = function () {
  15225. var i = this.injectorStrategy;
  15226. var p = i.protoStrategy;
  15227. if (p.provider0 instanceof DirectiveProvider &&
  15228. p.provider0.callOnDestroy) {
  15229. i.obj0.ngOnDestroy();
  15230. }
  15231. if (p.provider1 instanceof DirectiveProvider &&
  15232. p.provider1.callOnDestroy) {
  15233. i.obj1.ngOnDestroy();
  15234. }
  15235. if (p.provider2 instanceof DirectiveProvider &&
  15236. p.provider2.callOnDestroy) {
  15237. i.obj2.ngOnDestroy();
  15238. }
  15239. if (p.provider3 instanceof DirectiveProvider &&
  15240. p.provider3.callOnDestroy) {
  15241. i.obj3.ngOnDestroy();
  15242. }
  15243. if (p.provider4 instanceof DirectiveProvider &&
  15244. p.provider4.callOnDestroy) {
  15245. i.obj4.ngOnDestroy();
  15246. }
  15247. if (p.provider5 instanceof DirectiveProvider &&
  15248. p.provider5.callOnDestroy) {
  15249. i.obj5.ngOnDestroy();
  15250. }
  15251. if (p.provider6 instanceof DirectiveProvider &&
  15252. p.provider6.callOnDestroy) {
  15253. i.obj6.ngOnDestroy();
  15254. }
  15255. if (p.provider7 instanceof DirectiveProvider &&
  15256. p.provider7.callOnDestroy) {
  15257. i.obj7.ngOnDestroy();
  15258. }
  15259. if (p.provider8 instanceof DirectiveProvider &&
  15260. p.provider8.callOnDestroy) {
  15261. i.obj8.ngOnDestroy();
  15262. }
  15263. if (p.provider9 instanceof DirectiveProvider &&
  15264. p.provider9.callOnDestroy) {
  15265. i.obj9.ngOnDestroy();
  15266. }
  15267. };
  15268. ElementInjectorInlineStrategy.prototype.getComponent = function () { return this.injectorStrategy.obj0; };
  15269. ElementInjectorInlineStrategy.prototype.isComponentKey = function (key) {
  15270. return this._ei._proto._firstProviderIsComponent && lang_1.isPresent(key) &&
  15271. key.id === this.injectorStrategy.protoStrategy.keyId0;
  15272. };
  15273. ElementInjectorInlineStrategy.prototype.addDirectivesMatchingQuery = function (query, list) {
  15274. var i = this.injectorStrategy;
  15275. var p = i.protoStrategy;
  15276. if (lang_1.isPresent(p.provider0) && p.provider0.key.token === query.selector) {
  15277. if (i.obj0 === injector_1.UNDEFINED)
  15278. i.obj0 = i.instantiateProvider(p.provider0, p.visibility0);
  15279. list.push(i.obj0);
  15280. }
  15281. if (lang_1.isPresent(p.provider1) && p.provider1.key.token === query.selector) {
  15282. if (i.obj1 === injector_1.UNDEFINED)
  15283. i.obj1 = i.instantiateProvider(p.provider1, p.visibility1);
  15284. list.push(i.obj1);
  15285. }
  15286. if (lang_1.isPresent(p.provider2) && p.provider2.key.token === query.selector) {
  15287. if (i.obj2 === injector_1.UNDEFINED)
  15288. i.obj2 = i.instantiateProvider(p.provider2, p.visibility2);
  15289. list.push(i.obj2);
  15290. }
  15291. if (lang_1.isPresent(p.provider3) && p.provider3.key.token === query.selector) {
  15292. if (i.obj3 === injector_1.UNDEFINED)
  15293. i.obj3 = i.instantiateProvider(p.provider3, p.visibility3);
  15294. list.push(i.obj3);
  15295. }
  15296. if (lang_1.isPresent(p.provider4) && p.provider4.key.token === query.selector) {
  15297. if (i.obj4 === injector_1.UNDEFINED)
  15298. i.obj4 = i.instantiateProvider(p.provider4, p.visibility4);
  15299. list.push(i.obj4);
  15300. }
  15301. if (lang_1.isPresent(p.provider5) && p.provider5.key.token === query.selector) {
  15302. if (i.obj5 === injector_1.UNDEFINED)
  15303. i.obj5 = i.instantiateProvider(p.provider5, p.visibility5);
  15304. list.push(i.obj5);
  15305. }
  15306. if (lang_1.isPresent(p.provider6) && p.provider6.key.token === query.selector) {
  15307. if (i.obj6 === injector_1.UNDEFINED)
  15308. i.obj6 = i.instantiateProvider(p.provider6, p.visibility6);
  15309. list.push(i.obj6);
  15310. }
  15311. if (lang_1.isPresent(p.provider7) && p.provider7.key.token === query.selector) {
  15312. if (i.obj7 === injector_1.UNDEFINED)
  15313. i.obj7 = i.instantiateProvider(p.provider7, p.visibility7);
  15314. list.push(i.obj7);
  15315. }
  15316. if (lang_1.isPresent(p.provider8) && p.provider8.key.token === query.selector) {
  15317. if (i.obj8 === injector_1.UNDEFINED)
  15318. i.obj8 = i.instantiateProvider(p.provider8, p.visibility8);
  15319. list.push(i.obj8);
  15320. }
  15321. if (lang_1.isPresent(p.provider9) && p.provider9.key.token === query.selector) {
  15322. if (i.obj9 === injector_1.UNDEFINED)
  15323. i.obj9 = i.instantiateProvider(p.provider9, p.visibility9);
  15324. list.push(i.obj9);
  15325. }
  15326. };
  15327. return ElementInjectorInlineStrategy;
  15328. })();
  15329. /**
  15330. * Strategy used by the `ElementInjector` when the number of bindings is 11 or more.
  15331. * In such a case, there are too many fields to inline (see ElementInjectorInlineStrategy).
  15332. */
  15333. var ElementInjectorDynamicStrategy = (function () {
  15334. function ElementInjectorDynamicStrategy(injectorStrategy, _ei) {
  15335. this.injectorStrategy = injectorStrategy;
  15336. this._ei = _ei;
  15337. }
  15338. ElementInjectorDynamicStrategy.prototype.hydrate = function () {
  15339. var inj = this.injectorStrategy;
  15340. var p = inj.protoStrategy;
  15341. inj.resetConstructionCounter();
  15342. for (var i = 0; i < p.keyIds.length; i++) {
  15343. if (p.providers[i] instanceof DirectiveProvider && lang_1.isPresent(p.keyIds[i]) &&
  15344. inj.objs[i] === injector_1.UNDEFINED) {
  15345. inj.objs[i] = inj.instantiateProvider(p.providers[i], p.visibilities[i]);
  15346. }
  15347. }
  15348. };
  15349. ElementInjectorDynamicStrategy.prototype.dehydrate = function () {
  15350. var inj = this.injectorStrategy;
  15351. collection_1.ListWrapper.fill(inj.objs, injector_1.UNDEFINED);
  15352. };
  15353. ElementInjectorDynamicStrategy.prototype.callOnDestroy = function () {
  15354. var ist = this.injectorStrategy;
  15355. var p = ist.protoStrategy;
  15356. for (var i = 0; i < p.providers.length; i++) {
  15357. if (p.providers[i] instanceof DirectiveProvider &&
  15358. p.providers[i].callOnDestroy) {
  15359. ist.objs[i].ngOnDestroy();
  15360. }
  15361. }
  15362. };
  15363. ElementInjectorDynamicStrategy.prototype.getComponent = function () { return this.injectorStrategy.objs[0]; };
  15364. ElementInjectorDynamicStrategy.prototype.isComponentKey = function (key) {
  15365. var p = this.injectorStrategy.protoStrategy;
  15366. return this._ei._proto._firstProviderIsComponent && lang_1.isPresent(key) && key.id === p.keyIds[0];
  15367. };
  15368. ElementInjectorDynamicStrategy.prototype.addDirectivesMatchingQuery = function (query, list) {
  15369. var ist = this.injectorStrategy;
  15370. var p = ist.protoStrategy;
  15371. for (var i = 0; i < p.providers.length; i++) {
  15372. if (p.providers[i].key.token === query.selector) {
  15373. if (ist.objs[i] === injector_1.UNDEFINED) {
  15374. ist.objs[i] = ist.instantiateProvider(p.providers[i], p.visibilities[i]);
  15375. }
  15376. list.push(ist.objs[i]);
  15377. }
  15378. }
  15379. };
  15380. return ElementInjectorDynamicStrategy;
  15381. })();
  15382. var ProtoQueryRef = (function () {
  15383. function ProtoQueryRef(dirIndex, setter, query) {
  15384. this.dirIndex = dirIndex;
  15385. this.setter = setter;
  15386. this.query = query;
  15387. }
  15388. Object.defineProperty(ProtoQueryRef.prototype, "usesPropertySyntax", {
  15389. get: function () { return lang_1.isPresent(this.setter); },
  15390. enumerable: true,
  15391. configurable: true
  15392. });
  15393. return ProtoQueryRef;
  15394. })();
  15395. exports.ProtoQueryRef = ProtoQueryRef;
  15396. var QueryRef = (function () {
  15397. function QueryRef(protoQueryRef, originator) {
  15398. this.protoQueryRef = protoQueryRef;
  15399. this.originator = originator;
  15400. }
  15401. Object.defineProperty(QueryRef.prototype, "isViewQuery", {
  15402. get: function () { return this.protoQueryRef.query.isViewQuery; },
  15403. enumerable: true,
  15404. configurable: true
  15405. });
  15406. QueryRef.prototype.update = function () {
  15407. if (!this.dirty)
  15408. return;
  15409. this._update();
  15410. this.dirty = false;
  15411. // TODO delete the check once only field queries are supported
  15412. if (this.protoQueryRef.usesPropertySyntax) {
  15413. var dir = this.originator.getDirectiveAtIndex(this.protoQueryRef.dirIndex);
  15414. if (this.protoQueryRef.query.first) {
  15415. this.protoQueryRef.setter(dir, this.list.length > 0 ? this.list.first : null);
  15416. }
  15417. else {
  15418. this.protoQueryRef.setter(dir, this.list);
  15419. }
  15420. }
  15421. this.list.notifyOnChanges();
  15422. };
  15423. QueryRef.prototype._update = function () {
  15424. var aggregator = [];
  15425. if (this.protoQueryRef.query.isViewQuery) {
  15426. var view = this.originator.getView();
  15427. // intentionally skipping originator for view queries.
  15428. var nestedView = view.getNestedView(view.elementOffset + this.originator.getBoundElementIndex());
  15429. if (lang_1.isPresent(nestedView))
  15430. this._visitView(nestedView, aggregator);
  15431. }
  15432. else {
  15433. this._visit(this.originator, aggregator);
  15434. }
  15435. this.list.reset(aggregator);
  15436. };
  15437. ;
  15438. QueryRef.prototype._visit = function (inj, aggregator) {
  15439. var view = inj.getView();
  15440. var startIdx = view.elementOffset + inj._proto.index;
  15441. for (var i = startIdx; i < view.elementOffset + view.ownBindersCount; i++) {
  15442. var curInj = view.elementInjectors[i];
  15443. if (lang_1.isBlank(curInj))
  15444. continue;
  15445. // The first injector after inj, that is outside the subtree rooted at
  15446. // inj has to have a null parent or a parent that is an ancestor of inj.
  15447. if (i > startIdx && (lang_1.isBlank(curInj) || lang_1.isBlank(curInj.parent) ||
  15448. view.elementOffset + curInj.parent._proto.index < startIdx)) {
  15449. break;
  15450. }
  15451. if (!this.protoQueryRef.query.descendants &&
  15452. !(curInj.parent == this.originator || curInj == this.originator))
  15453. continue;
  15454. // We visit the view container(VC) views right after the injector that contains
  15455. // the VC. Theoretically, that might not be the right order if there are
  15456. // child injectors of said injector. Not clear whether if such case can
  15457. // even be constructed with the current apis.
  15458. this._visitInjector(curInj, aggregator);
  15459. var vc = view.viewContainers[i];
  15460. if (lang_1.isPresent(vc))
  15461. this._visitViewContainer(vc, aggregator);
  15462. }
  15463. };
  15464. QueryRef.prototype._visitInjector = function (inj, aggregator) {
  15465. if (this.protoQueryRef.query.isVarBindingQuery) {
  15466. this._aggregateVariableBinding(inj, aggregator);
  15467. }
  15468. else {
  15469. this._aggregateDirective(inj, aggregator);
  15470. }
  15471. };
  15472. QueryRef.prototype._visitViewContainer = function (vc, aggregator) {
  15473. for (var j = 0; j < vc.views.length; j++) {
  15474. this._visitView(vc.views[j], aggregator);
  15475. }
  15476. };
  15477. QueryRef.prototype._visitView = function (view, aggregator) {
  15478. for (var i = view.elementOffset; i < view.elementOffset + view.ownBindersCount; i++) {
  15479. var inj = view.elementInjectors[i];
  15480. if (lang_1.isBlank(inj))
  15481. continue;
  15482. this._visitInjector(inj, aggregator);
  15483. var vc = view.viewContainers[i];
  15484. if (lang_1.isPresent(vc))
  15485. this._visitViewContainer(vc, aggregator);
  15486. }
  15487. };
  15488. QueryRef.prototype._aggregateVariableBinding = function (inj, aggregator) {
  15489. var vb = this.protoQueryRef.query.varBindings;
  15490. for (var i = 0; i < vb.length; ++i) {
  15491. if (inj.hasVariableBinding(vb[i])) {
  15492. aggregator.push(inj.getVariableBinding(vb[i]));
  15493. }
  15494. }
  15495. };
  15496. QueryRef.prototype._aggregateDirective = function (inj, aggregator) {
  15497. inj.addDirectivesMatchingQuery(this.protoQueryRef.query, aggregator);
  15498. };
  15499. QueryRef.prototype.dehydrate = function () { this.list = null; };
  15500. QueryRef.prototype.hydrate = function () {
  15501. this.list = new query_list_1.QueryList();
  15502. this.dirty = true;
  15503. };
  15504. return QueryRef;
  15505. })();
  15506. exports.QueryRef = QueryRef;
  15507. /***/ },
  15508. /* 81 */
  15509. /***/ function(module, exports, __webpack_require__) {
  15510. var __extends = (this && this.__extends) || function (d, b) {
  15511. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  15512. function __() { this.constructor = d; }
  15513. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  15514. };
  15515. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  15516. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  15517. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  15518. 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;
  15519. return c > 3 && r && Object.defineProperty(target, key, r), r;
  15520. };
  15521. var __metadata = (this && this.__metadata) || function (k, v) {
  15522. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  15523. };
  15524. var __param = (this && this.__param) || function (paramIndex, decorator) {
  15525. return function (target, key) { decorator(target, key, paramIndex); }
  15526. };
  15527. var di_1 = __webpack_require__(6);
  15528. var lang_1 = __webpack_require__(5);
  15529. var exceptions_1 = __webpack_require__(14);
  15530. var viewModule = __webpack_require__(76);
  15531. var view_ref_1 = __webpack_require__(77);
  15532. var api_1 = __webpack_require__(72);
  15533. var view_manager_utils_1 = __webpack_require__(82);
  15534. var view_pool_1 = __webpack_require__(85);
  15535. var view_listener_1 = __webpack_require__(86);
  15536. var profile_1 = __webpack_require__(45);
  15537. var proto_view_factory_1 = __webpack_require__(71);
  15538. /**
  15539. * Service exposing low level API for creating, moving and destroying Views.
  15540. *
  15541. * Most applications should use higher-level abstractions like {@link DynamicComponentLoader} and
  15542. * {@link ViewContainerRef} instead.
  15543. */
  15544. var AppViewManager = (function () {
  15545. function AppViewManager() {
  15546. }
  15547. /**
  15548. * Returns the {@link ElementRef} that makes up the specified Host View.
  15549. */
  15550. AppViewManager.prototype.getHostElement = function (hostViewRef) {
  15551. var hostView = view_ref_1.internalView(hostViewRef);
  15552. if (hostView.proto.type !== viewModule.ViewType.HOST) {
  15553. throw new exceptions_1.BaseException('This operation is only allowed on host views');
  15554. }
  15555. return hostView.elementRefs[hostView.elementOffset];
  15556. };
  15557. return AppViewManager;
  15558. })();
  15559. exports.AppViewManager = AppViewManager;
  15560. var AppViewManager_ = (function (_super) {
  15561. __extends(AppViewManager_, _super);
  15562. function AppViewManager_(_viewPool, _viewListener, _utils, _renderer, _protoViewFactory) {
  15563. _super.call(this);
  15564. this._viewPool = _viewPool;
  15565. this._viewListener = _viewListener;
  15566. this._utils = _utils;
  15567. this._renderer = _renderer;
  15568. /** @internal */
  15569. this._createRootHostViewScope = profile_1.wtfCreateScope('AppViewManager#createRootHostView()');
  15570. /** @internal */
  15571. this._destroyRootHostViewScope = profile_1.wtfCreateScope('AppViewManager#destroyRootHostView()');
  15572. /** @internal */
  15573. this._createEmbeddedViewInContainerScope = profile_1.wtfCreateScope('AppViewManager#createEmbeddedViewInContainer()');
  15574. /** @internal */
  15575. this._createHostViewInContainerScope = profile_1.wtfCreateScope('AppViewManager#createHostViewInContainer()');
  15576. /** @internal */
  15577. this._destroyViewInContainerScope = profile_1.wtfCreateScope('AppViewMananger#destroyViewInContainer()');
  15578. /** @internal */
  15579. this._attachViewInContainerScope = profile_1.wtfCreateScope('AppViewMananger#attachViewInContainer()');
  15580. /** @internal */
  15581. this._detachViewInContainerScope = profile_1.wtfCreateScope('AppViewMananger#detachViewInContainer()');
  15582. this._protoViewFactory = _protoViewFactory;
  15583. }
  15584. AppViewManager_.prototype.getViewContainer = function (location) {
  15585. var hostView = view_ref_1.internalView(location.parentView);
  15586. return hostView.elementInjectors[location.boundElementIndex]
  15587. .getViewContainerRef();
  15588. };
  15589. AppViewManager_.prototype.getNamedElementInComponentView = function (hostLocation, variableName) {
  15590. var hostView = view_ref_1.internalView(hostLocation.parentView);
  15591. var boundElementIndex = hostLocation.boundElementIndex;
  15592. var componentView = hostView.getNestedView(boundElementIndex);
  15593. if (lang_1.isBlank(componentView)) {
  15594. throw new exceptions_1.BaseException("There is no component directive at element " + boundElementIndex);
  15595. }
  15596. var binderIdx = componentView.proto.variableLocations.get(variableName);
  15597. if (lang_1.isBlank(binderIdx)) {
  15598. throw new exceptions_1.BaseException("Could not find variable " + variableName);
  15599. }
  15600. return componentView.elementRefs[componentView.elementOffset + binderIdx];
  15601. };
  15602. AppViewManager_.prototype.getComponent = function (hostLocation) {
  15603. var hostView = view_ref_1.internalView(hostLocation.parentView);
  15604. var boundElementIndex = hostLocation.boundElementIndex;
  15605. return this._utils.getComponentInstance(hostView, boundElementIndex);
  15606. };
  15607. AppViewManager_.prototype.createRootHostView = function (hostProtoViewRef, overrideSelector, injector) {
  15608. var s = this._createRootHostViewScope();
  15609. var hostProtoView = view_ref_1.internalProtoView(hostProtoViewRef);
  15610. this._protoViewFactory.initializeProtoViewIfNeeded(hostProtoView);
  15611. var hostElementSelector = overrideSelector;
  15612. if (lang_1.isBlank(hostElementSelector)) {
  15613. hostElementSelector = hostProtoView.elementBinders[0].componentDirective.metadata.selector;
  15614. }
  15615. var renderViewWithFragments = this._renderer.createRootHostView(hostProtoView.render, hostProtoView.mergeInfo.embeddedViewCount + 1, hostElementSelector);
  15616. var hostView = this._createMainView(hostProtoView, renderViewWithFragments);
  15617. this._renderer.hydrateView(hostView.render);
  15618. this._utils.hydrateRootHostView(hostView, injector);
  15619. return profile_1.wtfLeave(s, hostView.ref);
  15620. };
  15621. AppViewManager_.prototype.destroyRootHostView = function (hostViewRef) {
  15622. // Note: Don't put the hostView into the view pool
  15623. // as it is depending on the element for which it was created.
  15624. var s = this._destroyRootHostViewScope();
  15625. var hostView = view_ref_1.internalView(hostViewRef);
  15626. this._renderer.detachFragment(hostView.renderFragment);
  15627. this._renderer.dehydrateView(hostView.render);
  15628. this._viewDehydrateRecurse(hostView);
  15629. this._viewListener.onViewDestroyed(hostView);
  15630. this._renderer.destroyView(hostView.render);
  15631. profile_1.wtfLeave(s);
  15632. };
  15633. AppViewManager_.prototype.createEmbeddedViewInContainer = function (viewContainerLocation, index, templateRef) {
  15634. var s = this._createEmbeddedViewInContainerScope();
  15635. var protoView = view_ref_1.internalProtoView(templateRef.protoViewRef);
  15636. if (protoView.type !== viewModule.ViewType.EMBEDDED) {
  15637. throw new exceptions_1.BaseException('This method can only be called with embedded ProtoViews!');
  15638. }
  15639. this._protoViewFactory.initializeProtoViewIfNeeded(protoView);
  15640. return profile_1.wtfLeave(s, this._createViewInContainer(viewContainerLocation, index, protoView, templateRef.elementRef, null));
  15641. };
  15642. AppViewManager_.prototype.createHostViewInContainer = function (viewContainerLocation, index, protoViewRef, imperativelyCreatedInjector) {
  15643. var s = this._createHostViewInContainerScope();
  15644. var protoView = view_ref_1.internalProtoView(protoViewRef);
  15645. if (protoView.type !== viewModule.ViewType.HOST) {
  15646. throw new exceptions_1.BaseException('This method can only be called with host ProtoViews!');
  15647. }
  15648. this._protoViewFactory.initializeProtoViewIfNeeded(protoView);
  15649. return profile_1.wtfLeave(s, this._createViewInContainer(viewContainerLocation, index, protoView, viewContainerLocation, imperativelyCreatedInjector));
  15650. };
  15651. /**
  15652. *
  15653. * See {@link AppViewManager#destroyViewInContainer}.
  15654. * @internal
  15655. */
  15656. AppViewManager_.prototype._createViewInContainer = function (viewContainerLocation, index, protoView, context, imperativelyCreatedInjector) {
  15657. var parentView = view_ref_1.internalView(viewContainerLocation.parentView);
  15658. var boundElementIndex = viewContainerLocation.boundElementIndex;
  15659. var contextView = view_ref_1.internalView(context.parentView);
  15660. var contextBoundElementIndex = context.boundElementIndex;
  15661. var embeddedFragmentView = contextView.getNestedView(contextBoundElementIndex);
  15662. var view;
  15663. if (protoView.type === viewModule.ViewType.EMBEDDED && lang_1.isPresent(embeddedFragmentView) &&
  15664. !embeddedFragmentView.hydrated()) {
  15665. // Case 1: instantiate the first view of a template that has been merged into a parent
  15666. view = embeddedFragmentView;
  15667. this._attachRenderView(parentView, boundElementIndex, index, view);
  15668. }
  15669. else {
  15670. // Case 2: instantiate another copy of the template or a host ProtoView.
  15671. // This is a separate case
  15672. // as we only inline one copy of the template into the parent view.
  15673. view = this._createPooledView(protoView);
  15674. this._attachRenderView(parentView, boundElementIndex, index, view);
  15675. this._renderer.hydrateView(view.render);
  15676. }
  15677. this._utils.attachViewInContainer(parentView, boundElementIndex, contextView, contextBoundElementIndex, index, view);
  15678. try {
  15679. this._utils.hydrateViewInContainer(parentView, boundElementIndex, contextView, contextBoundElementIndex, index, imperativelyCreatedInjector);
  15680. }
  15681. catch (e) {
  15682. this._utils.detachViewInContainer(parentView, boundElementIndex, index);
  15683. throw e;
  15684. }
  15685. return view.ref;
  15686. };
  15687. /** @internal */
  15688. AppViewManager_.prototype._attachRenderView = function (parentView, boundElementIndex, index, view) {
  15689. var elementRef = parentView.elementRefs[boundElementIndex];
  15690. if (index === 0) {
  15691. this._renderer.attachFragmentAfterElement(elementRef, view.renderFragment);
  15692. }
  15693. else {
  15694. var prevView = parentView.viewContainers[boundElementIndex].views[index - 1];
  15695. this._renderer.attachFragmentAfterFragment(prevView.renderFragment, view.renderFragment);
  15696. }
  15697. };
  15698. AppViewManager_.prototype.destroyViewInContainer = function (viewContainerLocation, index) {
  15699. var s = this._destroyViewInContainerScope();
  15700. var parentView = view_ref_1.internalView(viewContainerLocation.parentView);
  15701. var boundElementIndex = viewContainerLocation.boundElementIndex;
  15702. this._destroyViewInContainer(parentView, boundElementIndex, index);
  15703. profile_1.wtfLeave(s);
  15704. };
  15705. // TODO(i): refactor detachViewInContainer+attachViewInContainer to moveViewInContainer
  15706. AppViewManager_.prototype.attachViewInContainer = function (viewContainerLocation, index, viewRef) {
  15707. var s = this._attachViewInContainerScope();
  15708. var view = view_ref_1.internalView(viewRef);
  15709. var parentView = view_ref_1.internalView(viewContainerLocation.parentView);
  15710. var boundElementIndex = viewContainerLocation.boundElementIndex;
  15711. // TODO(tbosch): the public methods attachViewInContainer/detachViewInContainer
  15712. // are used for moving elements without the same container.
  15713. // We will change this into an atomic `move` operation, which should preserve the
  15714. // previous parent injector (see https://github.com/angular/angular/issues/1377).
  15715. // Right now we are destroying any special
  15716. // context view that might have been used.
  15717. this._utils.attachViewInContainer(parentView, boundElementIndex, null, null, index, view);
  15718. this._attachRenderView(parentView, boundElementIndex, index, view);
  15719. return profile_1.wtfLeave(s, viewRef);
  15720. };
  15721. // TODO(i): refactor detachViewInContainer+attachViewInContainer to moveViewInContainer
  15722. AppViewManager_.prototype.detachViewInContainer = function (viewContainerLocation, index) {
  15723. var s = this._detachViewInContainerScope();
  15724. var parentView = view_ref_1.internalView(viewContainerLocation.parentView);
  15725. var boundElementIndex = viewContainerLocation.boundElementIndex;
  15726. var viewContainer = parentView.viewContainers[boundElementIndex];
  15727. var view = viewContainer.views[index];
  15728. this._utils.detachViewInContainer(parentView, boundElementIndex, index);
  15729. this._renderer.detachFragment(view.renderFragment);
  15730. return profile_1.wtfLeave(s, view.ref);
  15731. };
  15732. /** @internal */
  15733. AppViewManager_.prototype._createMainView = function (protoView, renderViewWithFragments) {
  15734. var mergedParentView = this._utils.createView(protoView, renderViewWithFragments, this, this._renderer);
  15735. this._renderer.setEventDispatcher(mergedParentView.render, mergedParentView);
  15736. this._viewListener.onViewCreated(mergedParentView);
  15737. return mergedParentView;
  15738. };
  15739. /** @internal */
  15740. AppViewManager_.prototype._createPooledView = function (protoView) {
  15741. var view = this._viewPool.getView(protoView);
  15742. if (lang_1.isBlank(view)) {
  15743. view = this._createMainView(protoView, this._renderer.createView(protoView.render, protoView.mergeInfo.embeddedViewCount + 1));
  15744. }
  15745. return view;
  15746. };
  15747. /** @internal */
  15748. AppViewManager_.prototype._destroyPooledView = function (view) {
  15749. var wasReturned = this._viewPool.returnView(view);
  15750. if (!wasReturned) {
  15751. this._viewListener.onViewDestroyed(view);
  15752. this._renderer.destroyView(view.render);
  15753. }
  15754. };
  15755. /** @internal */
  15756. AppViewManager_.prototype._destroyViewInContainer = function (parentView, boundElementIndex, index) {
  15757. var viewContainer = parentView.viewContainers[boundElementIndex];
  15758. var view = viewContainer.views[index];
  15759. this._viewDehydrateRecurse(view);
  15760. this._utils.detachViewInContainer(parentView, boundElementIndex, index);
  15761. if (view.viewOffset > 0) {
  15762. // Case 1: a view that is part of another view.
  15763. // Just detach the fragment
  15764. this._renderer.detachFragment(view.renderFragment);
  15765. }
  15766. else {
  15767. // Case 2: a view that is not part of another view.
  15768. // dehydrate and destroy it.
  15769. this._renderer.dehydrateView(view.render);
  15770. this._renderer.detachFragment(view.renderFragment);
  15771. this._destroyPooledView(view);
  15772. }
  15773. };
  15774. /** @internal */
  15775. AppViewManager_.prototype._viewDehydrateRecurse = function (view) {
  15776. if (view.hydrated()) {
  15777. this._utils.dehydrateView(view);
  15778. }
  15779. var viewContainers = view.viewContainers;
  15780. var startViewOffset = view.viewOffset;
  15781. var endViewOffset = view.viewOffset + view.proto.mergeInfo.viewCount - 1;
  15782. var elementOffset = view.elementOffset;
  15783. for (var viewIdx = startViewOffset; viewIdx <= endViewOffset; viewIdx++) {
  15784. var currView = view.views[viewIdx];
  15785. for (var binderIdx = 0; binderIdx < currView.proto.elementBinders.length; binderIdx++, elementOffset++) {
  15786. var vc = viewContainers[elementOffset];
  15787. if (lang_1.isPresent(vc)) {
  15788. for (var j = vc.views.length - 1; j >= 0; j--) {
  15789. this._destroyViewInContainer(currView, elementOffset, j);
  15790. }
  15791. }
  15792. }
  15793. }
  15794. };
  15795. AppViewManager_ = __decorate([
  15796. di_1.Injectable(),
  15797. __param(4, di_1.Inject(di_1.forwardRef(function () { return proto_view_factory_1.ProtoViewFactory; }))),
  15798. __metadata('design:paramtypes', [view_pool_1.AppViewPool, view_listener_1.AppViewListener, view_manager_utils_1.AppViewManagerUtils, api_1.Renderer, Object])
  15799. ], AppViewManager_);
  15800. return AppViewManager_;
  15801. })(AppViewManager);
  15802. exports.AppViewManager_ = AppViewManager_;
  15803. /***/ },
  15804. /* 82 */
  15805. /***/ function(module, exports, __webpack_require__) {
  15806. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  15807. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  15808. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  15809. 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;
  15810. return c > 3 && r && Object.defineProperty(target, key, r), r;
  15811. };
  15812. var __metadata = (this && this.__metadata) || function (k, v) {
  15813. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  15814. };
  15815. var di_1 = __webpack_require__(6);
  15816. var collection_1 = __webpack_require__(12);
  15817. var eli = __webpack_require__(80);
  15818. var lang_1 = __webpack_require__(5);
  15819. var viewModule = __webpack_require__(76);
  15820. var element_ref_1 = __webpack_require__(83);
  15821. var template_ref_1 = __webpack_require__(84);
  15822. var pipes_1 = __webpack_require__(74);
  15823. var AppViewManagerUtils = (function () {
  15824. function AppViewManagerUtils() {
  15825. }
  15826. AppViewManagerUtils.prototype.getComponentInstance = function (parentView, boundElementIndex) {
  15827. var eli = parentView.elementInjectors[boundElementIndex];
  15828. return eli.getComponent();
  15829. };
  15830. AppViewManagerUtils.prototype.createView = function (mergedParentViewProto, renderViewWithFragments, viewManager, renderer) {
  15831. var renderFragments = renderViewWithFragments.fragmentRefs;
  15832. var renderView = renderViewWithFragments.viewRef;
  15833. var elementCount = mergedParentViewProto.mergeInfo.elementCount;
  15834. var viewCount = mergedParentViewProto.mergeInfo.viewCount;
  15835. var elementRefs = collection_1.ListWrapper.createFixedSize(elementCount);
  15836. var viewContainers = collection_1.ListWrapper.createFixedSize(elementCount);
  15837. var preBuiltObjects = collection_1.ListWrapper.createFixedSize(elementCount);
  15838. var elementInjectors = collection_1.ListWrapper.createFixedSize(elementCount);
  15839. var views = collection_1.ListWrapper.createFixedSize(viewCount);
  15840. var elementOffset = 0;
  15841. var textOffset = 0;
  15842. var fragmentIdx = 0;
  15843. var containerElementIndicesByViewIndex = collection_1.ListWrapper.createFixedSize(viewCount);
  15844. for (var viewOffset = 0; viewOffset < viewCount; viewOffset++) {
  15845. var containerElementIndex = containerElementIndicesByViewIndex[viewOffset];
  15846. var containerElementInjector = lang_1.isPresent(containerElementIndex) ? elementInjectors[containerElementIndex] : null;
  15847. var parentView = lang_1.isPresent(containerElementInjector) ? preBuiltObjects[containerElementIndex].view : null;
  15848. var protoView = lang_1.isPresent(containerElementIndex) ?
  15849. parentView.proto.elementBinders[containerElementIndex - parentView.elementOffset]
  15850. .nestedProtoView :
  15851. mergedParentViewProto;
  15852. var renderFragment = null;
  15853. if (viewOffset === 0 || protoView.type === viewModule.ViewType.EMBEDDED) {
  15854. renderFragment = renderFragments[fragmentIdx++];
  15855. }
  15856. var currentView = new viewModule.AppView(renderer, protoView, viewOffset, elementOffset, textOffset, protoView.protoLocals, renderView, renderFragment, containerElementInjector);
  15857. views[viewOffset] = currentView;
  15858. if (lang_1.isPresent(containerElementIndex)) {
  15859. preBuiltObjects[containerElementIndex].nestedView = currentView;
  15860. }
  15861. var rootElementInjectors = [];
  15862. var nestedViewOffset = viewOffset + 1;
  15863. for (var binderIdx = 0; binderIdx < protoView.elementBinders.length; binderIdx++) {
  15864. var binder = protoView.elementBinders[binderIdx];
  15865. var boundElementIndex = elementOffset + binderIdx;
  15866. var elementInjector = null;
  15867. if (lang_1.isPresent(binder.nestedProtoView) && binder.nestedProtoView.isMergable) {
  15868. containerElementIndicesByViewIndex[nestedViewOffset] = boundElementIndex;
  15869. nestedViewOffset += binder.nestedProtoView.mergeInfo.viewCount;
  15870. }
  15871. // elementInjectors and rootElementInjectors
  15872. var protoElementInjector = binder.protoElementInjector;
  15873. if (lang_1.isPresent(protoElementInjector)) {
  15874. if (lang_1.isPresent(protoElementInjector.parent)) {
  15875. var parentElementInjector = elementInjectors[elementOffset + protoElementInjector.parent.index];
  15876. elementInjector = protoElementInjector.instantiate(parentElementInjector);
  15877. }
  15878. else {
  15879. elementInjector = protoElementInjector.instantiate(null);
  15880. rootElementInjectors.push(elementInjector);
  15881. }
  15882. }
  15883. elementInjectors[boundElementIndex] = elementInjector;
  15884. // elementRefs
  15885. var el = new element_ref_1.ElementRef_(currentView.ref, boundElementIndex, renderer);
  15886. elementRefs[el.boundElementIndex] = el;
  15887. // preBuiltObjects
  15888. if (lang_1.isPresent(elementInjector)) {
  15889. var templateRef = lang_1.isPresent(binder.nestedProtoView) &&
  15890. binder.nestedProtoView.type === viewModule.ViewType.EMBEDDED ?
  15891. new template_ref_1.TemplateRef_(el) :
  15892. null;
  15893. preBuiltObjects[boundElementIndex] =
  15894. new eli.PreBuiltObjects(viewManager, currentView, el, templateRef);
  15895. }
  15896. }
  15897. currentView.init(protoView.changeDetectorFactory(currentView), elementInjectors, rootElementInjectors, preBuiltObjects, views, elementRefs, viewContainers);
  15898. if (lang_1.isPresent(parentView) && protoView.type === viewModule.ViewType.COMPONENT) {
  15899. parentView.changeDetector.addViewChild(currentView.changeDetector);
  15900. }
  15901. elementOffset += protoView.elementBinders.length;
  15902. textOffset += protoView.textBindingCount;
  15903. }
  15904. return views[0];
  15905. };
  15906. AppViewManagerUtils.prototype.hydrateRootHostView = function (hostView, injector) {
  15907. this._hydrateView(hostView, injector, null, new Object(), null);
  15908. };
  15909. // Misnomer: this method is attaching next to the view container.
  15910. AppViewManagerUtils.prototype.attachViewInContainer = function (parentView, boundElementIndex, contextView, contextBoundElementIndex, index, view) {
  15911. if (lang_1.isBlank(contextView)) {
  15912. contextView = parentView;
  15913. contextBoundElementIndex = boundElementIndex;
  15914. }
  15915. parentView.changeDetector.addContentChild(view.changeDetector);
  15916. var viewContainer = parentView.viewContainers[boundElementIndex];
  15917. if (lang_1.isBlank(viewContainer)) {
  15918. viewContainer = new viewModule.AppViewContainer();
  15919. parentView.viewContainers[boundElementIndex] = viewContainer;
  15920. }
  15921. collection_1.ListWrapper.insert(viewContainer.views, index, view);
  15922. var elementInjector = contextView.elementInjectors[contextBoundElementIndex];
  15923. for (var i = view.rootElementInjectors.length - 1; i >= 0; i--) {
  15924. if (lang_1.isPresent(elementInjector.parent)) {
  15925. view.rootElementInjectors[i].link(elementInjector.parent);
  15926. }
  15927. }
  15928. elementInjector.traverseAndSetQueriesAsDirty();
  15929. };
  15930. AppViewManagerUtils.prototype.detachViewInContainer = function (parentView, boundElementIndex, index) {
  15931. var viewContainer = parentView.viewContainers[boundElementIndex];
  15932. var view = viewContainer.views[index];
  15933. parentView.elementInjectors[boundElementIndex].traverseAndSetQueriesAsDirty();
  15934. view.changeDetector.remove();
  15935. collection_1.ListWrapper.removeAt(viewContainer.views, index);
  15936. for (var i = 0; i < view.rootElementInjectors.length; ++i) {
  15937. var inj = view.rootElementInjectors[i];
  15938. inj.unlink();
  15939. }
  15940. };
  15941. AppViewManagerUtils.prototype.hydrateViewInContainer = function (parentView, boundElementIndex, contextView, contextBoundElementIndex, index, imperativelyCreatedProviders) {
  15942. if (lang_1.isBlank(contextView)) {
  15943. contextView = parentView;
  15944. contextBoundElementIndex = boundElementIndex;
  15945. }
  15946. var viewContainer = parentView.viewContainers[boundElementIndex];
  15947. var view = viewContainer.views[index];
  15948. var elementInjector = contextView.elementInjectors[contextBoundElementIndex];
  15949. var injector = lang_1.isPresent(imperativelyCreatedProviders) ?
  15950. di_1.Injector.fromResolvedProviders(imperativelyCreatedProviders) :
  15951. null;
  15952. this._hydrateView(view, injector, elementInjector.getHost(), contextView.context, contextView.locals);
  15953. };
  15954. /** @internal */
  15955. AppViewManagerUtils.prototype._hydrateView = function (initView, imperativelyCreatedInjector, hostElementInjector, context, parentLocals) {
  15956. var viewIdx = initView.viewOffset;
  15957. var endViewOffset = viewIdx + initView.proto.mergeInfo.viewCount - 1;
  15958. while (viewIdx <= endViewOffset) {
  15959. var currView = initView.views[viewIdx];
  15960. var currProtoView = currView.proto;
  15961. if (currView !== initView && currView.proto.type === viewModule.ViewType.EMBEDDED) {
  15962. // Don't hydrate components of embedded fragment views.
  15963. viewIdx += currView.proto.mergeInfo.viewCount;
  15964. }
  15965. else {
  15966. if (currView !== initView) {
  15967. // hydrate a nested component view
  15968. imperativelyCreatedInjector = null;
  15969. parentLocals = null;
  15970. hostElementInjector = currView.containerElementInjector;
  15971. context = hostElementInjector.getComponent();
  15972. }
  15973. currView.context = context;
  15974. currView.locals.parent = parentLocals;
  15975. var binders = currProtoView.elementBinders;
  15976. for (var binderIdx = 0; binderIdx < binders.length; binderIdx++) {
  15977. var boundElementIndex = binderIdx + currView.elementOffset;
  15978. var elementInjector = initView.elementInjectors[boundElementIndex];
  15979. if (lang_1.isPresent(elementInjector)) {
  15980. elementInjector.hydrate(imperativelyCreatedInjector, hostElementInjector, currView.preBuiltObjects[boundElementIndex]);
  15981. this._populateViewLocals(currView, elementInjector, boundElementIndex);
  15982. this._setUpEventEmitters(currView, elementInjector, boundElementIndex);
  15983. }
  15984. }
  15985. var pipes = lang_1.isPresent(hostElementInjector) ?
  15986. new pipes_1.Pipes(currView.proto.pipes, hostElementInjector.getInjector()) :
  15987. null;
  15988. currView.changeDetector.hydrate(currView.context, currView.locals, currView, pipes);
  15989. viewIdx++;
  15990. }
  15991. }
  15992. };
  15993. /** @internal */
  15994. AppViewManagerUtils.prototype._populateViewLocals = function (view, elementInjector, boundElementIdx) {
  15995. if (lang_1.isPresent(elementInjector.getDirectiveVariableBindings())) {
  15996. elementInjector.getDirectiveVariableBindings().forEach(function (directiveIndex, name) {
  15997. if (lang_1.isBlank(directiveIndex)) {
  15998. view.locals.set(name, view.elementRefs[boundElementIdx].nativeElement);
  15999. }
  16000. else {
  16001. view.locals.set(name, elementInjector.getDirectiveAtIndex(directiveIndex));
  16002. }
  16003. });
  16004. }
  16005. };
  16006. /** @internal */
  16007. AppViewManagerUtils.prototype._setUpEventEmitters = function (view, elementInjector, boundElementIndex) {
  16008. var emitters = elementInjector.getEventEmitterAccessors();
  16009. for (var directiveIndex = 0; directiveIndex < emitters.length; ++directiveIndex) {
  16010. var directiveEmitters = emitters[directiveIndex];
  16011. var directive = elementInjector.getDirectiveAtIndex(directiveIndex);
  16012. for (var eventIndex = 0; eventIndex < directiveEmitters.length; ++eventIndex) {
  16013. var eventEmitterAccessor = directiveEmitters[eventIndex];
  16014. eventEmitterAccessor.subscribe(view, boundElementIndex, directive);
  16015. }
  16016. }
  16017. };
  16018. AppViewManagerUtils.prototype.dehydrateView = function (initView) {
  16019. var endViewOffset = initView.viewOffset + initView.proto.mergeInfo.viewCount - 1;
  16020. for (var viewIdx = initView.viewOffset; viewIdx <= endViewOffset; viewIdx++) {
  16021. var currView = initView.views[viewIdx];
  16022. if (currView.hydrated()) {
  16023. if (lang_1.isPresent(currView.locals)) {
  16024. currView.locals.clearValues();
  16025. }
  16026. currView.context = null;
  16027. currView.changeDetector.dehydrate();
  16028. var binders = currView.proto.elementBinders;
  16029. for (var binderIdx = 0; binderIdx < binders.length; binderIdx++) {
  16030. var eli = initView.elementInjectors[currView.elementOffset + binderIdx];
  16031. if (lang_1.isPresent(eli)) {
  16032. eli.dehydrate();
  16033. }
  16034. }
  16035. }
  16036. }
  16037. };
  16038. AppViewManagerUtils = __decorate([
  16039. di_1.Injectable(),
  16040. __metadata('design:paramtypes', [])
  16041. ], AppViewManagerUtils);
  16042. return AppViewManagerUtils;
  16043. })();
  16044. exports.AppViewManagerUtils = AppViewManagerUtils;
  16045. /***/ },
  16046. /* 83 */
  16047. /***/ function(module, exports, __webpack_require__) {
  16048. var __extends = (this && this.__extends) || function (d, b) {
  16049. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  16050. function __() { this.constructor = d; }
  16051. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  16052. };
  16053. var exceptions_1 = __webpack_require__(14);
  16054. /**
  16055. * Represents a location in a View that has an injection, change-detection and render context
  16056. * associated with it.
  16057. *
  16058. * An `ElementRef` is created for each element in the Template that contains a Directive, Component
  16059. * or data-binding.
  16060. *
  16061. * An `ElementRef` is backed by a render-specific element. In the browser, this is usually a DOM
  16062. * element.
  16063. */
  16064. var ElementRef = (function () {
  16065. function ElementRef() {
  16066. }
  16067. Object.defineProperty(ElementRef.prototype, "nativeElement", {
  16068. /**
  16069. * The underlying native element or `null` if direct access to native elements is not supported
  16070. * (e.g. when the application runs in a web worker).
  16071. *
  16072. * <div class="callout is-critical">
  16073. * <header>Use with caution</header>
  16074. * <p>
  16075. * Use this API as the last resort when direct access to DOM is needed. Use templating and
  16076. * data-binding provided by Angular instead. Alternatively you take a look at {@link Renderer}
  16077. * which provides API that can safely be used even when direct access to native elements is not
  16078. * supported.
  16079. * </p>
  16080. * <p>
  16081. * Relying on direct DOM access creates tight coupling between your application and rendering
  16082. * layers which will make it impossible to separate the two and deploy your application into a
  16083. * web worker.
  16084. * </p>
  16085. * </div>
  16086. */
  16087. get: function () { return exceptions_1.unimplemented(); },
  16088. enumerable: true,
  16089. configurable: true
  16090. });
  16091. ;
  16092. Object.defineProperty(ElementRef.prototype, "renderView", {
  16093. get: function () { return exceptions_1.unimplemented(); },
  16094. enumerable: true,
  16095. configurable: true
  16096. });
  16097. return ElementRef;
  16098. })();
  16099. exports.ElementRef = ElementRef;
  16100. var ElementRef_ = (function (_super) {
  16101. __extends(ElementRef_, _super);
  16102. function ElementRef_(parentView,
  16103. /**
  16104. * Index of the element inside the {@link ViewRef}.
  16105. *
  16106. * This is used internally by the Angular framework to locate elements.
  16107. */
  16108. boundElementIndex, _renderer) {
  16109. _super.call(this);
  16110. this.parentView = parentView;
  16111. this.boundElementIndex = boundElementIndex;
  16112. this._renderer = _renderer;
  16113. }
  16114. Object.defineProperty(ElementRef_.prototype, "renderView", {
  16115. get: function () { return this.parentView.render; },
  16116. set: function (value) { exceptions_1.unimplemented(); },
  16117. enumerable: true,
  16118. configurable: true
  16119. });
  16120. Object.defineProperty(ElementRef_.prototype, "nativeElement", {
  16121. get: function () { return this._renderer.getNativeElementSync(this); },
  16122. enumerable: true,
  16123. configurable: true
  16124. });
  16125. return ElementRef_;
  16126. })(ElementRef);
  16127. exports.ElementRef_ = ElementRef_;
  16128. /***/ },
  16129. /* 84 */
  16130. /***/ function(module, exports, __webpack_require__) {
  16131. var __extends = (this && this.__extends) || function (d, b) {
  16132. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  16133. function __() { this.constructor = d; }
  16134. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  16135. };
  16136. var view_ref_1 = __webpack_require__(77);
  16137. /**
  16138. * Represents an Embedded Template that can be used to instantiate Embedded Views.
  16139. *
  16140. * You can access a `TemplateRef`, in two ways. Via a directive placed on a `<template>` element (or
  16141. * directive prefixed with `*`) and have the `TemplateRef` for this Embedded View injected into the
  16142. * constructor of the directive using the `TemplateRef` Token. Alternatively you can query for the
  16143. * `TemplateRef` from a Component or a Directive via {@link Query}.
  16144. *
  16145. * To instantiate Embedded Views based on a Template, use
  16146. * {@link ViewContainerRef#createEmbeddedView}, which will create the View and attach it to the
  16147. * View Container.
  16148. */
  16149. var TemplateRef = (function () {
  16150. function TemplateRef() {
  16151. }
  16152. return TemplateRef;
  16153. })();
  16154. exports.TemplateRef = TemplateRef;
  16155. var TemplateRef_ = (function (_super) {
  16156. __extends(TemplateRef_, _super);
  16157. function TemplateRef_(elementRef) {
  16158. _super.call(this);
  16159. this.elementRef = elementRef;
  16160. }
  16161. TemplateRef_.prototype._getProtoView = function () {
  16162. var elementRef = this.elementRef;
  16163. var parentView = view_ref_1.internalView(elementRef.parentView);
  16164. return parentView.proto.elementBinders[elementRef.boundElementIndex - parentView.elementOffset]
  16165. .nestedProtoView;
  16166. };
  16167. Object.defineProperty(TemplateRef_.prototype, "protoViewRef", {
  16168. /**
  16169. * Reference to the ProtoView used for creating Embedded Views that are based on the compiled
  16170. * Embedded Template.
  16171. */
  16172. get: function () { return this._getProtoView().ref; },
  16173. enumerable: true,
  16174. configurable: true
  16175. });
  16176. TemplateRef_.prototype.hasLocal = function (name) {
  16177. return this._getProtoView().templateVariableBindings.has(name);
  16178. };
  16179. return TemplateRef_;
  16180. })(TemplateRef);
  16181. exports.TemplateRef_ = TemplateRef_;
  16182. /***/ },
  16183. /* 85 */
  16184. /***/ function(module, exports, __webpack_require__) {
  16185. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  16186. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  16187. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  16188. 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;
  16189. return c > 3 && r && Object.defineProperty(target, key, r), r;
  16190. };
  16191. var __metadata = (this && this.__metadata) || function (k, v) {
  16192. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  16193. };
  16194. var __param = (this && this.__param) || function (paramIndex, decorator) {
  16195. return function (target, key) { decorator(target, key, paramIndex); }
  16196. };
  16197. var di_1 = __webpack_require__(6);
  16198. var lang_1 = __webpack_require__(5);
  16199. var collection_1 = __webpack_require__(12);
  16200. exports.APP_VIEW_POOL_CAPACITY = lang_1.CONST_EXPR(new di_1.OpaqueToken('AppViewPool.viewPoolCapacity'));
  16201. var AppViewPool = (function () {
  16202. function AppViewPool(poolCapacityPerProtoView) {
  16203. /** @internal */
  16204. this._pooledViewsPerProtoView = new collection_1.Map();
  16205. this._poolCapacityPerProtoView = poolCapacityPerProtoView;
  16206. }
  16207. AppViewPool.prototype.getView = function (protoView) {
  16208. var pooledViews = this._pooledViewsPerProtoView.get(protoView);
  16209. if (lang_1.isPresent(pooledViews) && pooledViews.length > 0) {
  16210. return pooledViews.pop();
  16211. }
  16212. return null;
  16213. };
  16214. AppViewPool.prototype.returnView = function (view) {
  16215. var protoView = view.proto;
  16216. var pooledViews = this._pooledViewsPerProtoView.get(protoView);
  16217. if (lang_1.isBlank(pooledViews)) {
  16218. pooledViews = [];
  16219. this._pooledViewsPerProtoView.set(protoView, pooledViews);
  16220. }
  16221. var haveRemainingCapacity = pooledViews.length < this._poolCapacityPerProtoView;
  16222. if (haveRemainingCapacity) {
  16223. pooledViews.push(view);
  16224. }
  16225. return haveRemainingCapacity;
  16226. };
  16227. AppViewPool = __decorate([
  16228. di_1.Injectable(),
  16229. __param(0, di_1.Inject(exports.APP_VIEW_POOL_CAPACITY)),
  16230. __metadata('design:paramtypes', [Object])
  16231. ], AppViewPool);
  16232. return AppViewPool;
  16233. })();
  16234. exports.AppViewPool = AppViewPool;
  16235. /***/ },
  16236. /* 86 */
  16237. /***/ function(module, exports, __webpack_require__) {
  16238. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  16239. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  16240. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  16241. 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;
  16242. return c > 3 && r && Object.defineProperty(target, key, r), r;
  16243. };
  16244. var __metadata = (this && this.__metadata) || function (k, v) {
  16245. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  16246. };
  16247. var di_1 = __webpack_require__(6);
  16248. /**
  16249. * Listener for view creation / destruction.
  16250. */
  16251. var AppViewListener = (function () {
  16252. function AppViewListener() {
  16253. }
  16254. AppViewListener.prototype.onViewCreated = function (view) { };
  16255. AppViewListener.prototype.onViewDestroyed = function (view) { };
  16256. AppViewListener = __decorate([
  16257. di_1.Injectable(),
  16258. __metadata('design:paramtypes', [])
  16259. ], AppViewListener);
  16260. return AppViewListener;
  16261. })();
  16262. exports.AppViewListener = AppViewListener;
  16263. /***/ },
  16264. /* 87 */
  16265. /***/ function(module, exports, __webpack_require__) {
  16266. var __extends = (this && this.__extends) || function (d, b) {
  16267. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  16268. function __() { this.constructor = d; }
  16269. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  16270. };
  16271. var collection_1 = __webpack_require__(12);
  16272. var exceptions_1 = __webpack_require__(14);
  16273. var lang_1 = __webpack_require__(5);
  16274. var view_ref_1 = __webpack_require__(77);
  16275. /**
  16276. * Represents a container where one or more Views can be attached.
  16277. *
  16278. * The container can contain two kinds of Views. Host Views, created by instantiating a
  16279. * {@link Component} via {@link #createHostView}, and Embedded Views, created by instantiating an
  16280. * {@link TemplateRef Embedded Template} via {@link #createEmbeddedView}.
  16281. *
  16282. * The location of the View Container within the containing View is specified by the Anchor
  16283. * `element`. Each View Container can have only one Anchor Element and each Anchor Element can only
  16284. * have a single View Container.
  16285. *
  16286. * Root elements of Views attached to this container become siblings of the Anchor Element in
  16287. * the Rendered View.
  16288. *
  16289. * To access a `ViewContainerRef` of an Element, you can either place a {@link Directive} injected
  16290. * with `ViewContainerRef` on the Element, or you obtain it via
  16291. * {@link AppViewManager#getViewContainer}.
  16292. *
  16293. * <!-- TODO(i): we are also considering ElementRef#viewContainer api -->
  16294. */
  16295. var ViewContainerRef = (function () {
  16296. function ViewContainerRef() {
  16297. }
  16298. /**
  16299. * Destroys all Views in this container.
  16300. */
  16301. ViewContainerRef.prototype.clear = function () {
  16302. for (var i = this.length - 1; i >= 0; i--) {
  16303. this.remove(i);
  16304. }
  16305. };
  16306. Object.defineProperty(ViewContainerRef.prototype, "length", {
  16307. /**
  16308. * Returns the number of Views currently attached to this container.
  16309. */
  16310. get: function () { return exceptions_1.unimplemented(); },
  16311. enumerable: true,
  16312. configurable: true
  16313. });
  16314. ;
  16315. return ViewContainerRef;
  16316. })();
  16317. exports.ViewContainerRef = ViewContainerRef;
  16318. var ViewContainerRef_ = (function (_super) {
  16319. __extends(ViewContainerRef_, _super);
  16320. function ViewContainerRef_(viewManager, element) {
  16321. _super.call(this);
  16322. this.viewManager = viewManager;
  16323. this.element = element;
  16324. }
  16325. ViewContainerRef_.prototype._getViews = function () {
  16326. var element = this.element;
  16327. var vc = view_ref_1.internalView(element.parentView).viewContainers[element.boundElementIndex];
  16328. return lang_1.isPresent(vc) ? vc.views : [];
  16329. };
  16330. ViewContainerRef_.prototype.get = function (index) { return this._getViews()[index].ref; };
  16331. Object.defineProperty(ViewContainerRef_.prototype, "length", {
  16332. get: function () { return this._getViews().length; },
  16333. enumerable: true,
  16334. configurable: true
  16335. });
  16336. // TODO(rado): profile and decide whether bounds checks should be added
  16337. // to the methods below.
  16338. ViewContainerRef_.prototype.createEmbeddedView = function (templateRef, index) {
  16339. if (index === void 0) { index = -1; }
  16340. if (index == -1)
  16341. index = this.length;
  16342. return this.viewManager.createEmbeddedViewInContainer(this.element, index, templateRef);
  16343. };
  16344. ViewContainerRef_.prototype.createHostView = function (protoViewRef, index, dynamicallyCreatedProviders) {
  16345. if (protoViewRef === void 0) { protoViewRef = null; }
  16346. if (index === void 0) { index = -1; }
  16347. if (dynamicallyCreatedProviders === void 0) { dynamicallyCreatedProviders = null; }
  16348. if (index == -1)
  16349. index = this.length;
  16350. return this.viewManager.createHostViewInContainer(this.element, index, protoViewRef, dynamicallyCreatedProviders);
  16351. };
  16352. // TODO(i): refactor insert+remove into move
  16353. ViewContainerRef_.prototype.insert = function (viewRef, index) {
  16354. if (index === void 0) { index = -1; }
  16355. if (index == -1)
  16356. index = this.length;
  16357. return this.viewManager.attachViewInContainer(this.element, index, viewRef);
  16358. };
  16359. ViewContainerRef_.prototype.indexOf = function (viewRef) {
  16360. return collection_1.ListWrapper.indexOf(this._getViews(), view_ref_1.internalView(viewRef));
  16361. };
  16362. // TODO(i): rename to destroy
  16363. ViewContainerRef_.prototype.remove = function (index) {
  16364. if (index === void 0) { index = -1; }
  16365. if (index == -1)
  16366. index = this.length - 1;
  16367. this.viewManager.destroyViewInContainer(this.element, index);
  16368. // view is intentionally not returned to the client.
  16369. };
  16370. // TODO(i): refactor insert+remove into move
  16371. ViewContainerRef_.prototype.detach = function (index) {
  16372. if (index === void 0) { index = -1; }
  16373. if (index == -1)
  16374. index = this.length - 1;
  16375. return this.viewManager.detachViewInContainer(this.element, index);
  16376. };
  16377. return ViewContainerRef_;
  16378. })(ViewContainerRef);
  16379. exports.ViewContainerRef_ = ViewContainerRef_;
  16380. /***/ },
  16381. /* 88 */
  16382. /***/ function(module, exports, __webpack_require__) {
  16383. var lang_1 = __webpack_require__(5);
  16384. var interfaces_1 = __webpack_require__(89);
  16385. function hasLifecycleHook(lcInterface, token) {
  16386. if (!(token instanceof lang_1.Type))
  16387. return false;
  16388. var proto = token.prototype;
  16389. switch (lcInterface) {
  16390. case interfaces_1.LifecycleHooks.AfterContentInit:
  16391. return !!proto.ngAfterContentInit;
  16392. case interfaces_1.LifecycleHooks.AfterContentChecked:
  16393. return !!proto.ngAfterContentChecked;
  16394. case interfaces_1.LifecycleHooks.AfterViewInit:
  16395. return !!proto.ngAfterViewInit;
  16396. case interfaces_1.LifecycleHooks.AfterViewChecked:
  16397. return !!proto.ngAfterViewChecked;
  16398. case interfaces_1.LifecycleHooks.OnChanges:
  16399. return !!proto.ngOnChanges;
  16400. case interfaces_1.LifecycleHooks.DoCheck:
  16401. return !!proto.ngDoCheck;
  16402. case interfaces_1.LifecycleHooks.OnDestroy:
  16403. return !!proto.ngOnDestroy;
  16404. case interfaces_1.LifecycleHooks.OnInit:
  16405. return !!proto.ngOnInit;
  16406. default:
  16407. return false;
  16408. }
  16409. }
  16410. exports.hasLifecycleHook = hasLifecycleHook;
  16411. /***/ },
  16412. /* 89 */
  16413. /***/ function(module, exports) {
  16414. (function (LifecycleHooks) {
  16415. LifecycleHooks[LifecycleHooks["OnInit"] = 0] = "OnInit";
  16416. LifecycleHooks[LifecycleHooks["OnDestroy"] = 1] = "OnDestroy";
  16417. LifecycleHooks[LifecycleHooks["DoCheck"] = 2] = "DoCheck";
  16418. LifecycleHooks[LifecycleHooks["OnChanges"] = 3] = "OnChanges";
  16419. LifecycleHooks[LifecycleHooks["AfterContentInit"] = 4] = "AfterContentInit";
  16420. LifecycleHooks[LifecycleHooks["AfterContentChecked"] = 5] = "AfterContentChecked";
  16421. LifecycleHooks[LifecycleHooks["AfterViewInit"] = 6] = "AfterViewInit";
  16422. LifecycleHooks[LifecycleHooks["AfterViewChecked"] = 7] = "AfterViewChecked";
  16423. })(exports.LifecycleHooks || (exports.LifecycleHooks = {}));
  16424. var LifecycleHooks = exports.LifecycleHooks;
  16425. /**
  16426. * @internal
  16427. */
  16428. exports.LIFECYCLE_HOOKS_VALUES = [
  16429. LifecycleHooks.OnInit,
  16430. LifecycleHooks.OnDestroy,
  16431. LifecycleHooks.DoCheck,
  16432. LifecycleHooks.OnChanges,
  16433. LifecycleHooks.AfterContentInit,
  16434. LifecycleHooks.AfterContentChecked,
  16435. LifecycleHooks.AfterViewInit,
  16436. LifecycleHooks.AfterViewChecked
  16437. ];
  16438. /***/ },
  16439. /* 90 */
  16440. /***/ function(module, exports, __webpack_require__) {
  16441. var collection_1 = __webpack_require__(12);
  16442. var lang_1 = __webpack_require__(5);
  16443. var async_1 = __webpack_require__(60);
  16444. /**
  16445. * An unmodifiable list of items that Angular keeps up to date when the state
  16446. * of the application changes.
  16447. *
  16448. * The type of object that {@link QueryMetadata} and {@link ViewQueryMetadata} provide.
  16449. *
  16450. * Implements an iterable interface, therefore it can be used in both ES6
  16451. * javascript `for (var i of items)` loops as well as in Angular templates with
  16452. * `*ngFor="#i of myList"`.
  16453. *
  16454. * Changes can be observed by subscribing to the changes `Observable`.
  16455. *
  16456. * NOTE: In the future this class will implement an `Observable` interface.
  16457. *
  16458. * ### Example ([live demo](http://plnkr.co/edit/RX8sJnQYl9FWuSCWme5z?p=preview))
  16459. * ```typescript
  16460. * @Component({...})
  16461. * class Container {
  16462. * constructor(@Query(Item) items: QueryList<Item>) {
  16463. * items.changes.subscribe(_ => console.log(items.length));
  16464. * }
  16465. * }
  16466. * ```
  16467. */
  16468. var QueryList = (function () {
  16469. function QueryList() {
  16470. this._results = [];
  16471. this._emitter = new async_1.EventEmitter();
  16472. }
  16473. Object.defineProperty(QueryList.prototype, "changes", {
  16474. get: function () { return this._emitter; },
  16475. enumerable: true,
  16476. configurable: true
  16477. });
  16478. Object.defineProperty(QueryList.prototype, "length", {
  16479. get: function () { return this._results.length; },
  16480. enumerable: true,
  16481. configurable: true
  16482. });
  16483. Object.defineProperty(QueryList.prototype, "first", {
  16484. get: function () { return collection_1.ListWrapper.first(this._results); },
  16485. enumerable: true,
  16486. configurable: true
  16487. });
  16488. Object.defineProperty(QueryList.prototype, "last", {
  16489. get: function () { return collection_1.ListWrapper.last(this._results); },
  16490. enumerable: true,
  16491. configurable: true
  16492. });
  16493. /**
  16494. * returns a new array with the passed in function applied to each element.
  16495. */
  16496. QueryList.prototype.map = function (fn) { return this._results.map(fn); };
  16497. /**
  16498. * returns a filtered array.
  16499. */
  16500. QueryList.prototype.filter = function (fn) { return this._results.filter(fn); };
  16501. /**
  16502. * returns a reduced value.
  16503. */
  16504. QueryList.prototype.reduce = function (fn, init) { return this._results.reduce(fn, init); };
  16505. /**
  16506. * converts QueryList into an array
  16507. */
  16508. QueryList.prototype.toArray = function () { return collection_1.ListWrapper.clone(this._results); };
  16509. QueryList.prototype[lang_1.getSymbolIterator()] = function () { return this._results[lang_1.getSymbolIterator()](); };
  16510. QueryList.prototype.toString = function () { return this._results.toString(); };
  16511. /**
  16512. * @internal
  16513. */
  16514. QueryList.prototype.reset = function (res) { this._results = res; };
  16515. /** @internal */
  16516. QueryList.prototype.notifyOnChanges = function () { this._emitter.emit(this); };
  16517. return QueryList;
  16518. })();
  16519. exports.QueryList = QueryList;
  16520. /***/ },
  16521. /* 91 */
  16522. /***/ function(module, exports) {
  16523. exports.EVENT_TARGET_SEPARATOR = ':';
  16524. var EventConfig = (function () {
  16525. function EventConfig(fieldName, eventName, isLongForm) {
  16526. this.fieldName = fieldName;
  16527. this.eventName = eventName;
  16528. this.isLongForm = isLongForm;
  16529. }
  16530. EventConfig.parse = function (eventConfig) {
  16531. var fieldName = eventConfig, eventName = eventConfig, isLongForm = false;
  16532. var separatorIdx = eventConfig.indexOf(exports.EVENT_TARGET_SEPARATOR);
  16533. if (separatorIdx > -1) {
  16534. // long format: 'fieldName: eventName'
  16535. fieldName = eventConfig.substring(0, separatorIdx).trim();
  16536. eventName = eventConfig.substring(separatorIdx + 1).trim();
  16537. isLongForm = true;
  16538. }
  16539. return new EventConfig(fieldName, eventName, isLongForm);
  16540. };
  16541. EventConfig.prototype.getFullName = function () {
  16542. return this.isLongForm ? "" + this.fieldName + exports.EVENT_TARGET_SEPARATOR + this.eventName :
  16543. this.eventName;
  16544. };
  16545. return EventConfig;
  16546. })();
  16547. exports.EventConfig = EventConfig;
  16548. /***/ },
  16549. /* 92 */
  16550. /***/ function(module, exports, __webpack_require__) {
  16551. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  16552. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  16553. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  16554. 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;
  16555. return c > 3 && r && Object.defineProperty(target, key, r), r;
  16556. };
  16557. var __metadata = (this && this.__metadata) || function (k, v) {
  16558. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  16559. };
  16560. var di_1 = __webpack_require__(6);
  16561. var lang_1 = __webpack_require__(5);
  16562. var exceptions_1 = __webpack_require__(14);
  16563. var collection_1 = __webpack_require__(12);
  16564. var metadata_1 = __webpack_require__(3);
  16565. var reflection_1 = __webpack_require__(16);
  16566. function _isDirectiveMetadata(type) {
  16567. return type instanceof metadata_1.DirectiveMetadata;
  16568. }
  16569. /*
  16570. * Resolve a `Type` for {@link DirectiveMetadata}.
  16571. *
  16572. * This interface can be overridden by the application developer to create custom behavior.
  16573. *
  16574. * See {@link Compiler}
  16575. */
  16576. var DirectiveResolver = (function () {
  16577. function DirectiveResolver() {
  16578. }
  16579. /**
  16580. * Return {@link DirectiveMetadata} for a given `Type`.
  16581. */
  16582. DirectiveResolver.prototype.resolve = function (type) {
  16583. var typeMetadata = reflection_1.reflector.annotations(di_1.resolveForwardRef(type));
  16584. if (lang_1.isPresent(typeMetadata)) {
  16585. var metadata = typeMetadata.find(_isDirectiveMetadata);
  16586. if (lang_1.isPresent(metadata)) {
  16587. var propertyMetadata = reflection_1.reflector.propMetadata(type);
  16588. return this._mergeWithPropertyMetadata(metadata, propertyMetadata);
  16589. }
  16590. }
  16591. throw new exceptions_1.BaseException("No Directive annotation found on " + lang_1.stringify(type));
  16592. };
  16593. DirectiveResolver.prototype._mergeWithPropertyMetadata = function (dm, propertyMetadata) {
  16594. var inputs = [];
  16595. var outputs = [];
  16596. var host = {};
  16597. var queries = {};
  16598. collection_1.StringMapWrapper.forEach(propertyMetadata, function (metadata, propName) {
  16599. metadata.forEach(function (a) {
  16600. if (a instanceof metadata_1.InputMetadata) {
  16601. if (lang_1.isPresent(a.bindingPropertyName)) {
  16602. inputs.push(propName + ": " + a.bindingPropertyName);
  16603. }
  16604. else {
  16605. inputs.push(propName);
  16606. }
  16607. }
  16608. if (a instanceof metadata_1.OutputMetadata) {
  16609. if (lang_1.isPresent(a.bindingPropertyName)) {
  16610. outputs.push(propName + ": " + a.bindingPropertyName);
  16611. }
  16612. else {
  16613. outputs.push(propName);
  16614. }
  16615. }
  16616. if (a instanceof metadata_1.HostBindingMetadata) {
  16617. if (lang_1.isPresent(a.hostPropertyName)) {
  16618. host[("[" + a.hostPropertyName + "]")] = propName;
  16619. }
  16620. else {
  16621. host[("[" + propName + "]")] = propName;
  16622. }
  16623. }
  16624. if (a instanceof metadata_1.HostListenerMetadata) {
  16625. var args = lang_1.isPresent(a.args) ? a.args.join(', ') : '';
  16626. host[("(" + a.eventName + ")")] = propName + "(" + args + ")";
  16627. }
  16628. if (a instanceof metadata_1.ContentChildrenMetadata) {
  16629. queries[propName] = a;
  16630. }
  16631. if (a instanceof metadata_1.ViewChildrenMetadata) {
  16632. queries[propName] = a;
  16633. }
  16634. if (a instanceof metadata_1.ContentChildMetadata) {
  16635. queries[propName] = a;
  16636. }
  16637. if (a instanceof metadata_1.ViewChildMetadata) {
  16638. queries[propName] = a;
  16639. }
  16640. });
  16641. });
  16642. return this._merge(dm, inputs, outputs, host, queries);
  16643. };
  16644. DirectiveResolver.prototype._merge = function (dm, inputs, outputs, host, queries) {
  16645. var mergedInputs = lang_1.isPresent(dm.inputs) ? collection_1.ListWrapper.concat(dm.inputs, inputs) : inputs;
  16646. var mergedOutputs = lang_1.isPresent(dm.outputs) ? collection_1.ListWrapper.concat(dm.outputs, outputs) : outputs;
  16647. var mergedHost = lang_1.isPresent(dm.host) ? collection_1.StringMapWrapper.merge(dm.host, host) : host;
  16648. var mergedQueries = lang_1.isPresent(dm.queries) ? collection_1.StringMapWrapper.merge(dm.queries, queries) : queries;
  16649. if (dm instanceof metadata_1.ComponentMetadata) {
  16650. return new metadata_1.ComponentMetadata({
  16651. selector: dm.selector,
  16652. inputs: mergedInputs,
  16653. outputs: mergedOutputs,
  16654. host: mergedHost,
  16655. exportAs: dm.exportAs,
  16656. moduleId: dm.moduleId,
  16657. queries: mergedQueries,
  16658. changeDetection: dm.changeDetection,
  16659. providers: dm.providers,
  16660. viewProviders: dm.viewProviders
  16661. });
  16662. }
  16663. else {
  16664. return new metadata_1.DirectiveMetadata({
  16665. selector: dm.selector,
  16666. inputs: mergedInputs,
  16667. outputs: mergedOutputs,
  16668. host: mergedHost,
  16669. exportAs: dm.exportAs,
  16670. queries: mergedQueries,
  16671. providers: dm.providers
  16672. });
  16673. }
  16674. };
  16675. DirectiveResolver = __decorate([
  16676. di_1.Injectable(),
  16677. __metadata('design:paramtypes', [])
  16678. ], DirectiveResolver);
  16679. return DirectiveResolver;
  16680. })();
  16681. exports.DirectiveResolver = DirectiveResolver;
  16682. /***/ },
  16683. /* 93 */
  16684. /***/ function(module, exports, __webpack_require__) {
  16685. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  16686. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  16687. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  16688. 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;
  16689. return c > 3 && r && Object.defineProperty(target, key, r), r;
  16690. };
  16691. var __metadata = (this && this.__metadata) || function (k, v) {
  16692. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  16693. };
  16694. var di_1 = __webpack_require__(6);
  16695. var view_1 = __webpack_require__(56);
  16696. var directives_1 = __webpack_require__(23);
  16697. var lang_1 = __webpack_require__(5);
  16698. var exceptions_1 = __webpack_require__(14);
  16699. var collection_1 = __webpack_require__(12);
  16700. var reflection_1 = __webpack_require__(16);
  16701. /**
  16702. * Resolves types to {@link ViewMetadata}.
  16703. */
  16704. var ViewResolver = (function () {
  16705. function ViewResolver() {
  16706. /** @internal */
  16707. this._cache = new collection_1.Map();
  16708. }
  16709. ViewResolver.prototype.resolve = function (component) {
  16710. var view = this._cache.get(component);
  16711. if (lang_1.isBlank(view)) {
  16712. view = this._resolve(component);
  16713. this._cache.set(component, view);
  16714. }
  16715. return view;
  16716. };
  16717. /** @internal */
  16718. ViewResolver.prototype._resolve = function (component) {
  16719. var compMeta;
  16720. var viewMeta;
  16721. reflection_1.reflector.annotations(component).forEach(function (m) {
  16722. if (m instanceof view_1.ViewMetadata) {
  16723. viewMeta = m;
  16724. }
  16725. if (m instanceof directives_1.ComponentMetadata) {
  16726. compMeta = m;
  16727. }
  16728. });
  16729. if (lang_1.isPresent(compMeta)) {
  16730. if (lang_1.isBlank(compMeta.template) && lang_1.isBlank(compMeta.templateUrl) && lang_1.isBlank(viewMeta)) {
  16731. throw new exceptions_1.BaseException("Component '" + lang_1.stringify(component) + "' must have either 'template', 'templateUrl', or '@View' set.");
  16732. }
  16733. else if (lang_1.isPresent(compMeta.template) && lang_1.isPresent(viewMeta)) {
  16734. this._throwMixingViewAndComponent("template", component);
  16735. }
  16736. else if (lang_1.isPresent(compMeta.templateUrl) && lang_1.isPresent(viewMeta)) {
  16737. this._throwMixingViewAndComponent("templateUrl", component);
  16738. }
  16739. else if (lang_1.isPresent(compMeta.directives) && lang_1.isPresent(viewMeta)) {
  16740. this._throwMixingViewAndComponent("directives", component);
  16741. }
  16742. else if (lang_1.isPresent(compMeta.pipes) && lang_1.isPresent(viewMeta)) {
  16743. this._throwMixingViewAndComponent("pipes", component);
  16744. }
  16745. else if (lang_1.isPresent(compMeta.encapsulation) && lang_1.isPresent(viewMeta)) {
  16746. this._throwMixingViewAndComponent("encapsulation", component);
  16747. }
  16748. else if (lang_1.isPresent(compMeta.styles) && lang_1.isPresent(viewMeta)) {
  16749. this._throwMixingViewAndComponent("styles", component);
  16750. }
  16751. else if (lang_1.isPresent(compMeta.styleUrls) && lang_1.isPresent(viewMeta)) {
  16752. this._throwMixingViewAndComponent("styleUrls", component);
  16753. }
  16754. else if (lang_1.isPresent(viewMeta)) {
  16755. return viewMeta;
  16756. }
  16757. else {
  16758. return new view_1.ViewMetadata({
  16759. templateUrl: compMeta.templateUrl,
  16760. template: compMeta.template,
  16761. directives: compMeta.directives,
  16762. pipes: compMeta.pipes,
  16763. encapsulation: compMeta.encapsulation,
  16764. styles: compMeta.styles,
  16765. styleUrls: compMeta.styleUrls
  16766. });
  16767. }
  16768. }
  16769. else {
  16770. if (lang_1.isBlank(viewMeta)) {
  16771. throw new exceptions_1.BaseException("No View decorator found on component '" + lang_1.stringify(component) + "'");
  16772. }
  16773. else {
  16774. return viewMeta;
  16775. }
  16776. }
  16777. return null;
  16778. };
  16779. /** @internal */
  16780. ViewResolver.prototype._throwMixingViewAndComponent = function (propertyName, component) {
  16781. throw new exceptions_1.BaseException("Component '" + lang_1.stringify(component) + "' cannot have both '" + propertyName + "' and '@View' set at the same time\"");
  16782. };
  16783. ViewResolver = __decorate([
  16784. di_1.Injectable(),
  16785. __metadata('design:paramtypes', [])
  16786. ], ViewResolver);
  16787. return ViewResolver;
  16788. })();
  16789. exports.ViewResolver = ViewResolver;
  16790. /***/ },
  16791. /* 94 */
  16792. /***/ function(module, exports, __webpack_require__) {
  16793. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  16794. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  16795. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  16796. 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;
  16797. return c > 3 && r && Object.defineProperty(target, key, r), r;
  16798. };
  16799. var __metadata = (this && this.__metadata) || function (k, v) {
  16800. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  16801. };
  16802. var di_1 = __webpack_require__(6);
  16803. var lang_1 = __webpack_require__(5);
  16804. var exceptions_1 = __webpack_require__(14);
  16805. var metadata_1 = __webpack_require__(3);
  16806. var reflection_1 = __webpack_require__(16);
  16807. function _isPipeMetadata(type) {
  16808. return type instanceof metadata_1.PipeMetadata;
  16809. }
  16810. /**
  16811. * Resolve a `Type` for {@link PipeMetadata}.
  16812. *
  16813. * This interface can be overridden by the application developer to create custom behavior.
  16814. *
  16815. * See {@link Compiler}
  16816. */
  16817. var PipeResolver = (function () {
  16818. function PipeResolver() {
  16819. }
  16820. /**
  16821. * Return {@link PipeMetadata} for a given `Type`.
  16822. */
  16823. PipeResolver.prototype.resolve = function (type) {
  16824. var metas = reflection_1.reflector.annotations(di_1.resolveForwardRef(type));
  16825. if (lang_1.isPresent(metas)) {
  16826. var annotation = metas.find(_isPipeMetadata);
  16827. if (lang_1.isPresent(annotation)) {
  16828. return annotation;
  16829. }
  16830. }
  16831. throw new exceptions_1.BaseException("No Pipe decorator found on " + lang_1.stringify(type));
  16832. };
  16833. PipeResolver = __decorate([
  16834. di_1.Injectable(),
  16835. __metadata('design:paramtypes', [])
  16836. ], PipeResolver);
  16837. return PipeResolver;
  16838. })();
  16839. exports.PipeResolver = PipeResolver;
  16840. /***/ },
  16841. /* 95 */
  16842. /***/ function(module, exports, __webpack_require__) {
  16843. var di_1 = __webpack_require__(6);
  16844. var lang_1 = __webpack_require__(5);
  16845. /**
  16846. * A token that can be provided when bootstraping an application to make an array of directives
  16847. * available in every component of the application.
  16848. *
  16849. * ### Example
  16850. *
  16851. * ```typescript
  16852. * import {PLATFORM_DIRECTIVES} from 'angular2/core';
  16853. * import {OtherDirective} from './myDirectives';
  16854. *
  16855. * @Component({
  16856. * selector: 'my-component',
  16857. * template: `
  16858. * <!-- can use other directive even though the component does not list it in `directives` -->
  16859. * <other-directive></other-directive>
  16860. * `
  16861. * })
  16862. * export class MyComponent {
  16863. * ...
  16864. * }
  16865. *
  16866. * bootstrap(MyComponent, [provide(PLATFORM_DIRECTIVES, {useValue: [OtherDirective], multi:true})]);
  16867. * ```
  16868. */
  16869. exports.PLATFORM_DIRECTIVES = lang_1.CONST_EXPR(new di_1.OpaqueToken("Platform Directives"));
  16870. /**
  16871. * A token that can be provided when bootstraping an application to make an array of pipes
  16872. * available in every component of the application.
  16873. *
  16874. * ### Example
  16875. *
  16876. * ```typescript
  16877. * import {PLATFORM_PIPES} from 'angular2/core';
  16878. * import {OtherPipe} from './myPipe';
  16879. *
  16880. * @Component({
  16881. * selector: 'my-component',
  16882. * template: `
  16883. * {{123 | other-pipe}}
  16884. * `
  16885. * })
  16886. * export class MyComponent {
  16887. * ...
  16888. * }
  16889. *
  16890. * bootstrap(MyComponent, [provide(PLATFORM_PIPES, {useValue: [OtherPipe], multi:true})]);
  16891. * ```
  16892. */
  16893. exports.PLATFORM_PIPES = lang_1.CONST_EXPR(new di_1.OpaqueToken("Platform Pipes"));
  16894. /***/ },
  16895. /* 96 */
  16896. /***/ function(module, exports, __webpack_require__) {
  16897. var __extends = (this && this.__extends) || function (d, b) {
  16898. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  16899. function __() { this.constructor = d; }
  16900. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  16901. };
  16902. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  16903. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  16904. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  16905. 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;
  16906. return c > 3 && r && Object.defineProperty(target, key, r), r;
  16907. };
  16908. var __metadata = (this && this.__metadata) || function (k, v) {
  16909. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  16910. };
  16911. var lang_1 = __webpack_require__(5);
  16912. var exceptions_1 = __webpack_require__(14);
  16913. var api_1 = __webpack_require__(72);
  16914. var metadata_1 = __webpack_require__(3);
  16915. // Export ViewEncapsulation so that compiled templates only need to depend
  16916. // on template_commands.
  16917. var metadata_2 = __webpack_require__(3);
  16918. exports.ViewEncapsulation = metadata_2.ViewEncapsulation;
  16919. /**
  16920. * A compiled host template.
  16921. *
  16922. * This is const as we are storing it as annotation
  16923. * for the compiled component type.
  16924. */
  16925. var CompiledHostTemplate = (function () {
  16926. function CompiledHostTemplate(template) {
  16927. this.template = template;
  16928. }
  16929. CompiledHostTemplate = __decorate([
  16930. lang_1.CONST(),
  16931. __metadata('design:paramtypes', [CompiledComponentTemplate])
  16932. ], CompiledHostTemplate);
  16933. return CompiledHostTemplate;
  16934. })();
  16935. exports.CompiledHostTemplate = CompiledHostTemplate;
  16936. /**
  16937. * A compiled template.
  16938. */
  16939. var CompiledComponentTemplate = (function () {
  16940. function CompiledComponentTemplate(id, changeDetectorFactory, commands, styles) {
  16941. this.id = id;
  16942. this.changeDetectorFactory = changeDetectorFactory;
  16943. this.commands = commands;
  16944. this.styles = styles;
  16945. }
  16946. CompiledComponentTemplate = __decorate([
  16947. lang_1.CONST(),
  16948. __metadata('design:paramtypes', [String, Function, Array, Array])
  16949. ], CompiledComponentTemplate);
  16950. return CompiledComponentTemplate;
  16951. })();
  16952. exports.CompiledComponentTemplate = CompiledComponentTemplate;
  16953. var EMPTY_ARR = lang_1.CONST_EXPR([]);
  16954. var TextCmd = (function () {
  16955. function TextCmd(value, isBound, ngContentIndex) {
  16956. this.value = value;
  16957. this.isBound = isBound;
  16958. this.ngContentIndex = ngContentIndex;
  16959. }
  16960. TextCmd.prototype.visit = function (visitor, context) {
  16961. return visitor.visitText(this, context);
  16962. };
  16963. TextCmd = __decorate([
  16964. lang_1.CONST(),
  16965. __metadata('design:paramtypes', [String, Boolean, Number])
  16966. ], TextCmd);
  16967. return TextCmd;
  16968. })();
  16969. exports.TextCmd = TextCmd;
  16970. var NgContentCmd = (function () {
  16971. function NgContentCmd(index, ngContentIndex) {
  16972. this.index = index;
  16973. this.ngContentIndex = ngContentIndex;
  16974. this.isBound = false;
  16975. }
  16976. NgContentCmd.prototype.visit = function (visitor, context) {
  16977. return visitor.visitNgContent(this, context);
  16978. };
  16979. NgContentCmd = __decorate([
  16980. lang_1.CONST(),
  16981. __metadata('design:paramtypes', [Number, Number])
  16982. ], NgContentCmd);
  16983. return NgContentCmd;
  16984. })();
  16985. exports.NgContentCmd = NgContentCmd;
  16986. var IBeginElementCmd = (function (_super) {
  16987. __extends(IBeginElementCmd, _super);
  16988. function IBeginElementCmd() {
  16989. _super.apply(this, arguments);
  16990. }
  16991. Object.defineProperty(IBeginElementCmd.prototype, "variableNameAndValues", {
  16992. get: function () { return exceptions_1.unimplemented(); },
  16993. enumerable: true,
  16994. configurable: true
  16995. });
  16996. Object.defineProperty(IBeginElementCmd.prototype, "eventTargetAndNames", {
  16997. get: function () { return exceptions_1.unimplemented(); },
  16998. enumerable: true,
  16999. configurable: true
  17000. });
  17001. Object.defineProperty(IBeginElementCmd.prototype, "directives", {
  17002. get: function () { return exceptions_1.unimplemented(); },
  17003. enumerable: true,
  17004. configurable: true
  17005. });
  17006. return IBeginElementCmd;
  17007. })(api_1.RenderBeginElementCmd);
  17008. exports.IBeginElementCmd = IBeginElementCmd;
  17009. var BeginElementCmd = (function () {
  17010. function BeginElementCmd(name, attrNameAndValues, eventTargetAndNames, variableNameAndValues, directives, isBound, ngContentIndex) {
  17011. this.name = name;
  17012. this.attrNameAndValues = attrNameAndValues;
  17013. this.eventTargetAndNames = eventTargetAndNames;
  17014. this.variableNameAndValues = variableNameAndValues;
  17015. this.directives = directives;
  17016. this.isBound = isBound;
  17017. this.ngContentIndex = ngContentIndex;
  17018. }
  17019. BeginElementCmd.prototype.visit = function (visitor, context) {
  17020. return visitor.visitBeginElement(this, context);
  17021. };
  17022. BeginElementCmd = __decorate([
  17023. lang_1.CONST(),
  17024. __metadata('design:paramtypes', [String, Array, Array, Array, Array, Boolean, Number])
  17025. ], BeginElementCmd);
  17026. return BeginElementCmd;
  17027. })();
  17028. exports.BeginElementCmd = BeginElementCmd;
  17029. var EndElementCmd = (function () {
  17030. function EndElementCmd() {
  17031. }
  17032. EndElementCmd.prototype.visit = function (visitor, context) {
  17033. return visitor.visitEndElement(context);
  17034. };
  17035. EndElementCmd = __decorate([
  17036. lang_1.CONST(),
  17037. __metadata('design:paramtypes', [])
  17038. ], EndElementCmd);
  17039. return EndElementCmd;
  17040. })();
  17041. exports.EndElementCmd = EndElementCmd;
  17042. var BeginComponentCmd = (function () {
  17043. function BeginComponentCmd(name, attrNameAndValues, eventTargetAndNames, variableNameAndValues, directives, encapsulation, ngContentIndex,
  17044. // Note: the template needs to be stored as a function
  17045. // so that we can resolve cycles
  17046. templateGetter /*() => CompiledComponentTemplate*/) {
  17047. this.name = name;
  17048. this.attrNameAndValues = attrNameAndValues;
  17049. this.eventTargetAndNames = eventTargetAndNames;
  17050. this.variableNameAndValues = variableNameAndValues;
  17051. this.directives = directives;
  17052. this.encapsulation = encapsulation;
  17053. this.ngContentIndex = ngContentIndex;
  17054. this.templateGetter = templateGetter;
  17055. this.isBound = true;
  17056. }
  17057. Object.defineProperty(BeginComponentCmd.prototype, "templateId", {
  17058. get: function () { return this.templateGetter().id; },
  17059. enumerable: true,
  17060. configurable: true
  17061. });
  17062. BeginComponentCmd.prototype.visit = function (visitor, context) {
  17063. return visitor.visitBeginComponent(this, context);
  17064. };
  17065. BeginComponentCmd = __decorate([
  17066. lang_1.CONST(),
  17067. __metadata('design:paramtypes', [String, Array, Array, Array, Array, Number, Number, Function])
  17068. ], BeginComponentCmd);
  17069. return BeginComponentCmd;
  17070. })();
  17071. exports.BeginComponentCmd = BeginComponentCmd;
  17072. var EndComponentCmd = (function () {
  17073. function EndComponentCmd() {
  17074. }
  17075. EndComponentCmd.prototype.visit = function (visitor, context) {
  17076. return visitor.visitEndComponent(context);
  17077. };
  17078. EndComponentCmd = __decorate([
  17079. lang_1.CONST(),
  17080. __metadata('design:paramtypes', [])
  17081. ], EndComponentCmd);
  17082. return EndComponentCmd;
  17083. })();
  17084. exports.EndComponentCmd = EndComponentCmd;
  17085. var EmbeddedTemplateCmd = (function () {
  17086. function EmbeddedTemplateCmd(attrNameAndValues, variableNameAndValues, directives, isMerged, ngContentIndex, changeDetectorFactory, children) {
  17087. this.attrNameAndValues = attrNameAndValues;
  17088. this.variableNameAndValues = variableNameAndValues;
  17089. this.directives = directives;
  17090. this.isMerged = isMerged;
  17091. this.ngContentIndex = ngContentIndex;
  17092. this.changeDetectorFactory = changeDetectorFactory;
  17093. this.children = children;
  17094. this.isBound = true;
  17095. this.name = null;
  17096. this.eventTargetAndNames = EMPTY_ARR;
  17097. }
  17098. EmbeddedTemplateCmd.prototype.visit = function (visitor, context) {
  17099. return visitor.visitEmbeddedTemplate(this, context);
  17100. };
  17101. EmbeddedTemplateCmd = __decorate([
  17102. lang_1.CONST(),
  17103. __metadata('design:paramtypes', [Array, Array, Array, Boolean, Number, Function, Array])
  17104. ], EmbeddedTemplateCmd);
  17105. return EmbeddedTemplateCmd;
  17106. })();
  17107. exports.EmbeddedTemplateCmd = EmbeddedTemplateCmd;
  17108. function visitAllCommands(visitor, cmds, context) {
  17109. if (context === void 0) { context = null; }
  17110. for (var i = 0; i < cmds.length; i++) {
  17111. cmds[i].visit(visitor, context);
  17112. }
  17113. }
  17114. exports.visitAllCommands = visitAllCommands;
  17115. /***/ },
  17116. /* 97 */
  17117. /***/ function(module, exports, __webpack_require__) {
  17118. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  17119. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  17120. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  17121. 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;
  17122. return c > 3 && r && Object.defineProperty(target, key, r), r;
  17123. };
  17124. var __metadata = (this && this.__metadata) || function (k, v) {
  17125. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  17126. };
  17127. var di_1 = __webpack_require__(6);
  17128. var lang_1 = __webpack_require__(5);
  17129. var Console = (function () {
  17130. function Console() {
  17131. }
  17132. Console.prototype.log = function (message) { lang_1.print(message); };
  17133. Console = __decorate([
  17134. di_1.Injectable(),
  17135. __metadata('design:paramtypes', [])
  17136. ], Console);
  17137. return Console;
  17138. })();
  17139. exports.Console = Console;
  17140. /***/ },
  17141. /* 98 */
  17142. /***/ function(module, exports, __webpack_require__) {
  17143. // Public API for Zone
  17144. var ng_zone_1 = __webpack_require__(66);
  17145. exports.NgZone = ng_zone_1.NgZone;
  17146. exports.NgZoneError = ng_zone_1.NgZoneError;
  17147. /***/ },
  17148. /* 99 */
  17149. /***/ function(module, exports, __webpack_require__) {
  17150. // Public API for render
  17151. var api_1 = __webpack_require__(72);
  17152. exports.Renderer = api_1.Renderer;
  17153. exports.RenderViewRef = api_1.RenderViewRef;
  17154. exports.RenderProtoViewRef = api_1.RenderProtoViewRef;
  17155. exports.RenderFragmentRef = api_1.RenderFragmentRef;
  17156. exports.RenderViewWithFragments = api_1.RenderViewWithFragments;
  17157. exports.RenderTemplateCmd = api_1.RenderTemplateCmd;
  17158. exports.RenderTextCmd = api_1.RenderTextCmd;
  17159. exports.RenderNgContentCmd = api_1.RenderNgContentCmd;
  17160. exports.RenderBeginElementCmd = api_1.RenderBeginElementCmd;
  17161. exports.RenderBeginComponentCmd = api_1.RenderBeginComponentCmd;
  17162. exports.RenderEmbeddedTemplateCmd = api_1.RenderEmbeddedTemplateCmd;
  17163. exports.RenderBeginCmd = api_1.RenderBeginCmd;
  17164. exports.RenderComponentTemplate = api_1.RenderComponentTemplate;
  17165. /***/ },
  17166. /* 100 */
  17167. /***/ function(module, exports, __webpack_require__) {
  17168. // Public API for compiler
  17169. var directive_resolver_1 = __webpack_require__(92);
  17170. exports.DirectiveResolver = directive_resolver_1.DirectiveResolver;
  17171. var view_resolver_1 = __webpack_require__(93);
  17172. exports.ViewResolver = view_resolver_1.ViewResolver;
  17173. var compiler_1 = __webpack_require__(70);
  17174. exports.Compiler = compiler_1.Compiler;
  17175. var view_manager_1 = __webpack_require__(81);
  17176. exports.AppViewManager = view_manager_1.AppViewManager;
  17177. var query_list_1 = __webpack_require__(90);
  17178. exports.QueryList = query_list_1.QueryList;
  17179. var dynamic_component_loader_1 = __webpack_require__(69);
  17180. exports.DynamicComponentLoader = dynamic_component_loader_1.DynamicComponentLoader;
  17181. var element_ref_1 = __webpack_require__(83);
  17182. exports.ElementRef = element_ref_1.ElementRef;
  17183. var template_ref_1 = __webpack_require__(84);
  17184. exports.TemplateRef = template_ref_1.TemplateRef;
  17185. var view_ref_1 = __webpack_require__(77);
  17186. exports.ViewRef = view_ref_1.ViewRef;
  17187. exports.ProtoViewRef = view_ref_1.ProtoViewRef;
  17188. var view_container_ref_1 = __webpack_require__(87);
  17189. exports.ViewContainerRef = view_container_ref_1.ViewContainerRef;
  17190. var dynamic_component_loader_2 = __webpack_require__(69);
  17191. exports.ComponentRef = dynamic_component_loader_2.ComponentRef;
  17192. /***/ },
  17193. /* 101 */
  17194. /***/ function(module, exports, __webpack_require__) {
  17195. var __extends = (this && this.__extends) || function (d, b) {
  17196. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  17197. function __() { this.constructor = d; }
  17198. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  17199. };
  17200. var lang_1 = __webpack_require__(5);
  17201. var exceptions_1 = __webpack_require__(14);
  17202. var view_1 = __webpack_require__(76);
  17203. var view_ref_1 = __webpack_require__(77);
  17204. /**
  17205. * A DebugElement contains information from the Angular compiler about an
  17206. * element and provides access to the corresponding ElementInjector and
  17207. * underlying DOM Element, as well as a way to query for children.
  17208. *
  17209. * A DebugElement can be obtained from a {@link ComponentFixture} or from an
  17210. * {@link ElementRef} via {@link inspectElement}.
  17211. */
  17212. var DebugElement = (function () {
  17213. function DebugElement() {
  17214. }
  17215. Object.defineProperty(DebugElement.prototype, "componentInstance", {
  17216. /**
  17217. * Return the instance of the component associated with this element, if any.
  17218. */
  17219. get: function () { return exceptions_1.unimplemented(); },
  17220. enumerable: true,
  17221. configurable: true
  17222. });
  17223. ;
  17224. Object.defineProperty(DebugElement.prototype, "nativeElement", {
  17225. /**
  17226. * Return the native HTML element for this DebugElement.
  17227. */
  17228. get: function () { return exceptions_1.unimplemented(); },
  17229. enumerable: true,
  17230. configurable: true
  17231. });
  17232. ;
  17233. Object.defineProperty(DebugElement.prototype, "elementRef", {
  17234. /**
  17235. * Return an Angular {@link ElementRef} for this element.
  17236. */
  17237. get: function () { return exceptions_1.unimplemented(); },
  17238. enumerable: true,
  17239. configurable: true
  17240. });
  17241. ;
  17242. Object.defineProperty(DebugElement.prototype, "children", {
  17243. /**
  17244. * Get child DebugElements from within the Light DOM.
  17245. *
  17246. * @return {DebugElement[]}
  17247. */
  17248. get: function () { return exceptions_1.unimplemented(); },
  17249. enumerable: true,
  17250. configurable: true
  17251. });
  17252. ;
  17253. Object.defineProperty(DebugElement.prototype, "componentViewChildren", {
  17254. /**
  17255. * Get the root DebugElement children of a component. Returns an empty
  17256. * list if the current DebugElement is not a component root.
  17257. *
  17258. * @return {DebugElement[]}
  17259. */
  17260. get: function () { return exceptions_1.unimplemented(); },
  17261. enumerable: true,
  17262. configurable: true
  17263. });
  17264. ;
  17265. /**
  17266. * Return the first descendant TestElement matching the given predicate
  17267. * and scope.
  17268. *
  17269. * @param {Function: boolean} predicate
  17270. * @param {Scope} scope
  17271. *
  17272. * @return {DebugElement}
  17273. */
  17274. DebugElement.prototype.query = function (predicate, scope) {
  17275. if (scope === void 0) { scope = Scope.all; }
  17276. var results = this.queryAll(predicate, scope);
  17277. return results.length > 0 ? results[0] : null;
  17278. };
  17279. /**
  17280. * Return descendant TestElememts matching the given predicate
  17281. * and scope.
  17282. *
  17283. * @param {Function: boolean} predicate
  17284. * @param {Scope} scope
  17285. *
  17286. * @return {DebugElement[]}
  17287. */
  17288. DebugElement.prototype.queryAll = function (predicate, scope) {
  17289. if (scope === void 0) { scope = Scope.all; }
  17290. var elementsInScope = scope(this);
  17291. return elementsInScope.filter(predicate);
  17292. };
  17293. return DebugElement;
  17294. })();
  17295. exports.DebugElement = DebugElement;
  17296. var DebugElement_ = (function (_super) {
  17297. __extends(DebugElement_, _super);
  17298. function DebugElement_(_parentView, _boundElementIndex) {
  17299. _super.call(this);
  17300. this._parentView = _parentView;
  17301. this._boundElementIndex = _boundElementIndex;
  17302. this._elementInjector = this._parentView.elementInjectors[this._boundElementIndex];
  17303. }
  17304. Object.defineProperty(DebugElement_.prototype, "componentInstance", {
  17305. get: function () {
  17306. if (!lang_1.isPresent(this._elementInjector)) {
  17307. return null;
  17308. }
  17309. return this._elementInjector.getComponent();
  17310. },
  17311. enumerable: true,
  17312. configurable: true
  17313. });
  17314. Object.defineProperty(DebugElement_.prototype, "nativeElement", {
  17315. get: function () { return this.elementRef.nativeElement; },
  17316. enumerable: true,
  17317. configurable: true
  17318. });
  17319. Object.defineProperty(DebugElement_.prototype, "elementRef", {
  17320. get: function () { return this._parentView.elementRefs[this._boundElementIndex]; },
  17321. enumerable: true,
  17322. configurable: true
  17323. });
  17324. DebugElement_.prototype.getDirectiveInstance = function (directiveIndex) {
  17325. return this._elementInjector.getDirectiveAtIndex(directiveIndex);
  17326. };
  17327. Object.defineProperty(DebugElement_.prototype, "children", {
  17328. get: function () {
  17329. return this._getChildElements(this._parentView, this._boundElementIndex);
  17330. },
  17331. enumerable: true,
  17332. configurable: true
  17333. });
  17334. Object.defineProperty(DebugElement_.prototype, "componentViewChildren", {
  17335. get: function () {
  17336. var shadowView = this._parentView.getNestedView(this._boundElementIndex);
  17337. if (!lang_1.isPresent(shadowView) || shadowView.proto.type !== view_1.ViewType.COMPONENT) {
  17338. // The current element is not a component.
  17339. return [];
  17340. }
  17341. return this._getChildElements(shadowView, null);
  17342. },
  17343. enumerable: true,
  17344. configurable: true
  17345. });
  17346. DebugElement_.prototype.triggerEventHandler = function (eventName, eventObj) {
  17347. this._parentView.triggerEventHandlers(eventName, eventObj, this._boundElementIndex);
  17348. };
  17349. DebugElement_.prototype.hasDirective = function (type) {
  17350. if (!lang_1.isPresent(this._elementInjector)) {
  17351. return false;
  17352. }
  17353. return this._elementInjector.hasDirective(type);
  17354. };
  17355. DebugElement_.prototype.inject = function (type) {
  17356. if (!lang_1.isPresent(this._elementInjector)) {
  17357. return null;
  17358. }
  17359. return this._elementInjector.get(type);
  17360. };
  17361. DebugElement_.prototype.getLocal = function (name) { return this._parentView.locals.get(name); };
  17362. /** @internal */
  17363. DebugElement_.prototype._getChildElements = function (view, parentBoundElementIndex) {
  17364. var _this = this;
  17365. var els = [];
  17366. var parentElementBinder = null;
  17367. if (lang_1.isPresent(parentBoundElementIndex)) {
  17368. parentElementBinder = view.proto.elementBinders[parentBoundElementIndex - view.elementOffset];
  17369. }
  17370. for (var i = 0; i < view.proto.elementBinders.length; ++i) {
  17371. var binder = view.proto.elementBinders[i];
  17372. if (binder.parent == parentElementBinder) {
  17373. els.push(new DebugElement_(view, view.elementOffset + i));
  17374. var views = view.viewContainers[view.elementOffset + i];
  17375. if (lang_1.isPresent(views)) {
  17376. views.views.forEach(function (nextView) { els = els.concat(_this._getChildElements(nextView, null)); });
  17377. }
  17378. }
  17379. }
  17380. return els;
  17381. };
  17382. return DebugElement_;
  17383. })(DebugElement);
  17384. exports.DebugElement_ = DebugElement_;
  17385. /**
  17386. * Returns a {@link DebugElement} for an {@link ElementRef}.
  17387. *
  17388. * @param {ElementRef}: elementRef
  17389. * @return {DebugElement}
  17390. */
  17391. function inspectElement(elementRef) {
  17392. return new DebugElement_(view_ref_1.internalView(elementRef.parentView), elementRef.boundElementIndex);
  17393. }
  17394. exports.inspectElement = inspectElement;
  17395. /**
  17396. * Maps an array of {@link DebugElement}s to an array of native DOM elements.
  17397. */
  17398. function asNativeElements(arr) {
  17399. return arr.map(function (debugEl) { return debugEl.nativeElement; });
  17400. }
  17401. exports.asNativeElements = asNativeElements;
  17402. /**
  17403. * Set of scope functions used with {@link DebugElement}'s query functionality.
  17404. */
  17405. var Scope = (function () {
  17406. function Scope() {
  17407. }
  17408. /**
  17409. * Scope queries to both the light dom and view of an element and its
  17410. * children.
  17411. *
  17412. * ## Example
  17413. *
  17414. * {@example core/debug/ts/debug_element/debug_element.ts region='scope_all'}
  17415. */
  17416. Scope.all = function (debugElement) {
  17417. var scope = [];
  17418. scope.push(debugElement);
  17419. debugElement.children.forEach(function (child) { return scope = scope.concat(Scope.all(child)); });
  17420. debugElement.componentViewChildren.forEach(function (child) { return scope = scope.concat(Scope.all(child)); });
  17421. return scope;
  17422. };
  17423. /**
  17424. * Scope queries to the light dom of an element and its children.
  17425. *
  17426. * ## Example
  17427. *
  17428. * {@example core/debug/ts/debug_element/debug_element.ts region='scope_light'}
  17429. */
  17430. Scope.light = function (debugElement) {
  17431. var scope = [];
  17432. debugElement.children.forEach(function (child) {
  17433. scope.push(child);
  17434. scope = scope.concat(Scope.light(child));
  17435. });
  17436. return scope;
  17437. };
  17438. /**
  17439. * Scope queries to the view of an element of its children.
  17440. *
  17441. * ## Example
  17442. *
  17443. * {@example core/debug/ts/debug_element/debug_element.ts region='scope_view'}
  17444. */
  17445. Scope.view = function (debugElement) {
  17446. var scope = [];
  17447. debugElement.componentViewChildren.forEach(function (child) {
  17448. scope.push(child);
  17449. scope = scope.concat(Scope.light(child));
  17450. });
  17451. return scope;
  17452. };
  17453. return Scope;
  17454. })();
  17455. exports.Scope = Scope;
  17456. /***/ },
  17457. /* 102 */
  17458. /***/ function(module, exports, __webpack_require__) {
  17459. var lang_1 = __webpack_require__(5);
  17460. var di_1 = __webpack_require__(6);
  17461. var console_1 = __webpack_require__(97);
  17462. var reflection_1 = __webpack_require__(16);
  17463. var testability_1 = __webpack_require__(68);
  17464. function _reflector() {
  17465. return reflection_1.reflector;
  17466. }
  17467. /**
  17468. * A default set of providers which should be included in any Angular platform.
  17469. */
  17470. exports.PLATFORM_COMMON_PROVIDERS = lang_1.CONST_EXPR([new di_1.Provider(reflection_1.Reflector, { useFactory: _reflector, deps: [] }), testability_1.TestabilityRegistry, console_1.Console]);
  17471. /***/ },
  17472. /* 103 */
  17473. /***/ function(module, exports, __webpack_require__) {
  17474. var lang_1 = __webpack_require__(5);
  17475. var di_1 = __webpack_require__(6);
  17476. var application_tokens_1 = __webpack_require__(67);
  17477. var change_detection_1 = __webpack_require__(25);
  17478. var view_pool_1 = __webpack_require__(85);
  17479. var view_manager_1 = __webpack_require__(81);
  17480. var view_manager_2 = __webpack_require__(81);
  17481. var view_manager_utils_1 = __webpack_require__(82);
  17482. var view_resolver_1 = __webpack_require__(93);
  17483. var view_listener_1 = __webpack_require__(86);
  17484. var proto_view_factory_1 = __webpack_require__(71);
  17485. var directive_resolver_1 = __webpack_require__(92);
  17486. var pipe_resolver_1 = __webpack_require__(94);
  17487. var compiler_1 = __webpack_require__(70);
  17488. var compiler_2 = __webpack_require__(70);
  17489. var dynamic_component_loader_1 = __webpack_require__(69);
  17490. var dynamic_component_loader_2 = __webpack_require__(69);
  17491. /**
  17492. * A default set of providers which should be included in any Angular
  17493. * application, regardless of the platform it runs onto.
  17494. */
  17495. exports.APPLICATION_COMMON_PROVIDERS = lang_1.CONST_EXPR([
  17496. new di_1.Provider(compiler_1.Compiler, { useClass: compiler_2.Compiler_ }),
  17497. application_tokens_1.APP_ID_RANDOM_PROVIDER,
  17498. view_pool_1.AppViewPool,
  17499. new di_1.Provider(view_pool_1.APP_VIEW_POOL_CAPACITY, { useValue: 10000 }),
  17500. new di_1.Provider(view_manager_1.AppViewManager, { useClass: view_manager_2.AppViewManager_ }),
  17501. view_manager_utils_1.AppViewManagerUtils,
  17502. view_listener_1.AppViewListener,
  17503. proto_view_factory_1.ProtoViewFactory,
  17504. view_resolver_1.ViewResolver,
  17505. new di_1.Provider(change_detection_1.IterableDiffers, { useValue: change_detection_1.defaultIterableDiffers }),
  17506. new di_1.Provider(change_detection_1.KeyValueDiffers, { useValue: change_detection_1.defaultKeyValueDiffers }),
  17507. directive_resolver_1.DirectiveResolver,
  17508. pipe_resolver_1.PipeResolver,
  17509. new di_1.Provider(dynamic_component_loader_1.DynamicComponentLoader, { useClass: dynamic_component_loader_2.DynamicComponentLoader_ })
  17510. ]);
  17511. /***/ },
  17512. /* 104 */
  17513. /***/ function(module, exports, __webpack_require__) {
  17514. function __export(m) {
  17515. for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
  17516. }
  17517. __export(__webpack_require__(105));
  17518. __export(__webpack_require__(115));
  17519. __export(__webpack_require__(123));
  17520. __export(__webpack_require__(146));
  17521. /***/ },
  17522. /* 105 */
  17523. /***/ function(module, exports, __webpack_require__) {
  17524. /**
  17525. * @module
  17526. * @description
  17527. * This module provides a set of common Pipes.
  17528. */
  17529. var async_pipe_1 = __webpack_require__(106);
  17530. var uppercase_pipe_1 = __webpack_require__(108);
  17531. var lowercase_pipe_1 = __webpack_require__(109);
  17532. var json_pipe_1 = __webpack_require__(110);
  17533. var slice_pipe_1 = __webpack_require__(111);
  17534. var date_pipe_1 = __webpack_require__(112);
  17535. var number_pipe_1 = __webpack_require__(114);
  17536. var lang_1 = __webpack_require__(5);
  17537. var async_pipe_2 = __webpack_require__(106);
  17538. exports.AsyncPipe = async_pipe_2.AsyncPipe;
  17539. var date_pipe_2 = __webpack_require__(112);
  17540. exports.DatePipe = date_pipe_2.DatePipe;
  17541. var json_pipe_2 = __webpack_require__(110);
  17542. exports.JsonPipe = json_pipe_2.JsonPipe;
  17543. var slice_pipe_2 = __webpack_require__(111);
  17544. exports.SlicePipe = slice_pipe_2.SlicePipe;
  17545. var lowercase_pipe_2 = __webpack_require__(109);
  17546. exports.LowerCasePipe = lowercase_pipe_2.LowerCasePipe;
  17547. var number_pipe_2 = __webpack_require__(114);
  17548. exports.NumberPipe = number_pipe_2.NumberPipe;
  17549. exports.DecimalPipe = number_pipe_2.DecimalPipe;
  17550. exports.PercentPipe = number_pipe_2.PercentPipe;
  17551. exports.CurrencyPipe = number_pipe_2.CurrencyPipe;
  17552. var uppercase_pipe_2 = __webpack_require__(108);
  17553. exports.UpperCasePipe = uppercase_pipe_2.UpperCasePipe;
  17554. /**
  17555. * A collection of Angular core pipes that are likely to be used in each and every
  17556. * application.
  17557. *
  17558. * This collection can be used to quickly enumerate all the built-in pipes in the `pipes`
  17559. * property of the `@Component` or `@View` decorators.
  17560. */
  17561. exports.COMMON_PIPES = lang_1.CONST_EXPR([
  17562. async_pipe_1.AsyncPipe,
  17563. uppercase_pipe_1.UpperCasePipe,
  17564. lowercase_pipe_1.LowerCasePipe,
  17565. json_pipe_1.JsonPipe,
  17566. slice_pipe_1.SlicePipe,
  17567. number_pipe_1.DecimalPipe,
  17568. number_pipe_1.PercentPipe,
  17569. number_pipe_1.CurrencyPipe,
  17570. date_pipe_1.DatePipe
  17571. ]);
  17572. /***/ },
  17573. /* 106 */
  17574. /***/ function(module, exports, __webpack_require__) {
  17575. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  17576. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  17577. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  17578. 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;
  17579. return c > 3 && r && Object.defineProperty(target, key, r), r;
  17580. };
  17581. var __metadata = (this && this.__metadata) || function (k, v) {
  17582. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  17583. };
  17584. var lang_1 = __webpack_require__(5);
  17585. var async_1 = __webpack_require__(60);
  17586. var core_1 = __webpack_require__(2);
  17587. var invalid_pipe_argument_exception_1 = __webpack_require__(107);
  17588. var ObservableStrategy = (function () {
  17589. function ObservableStrategy() {
  17590. }
  17591. ObservableStrategy.prototype.createSubscription = function (async, updateLatestValue) {
  17592. return async_1.ObservableWrapper.subscribe(async, updateLatestValue, function (e) { throw e; });
  17593. };
  17594. ObservableStrategy.prototype.dispose = function (subscription) { async_1.ObservableWrapper.dispose(subscription); };
  17595. ObservableStrategy.prototype.onDestroy = function (subscription) { async_1.ObservableWrapper.dispose(subscription); };
  17596. return ObservableStrategy;
  17597. })();
  17598. var PromiseStrategy = (function () {
  17599. function PromiseStrategy() {
  17600. }
  17601. PromiseStrategy.prototype.createSubscription = function (async, updateLatestValue) {
  17602. return async.then(updateLatestValue);
  17603. };
  17604. PromiseStrategy.prototype.dispose = function (subscription) { };
  17605. PromiseStrategy.prototype.onDestroy = function (subscription) { };
  17606. return PromiseStrategy;
  17607. })();
  17608. var _promiseStrategy = new PromiseStrategy();
  17609. var _observableStrategy = new ObservableStrategy();
  17610. /**
  17611. * The `async` pipe subscribes to an Observable or Promise and returns the latest value it has
  17612. * emitted.
  17613. * When a new value is emitted, the `async` pipe marks the component to be checked for changes.
  17614. *
  17615. * ### Example
  17616. *
  17617. * This example binds a `Promise` to the view. Clicking the `Resolve` button resolves the
  17618. * promise.
  17619. *
  17620. * {@example core/pipes/ts/async_pipe/async_pipe_example.ts region='AsyncPipe'}
  17621. *
  17622. * It's also possible to use `async` with Observables. The example below binds the `time` Observable
  17623. * to the view. Every 500ms, the `time` Observable updates the view with the current time.
  17624. *
  17625. * ```typescript
  17626. * ```
  17627. */
  17628. var AsyncPipe = (function () {
  17629. function AsyncPipe(_ref) {
  17630. /** @internal */
  17631. this._latestValue = null;
  17632. /** @internal */
  17633. this._latestReturnedValue = null;
  17634. /** @internal */
  17635. this._subscription = null;
  17636. /** @internal */
  17637. this._obj = null;
  17638. this._strategy = null;
  17639. this._ref = _ref;
  17640. }
  17641. AsyncPipe.prototype.ngOnDestroy = function () {
  17642. if (lang_1.isPresent(this._subscription)) {
  17643. this._dispose();
  17644. }
  17645. };
  17646. AsyncPipe.prototype.transform = function (obj, args) {
  17647. if (lang_1.isBlank(this._obj)) {
  17648. if (lang_1.isPresent(obj)) {
  17649. this._subscribe(obj);
  17650. }
  17651. return this._latestValue;
  17652. }
  17653. if (obj !== this._obj) {
  17654. this._dispose();
  17655. return this.transform(obj);
  17656. }
  17657. if (this._latestValue === this._latestReturnedValue) {
  17658. return this._latestReturnedValue;
  17659. }
  17660. else {
  17661. this._latestReturnedValue = this._latestValue;
  17662. return core_1.WrappedValue.wrap(this._latestValue);
  17663. }
  17664. };
  17665. /** @internal */
  17666. AsyncPipe.prototype._subscribe = function (obj) {
  17667. var _this = this;
  17668. this._obj = obj;
  17669. this._strategy = this._selectStrategy(obj);
  17670. this._subscription =
  17671. this._strategy.createSubscription(obj, function (value) { return _this._updateLatestValue(obj, value); });
  17672. };
  17673. /** @internal */
  17674. AsyncPipe.prototype._selectStrategy = function (obj) {
  17675. if (lang_1.isPromise(obj)) {
  17676. return _promiseStrategy;
  17677. }
  17678. else if (async_1.ObservableWrapper.isObservable(obj)) {
  17679. return _observableStrategy;
  17680. }
  17681. else {
  17682. throw new invalid_pipe_argument_exception_1.InvalidPipeArgumentException(AsyncPipe, obj);
  17683. }
  17684. };
  17685. /** @internal */
  17686. AsyncPipe.prototype._dispose = function () {
  17687. this._strategy.dispose(this._subscription);
  17688. this._latestValue = null;
  17689. this._latestReturnedValue = null;
  17690. this._subscription = null;
  17691. this._obj = null;
  17692. };
  17693. /** @internal */
  17694. AsyncPipe.prototype._updateLatestValue = function (async, value) {
  17695. if (async === this._obj) {
  17696. this._latestValue = value;
  17697. this._ref.markForCheck();
  17698. }
  17699. };
  17700. AsyncPipe = __decorate([
  17701. core_1.Pipe({ name: 'async', pure: false }),
  17702. core_1.Injectable(),
  17703. __metadata('design:paramtypes', [core_1.ChangeDetectorRef])
  17704. ], AsyncPipe);
  17705. return AsyncPipe;
  17706. })();
  17707. exports.AsyncPipe = AsyncPipe;
  17708. /***/ },
  17709. /* 107 */
  17710. /***/ function(module, exports, __webpack_require__) {
  17711. var __extends = (this && this.__extends) || function (d, b) {
  17712. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  17713. function __() { this.constructor = d; }
  17714. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  17715. };
  17716. var lang_1 = __webpack_require__(5);
  17717. var exceptions_1 = __webpack_require__(14);
  17718. var InvalidPipeArgumentException = (function (_super) {
  17719. __extends(InvalidPipeArgumentException, _super);
  17720. function InvalidPipeArgumentException(type, value) {
  17721. _super.call(this, "Invalid argument '" + value + "' for pipe '" + lang_1.stringify(type) + "'");
  17722. }
  17723. return InvalidPipeArgumentException;
  17724. })(exceptions_1.BaseException);
  17725. exports.InvalidPipeArgumentException = InvalidPipeArgumentException;
  17726. /***/ },
  17727. /* 108 */
  17728. /***/ function(module, exports, __webpack_require__) {
  17729. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  17730. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  17731. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  17732. 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;
  17733. return c > 3 && r && Object.defineProperty(target, key, r), r;
  17734. };
  17735. var __metadata = (this && this.__metadata) || function (k, v) {
  17736. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  17737. };
  17738. var lang_1 = __webpack_require__(5);
  17739. var core_1 = __webpack_require__(2);
  17740. var invalid_pipe_argument_exception_1 = __webpack_require__(107);
  17741. /**
  17742. * Implements uppercase transforms to text.
  17743. *
  17744. * ### Example
  17745. *
  17746. * {@example core/pipes/ts/lowerupper_pipe/lowerupper_pipe_example.ts region='LowerUpperPipe'}
  17747. */
  17748. var UpperCasePipe = (function () {
  17749. function UpperCasePipe() {
  17750. }
  17751. UpperCasePipe.prototype.transform = function (value, args) {
  17752. if (args === void 0) { args = null; }
  17753. if (lang_1.isBlank(value))
  17754. return value;
  17755. if (!lang_1.isString(value)) {
  17756. throw new invalid_pipe_argument_exception_1.InvalidPipeArgumentException(UpperCasePipe, value);
  17757. }
  17758. return value.toUpperCase();
  17759. };
  17760. UpperCasePipe = __decorate([
  17761. lang_1.CONST(),
  17762. core_1.Pipe({ name: 'uppercase' }),
  17763. core_1.Injectable(),
  17764. __metadata('design:paramtypes', [])
  17765. ], UpperCasePipe);
  17766. return UpperCasePipe;
  17767. })();
  17768. exports.UpperCasePipe = UpperCasePipe;
  17769. /***/ },
  17770. /* 109 */
  17771. /***/ function(module, exports, __webpack_require__) {
  17772. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  17773. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  17774. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  17775. 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;
  17776. return c > 3 && r && Object.defineProperty(target, key, r), r;
  17777. };
  17778. var __metadata = (this && this.__metadata) || function (k, v) {
  17779. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  17780. };
  17781. var lang_1 = __webpack_require__(5);
  17782. var core_1 = __webpack_require__(2);
  17783. var invalid_pipe_argument_exception_1 = __webpack_require__(107);
  17784. /**
  17785. * Transforms text to lowercase.
  17786. *
  17787. * ### Example
  17788. *
  17789. * {@example core/pipes/ts/lowerupper_pipe/lowerupper_pipe_example.ts region='LowerUpperPipe'}
  17790. */
  17791. var LowerCasePipe = (function () {
  17792. function LowerCasePipe() {
  17793. }
  17794. LowerCasePipe.prototype.transform = function (value, args) {
  17795. if (args === void 0) { args = null; }
  17796. if (lang_1.isBlank(value))
  17797. return value;
  17798. if (!lang_1.isString(value)) {
  17799. throw new invalid_pipe_argument_exception_1.InvalidPipeArgumentException(LowerCasePipe, value);
  17800. }
  17801. return value.toLowerCase();
  17802. };
  17803. LowerCasePipe = __decorate([
  17804. lang_1.CONST(),
  17805. core_1.Pipe({ name: 'lowercase' }),
  17806. core_1.Injectable(),
  17807. __metadata('design:paramtypes', [])
  17808. ], LowerCasePipe);
  17809. return LowerCasePipe;
  17810. })();
  17811. exports.LowerCasePipe = LowerCasePipe;
  17812. /***/ },
  17813. /* 110 */
  17814. /***/ function(module, exports, __webpack_require__) {
  17815. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  17816. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  17817. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  17818. 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;
  17819. return c > 3 && r && Object.defineProperty(target, key, r), r;
  17820. };
  17821. var __metadata = (this && this.__metadata) || function (k, v) {
  17822. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  17823. };
  17824. var lang_1 = __webpack_require__(5);
  17825. var core_1 = __webpack_require__(2);
  17826. /**
  17827. * Transforms any input value using `JSON.stringify`. Useful for debugging.
  17828. *
  17829. * ### Example
  17830. * {@example core/pipes/ts/json_pipe/json_pipe_example.ts region='JsonPipe'}
  17831. */
  17832. var JsonPipe = (function () {
  17833. function JsonPipe() {
  17834. }
  17835. JsonPipe.prototype.transform = function (value, args) {
  17836. if (args === void 0) { args = null; }
  17837. return lang_1.Json.stringify(value);
  17838. };
  17839. JsonPipe = __decorate([
  17840. lang_1.CONST(),
  17841. core_1.Pipe({ name: 'json', pure: false }),
  17842. core_1.Injectable(),
  17843. __metadata('design:paramtypes', [])
  17844. ], JsonPipe);
  17845. return JsonPipe;
  17846. })();
  17847. exports.JsonPipe = JsonPipe;
  17848. /***/ },
  17849. /* 111 */
  17850. /***/ function(module, exports, __webpack_require__) {
  17851. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  17852. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  17853. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  17854. 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;
  17855. return c > 3 && r && Object.defineProperty(target, key, r), r;
  17856. };
  17857. var __metadata = (this && this.__metadata) || function (k, v) {
  17858. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  17859. };
  17860. var lang_1 = __webpack_require__(5);
  17861. var exceptions_1 = __webpack_require__(14);
  17862. var collection_1 = __webpack_require__(12);
  17863. var core_1 = __webpack_require__(2);
  17864. var invalid_pipe_argument_exception_1 = __webpack_require__(107);
  17865. /**
  17866. * Creates a new List or String containing only a subset (slice) of the
  17867. * elements.
  17868. *
  17869. * The starting index of the subset to return is specified by the `start` parameter.
  17870. *
  17871. * The ending index of the subset to return is specified by the optional `end` parameter.
  17872. *
  17873. * ### Usage
  17874. *
  17875. * expression | slice:start[:end]
  17876. *
  17877. * All behavior is based on the expected behavior of the JavaScript API
  17878. * Array.prototype.slice() and String.prototype.slice()
  17879. *
  17880. * Where the input expression is a [List] or [String], and `start` is:
  17881. *
  17882. * - **a positive integer**: return the item at _start_ index and all items after
  17883. * in the list or string expression.
  17884. * - **a negative integer**: return the item at _start_ index from the end and all items after
  17885. * in the list or string expression.
  17886. * - **`|start|` greater than the size of the expression**: return an empty list or string.
  17887. * - **`|start|` negative greater than the size of the expression**: return entire list or
  17888. * string expression.
  17889. *
  17890. * and where `end` is:
  17891. *
  17892. * - **omitted**: return all items until the end of the input
  17893. * - **a positive integer**: return all items before _end_ index of the list or string
  17894. * expression.
  17895. * - **a negative integer**: return all items before _end_ index from the end of the list
  17896. * or string expression.
  17897. *
  17898. * When operating on a [List], the returned list is always a copy even when all
  17899. * the elements are being returned.
  17900. *
  17901. * ## List Example
  17902. *
  17903. * This `ngFor` example:
  17904. *
  17905. * {@example core/pipes/ts/slice_pipe/slice_pipe_example.ts region='SlicePipe_list'}
  17906. *
  17907. * produces the following:
  17908. *
  17909. * <li>b</li>
  17910. * <li>c</li>
  17911. *
  17912. * ## String Examples
  17913. *
  17914. * {@example core/pipes/ts/slice_pipe/slice_pipe_example.ts region='SlicePipe_string'}
  17915. */
  17916. var SlicePipe = (function () {
  17917. function SlicePipe() {
  17918. }
  17919. SlicePipe.prototype.transform = function (value, args) {
  17920. if (args === void 0) { args = null; }
  17921. if (lang_1.isBlank(args) || args.length == 0) {
  17922. throw new exceptions_1.BaseException('Slice pipe requires one argument');
  17923. }
  17924. if (!this.supports(value)) {
  17925. throw new invalid_pipe_argument_exception_1.InvalidPipeArgumentException(SlicePipe, value);
  17926. }
  17927. if (lang_1.isBlank(value))
  17928. return value;
  17929. var start = args[0];
  17930. var end = args.length > 1 ? args[1] : null;
  17931. if (lang_1.isString(value)) {
  17932. return lang_1.StringWrapper.slice(value, start, end);
  17933. }
  17934. return collection_1.ListWrapper.slice(value, start, end);
  17935. };
  17936. SlicePipe.prototype.supports = function (obj) { return lang_1.isString(obj) || lang_1.isArray(obj); };
  17937. SlicePipe = __decorate([
  17938. core_1.Pipe({ name: 'slice', pure: false }),
  17939. core_1.Injectable(),
  17940. __metadata('design:paramtypes', [])
  17941. ], SlicePipe);
  17942. return SlicePipe;
  17943. })();
  17944. exports.SlicePipe = SlicePipe;
  17945. /***/ },
  17946. /* 112 */
  17947. /***/ function(module, exports, __webpack_require__) {
  17948. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  17949. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  17950. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  17951. 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;
  17952. return c > 3 && r && Object.defineProperty(target, key, r), r;
  17953. };
  17954. var __metadata = (this && this.__metadata) || function (k, v) {
  17955. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  17956. };
  17957. var lang_1 = __webpack_require__(5);
  17958. var intl_1 = __webpack_require__(113);
  17959. var core_1 = __webpack_require__(2);
  17960. var collection_1 = __webpack_require__(12);
  17961. var invalid_pipe_argument_exception_1 = __webpack_require__(107);
  17962. // TODO: move to a global configurable location along with other i18n components.
  17963. var defaultLocale = 'en-US';
  17964. /**
  17965. * Formats a date value to a string based on the requested format.
  17966. *
  17967. * WARNINGS:
  17968. * - this pipe is marked as pure hence it will not be re-evaluated when the input is mutated.
  17969. * Instead users should treat the date as an immutable object and change the reference when the
  17970. * pipe needs to re-run (this is to avoid reformatting the date on every change detection run
  17971. * which would be an expensive operation).
  17972. * - this pipe uses the Internationalization API. Therefore it is only reliable in Chrome and Opera
  17973. * browsers.
  17974. *
  17975. * ## Usage
  17976. *
  17977. * expression | date[:format]
  17978. *
  17979. * where `expression` is a date object or a number (milliseconds since UTC epoch) and
  17980. * `format` indicates which date/time components to include:
  17981. *
  17982. * | Component | Symbol | Short Form | Long Form | Numeric | 2-digit |
  17983. * |-----------|:------:|--------------|-------------------|-----------|-----------|
  17984. * | era | G | G (AD) | GGGG (Anno Domini)| - | - |
  17985. * | year | y | - | - | y (2015) | yy (15) |
  17986. * | month | M | MMM (Sep) | MMMM (September) | M (9) | MM (09) |
  17987. * | day | d | - | - | d (3) | dd (03) |
  17988. * | weekday | E | EEE (Sun) | EEEE (Sunday) | - | - |
  17989. * | hour | j | - | - | j (13) | jj (13) |
  17990. * | hour12 | h | - | - | h (1 PM) | hh (01 PM)|
  17991. * | hour24 | H | - | - | H (13) | HH (13) |
  17992. * | minute | m | - | - | m (5) | mm (05) |
  17993. * | second | s | - | - | s (9) | ss (09) |
  17994. * | timezone | z | - | z (Pacific Standard Time)| - | - |
  17995. * | timezone | Z | Z (GMT-8:00) | - | - | - |
  17996. *
  17997. * In javascript, only the components specified will be respected (not the ordering,
  17998. * punctuations, ...) and details of the formatting will be dependent on the locale.
  17999. * On the other hand in Dart version, you can also include quoted text as well as some extra
  18000. * date/time components such as quarter. For more information see:
  18001. * https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/intl/intl.DateFormat.
  18002. *
  18003. * `format` can also be one of the following predefined formats:
  18004. *
  18005. * - `'medium'`: equivalent to `'yMMMdjms'` (e.g. Sep 3, 2010, 12:05:08 PM for en-US)
  18006. * - `'short'`: equivalent to `'yMdjm'` (e.g. 9/3/2010, 12:05 PM for en-US)
  18007. * - `'fullDate'`: equivalent to `'yMMMMEEEEd'` (e.g. Friday, September 3, 2010 for en-US)
  18008. * - `'longDate'`: equivalent to `'yMMMMd'` (e.g. September 3, 2010)
  18009. * - `'mediumDate'`: equivalent to `'yMMMd'` (e.g. Sep 3, 2010 for en-US)
  18010. * - `'shortDate'`: equivalent to `'yMd'` (e.g. 9/3/2010 for en-US)
  18011. * - `'mediumTime'`: equivalent to `'jms'` (e.g. 12:05:08 PM for en-US)
  18012. * - `'shortTime'`: equivalent to `'jm'` (e.g. 12:05 PM for en-US)
  18013. *
  18014. * Timezone of the formatted text will be the local system timezone of the end-users machine.
  18015. *
  18016. * ### Examples
  18017. *
  18018. * Assuming `dateObj` is (year: 2015, month: 6, day: 15, hour: 21, minute: 43, second: 11)
  18019. * in the _local_ time and locale is 'en-US':
  18020. *
  18021. * ```
  18022. * {{ dateObj | date }} // output is 'Jun 15, 2015'
  18023. * {{ dateObj | date:'medium' }} // output is 'Jun 15, 2015, 9:43:11 PM'
  18024. * {{ dateObj | date:'shortTime' }} // output is '9:43 PM'
  18025. * {{ dateObj | date:'mmss' }} // output is '43:11'
  18026. * ```
  18027. *
  18028. * {@example core/pipes/ts/date_pipe/date_pipe_example.ts region='DatePipe'}
  18029. */
  18030. var DatePipe = (function () {
  18031. function DatePipe() {
  18032. }
  18033. DatePipe.prototype.transform = function (value, args) {
  18034. if (lang_1.isBlank(value))
  18035. return null;
  18036. if (!this.supports(value)) {
  18037. throw new invalid_pipe_argument_exception_1.InvalidPipeArgumentException(DatePipe, value);
  18038. }
  18039. var pattern = lang_1.isPresent(args) && args.length > 0 ? args[0] : 'mediumDate';
  18040. if (lang_1.isNumber(value)) {
  18041. value = lang_1.DateWrapper.fromMillis(value);
  18042. }
  18043. if (collection_1.StringMapWrapper.contains(DatePipe._ALIASES, pattern)) {
  18044. pattern = collection_1.StringMapWrapper.get(DatePipe._ALIASES, pattern);
  18045. }
  18046. return intl_1.DateFormatter.format(value, defaultLocale, pattern);
  18047. };
  18048. DatePipe.prototype.supports = function (obj) { return lang_1.isDate(obj) || lang_1.isNumber(obj); };
  18049. /** @internal */
  18050. DatePipe._ALIASES = {
  18051. 'medium': 'yMMMdjms',
  18052. 'short': 'yMdjm',
  18053. 'fullDate': 'yMMMMEEEEd',
  18054. 'longDate': 'yMMMMd',
  18055. 'mediumDate': 'yMMMd',
  18056. 'shortDate': 'yMd',
  18057. 'mediumTime': 'jms',
  18058. 'shortTime': 'jm'
  18059. };
  18060. DatePipe = __decorate([
  18061. lang_1.CONST(),
  18062. core_1.Pipe({ name: 'date', pure: true }),
  18063. core_1.Injectable(),
  18064. __metadata('design:paramtypes', [])
  18065. ], DatePipe);
  18066. return DatePipe;
  18067. })();
  18068. exports.DatePipe = DatePipe;
  18069. /***/ },
  18070. /* 113 */
  18071. /***/ function(module, exports) {
  18072. (function (NumberFormatStyle) {
  18073. NumberFormatStyle[NumberFormatStyle["Decimal"] = 0] = "Decimal";
  18074. NumberFormatStyle[NumberFormatStyle["Percent"] = 1] = "Percent";
  18075. NumberFormatStyle[NumberFormatStyle["Currency"] = 2] = "Currency";
  18076. })(exports.NumberFormatStyle || (exports.NumberFormatStyle = {}));
  18077. var NumberFormatStyle = exports.NumberFormatStyle;
  18078. var NumberFormatter = (function () {
  18079. function NumberFormatter() {
  18080. }
  18081. NumberFormatter.format = function (num, locale, style, _a) {
  18082. 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;
  18083. var intlOptions = {
  18084. minimumIntegerDigits: minimumIntegerDigits,
  18085. minimumFractionDigits: minimumFractionDigits,
  18086. maximumFractionDigits: maximumFractionDigits
  18087. };
  18088. intlOptions.style = NumberFormatStyle[style].toLowerCase();
  18089. if (style == NumberFormatStyle.Currency) {
  18090. intlOptions.currency = currency;
  18091. intlOptions.currencyDisplay = currencyAsSymbol ? 'symbol' : 'code';
  18092. }
  18093. return new Intl.NumberFormat(locale, intlOptions).format(num);
  18094. };
  18095. return NumberFormatter;
  18096. })();
  18097. exports.NumberFormatter = NumberFormatter;
  18098. function digitCondition(len) {
  18099. return len == 2 ? '2-digit' : 'numeric';
  18100. }
  18101. function nameCondition(len) {
  18102. return len < 4 ? 'short' : 'long';
  18103. }
  18104. function extractComponents(pattern) {
  18105. var ret = {};
  18106. var i = 0, j;
  18107. while (i < pattern.length) {
  18108. j = i;
  18109. while (j < pattern.length && pattern[j] == pattern[i])
  18110. j++;
  18111. var len = j - i;
  18112. switch (pattern[i]) {
  18113. case 'G':
  18114. ret.era = nameCondition(len);
  18115. break;
  18116. case 'y':
  18117. ret.year = digitCondition(len);
  18118. break;
  18119. case 'M':
  18120. if (len >= 3)
  18121. ret.month = nameCondition(len);
  18122. else
  18123. ret.month = digitCondition(len);
  18124. break;
  18125. case 'd':
  18126. ret.day = digitCondition(len);
  18127. break;
  18128. case 'E':
  18129. ret.weekday = nameCondition(len);
  18130. break;
  18131. case 'j':
  18132. ret.hour = digitCondition(len);
  18133. break;
  18134. case 'h':
  18135. ret.hour = digitCondition(len);
  18136. ret.hour12 = true;
  18137. break;
  18138. case 'H':
  18139. ret.hour = digitCondition(len);
  18140. ret.hour12 = false;
  18141. break;
  18142. case 'm':
  18143. ret.minute = digitCondition(len);
  18144. break;
  18145. case 's':
  18146. ret.second = digitCondition(len);
  18147. break;
  18148. case 'z':
  18149. ret.timeZoneName = 'long';
  18150. break;
  18151. case 'Z':
  18152. ret.timeZoneName = 'short';
  18153. break;
  18154. }
  18155. i = j;
  18156. }
  18157. return ret;
  18158. }
  18159. var dateFormatterCache = new Map();
  18160. var DateFormatter = (function () {
  18161. function DateFormatter() {
  18162. }
  18163. DateFormatter.format = function (date, locale, pattern) {
  18164. var key = locale + pattern;
  18165. if (dateFormatterCache.has(key)) {
  18166. return dateFormatterCache.get(key).format(date);
  18167. }
  18168. var formatter = new Intl.DateTimeFormat(locale, extractComponents(pattern));
  18169. dateFormatterCache.set(key, formatter);
  18170. return formatter.format(date);
  18171. };
  18172. return DateFormatter;
  18173. })();
  18174. exports.DateFormatter = DateFormatter;
  18175. /***/ },
  18176. /* 114 */
  18177. /***/ function(module, exports, __webpack_require__) {
  18178. var __extends = (this && this.__extends) || function (d, b) {
  18179. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  18180. function __() { this.constructor = d; }
  18181. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  18182. };
  18183. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  18184. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  18185. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  18186. 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;
  18187. return c > 3 && r && Object.defineProperty(target, key, r), r;
  18188. };
  18189. var __metadata = (this && this.__metadata) || function (k, v) {
  18190. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  18191. };
  18192. var lang_1 = __webpack_require__(5);
  18193. var exceptions_1 = __webpack_require__(14);
  18194. var intl_1 = __webpack_require__(113);
  18195. var core_1 = __webpack_require__(2);
  18196. var collection_1 = __webpack_require__(12);
  18197. var invalid_pipe_argument_exception_1 = __webpack_require__(107);
  18198. var defaultLocale = 'en-US';
  18199. var _re = lang_1.RegExpWrapper.create('^(\\d+)?\\.((\\d+)(\\-(\\d+))?)?$');
  18200. /**
  18201. * Internal base class for numeric pipes.
  18202. */
  18203. var NumberPipe = (function () {
  18204. function NumberPipe() {
  18205. }
  18206. /** @internal */
  18207. NumberPipe._format = function (value, style, digits, currency, currencyAsSymbol) {
  18208. if (currency === void 0) { currency = null; }
  18209. if (currencyAsSymbol === void 0) { currencyAsSymbol = false; }
  18210. if (lang_1.isBlank(value))
  18211. return null;
  18212. if (!lang_1.isNumber(value)) {
  18213. throw new invalid_pipe_argument_exception_1.InvalidPipeArgumentException(NumberPipe, value);
  18214. }
  18215. var minInt = 1, minFraction = 0, maxFraction = 3;
  18216. if (lang_1.isPresent(digits)) {
  18217. var parts = lang_1.RegExpWrapper.firstMatch(_re, digits);
  18218. if (lang_1.isBlank(parts)) {
  18219. throw new exceptions_1.BaseException(digits + " is not a valid digit info for number pipes");
  18220. }
  18221. if (lang_1.isPresent(parts[1])) {
  18222. minInt = lang_1.NumberWrapper.parseIntAutoRadix(parts[1]);
  18223. }
  18224. if (lang_1.isPresent(parts[3])) {
  18225. minFraction = lang_1.NumberWrapper.parseIntAutoRadix(parts[3]);
  18226. }
  18227. if (lang_1.isPresent(parts[5])) {
  18228. maxFraction = lang_1.NumberWrapper.parseIntAutoRadix(parts[5]);
  18229. }
  18230. }
  18231. return intl_1.NumberFormatter.format(value, defaultLocale, style, {
  18232. minimumIntegerDigits: minInt,
  18233. minimumFractionDigits: minFraction,
  18234. maximumFractionDigits: maxFraction,
  18235. currency: currency,
  18236. currencyAsSymbol: currencyAsSymbol
  18237. });
  18238. };
  18239. NumberPipe = __decorate([
  18240. lang_1.CONST(),
  18241. core_1.Injectable(),
  18242. __metadata('design:paramtypes', [])
  18243. ], NumberPipe);
  18244. return NumberPipe;
  18245. })();
  18246. exports.NumberPipe = NumberPipe;
  18247. /**
  18248. * WARNING: this pipe uses the Internationalization API.
  18249. * Therefore it is only reliable in Chrome and Opera browsers.
  18250. *
  18251. * Formats a number as local text. i.e. group sizing and separator and other locale-specific
  18252. * configurations are based on the active locale.
  18253. *
  18254. * ### Usage
  18255. *
  18256. * expression | number[:digitInfo]
  18257. *
  18258. * where `expression` is a number and `digitInfo` has the following format:
  18259. *
  18260. * {minIntegerDigits}.{minFractionDigits}-{maxFractionDigits}
  18261. *
  18262. * - minIntegerDigits is the minimum number of integer digits to use. Defaults to 1.
  18263. * - minFractionDigits is the minimum number of digits after fraction. Defaults to 0.
  18264. * - maxFractionDigits is the maximum number of digits after fraction. Defaults to 3.
  18265. *
  18266. * For more information on the acceptable range for each of these numbers and other
  18267. * details see your native internationalization library.
  18268. *
  18269. * ### Example
  18270. *
  18271. * {@example core/pipes/ts/number_pipe/number_pipe_example.ts region='NumberPipe'}
  18272. */
  18273. var DecimalPipe = (function (_super) {
  18274. __extends(DecimalPipe, _super);
  18275. function DecimalPipe() {
  18276. _super.apply(this, arguments);
  18277. }
  18278. DecimalPipe.prototype.transform = function (value, args) {
  18279. var digits = collection_1.ListWrapper.first(args);
  18280. return NumberPipe._format(value, intl_1.NumberFormatStyle.Decimal, digits);
  18281. };
  18282. DecimalPipe = __decorate([
  18283. lang_1.CONST(),
  18284. core_1.Pipe({ name: 'number' }),
  18285. core_1.Injectable(),
  18286. __metadata('design:paramtypes', [])
  18287. ], DecimalPipe);
  18288. return DecimalPipe;
  18289. })(NumberPipe);
  18290. exports.DecimalPipe = DecimalPipe;
  18291. /**
  18292. * WARNING: this pipe uses the Internationalization API.
  18293. * Therefore it is only reliable in Chrome and Opera browsers.
  18294. *
  18295. * Formats a number as local percent.
  18296. *
  18297. * ### Usage
  18298. *
  18299. * expression | percent[:digitInfo]
  18300. *
  18301. * For more information about `digitInfo` see {@link DecimalPipe}
  18302. *
  18303. * ### Example
  18304. *
  18305. * {@example core/pipes/ts/number_pipe/number_pipe_example.ts region='PercentPipe'}
  18306. */
  18307. var PercentPipe = (function (_super) {
  18308. __extends(PercentPipe, _super);
  18309. function PercentPipe() {
  18310. _super.apply(this, arguments);
  18311. }
  18312. PercentPipe.prototype.transform = function (value, args) {
  18313. var digits = collection_1.ListWrapper.first(args);
  18314. return NumberPipe._format(value, intl_1.NumberFormatStyle.Percent, digits);
  18315. };
  18316. PercentPipe = __decorate([
  18317. lang_1.CONST(),
  18318. core_1.Pipe({ name: 'percent' }),
  18319. core_1.Injectable(),
  18320. __metadata('design:paramtypes', [])
  18321. ], PercentPipe);
  18322. return PercentPipe;
  18323. })(NumberPipe);
  18324. exports.PercentPipe = PercentPipe;
  18325. /**
  18326. * WARNING: this pipe uses the Internationalization API.
  18327. * Therefore it is only reliable in Chrome and Opera browsers.
  18328. *
  18329. * Formats a number as local currency.
  18330. *
  18331. * ### Usage
  18332. *
  18333. * expression | currency[:currencyCode[:symbolDisplay[:digitInfo]]]
  18334. *
  18335. * where `currencyCode` is the ISO 4217 currency code, such as "USD" for the US dollar and
  18336. * "EUR" for the euro. `symbolDisplay` is a boolean indicating whether to use the currency
  18337. * symbol (e.g. $) or the currency code (e.g. USD) in the output. The default for this value
  18338. * is `false`.
  18339. * For more information about `digitInfo` see {@link DecimalPipe}
  18340. *
  18341. * ### Example
  18342. *
  18343. * {@example core/pipes/ts/number_pipe/number_pipe_example.ts region='CurrencyPipe'}
  18344. */
  18345. var CurrencyPipe = (function (_super) {
  18346. __extends(CurrencyPipe, _super);
  18347. function CurrencyPipe() {
  18348. _super.apply(this, arguments);
  18349. }
  18350. CurrencyPipe.prototype.transform = function (value, args) {
  18351. var currencyCode = lang_1.isPresent(args) && args.length > 0 ? args[0] : 'USD';
  18352. var symbolDisplay = lang_1.isPresent(args) && args.length > 1 ? args[1] : false;
  18353. var digits = lang_1.isPresent(args) && args.length > 2 ? args[2] : null;
  18354. return NumberPipe._format(value, intl_1.NumberFormatStyle.Currency, digits, currencyCode, symbolDisplay);
  18355. };
  18356. CurrencyPipe = __decorate([
  18357. lang_1.CONST(),
  18358. core_1.Pipe({ name: 'currency' }),
  18359. core_1.Injectable(),
  18360. __metadata('design:paramtypes', [])
  18361. ], CurrencyPipe);
  18362. return CurrencyPipe;
  18363. })(NumberPipe);
  18364. exports.CurrencyPipe = CurrencyPipe;
  18365. /***/ },
  18366. /* 115 */
  18367. /***/ function(module, exports, __webpack_require__) {
  18368. function __export(m) {
  18369. for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
  18370. }
  18371. /**
  18372. * @module
  18373. * @description
  18374. * Common directives shipped with Angular.
  18375. */
  18376. var ng_class_1 = __webpack_require__(116);
  18377. exports.NgClass = ng_class_1.NgClass;
  18378. var ng_for_1 = __webpack_require__(117);
  18379. exports.NgFor = ng_for_1.NgFor;
  18380. var ng_if_1 = __webpack_require__(118);
  18381. exports.NgIf = ng_if_1.NgIf;
  18382. var ng_style_1 = __webpack_require__(119);
  18383. exports.NgStyle = ng_style_1.NgStyle;
  18384. var ng_switch_1 = __webpack_require__(120);
  18385. exports.NgSwitch = ng_switch_1.NgSwitch;
  18386. exports.NgSwitchWhen = ng_switch_1.NgSwitchWhen;
  18387. exports.NgSwitchDefault = ng_switch_1.NgSwitchDefault;
  18388. __export(__webpack_require__(121));
  18389. var core_directives_1 = __webpack_require__(122);
  18390. exports.CORE_DIRECTIVES = core_directives_1.CORE_DIRECTIVES;
  18391. /***/ },
  18392. /* 116 */
  18393. /***/ function(module, exports, __webpack_require__) {
  18394. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  18395. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  18396. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  18397. 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;
  18398. return c > 3 && r && Object.defineProperty(target, key, r), r;
  18399. };
  18400. var __metadata = (this && this.__metadata) || function (k, v) {
  18401. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  18402. };
  18403. var lang_1 = __webpack_require__(5);
  18404. var core_1 = __webpack_require__(2);
  18405. var collection_1 = __webpack_require__(12);
  18406. /**
  18407. * The `NgClass` directive conditionally adds and removes CSS classes on an HTML element based on
  18408. * an expression's evaluation result.
  18409. *
  18410. * The result of an expression evaluation is interpreted differently depending on type of
  18411. * the expression evaluation result:
  18412. * - `string` - all the CSS classes listed in a string (space delimited) are added
  18413. * - `Array` - all the CSS classes (Array elements) are added
  18414. * - `Object` - each key corresponds to a CSS class name while values are interpreted as expressions
  18415. * evaluating to `Boolean`. If a given expression evaluates to `true` a corresponding CSS class
  18416. * is added - otherwise it is removed.
  18417. *
  18418. * While the `NgClass` directive can interpret expressions evaluating to `string`, `Array`
  18419. * or `Object`, the `Object`-based version is the most often used and has an advantage of keeping
  18420. * all the CSS class names in a template.
  18421. *
  18422. * ### Example ([live demo](http://plnkr.co/edit/a4YdtmWywhJ33uqfpPPn?p=preview)):
  18423. *
  18424. * ```
  18425. * import {Component} from 'angular2/core';
  18426. * import {NgClass} from 'angular2/common';
  18427. *
  18428. * @Component({
  18429. * selector: 'toggle-button',
  18430. * inputs: ['isDisabled'],
  18431. * template: `
  18432. * <div class="button" [ngClass]="{active: isOn, disabled: isDisabled}"
  18433. * (click)="toggle(!isOn)">
  18434. * Click me!
  18435. * </div>`,
  18436. * styles: [`
  18437. * .button {
  18438. * width: 120px;
  18439. * border: medium solid black;
  18440. * }
  18441. *
  18442. * .active {
  18443. * background-color: red;
  18444. * }
  18445. *
  18446. * .disabled {
  18447. * color: gray;
  18448. * border: medium solid gray;
  18449. * }
  18450. * `]
  18451. * directives: [NgClass]
  18452. * })
  18453. * class ToggleButton {
  18454. * isOn = false;
  18455. * isDisabled = false;
  18456. *
  18457. * toggle(newState) {
  18458. * if (!this.isDisabled) {
  18459. * this.isOn = newState;
  18460. * }
  18461. * }
  18462. * }
  18463. * ```
  18464. */
  18465. var NgClass = (function () {
  18466. function NgClass(_iterableDiffers, _keyValueDiffers, _ngEl, _renderer) {
  18467. this._iterableDiffers = _iterableDiffers;
  18468. this._keyValueDiffers = _keyValueDiffers;
  18469. this._ngEl = _ngEl;
  18470. this._renderer = _renderer;
  18471. this._initialClasses = [];
  18472. }
  18473. Object.defineProperty(NgClass.prototype, "initialClasses", {
  18474. set: function (v) {
  18475. this._applyInitialClasses(true);
  18476. this._initialClasses = lang_1.isPresent(v) && lang_1.isString(v) ? v.split(' ') : [];
  18477. this._applyInitialClasses(false);
  18478. this._applyClasses(this._rawClass, false);
  18479. },
  18480. enumerable: true,
  18481. configurable: true
  18482. });
  18483. Object.defineProperty(NgClass.prototype, "rawClass", {
  18484. set: function (v) {
  18485. this._cleanupClasses(this._rawClass);
  18486. if (lang_1.isString(v)) {
  18487. v = v.split(' ');
  18488. }
  18489. this._rawClass = v;
  18490. if (lang_1.isPresent(v)) {
  18491. if (collection_1.isListLikeIterable(v)) {
  18492. this._differ = this._iterableDiffers.find(v).create(null);
  18493. this._mode = 'iterable';
  18494. }
  18495. else {
  18496. this._differ = this._keyValueDiffers.find(v).create(null);
  18497. this._mode = 'keyValue';
  18498. }
  18499. }
  18500. else {
  18501. this._differ = null;
  18502. }
  18503. },
  18504. enumerable: true,
  18505. configurable: true
  18506. });
  18507. NgClass.prototype.ngDoCheck = function () {
  18508. if (lang_1.isPresent(this._differ)) {
  18509. var changes = this._differ.diff(this._rawClass);
  18510. if (lang_1.isPresent(changes)) {
  18511. if (this._mode == 'iterable') {
  18512. this._applyIterableChanges(changes);
  18513. }
  18514. else {
  18515. this._applyKeyValueChanges(changes);
  18516. }
  18517. }
  18518. }
  18519. };
  18520. NgClass.prototype.ngOnDestroy = function () { this._cleanupClasses(this._rawClass); };
  18521. NgClass.prototype._cleanupClasses = function (rawClassVal) {
  18522. this._applyClasses(rawClassVal, true);
  18523. this._applyInitialClasses(false);
  18524. };
  18525. NgClass.prototype._applyKeyValueChanges = function (changes) {
  18526. var _this = this;
  18527. changes.forEachAddedItem(function (record) { _this._toggleClass(record.key, record.currentValue); });
  18528. changes.forEachChangedItem(function (record) { _this._toggleClass(record.key, record.currentValue); });
  18529. changes.forEachRemovedItem(function (record) {
  18530. if (record.previousValue) {
  18531. _this._toggleClass(record.key, false);
  18532. }
  18533. });
  18534. };
  18535. NgClass.prototype._applyIterableChanges = function (changes) {
  18536. var _this = this;
  18537. changes.forEachAddedItem(function (record) { _this._toggleClass(record.item, true); });
  18538. changes.forEachRemovedItem(function (record) { _this._toggleClass(record.item, false); });
  18539. };
  18540. NgClass.prototype._applyInitialClasses = function (isCleanup) {
  18541. var _this = this;
  18542. this._initialClasses.forEach(function (className) { return _this._toggleClass(className, !isCleanup); });
  18543. };
  18544. NgClass.prototype._applyClasses = function (rawClassVal, isCleanup) {
  18545. var _this = this;
  18546. if (lang_1.isPresent(rawClassVal)) {
  18547. if (lang_1.isArray(rawClassVal)) {
  18548. rawClassVal.forEach(function (className) { return _this._toggleClass(className, !isCleanup); });
  18549. }
  18550. else if (rawClassVal instanceof Set) {
  18551. rawClassVal.forEach(function (className) { return _this._toggleClass(className, !isCleanup); });
  18552. }
  18553. else {
  18554. collection_1.StringMapWrapper.forEach(rawClassVal, function (expVal, className) {
  18555. if (expVal)
  18556. _this._toggleClass(className, !isCleanup);
  18557. });
  18558. }
  18559. }
  18560. };
  18561. NgClass.prototype._toggleClass = function (className, enabled) {
  18562. className = className.trim();
  18563. if (className.length > 0) {
  18564. if (className.indexOf(' ') > -1) {
  18565. var classes = className.split(/\s+/g);
  18566. for (var i = 0, len = classes.length; i < len; i++) {
  18567. this._renderer.setElementClass(this._ngEl, classes[i], enabled);
  18568. }
  18569. }
  18570. else {
  18571. this._renderer.setElementClass(this._ngEl, className, enabled);
  18572. }
  18573. }
  18574. };
  18575. NgClass = __decorate([
  18576. core_1.Directive({ selector: '[ngClass]', inputs: ['rawClass: ngClass', 'initialClasses: class'] }),
  18577. __metadata('design:paramtypes', [core_1.IterableDiffers, core_1.KeyValueDiffers, core_1.ElementRef, core_1.Renderer])
  18578. ], NgClass);
  18579. return NgClass;
  18580. })();
  18581. exports.NgClass = NgClass;
  18582. /***/ },
  18583. /* 117 */
  18584. /***/ function(module, exports, __webpack_require__) {
  18585. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  18586. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  18587. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  18588. 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;
  18589. return c > 3 && r && Object.defineProperty(target, key, r), r;
  18590. };
  18591. var __metadata = (this && this.__metadata) || function (k, v) {
  18592. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  18593. };
  18594. var core_1 = __webpack_require__(2);
  18595. var lang_1 = __webpack_require__(5);
  18596. /**
  18597. * The `NgFor` directive instantiates a template once per item from an iterable. The context for
  18598. * each instantiated template inherits from the outer context with the given loop variable set
  18599. * to the current item from the iterable.
  18600. *
  18601. * # Local Variables
  18602. *
  18603. * `NgFor` provides several exported values that can be aliased to local variables:
  18604. *
  18605. * * `index` will be set to the current loop iteration for each template context.
  18606. * * `last` will be set to a boolean value indicating whether the item is the last one in the
  18607. * iteration.
  18608. * * `even` will be set to a boolean value indicating whether this item has an even index.
  18609. * * `odd` will be set to a boolean value indicating whether this item has an odd index.
  18610. *
  18611. * # Change Propagation
  18612. *
  18613. * When the contents of the iterator changes, `NgFor` makes the corresponding changes to the DOM:
  18614. *
  18615. * * When an item is added, a new instance of the template is added to the DOM.
  18616. * * When an item is removed, its template instance is removed from the DOM.
  18617. * * When items are reordered, their respective templates are reordered in the DOM.
  18618. * * Otherwise, the DOM element for that item will remain the same.
  18619. *
  18620. * Angular uses object identity to track insertions and deletions within the iterator and reproduce
  18621. * those changes in the DOM. This has important implications for animations and any stateful
  18622. * controls
  18623. * (such as `<input>` elements which accept user input) that are present. Inserted rows can be
  18624. * animated in, deleted rows can be animated out, and unchanged rows retain any unsaved state such
  18625. * as user input.
  18626. *
  18627. * It is possible for the identities of elements in the iterator to change while the data does not.
  18628. * This can happen, for example, if the iterator produced from an RPC to the server, and that
  18629. * RPC is re-run. Even if the data hasn't changed, the second response will produce objects with
  18630. * different identities, and Angular will tear down the entire DOM and rebuild it (as if all old
  18631. * elements were deleted and all new elements inserted). This is an expensive operation and should
  18632. * be avoided if possible.
  18633. *
  18634. * # Syntax
  18635. *
  18636. * - `<li *ngFor="#item of items; #i = index">...</li>`
  18637. * - `<li template="ngFor #item of items; #i = index">...</li>`
  18638. * - `<template ngFor #item [ngForOf]="items" #i="index"><li>...</li></template>`
  18639. *
  18640. * ### Example
  18641. *
  18642. * See a [live demo](http://plnkr.co/edit/KVuXxDp0qinGDyo307QW?p=preview) for a more detailed
  18643. * example.
  18644. */
  18645. var NgFor = (function () {
  18646. function NgFor(_viewContainer, _templateRef, _iterableDiffers, _cdr) {
  18647. this._viewContainer = _viewContainer;
  18648. this._templateRef = _templateRef;
  18649. this._iterableDiffers = _iterableDiffers;
  18650. this._cdr = _cdr;
  18651. }
  18652. Object.defineProperty(NgFor.prototype, "ngForOf", {
  18653. set: function (value) {
  18654. this._ngForOf = value;
  18655. if (lang_1.isBlank(this._differ) && lang_1.isPresent(value)) {
  18656. this._differ = this._iterableDiffers.find(value).create(this._cdr);
  18657. }
  18658. },
  18659. enumerable: true,
  18660. configurable: true
  18661. });
  18662. Object.defineProperty(NgFor.prototype, "ngForTemplate", {
  18663. set: function (value) {
  18664. if (lang_1.isPresent(value)) {
  18665. this._templateRef = value;
  18666. }
  18667. },
  18668. enumerable: true,
  18669. configurable: true
  18670. });
  18671. NgFor.prototype.ngDoCheck = function () {
  18672. if (lang_1.isPresent(this._differ)) {
  18673. var changes = this._differ.diff(this._ngForOf);
  18674. if (lang_1.isPresent(changes))
  18675. this._applyChanges(changes);
  18676. }
  18677. };
  18678. NgFor.prototype._applyChanges = function (changes) {
  18679. // TODO(rado): check if change detection can produce a change record that is
  18680. // easier to consume than current.
  18681. var recordViewTuples = [];
  18682. changes.forEachRemovedItem(function (removedRecord) {
  18683. return recordViewTuples.push(new RecordViewTuple(removedRecord, null));
  18684. });
  18685. changes.forEachMovedItem(function (movedRecord) {
  18686. return recordViewTuples.push(new RecordViewTuple(movedRecord, null));
  18687. });
  18688. var insertTuples = this._bulkRemove(recordViewTuples);
  18689. changes.forEachAddedItem(function (addedRecord) {
  18690. return insertTuples.push(new RecordViewTuple(addedRecord, null));
  18691. });
  18692. this._bulkInsert(insertTuples);
  18693. for (var i = 0; i < insertTuples.length; i++) {
  18694. this._perViewChange(insertTuples[i].view, insertTuples[i].record);
  18695. }
  18696. for (var i = 0, ilen = this._viewContainer.length; i < ilen; i++) {
  18697. this._viewContainer.get(i).setLocal('last', i === ilen - 1);
  18698. }
  18699. };
  18700. NgFor.prototype._perViewChange = function (view, record) {
  18701. view.setLocal('\$implicit', record.item);
  18702. view.setLocal('index', record.currentIndex);
  18703. view.setLocal('even', (record.currentIndex % 2 == 0));
  18704. view.setLocal('odd', (record.currentIndex % 2 == 1));
  18705. };
  18706. NgFor.prototype._bulkRemove = function (tuples) {
  18707. tuples.sort(function (a, b) { return a.record.previousIndex - b.record.previousIndex; });
  18708. var movedTuples = [];
  18709. for (var i = tuples.length - 1; i >= 0; i--) {
  18710. var tuple = tuples[i];
  18711. // separate moved views from removed views.
  18712. if (lang_1.isPresent(tuple.record.currentIndex)) {
  18713. tuple.view = this._viewContainer.detach(tuple.record.previousIndex);
  18714. movedTuples.push(tuple);
  18715. }
  18716. else {
  18717. this._viewContainer.remove(tuple.record.previousIndex);
  18718. }
  18719. }
  18720. return movedTuples;
  18721. };
  18722. NgFor.prototype._bulkInsert = function (tuples) {
  18723. tuples.sort(function (a, b) { return a.record.currentIndex - b.record.currentIndex; });
  18724. for (var i = 0; i < tuples.length; i++) {
  18725. var tuple = tuples[i];
  18726. if (lang_1.isPresent(tuple.view)) {
  18727. this._viewContainer.insert(tuple.view, tuple.record.currentIndex);
  18728. }
  18729. else {
  18730. tuple.view =
  18731. this._viewContainer.createEmbeddedView(this._templateRef, tuple.record.currentIndex);
  18732. }
  18733. }
  18734. return tuples;
  18735. };
  18736. NgFor = __decorate([
  18737. core_1.Directive({ selector: '[ngFor][ngForOf]', inputs: ['ngForOf', 'ngForTemplate'] }),
  18738. __metadata('design:paramtypes', [core_1.ViewContainerRef, core_1.TemplateRef, core_1.IterableDiffers, core_1.ChangeDetectorRef])
  18739. ], NgFor);
  18740. return NgFor;
  18741. })();
  18742. exports.NgFor = NgFor;
  18743. var RecordViewTuple = (function () {
  18744. function RecordViewTuple(record, view) {
  18745. this.record = record;
  18746. this.view = view;
  18747. }
  18748. return RecordViewTuple;
  18749. })();
  18750. /***/ },
  18751. /* 118 */
  18752. /***/ function(module, exports, __webpack_require__) {
  18753. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  18754. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  18755. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  18756. 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;
  18757. return c > 3 && r && Object.defineProperty(target, key, r), r;
  18758. };
  18759. var __metadata = (this && this.__metadata) || function (k, v) {
  18760. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  18761. };
  18762. var core_1 = __webpack_require__(2);
  18763. var lang_1 = __webpack_require__(5);
  18764. /**
  18765. * Removes or recreates a portion of the DOM tree based on an {expression}.
  18766. *
  18767. * If the expression assigned to `ngIf` evaluates to a false value then the element
  18768. * is removed from the DOM, otherwise a clone of the element is reinserted into the DOM.
  18769. *
  18770. * ### Example ([live demo](http://plnkr.co/edit/fe0kgemFBtmQOY31b4tw?p=preview)):
  18771. *
  18772. * ```
  18773. * <div *ngIf="errorCount > 0" class="error">
  18774. * <!-- Error message displayed when the errorCount property on the current context is greater
  18775. * than 0. -->
  18776. * {{errorCount}} errors detected
  18777. * </div>
  18778. * ```
  18779. *
  18780. * ### Syntax
  18781. *
  18782. * - `<div *ngIf="condition">...</div>`
  18783. * - `<div template="ngIf condition">...</div>`
  18784. * - `<template [ngIf]="condition"><div>...</div></template>`
  18785. */
  18786. var NgIf = (function () {
  18787. function NgIf(_viewContainer, _templateRef) {
  18788. this._viewContainer = _viewContainer;
  18789. this._templateRef = _templateRef;
  18790. this._prevCondition = null;
  18791. }
  18792. Object.defineProperty(NgIf.prototype, "ngIf", {
  18793. set: function (newCondition /* boolean */) {
  18794. if (newCondition && (lang_1.isBlank(this._prevCondition) || !this._prevCondition)) {
  18795. this._prevCondition = true;
  18796. this._viewContainer.createEmbeddedView(this._templateRef);
  18797. }
  18798. else if (!newCondition && (lang_1.isBlank(this._prevCondition) || this._prevCondition)) {
  18799. this._prevCondition = false;
  18800. this._viewContainer.clear();
  18801. }
  18802. },
  18803. enumerable: true,
  18804. configurable: true
  18805. });
  18806. NgIf = __decorate([
  18807. core_1.Directive({ selector: '[ngIf]', inputs: ['ngIf'] }),
  18808. __metadata('design:paramtypes', [core_1.ViewContainerRef, core_1.TemplateRef])
  18809. ], NgIf);
  18810. return NgIf;
  18811. })();
  18812. exports.NgIf = NgIf;
  18813. /***/ },
  18814. /* 119 */
  18815. /***/ function(module, exports, __webpack_require__) {
  18816. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  18817. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  18818. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  18819. 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;
  18820. return c > 3 && r && Object.defineProperty(target, key, r), r;
  18821. };
  18822. var __metadata = (this && this.__metadata) || function (k, v) {
  18823. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  18824. };
  18825. var core_1 = __webpack_require__(2);
  18826. var lang_1 = __webpack_require__(5);
  18827. /**
  18828. * The `NgStyle` directive changes styles based on a result of expression evaluation.
  18829. *
  18830. * An expression assigned to the `ngStyle` property must evaluate to an object and the
  18831. * corresponding element styles are updated based on changes to this object. Style names to update
  18832. * are taken from the object's keys, and values - from the corresponding object's values.
  18833. *
  18834. * ### Syntax
  18835. *
  18836. * - `<div [ngStyle]="{'font-style': style}"></div>`
  18837. * - `<div [ngStyle]="styleExp"></div>` - here the `styleExp` must evaluate to an object
  18838. *
  18839. * ### Example ([live demo](http://plnkr.co/edit/YamGS6GkUh9GqWNQhCyM?p=preview)):
  18840. *
  18841. * ```
  18842. * import {Component} from 'angular2/core';
  18843. * import {NgStyle} from 'angular2/common';
  18844. *
  18845. * @Component({
  18846. * selector: 'ngStyle-example',
  18847. * template: `
  18848. * <h1 [ngStyle]="{'font-style': style, 'font-size': size, 'font-weight': weight}">
  18849. * Change style of this text!
  18850. * </h1>
  18851. *
  18852. * <hr>
  18853. *
  18854. * <label>Italic: <input type="checkbox" (change)="changeStyle($event)"></label>
  18855. * <label>Bold: <input type="checkbox" (change)="changeWeight($event)"></label>
  18856. * <label>Size: <input type="text" [value]="size" (change)="size = $event.target.value"></label>
  18857. * `,
  18858. * directives: [NgStyle]
  18859. * })
  18860. * export class NgStyleExample {
  18861. * style = 'normal';
  18862. * weight = 'normal';
  18863. * size = '20px';
  18864. *
  18865. * changeStyle($event: any) {
  18866. * this.style = $event.target.checked ? 'italic' : 'normal';
  18867. * }
  18868. *
  18869. * changeWeight($event: any) {
  18870. * this.weight = $event.target.checked ? 'bold' : 'normal';
  18871. * }
  18872. * }
  18873. * ```
  18874. *
  18875. * In this example the `font-style`, `font-size` and `font-weight` styles will be updated
  18876. * based on the `style` property's value changes.
  18877. */
  18878. var NgStyle = (function () {
  18879. function NgStyle(_differs, _ngEl, _renderer) {
  18880. this._differs = _differs;
  18881. this._ngEl = _ngEl;
  18882. this._renderer = _renderer;
  18883. }
  18884. Object.defineProperty(NgStyle.prototype, "rawStyle", {
  18885. set: function (v) {
  18886. this._rawStyle = v;
  18887. if (lang_1.isBlank(this._differ) && lang_1.isPresent(v)) {
  18888. this._differ = this._differs.find(this._rawStyle).create(null);
  18889. }
  18890. },
  18891. enumerable: true,
  18892. configurable: true
  18893. });
  18894. NgStyle.prototype.ngDoCheck = function () {
  18895. if (lang_1.isPresent(this._differ)) {
  18896. var changes = this._differ.diff(this._rawStyle);
  18897. if (lang_1.isPresent(changes)) {
  18898. this._applyChanges(changes);
  18899. }
  18900. }
  18901. };
  18902. NgStyle.prototype._applyChanges = function (changes) {
  18903. var _this = this;
  18904. changes.forEachAddedItem(function (record) { _this._setStyle(record.key, record.currentValue); });
  18905. changes.forEachChangedItem(function (record) { _this._setStyle(record.key, record.currentValue); });
  18906. changes.forEachRemovedItem(function (record) { _this._setStyle(record.key, null); });
  18907. };
  18908. NgStyle.prototype._setStyle = function (name, val) {
  18909. this._renderer.setElementStyle(this._ngEl, name, val);
  18910. };
  18911. NgStyle = __decorate([
  18912. core_1.Directive({ selector: '[ngStyle]', inputs: ['rawStyle: ngStyle'] }),
  18913. __metadata('design:paramtypes', [core_1.KeyValueDiffers, core_1.ElementRef, core_1.Renderer])
  18914. ], NgStyle);
  18915. return NgStyle;
  18916. })();
  18917. exports.NgStyle = NgStyle;
  18918. /***/ },
  18919. /* 120 */
  18920. /***/ function(module, exports, __webpack_require__) {
  18921. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  18922. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  18923. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  18924. 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;
  18925. return c > 3 && r && Object.defineProperty(target, key, r), r;
  18926. };
  18927. var __metadata = (this && this.__metadata) || function (k, v) {
  18928. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  18929. };
  18930. var __param = (this && this.__param) || function (paramIndex, decorator) {
  18931. return function (target, key) { decorator(target, key, paramIndex); }
  18932. };
  18933. var core_1 = __webpack_require__(2);
  18934. var lang_1 = __webpack_require__(5);
  18935. var collection_1 = __webpack_require__(12);
  18936. var _WHEN_DEFAULT = lang_1.CONST_EXPR(new Object());
  18937. var SwitchView = (function () {
  18938. function SwitchView(_viewContainerRef, _templateRef) {
  18939. this._viewContainerRef = _viewContainerRef;
  18940. this._templateRef = _templateRef;
  18941. }
  18942. SwitchView.prototype.create = function () { this._viewContainerRef.createEmbeddedView(this._templateRef); };
  18943. SwitchView.prototype.destroy = function () { this._viewContainerRef.clear(); };
  18944. return SwitchView;
  18945. })();
  18946. /**
  18947. * Adds or removes DOM sub-trees when their match expressions match the switch expression.
  18948. *
  18949. * Elements within `NgSwitch` but without `NgSwitchWhen` or `NgSwitchDefault` directives will be
  18950. * preserved at the location as specified in the template.
  18951. *
  18952. * `NgSwitch` simply inserts nested elements based on which match expression matches the value
  18953. * obtained from the evaluated switch expression. In other words, you define a container element
  18954. * (where you place the directive with a switch expression on the
  18955. * **`[ngSwitch]="..."` attribute**), define any inner elements inside of the directive and
  18956. * place a `[ngSwitchWhen]` attribute per element.
  18957. *
  18958. * The `ngSwitchWhen` property is used to inform `NgSwitch` which element to display when the
  18959. * expression is evaluated. If a matching expression is not found via a `ngSwitchWhen` property
  18960. * then an element with the `ngSwitchDefault` attribute is displayed.
  18961. *
  18962. * ### Example ([live demo](http://plnkr.co/edit/DQMTII95CbuqWrl3lYAs?p=preview))
  18963. *
  18964. * ```typescript
  18965. * @Component({selector: 'app'})
  18966. * @View({
  18967. * template: `
  18968. * <p>Value = {{value}}</p>
  18969. * <button (click)="inc()">Increment</button>
  18970. *
  18971. * <div [ngSwitch]="value">
  18972. * <p *ngSwitchWhen="'init'">increment to start</p>
  18973. * <p *ngSwitchWhen="0">0, increment again</p>
  18974. * <p *ngSwitchWhen="1">1, increment again</p>
  18975. * <p *ngSwitchWhen="2">2, stop incrementing</p>
  18976. * <p *ngSwitchDefault>&gt; 2, STOP!</p>
  18977. * </div>
  18978. *
  18979. * <!-- alternate syntax -->
  18980. *
  18981. * <p [ngSwitch]="value">
  18982. * <template ngSwitchWhen="init">increment to start</template>
  18983. * <template [ngSwitchWhen]="0">0, increment again</template>
  18984. * <template [ngSwitchWhen]="1">1, increment again</template>
  18985. * <template [ngSwitchWhen]="2">2, stop incrementing</template>
  18986. * <template ngSwitchDefault>&gt; 2, STOP!</template>
  18987. * </p>
  18988. * `,
  18989. * directives: [NgSwitch, NgSwitchWhen, NgSwitchDefault]
  18990. * })
  18991. * export class App {
  18992. * value = 'init';
  18993. *
  18994. * inc() {
  18995. * this.value = this.value === 'init' ? 0 : this.value + 1;
  18996. * }
  18997. * }
  18998. *
  18999. * bootstrap(App).catch(err => console.error(err));
  19000. * ```
  19001. */
  19002. var NgSwitch = (function () {
  19003. function NgSwitch() {
  19004. this._useDefault = false;
  19005. this._valueViews = new collection_1.Map();
  19006. this._activeViews = [];
  19007. }
  19008. Object.defineProperty(NgSwitch.prototype, "ngSwitch", {
  19009. set: function (value) {
  19010. // Empty the currently active ViewContainers
  19011. this._emptyAllActiveViews();
  19012. // Add the ViewContainers matching the value (with a fallback to default)
  19013. this._useDefault = false;
  19014. var views = this._valueViews.get(value);
  19015. if (lang_1.isBlank(views)) {
  19016. this._useDefault = true;
  19017. views = lang_1.normalizeBlank(this._valueViews.get(_WHEN_DEFAULT));
  19018. }
  19019. this._activateViews(views);
  19020. this._switchValue = value;
  19021. },
  19022. enumerable: true,
  19023. configurable: true
  19024. });
  19025. /** @internal */
  19026. NgSwitch.prototype._onWhenValueChanged = function (oldWhen, newWhen, view) {
  19027. this._deregisterView(oldWhen, view);
  19028. this._registerView(newWhen, view);
  19029. if (oldWhen === this._switchValue) {
  19030. view.destroy();
  19031. collection_1.ListWrapper.remove(this._activeViews, view);
  19032. }
  19033. else if (newWhen === this._switchValue) {
  19034. if (this._useDefault) {
  19035. this._useDefault = false;
  19036. this._emptyAllActiveViews();
  19037. }
  19038. view.create();
  19039. this._activeViews.push(view);
  19040. }
  19041. // Switch to default when there is no more active ViewContainers
  19042. if (this._activeViews.length === 0 && !this._useDefault) {
  19043. this._useDefault = true;
  19044. this._activateViews(this._valueViews.get(_WHEN_DEFAULT));
  19045. }
  19046. };
  19047. /** @internal */
  19048. NgSwitch.prototype._emptyAllActiveViews = function () {
  19049. var activeContainers = this._activeViews;
  19050. for (var i = 0; i < activeContainers.length; i++) {
  19051. activeContainers[i].destroy();
  19052. }
  19053. this._activeViews = [];
  19054. };
  19055. /** @internal */
  19056. NgSwitch.prototype._activateViews = function (views) {
  19057. // TODO(vicb): assert(this._activeViews.length === 0);
  19058. if (lang_1.isPresent(views)) {
  19059. for (var i = 0; i < views.length; i++) {
  19060. views[i].create();
  19061. }
  19062. this._activeViews = views;
  19063. }
  19064. };
  19065. /** @internal */
  19066. NgSwitch.prototype._registerView = function (value, view) {
  19067. var views = this._valueViews.get(value);
  19068. if (lang_1.isBlank(views)) {
  19069. views = [];
  19070. this._valueViews.set(value, views);
  19071. }
  19072. views.push(view);
  19073. };
  19074. /** @internal */
  19075. NgSwitch.prototype._deregisterView = function (value, view) {
  19076. // `_WHEN_DEFAULT` is used a marker for non-registered whens
  19077. if (value === _WHEN_DEFAULT)
  19078. return;
  19079. var views = this._valueViews.get(value);
  19080. if (views.length == 1) {
  19081. this._valueViews.delete(value);
  19082. }
  19083. else {
  19084. collection_1.ListWrapper.remove(views, view);
  19085. }
  19086. };
  19087. NgSwitch = __decorate([
  19088. core_1.Directive({ selector: '[ngSwitch]', inputs: ['ngSwitch'] }),
  19089. __metadata('design:paramtypes', [])
  19090. ], NgSwitch);
  19091. return NgSwitch;
  19092. })();
  19093. exports.NgSwitch = NgSwitch;
  19094. /**
  19095. * Insert the sub-tree when the `ngSwitchWhen` expression evaluates to the same value as the
  19096. * enclosing switch expression.
  19097. *
  19098. * If multiple match expression match the switch expression value, all of them are displayed.
  19099. *
  19100. * See {@link NgSwitch} for more details and example.
  19101. */
  19102. var NgSwitchWhen = (function () {
  19103. function NgSwitchWhen(viewContainer, templateRef, ngSwitch) {
  19104. // `_WHEN_DEFAULT` is used as a marker for a not yet initialized value
  19105. /** @internal */
  19106. this._value = _WHEN_DEFAULT;
  19107. this._switch = ngSwitch;
  19108. this._view = new SwitchView(viewContainer, templateRef);
  19109. }
  19110. Object.defineProperty(NgSwitchWhen.prototype, "ngSwitchWhen", {
  19111. set: function (value) {
  19112. this._switch._onWhenValueChanged(this._value, value, this._view);
  19113. this._value = value;
  19114. },
  19115. enumerable: true,
  19116. configurable: true
  19117. });
  19118. NgSwitchWhen = __decorate([
  19119. core_1.Directive({ selector: '[ngSwitchWhen]', inputs: ['ngSwitchWhen'] }),
  19120. __param(2, core_1.Host()),
  19121. __metadata('design:paramtypes', [core_1.ViewContainerRef, core_1.TemplateRef, NgSwitch])
  19122. ], NgSwitchWhen);
  19123. return NgSwitchWhen;
  19124. })();
  19125. exports.NgSwitchWhen = NgSwitchWhen;
  19126. /**
  19127. * Default case statements are displayed when no match expression matches the switch expression
  19128. * value.
  19129. *
  19130. * See {@link NgSwitch} for more details and example.
  19131. */
  19132. var NgSwitchDefault = (function () {
  19133. function NgSwitchDefault(viewContainer, templateRef, sswitch) {
  19134. sswitch._registerView(_WHEN_DEFAULT, new SwitchView(viewContainer, templateRef));
  19135. }
  19136. NgSwitchDefault = __decorate([
  19137. core_1.Directive({ selector: '[ngSwitchDefault]' }),
  19138. __param(2, core_1.Host()),
  19139. __metadata('design:paramtypes', [core_1.ViewContainerRef, core_1.TemplateRef, NgSwitch])
  19140. ], NgSwitchDefault);
  19141. return NgSwitchDefault;
  19142. })();
  19143. exports.NgSwitchDefault = NgSwitchDefault;
  19144. /***/ },
  19145. /* 121 */
  19146. /***/ function(module, exports) {
  19147. // TS does not have Observables
  19148. /***/ },
  19149. /* 122 */
  19150. /***/ function(module, exports, __webpack_require__) {
  19151. var lang_1 = __webpack_require__(5);
  19152. var ng_class_1 = __webpack_require__(116);
  19153. var ng_for_1 = __webpack_require__(117);
  19154. var ng_if_1 = __webpack_require__(118);
  19155. var ng_style_1 = __webpack_require__(119);
  19156. var ng_switch_1 = __webpack_require__(120);
  19157. /**
  19158. * A collection of Angular core directives that are likely to be used in each and every Angular
  19159. * application.
  19160. *
  19161. * This collection can be used to quickly enumerate all the built-in directives in the `directives`
  19162. * property of the `@View` annotation.
  19163. *
  19164. * ### Example ([live demo](http://plnkr.co/edit/yakGwpCdUkg0qfzX5m8g?p=preview))
  19165. *
  19166. * Instead of writing:
  19167. *
  19168. * ```typescript
  19169. * import {NgClass, NgIf, NgFor, NgSwitch, NgSwitchWhen, NgSwitchDefault} from 'angular2/common';
  19170. * import {OtherDirective} from './myDirectives';
  19171. *
  19172. * @Component({
  19173. * selector: 'my-component',
  19174. * templateUrl: 'myComponent.html',
  19175. * directives: [NgClass, NgIf, NgFor, NgSwitch, NgSwitchWhen, NgSwitchDefault, OtherDirective]
  19176. * })
  19177. * export class MyComponent {
  19178. * ...
  19179. * }
  19180. * ```
  19181. * one could import all the core directives at once:
  19182. *
  19183. * ```typescript
  19184. * import {CORE_DIRECTIVES} from 'angular2/common';
  19185. * import {OtherDirective} from './myDirectives';
  19186. *
  19187. * @Component({
  19188. * selector: 'my-component',
  19189. * templateUrl: 'myComponent.html',
  19190. * directives: [CORE_DIRECTIVES, OtherDirective]
  19191. * })
  19192. * export class MyComponent {
  19193. * ...
  19194. * }
  19195. * ```
  19196. */
  19197. 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]);
  19198. /***/ },
  19199. /* 123 */
  19200. /***/ function(module, exports, __webpack_require__) {
  19201. /**
  19202. * @module
  19203. * @description
  19204. * This module is used for handling user input, by defining and building a {@link ControlGroup} that
  19205. * consists of
  19206. * {@link Control} objects, and mapping them onto the DOM. {@link Control} objects can then be used
  19207. * to read information
  19208. * from the form DOM elements.
  19209. *
  19210. * This module is not included in the `angular2` module; you must import the forms module
  19211. * explicitly.
  19212. *
  19213. */
  19214. var model_1 = __webpack_require__(124);
  19215. exports.AbstractControl = model_1.AbstractControl;
  19216. exports.Control = model_1.Control;
  19217. exports.ControlGroup = model_1.ControlGroup;
  19218. exports.ControlArray = model_1.ControlArray;
  19219. var abstract_control_directive_1 = __webpack_require__(125);
  19220. exports.AbstractControlDirective = abstract_control_directive_1.AbstractControlDirective;
  19221. var control_container_1 = __webpack_require__(126);
  19222. exports.ControlContainer = control_container_1.ControlContainer;
  19223. var ng_control_name_1 = __webpack_require__(127);
  19224. exports.NgControlName = ng_control_name_1.NgControlName;
  19225. var ng_form_control_1 = __webpack_require__(137);
  19226. exports.NgFormControl = ng_form_control_1.NgFormControl;
  19227. var ng_model_1 = __webpack_require__(138);
  19228. exports.NgModel = ng_model_1.NgModel;
  19229. var ng_control_1 = __webpack_require__(128);
  19230. exports.NgControl = ng_control_1.NgControl;
  19231. var ng_control_group_1 = __webpack_require__(139);
  19232. exports.NgControlGroup = ng_control_group_1.NgControlGroup;
  19233. var ng_form_model_1 = __webpack_require__(140);
  19234. exports.NgFormModel = ng_form_model_1.NgFormModel;
  19235. var ng_form_1 = __webpack_require__(141);
  19236. exports.NgForm = ng_form_1.NgForm;
  19237. var control_value_accessor_1 = __webpack_require__(129);
  19238. exports.NG_VALUE_ACCESSOR = control_value_accessor_1.NG_VALUE_ACCESSOR;
  19239. var default_value_accessor_1 = __webpack_require__(132);
  19240. exports.DefaultValueAccessor = default_value_accessor_1.DefaultValueAccessor;
  19241. var ng_control_status_1 = __webpack_require__(142);
  19242. exports.NgControlStatus = ng_control_status_1.NgControlStatus;
  19243. var checkbox_value_accessor_1 = __webpack_require__(134);
  19244. exports.CheckboxControlValueAccessor = checkbox_value_accessor_1.CheckboxControlValueAccessor;
  19245. var select_control_value_accessor_1 = __webpack_require__(135);
  19246. exports.NgSelectOption = select_control_value_accessor_1.NgSelectOption;
  19247. exports.SelectControlValueAccessor = select_control_value_accessor_1.SelectControlValueAccessor;
  19248. var directives_1 = __webpack_require__(143);
  19249. exports.FORM_DIRECTIVES = directives_1.FORM_DIRECTIVES;
  19250. var validators_1 = __webpack_require__(131);
  19251. exports.NG_VALIDATORS = validators_1.NG_VALIDATORS;
  19252. exports.NG_ASYNC_VALIDATORS = validators_1.NG_ASYNC_VALIDATORS;
  19253. exports.Validators = validators_1.Validators;
  19254. var validators_2 = __webpack_require__(144);
  19255. exports.RequiredValidator = validators_2.RequiredValidator;
  19256. exports.MinLengthValidator = validators_2.MinLengthValidator;
  19257. exports.MaxLengthValidator = validators_2.MaxLengthValidator;
  19258. var form_builder_1 = __webpack_require__(145);
  19259. exports.FormBuilder = form_builder_1.FormBuilder;
  19260. exports.FORM_PROVIDERS = form_builder_1.FORM_PROVIDERS;
  19261. exports.FORM_BINDINGS = form_builder_1.FORM_BINDINGS;
  19262. /***/ },
  19263. /* 124 */
  19264. /***/ function(module, exports, __webpack_require__) {
  19265. var __extends = (this && this.__extends) || function (d, b) {
  19266. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  19267. function __() { this.constructor = d; }
  19268. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  19269. };
  19270. var lang_1 = __webpack_require__(5);
  19271. var async_1 = __webpack_require__(60);
  19272. var promise_1 = __webpack_require__(61);
  19273. var collection_1 = __webpack_require__(12);
  19274. /**
  19275. * Indicates that a Control is valid, i.e. that no errors exist in the input value.
  19276. */
  19277. exports.VALID = "VALID";
  19278. /**
  19279. * Indicates that a Control is invalid, i.e. that an error exists in the input value.
  19280. */
  19281. exports.INVALID = "INVALID";
  19282. /**
  19283. * Indicates that a Control is pending, i.e. that async validation is occuring and
  19284. * errors are not yet available for the input value.
  19285. */
  19286. exports.PENDING = "PENDING";
  19287. function isControl(control) {
  19288. return control instanceof AbstractControl;
  19289. }
  19290. exports.isControl = isControl;
  19291. function _find(control, path) {
  19292. if (lang_1.isBlank(path))
  19293. return null;
  19294. if (!(path instanceof Array)) {
  19295. path = path.split("/");
  19296. }
  19297. if (path instanceof Array && collection_1.ListWrapper.isEmpty(path))
  19298. return null;
  19299. return path
  19300. .reduce(function (v, name) {
  19301. if (v instanceof ControlGroup) {
  19302. return lang_1.isPresent(v.controls[name]) ? v.controls[name] : null;
  19303. }
  19304. else if (v instanceof ControlArray) {
  19305. var index = name;
  19306. return lang_1.isPresent(v.at(index)) ? v.at(index) : null;
  19307. }
  19308. else {
  19309. return null;
  19310. }
  19311. }, control);
  19312. }
  19313. function toObservable(r) {
  19314. return promise_1.PromiseWrapper.isPromise(r) ? async_1.ObservableWrapper.fromPromise(r) : r;
  19315. }
  19316. /**
  19317. *
  19318. */
  19319. var AbstractControl = (function () {
  19320. function AbstractControl(validator, asyncValidator) {
  19321. this.validator = validator;
  19322. this.asyncValidator = asyncValidator;
  19323. this._pristine = true;
  19324. this._touched = false;
  19325. }
  19326. Object.defineProperty(AbstractControl.prototype, "value", {
  19327. get: function () { return this._value; },
  19328. enumerable: true,
  19329. configurable: true
  19330. });
  19331. Object.defineProperty(AbstractControl.prototype, "status", {
  19332. get: function () { return this._status; },
  19333. enumerable: true,
  19334. configurable: true
  19335. });
  19336. Object.defineProperty(AbstractControl.prototype, "valid", {
  19337. get: function () { return this._status === exports.VALID; },
  19338. enumerable: true,
  19339. configurable: true
  19340. });
  19341. Object.defineProperty(AbstractControl.prototype, "errors", {
  19342. /**
  19343. * Returns the errors of this control.
  19344. */
  19345. get: function () { return this._errors; },
  19346. enumerable: true,
  19347. configurable: true
  19348. });
  19349. Object.defineProperty(AbstractControl.prototype, "pristine", {
  19350. get: function () { return this._pristine; },
  19351. enumerable: true,
  19352. configurable: true
  19353. });
  19354. Object.defineProperty(AbstractControl.prototype, "dirty", {
  19355. get: function () { return !this.pristine; },
  19356. enumerable: true,
  19357. configurable: true
  19358. });
  19359. Object.defineProperty(AbstractControl.prototype, "touched", {
  19360. get: function () { return this._touched; },
  19361. enumerable: true,
  19362. configurable: true
  19363. });
  19364. Object.defineProperty(AbstractControl.prototype, "untouched", {
  19365. get: function () { return !this._touched; },
  19366. enumerable: true,
  19367. configurable: true
  19368. });
  19369. Object.defineProperty(AbstractControl.prototype, "valueChanges", {
  19370. get: function () { return this._valueChanges; },
  19371. enumerable: true,
  19372. configurable: true
  19373. });
  19374. Object.defineProperty(AbstractControl.prototype, "statusChanges", {
  19375. get: function () { return this._statusChanges; },
  19376. enumerable: true,
  19377. configurable: true
  19378. });
  19379. Object.defineProperty(AbstractControl.prototype, "pending", {
  19380. get: function () { return this._status == exports.PENDING; },
  19381. enumerable: true,
  19382. configurable: true
  19383. });
  19384. AbstractControl.prototype.markAsTouched = function () { this._touched = true; };
  19385. AbstractControl.prototype.markAsDirty = function (_a) {
  19386. var onlySelf = (_a === void 0 ? {} : _a).onlySelf;
  19387. onlySelf = lang_1.normalizeBool(onlySelf);
  19388. this._pristine = false;
  19389. if (lang_1.isPresent(this._parent) && !onlySelf) {
  19390. this._parent.markAsDirty({ onlySelf: onlySelf });
  19391. }
  19392. };
  19393. AbstractControl.prototype.markAsPending = function (_a) {
  19394. var onlySelf = (_a === void 0 ? {} : _a).onlySelf;
  19395. onlySelf = lang_1.normalizeBool(onlySelf);
  19396. this._status = exports.PENDING;
  19397. if (lang_1.isPresent(this._parent) && !onlySelf) {
  19398. this._parent.markAsPending({ onlySelf: onlySelf });
  19399. }
  19400. };
  19401. AbstractControl.prototype.setParent = function (parent) { this._parent = parent; };
  19402. AbstractControl.prototype.updateValueAndValidity = function (_a) {
  19403. var _b = _a === void 0 ? {} : _a, onlySelf = _b.onlySelf, emitEvent = _b.emitEvent;
  19404. onlySelf = lang_1.normalizeBool(onlySelf);
  19405. emitEvent = lang_1.isPresent(emitEvent) ? emitEvent : true;
  19406. this._updateValue();
  19407. this._errors = this._runValidator();
  19408. this._status = this._calculateStatus();
  19409. if (this._status == exports.VALID || this._status == exports.PENDING) {
  19410. this._runAsyncValidator(emitEvent);
  19411. }
  19412. if (emitEvent) {
  19413. async_1.ObservableWrapper.callEmit(this._valueChanges, this._value);
  19414. async_1.ObservableWrapper.callEmit(this._statusChanges, this._status);
  19415. }
  19416. if (lang_1.isPresent(this._parent) && !onlySelf) {
  19417. this._parent.updateValueAndValidity({ onlySelf: onlySelf, emitEvent: emitEvent });
  19418. }
  19419. };
  19420. AbstractControl.prototype._runValidator = function () { return lang_1.isPresent(this.validator) ? this.validator(this) : null; };
  19421. AbstractControl.prototype._runAsyncValidator = function (emitEvent) {
  19422. var _this = this;
  19423. if (lang_1.isPresent(this.asyncValidator)) {
  19424. this._status = exports.PENDING;
  19425. this._cancelExistingSubscription();
  19426. var obs = toObservable(this.asyncValidator(this));
  19427. this._asyncValidationSubscription =
  19428. async_1.ObservableWrapper.subscribe(obs, function (res) { return _this.setErrors(res, { emitEvent: emitEvent }); });
  19429. }
  19430. };
  19431. AbstractControl.prototype._cancelExistingSubscription = function () {
  19432. if (lang_1.isPresent(this._asyncValidationSubscription)) {
  19433. async_1.ObservableWrapper.dispose(this._asyncValidationSubscription);
  19434. }
  19435. };
  19436. /**
  19437. * Sets errors on a control.
  19438. *
  19439. * This is used when validations are run not automatically, but manually by the user.
  19440. *
  19441. * Calling `setErrors` will also update the validity of the parent control.
  19442. *
  19443. * ## Usage
  19444. *
  19445. * ```
  19446. * var login = new Control("someLogin");
  19447. * login.setErrors({
  19448. * "notUnique": true
  19449. * });
  19450. *
  19451. * expect(login.valid).toEqual(false);
  19452. * expect(login.errors).toEqual({"notUnique": true});
  19453. *
  19454. * login.updateValue("someOtherLogin");
  19455. *
  19456. * expect(login.valid).toEqual(true);
  19457. * ```
  19458. */
  19459. AbstractControl.prototype.setErrors = function (errors, _a) {
  19460. var emitEvent = (_a === void 0 ? {} : _a).emitEvent;
  19461. emitEvent = lang_1.isPresent(emitEvent) ? emitEvent : true;
  19462. this._errors = errors;
  19463. this._status = this._calculateStatus();
  19464. if (emitEvent) {
  19465. async_1.ObservableWrapper.callEmit(this._statusChanges, this._status);
  19466. }
  19467. if (lang_1.isPresent(this._parent)) {
  19468. this._parent._updateControlsErrors();
  19469. }
  19470. };
  19471. AbstractControl.prototype.find = function (path) { return _find(this, path); };
  19472. AbstractControl.prototype.getError = function (errorCode, path) {
  19473. if (path === void 0) { path = null; }
  19474. var control = lang_1.isPresent(path) && !collection_1.ListWrapper.isEmpty(path) ? this.find(path) : this;
  19475. if (lang_1.isPresent(control) && lang_1.isPresent(control._errors)) {
  19476. return collection_1.StringMapWrapper.get(control._errors, errorCode);
  19477. }
  19478. else {
  19479. return null;
  19480. }
  19481. };
  19482. AbstractControl.prototype.hasError = function (errorCode, path) {
  19483. if (path === void 0) { path = null; }
  19484. return lang_1.isPresent(this.getError(errorCode, path));
  19485. };
  19486. /** @internal */
  19487. AbstractControl.prototype._updateControlsErrors = function () {
  19488. this._status = this._calculateStatus();
  19489. if (lang_1.isPresent(this._parent)) {
  19490. this._parent._updateControlsErrors();
  19491. }
  19492. };
  19493. /** @internal */
  19494. AbstractControl.prototype._initObservables = function () {
  19495. this._valueChanges = new async_1.EventEmitter();
  19496. this._statusChanges = new async_1.EventEmitter();
  19497. };
  19498. AbstractControl.prototype._calculateStatus = function () {
  19499. if (lang_1.isPresent(this._errors))
  19500. return exports.INVALID;
  19501. if (this._anyControlsHaveStatus(exports.PENDING))
  19502. return exports.PENDING;
  19503. if (this._anyControlsHaveStatus(exports.INVALID))
  19504. return exports.INVALID;
  19505. return exports.VALID;
  19506. };
  19507. return AbstractControl;
  19508. })();
  19509. exports.AbstractControl = AbstractControl;
  19510. /**
  19511. * Defines a part of a form that cannot be divided into other controls. `Control`s have values and
  19512. * validation state, which is determined by an optional validation function.
  19513. *
  19514. * `Control` is one of the three fundamental building blocks used to define forms in Angular, along
  19515. * with {@link ControlGroup} and {@link ControlArray}.
  19516. *
  19517. * ## Usage
  19518. *
  19519. * By default, a `Control` is created for every `<input>` or other form component.
  19520. * With {@link NgFormControl} or {@link NgFormModel} an existing {@link Control} can be
  19521. * bound to a DOM element instead. This `Control` can be configured with a custom
  19522. * validation function.
  19523. *
  19524. * ### Example ([live demo](http://plnkr.co/edit/23DESOpbNnBpBHZt1BR4?p=preview))
  19525. */
  19526. var Control = (function (_super) {
  19527. __extends(Control, _super);
  19528. function Control(value, validator, asyncValidator) {
  19529. if (value === void 0) { value = null; }
  19530. if (validator === void 0) { validator = null; }
  19531. if (asyncValidator === void 0) { asyncValidator = null; }
  19532. _super.call(this, validator, asyncValidator);
  19533. this._value = value;
  19534. this.updateValueAndValidity({ onlySelf: true, emitEvent: false });
  19535. this._initObservables();
  19536. }
  19537. /**
  19538. * Set the value of the control to `value`.
  19539. *
  19540. * If `onlySelf` is `true`, this change will only affect the validation of this `Control`
  19541. * and not its parent component. If `emitEvent` is `true`, this change will cause a
  19542. * `valueChanges` event on the `Control` to be emitted. Both of these options default to
  19543. * `false`.
  19544. *
  19545. * If `emitModelToViewChange` is `true`, the view will be notified about the new value
  19546. * via an `onChange` event. This is the default behavior if `emitModelToViewChange` is not
  19547. * specified.
  19548. */
  19549. Control.prototype.updateValue = function (value, _a) {
  19550. var _b = _a === void 0 ? {} : _a, onlySelf = _b.onlySelf, emitEvent = _b.emitEvent, emitModelToViewChange = _b.emitModelToViewChange;
  19551. emitModelToViewChange = lang_1.isPresent(emitModelToViewChange) ? emitModelToViewChange : true;
  19552. this._value = value;
  19553. if (lang_1.isPresent(this._onChange) && emitModelToViewChange)
  19554. this._onChange(this._value);
  19555. this.updateValueAndValidity({ onlySelf: onlySelf, emitEvent: emitEvent });
  19556. };
  19557. /**
  19558. * @internal
  19559. */
  19560. Control.prototype._updateValue = function () { };
  19561. /**
  19562. * @internal
  19563. */
  19564. Control.prototype._anyControlsHaveStatus = function (status) { return false; };
  19565. /**
  19566. * Register a listener for change events.
  19567. */
  19568. Control.prototype.registerOnChange = function (fn) { this._onChange = fn; };
  19569. return Control;
  19570. })(AbstractControl);
  19571. exports.Control = Control;
  19572. /**
  19573. * Defines a part of a form, of fixed length, that can contain other controls.
  19574. *
  19575. * A `ControlGroup` aggregates the values and errors of each {@link Control} in the group. Thus, if
  19576. * one of the controls in a group is invalid, the entire group is invalid. Similarly, if a control
  19577. * changes its value, the entire group changes as well.
  19578. *
  19579. * `ControlGroup` is one of the three fundamental building blocks used to define forms in Angular,
  19580. * along with {@link Control} and {@link ControlArray}. {@link ControlArray} can also contain other
  19581. * controls, but is of variable length.
  19582. *
  19583. * ### Example ([live demo](http://plnkr.co/edit/23DESOpbNnBpBHZt1BR4?p=preview))
  19584. */
  19585. var ControlGroup = (function (_super) {
  19586. __extends(ControlGroup, _super);
  19587. function ControlGroup(controls, optionals, validator, asyncValidator) {
  19588. if (optionals === void 0) { optionals = null; }
  19589. if (validator === void 0) { validator = null; }
  19590. if (asyncValidator === void 0) { asyncValidator = null; }
  19591. _super.call(this, validator, asyncValidator);
  19592. this.controls = controls;
  19593. this._optionals = lang_1.isPresent(optionals) ? optionals : {};
  19594. this._initObservables();
  19595. this._setParentForControls();
  19596. this.updateValueAndValidity({ onlySelf: true, emitEvent: false });
  19597. }
  19598. /**
  19599. * Add a control to this group.
  19600. */
  19601. ControlGroup.prototype.addControl = function (name, control) {
  19602. this.controls[name] = control;
  19603. control.setParent(this);
  19604. };
  19605. /**
  19606. * Remove a control from this group.
  19607. */
  19608. ControlGroup.prototype.removeControl = function (name) { collection_1.StringMapWrapper.delete(this.controls, name); };
  19609. /**
  19610. * Mark the named control as non-optional.
  19611. */
  19612. ControlGroup.prototype.include = function (controlName) {
  19613. collection_1.StringMapWrapper.set(this._optionals, controlName, true);
  19614. this.updateValueAndValidity();
  19615. };
  19616. /**
  19617. * Mark the named control as optional.
  19618. */
  19619. ControlGroup.prototype.exclude = function (controlName) {
  19620. collection_1.StringMapWrapper.set(this._optionals, controlName, false);
  19621. this.updateValueAndValidity();
  19622. };
  19623. /**
  19624. * Check whether there is a control with the given name in the group.
  19625. */
  19626. ControlGroup.prototype.contains = function (controlName) {
  19627. var c = collection_1.StringMapWrapper.contains(this.controls, controlName);
  19628. return c && this._included(controlName);
  19629. };
  19630. /** @internal */
  19631. ControlGroup.prototype._setParentForControls = function () {
  19632. var _this = this;
  19633. collection_1.StringMapWrapper.forEach(this.controls, function (control, name) { control.setParent(_this); });
  19634. };
  19635. /** @internal */
  19636. ControlGroup.prototype._updateValue = function () { this._value = this._reduceValue(); };
  19637. /** @internal */
  19638. ControlGroup.prototype._anyControlsHaveStatus = function (status) {
  19639. var _this = this;
  19640. var res = false;
  19641. collection_1.StringMapWrapper.forEach(this.controls, function (control, name) {
  19642. res = res || (_this.contains(name) && control.status == status);
  19643. });
  19644. return res;
  19645. };
  19646. /** @internal */
  19647. ControlGroup.prototype._reduceValue = function () {
  19648. return this._reduceChildren({}, function (acc, control, name) {
  19649. acc[name] = control.value;
  19650. return acc;
  19651. });
  19652. };
  19653. /** @internal */
  19654. ControlGroup.prototype._reduceChildren = function (initValue, fn) {
  19655. var _this = this;
  19656. var res = initValue;
  19657. collection_1.StringMapWrapper.forEach(this.controls, function (control, name) {
  19658. if (_this._included(name)) {
  19659. res = fn(res, control, name);
  19660. }
  19661. });
  19662. return res;
  19663. };
  19664. /** @internal */
  19665. ControlGroup.prototype._included = function (controlName) {
  19666. var isOptional = collection_1.StringMapWrapper.contains(this._optionals, controlName);
  19667. return !isOptional || collection_1.StringMapWrapper.get(this._optionals, controlName);
  19668. };
  19669. return ControlGroup;
  19670. })(AbstractControl);
  19671. exports.ControlGroup = ControlGroup;
  19672. /**
  19673. * Defines a part of a form, of variable length, that can contain other controls.
  19674. *
  19675. * A `ControlArray` aggregates the values and errors of each {@link Control} in the group. Thus, if
  19676. * one of the controls in a group is invalid, the entire group is invalid. Similarly, if a control
  19677. * changes its value, the entire group changes as well.
  19678. *
  19679. * `ControlArray` is one of the three fundamental building blocks used to define forms in Angular,
  19680. * along with {@link Control} and {@link ControlGroup}. {@link ControlGroup} can also contain
  19681. * other controls, but is of fixed length.
  19682. *
  19683. * ## Adding or removing controls
  19684. *
  19685. * To change the controls in the array, use the `push`, `insert`, or `removeAt` methods
  19686. * in `ControlArray` itself. These methods ensure the controls are properly tracked in the
  19687. * form's hierarchy. Do not modify the array of `AbstractControl`s used to instantiate
  19688. * the `ControlArray` directly, as that will result in strange and unexpected behavior such
  19689. * as broken change detection.
  19690. *
  19691. * ### Example ([live demo](http://plnkr.co/edit/23DESOpbNnBpBHZt1BR4?p=preview))
  19692. */
  19693. var ControlArray = (function (_super) {
  19694. __extends(ControlArray, _super);
  19695. function ControlArray(controls, validator, asyncValidator) {
  19696. if (validator === void 0) { validator = null; }
  19697. if (asyncValidator === void 0) { asyncValidator = null; }
  19698. _super.call(this, validator, asyncValidator);
  19699. this.controls = controls;
  19700. this._initObservables();
  19701. this._setParentForControls();
  19702. this.updateValueAndValidity({ onlySelf: true, emitEvent: false });
  19703. }
  19704. /**
  19705. * Get the {@link AbstractControl} at the given `index` in the array.
  19706. */
  19707. ControlArray.prototype.at = function (index) { return this.controls[index]; };
  19708. /**
  19709. * Insert a new {@link AbstractControl} at the end of the array.
  19710. */
  19711. ControlArray.prototype.push = function (control) {
  19712. this.controls.push(control);
  19713. control.setParent(this);
  19714. this.updateValueAndValidity();
  19715. };
  19716. /**
  19717. * Insert a new {@link AbstractControl} at the given `index` in the array.
  19718. */
  19719. ControlArray.prototype.insert = function (index, control) {
  19720. collection_1.ListWrapper.insert(this.controls, index, control);
  19721. control.setParent(this);
  19722. this.updateValueAndValidity();
  19723. };
  19724. /**
  19725. * Remove the control at the given `index` in the array.
  19726. */
  19727. ControlArray.prototype.removeAt = function (index) {
  19728. collection_1.ListWrapper.removeAt(this.controls, index);
  19729. this.updateValueAndValidity();
  19730. };
  19731. Object.defineProperty(ControlArray.prototype, "length", {
  19732. /**
  19733. * Length of the control array.
  19734. */
  19735. get: function () { return this.controls.length; },
  19736. enumerable: true,
  19737. configurable: true
  19738. });
  19739. /** @internal */
  19740. ControlArray.prototype._updateValue = function () { this._value = this.controls.map(function (control) { return control.value; }); };
  19741. /** @internal */
  19742. ControlArray.prototype._anyControlsHaveStatus = function (status) {
  19743. return this.controls.some(function (c) { return c.status == status; });
  19744. };
  19745. /** @internal */
  19746. ControlArray.prototype._setParentForControls = function () {
  19747. var _this = this;
  19748. this.controls.forEach(function (control) { control.setParent(_this); });
  19749. };
  19750. return ControlArray;
  19751. })(AbstractControl);
  19752. exports.ControlArray = ControlArray;
  19753. /***/ },
  19754. /* 125 */
  19755. /***/ function(module, exports, __webpack_require__) {
  19756. var lang_1 = __webpack_require__(5);
  19757. var exceptions_1 = __webpack_require__(14);
  19758. /**
  19759. * Base class for control directives.
  19760. *
  19761. * Only used internally in the forms module.
  19762. */
  19763. var AbstractControlDirective = (function () {
  19764. function AbstractControlDirective() {
  19765. }
  19766. Object.defineProperty(AbstractControlDirective.prototype, "control", {
  19767. get: function () { return exceptions_1.unimplemented(); },
  19768. enumerable: true,
  19769. configurable: true
  19770. });
  19771. Object.defineProperty(AbstractControlDirective.prototype, "value", {
  19772. get: function () { return lang_1.isPresent(this.control) ? this.control.value : null; },
  19773. enumerable: true,
  19774. configurable: true
  19775. });
  19776. Object.defineProperty(AbstractControlDirective.prototype, "valid", {
  19777. get: function () { return lang_1.isPresent(this.control) ? this.control.valid : null; },
  19778. enumerable: true,
  19779. configurable: true
  19780. });
  19781. Object.defineProperty(AbstractControlDirective.prototype, "errors", {
  19782. get: function () {
  19783. return lang_1.isPresent(this.control) ? this.control.errors : null;
  19784. },
  19785. enumerable: true,
  19786. configurable: true
  19787. });
  19788. Object.defineProperty(AbstractControlDirective.prototype, "pristine", {
  19789. get: function () { return lang_1.isPresent(this.control) ? this.control.pristine : null; },
  19790. enumerable: true,
  19791. configurable: true
  19792. });
  19793. Object.defineProperty(AbstractControlDirective.prototype, "dirty", {
  19794. get: function () { return lang_1.isPresent(this.control) ? this.control.dirty : null; },
  19795. enumerable: true,
  19796. configurable: true
  19797. });
  19798. Object.defineProperty(AbstractControlDirective.prototype, "touched", {
  19799. get: function () { return lang_1.isPresent(this.control) ? this.control.touched : null; },
  19800. enumerable: true,
  19801. configurable: true
  19802. });
  19803. Object.defineProperty(AbstractControlDirective.prototype, "untouched", {
  19804. get: function () { return lang_1.isPresent(this.control) ? this.control.untouched : null; },
  19805. enumerable: true,
  19806. configurable: true
  19807. });
  19808. Object.defineProperty(AbstractControlDirective.prototype, "path", {
  19809. get: function () { return null; },
  19810. enumerable: true,
  19811. configurable: true
  19812. });
  19813. return AbstractControlDirective;
  19814. })();
  19815. exports.AbstractControlDirective = AbstractControlDirective;
  19816. /***/ },
  19817. /* 126 */
  19818. /***/ function(module, exports, __webpack_require__) {
  19819. var __extends = (this && this.__extends) || function (d, b) {
  19820. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  19821. function __() { this.constructor = d; }
  19822. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  19823. };
  19824. var abstract_control_directive_1 = __webpack_require__(125);
  19825. /**
  19826. * A directive that contains multiple {@link NgControl}s.
  19827. *
  19828. * Only used by the forms module.
  19829. */
  19830. var ControlContainer = (function (_super) {
  19831. __extends(ControlContainer, _super);
  19832. function ControlContainer() {
  19833. _super.apply(this, arguments);
  19834. }
  19835. Object.defineProperty(ControlContainer.prototype, "formDirective", {
  19836. /**
  19837. * Get the form to which this container belongs.
  19838. */
  19839. get: function () { return null; },
  19840. enumerable: true,
  19841. configurable: true
  19842. });
  19843. Object.defineProperty(ControlContainer.prototype, "path", {
  19844. /**
  19845. * Get the path to this container.
  19846. */
  19847. get: function () { return null; },
  19848. enumerable: true,
  19849. configurable: true
  19850. });
  19851. return ControlContainer;
  19852. })(abstract_control_directive_1.AbstractControlDirective);
  19853. exports.ControlContainer = ControlContainer;
  19854. /***/ },
  19855. /* 127 */
  19856. /***/ function(module, exports, __webpack_require__) {
  19857. var __extends = (this && this.__extends) || function (d, b) {
  19858. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  19859. function __() { this.constructor = d; }
  19860. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  19861. };
  19862. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  19863. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  19864. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  19865. 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;
  19866. return c > 3 && r && Object.defineProperty(target, key, r), r;
  19867. };
  19868. var __metadata = (this && this.__metadata) || function (k, v) {
  19869. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  19870. };
  19871. var __param = (this && this.__param) || function (paramIndex, decorator) {
  19872. return function (target, key) { decorator(target, key, paramIndex); }
  19873. };
  19874. var lang_1 = __webpack_require__(5);
  19875. var async_1 = __webpack_require__(60);
  19876. var core_1 = __webpack_require__(2);
  19877. var control_container_1 = __webpack_require__(126);
  19878. var ng_control_1 = __webpack_require__(128);
  19879. var control_value_accessor_1 = __webpack_require__(129);
  19880. var shared_1 = __webpack_require__(130);
  19881. var validators_1 = __webpack_require__(131);
  19882. var controlNameBinding = lang_1.CONST_EXPR(new core_1.Provider(ng_control_1.NgControl, { useExisting: core_1.forwardRef(function () { return NgControlName; }) }));
  19883. /**
  19884. * Creates and binds a control with a specified name to a DOM element.
  19885. *
  19886. * This directive can only be used as a child of {@link NgForm} or {@link NgFormModel}.
  19887. * ### Example
  19888. *
  19889. * In this example, we create the login and password controls.
  19890. * We can work with each control separately: check its validity, get its value, listen to its
  19891. * changes.
  19892. *
  19893. * ```
  19894. * @Component({
  19895. * selector: "login-comp",
  19896. * directives: [FORM_DIRECTIVES],
  19897. * template: `
  19898. * <form #f="ngForm" (submit)='onLogIn(f.value)'>
  19899. * Login <input type='text' ngControl='login' #l="form">
  19900. * <div *ngIf="!l.valid">Login is invalid</div>
  19901. *
  19902. * Password <input type='password' ngControl='password'>
  19903. * <button type='submit'>Log in!</button>
  19904. * </form>
  19905. * `})
  19906. * class LoginComp {
  19907. * onLogIn(value): void {
  19908. * // value === {login: 'some login', password: 'some password'}
  19909. * }
  19910. * }
  19911. * ```
  19912. *
  19913. * We can also use ngModel to bind a domain model to the form.
  19914. *
  19915. * ```
  19916. * @Component({
  19917. * selector: "login-comp",
  19918. * directives: [FORM_DIRECTIVES],
  19919. * template: `
  19920. * <form (submit)='onLogIn()'>
  19921. * Login <input type='text' ngControl='login' [(ngModel)]="credentials.login">
  19922. * Password <input type='password' ngControl='password'
  19923. * [(ngModel)]="credentials.password">
  19924. * <button type='submit'>Log in!</button>
  19925. * </form>
  19926. * `})
  19927. * class LoginComp {
  19928. * credentials: {login:string, password:string};
  19929. *
  19930. * onLogIn(): void {
  19931. * // this.credentials.login === "some login"
  19932. * // this.credentials.password === "some password"
  19933. * }
  19934. * }
  19935. * ```
  19936. */
  19937. var NgControlName = (function (_super) {
  19938. __extends(NgControlName, _super);
  19939. function NgControlName(_parent, _validators, _asyncValidators, valueAccessors) {
  19940. _super.call(this);
  19941. this._parent = _parent;
  19942. this._validators = _validators;
  19943. this._asyncValidators = _asyncValidators;
  19944. /** @internal */
  19945. this.update = new async_1.EventEmitter();
  19946. this._added = false;
  19947. this.valueAccessor = shared_1.selectValueAccessor(this, valueAccessors);
  19948. }
  19949. NgControlName.prototype.ngOnChanges = function (changes) {
  19950. if (!this._added) {
  19951. this.formDirective.addControl(this);
  19952. this._added = true;
  19953. }
  19954. if (shared_1.isPropertyUpdated(changes, this.viewModel)) {
  19955. this.viewModel = this.model;
  19956. this.formDirective.updateModel(this, this.model);
  19957. }
  19958. };
  19959. NgControlName.prototype.ngOnDestroy = function () { this.formDirective.removeControl(this); };
  19960. NgControlName.prototype.viewToModelUpdate = function (newValue) {
  19961. this.viewModel = newValue;
  19962. async_1.ObservableWrapper.callEmit(this.update, newValue);
  19963. };
  19964. Object.defineProperty(NgControlName.prototype, "path", {
  19965. get: function () { return shared_1.controlPath(this.name, this._parent); },
  19966. enumerable: true,
  19967. configurable: true
  19968. });
  19969. Object.defineProperty(NgControlName.prototype, "formDirective", {
  19970. get: function () { return this._parent.formDirective; },
  19971. enumerable: true,
  19972. configurable: true
  19973. });
  19974. Object.defineProperty(NgControlName.prototype, "validator", {
  19975. get: function () { return shared_1.composeValidators(this._validators); },
  19976. enumerable: true,
  19977. configurable: true
  19978. });
  19979. Object.defineProperty(NgControlName.prototype, "asyncValidator", {
  19980. get: function () { return shared_1.composeAsyncValidators(this._asyncValidators); },
  19981. enumerable: true,
  19982. configurable: true
  19983. });
  19984. Object.defineProperty(NgControlName.prototype, "control", {
  19985. get: function () { return this.formDirective.getControl(this); },
  19986. enumerable: true,
  19987. configurable: true
  19988. });
  19989. NgControlName = __decorate([
  19990. core_1.Directive({
  19991. selector: '[ngControl]',
  19992. bindings: [controlNameBinding],
  19993. inputs: ['name: ngControl', 'model: ngModel'],
  19994. outputs: ['update: ngModelChange'],
  19995. exportAs: 'ngForm'
  19996. }),
  19997. __param(0, core_1.Host()),
  19998. __param(0, core_1.SkipSelf()),
  19999. __param(1, core_1.Optional()),
  20000. __param(1, core_1.Self()),
  20001. __param(1, core_1.Inject(validators_1.NG_VALIDATORS)),
  20002. __param(2, core_1.Optional()),
  20003. __param(2, core_1.Self()),
  20004. __param(2, core_1.Inject(validators_1.NG_ASYNC_VALIDATORS)),
  20005. __param(3, core_1.Optional()),
  20006. __param(3, core_1.Self()),
  20007. __param(3, core_1.Inject(control_value_accessor_1.NG_VALUE_ACCESSOR)),
  20008. __metadata('design:paramtypes', [control_container_1.ControlContainer, Array, Array, Array])
  20009. ], NgControlName);
  20010. return NgControlName;
  20011. })(ng_control_1.NgControl);
  20012. exports.NgControlName = NgControlName;
  20013. /***/ },
  20014. /* 128 */
  20015. /***/ function(module, exports, __webpack_require__) {
  20016. var __extends = (this && this.__extends) || function (d, b) {
  20017. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  20018. function __() { this.constructor = d; }
  20019. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  20020. };
  20021. var abstract_control_directive_1 = __webpack_require__(125);
  20022. var exceptions_1 = __webpack_require__(14);
  20023. /**
  20024. * A base class that all control directive extend.
  20025. * It binds a {@link Control} object to a DOM element.
  20026. *
  20027. * Used internally by Angular forms.
  20028. */
  20029. var NgControl = (function (_super) {
  20030. __extends(NgControl, _super);
  20031. function NgControl() {
  20032. _super.apply(this, arguments);
  20033. this.name = null;
  20034. this.valueAccessor = null;
  20035. }
  20036. Object.defineProperty(NgControl.prototype, "validator", {
  20037. get: function () { return exceptions_1.unimplemented(); },
  20038. enumerable: true,
  20039. configurable: true
  20040. });
  20041. Object.defineProperty(NgControl.prototype, "asyncValidator", {
  20042. get: function () { return exceptions_1.unimplemented(); },
  20043. enumerable: true,
  20044. configurable: true
  20045. });
  20046. return NgControl;
  20047. })(abstract_control_directive_1.AbstractControlDirective);
  20048. exports.NgControl = NgControl;
  20049. /***/ },
  20050. /* 129 */
  20051. /***/ function(module, exports, __webpack_require__) {
  20052. var core_1 = __webpack_require__(2);
  20053. var lang_1 = __webpack_require__(5);
  20054. /**
  20055. * Used to provide a {@link ControlValueAccessor} for form controls.
  20056. *
  20057. * See {@link DefaultValueAccessor} for how to implement one.
  20058. */
  20059. exports.NG_VALUE_ACCESSOR = lang_1.CONST_EXPR(new core_1.OpaqueToken("NgValueAccessor"));
  20060. /***/ },
  20061. /* 130 */
  20062. /***/ function(module, exports, __webpack_require__) {
  20063. var collection_1 = __webpack_require__(12);
  20064. var lang_1 = __webpack_require__(5);
  20065. var exceptions_1 = __webpack_require__(14);
  20066. var validators_1 = __webpack_require__(131);
  20067. var default_value_accessor_1 = __webpack_require__(132);
  20068. var number_value_accessor_1 = __webpack_require__(133);
  20069. var checkbox_value_accessor_1 = __webpack_require__(134);
  20070. var select_control_value_accessor_1 = __webpack_require__(135);
  20071. var normalize_validator_1 = __webpack_require__(136);
  20072. function controlPath(name, parent) {
  20073. var p = collection_1.ListWrapper.clone(parent.path);
  20074. p.push(name);
  20075. return p;
  20076. }
  20077. exports.controlPath = controlPath;
  20078. function setUpControl(control, dir) {
  20079. if (lang_1.isBlank(control))
  20080. _throwError(dir, "Cannot find control");
  20081. if (lang_1.isBlank(dir.valueAccessor))
  20082. _throwError(dir, "No value accessor for");
  20083. control.validator = validators_1.Validators.compose([control.validator, dir.validator]);
  20084. control.asyncValidator = validators_1.Validators.composeAsync([control.asyncValidator, dir.asyncValidator]);
  20085. dir.valueAccessor.writeValue(control.value);
  20086. // view -> model
  20087. dir.valueAccessor.registerOnChange(function (newValue) {
  20088. dir.viewToModelUpdate(newValue);
  20089. control.updateValue(newValue, { emitModelToViewChange: false });
  20090. control.markAsDirty();
  20091. });
  20092. // model -> view
  20093. control.registerOnChange(function (newValue) { return dir.valueAccessor.writeValue(newValue); });
  20094. // touched
  20095. dir.valueAccessor.registerOnTouched(function () { return control.markAsTouched(); });
  20096. }
  20097. exports.setUpControl = setUpControl;
  20098. function setUpControlGroup(control, dir) {
  20099. if (lang_1.isBlank(control))
  20100. _throwError(dir, "Cannot find control");
  20101. control.validator = validators_1.Validators.compose([control.validator, dir.validator]);
  20102. control.asyncValidator = validators_1.Validators.composeAsync([control.asyncValidator, dir.asyncValidator]);
  20103. }
  20104. exports.setUpControlGroup = setUpControlGroup;
  20105. function _throwError(dir, message) {
  20106. var path = dir.path.join(" -> ");
  20107. throw new exceptions_1.BaseException(message + " '" + path + "'");
  20108. }
  20109. function composeValidators(validators) {
  20110. return lang_1.isPresent(validators) ? validators_1.Validators.compose(validators.map(normalize_validator_1.normalizeValidator)) : null;
  20111. }
  20112. exports.composeValidators = composeValidators;
  20113. function composeAsyncValidators(validators) {
  20114. return lang_1.isPresent(validators) ? validators_1.Validators.composeAsync(validators.map(normalize_validator_1.normalizeValidator)) : null;
  20115. }
  20116. exports.composeAsyncValidators = composeAsyncValidators;
  20117. function isPropertyUpdated(changes, viewModel) {
  20118. if (!collection_1.StringMapWrapper.contains(changes, "model"))
  20119. return false;
  20120. var change = changes["model"];
  20121. if (change.isFirstChange())
  20122. return true;
  20123. return !lang_1.looseIdentical(viewModel, change.currentValue);
  20124. }
  20125. exports.isPropertyUpdated = isPropertyUpdated;
  20126. // TODO: vsavkin remove it once https://github.com/angular/angular/issues/3011 is implemented
  20127. function selectValueAccessor(dir, valueAccessors) {
  20128. if (lang_1.isBlank(valueAccessors))
  20129. return null;
  20130. var defaultAccessor;
  20131. var builtinAccessor;
  20132. var customAccessor;
  20133. valueAccessors.forEach(function (v) {
  20134. if (v instanceof default_value_accessor_1.DefaultValueAccessor) {
  20135. defaultAccessor = v;
  20136. }
  20137. else if (v instanceof checkbox_value_accessor_1.CheckboxControlValueAccessor || v instanceof number_value_accessor_1.NumberValueAccessor ||
  20138. v instanceof select_control_value_accessor_1.SelectControlValueAccessor) {
  20139. if (lang_1.isPresent(builtinAccessor))
  20140. _throwError(dir, "More than one built-in value accessor matches");
  20141. builtinAccessor = v;
  20142. }
  20143. else {
  20144. if (lang_1.isPresent(customAccessor))
  20145. _throwError(dir, "More than one custom value accessor matches");
  20146. customAccessor = v;
  20147. }
  20148. });
  20149. if (lang_1.isPresent(customAccessor))
  20150. return customAccessor;
  20151. if (lang_1.isPresent(builtinAccessor))
  20152. return builtinAccessor;
  20153. if (lang_1.isPresent(defaultAccessor))
  20154. return defaultAccessor;
  20155. _throwError(dir, "No valid value accessor for");
  20156. return null;
  20157. }
  20158. exports.selectValueAccessor = selectValueAccessor;
  20159. /***/ },
  20160. /* 131 */
  20161. /***/ function(module, exports, __webpack_require__) {
  20162. var lang_1 = __webpack_require__(5);
  20163. var promise_1 = __webpack_require__(61);
  20164. var async_1 = __webpack_require__(60);
  20165. var collection_1 = __webpack_require__(12);
  20166. var core_1 = __webpack_require__(2);
  20167. /**
  20168. * Providers for validators to be used for {@link Control}s in a form.
  20169. *
  20170. * Provide this using `multi: true` to add validators.
  20171. *
  20172. * ### Example
  20173. *
  20174. * {@example core/forms/ts/ng_validators/ng_validators.ts region='ng_validators'}
  20175. */
  20176. exports.NG_VALIDATORS = lang_1.CONST_EXPR(new core_1.OpaqueToken("NgValidators"));
  20177. /**
  20178. * Providers for asynchronous validators to be used for {@link Control}s
  20179. * in a form.
  20180. *
  20181. * Provide this using `multi: true` to add validators.
  20182. *
  20183. * See {@link NG_VALIDATORS} for more details.
  20184. */
  20185. exports.NG_ASYNC_VALIDATORS = lang_1.CONST_EXPR(new core_1.OpaqueToken("NgAsyncValidators"));
  20186. /**
  20187. * Provides a set of validators used by form controls.
  20188. *
  20189. * A validator is a function that processes a {@link Control} or collection of
  20190. * controls and returns a map of errors. A null map means that validation has passed.
  20191. *
  20192. * ### Example
  20193. *
  20194. * ```typescript
  20195. * var loginControl = new Control("", Validators.required)
  20196. * ```
  20197. */
  20198. var Validators = (function () {
  20199. function Validators() {
  20200. }
  20201. /**
  20202. * Validator that requires controls to have a non-empty value.
  20203. */
  20204. Validators.required = function (control) {
  20205. return lang_1.isBlank(control.value) || control.value == "" ? { "required": true } : null;
  20206. };
  20207. /**
  20208. * Validator that requires controls to have a value of a minimum length.
  20209. */
  20210. Validators.minLength = function (minLength) {
  20211. return function (control) {
  20212. if (lang_1.isPresent(Validators.required(control)))
  20213. return null;
  20214. var v = control.value;
  20215. return v.length < minLength ?
  20216. { "minlength": { "requiredLength": minLength, "actualLength": v.length } } :
  20217. null;
  20218. };
  20219. };
  20220. /**
  20221. * Validator that requires controls to have a value of a maximum length.
  20222. */
  20223. Validators.maxLength = function (maxLength) {
  20224. return function (control) {
  20225. if (lang_1.isPresent(Validators.required(control)))
  20226. return null;
  20227. var v = control.value;
  20228. return v.length > maxLength ?
  20229. { "maxlength": { "requiredLength": maxLength, "actualLength": v.length } } :
  20230. null;
  20231. };
  20232. };
  20233. /**
  20234. * No-op validator.
  20235. */
  20236. Validators.nullValidator = function (c) { return null; };
  20237. /**
  20238. * Compose multiple validators into a single function that returns the union
  20239. * of the individual error maps.
  20240. */
  20241. Validators.compose = function (validators) {
  20242. if (lang_1.isBlank(validators))
  20243. return null;
  20244. var presentValidators = validators.filter(lang_1.isPresent);
  20245. if (presentValidators.length == 0)
  20246. return null;
  20247. return function (control) {
  20248. return _mergeErrors(_executeValidators(control, presentValidators));
  20249. };
  20250. };
  20251. Validators.composeAsync = function (validators) {
  20252. if (lang_1.isBlank(validators))
  20253. return null;
  20254. var presentValidators = validators.filter(lang_1.isPresent);
  20255. if (presentValidators.length == 0)
  20256. return null;
  20257. return function (control) {
  20258. var promises = _executeValidators(control, presentValidators).map(_convertToPromise);
  20259. return promise_1.PromiseWrapper.all(promises).then(_mergeErrors);
  20260. };
  20261. };
  20262. return Validators;
  20263. })();
  20264. exports.Validators = Validators;
  20265. function _convertToPromise(obj) {
  20266. return promise_1.PromiseWrapper.isPromise(obj) ? obj : async_1.ObservableWrapper.toPromise(obj);
  20267. }
  20268. function _executeValidators(control, validators) {
  20269. return validators.map(function (v) { return v(control); });
  20270. }
  20271. function _mergeErrors(arrayOfErrors) {
  20272. var res = arrayOfErrors.reduce(function (res, errors) {
  20273. return lang_1.isPresent(errors) ? collection_1.StringMapWrapper.merge(res, errors) : res;
  20274. }, {});
  20275. return collection_1.StringMapWrapper.isEmpty(res) ? null : res;
  20276. }
  20277. /***/ },
  20278. /* 132 */
  20279. /***/ function(module, exports, __webpack_require__) {
  20280. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  20281. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  20282. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  20283. 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;
  20284. return c > 3 && r && Object.defineProperty(target, key, r), r;
  20285. };
  20286. var __metadata = (this && this.__metadata) || function (k, v) {
  20287. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  20288. };
  20289. var core_1 = __webpack_require__(2);
  20290. var control_value_accessor_1 = __webpack_require__(129);
  20291. var lang_1 = __webpack_require__(5);
  20292. 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 }));
  20293. /**
  20294. * The default accessor for writing a value and listening to changes that is used by the
  20295. * {@link NgModel}, {@link NgFormControl}, and {@link NgControlName} directives.
  20296. *
  20297. * ### Example
  20298. * ```
  20299. * <input type="text" ngControl="searchQuery">
  20300. * ```
  20301. */
  20302. var DefaultValueAccessor = (function () {
  20303. function DefaultValueAccessor(_renderer, _elementRef) {
  20304. this._renderer = _renderer;
  20305. this._elementRef = _elementRef;
  20306. this.onChange = function (_) { };
  20307. this.onTouched = function () { };
  20308. }
  20309. DefaultValueAccessor.prototype.writeValue = function (value) {
  20310. var normalizedValue = lang_1.isBlank(value) ? '' : value;
  20311. this._renderer.setElementProperty(this._elementRef, 'value', normalizedValue);
  20312. };
  20313. DefaultValueAccessor.prototype.registerOnChange = function (fn) { this.onChange = fn; };
  20314. DefaultValueAccessor.prototype.registerOnTouched = function (fn) { this.onTouched = fn; };
  20315. DefaultValueAccessor = __decorate([
  20316. core_1.Directive({
  20317. selector: 'input:not([type=checkbox])[ngControl],textarea[ngControl],input:not([type=checkbox])[ngFormControl],textarea[ngFormControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]',
  20318. // TODO: vsavkin replace the above selector with the one below it once
  20319. // https://github.com/angular/angular/issues/3011 is implemented
  20320. // selector: '[ngControl],[ngModel],[ngFormControl]',
  20321. host: { '(input)': 'onChange($event.target.value)', '(blur)': 'onTouched()' },
  20322. bindings: [DEFAULT_VALUE_ACCESSOR]
  20323. }),
  20324. __metadata('design:paramtypes', [core_1.Renderer, core_1.ElementRef])
  20325. ], DefaultValueAccessor);
  20326. return DefaultValueAccessor;
  20327. })();
  20328. exports.DefaultValueAccessor = DefaultValueAccessor;
  20329. /***/ },
  20330. /* 133 */
  20331. /***/ function(module, exports, __webpack_require__) {
  20332. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  20333. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  20334. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  20335. 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;
  20336. return c > 3 && r && Object.defineProperty(target, key, r), r;
  20337. };
  20338. var __metadata = (this && this.__metadata) || function (k, v) {
  20339. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  20340. };
  20341. var core_1 = __webpack_require__(2);
  20342. var control_value_accessor_1 = __webpack_require__(129);
  20343. var lang_1 = __webpack_require__(5);
  20344. 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 }));
  20345. /**
  20346. * The accessor for writing a number value and listening to changes that is used by the
  20347. * {@link NgModel}, {@link NgFormControl}, and {@link NgControlName} directives.
  20348. *
  20349. * ### Example
  20350. * ```
  20351. * <input type="number" [(ngModel)]="age">
  20352. * ```
  20353. */
  20354. var NumberValueAccessor = (function () {
  20355. function NumberValueAccessor(_renderer, _elementRef) {
  20356. this._renderer = _renderer;
  20357. this._elementRef = _elementRef;
  20358. this.onChange = function (_) { };
  20359. this.onTouched = function () { };
  20360. }
  20361. NumberValueAccessor.prototype.writeValue = function (value) {
  20362. this._renderer.setElementProperty(this._elementRef, 'value', value);
  20363. };
  20364. NumberValueAccessor.prototype.registerOnChange = function (fn) {
  20365. this.onChange = function (value) { fn(lang_1.NumberWrapper.parseFloat(value)); };
  20366. };
  20367. NumberValueAccessor.prototype.registerOnTouched = function (fn) { this.onTouched = fn; };
  20368. NumberValueAccessor = __decorate([
  20369. core_1.Directive({
  20370. selector: 'input[type=number][ngControl],input[type=number][ngFormControl],input[type=number][ngModel]',
  20371. host: {
  20372. '(change)': 'onChange($event.target.value)',
  20373. '(input)': 'onChange($event.target.value)',
  20374. '(blur)': 'onTouched()'
  20375. },
  20376. bindings: [NUMBER_VALUE_ACCESSOR]
  20377. }),
  20378. __metadata('design:paramtypes', [core_1.Renderer, core_1.ElementRef])
  20379. ], NumberValueAccessor);
  20380. return NumberValueAccessor;
  20381. })();
  20382. exports.NumberValueAccessor = NumberValueAccessor;
  20383. /***/ },
  20384. /* 134 */
  20385. /***/ function(module, exports, __webpack_require__) {
  20386. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  20387. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  20388. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  20389. 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;
  20390. return c > 3 && r && Object.defineProperty(target, key, r), r;
  20391. };
  20392. var __metadata = (this && this.__metadata) || function (k, v) {
  20393. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  20394. };
  20395. var core_1 = __webpack_require__(2);
  20396. var control_value_accessor_1 = __webpack_require__(129);
  20397. var lang_1 = __webpack_require__(5);
  20398. 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 }));
  20399. /**
  20400. * The accessor for writing a value and listening to changes on a checkbox input element.
  20401. *
  20402. * ### Example
  20403. * ```
  20404. * <input type="checkbox" ngControl="rememberLogin">
  20405. * ```
  20406. */
  20407. var CheckboxControlValueAccessor = (function () {
  20408. function CheckboxControlValueAccessor(_renderer, _elementRef) {
  20409. this._renderer = _renderer;
  20410. this._elementRef = _elementRef;
  20411. this.onChange = function (_) { };
  20412. this.onTouched = function () { };
  20413. }
  20414. CheckboxControlValueAccessor.prototype.writeValue = function (value) {
  20415. this._renderer.setElementProperty(this._elementRef, 'checked', value);
  20416. };
  20417. CheckboxControlValueAccessor.prototype.registerOnChange = function (fn) { this.onChange = fn; };
  20418. CheckboxControlValueAccessor.prototype.registerOnTouched = function (fn) { this.onTouched = fn; };
  20419. CheckboxControlValueAccessor = __decorate([
  20420. core_1.Directive({
  20421. selector: 'input[type=checkbox][ngControl],input[type=checkbox][ngFormControl],input[type=checkbox][ngModel]',
  20422. host: { '(change)': 'onChange($event.target.checked)', '(blur)': 'onTouched()' },
  20423. bindings: [CHECKBOX_VALUE_ACCESSOR]
  20424. }),
  20425. __metadata('design:paramtypes', [core_1.Renderer, core_1.ElementRef])
  20426. ], CheckboxControlValueAccessor);
  20427. return CheckboxControlValueAccessor;
  20428. })();
  20429. exports.CheckboxControlValueAccessor = CheckboxControlValueAccessor;
  20430. /***/ },
  20431. /* 135 */
  20432. /***/ function(module, exports, __webpack_require__) {
  20433. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  20434. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  20435. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  20436. 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;
  20437. return c > 3 && r && Object.defineProperty(target, key, r), r;
  20438. };
  20439. var __metadata = (this && this.__metadata) || function (k, v) {
  20440. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  20441. };
  20442. var __param = (this && this.__param) || function (paramIndex, decorator) {
  20443. return function (target, key) { decorator(target, key, paramIndex); }
  20444. };
  20445. var core_1 = __webpack_require__(2);
  20446. var async_1 = __webpack_require__(60);
  20447. var control_value_accessor_1 = __webpack_require__(129);
  20448. var lang_1 = __webpack_require__(5);
  20449. 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 }));
  20450. /**
  20451. * Marks `<option>` as dynamic, so Angular can be notified when options change.
  20452. *
  20453. * ### Example
  20454. *
  20455. * ```
  20456. * <select ngControl="city">
  20457. * <option *ngFor="#c of cities" [value]="c"></option>
  20458. * </select>
  20459. * ```
  20460. */
  20461. var NgSelectOption = (function () {
  20462. function NgSelectOption() {
  20463. }
  20464. NgSelectOption = __decorate([
  20465. core_1.Directive({ selector: 'option' }),
  20466. __metadata('design:paramtypes', [])
  20467. ], NgSelectOption);
  20468. return NgSelectOption;
  20469. })();
  20470. exports.NgSelectOption = NgSelectOption;
  20471. /**
  20472. * The accessor for writing a value and listening to changes on a select element.
  20473. */
  20474. var SelectControlValueAccessor = (function () {
  20475. function SelectControlValueAccessor(_renderer, _elementRef, query) {
  20476. this._renderer = _renderer;
  20477. this._elementRef = _elementRef;
  20478. this.onChange = function (_) { };
  20479. this.onTouched = function () { };
  20480. this._updateValueWhenListOfOptionsChanges(query);
  20481. }
  20482. SelectControlValueAccessor.prototype.writeValue = function (value) {
  20483. this.value = value;
  20484. this._renderer.setElementProperty(this._elementRef, 'value', value);
  20485. };
  20486. SelectControlValueAccessor.prototype.registerOnChange = function (fn) { this.onChange = fn; };
  20487. SelectControlValueAccessor.prototype.registerOnTouched = function (fn) { this.onTouched = fn; };
  20488. SelectControlValueAccessor.prototype._updateValueWhenListOfOptionsChanges = function (query) {
  20489. var _this = this;
  20490. async_1.ObservableWrapper.subscribe(query.changes, function (_) { return _this.writeValue(_this.value); });
  20491. };
  20492. SelectControlValueAccessor = __decorate([
  20493. core_1.Directive({
  20494. selector: 'select[ngControl],select[ngFormControl],select[ngModel]',
  20495. host: {
  20496. '(change)': 'onChange($event.target.value)',
  20497. '(input)': 'onChange($event.target.value)',
  20498. '(blur)': 'onTouched()'
  20499. },
  20500. bindings: [SELECT_VALUE_ACCESSOR]
  20501. }),
  20502. __param(2, core_1.Query(NgSelectOption, { descendants: true })),
  20503. __metadata('design:paramtypes', [core_1.Renderer, core_1.ElementRef, core_1.QueryList])
  20504. ], SelectControlValueAccessor);
  20505. return SelectControlValueAccessor;
  20506. })();
  20507. exports.SelectControlValueAccessor = SelectControlValueAccessor;
  20508. /***/ },
  20509. /* 136 */
  20510. /***/ function(module, exports) {
  20511. function normalizeValidator(validator) {
  20512. if (validator.validate !== undefined) {
  20513. return function (c) { return validator.validate(c); };
  20514. }
  20515. else {
  20516. return validator;
  20517. }
  20518. }
  20519. exports.normalizeValidator = normalizeValidator;
  20520. /***/ },
  20521. /* 137 */
  20522. /***/ function(module, exports, __webpack_require__) {
  20523. var __extends = (this && this.__extends) || function (d, b) {
  20524. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  20525. function __() { this.constructor = d; }
  20526. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  20527. };
  20528. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  20529. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  20530. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  20531. 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;
  20532. return c > 3 && r && Object.defineProperty(target, key, r), r;
  20533. };
  20534. var __metadata = (this && this.__metadata) || function (k, v) {
  20535. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  20536. };
  20537. var __param = (this && this.__param) || function (paramIndex, decorator) {
  20538. return function (target, key) { decorator(target, key, paramIndex); }
  20539. };
  20540. var lang_1 = __webpack_require__(5);
  20541. var collection_1 = __webpack_require__(12);
  20542. var async_1 = __webpack_require__(60);
  20543. var core_1 = __webpack_require__(2);
  20544. var ng_control_1 = __webpack_require__(128);
  20545. var validators_1 = __webpack_require__(131);
  20546. var control_value_accessor_1 = __webpack_require__(129);
  20547. var shared_1 = __webpack_require__(130);
  20548. var formControlBinding = lang_1.CONST_EXPR(new core_1.Provider(ng_control_1.NgControl, { useExisting: core_1.forwardRef(function () { return NgFormControl; }) }));
  20549. /**
  20550. * Binds an existing {@link Control} to a DOM element.
  20551. *
  20552. * ### Example ([live demo](http://plnkr.co/edit/jcQlZ2tTh22BZZ2ucNAT?p=preview))
  20553. *
  20554. * In this example, we bind the control to an input element. When the value of the input element
  20555. * changes, the value of the control will reflect that change. Likewise, if the value of the
  20556. * control changes, the input element reflects that change.
  20557. *
  20558. * ```typescript
  20559. * @Component({
  20560. * selector: 'my-app',
  20561. * template: `
  20562. * <div>
  20563. * <h2>NgFormControl Example</h2>
  20564. * <form>
  20565. * <p>Element with existing control: <input type="text"
  20566. * [ngFormControl]="loginControl"></p>
  20567. * <p>Value of existing control: {{loginControl.value}}</p>
  20568. * </form>
  20569. * </div>
  20570. * `,
  20571. * directives: [CORE_DIRECTIVES, FORM_DIRECTIVES]
  20572. * })
  20573. * export class App {
  20574. * loginControl: Control = new Control('');
  20575. * }
  20576. * ```
  20577. *
  20578. * ###ngModel
  20579. *
  20580. * We can also use `ngModel` to bind a domain model to the form.
  20581. *
  20582. * ### Example ([live demo](http://plnkr.co/edit/yHMLuHO7DNgT8XvtjTDH?p=preview))
  20583. *
  20584. * ```typescript
  20585. * @Component({
  20586. * selector: "login-comp",
  20587. * directives: [FORM_DIRECTIVES],
  20588. * template: "<input type='text' [ngFormControl]='loginControl' [(ngModel)]='login'>"
  20589. * })
  20590. * class LoginComp {
  20591. * loginControl: Control = new Control('');
  20592. * login:string;
  20593. * }
  20594. * ```
  20595. */
  20596. var NgFormControl = (function (_super) {
  20597. __extends(NgFormControl, _super);
  20598. function NgFormControl(_validators, _asyncValidators, valueAccessors) {
  20599. _super.call(this);
  20600. this._validators = _validators;
  20601. this._asyncValidators = _asyncValidators;
  20602. this.update = new async_1.EventEmitter();
  20603. this.valueAccessor = shared_1.selectValueAccessor(this, valueAccessors);
  20604. }
  20605. NgFormControl.prototype.ngOnChanges = function (changes) {
  20606. if (this._isControlChanged(changes)) {
  20607. shared_1.setUpControl(this.form, this);
  20608. this.form.updateValueAndValidity({ emitEvent: false });
  20609. }
  20610. if (shared_1.isPropertyUpdated(changes, this.viewModel)) {
  20611. this.form.updateValue(this.model);
  20612. this.viewModel = this.model;
  20613. }
  20614. };
  20615. Object.defineProperty(NgFormControl.prototype, "path", {
  20616. get: function () { return []; },
  20617. enumerable: true,
  20618. configurable: true
  20619. });
  20620. Object.defineProperty(NgFormControl.prototype, "validator", {
  20621. get: function () { return shared_1.composeValidators(this._validators); },
  20622. enumerable: true,
  20623. configurable: true
  20624. });
  20625. Object.defineProperty(NgFormControl.prototype, "asyncValidator", {
  20626. get: function () { return shared_1.composeAsyncValidators(this._asyncValidators); },
  20627. enumerable: true,
  20628. configurable: true
  20629. });
  20630. Object.defineProperty(NgFormControl.prototype, "control", {
  20631. get: function () { return this.form; },
  20632. enumerable: true,
  20633. configurable: true
  20634. });
  20635. NgFormControl.prototype.viewToModelUpdate = function (newValue) {
  20636. this.viewModel = newValue;
  20637. async_1.ObservableWrapper.callEmit(this.update, newValue);
  20638. };
  20639. NgFormControl.prototype._isControlChanged = function (changes) {
  20640. return collection_1.StringMapWrapper.contains(changes, "form");
  20641. };
  20642. NgFormControl = __decorate([
  20643. core_1.Directive({
  20644. selector: '[ngFormControl]',
  20645. bindings: [formControlBinding],
  20646. inputs: ['form: ngFormControl', 'model: ngModel'],
  20647. outputs: ['update: ngModelChange'],
  20648. exportAs: 'ngForm'
  20649. }),
  20650. __param(0, core_1.Optional()),
  20651. __param(0, core_1.Self()),
  20652. __param(0, core_1.Inject(validators_1.NG_VALIDATORS)),
  20653. __param(1, core_1.Optional()),
  20654. __param(1, core_1.Self()),
  20655. __param(1, core_1.Inject(validators_1.NG_ASYNC_VALIDATORS)),
  20656. __param(2, core_1.Optional()),
  20657. __param(2, core_1.Self()),
  20658. __param(2, core_1.Inject(control_value_accessor_1.NG_VALUE_ACCESSOR)),
  20659. __metadata('design:paramtypes', [Array, Array, Array])
  20660. ], NgFormControl);
  20661. return NgFormControl;
  20662. })(ng_control_1.NgControl);
  20663. exports.NgFormControl = NgFormControl;
  20664. /***/ },
  20665. /* 138 */
  20666. /***/ function(module, exports, __webpack_require__) {
  20667. var __extends = (this && this.__extends) || function (d, b) {
  20668. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  20669. function __() { this.constructor = d; }
  20670. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  20671. };
  20672. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  20673. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  20674. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  20675. 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;
  20676. return c > 3 && r && Object.defineProperty(target, key, r), r;
  20677. };
  20678. var __metadata = (this && this.__metadata) || function (k, v) {
  20679. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  20680. };
  20681. var __param = (this && this.__param) || function (paramIndex, decorator) {
  20682. return function (target, key) { decorator(target, key, paramIndex); }
  20683. };
  20684. var lang_1 = __webpack_require__(5);
  20685. var async_1 = __webpack_require__(60);
  20686. var core_1 = __webpack_require__(2);
  20687. var control_value_accessor_1 = __webpack_require__(129);
  20688. var ng_control_1 = __webpack_require__(128);
  20689. var model_1 = __webpack_require__(124);
  20690. var validators_1 = __webpack_require__(131);
  20691. var shared_1 = __webpack_require__(130);
  20692. var formControlBinding = lang_1.CONST_EXPR(new core_1.Provider(ng_control_1.NgControl, { useExisting: core_1.forwardRef(function () { return NgModel; }) }));
  20693. /**
  20694. * Binds a domain model to a form control.
  20695. *
  20696. * ### Usage
  20697. *
  20698. * `ngModel` binds an existing domain model to a form control. For a
  20699. * two-way binding, use `[(ngModel)]` to ensure the model updates in
  20700. * both directions.
  20701. *
  20702. * ### Example ([live demo](http://plnkr.co/edit/R3UX5qDaUqFO2VYR0UzH?p=preview))
  20703. * ```typescript
  20704. * @Component({
  20705. * selector: "search-comp",
  20706. * directives: [FORM_DIRECTIVES],
  20707. * template: `<input type='text' [(ngModel)]="searchQuery">`
  20708. * })
  20709. * class SearchComp {
  20710. * searchQuery: string;
  20711. * }
  20712. * ```
  20713. */
  20714. var NgModel = (function (_super) {
  20715. __extends(NgModel, _super);
  20716. function NgModel(_validators, _asyncValidators, valueAccessors) {
  20717. _super.call(this);
  20718. this._validators = _validators;
  20719. this._asyncValidators = _asyncValidators;
  20720. /** @internal */
  20721. this._control = new model_1.Control();
  20722. /** @internal */
  20723. this._added = false;
  20724. this.update = new async_1.EventEmitter();
  20725. this.valueAccessor = shared_1.selectValueAccessor(this, valueAccessors);
  20726. }
  20727. NgModel.prototype.ngOnChanges = function (changes) {
  20728. if (!this._added) {
  20729. shared_1.setUpControl(this._control, this);
  20730. this._control.updateValueAndValidity({ emitEvent: false });
  20731. this._added = true;
  20732. }
  20733. if (shared_1.isPropertyUpdated(changes, this.viewModel)) {
  20734. this._control.updateValue(this.model);
  20735. this.viewModel = this.model;
  20736. }
  20737. };
  20738. Object.defineProperty(NgModel.prototype, "control", {
  20739. get: function () { return this._control; },
  20740. enumerable: true,
  20741. configurable: true
  20742. });
  20743. Object.defineProperty(NgModel.prototype, "path", {
  20744. get: function () { return []; },
  20745. enumerable: true,
  20746. configurable: true
  20747. });
  20748. Object.defineProperty(NgModel.prototype, "validator", {
  20749. get: function () { return shared_1.composeValidators(this._validators); },
  20750. enumerable: true,
  20751. configurable: true
  20752. });
  20753. Object.defineProperty(NgModel.prototype, "asyncValidator", {
  20754. get: function () { return shared_1.composeAsyncValidators(this._asyncValidators); },
  20755. enumerable: true,
  20756. configurable: true
  20757. });
  20758. NgModel.prototype.viewToModelUpdate = function (newValue) {
  20759. this.viewModel = newValue;
  20760. async_1.ObservableWrapper.callEmit(this.update, newValue);
  20761. };
  20762. NgModel = __decorate([
  20763. core_1.Directive({
  20764. selector: '[ngModel]:not([ngControl]):not([ngFormControl])',
  20765. bindings: [formControlBinding],
  20766. inputs: ['model: ngModel'],
  20767. outputs: ['update: ngModelChange'],
  20768. exportAs: 'ngForm'
  20769. }),
  20770. __param(0, core_1.Optional()),
  20771. __param(0, core_1.Self()),
  20772. __param(0, core_1.Inject(validators_1.NG_VALIDATORS)),
  20773. __param(1, core_1.Optional()),
  20774. __param(1, core_1.Self()),
  20775. __param(1, core_1.Inject(validators_1.NG_ASYNC_VALIDATORS)),
  20776. __param(2, core_1.Optional()),
  20777. __param(2, core_1.Self()),
  20778. __param(2, core_1.Inject(control_value_accessor_1.NG_VALUE_ACCESSOR)),
  20779. __metadata('design:paramtypes', [Array, Array, Array])
  20780. ], NgModel);
  20781. return NgModel;
  20782. })(ng_control_1.NgControl);
  20783. exports.NgModel = NgModel;
  20784. /***/ },
  20785. /* 139 */
  20786. /***/ function(module, exports, __webpack_require__) {
  20787. var __extends = (this && this.__extends) || function (d, b) {
  20788. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  20789. function __() { this.constructor = d; }
  20790. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  20791. };
  20792. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  20793. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  20794. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  20795. 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;
  20796. return c > 3 && r && Object.defineProperty(target, key, r), r;
  20797. };
  20798. var __metadata = (this && this.__metadata) || function (k, v) {
  20799. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  20800. };
  20801. var __param = (this && this.__param) || function (paramIndex, decorator) {
  20802. return function (target, key) { decorator(target, key, paramIndex); }
  20803. };
  20804. var core_1 = __webpack_require__(2);
  20805. var lang_1 = __webpack_require__(5);
  20806. var control_container_1 = __webpack_require__(126);
  20807. var shared_1 = __webpack_require__(130);
  20808. var validators_1 = __webpack_require__(131);
  20809. var controlGroupProvider = lang_1.CONST_EXPR(new core_1.Provider(control_container_1.ControlContainer, { useExisting: core_1.forwardRef(function () { return NgControlGroup; }) }));
  20810. /**
  20811. * Creates and binds a control group to a DOM element.
  20812. *
  20813. * This directive can only be used as a child of {@link NgForm} or {@link NgFormModel}.
  20814. *
  20815. * ### Example ([live demo](http://plnkr.co/edit/7EJ11uGeaggViYM6T5nq?p=preview))
  20816. *
  20817. * ```typescript
  20818. * @Component({
  20819. * selector: 'my-app',
  20820. * directives: [FORM_DIRECTIVES],
  20821. * })
  20822. * @View({
  20823. * template: `
  20824. * <div>
  20825. * <h2>Angular2 Control &amp; ControlGroup Example</h2>
  20826. * <form #f="ngForm">
  20827. * <div ngControlGroup="name" #cg-name="form">
  20828. * <h3>Enter your name:</h3>
  20829. * <p>First: <input ngControl="first" required></p>
  20830. * <p>Middle: <input ngControl="middle"></p>
  20831. * <p>Last: <input ngControl="last" required></p>
  20832. * </div>
  20833. * <h3>Name value:</h3>
  20834. * <pre>{{valueOf(cgName)}}</pre>
  20835. * <p>Name is {{cgName?.control?.valid ? "valid" : "invalid"}}</p>
  20836. * <h3>What's your favorite food?</h3>
  20837. * <p><input ngControl="food"></p>
  20838. * <h3>Form value</h3>
  20839. * <pre>{{valueOf(f)}}</pre>
  20840. * </form>
  20841. * </div>
  20842. * `,
  20843. * directives: [FORM_DIRECTIVES]
  20844. * })
  20845. * export class App {
  20846. * valueOf(cg: NgControlGroup): string {
  20847. * if (cg.control == null) {
  20848. * return null;
  20849. * }
  20850. * return JSON.stringify(cg.control.value, null, 2);
  20851. * }
  20852. * }
  20853. * ```
  20854. *
  20855. * This example declares a control group for a user's name. The value and validation state of
  20856. * this group can be accessed separately from the overall form.
  20857. */
  20858. var NgControlGroup = (function (_super) {
  20859. __extends(NgControlGroup, _super);
  20860. function NgControlGroup(parent, _validators, _asyncValidators) {
  20861. _super.call(this);
  20862. this._validators = _validators;
  20863. this._asyncValidators = _asyncValidators;
  20864. this._parent = parent;
  20865. }
  20866. NgControlGroup.prototype.ngOnInit = function () { this.formDirective.addControlGroup(this); };
  20867. NgControlGroup.prototype.ngOnDestroy = function () { this.formDirective.removeControlGroup(this); };
  20868. Object.defineProperty(NgControlGroup.prototype, "control", {
  20869. /**
  20870. * Get the {@link ControlGroup} backing this binding.
  20871. */
  20872. get: function () { return this.formDirective.getControlGroup(this); },
  20873. enumerable: true,
  20874. configurable: true
  20875. });
  20876. Object.defineProperty(NgControlGroup.prototype, "path", {
  20877. /**
  20878. * Get the path to this control group.
  20879. */
  20880. get: function () { return shared_1.controlPath(this.name, this._parent); },
  20881. enumerable: true,
  20882. configurable: true
  20883. });
  20884. Object.defineProperty(NgControlGroup.prototype, "formDirective", {
  20885. /**
  20886. * Get the {@link Form} to which this group belongs.
  20887. */
  20888. get: function () { return this._parent.formDirective; },
  20889. enumerable: true,
  20890. configurable: true
  20891. });
  20892. Object.defineProperty(NgControlGroup.prototype, "validator", {
  20893. get: function () { return shared_1.composeValidators(this._validators); },
  20894. enumerable: true,
  20895. configurable: true
  20896. });
  20897. Object.defineProperty(NgControlGroup.prototype, "asyncValidator", {
  20898. get: function () { return shared_1.composeAsyncValidators(this._asyncValidators); },
  20899. enumerable: true,
  20900. configurable: true
  20901. });
  20902. NgControlGroup = __decorate([
  20903. core_1.Directive({
  20904. selector: '[ngControlGroup]',
  20905. providers: [controlGroupProvider],
  20906. inputs: ['name: ngControlGroup'],
  20907. exportAs: 'ngForm'
  20908. }),
  20909. __param(0, core_1.Host()),
  20910. __param(0, core_1.SkipSelf()),
  20911. __param(1, core_1.Optional()),
  20912. __param(1, core_1.Self()),
  20913. __param(1, core_1.Inject(validators_1.NG_VALIDATORS)),
  20914. __param(2, core_1.Optional()),
  20915. __param(2, core_1.Self()),
  20916. __param(2, core_1.Inject(validators_1.NG_ASYNC_VALIDATORS)),
  20917. __metadata('design:paramtypes', [control_container_1.ControlContainer, Array, Array])
  20918. ], NgControlGroup);
  20919. return NgControlGroup;
  20920. })(control_container_1.ControlContainer);
  20921. exports.NgControlGroup = NgControlGroup;
  20922. /***/ },
  20923. /* 140 */
  20924. /***/ function(module, exports, __webpack_require__) {
  20925. var __extends = (this && this.__extends) || function (d, b) {
  20926. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  20927. function __() { this.constructor = d; }
  20928. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  20929. };
  20930. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  20931. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  20932. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  20933. 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;
  20934. return c > 3 && r && Object.defineProperty(target, key, r), r;
  20935. };
  20936. var __metadata = (this && this.__metadata) || function (k, v) {
  20937. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  20938. };
  20939. var __param = (this && this.__param) || function (paramIndex, decorator) {
  20940. return function (target, key) { decorator(target, key, paramIndex); }
  20941. };
  20942. var lang_1 = __webpack_require__(5);
  20943. var collection_1 = __webpack_require__(12);
  20944. var async_1 = __webpack_require__(60);
  20945. var core_1 = __webpack_require__(2);
  20946. var control_container_1 = __webpack_require__(126);
  20947. var shared_1 = __webpack_require__(130);
  20948. var validators_1 = __webpack_require__(131);
  20949. var formDirectiveProvider = lang_1.CONST_EXPR(new core_1.Provider(control_container_1.ControlContainer, { useExisting: core_1.forwardRef(function () { return NgFormModel; }) }));
  20950. /**
  20951. * Binds an existing control group to a DOM element.
  20952. *
  20953. * ### Example ([live demo](http://plnkr.co/edit/jqrVirudY8anJxTMUjTP?p=preview))
  20954. *
  20955. * In this example, we bind the control group to the form element, and we bind the login and
  20956. * password controls to the login and password elements.
  20957. *
  20958. * ```typescript
  20959. * @Component({
  20960. * selector: 'my-app',
  20961. * template: `
  20962. * <div>
  20963. * <h2>NgFormModel Example</h2>
  20964. * <form [ngFormModel]="loginForm">
  20965. * <p>Login: <input type="text" ngControl="login"></p>
  20966. * <p>Password: <input type="password" ngControl="password"></p>
  20967. * </form>
  20968. * <p>Value:</p>
  20969. * <pre>{{value}}</pre>
  20970. * </div>
  20971. * `,
  20972. * directives: [FORM_DIRECTIVES]
  20973. * })
  20974. * export class App {
  20975. * loginForm: ControlGroup;
  20976. *
  20977. * constructor() {
  20978. * this.loginForm = new ControlGroup({
  20979. * login: new Control(""),
  20980. * password: new Control("")
  20981. * });
  20982. * }
  20983. *
  20984. * get value(): string {
  20985. * return JSON.stringify(this.loginForm.value, null, 2);
  20986. * }
  20987. * }
  20988. * ```
  20989. *
  20990. * We can also use ngModel to bind a domain model to the form.
  20991. *
  20992. * ```typescript
  20993. * @Component({
  20994. * selector: "login-comp",
  20995. * directives: [FORM_DIRECTIVES],
  20996. * template: `
  20997. * <form [ngFormModel]='loginForm'>
  20998. * Login <input type='text' ngControl='login' [(ngModel)]='credentials.login'>
  20999. * Password <input type='password' ngControl='password'
  21000. * [(ngModel)]='credentials.password'>
  21001. * <button (click)="onLogin()">Login</button>
  21002. * </form>`
  21003. * })
  21004. * class LoginComp {
  21005. * credentials: {login: string, password: string};
  21006. * loginForm: ControlGroup;
  21007. *
  21008. * constructor() {
  21009. * this.loginForm = new ControlGroup({
  21010. * login: new Control(""),
  21011. * password: new Control("")
  21012. * });
  21013. * }
  21014. *
  21015. * onLogin(): void {
  21016. * // this.credentials.login === 'some login'
  21017. * // this.credentials.password === 'some password'
  21018. * }
  21019. * }
  21020. * ```
  21021. */
  21022. var NgFormModel = (function (_super) {
  21023. __extends(NgFormModel, _super);
  21024. function NgFormModel(_validators, _asyncValidators) {
  21025. _super.call(this);
  21026. this._validators = _validators;
  21027. this._asyncValidators = _asyncValidators;
  21028. this.form = null;
  21029. this.directives = [];
  21030. this.ngSubmit = new async_1.EventEmitter();
  21031. }
  21032. NgFormModel.prototype.ngOnChanges = function (changes) {
  21033. if (collection_1.StringMapWrapper.contains(changes, "form")) {
  21034. var sync = shared_1.composeValidators(this._validators);
  21035. this.form.validator = validators_1.Validators.compose([this.form.validator, sync]);
  21036. var async = shared_1.composeAsyncValidators(this._asyncValidators);
  21037. this.form.asyncValidator = validators_1.Validators.composeAsync([this.form.asyncValidator, async]);
  21038. this.form.updateValueAndValidity({ onlySelf: true, emitEvent: false });
  21039. }
  21040. this._updateDomValue();
  21041. };
  21042. Object.defineProperty(NgFormModel.prototype, "formDirective", {
  21043. get: function () { return this; },
  21044. enumerable: true,
  21045. configurable: true
  21046. });
  21047. Object.defineProperty(NgFormModel.prototype, "control", {
  21048. get: function () { return this.form; },
  21049. enumerable: true,
  21050. configurable: true
  21051. });
  21052. Object.defineProperty(NgFormModel.prototype, "path", {
  21053. get: function () { return []; },
  21054. enumerable: true,
  21055. configurable: true
  21056. });
  21057. NgFormModel.prototype.addControl = function (dir) {
  21058. var ctrl = this.form.find(dir.path);
  21059. shared_1.setUpControl(ctrl, dir);
  21060. ctrl.updateValueAndValidity({ emitEvent: false });
  21061. this.directives.push(dir);
  21062. };
  21063. NgFormModel.prototype.getControl = function (dir) { return this.form.find(dir.path); };
  21064. NgFormModel.prototype.removeControl = function (dir) { collection_1.ListWrapper.remove(this.directives, dir); };
  21065. NgFormModel.prototype.addControlGroup = function (dir) {
  21066. var ctrl = this.form.find(dir.path);
  21067. shared_1.setUpControlGroup(ctrl, dir);
  21068. ctrl.updateValueAndValidity({ emitEvent: false });
  21069. };
  21070. NgFormModel.prototype.removeControlGroup = function (dir) { };
  21071. NgFormModel.prototype.getControlGroup = function (dir) {
  21072. return this.form.find(dir.path);
  21073. };
  21074. NgFormModel.prototype.updateModel = function (dir, value) {
  21075. var ctrl = this.form.find(dir.path);
  21076. ctrl.updateValue(value);
  21077. };
  21078. NgFormModel.prototype.onSubmit = function () {
  21079. async_1.ObservableWrapper.callEmit(this.ngSubmit, null);
  21080. return false;
  21081. };
  21082. /** @internal */
  21083. NgFormModel.prototype._updateDomValue = function () {
  21084. var _this = this;
  21085. this.directives.forEach(function (dir) {
  21086. var ctrl = _this.form.find(dir.path);
  21087. dir.valueAccessor.writeValue(ctrl.value);
  21088. });
  21089. };
  21090. NgFormModel = __decorate([
  21091. core_1.Directive({
  21092. selector: '[ngFormModel]',
  21093. bindings: [formDirectiveProvider],
  21094. inputs: ['form: ngFormModel'],
  21095. host: { '(submit)': 'onSubmit()' },
  21096. outputs: ['ngSubmit'],
  21097. exportAs: 'ngForm'
  21098. }),
  21099. __param(0, core_1.Optional()),
  21100. __param(0, core_1.Self()),
  21101. __param(0, core_1.Inject(validators_1.NG_VALIDATORS)),
  21102. __param(1, core_1.Optional()),
  21103. __param(1, core_1.Self()),
  21104. __param(1, core_1.Inject(validators_1.NG_ASYNC_VALIDATORS)),
  21105. __metadata('design:paramtypes', [Array, Array])
  21106. ], NgFormModel);
  21107. return NgFormModel;
  21108. })(control_container_1.ControlContainer);
  21109. exports.NgFormModel = NgFormModel;
  21110. /***/ },
  21111. /* 141 */
  21112. /***/ function(module, exports, __webpack_require__) {
  21113. var __extends = (this && this.__extends) || function (d, b) {
  21114. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  21115. function __() { this.constructor = d; }
  21116. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  21117. };
  21118. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  21119. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  21120. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  21121. 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;
  21122. return c > 3 && r && Object.defineProperty(target, key, r), r;
  21123. };
  21124. var __metadata = (this && this.__metadata) || function (k, v) {
  21125. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  21126. };
  21127. var __param = (this && this.__param) || function (paramIndex, decorator) {
  21128. return function (target, key) { decorator(target, key, paramIndex); }
  21129. };
  21130. var async_1 = __webpack_require__(60);
  21131. var collection_1 = __webpack_require__(12);
  21132. var lang_1 = __webpack_require__(5);
  21133. var core_1 = __webpack_require__(2);
  21134. var control_container_1 = __webpack_require__(126);
  21135. var model_1 = __webpack_require__(124);
  21136. var shared_1 = __webpack_require__(130);
  21137. var validators_1 = __webpack_require__(131);
  21138. var formDirectiveProvider = lang_1.CONST_EXPR(new core_1.Provider(control_container_1.ControlContainer, { useExisting: core_1.forwardRef(function () { return NgForm; }) }));
  21139. /**
  21140. * If `NgForm` is bound in a component, `<form>` elements in that component will be
  21141. * upgraded to use the Angular form system.
  21142. *
  21143. * ### Typical Use
  21144. *
  21145. * Include `FORM_DIRECTIVES` in the `directives` section of a {@link View} annotation
  21146. * to use `NgForm` and its associated controls.
  21147. *
  21148. * ### Structure
  21149. *
  21150. * An Angular form is a collection of `Control`s in some hierarchy.
  21151. * `Control`s can be at the top level or can be organized in `ControlGroup`s
  21152. * or `ControlArray`s. This hierarchy is reflected in the form's `value`, a
  21153. * JSON object that mirrors the form structure.
  21154. *
  21155. * ### Submission
  21156. *
  21157. * The `ngSubmit` event signals when the user triggers a form submission.
  21158. *
  21159. * ### Example ([live demo](http://plnkr.co/edit/ltdgYj4P0iY64AR71EpL?p=preview))
  21160. *
  21161. * ```typescript
  21162. * @Component({
  21163. * selector: 'my-app',
  21164. * template: `
  21165. * <div>
  21166. * <p>Submit the form to see the data object Angular builds</p>
  21167. * <h2>NgForm demo</h2>
  21168. * <form #f="ngForm" (ngSubmit)="onSubmit(f.value)">
  21169. * <h3>Control group: credentials</h3>
  21170. * <div ngControlGroup="credentials">
  21171. * <p>Login: <input type="text" ngControl="login"></p>
  21172. * <p>Password: <input type="password" ngControl="password"></p>
  21173. * </div>
  21174. * <h3>Control group: person</h3>
  21175. * <div ngControlGroup="person">
  21176. * <p>First name: <input type="text" ngControl="firstName"></p>
  21177. * <p>Last name: <input type="text" ngControl="lastName"></p>
  21178. * </div>
  21179. * <button type="submit">Submit Form</button>
  21180. * <p>Form data submitted:</p>
  21181. * </form>
  21182. * <pre>{{data}}</pre>
  21183. * </div>
  21184. * `,
  21185. * directives: [CORE_DIRECTIVES, FORM_DIRECTIVES]
  21186. * })
  21187. * export class App {
  21188. * constructor() {}
  21189. *
  21190. * data: string;
  21191. *
  21192. * onSubmit(data) {
  21193. * this.data = JSON.stringify(data, null, 2);
  21194. * }
  21195. * }
  21196. * ```
  21197. */
  21198. var NgForm = (function (_super) {
  21199. __extends(NgForm, _super);
  21200. function NgForm(validators, asyncValidators) {
  21201. _super.call(this);
  21202. this.ngSubmit = new async_1.EventEmitter();
  21203. this.form = new model_1.ControlGroup({}, null, shared_1.composeValidators(validators), shared_1.composeAsyncValidators(asyncValidators));
  21204. }
  21205. Object.defineProperty(NgForm.prototype, "formDirective", {
  21206. get: function () { return this; },
  21207. enumerable: true,
  21208. configurable: true
  21209. });
  21210. Object.defineProperty(NgForm.prototype, "control", {
  21211. get: function () { return this.form; },
  21212. enumerable: true,
  21213. configurable: true
  21214. });
  21215. Object.defineProperty(NgForm.prototype, "path", {
  21216. get: function () { return []; },
  21217. enumerable: true,
  21218. configurable: true
  21219. });
  21220. Object.defineProperty(NgForm.prototype, "controls", {
  21221. get: function () { return this.form.controls; },
  21222. enumerable: true,
  21223. configurable: true
  21224. });
  21225. NgForm.prototype.addControl = function (dir) {
  21226. var _this = this;
  21227. async_1.PromiseWrapper.scheduleMicrotask(function () {
  21228. var container = _this._findContainer(dir.path);
  21229. var ctrl = new model_1.Control();
  21230. shared_1.setUpControl(ctrl, dir);
  21231. container.addControl(dir.name, ctrl);
  21232. ctrl.updateValueAndValidity({ emitEvent: false });
  21233. });
  21234. };
  21235. NgForm.prototype.getControl = function (dir) { return this.form.find(dir.path); };
  21236. NgForm.prototype.removeControl = function (dir) {
  21237. var _this = this;
  21238. async_1.PromiseWrapper.scheduleMicrotask(function () {
  21239. var container = _this._findContainer(dir.path);
  21240. if (lang_1.isPresent(container)) {
  21241. container.removeControl(dir.name);
  21242. container.updateValueAndValidity({ emitEvent: false });
  21243. }
  21244. });
  21245. };
  21246. NgForm.prototype.addControlGroup = function (dir) {
  21247. var _this = this;
  21248. async_1.PromiseWrapper.scheduleMicrotask(function () {
  21249. var container = _this._findContainer(dir.path);
  21250. var group = new model_1.ControlGroup({});
  21251. shared_1.setUpControlGroup(group, dir);
  21252. container.addControl(dir.name, group);
  21253. group.updateValueAndValidity({ emitEvent: false });
  21254. });
  21255. };
  21256. NgForm.prototype.removeControlGroup = function (dir) {
  21257. var _this = this;
  21258. async_1.PromiseWrapper.scheduleMicrotask(function () {
  21259. var container = _this._findContainer(dir.path);
  21260. if (lang_1.isPresent(container)) {
  21261. container.removeControl(dir.name);
  21262. container.updateValueAndValidity({ emitEvent: false });
  21263. }
  21264. });
  21265. };
  21266. NgForm.prototype.getControlGroup = function (dir) {
  21267. return this.form.find(dir.path);
  21268. };
  21269. NgForm.prototype.updateModel = function (dir, value) {
  21270. var _this = this;
  21271. async_1.PromiseWrapper.scheduleMicrotask(function () {
  21272. var ctrl = _this.form.find(dir.path);
  21273. ctrl.updateValue(value);
  21274. });
  21275. };
  21276. NgForm.prototype.onSubmit = function () {
  21277. async_1.ObservableWrapper.callEmit(this.ngSubmit, null);
  21278. return false;
  21279. };
  21280. /** @internal */
  21281. NgForm.prototype._findContainer = function (path) {
  21282. path.pop();
  21283. return collection_1.ListWrapper.isEmpty(path) ? this.form : this.form.find(path);
  21284. };
  21285. NgForm = __decorate([
  21286. core_1.Directive({
  21287. selector: 'form:not([ngNoForm]):not([ngFormModel]),ngForm,[ngForm]',
  21288. bindings: [formDirectiveProvider],
  21289. host: {
  21290. '(submit)': 'onSubmit()',
  21291. },
  21292. outputs: ['ngSubmit'],
  21293. exportAs: 'ngForm'
  21294. }),
  21295. __param(0, core_1.Optional()),
  21296. __param(0, core_1.Self()),
  21297. __param(0, core_1.Inject(validators_1.NG_VALIDATORS)),
  21298. __param(1, core_1.Optional()),
  21299. __param(1, core_1.Self()),
  21300. __param(1, core_1.Inject(validators_1.NG_ASYNC_VALIDATORS)),
  21301. __metadata('design:paramtypes', [Array, Array])
  21302. ], NgForm);
  21303. return NgForm;
  21304. })(control_container_1.ControlContainer);
  21305. exports.NgForm = NgForm;
  21306. /***/ },
  21307. /* 142 */
  21308. /***/ function(module, exports, __webpack_require__) {
  21309. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  21310. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  21311. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  21312. 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;
  21313. return c > 3 && r && Object.defineProperty(target, key, r), r;
  21314. };
  21315. var __metadata = (this && this.__metadata) || function (k, v) {
  21316. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  21317. };
  21318. var __param = (this && this.__param) || function (paramIndex, decorator) {
  21319. return function (target, key) { decorator(target, key, paramIndex); }
  21320. };
  21321. var core_1 = __webpack_require__(2);
  21322. var ng_control_1 = __webpack_require__(128);
  21323. var lang_1 = __webpack_require__(5);
  21324. /**
  21325. * Directive automatically applied to Angular forms that sets CSS classes
  21326. * based on control status (valid/invalid/dirty/etc).
  21327. */
  21328. var NgControlStatus = (function () {
  21329. function NgControlStatus(cd) {
  21330. this._cd = cd;
  21331. }
  21332. Object.defineProperty(NgControlStatus.prototype, "ngClassUntouched", {
  21333. get: function () {
  21334. return lang_1.isPresent(this._cd.control) ? this._cd.control.untouched : false;
  21335. },
  21336. enumerable: true,
  21337. configurable: true
  21338. });
  21339. Object.defineProperty(NgControlStatus.prototype, "ngClassTouched", {
  21340. get: function () {
  21341. return lang_1.isPresent(this._cd.control) ? this._cd.control.touched : false;
  21342. },
  21343. enumerable: true,
  21344. configurable: true
  21345. });
  21346. Object.defineProperty(NgControlStatus.prototype, "ngClassPristine", {
  21347. get: function () {
  21348. return lang_1.isPresent(this._cd.control) ? this._cd.control.pristine : false;
  21349. },
  21350. enumerable: true,
  21351. configurable: true
  21352. });
  21353. Object.defineProperty(NgControlStatus.prototype, "ngClassDirty", {
  21354. get: function () {
  21355. return lang_1.isPresent(this._cd.control) ? this._cd.control.dirty : false;
  21356. },
  21357. enumerable: true,
  21358. configurable: true
  21359. });
  21360. Object.defineProperty(NgControlStatus.prototype, "ngClassValid", {
  21361. get: function () {
  21362. return lang_1.isPresent(this._cd.control) ? this._cd.control.valid : false;
  21363. },
  21364. enumerable: true,
  21365. configurable: true
  21366. });
  21367. Object.defineProperty(NgControlStatus.prototype, "ngClassInvalid", {
  21368. get: function () {
  21369. return lang_1.isPresent(this._cd.control) ? !this._cd.control.valid : false;
  21370. },
  21371. enumerable: true,
  21372. configurable: true
  21373. });
  21374. NgControlStatus = __decorate([
  21375. core_1.Directive({
  21376. selector: '[ngControl],[ngModel],[ngFormControl]',
  21377. host: {
  21378. '[class.ng-untouched]': 'ngClassUntouched',
  21379. '[class.ng-touched]': 'ngClassTouched',
  21380. '[class.ng-pristine]': 'ngClassPristine',
  21381. '[class.ng-dirty]': 'ngClassDirty',
  21382. '[class.ng-valid]': 'ngClassValid',
  21383. '[class.ng-invalid]': 'ngClassInvalid'
  21384. }
  21385. }),
  21386. __param(0, core_1.Self()),
  21387. __metadata('design:paramtypes', [ng_control_1.NgControl])
  21388. ], NgControlStatus);
  21389. return NgControlStatus;
  21390. })();
  21391. exports.NgControlStatus = NgControlStatus;
  21392. /***/ },
  21393. /* 143 */
  21394. /***/ function(module, exports, __webpack_require__) {
  21395. var lang_1 = __webpack_require__(5);
  21396. var ng_control_name_1 = __webpack_require__(127);
  21397. var ng_form_control_1 = __webpack_require__(137);
  21398. var ng_model_1 = __webpack_require__(138);
  21399. var ng_control_group_1 = __webpack_require__(139);
  21400. var ng_form_model_1 = __webpack_require__(140);
  21401. var ng_form_1 = __webpack_require__(141);
  21402. var default_value_accessor_1 = __webpack_require__(132);
  21403. var checkbox_value_accessor_1 = __webpack_require__(134);
  21404. var number_value_accessor_1 = __webpack_require__(133);
  21405. var ng_control_status_1 = __webpack_require__(142);
  21406. var select_control_value_accessor_1 = __webpack_require__(135);
  21407. var validators_1 = __webpack_require__(144);
  21408. var ng_control_name_2 = __webpack_require__(127);
  21409. exports.NgControlName = ng_control_name_2.NgControlName;
  21410. var ng_form_control_2 = __webpack_require__(137);
  21411. exports.NgFormControl = ng_form_control_2.NgFormControl;
  21412. var ng_model_2 = __webpack_require__(138);
  21413. exports.NgModel = ng_model_2.NgModel;
  21414. var ng_control_group_2 = __webpack_require__(139);
  21415. exports.NgControlGroup = ng_control_group_2.NgControlGroup;
  21416. var ng_form_model_2 = __webpack_require__(140);
  21417. exports.NgFormModel = ng_form_model_2.NgFormModel;
  21418. var ng_form_2 = __webpack_require__(141);
  21419. exports.NgForm = ng_form_2.NgForm;
  21420. var default_value_accessor_2 = __webpack_require__(132);
  21421. exports.DefaultValueAccessor = default_value_accessor_2.DefaultValueAccessor;
  21422. var checkbox_value_accessor_2 = __webpack_require__(134);
  21423. exports.CheckboxControlValueAccessor = checkbox_value_accessor_2.CheckboxControlValueAccessor;
  21424. var number_value_accessor_2 = __webpack_require__(133);
  21425. exports.NumberValueAccessor = number_value_accessor_2.NumberValueAccessor;
  21426. var ng_control_status_2 = __webpack_require__(142);
  21427. exports.NgControlStatus = ng_control_status_2.NgControlStatus;
  21428. var select_control_value_accessor_2 = __webpack_require__(135);
  21429. exports.SelectControlValueAccessor = select_control_value_accessor_2.SelectControlValueAccessor;
  21430. exports.NgSelectOption = select_control_value_accessor_2.NgSelectOption;
  21431. var validators_2 = __webpack_require__(144);
  21432. exports.RequiredValidator = validators_2.RequiredValidator;
  21433. exports.MinLengthValidator = validators_2.MinLengthValidator;
  21434. exports.MaxLengthValidator = validators_2.MaxLengthValidator;
  21435. var ng_control_1 = __webpack_require__(128);
  21436. exports.NgControl = ng_control_1.NgControl;
  21437. /**
  21438. *
  21439. * A list of all the form directives used as part of a `@View` annotation.
  21440. *
  21441. * This is a shorthand for importing them each individually.
  21442. *
  21443. * ### Example
  21444. *
  21445. * ```typescript
  21446. * @Component({
  21447. * selector: 'my-app',
  21448. * directives: [FORM_DIRECTIVES]
  21449. * })
  21450. * class MyApp {}
  21451. * ```
  21452. */
  21453. exports.FORM_DIRECTIVES = lang_1.CONST_EXPR([
  21454. ng_control_name_1.NgControlName,
  21455. ng_control_group_1.NgControlGroup,
  21456. ng_form_control_1.NgFormControl,
  21457. ng_model_1.NgModel,
  21458. ng_form_model_1.NgFormModel,
  21459. ng_form_1.NgForm,
  21460. select_control_value_accessor_1.NgSelectOption,
  21461. default_value_accessor_1.DefaultValueAccessor,
  21462. number_value_accessor_1.NumberValueAccessor,
  21463. checkbox_value_accessor_1.CheckboxControlValueAccessor,
  21464. select_control_value_accessor_1.SelectControlValueAccessor,
  21465. ng_control_status_1.NgControlStatus,
  21466. validators_1.RequiredValidator,
  21467. validators_1.MinLengthValidator,
  21468. validators_1.MaxLengthValidator
  21469. ]);
  21470. /***/ },
  21471. /* 144 */
  21472. /***/ function(module, exports, __webpack_require__) {
  21473. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  21474. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  21475. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  21476. 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;
  21477. return c > 3 && r && Object.defineProperty(target, key, r), r;
  21478. };
  21479. var __metadata = (this && this.__metadata) || function (k, v) {
  21480. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  21481. };
  21482. var __param = (this && this.__param) || function (paramIndex, decorator) {
  21483. return function (target, key) { decorator(target, key, paramIndex); }
  21484. };
  21485. var core_1 = __webpack_require__(2);
  21486. var lang_1 = __webpack_require__(5);
  21487. var validators_1 = __webpack_require__(131);
  21488. var lang_2 = __webpack_require__(5);
  21489. var REQUIRED_VALIDATOR = lang_1.CONST_EXPR(new core_1.Provider(validators_1.NG_VALIDATORS, { useValue: validators_1.Validators.required, multi: true }));
  21490. /**
  21491. * A Directive that adds the `required` validator to any controls marked with the
  21492. * `required` attribute, via the {@link NG_VALIDATORS} binding.
  21493. *
  21494. * ### Example
  21495. *
  21496. * ```
  21497. * <input ngControl="fullName" required>
  21498. * ```
  21499. */
  21500. var RequiredValidator = (function () {
  21501. function RequiredValidator() {
  21502. }
  21503. RequiredValidator = __decorate([
  21504. core_1.Directive({
  21505. selector: '[required][ngControl],[required][ngFormControl],[required][ngModel]',
  21506. providers: [REQUIRED_VALIDATOR]
  21507. }),
  21508. __metadata('design:paramtypes', [])
  21509. ], RequiredValidator);
  21510. return RequiredValidator;
  21511. })();
  21512. exports.RequiredValidator = RequiredValidator;
  21513. /**
  21514. * Provivder which adds {@link MinLengthValidator} to {@link NG_VALIDATORS}.
  21515. *
  21516. * ## Example:
  21517. *
  21518. * {@example common/forms/ts/validators/validators.ts region='min'}
  21519. */
  21520. 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 }));
  21521. /**
  21522. * A directive which installs the {@link MinLengthValidator} for any `ngControl`,
  21523. * `ngFormControl`, or control with `ngModel` that also has a `minlength` attribute.
  21524. */
  21525. var MinLengthValidator = (function () {
  21526. function MinLengthValidator(minLength) {
  21527. this._validator = validators_1.Validators.minLength(lang_2.NumberWrapper.parseInt(minLength, 10));
  21528. }
  21529. MinLengthValidator.prototype.validate = function (c) { return this._validator(c); };
  21530. MinLengthValidator = __decorate([
  21531. core_1.Directive({
  21532. selector: '[minlength][ngControl],[minlength][ngFormControl],[minlength][ngModel]',
  21533. providers: [MIN_LENGTH_VALIDATOR]
  21534. }),
  21535. __param(0, core_1.Attribute("minlength")),
  21536. __metadata('design:paramtypes', [String])
  21537. ], MinLengthValidator);
  21538. return MinLengthValidator;
  21539. })();
  21540. exports.MinLengthValidator = MinLengthValidator;
  21541. /**
  21542. * Provider which adds {@link MaxLengthValidator} to {@link NG_VALIDATORS}.
  21543. *
  21544. * ## Example:
  21545. *
  21546. * {@example common/forms/ts/validators/validators.ts region='max'}
  21547. */
  21548. 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 }));
  21549. /**
  21550. * A directive which installs the {@link MaxLengthValidator} for any `ngControl, `ngFormControl`,
  21551. * or control with `ngModel` that also has a `maxlength` attribute.
  21552. */
  21553. var MaxLengthValidator = (function () {
  21554. function MaxLengthValidator(maxLength) {
  21555. this._validator = validators_1.Validators.maxLength(lang_2.NumberWrapper.parseInt(maxLength, 10));
  21556. }
  21557. MaxLengthValidator.prototype.validate = function (c) { return this._validator(c); };
  21558. MaxLengthValidator = __decorate([
  21559. core_1.Directive({
  21560. selector: '[maxlength][ngControl],[maxlength][ngFormControl],[maxlength][ngModel]',
  21561. providers: [MAX_LENGTH_VALIDATOR]
  21562. }),
  21563. __param(0, core_1.Attribute("maxlength")),
  21564. __metadata('design:paramtypes', [String])
  21565. ], MaxLengthValidator);
  21566. return MaxLengthValidator;
  21567. })();
  21568. exports.MaxLengthValidator = MaxLengthValidator;
  21569. /***/ },
  21570. /* 145 */
  21571. /***/ function(module, exports, __webpack_require__) {
  21572. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  21573. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  21574. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  21575. 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;
  21576. return c > 3 && r && Object.defineProperty(target, key, r), r;
  21577. };
  21578. var __metadata = (this && this.__metadata) || function (k, v) {
  21579. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  21580. };
  21581. var core_1 = __webpack_require__(2);
  21582. var collection_1 = __webpack_require__(12);
  21583. var lang_1 = __webpack_require__(5);
  21584. var modelModule = __webpack_require__(124);
  21585. /**
  21586. * Creates a form object from a user-specified configuration.
  21587. *
  21588. * ### Example ([live demo](http://plnkr.co/edit/ENgZo8EuIECZNensZCVr?p=preview))
  21589. *
  21590. * ```typescript
  21591. * @Component({
  21592. * selector: 'my-app',
  21593. * viewBindings: [FORM_BINDINGS]
  21594. * template: `
  21595. * <form [ngFormModel]="loginForm">
  21596. * <p>Login <input ngControl="login"></p>
  21597. * <div ngControlGroup="passwordRetry">
  21598. * <p>Password <input type="password" ngControl="password"></p>
  21599. * <p>Confirm password <input type="password" ngControl="passwordConfirmation"></p>
  21600. * </div>
  21601. * </form>
  21602. * <h3>Form value:</h3>
  21603. * <pre>{{value}}</pre>
  21604. * `,
  21605. * directives: [FORM_DIRECTIVES]
  21606. * })
  21607. * export class App {
  21608. * loginForm: ControlGroup;
  21609. *
  21610. * constructor(builder: FormBuilder) {
  21611. * this.loginForm = builder.group({
  21612. * login: ["", Validators.required],
  21613. * passwordRetry: builder.group({
  21614. * password: ["", Validators.required],
  21615. * passwordConfirmation: ["", Validators.required, asyncValidator]
  21616. * })
  21617. * });
  21618. * }
  21619. *
  21620. * get value(): string {
  21621. * return JSON.stringify(this.loginForm.value, null, 2);
  21622. * }
  21623. * }
  21624. * ```
  21625. */
  21626. var FormBuilder = (function () {
  21627. function FormBuilder() {
  21628. }
  21629. /**
  21630. * Construct a new {@link ControlGroup} with the given map of configuration.
  21631. * Valid keys for the `extra` parameter map are `optionals` and `validator`.
  21632. *
  21633. * See the {@link ControlGroup} constructor for more details.
  21634. */
  21635. FormBuilder.prototype.group = function (controlsConfig, extra) {
  21636. if (extra === void 0) { extra = null; }
  21637. var controls = this._reduceControls(controlsConfig);
  21638. var optionals = lang_1.isPresent(extra) ? collection_1.StringMapWrapper.get(extra, "optionals") : null;
  21639. var validator = lang_1.isPresent(extra) ? collection_1.StringMapWrapper.get(extra, "validator") : null;
  21640. var asyncValidator = lang_1.isPresent(extra) ? collection_1.StringMapWrapper.get(extra, "asyncValidator") : null;
  21641. return new modelModule.ControlGroup(controls, optionals, validator, asyncValidator);
  21642. };
  21643. /**
  21644. * Construct a new {@link Control} with the given `value`,`validator`, and `asyncValidator`.
  21645. */
  21646. FormBuilder.prototype.control = function (value, validator, asyncValidator) {
  21647. if (validator === void 0) { validator = null; }
  21648. if (asyncValidator === void 0) { asyncValidator = null; }
  21649. return new modelModule.Control(value, validator, asyncValidator);
  21650. };
  21651. /**
  21652. * Construct an array of {@link Control}s from the given `controlsConfig` array of
  21653. * configuration, with the given optional `validator` and `asyncValidator`.
  21654. */
  21655. FormBuilder.prototype.array = function (controlsConfig, validator, asyncValidator) {
  21656. var _this = this;
  21657. if (validator === void 0) { validator = null; }
  21658. if (asyncValidator === void 0) { asyncValidator = null; }
  21659. var controls = controlsConfig.map(function (c) { return _this._createControl(c); });
  21660. return new modelModule.ControlArray(controls, validator, asyncValidator);
  21661. };
  21662. /** @internal */
  21663. FormBuilder.prototype._reduceControls = function (controlsConfig) {
  21664. var _this = this;
  21665. var controls = {};
  21666. collection_1.StringMapWrapper.forEach(controlsConfig, function (controlConfig, controlName) {
  21667. controls[controlName] = _this._createControl(controlConfig);
  21668. });
  21669. return controls;
  21670. };
  21671. /** @internal */
  21672. FormBuilder.prototype._createControl = function (controlConfig) {
  21673. if (controlConfig instanceof modelModule.Control ||
  21674. controlConfig instanceof modelModule.ControlGroup ||
  21675. controlConfig instanceof modelModule.ControlArray) {
  21676. return controlConfig;
  21677. }
  21678. else if (lang_1.isArray(controlConfig)) {
  21679. var value = controlConfig[0];
  21680. var validator = controlConfig.length > 1 ? controlConfig[1] : null;
  21681. var asyncValidator = controlConfig.length > 2 ? controlConfig[2] : null;
  21682. return this.control(value, validator, asyncValidator);
  21683. }
  21684. else {
  21685. return this.control(controlConfig);
  21686. }
  21687. };
  21688. FormBuilder = __decorate([
  21689. core_1.Injectable(),
  21690. __metadata('design:paramtypes', [])
  21691. ], FormBuilder);
  21692. return FormBuilder;
  21693. })();
  21694. exports.FormBuilder = FormBuilder;
  21695. /**
  21696. * Shorthand set of providers used for building Angular forms.
  21697. *
  21698. * ### Example
  21699. *
  21700. * ```typescript
  21701. * bootstrap(MyApp, [FORM_PROVIDERS]);
  21702. * ```
  21703. */
  21704. exports.FORM_PROVIDERS = lang_1.CONST_EXPR([FormBuilder]);
  21705. /**
  21706. * See {@link FORM_PROVIDERS} instead.
  21707. *
  21708. * @deprecated
  21709. */
  21710. exports.FORM_BINDINGS = exports.FORM_PROVIDERS;
  21711. /***/ },
  21712. /* 146 */
  21713. /***/ function(module, exports, __webpack_require__) {
  21714. var lang_1 = __webpack_require__(5);
  21715. var forms_1 = __webpack_require__(123);
  21716. var directives_1 = __webpack_require__(115);
  21717. /**
  21718. * A collection of Angular core directives that are likely to be used in each and every Angular
  21719. * application. This includes core directives (e.g., NgIf and NgFor), and forms directives (e.g.,
  21720. * NgModel).
  21721. *
  21722. * This collection can be used to quickly enumerate all the built-in directives in the `directives`
  21723. * property of the `@Component` or `@View` decorators.
  21724. *
  21725. * ### Example
  21726. *
  21727. * Instead of writing:
  21728. *
  21729. * ```typescript
  21730. * import {NgClass, NgIf, NgFor, NgSwitch, NgSwitchWhen, NgSwitchDefault, NgModel, NgForm} from
  21731. * 'angular2/common';
  21732. * import {OtherDirective} from './myDirectives';
  21733. *
  21734. * @Component({
  21735. * selector: 'my-component',
  21736. * templateUrl: 'myComponent.html',
  21737. * directives: [NgClass, NgIf, NgFor, NgSwitch, NgSwitchWhen, NgSwitchDefault, NgModel, NgForm,
  21738. * OtherDirective]
  21739. * })
  21740. * export class MyComponent {
  21741. * ...
  21742. * }
  21743. * ```
  21744. * one could import all the common directives at once:
  21745. *
  21746. * ```typescript
  21747. * import {COMMON_DIRECTIVES} from 'angular2/common';
  21748. * import {OtherDirective} from './myDirectives';
  21749. *
  21750. * @Component({
  21751. * selector: 'my-component',
  21752. * templateUrl: 'myComponent.html',
  21753. * directives: [COMMON_DIRECTIVES, OtherDirective]
  21754. * })
  21755. * export class MyComponent {
  21756. * ...
  21757. * }
  21758. * ```
  21759. */
  21760. exports.COMMON_DIRECTIVES = lang_1.CONST_EXPR([directives_1.CORE_DIRECTIVES, forms_1.FORM_DIRECTIVES]);
  21761. /***/ },
  21762. /* 147 */
  21763. /***/ function(module, exports, __webpack_require__) {
  21764. function __export(m) {
  21765. for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
  21766. }
  21767. /**
  21768. * @module
  21769. * @description
  21770. * Starting point to import all compiler APIs.
  21771. */
  21772. __export(__webpack_require__(148));
  21773. __export(__webpack_require__(149));
  21774. __export(__webpack_require__(150));
  21775. /***/ },
  21776. /* 148 */
  21777. /***/ function(module, exports, __webpack_require__) {
  21778. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  21779. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  21780. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  21781. 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;
  21782. return c > 3 && r && Object.defineProperty(target, key, r), r;
  21783. };
  21784. var __metadata = (this && this.__metadata) || function (k, v) {
  21785. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  21786. };
  21787. var __param = (this && this.__param) || function (paramIndex, decorator) {
  21788. return function (target, key) { decorator(target, key, paramIndex); }
  21789. };
  21790. var di_1 = __webpack_require__(6);
  21791. var lang_1 = __webpack_require__(5);
  21792. var application_tokens_1 = __webpack_require__(67);
  21793. var di_2 = __webpack_require__(6);
  21794. /**
  21795. * Create a {@link UrlResolver} with no package prefix.
  21796. */
  21797. function createWithoutPackagePrefix() {
  21798. return new UrlResolver();
  21799. }
  21800. exports.createWithoutPackagePrefix = createWithoutPackagePrefix;
  21801. /**
  21802. * A default provider for {@link PACKAGE_ROOT_URL} that maps to '/'.
  21803. */
  21804. exports.DEFAULT_PACKAGE_URL_PROVIDER = new di_2.Provider(application_tokens_1.PACKAGE_ROOT_URL, { useValue: "/" });
  21805. /**
  21806. * Used by the {@link Compiler} when resolving HTML and CSS template URLs.
  21807. *
  21808. * This class can be overridden by the application developer to create custom behavior.
  21809. *
  21810. * See {@link Compiler}
  21811. *
  21812. * ## Example
  21813. *
  21814. * {@example compiler/ts/url_resolver/url_resolver.ts region='url_resolver'}
  21815. */
  21816. var UrlResolver = (function () {
  21817. function UrlResolver(packagePrefix) {
  21818. if (packagePrefix === void 0) { packagePrefix = null; }
  21819. if (lang_1.isPresent(packagePrefix)) {
  21820. this._packagePrefix = lang_1.StringWrapper.stripRight(packagePrefix, "/") + "/";
  21821. }
  21822. }
  21823. /**
  21824. * Resolves the `url` given the `baseUrl`:
  21825. * - when the `url` is null, the `baseUrl` is returned,
  21826. * - if `url` is relative ('path/to/here', './path/to/here'), the resolved url is a combination of
  21827. * `baseUrl` and `url`,
  21828. * - if `url` is absolute (it has a scheme: 'http://', 'https://' or start with '/'), the `url` is
  21829. * returned as is (ignoring the `baseUrl`)
  21830. *
  21831. * @param {string} baseUrl
  21832. * @param {string} url
  21833. * @returns {string} the resolved URL
  21834. */
  21835. UrlResolver.prototype.resolve = function (baseUrl, url) {
  21836. var resolvedUrl = url;
  21837. if (lang_1.isPresent(baseUrl) && baseUrl.length > 0) {
  21838. resolvedUrl = _resolveUrl(baseUrl, resolvedUrl);
  21839. }
  21840. if (lang_1.isPresent(this._packagePrefix) && getUrlScheme(resolvedUrl) == "package") {
  21841. resolvedUrl = resolvedUrl.replace("package:", this._packagePrefix);
  21842. }
  21843. return resolvedUrl;
  21844. };
  21845. UrlResolver = __decorate([
  21846. di_1.Injectable(),
  21847. __param(0, di_1.Inject(application_tokens_1.PACKAGE_ROOT_URL)),
  21848. __metadata('design:paramtypes', [String])
  21849. ], UrlResolver);
  21850. return UrlResolver;
  21851. })();
  21852. exports.UrlResolver = UrlResolver;
  21853. /**
  21854. * Extract the scheme of a URL.
  21855. */
  21856. function getUrlScheme(url) {
  21857. var match = _split(url);
  21858. return (match && match[_ComponentIndex.Scheme]) || "";
  21859. }
  21860. exports.getUrlScheme = getUrlScheme;
  21861. // The code below is adapted from Traceur:
  21862. // https://github.com/google/traceur-compiler/blob/9511c1dafa972bf0de1202a8a863bad02f0f95a8/src/runtime/url.js
  21863. /**
  21864. * Builds a URI string from already-encoded parts.
  21865. *
  21866. * No encoding is performed. Any component may be omitted as either null or
  21867. * undefined.
  21868. *
  21869. * @param {?string=} opt_scheme The scheme such as 'http'.
  21870. * @param {?string=} opt_userInfo The user name before the '@'.
  21871. * @param {?string=} opt_domain The domain such as 'www.google.com', already
  21872. * URI-encoded.
  21873. * @param {(string|null)=} opt_port The port number.
  21874. * @param {?string=} opt_path The path, already URI-encoded. If it is not
  21875. * empty, it must begin with a slash.
  21876. * @param {?string=} opt_queryData The URI-encoded query data.
  21877. * @param {?string=} opt_fragment The URI-encoded fragment identifier.
  21878. * @return {string} The fully combined URI.
  21879. */
  21880. function _buildFromEncodedParts(opt_scheme, opt_userInfo, opt_domain, opt_port, opt_path, opt_queryData, opt_fragment) {
  21881. var out = [];
  21882. if (lang_1.isPresent(opt_scheme)) {
  21883. out.push(opt_scheme + ':');
  21884. }
  21885. if (lang_1.isPresent(opt_domain)) {
  21886. out.push('//');
  21887. if (lang_1.isPresent(opt_userInfo)) {
  21888. out.push(opt_userInfo + '@');
  21889. }
  21890. out.push(opt_domain);
  21891. if (lang_1.isPresent(opt_port)) {
  21892. out.push(':' + opt_port);
  21893. }
  21894. }
  21895. if (lang_1.isPresent(opt_path)) {
  21896. out.push(opt_path);
  21897. }
  21898. if (lang_1.isPresent(opt_queryData)) {
  21899. out.push('?' + opt_queryData);
  21900. }
  21901. if (lang_1.isPresent(opt_fragment)) {
  21902. out.push('#' + opt_fragment);
  21903. }
  21904. return out.join('');
  21905. }
  21906. /**
  21907. * A regular expression for breaking a URI into its component parts.
  21908. *
  21909. * {@link http://www.gbiv.com/protocols/uri/rfc/rfc3986.html#RFC2234} says
  21910. * As the "first-match-wins" algorithm is identical to the "greedy"
  21911. * disambiguation method used by POSIX regular expressions, it is natural and
  21912. * commonplace to use a regular expression for parsing the potential five
  21913. * components of a URI reference.
  21914. *
  21915. * The following line is the regular expression for breaking-down a
  21916. * well-formed URI reference into its components.
  21917. *
  21918. * <pre>
  21919. * ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
  21920. * 12 3 4 5 6 7 8 9
  21921. * </pre>
  21922. *
  21923. * The numbers in the second line above are only to assist readability; they
  21924. * indicate the reference points for each subexpression (i.e., each paired
  21925. * parenthesis). We refer to the value matched for subexpression <n> as $<n>.
  21926. * For example, matching the above expression to
  21927. * <pre>
  21928. * http://www.ics.uci.edu/pub/ietf/uri/#Related
  21929. * </pre>
  21930. * results in the following subexpression matches:
  21931. * <pre>
  21932. * $1 = http:
  21933. * $2 = http
  21934. * $3 = //www.ics.uci.edu
  21935. * $4 = www.ics.uci.edu
  21936. * $5 = /pub/ietf/uri/
  21937. * $6 = <undefined>
  21938. * $7 = <undefined>
  21939. * $8 = #Related
  21940. * $9 = Related
  21941. * </pre>
  21942. * where <undefined> indicates that the component is not present, as is the
  21943. * case for the query component in the above example. Therefore, we can
  21944. * determine the value of the five components as
  21945. * <pre>
  21946. * scheme = $2
  21947. * authority = $4
  21948. * path = $5
  21949. * query = $7
  21950. * fragment = $9
  21951. * </pre>
  21952. *
  21953. * The regular expression has been modified slightly to expose the
  21954. * userInfo, domain, and port separately from the authority.
  21955. * The modified version yields
  21956. * <pre>
  21957. * $1 = http scheme
  21958. * $2 = <undefined> userInfo -\
  21959. * $3 = www.ics.uci.edu domain | authority
  21960. * $4 = <undefined> port -/
  21961. * $5 = /pub/ietf/uri/ path
  21962. * $6 = <undefined> query without ?
  21963. * $7 = Related fragment without #
  21964. * </pre>
  21965. * @type {!RegExp}
  21966. * @internal
  21967. */
  21968. var _splitRe = lang_1.RegExpWrapper.create('^' +
  21969. '(?:' +
  21970. '([^:/?#.]+)' +
  21971. // used by other URL parts such as :,
  21972. // ?, /, #, and .
  21973. ':)?' +
  21974. '(?://' +
  21975. '(?:([^/?#]*)@)?' +
  21976. '([\\w\\d\\-\\u0100-\\uffff.%]*)' +
  21977. // digits, dashes, dots, percent
  21978. // escapes, and unicode characters.
  21979. '(?::([0-9]+))?' +
  21980. ')?' +
  21981. '([^?#]+)?' +
  21982. '(?:\\?([^#]*))?' +
  21983. '(?:#(.*))?' +
  21984. '$');
  21985. /**
  21986. * The index of each URI component in the return value of goog.uri.utils.split.
  21987. * @enum {number}
  21988. */
  21989. var _ComponentIndex;
  21990. (function (_ComponentIndex) {
  21991. _ComponentIndex[_ComponentIndex["Scheme"] = 1] = "Scheme";
  21992. _ComponentIndex[_ComponentIndex["UserInfo"] = 2] = "UserInfo";
  21993. _ComponentIndex[_ComponentIndex["Domain"] = 3] = "Domain";
  21994. _ComponentIndex[_ComponentIndex["Port"] = 4] = "Port";
  21995. _ComponentIndex[_ComponentIndex["Path"] = 5] = "Path";
  21996. _ComponentIndex[_ComponentIndex["QueryData"] = 6] = "QueryData";
  21997. _ComponentIndex[_ComponentIndex["Fragment"] = 7] = "Fragment";
  21998. })(_ComponentIndex || (_ComponentIndex = {}));
  21999. /**
  22000. * Splits a URI into its component parts.
  22001. *
  22002. * Each component can be accessed via the component indices; for example:
  22003. * <pre>
  22004. * goog.uri.utils.split(someStr)[goog.uri.utils.CompontentIndex.QUERY_DATA];
  22005. * </pre>
  22006. *
  22007. * @param {string} uri The URI string to examine.
  22008. * @return {!Array.<string|undefined>} Each component still URI-encoded.
  22009. * Each component that is present will contain the encoded value, whereas
  22010. * components that are not present will be undefined or empty, depending
  22011. * on the browser's regular expression implementation. Never null, since
  22012. * arbitrary strings may still look like path names.
  22013. */
  22014. function _split(uri) {
  22015. return lang_1.RegExpWrapper.firstMatch(_splitRe, uri);
  22016. }
  22017. /**
  22018. * Removes dot segments in given path component, as described in
  22019. * RFC 3986, section 5.2.4.
  22020. *
  22021. * @param {string} path A non-empty path component.
  22022. * @return {string} Path component with removed dot segments.
  22023. */
  22024. function _removeDotSegments(path) {
  22025. if (path == '/')
  22026. return '/';
  22027. var leadingSlash = path[0] == '/' ? '/' : '';
  22028. var trailingSlash = path[path.length - 1] === '/' ? '/' : '';
  22029. var segments = path.split('/');
  22030. var out = [];
  22031. var up = 0;
  22032. for (var pos = 0; pos < segments.length; pos++) {
  22033. var segment = segments[pos];
  22034. switch (segment) {
  22035. case '':
  22036. case '.':
  22037. break;
  22038. case '..':
  22039. if (out.length > 0) {
  22040. out.pop();
  22041. }
  22042. else {
  22043. up++;
  22044. }
  22045. break;
  22046. default:
  22047. out.push(segment);
  22048. }
  22049. }
  22050. if (leadingSlash == '') {
  22051. while (up-- > 0) {
  22052. out.unshift('..');
  22053. }
  22054. if (out.length === 0)
  22055. out.push('.');
  22056. }
  22057. return leadingSlash + out.join('/') + trailingSlash;
  22058. }
  22059. /**
  22060. * Takes an array of the parts from split and canonicalizes the path part
  22061. * and then joins all the parts.
  22062. * @param {Array.<string?>} parts
  22063. * @return {string}
  22064. */
  22065. function _joinAndCanonicalizePath(parts) {
  22066. var path = parts[_ComponentIndex.Path];
  22067. path = lang_1.isBlank(path) ? '' : _removeDotSegments(path);
  22068. parts[_ComponentIndex.Path] = path;
  22069. return _buildFromEncodedParts(parts[_ComponentIndex.Scheme], parts[_ComponentIndex.UserInfo], parts[_ComponentIndex.Domain], parts[_ComponentIndex.Port], path, parts[_ComponentIndex.QueryData], parts[_ComponentIndex.Fragment]);
  22070. }
  22071. /**
  22072. * Resolves a URL.
  22073. * @param {string} base The URL acting as the base URL.
  22074. * @param {string} to The URL to resolve.
  22075. * @return {string}
  22076. */
  22077. function _resolveUrl(base, url) {
  22078. var parts = _split(encodeURI(url));
  22079. var baseParts = _split(base);
  22080. if (lang_1.isPresent(parts[_ComponentIndex.Scheme])) {
  22081. return _joinAndCanonicalizePath(parts);
  22082. }
  22083. else {
  22084. parts[_ComponentIndex.Scheme] = baseParts[_ComponentIndex.Scheme];
  22085. }
  22086. for (var i = _ComponentIndex.Scheme; i <= _ComponentIndex.Port; i++) {
  22087. if (lang_1.isBlank(parts[i])) {
  22088. parts[i] = baseParts[i];
  22089. }
  22090. }
  22091. if (parts[_ComponentIndex.Path][0] == '/') {
  22092. return _joinAndCanonicalizePath(parts);
  22093. }
  22094. var path = baseParts[_ComponentIndex.Path];
  22095. if (lang_1.isBlank(path))
  22096. path = '/';
  22097. var index = path.lastIndexOf('/');
  22098. path = path.substring(0, index + 1) + parts[_ComponentIndex.Path];
  22099. parts[_ComponentIndex.Path] = path;
  22100. return _joinAndCanonicalizePath(parts);
  22101. }
  22102. /***/ },
  22103. /* 149 */
  22104. /***/ function(module, exports) {
  22105. // TODO: vsavkin rename it into TemplateLoader
  22106. /**
  22107. * An interface for retrieving documents by URL that the compiler uses
  22108. * to load templates.
  22109. */
  22110. var XHR = (function () {
  22111. function XHR() {
  22112. }
  22113. XHR.prototype.get = function (url) { return null; };
  22114. return XHR;
  22115. })();
  22116. exports.XHR = XHR;
  22117. /***/ },
  22118. /* 150 */
  22119. /***/ function(module, exports, __webpack_require__) {
  22120. function __export(m) {
  22121. for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
  22122. }
  22123. var runtime_compiler_1 = __webpack_require__(151);
  22124. var template_compiler_1 = __webpack_require__(152);
  22125. exports.TemplateCompiler = template_compiler_1.TemplateCompiler;
  22126. var directive_metadata_1 = __webpack_require__(153);
  22127. exports.CompileDirectiveMetadata = directive_metadata_1.CompileDirectiveMetadata;
  22128. exports.CompileTypeMetadata = directive_metadata_1.CompileTypeMetadata;
  22129. exports.CompileTemplateMetadata = directive_metadata_1.CompileTemplateMetadata;
  22130. var source_module_1 = __webpack_require__(156);
  22131. exports.SourceModule = source_module_1.SourceModule;
  22132. exports.SourceWithImports = source_module_1.SourceWithImports;
  22133. var platform_directives_and_pipes_1 = __webpack_require__(95);
  22134. exports.PLATFORM_DIRECTIVES = platform_directives_and_pipes_1.PLATFORM_DIRECTIVES;
  22135. exports.PLATFORM_PIPES = platform_directives_and_pipes_1.PLATFORM_PIPES;
  22136. __export(__webpack_require__(159));
  22137. var template_parser_1 = __webpack_require__(167);
  22138. exports.TEMPLATE_TRANSFORMS = template_parser_1.TEMPLATE_TRANSFORMS;
  22139. var lang_1 = __webpack_require__(5);
  22140. var di_1 = __webpack_require__(6);
  22141. var template_parser_2 = __webpack_require__(167);
  22142. var html_parser_1 = __webpack_require__(168);
  22143. var template_normalizer_1 = __webpack_require__(175);
  22144. var runtime_metadata_1 = __webpack_require__(176);
  22145. var change_detector_compiler_1 = __webpack_require__(157);
  22146. var style_compiler_1 = __webpack_require__(161);
  22147. var command_compiler_1 = __webpack_require__(166);
  22148. var template_compiler_2 = __webpack_require__(152);
  22149. var change_detection_1 = __webpack_require__(25);
  22150. var compiler_1 = __webpack_require__(70);
  22151. var runtime_compiler_2 = __webpack_require__(151);
  22152. var element_schema_registry_1 = __webpack_require__(173);
  22153. var dom_element_schema_registry_1 = __webpack_require__(177);
  22154. var url_resolver_1 = __webpack_require__(148);
  22155. var change_detection_2 = __webpack_require__(25);
  22156. function _createChangeDetectorGenConfig() {
  22157. return new change_detection_1.ChangeDetectorGenConfig(lang_1.assertionsEnabled(), false, true);
  22158. }
  22159. /**
  22160. * A set of providers that provide `RuntimeCompiler` and its dependencies to use for
  22161. * template compilation.
  22162. */
  22163. exports.COMPILER_PROVIDERS = lang_1.CONST_EXPR([
  22164. change_detection_2.Lexer,
  22165. change_detection_2.Parser,
  22166. html_parser_1.HtmlParser,
  22167. template_parser_2.TemplateParser,
  22168. template_normalizer_1.TemplateNormalizer,
  22169. runtime_metadata_1.RuntimeMetadataResolver,
  22170. url_resolver_1.DEFAULT_PACKAGE_URL_PROVIDER,
  22171. style_compiler_1.StyleCompiler,
  22172. command_compiler_1.CommandCompiler,
  22173. change_detector_compiler_1.ChangeDetectionCompiler,
  22174. new di_1.Provider(change_detection_1.ChangeDetectorGenConfig, { useFactory: _createChangeDetectorGenConfig, deps: [] }),
  22175. template_compiler_2.TemplateCompiler,
  22176. new di_1.Provider(runtime_compiler_2.RuntimeCompiler, { useClass: runtime_compiler_1.RuntimeCompiler_ }),
  22177. new di_1.Provider(compiler_1.Compiler, { useExisting: runtime_compiler_2.RuntimeCompiler }),
  22178. dom_element_schema_registry_1.DomElementSchemaRegistry,
  22179. new di_1.Provider(element_schema_registry_1.ElementSchemaRegistry, { useExisting: dom_element_schema_registry_1.DomElementSchemaRegistry }),
  22180. url_resolver_1.UrlResolver
  22181. ]);
  22182. /***/ },
  22183. /* 151 */
  22184. /***/ function(module, exports, __webpack_require__) {
  22185. var __extends = (this && this.__extends) || function (d, b) {
  22186. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  22187. function __() { this.constructor = d; }
  22188. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  22189. };
  22190. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  22191. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  22192. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  22193. 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;
  22194. return c > 3 && r && Object.defineProperty(target, key, r), r;
  22195. };
  22196. var __metadata = (this && this.__metadata) || function (k, v) {
  22197. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  22198. };
  22199. var compiler_1 = __webpack_require__(70);
  22200. var proto_view_factory_1 = __webpack_require__(71);
  22201. var template_compiler_1 = __webpack_require__(152);
  22202. var di_1 = __webpack_require__(6);
  22203. var RuntimeCompiler = (function (_super) {
  22204. __extends(RuntimeCompiler, _super);
  22205. function RuntimeCompiler() {
  22206. _super.apply(this, arguments);
  22207. }
  22208. return RuntimeCompiler;
  22209. })(compiler_1.Compiler);
  22210. exports.RuntimeCompiler = RuntimeCompiler;
  22211. var RuntimeCompiler_ = (function (_super) {
  22212. __extends(RuntimeCompiler_, _super);
  22213. function RuntimeCompiler_(_protoViewFactory, _templateCompiler) {
  22214. _super.call(this, _protoViewFactory);
  22215. this._templateCompiler = _templateCompiler;
  22216. }
  22217. RuntimeCompiler_.prototype.compileInHost = function (componentType) {
  22218. var _this = this;
  22219. return this._templateCompiler.compileHostComponentRuntime(componentType)
  22220. .then(function (compiledHostTemplate) { return compiler_1.internalCreateProtoView(_this, compiledHostTemplate); });
  22221. };
  22222. RuntimeCompiler_.prototype.clearCache = function () {
  22223. _super.prototype.clearCache.call(this);
  22224. this._templateCompiler.clearCache();
  22225. };
  22226. RuntimeCompiler_ = __decorate([
  22227. di_1.Injectable(),
  22228. __metadata('design:paramtypes', [proto_view_factory_1.ProtoViewFactory, template_compiler_1.TemplateCompiler])
  22229. ], RuntimeCompiler_);
  22230. return RuntimeCompiler_;
  22231. })(compiler_1.Compiler_);
  22232. exports.RuntimeCompiler_ = RuntimeCompiler_;
  22233. /***/ },
  22234. /* 152 */
  22235. /***/ function(module, exports, __webpack_require__) {
  22236. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  22237. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  22238. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  22239. 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;
  22240. return c > 3 && r && Object.defineProperty(target, key, r), r;
  22241. };
  22242. var __metadata = (this && this.__metadata) || function (k, v) {
  22243. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  22244. };
  22245. var lang_1 = __webpack_require__(5);
  22246. var exceptions_1 = __webpack_require__(14);
  22247. var collection_1 = __webpack_require__(12);
  22248. var async_1 = __webpack_require__(60);
  22249. var template_commands_1 = __webpack_require__(96);
  22250. var directive_metadata_1 = __webpack_require__(153);
  22251. var di_1 = __webpack_require__(6);
  22252. var source_module_1 = __webpack_require__(156);
  22253. var change_detector_compiler_1 = __webpack_require__(157);
  22254. var style_compiler_1 = __webpack_require__(161);
  22255. var command_compiler_1 = __webpack_require__(166);
  22256. var template_parser_1 = __webpack_require__(167);
  22257. var template_normalizer_1 = __webpack_require__(175);
  22258. var runtime_metadata_1 = __webpack_require__(176);
  22259. var command_compiler_2 = __webpack_require__(166);
  22260. var util_1 = __webpack_require__(155);
  22261. /**
  22262. * An internal module of the Angular compiler that begins with component types,
  22263. * extracts templates, and eventually produces a compiled version of the component
  22264. * ready for linking into an application.
  22265. */
  22266. var TemplateCompiler = (function () {
  22267. function TemplateCompiler(_runtimeMetadataResolver, _templateNormalizer, _templateParser, _styleCompiler, _commandCompiler, _cdCompiler) {
  22268. this._runtimeMetadataResolver = _runtimeMetadataResolver;
  22269. this._templateNormalizer = _templateNormalizer;
  22270. this._templateParser = _templateParser;
  22271. this._styleCompiler = _styleCompiler;
  22272. this._commandCompiler = _commandCompiler;
  22273. this._cdCompiler = _cdCompiler;
  22274. this._hostCacheKeys = new Map();
  22275. this._compiledTemplateCache = new Map();
  22276. this._compiledTemplateDone = new Map();
  22277. this._nextTemplateId = 0;
  22278. }
  22279. TemplateCompiler.prototype.normalizeDirectiveMetadata = function (directive) {
  22280. if (!directive.isComponent) {
  22281. // For non components there is nothing to be normalized yet.
  22282. return async_1.PromiseWrapper.resolve(directive);
  22283. }
  22284. return this._templateNormalizer.normalizeTemplate(directive.type, directive.template)
  22285. .then(function (normalizedTemplate) { return new directive_metadata_1.CompileDirectiveMetadata({
  22286. type: directive.type,
  22287. isComponent: directive.isComponent,
  22288. dynamicLoadable: directive.dynamicLoadable,
  22289. selector: directive.selector,
  22290. exportAs: directive.exportAs,
  22291. changeDetection: directive.changeDetection,
  22292. inputs: directive.inputs,
  22293. outputs: directive.outputs,
  22294. hostListeners: directive.hostListeners,
  22295. hostProperties: directive.hostProperties,
  22296. hostAttributes: directive.hostAttributes,
  22297. lifecycleHooks: directive.lifecycleHooks,
  22298. template: normalizedTemplate
  22299. }); });
  22300. };
  22301. TemplateCompiler.prototype.compileHostComponentRuntime = function (type) {
  22302. var hostCacheKey = this._hostCacheKeys.get(type);
  22303. if (lang_1.isBlank(hostCacheKey)) {
  22304. hostCacheKey = new Object();
  22305. this._hostCacheKeys.set(type, hostCacheKey);
  22306. var compMeta = this._runtimeMetadataResolver.getMetadata(type);
  22307. assertComponent(compMeta);
  22308. var hostMeta = directive_metadata_1.createHostComponentMeta(compMeta.type, compMeta.selector);
  22309. this._compileComponentRuntime(hostCacheKey, hostMeta, [compMeta], new Set());
  22310. }
  22311. return this._compiledTemplateDone.get(hostCacheKey)
  22312. .then(function (compiledTemplate) { return new template_commands_1.CompiledHostTemplate(compiledTemplate); });
  22313. };
  22314. TemplateCompiler.prototype.clearCache = function () {
  22315. this._hostCacheKeys.clear();
  22316. this._styleCompiler.clearCache();
  22317. this._compiledTemplateCache.clear();
  22318. this._compiledTemplateDone.clear();
  22319. };
  22320. TemplateCompiler.prototype._compileComponentRuntime = function (cacheKey, compMeta, viewDirectives, compilingComponentCacheKeys) {
  22321. var _this = this;
  22322. var uniqViewDirectives = removeDuplicates(viewDirectives);
  22323. var compiledTemplate = this._compiledTemplateCache.get(cacheKey);
  22324. var done = this._compiledTemplateDone.get(cacheKey);
  22325. if (lang_1.isBlank(compiledTemplate)) {
  22326. var styles = [];
  22327. var changeDetectorFactory;
  22328. var commands = [];
  22329. var templateId = lang_1.stringify(compMeta.type.runtime) + "Template" + this._nextTemplateId++;
  22330. compiledTemplate = new template_commands_1.CompiledComponentTemplate(templateId, function (dispatcher) { return changeDetectorFactory(dispatcher); }, commands, styles);
  22331. this._compiledTemplateCache.set(cacheKey, compiledTemplate);
  22332. compilingComponentCacheKeys.add(cacheKey);
  22333. done = async_1.PromiseWrapper
  22334. .all([this._styleCompiler.compileComponentRuntime(compMeta.template)].concat(uniqViewDirectives.map(function (dirMeta) { return _this.normalizeDirectiveMetadata(dirMeta); })))
  22335. .then(function (stylesAndNormalizedViewDirMetas) {
  22336. var childPromises = [];
  22337. var normalizedViewDirMetas = stylesAndNormalizedViewDirMetas.slice(1);
  22338. var parsedTemplate = _this._templateParser.parse(compMeta.template.template, normalizedViewDirMetas, compMeta.type.name);
  22339. var changeDetectorFactories = _this._cdCompiler.compileComponentRuntime(compMeta.type, compMeta.changeDetection, parsedTemplate);
  22340. changeDetectorFactory = changeDetectorFactories[0];
  22341. var tmpStyles = stylesAndNormalizedViewDirMetas[0];
  22342. tmpStyles.forEach(function (style) { return styles.push(style); });
  22343. var tmpCommands = _this._compileCommandsRuntime(compMeta, parsedTemplate, changeDetectorFactories, compilingComponentCacheKeys, childPromises);
  22344. tmpCommands.forEach(function (cmd) { return commands.push(cmd); });
  22345. return async_1.PromiseWrapper.all(childPromises);
  22346. })
  22347. .then(function (_) {
  22348. collection_1.SetWrapper.delete(compilingComponentCacheKeys, cacheKey);
  22349. return compiledTemplate;
  22350. });
  22351. this._compiledTemplateDone.set(cacheKey, done);
  22352. }
  22353. return compiledTemplate;
  22354. };
  22355. TemplateCompiler.prototype._compileCommandsRuntime = function (compMeta, parsedTemplate, changeDetectorFactories, compilingComponentCacheKeys, childPromises) {
  22356. var _this = this;
  22357. var cmds = this._commandCompiler.compileComponentRuntime(compMeta, parsedTemplate, changeDetectorFactories, function (childComponentDir) {
  22358. var childCacheKey = childComponentDir.type.runtime;
  22359. var childViewDirectives = _this._runtimeMetadataResolver.getViewDirectivesMetadata(childComponentDir.type.runtime);
  22360. var childIsRecursive = collection_1.SetWrapper.has(compilingComponentCacheKeys, childCacheKey);
  22361. var childTemplate = _this._compileComponentRuntime(childCacheKey, childComponentDir, childViewDirectives, compilingComponentCacheKeys);
  22362. if (!childIsRecursive) {
  22363. // Only wait for a child if it is not a cycle
  22364. childPromises.push(_this._compiledTemplateDone.get(childCacheKey));
  22365. }
  22366. return function () { return childTemplate; };
  22367. });
  22368. cmds.forEach(function (cmd) {
  22369. if (cmd instanceof template_commands_1.BeginComponentCmd) {
  22370. cmd.templateGetter();
  22371. }
  22372. });
  22373. return cmds;
  22374. };
  22375. TemplateCompiler.prototype.compileTemplatesCodeGen = function (components) {
  22376. var _this = this;
  22377. if (components.length === 0) {
  22378. throw new exceptions_1.BaseException('No components given');
  22379. }
  22380. var declarations = [];
  22381. var templateArguments = [];
  22382. var componentMetas = [];
  22383. components.forEach(function (componentWithDirs) {
  22384. var compMeta = componentWithDirs.component;
  22385. assertComponent(compMeta);
  22386. componentMetas.push(compMeta);
  22387. _this._processTemplateCodeGen(compMeta, componentWithDirs.directives, declarations, templateArguments);
  22388. if (compMeta.dynamicLoadable) {
  22389. var hostMeta = directive_metadata_1.createHostComponentMeta(compMeta.type, compMeta.selector);
  22390. componentMetas.push(hostMeta);
  22391. _this._processTemplateCodeGen(hostMeta, [compMeta], declarations, templateArguments);
  22392. }
  22393. });
  22394. collection_1.ListWrapper.forEachWithIndex(componentMetas, function (compMeta, index) {
  22395. var templateId = compMeta.type.moduleUrl + "|" + compMeta.type.name;
  22396. var constructionKeyword = lang_1.IS_DART ? 'const' : 'new';
  22397. var compiledTemplateExpr = constructionKeyword + " " + command_compiler_2.TEMPLATE_COMMANDS_MODULE_REF + "CompiledComponentTemplate('" + templateId + "'," + templateArguments[index].join(',') + ")";
  22398. var variableValueExpr;
  22399. if (compMeta.type.isHost) {
  22400. variableValueExpr =
  22401. constructionKeyword + " " + command_compiler_2.TEMPLATE_COMMANDS_MODULE_REF + "CompiledHostTemplate(" + compiledTemplateExpr + ")";
  22402. }
  22403. else {
  22404. variableValueExpr = compiledTemplateExpr;
  22405. }
  22406. var varName = templateVariableName(compMeta.type);
  22407. declarations.push("" + util_1.codeGenExportVariable(varName) + variableValueExpr + ";");
  22408. declarations.push(util_1.codeGenValueFn([], varName, templateGetterName(compMeta.type)) + ";");
  22409. });
  22410. var moduleUrl = components[0].component.type.moduleUrl;
  22411. return new source_module_1.SourceModule("" + templateModuleUrl(moduleUrl), declarations.join('\n'));
  22412. };
  22413. TemplateCompiler.prototype.compileStylesheetCodeGen = function (stylesheetUrl, cssText) {
  22414. return this._styleCompiler.compileStylesheetCodeGen(stylesheetUrl, cssText);
  22415. };
  22416. TemplateCompiler.prototype._processTemplateCodeGen = function (compMeta, directives, targetDeclarations, targetTemplateArguments) {
  22417. var uniqueDirectives = removeDuplicates(directives);
  22418. var styleExpr = this._styleCompiler.compileComponentCodeGen(compMeta.template);
  22419. var parsedTemplate = this._templateParser.parse(compMeta.template.template, uniqueDirectives, compMeta.type.name);
  22420. var changeDetectorsExprs = this._cdCompiler.compileComponentCodeGen(compMeta.type, compMeta.changeDetection, parsedTemplate);
  22421. var commandsExpr = this._commandCompiler.compileComponentCodeGen(compMeta, parsedTemplate, changeDetectorsExprs.expressions, codeGenComponentTemplateFactory);
  22422. addAll(styleExpr.declarations, targetDeclarations);
  22423. addAll(changeDetectorsExprs.declarations, targetDeclarations);
  22424. addAll(commandsExpr.declarations, targetDeclarations);
  22425. targetTemplateArguments.push([changeDetectorsExprs.expressions[0], commandsExpr.expression, styleExpr.expression]);
  22426. };
  22427. TemplateCompiler = __decorate([
  22428. di_1.Injectable(),
  22429. __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])
  22430. ], TemplateCompiler);
  22431. return TemplateCompiler;
  22432. })();
  22433. exports.TemplateCompiler = TemplateCompiler;
  22434. var NormalizedComponentWithViewDirectives = (function () {
  22435. function NormalizedComponentWithViewDirectives(component, directives) {
  22436. this.component = component;
  22437. this.directives = directives;
  22438. }
  22439. return NormalizedComponentWithViewDirectives;
  22440. })();
  22441. exports.NormalizedComponentWithViewDirectives = NormalizedComponentWithViewDirectives;
  22442. function assertComponent(meta) {
  22443. if (!meta.isComponent) {
  22444. throw new exceptions_1.BaseException("Could not compile '" + meta.type.name + "' because it is not a component.");
  22445. }
  22446. }
  22447. function templateVariableName(type) {
  22448. return type.name + "Template";
  22449. }
  22450. function templateGetterName(type) {
  22451. return templateVariableName(type) + "Getter";
  22452. }
  22453. function templateModuleUrl(moduleUrl) {
  22454. var urlWithoutSuffix = moduleUrl.substring(0, moduleUrl.length - util_1.MODULE_SUFFIX.length);
  22455. return urlWithoutSuffix + ".template" + util_1.MODULE_SUFFIX;
  22456. }
  22457. function addAll(source, target) {
  22458. for (var i = 0; i < source.length; i++) {
  22459. target.push(source[i]);
  22460. }
  22461. }
  22462. function codeGenComponentTemplateFactory(nestedCompType) {
  22463. return "" + source_module_1.moduleRef(templateModuleUrl(nestedCompType.type.moduleUrl)) + templateGetterName(nestedCompType.type);
  22464. }
  22465. function removeDuplicates(items) {
  22466. var res = [];
  22467. items.forEach(function (item) {
  22468. var hasMatch = res.filter(function (r) { return r.type.name == item.type.name && r.type.moduleUrl == item.type.moduleUrl &&
  22469. r.type.runtime == item.type.runtime; })
  22470. .length > 0;
  22471. if (!hasMatch) {
  22472. res.push(item);
  22473. }
  22474. });
  22475. return res;
  22476. }
  22477. /***/ },
  22478. /* 153 */
  22479. /***/ function(module, exports, __webpack_require__) {
  22480. var lang_1 = __webpack_require__(5);
  22481. var collection_1 = __webpack_require__(12);
  22482. var change_detection_1 = __webpack_require__(25);
  22483. var view_1 = __webpack_require__(56);
  22484. var selector_1 = __webpack_require__(154);
  22485. var util_1 = __webpack_require__(155);
  22486. var interfaces_1 = __webpack_require__(89);
  22487. // group 1: "property" from "[property]"
  22488. // group 2: "event" from "(event)"
  22489. var HOST_REG_EXP = /^(?:(?:\[([^\]]+)\])|(?:\(([^\)]+)\)))$/g;
  22490. /**
  22491. * Metadata regarding compilation of a type.
  22492. */
  22493. var CompileTypeMetadata = (function () {
  22494. function CompileTypeMetadata(_a) {
  22495. var _b = _a === void 0 ? {} : _a, runtime = _b.runtime, name = _b.name, moduleUrl = _b.moduleUrl, isHost = _b.isHost;
  22496. this.runtime = runtime;
  22497. this.name = name;
  22498. this.moduleUrl = moduleUrl;
  22499. this.isHost = lang_1.normalizeBool(isHost);
  22500. }
  22501. CompileTypeMetadata.fromJson = function (data) {
  22502. return new CompileTypeMetadata({ name: data['name'], moduleUrl: data['moduleUrl'], isHost: data['isHost'] });
  22503. };
  22504. CompileTypeMetadata.prototype.toJson = function () {
  22505. return {
  22506. // Note: Runtime type can't be serialized...
  22507. 'name': this.name,
  22508. 'moduleUrl': this.moduleUrl,
  22509. 'isHost': this.isHost
  22510. };
  22511. };
  22512. return CompileTypeMetadata;
  22513. })();
  22514. exports.CompileTypeMetadata = CompileTypeMetadata;
  22515. /**
  22516. * Metadata regarding compilation of a template.
  22517. */
  22518. var CompileTemplateMetadata = (function () {
  22519. function CompileTemplateMetadata(_a) {
  22520. var _b = _a === void 0 ? {} : _a, encapsulation = _b.encapsulation, template = _b.template, templateUrl = _b.templateUrl, styles = _b.styles, styleUrls = _b.styleUrls, ngContentSelectors = _b.ngContentSelectors;
  22521. this.encapsulation = lang_1.isPresent(encapsulation) ? encapsulation : view_1.ViewEncapsulation.Emulated;
  22522. this.template = template;
  22523. this.templateUrl = templateUrl;
  22524. this.styles = lang_1.isPresent(styles) ? styles : [];
  22525. this.styleUrls = lang_1.isPresent(styleUrls) ? styleUrls : [];
  22526. this.ngContentSelectors = lang_1.isPresent(ngContentSelectors) ? ngContentSelectors : [];
  22527. }
  22528. CompileTemplateMetadata.fromJson = function (data) {
  22529. return new CompileTemplateMetadata({
  22530. encapsulation: lang_1.isPresent(data['encapsulation']) ?
  22531. view_1.VIEW_ENCAPSULATION_VALUES[data['encapsulation']] :
  22532. data['encapsulation'],
  22533. template: data['template'],
  22534. templateUrl: data['templateUrl'],
  22535. styles: data['styles'],
  22536. styleUrls: data['styleUrls'],
  22537. ngContentSelectors: data['ngContentSelectors']
  22538. });
  22539. };
  22540. CompileTemplateMetadata.prototype.toJson = function () {
  22541. return {
  22542. 'encapsulation': lang_1.isPresent(this.encapsulation) ? lang_1.serializeEnum(this.encapsulation) : this.encapsulation,
  22543. 'template': this.template,
  22544. 'templateUrl': this.templateUrl,
  22545. 'styles': this.styles,
  22546. 'styleUrls': this.styleUrls,
  22547. 'ngContentSelectors': this.ngContentSelectors
  22548. };
  22549. };
  22550. return CompileTemplateMetadata;
  22551. })();
  22552. exports.CompileTemplateMetadata = CompileTemplateMetadata;
  22553. /**
  22554. * Metadata regarding compilation of a directive.
  22555. */
  22556. var CompileDirectiveMetadata = (function () {
  22557. function CompileDirectiveMetadata(_a) {
  22558. 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;
  22559. this.type = type;
  22560. this.isComponent = isComponent;
  22561. this.dynamicLoadable = dynamicLoadable;
  22562. this.selector = selector;
  22563. this.exportAs = exportAs;
  22564. this.changeDetection = changeDetection;
  22565. this.inputs = inputs;
  22566. this.outputs = outputs;
  22567. this.hostListeners = hostListeners;
  22568. this.hostProperties = hostProperties;
  22569. this.hostAttributes = hostAttributes;
  22570. this.lifecycleHooks = lifecycleHooks;
  22571. this.template = template;
  22572. }
  22573. CompileDirectiveMetadata.create = function (_a) {
  22574. 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;
  22575. var hostListeners = {};
  22576. var hostProperties = {};
  22577. var hostAttributes = {};
  22578. if (lang_1.isPresent(host)) {
  22579. collection_1.StringMapWrapper.forEach(host, function (value, key) {
  22580. var matches = lang_1.RegExpWrapper.firstMatch(HOST_REG_EXP, key);
  22581. if (lang_1.isBlank(matches)) {
  22582. hostAttributes[key] = value;
  22583. }
  22584. else if (lang_1.isPresent(matches[1])) {
  22585. hostProperties[matches[1]] = value;
  22586. }
  22587. else if (lang_1.isPresent(matches[2])) {
  22588. hostListeners[matches[2]] = value;
  22589. }
  22590. });
  22591. }
  22592. var inputsMap = {};
  22593. if (lang_1.isPresent(inputs)) {
  22594. inputs.forEach(function (bindConfig) {
  22595. // canonical syntax: `dirProp: elProp`
  22596. // if there is no `:`, use dirProp = elProp
  22597. var parts = util_1.splitAtColon(bindConfig, [bindConfig, bindConfig]);
  22598. inputsMap[parts[0]] = parts[1];
  22599. });
  22600. }
  22601. var outputsMap = {};
  22602. if (lang_1.isPresent(outputs)) {
  22603. outputs.forEach(function (bindConfig) {
  22604. // canonical syntax: `dirProp: elProp`
  22605. // if there is no `:`, use dirProp = elProp
  22606. var parts = util_1.splitAtColon(bindConfig, [bindConfig, bindConfig]);
  22607. outputsMap[parts[0]] = parts[1];
  22608. });
  22609. }
  22610. return new CompileDirectiveMetadata({
  22611. type: type,
  22612. isComponent: lang_1.normalizeBool(isComponent),
  22613. dynamicLoadable: lang_1.normalizeBool(dynamicLoadable),
  22614. selector: selector,
  22615. exportAs: exportAs,
  22616. changeDetection: changeDetection,
  22617. inputs: inputsMap,
  22618. outputs: outputsMap,
  22619. hostListeners: hostListeners,
  22620. hostProperties: hostProperties,
  22621. hostAttributes: hostAttributes,
  22622. lifecycleHooks: lang_1.isPresent(lifecycleHooks) ? lifecycleHooks : [],
  22623. template: template
  22624. });
  22625. };
  22626. CompileDirectiveMetadata.fromJson = function (data) {
  22627. return new CompileDirectiveMetadata({
  22628. isComponent: data['isComponent'],
  22629. dynamicLoadable: data['dynamicLoadable'],
  22630. selector: data['selector'],
  22631. exportAs: data['exportAs'],
  22632. type: lang_1.isPresent(data['type']) ? CompileTypeMetadata.fromJson(data['type']) : data['type'],
  22633. changeDetection: lang_1.isPresent(data['changeDetection']) ?
  22634. change_detection_1.CHANGE_DETECTION_STRATEGY_VALUES[data['changeDetection']] :
  22635. data['changeDetection'],
  22636. inputs: data['inputs'],
  22637. outputs: data['outputs'],
  22638. hostListeners: data['hostListeners'],
  22639. hostProperties: data['hostProperties'],
  22640. hostAttributes: data['hostAttributes'],
  22641. lifecycleHooks: data['lifecycleHooks'].map(function (hookValue) { return interfaces_1.LIFECYCLE_HOOKS_VALUES[hookValue]; }),
  22642. template: lang_1.isPresent(data['template']) ? CompileTemplateMetadata.fromJson(data['template']) :
  22643. data['template']
  22644. });
  22645. };
  22646. CompileDirectiveMetadata.prototype.toJson = function () {
  22647. return {
  22648. 'isComponent': this.isComponent,
  22649. 'dynamicLoadable': this.dynamicLoadable,
  22650. 'selector': this.selector,
  22651. 'exportAs': this.exportAs,
  22652. 'type': lang_1.isPresent(this.type) ? this.type.toJson() : this.type,
  22653. 'changeDetection': lang_1.isPresent(this.changeDetection) ? lang_1.serializeEnum(this.changeDetection) :
  22654. this.changeDetection,
  22655. 'inputs': this.inputs,
  22656. 'outputs': this.outputs,
  22657. 'hostListeners': this.hostListeners,
  22658. 'hostProperties': this.hostProperties,
  22659. 'hostAttributes': this.hostAttributes,
  22660. 'lifecycleHooks': this.lifecycleHooks.map(function (hook) { return lang_1.serializeEnum(hook); }),
  22661. 'template': lang_1.isPresent(this.template) ? this.template.toJson() : this.template
  22662. };
  22663. };
  22664. return CompileDirectiveMetadata;
  22665. })();
  22666. exports.CompileDirectiveMetadata = CompileDirectiveMetadata;
  22667. /**
  22668. * Construct {@link CompileDirectiveMetadata} from {@link ComponentTypeMetadata} and a selector.
  22669. */
  22670. function createHostComponentMeta(componentType, componentSelector) {
  22671. var template = selector_1.CssSelector.parse(componentSelector)[0].getMatchingElementTemplate();
  22672. return CompileDirectiveMetadata.create({
  22673. type: new CompileTypeMetadata({
  22674. runtime: Object,
  22675. name: "Host" + componentType.name,
  22676. moduleUrl: componentType.moduleUrl,
  22677. isHost: true
  22678. }),
  22679. template: new CompileTemplateMetadata({ template: template, templateUrl: '', styles: [], styleUrls: [], ngContentSelectors: [] }),
  22680. changeDetection: change_detection_1.ChangeDetectionStrategy.Default,
  22681. inputs: [],
  22682. outputs: [],
  22683. host: {},
  22684. lifecycleHooks: [],
  22685. isComponent: true,
  22686. dynamicLoadable: false,
  22687. selector: '*'
  22688. });
  22689. }
  22690. exports.createHostComponentMeta = createHostComponentMeta;
  22691. /***/ },
  22692. /* 154 */
  22693. /***/ function(module, exports, __webpack_require__) {
  22694. var collection_1 = __webpack_require__(12);
  22695. var lang_1 = __webpack_require__(5);
  22696. var exceptions_1 = __webpack_require__(14);
  22697. var _EMPTY_ATTR_VALUE = '';
  22698. // TODO: Can't use `const` here as
  22699. // in Dart this is not transpiled into `final` yet...
  22700. var _SELECTOR_REGEXP = lang_1.RegExpWrapper.create('(\\:not\\()|' +
  22701. '([-\\w]+)|' +
  22702. '(?:\\.([-\\w]+))|' +
  22703. '(?:\\[([-\\w*]+)(?:=([^\\]]*))?\\])|' +
  22704. '(\\))|' +
  22705. '(\\s*,\\s*)'); // ","
  22706. /**
  22707. * A css selector contains an element name,
  22708. * css classes and attribute/value pairs with the purpose
  22709. * of selecting subsets out of them.
  22710. */
  22711. var CssSelector = (function () {
  22712. function CssSelector() {
  22713. this.element = null;
  22714. this.classNames = [];
  22715. this.attrs = [];
  22716. this.notSelectors = [];
  22717. }
  22718. CssSelector.parse = function (selector) {
  22719. var results = [];
  22720. var _addResult = function (res, cssSel) {
  22721. if (cssSel.notSelectors.length > 0 && lang_1.isBlank(cssSel.element) &&
  22722. collection_1.ListWrapper.isEmpty(cssSel.classNames) && collection_1.ListWrapper.isEmpty(cssSel.attrs)) {
  22723. cssSel.element = "*";
  22724. }
  22725. res.push(cssSel);
  22726. };
  22727. var cssSelector = new CssSelector();
  22728. var matcher = lang_1.RegExpWrapper.matcher(_SELECTOR_REGEXP, selector);
  22729. var match;
  22730. var current = cssSelector;
  22731. var inNot = false;
  22732. while (lang_1.isPresent(match = lang_1.RegExpMatcherWrapper.next(matcher))) {
  22733. if (lang_1.isPresent(match[1])) {
  22734. if (inNot) {
  22735. throw new exceptions_1.BaseException('Nesting :not is not allowed in a selector');
  22736. }
  22737. inNot = true;
  22738. current = new CssSelector();
  22739. cssSelector.notSelectors.push(current);
  22740. }
  22741. if (lang_1.isPresent(match[2])) {
  22742. current.setElement(match[2]);
  22743. }
  22744. if (lang_1.isPresent(match[3])) {
  22745. current.addClassName(match[3]);
  22746. }
  22747. if (lang_1.isPresent(match[4])) {
  22748. current.addAttribute(match[4], match[5]);
  22749. }
  22750. if (lang_1.isPresent(match[6])) {
  22751. inNot = false;
  22752. current = cssSelector;
  22753. }
  22754. if (lang_1.isPresent(match[7])) {
  22755. if (inNot) {
  22756. throw new exceptions_1.BaseException('Multiple selectors in :not are not supported');
  22757. }
  22758. _addResult(results, cssSelector);
  22759. cssSelector = current = new CssSelector();
  22760. }
  22761. }
  22762. _addResult(results, cssSelector);
  22763. return results;
  22764. };
  22765. CssSelector.prototype.isElementSelector = function () {
  22766. return lang_1.isPresent(this.element) && collection_1.ListWrapper.isEmpty(this.classNames) &&
  22767. collection_1.ListWrapper.isEmpty(this.attrs) && this.notSelectors.length === 0;
  22768. };
  22769. CssSelector.prototype.setElement = function (element) {
  22770. if (element === void 0) { element = null; }
  22771. this.element = element;
  22772. };
  22773. /** Gets a template string for an element that matches the selector. */
  22774. CssSelector.prototype.getMatchingElementTemplate = function () {
  22775. var tagName = lang_1.isPresent(this.element) ? this.element : 'div';
  22776. var classAttr = this.classNames.length > 0 ? " class=\"" + this.classNames.join(' ') + "\"" : '';
  22777. var attrs = '';
  22778. for (var i = 0; i < this.attrs.length; i += 2) {
  22779. var attrName = this.attrs[i];
  22780. var attrValue = this.attrs[i + 1] !== '' ? "=\"" + this.attrs[i + 1] + "\"" : '';
  22781. attrs += " " + attrName + attrValue;
  22782. }
  22783. return "<" + tagName + classAttr + attrs + "></" + tagName + ">";
  22784. };
  22785. CssSelector.prototype.addAttribute = function (name, value) {
  22786. if (value === void 0) { value = _EMPTY_ATTR_VALUE; }
  22787. this.attrs.push(name);
  22788. if (lang_1.isPresent(value)) {
  22789. value = value.toLowerCase();
  22790. }
  22791. else {
  22792. value = _EMPTY_ATTR_VALUE;
  22793. }
  22794. this.attrs.push(value);
  22795. };
  22796. CssSelector.prototype.addClassName = function (name) { this.classNames.push(name.toLowerCase()); };
  22797. CssSelector.prototype.toString = function () {
  22798. var res = '';
  22799. if (lang_1.isPresent(this.element)) {
  22800. res += this.element;
  22801. }
  22802. if (lang_1.isPresent(this.classNames)) {
  22803. for (var i = 0; i < this.classNames.length; i++) {
  22804. res += '.' + this.classNames[i];
  22805. }
  22806. }
  22807. if (lang_1.isPresent(this.attrs)) {
  22808. for (var i = 0; i < this.attrs.length;) {
  22809. var attrName = this.attrs[i++];
  22810. var attrValue = this.attrs[i++];
  22811. res += '[' + attrName;
  22812. if (attrValue.length > 0) {
  22813. res += '=' + attrValue;
  22814. }
  22815. res += ']';
  22816. }
  22817. }
  22818. this.notSelectors.forEach(function (notSelector) { return res += ":not(" + notSelector + ")"; });
  22819. return res;
  22820. };
  22821. return CssSelector;
  22822. })();
  22823. exports.CssSelector = CssSelector;
  22824. /**
  22825. * Reads a list of CssSelectors and allows to calculate which ones
  22826. * are contained in a given CssSelector.
  22827. */
  22828. var SelectorMatcher = (function () {
  22829. function SelectorMatcher() {
  22830. this._elementMap = new collection_1.Map();
  22831. this._elementPartialMap = new collection_1.Map();
  22832. this._classMap = new collection_1.Map();
  22833. this._classPartialMap = new collection_1.Map();
  22834. this._attrValueMap = new collection_1.Map();
  22835. this._attrValuePartialMap = new collection_1.Map();
  22836. this._listContexts = [];
  22837. }
  22838. SelectorMatcher.createNotMatcher = function (notSelectors) {
  22839. var notMatcher = new SelectorMatcher();
  22840. notMatcher.addSelectables(notSelectors, null);
  22841. return notMatcher;
  22842. };
  22843. SelectorMatcher.prototype.addSelectables = function (cssSelectors, callbackCtxt) {
  22844. var listContext = null;
  22845. if (cssSelectors.length > 1) {
  22846. listContext = new SelectorListContext(cssSelectors);
  22847. this._listContexts.push(listContext);
  22848. }
  22849. for (var i = 0; i < cssSelectors.length; i++) {
  22850. this._addSelectable(cssSelectors[i], callbackCtxt, listContext);
  22851. }
  22852. };
  22853. /**
  22854. * Add an object that can be found later on by calling `match`.
  22855. * @param cssSelector A css selector
  22856. * @param callbackCtxt An opaque object that will be given to the callback of the `match` function
  22857. */
  22858. SelectorMatcher.prototype._addSelectable = function (cssSelector, callbackCtxt, listContext) {
  22859. var matcher = this;
  22860. var element = cssSelector.element;
  22861. var classNames = cssSelector.classNames;
  22862. var attrs = cssSelector.attrs;
  22863. var selectable = new SelectorContext(cssSelector, callbackCtxt, listContext);
  22864. if (lang_1.isPresent(element)) {
  22865. var isTerminal = attrs.length === 0 && classNames.length === 0;
  22866. if (isTerminal) {
  22867. this._addTerminal(matcher._elementMap, element, selectable);
  22868. }
  22869. else {
  22870. matcher = this._addPartial(matcher._elementPartialMap, element);
  22871. }
  22872. }
  22873. if (lang_1.isPresent(classNames)) {
  22874. for (var index = 0; index < classNames.length; index++) {
  22875. var isTerminal = attrs.length === 0 && index === classNames.length - 1;
  22876. var className = classNames[index];
  22877. if (isTerminal) {
  22878. this._addTerminal(matcher._classMap, className, selectable);
  22879. }
  22880. else {
  22881. matcher = this._addPartial(matcher._classPartialMap, className);
  22882. }
  22883. }
  22884. }
  22885. if (lang_1.isPresent(attrs)) {
  22886. for (var index = 0; index < attrs.length;) {
  22887. var isTerminal = index === attrs.length - 2;
  22888. var attrName = attrs[index++];
  22889. var attrValue = attrs[index++];
  22890. if (isTerminal) {
  22891. var terminalMap = matcher._attrValueMap;
  22892. var terminalValuesMap = terminalMap.get(attrName);
  22893. if (lang_1.isBlank(terminalValuesMap)) {
  22894. terminalValuesMap = new collection_1.Map();
  22895. terminalMap.set(attrName, terminalValuesMap);
  22896. }
  22897. this._addTerminal(terminalValuesMap, attrValue, selectable);
  22898. }
  22899. else {
  22900. var parttialMap = matcher._attrValuePartialMap;
  22901. var partialValuesMap = parttialMap.get(attrName);
  22902. if (lang_1.isBlank(partialValuesMap)) {
  22903. partialValuesMap = new collection_1.Map();
  22904. parttialMap.set(attrName, partialValuesMap);
  22905. }
  22906. matcher = this._addPartial(partialValuesMap, attrValue);
  22907. }
  22908. }
  22909. }
  22910. };
  22911. SelectorMatcher.prototype._addTerminal = function (map, name, selectable) {
  22912. var terminalList = map.get(name);
  22913. if (lang_1.isBlank(terminalList)) {
  22914. terminalList = [];
  22915. map.set(name, terminalList);
  22916. }
  22917. terminalList.push(selectable);
  22918. };
  22919. SelectorMatcher.prototype._addPartial = function (map, name) {
  22920. var matcher = map.get(name);
  22921. if (lang_1.isBlank(matcher)) {
  22922. matcher = new SelectorMatcher();
  22923. map.set(name, matcher);
  22924. }
  22925. return matcher;
  22926. };
  22927. /**
  22928. * Find the objects that have been added via `addSelectable`
  22929. * whose css selector is contained in the given css selector.
  22930. * @param cssSelector A css selector
  22931. * @param matchedCallback This callback will be called with the object handed into `addSelectable`
  22932. * @return boolean true if a match was found
  22933. */
  22934. SelectorMatcher.prototype.match = function (cssSelector, matchedCallback) {
  22935. var result = false;
  22936. var element = cssSelector.element;
  22937. var classNames = cssSelector.classNames;
  22938. var attrs = cssSelector.attrs;
  22939. for (var i = 0; i < this._listContexts.length; i++) {
  22940. this._listContexts[i].alreadyMatched = false;
  22941. }
  22942. result = this._matchTerminal(this._elementMap, element, cssSelector, matchedCallback) || result;
  22943. result = this._matchPartial(this._elementPartialMap, element, cssSelector, matchedCallback) ||
  22944. result;
  22945. if (lang_1.isPresent(classNames)) {
  22946. for (var index = 0; index < classNames.length; index++) {
  22947. var className = classNames[index];
  22948. result =
  22949. this._matchTerminal(this._classMap, className, cssSelector, matchedCallback) || result;
  22950. result =
  22951. this._matchPartial(this._classPartialMap, className, cssSelector, matchedCallback) ||
  22952. result;
  22953. }
  22954. }
  22955. if (lang_1.isPresent(attrs)) {
  22956. for (var index = 0; index < attrs.length;) {
  22957. var attrName = attrs[index++];
  22958. var attrValue = attrs[index++];
  22959. var terminalValuesMap = this._attrValueMap.get(attrName);
  22960. if (!lang_1.StringWrapper.equals(attrValue, _EMPTY_ATTR_VALUE)) {
  22961. result = this._matchTerminal(terminalValuesMap, _EMPTY_ATTR_VALUE, cssSelector, matchedCallback) ||
  22962. result;
  22963. }
  22964. result = this._matchTerminal(terminalValuesMap, attrValue, cssSelector, matchedCallback) ||
  22965. result;
  22966. var partialValuesMap = this._attrValuePartialMap.get(attrName);
  22967. if (!lang_1.StringWrapper.equals(attrValue, _EMPTY_ATTR_VALUE)) {
  22968. result = this._matchPartial(partialValuesMap, _EMPTY_ATTR_VALUE, cssSelector, matchedCallback) ||
  22969. result;
  22970. }
  22971. result =
  22972. this._matchPartial(partialValuesMap, attrValue, cssSelector, matchedCallback) || result;
  22973. }
  22974. }
  22975. return result;
  22976. };
  22977. /** @internal */
  22978. SelectorMatcher.prototype._matchTerminal = function (map, name, cssSelector, matchedCallback) {
  22979. if (lang_1.isBlank(map) || lang_1.isBlank(name)) {
  22980. return false;
  22981. }
  22982. var selectables = map.get(name);
  22983. var starSelectables = map.get("*");
  22984. if (lang_1.isPresent(starSelectables)) {
  22985. selectables = selectables.concat(starSelectables);
  22986. }
  22987. if (lang_1.isBlank(selectables)) {
  22988. return false;
  22989. }
  22990. var selectable;
  22991. var result = false;
  22992. for (var index = 0; index < selectables.length; index++) {
  22993. selectable = selectables[index];
  22994. result = selectable.finalize(cssSelector, matchedCallback) || result;
  22995. }
  22996. return result;
  22997. };
  22998. /** @internal */
  22999. SelectorMatcher.prototype._matchPartial = function (map, name, cssSelector, matchedCallback /*: (c: CssSelector, a: any) => void*/) {
  23000. if (lang_1.isBlank(map) || lang_1.isBlank(name)) {
  23001. return false;
  23002. }
  23003. var nestedSelector = map.get(name);
  23004. if (lang_1.isBlank(nestedSelector)) {
  23005. return false;
  23006. }
  23007. // TODO(perf): get rid of recursion and measure again
  23008. // TODO(perf): don't pass the whole selector into the recursion,
  23009. // but only the not processed parts
  23010. return nestedSelector.match(cssSelector, matchedCallback);
  23011. };
  23012. return SelectorMatcher;
  23013. })();
  23014. exports.SelectorMatcher = SelectorMatcher;
  23015. var SelectorListContext = (function () {
  23016. function SelectorListContext(selectors) {
  23017. this.selectors = selectors;
  23018. this.alreadyMatched = false;
  23019. }
  23020. return SelectorListContext;
  23021. })();
  23022. exports.SelectorListContext = SelectorListContext;
  23023. // Store context to pass back selector and context when a selector is matched
  23024. var SelectorContext = (function () {
  23025. function SelectorContext(selector, cbContext, listContext) {
  23026. this.selector = selector;
  23027. this.cbContext = cbContext;
  23028. this.listContext = listContext;
  23029. this.notSelectors = selector.notSelectors;
  23030. }
  23031. SelectorContext.prototype.finalize = function (cssSelector, callback) {
  23032. var result = true;
  23033. if (this.notSelectors.length > 0 &&
  23034. (lang_1.isBlank(this.listContext) || !this.listContext.alreadyMatched)) {
  23035. var notMatcher = SelectorMatcher.createNotMatcher(this.notSelectors);
  23036. result = !notMatcher.match(cssSelector, null);
  23037. }
  23038. if (result && lang_1.isPresent(callback) &&
  23039. (lang_1.isBlank(this.listContext) || !this.listContext.alreadyMatched)) {
  23040. if (lang_1.isPresent(this.listContext)) {
  23041. this.listContext.alreadyMatched = true;
  23042. }
  23043. callback(this.selector, this.cbContext);
  23044. }
  23045. return result;
  23046. };
  23047. return SelectorContext;
  23048. })();
  23049. exports.SelectorContext = SelectorContext;
  23050. /***/ },
  23051. /* 155 */
  23052. /***/ function(module, exports, __webpack_require__) {
  23053. var lang_1 = __webpack_require__(5);
  23054. var CAMEL_CASE_REGEXP = /([A-Z])/g;
  23055. var DASH_CASE_REGEXP = /-([a-z])/g;
  23056. var SINGLE_QUOTE_ESCAPE_STRING_RE = /'|\\|\n|\r|\$/g;
  23057. var DOUBLE_QUOTE_ESCAPE_STRING_RE = /"|\\|\n|\r|\$/g;
  23058. exports.MODULE_SUFFIX = lang_1.IS_DART ? '.dart' : '.js';
  23059. function camelCaseToDashCase(input) {
  23060. return lang_1.StringWrapper.replaceAllMapped(input, CAMEL_CASE_REGEXP, function (m) { return '-' + m[1].toLowerCase(); });
  23061. }
  23062. exports.camelCaseToDashCase = camelCaseToDashCase;
  23063. function dashCaseToCamelCase(input) {
  23064. return lang_1.StringWrapper.replaceAllMapped(input, DASH_CASE_REGEXP, function (m) { return m[1].toUpperCase(); });
  23065. }
  23066. exports.dashCaseToCamelCase = dashCaseToCamelCase;
  23067. function escapeSingleQuoteString(input) {
  23068. if (lang_1.isBlank(input)) {
  23069. return null;
  23070. }
  23071. return "'" + escapeString(input, SINGLE_QUOTE_ESCAPE_STRING_RE) + "'";
  23072. }
  23073. exports.escapeSingleQuoteString = escapeSingleQuoteString;
  23074. function escapeDoubleQuoteString(input) {
  23075. if (lang_1.isBlank(input)) {
  23076. return null;
  23077. }
  23078. return "\"" + escapeString(input, DOUBLE_QUOTE_ESCAPE_STRING_RE) + "\"";
  23079. }
  23080. exports.escapeDoubleQuoteString = escapeDoubleQuoteString;
  23081. function escapeString(input, re) {
  23082. return lang_1.StringWrapper.replaceAllMapped(input, re, function (match) {
  23083. if (match[0] == '$') {
  23084. return lang_1.IS_DART ? '\\$' : '$';
  23085. }
  23086. else if (match[0] == '\n') {
  23087. return '\\n';
  23088. }
  23089. else if (match[0] == '\r') {
  23090. return '\\r';
  23091. }
  23092. else {
  23093. return "\\" + match[0];
  23094. }
  23095. });
  23096. }
  23097. function codeGenExportVariable(name) {
  23098. if (lang_1.IS_DART) {
  23099. return "const " + name + " = ";
  23100. }
  23101. else {
  23102. return "var " + name + " = exports['" + name + "'] = ";
  23103. }
  23104. }
  23105. exports.codeGenExportVariable = codeGenExportVariable;
  23106. function codeGenConstConstructorCall(name) {
  23107. if (lang_1.IS_DART) {
  23108. return "const " + name;
  23109. }
  23110. else {
  23111. return "new " + name;
  23112. }
  23113. }
  23114. exports.codeGenConstConstructorCall = codeGenConstConstructorCall;
  23115. function codeGenValueFn(params, value, fnName) {
  23116. if (fnName === void 0) { fnName = ''; }
  23117. if (lang_1.IS_DART) {
  23118. return fnName + "(" + params.join(',') + ") => " + value;
  23119. }
  23120. else {
  23121. return "function " + fnName + "(" + params.join(',') + ") { return " + value + "; }";
  23122. }
  23123. }
  23124. exports.codeGenValueFn = codeGenValueFn;
  23125. function codeGenToString(expr) {
  23126. if (lang_1.IS_DART) {
  23127. return "'${" + expr + "}'";
  23128. }
  23129. else {
  23130. // JS automatically convets to string...
  23131. return expr;
  23132. }
  23133. }
  23134. exports.codeGenToString = codeGenToString;
  23135. function splitAtColon(input, defaultValues) {
  23136. var parts = lang_1.StringWrapper.split(input.trim(), /\s*:\s*/g);
  23137. if (parts.length > 1) {
  23138. return parts;
  23139. }
  23140. else {
  23141. return defaultValues;
  23142. }
  23143. }
  23144. exports.splitAtColon = splitAtColon;
  23145. /***/ },
  23146. /* 156 */
  23147. /***/ function(module, exports, __webpack_require__) {
  23148. var lang_1 = __webpack_require__(5);
  23149. var MODULE_REGEXP = /#MODULE\[([^\]]*)\]/g;
  23150. function moduleRef(moduleUrl) {
  23151. return "#MODULE[" + moduleUrl + "]";
  23152. }
  23153. exports.moduleRef = moduleRef;
  23154. /**
  23155. * Represents generated source code with module references. Internal to the Angular compiler.
  23156. */
  23157. var SourceModule = (function () {
  23158. function SourceModule(moduleUrl, sourceWithModuleRefs) {
  23159. this.moduleUrl = moduleUrl;
  23160. this.sourceWithModuleRefs = sourceWithModuleRefs;
  23161. }
  23162. SourceModule.prototype.getSourceWithImports = function () {
  23163. var _this = this;
  23164. var moduleAliases = {};
  23165. var imports = [];
  23166. var newSource = lang_1.StringWrapper.replaceAllMapped(this.sourceWithModuleRefs, MODULE_REGEXP, function (match) {
  23167. var moduleUrl = match[1];
  23168. var alias = moduleAliases[moduleUrl];
  23169. if (lang_1.isBlank(alias)) {
  23170. if (moduleUrl == _this.moduleUrl) {
  23171. alias = '';
  23172. }
  23173. else {
  23174. alias = "import" + imports.length;
  23175. imports.push([moduleUrl, alias]);
  23176. }
  23177. moduleAliases[moduleUrl] = alias;
  23178. }
  23179. return alias.length > 0 ? alias + "." : '';
  23180. });
  23181. return new SourceWithImports(newSource, imports);
  23182. };
  23183. return SourceModule;
  23184. })();
  23185. exports.SourceModule = SourceModule;
  23186. var SourceExpression = (function () {
  23187. function SourceExpression(declarations, expression) {
  23188. this.declarations = declarations;
  23189. this.expression = expression;
  23190. }
  23191. return SourceExpression;
  23192. })();
  23193. exports.SourceExpression = SourceExpression;
  23194. var SourceExpressions = (function () {
  23195. function SourceExpressions(declarations, expressions) {
  23196. this.declarations = declarations;
  23197. this.expressions = expressions;
  23198. }
  23199. return SourceExpressions;
  23200. })();
  23201. exports.SourceExpressions = SourceExpressions;
  23202. /**
  23203. * Represents generated source code with imports. Internal to the Angular compiler.
  23204. */
  23205. var SourceWithImports = (function () {
  23206. function SourceWithImports(source, imports) {
  23207. this.source = source;
  23208. this.imports = imports;
  23209. }
  23210. return SourceWithImports;
  23211. })();
  23212. exports.SourceWithImports = SourceWithImports;
  23213. /***/ },
  23214. /* 157 */
  23215. /***/ function(module, exports, __webpack_require__) {
  23216. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  23217. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  23218. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  23219. 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;
  23220. return c > 3 && r && Object.defineProperty(target, key, r), r;
  23221. };
  23222. var __metadata = (this && this.__metadata) || function (k, v) {
  23223. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  23224. };
  23225. var source_module_1 = __webpack_require__(156);
  23226. var change_detection_jit_generator_1 = __webpack_require__(52);
  23227. var change_definition_factory_1 = __webpack_require__(158);
  23228. var lang_1 = __webpack_require__(5);
  23229. var change_detection_1 = __webpack_require__(25);
  23230. var change_detector_codegen_1 = __webpack_require__(160);
  23231. var util_1 = __webpack_require__(155);
  23232. var di_1 = __webpack_require__(6);
  23233. var ABSTRACT_CHANGE_DETECTOR = "AbstractChangeDetector";
  23234. var UTIL = "ChangeDetectionUtil";
  23235. var CHANGE_DETECTOR_STATE = "ChangeDetectorState";
  23236. var ABSTRACT_CHANGE_DETECTOR_MODULE = source_module_1.moduleRef("package:angular2/src/core/change_detection/abstract_change_detector" + util_1.MODULE_SUFFIX);
  23237. var UTIL_MODULE = source_module_1.moduleRef("package:angular2/src/core/change_detection/change_detection_util" + util_1.MODULE_SUFFIX);
  23238. var PREGEN_PROTO_CHANGE_DETECTOR_MODULE = source_module_1.moduleRef("package:angular2/src/core/change_detection/pregen_proto_change_detector" + util_1.MODULE_SUFFIX);
  23239. var CONSTANTS_MODULE = source_module_1.moduleRef("package:angular2/src/core/change_detection/constants" + util_1.MODULE_SUFFIX);
  23240. var ChangeDetectionCompiler = (function () {
  23241. function ChangeDetectionCompiler(_genConfig) {
  23242. this._genConfig = _genConfig;
  23243. }
  23244. ChangeDetectionCompiler.prototype.compileComponentRuntime = function (componentType, strategy, parsedTemplate) {
  23245. var _this = this;
  23246. var changeDetectorDefinitions = change_definition_factory_1.createChangeDetectorDefinitions(componentType, strategy, this._genConfig, parsedTemplate);
  23247. return changeDetectorDefinitions.map(function (definition) {
  23248. return _this._createChangeDetectorFactory(definition);
  23249. });
  23250. };
  23251. ChangeDetectionCompiler.prototype._createChangeDetectorFactory = function (definition) {
  23252. if (lang_1.IS_DART || !this._genConfig.useJit) {
  23253. var proto = new change_detection_1.DynamicProtoChangeDetector(definition);
  23254. return function (dispatcher) { return proto.instantiate(dispatcher); };
  23255. }
  23256. else {
  23257. return new change_detection_jit_generator_1.ChangeDetectorJITGenerator(definition, UTIL, ABSTRACT_CHANGE_DETECTOR, CHANGE_DETECTOR_STATE)
  23258. .generate();
  23259. }
  23260. };
  23261. ChangeDetectionCompiler.prototype.compileComponentCodeGen = function (componentType, strategy, parsedTemplate) {
  23262. var changeDetectorDefinitions = change_definition_factory_1.createChangeDetectorDefinitions(componentType, strategy, this._genConfig, parsedTemplate);
  23263. var factories = [];
  23264. var index = 0;
  23265. var sourceParts = changeDetectorDefinitions.map(function (definition) {
  23266. var codegen;
  23267. var sourcePart;
  23268. // TODO(tbosch): move the 2 code generators to the same place, one with .dart and one with .ts
  23269. // suffix
  23270. // and have the same API for calling them!
  23271. if (lang_1.IS_DART) {
  23272. codegen = new change_detector_codegen_1.Codegen(PREGEN_PROTO_CHANGE_DETECTOR_MODULE);
  23273. var className = "_" + definition.id;
  23274. var typeRef = (index === 0 && componentType.isHost) ?
  23275. 'dynamic' :
  23276. "" + source_module_1.moduleRef(componentType.moduleUrl) + componentType.name;
  23277. codegen.generate(typeRef, className, definition);
  23278. factories.push(className + ".newChangeDetector");
  23279. sourcePart = codegen.toString();
  23280. }
  23281. else {
  23282. codegen = new change_detection_jit_generator_1.ChangeDetectorJITGenerator(definition, "" + UTIL_MODULE + UTIL, "" + ABSTRACT_CHANGE_DETECTOR_MODULE + ABSTRACT_CHANGE_DETECTOR, "" + CONSTANTS_MODULE + CHANGE_DETECTOR_STATE);
  23283. factories.push("function(dispatcher) { return new " + codegen.typeName + "(dispatcher); }");
  23284. sourcePart = codegen.generateSource();
  23285. }
  23286. index++;
  23287. return sourcePart;
  23288. });
  23289. return new source_module_1.SourceExpressions(sourceParts, factories);
  23290. };
  23291. ChangeDetectionCompiler = __decorate([
  23292. di_1.Injectable(),
  23293. __metadata('design:paramtypes', [change_detection_1.ChangeDetectorGenConfig])
  23294. ], ChangeDetectionCompiler);
  23295. return ChangeDetectionCompiler;
  23296. })();
  23297. exports.ChangeDetectionCompiler = ChangeDetectionCompiler;
  23298. /***/ },
  23299. /* 158 */
  23300. /***/ function(module, exports, __webpack_require__) {
  23301. var collection_1 = __webpack_require__(12);
  23302. var lang_1 = __webpack_require__(5);
  23303. var reflection_1 = __webpack_require__(16);
  23304. var change_detection_1 = __webpack_require__(25);
  23305. var template_ast_1 = __webpack_require__(159);
  23306. var interfaces_1 = __webpack_require__(89);
  23307. function createChangeDetectorDefinitions(componentType, componentStrategy, genConfig, parsedTemplate) {
  23308. var pvVisitors = [];
  23309. var visitor = new ProtoViewVisitor(null, pvVisitors, componentStrategy);
  23310. template_ast_1.templateVisitAll(visitor, parsedTemplate);
  23311. return createChangeDefinitions(pvVisitors, componentType, genConfig);
  23312. }
  23313. exports.createChangeDetectorDefinitions = createChangeDetectorDefinitions;
  23314. var ProtoViewVisitor = (function () {
  23315. function ProtoViewVisitor(parent, allVisitors, strategy) {
  23316. this.parent = parent;
  23317. this.allVisitors = allVisitors;
  23318. this.strategy = strategy;
  23319. this.boundTextCount = 0;
  23320. this.boundElementCount = 0;
  23321. this.variableNames = [];
  23322. this.bindingRecords = [];
  23323. this.eventRecords = [];
  23324. this.directiveRecords = [];
  23325. this.viewIndex = allVisitors.length;
  23326. allVisitors.push(this);
  23327. }
  23328. ProtoViewVisitor.prototype.visitEmbeddedTemplate = function (ast, context) {
  23329. this.boundElementCount++;
  23330. template_ast_1.templateVisitAll(this, ast.outputs);
  23331. for (var i = 0; i < ast.directives.length; i++) {
  23332. ast.directives[i].visit(this, i);
  23333. }
  23334. var childVisitor = new ProtoViewVisitor(this, this.allVisitors, change_detection_1.ChangeDetectionStrategy.Default);
  23335. // Attention: variables present on an embedded template count towards
  23336. // the embedded template and not the template anchor!
  23337. template_ast_1.templateVisitAll(childVisitor, ast.vars);
  23338. template_ast_1.templateVisitAll(childVisitor, ast.children);
  23339. return null;
  23340. };
  23341. ProtoViewVisitor.prototype.visitElement = function (ast, context) {
  23342. if (ast.isBound()) {
  23343. this.boundElementCount++;
  23344. }
  23345. template_ast_1.templateVisitAll(this, ast.inputs, null);
  23346. template_ast_1.templateVisitAll(this, ast.outputs);
  23347. template_ast_1.templateVisitAll(this, ast.exportAsVars);
  23348. for (var i = 0; i < ast.directives.length; i++) {
  23349. ast.directives[i].visit(this, i);
  23350. }
  23351. template_ast_1.templateVisitAll(this, ast.children);
  23352. return null;
  23353. };
  23354. ProtoViewVisitor.prototype.visitNgContent = function (ast, context) { return null; };
  23355. ProtoViewVisitor.prototype.visitVariable = function (ast, context) {
  23356. this.variableNames.push(ast.name);
  23357. return null;
  23358. };
  23359. ProtoViewVisitor.prototype.visitEvent = function (ast, directiveRecord) {
  23360. var bindingRecord = lang_1.isPresent(directiveRecord) ?
  23361. change_detection_1.BindingRecord.createForHostEvent(ast.handler, ast.fullName, directiveRecord) :
  23362. change_detection_1.BindingRecord.createForEvent(ast.handler, ast.fullName, this.boundElementCount - 1);
  23363. this.eventRecords.push(bindingRecord);
  23364. return null;
  23365. };
  23366. ProtoViewVisitor.prototype.visitElementProperty = function (ast, directiveRecord) {
  23367. var boundElementIndex = this.boundElementCount - 1;
  23368. var dirIndex = lang_1.isPresent(directiveRecord) ? directiveRecord.directiveIndex : null;
  23369. var bindingRecord;
  23370. if (ast.type === template_ast_1.PropertyBindingType.Property) {
  23371. bindingRecord =
  23372. lang_1.isPresent(dirIndex) ?
  23373. change_detection_1.BindingRecord.createForHostProperty(dirIndex, ast.value, ast.name) :
  23374. change_detection_1.BindingRecord.createForElementProperty(ast.value, boundElementIndex, ast.name);
  23375. }
  23376. else if (ast.type === template_ast_1.PropertyBindingType.Attribute) {
  23377. bindingRecord =
  23378. lang_1.isPresent(dirIndex) ?
  23379. change_detection_1.BindingRecord.createForHostAttribute(dirIndex, ast.value, ast.name) :
  23380. change_detection_1.BindingRecord.createForElementAttribute(ast.value, boundElementIndex, ast.name);
  23381. }
  23382. else if (ast.type === template_ast_1.PropertyBindingType.Class) {
  23383. bindingRecord =
  23384. lang_1.isPresent(dirIndex) ?
  23385. change_detection_1.BindingRecord.createForHostClass(dirIndex, ast.value, ast.name) :
  23386. change_detection_1.BindingRecord.createForElementClass(ast.value, boundElementIndex, ast.name);
  23387. }
  23388. else if (ast.type === template_ast_1.PropertyBindingType.Style) {
  23389. bindingRecord =
  23390. lang_1.isPresent(dirIndex) ?
  23391. change_detection_1.BindingRecord.createForHostStyle(dirIndex, ast.value, ast.name, ast.unit) :
  23392. change_detection_1.BindingRecord.createForElementStyle(ast.value, boundElementIndex, ast.name, ast.unit);
  23393. }
  23394. this.bindingRecords.push(bindingRecord);
  23395. return null;
  23396. };
  23397. ProtoViewVisitor.prototype.visitAttr = function (ast, context) { return null; };
  23398. ProtoViewVisitor.prototype.visitBoundText = function (ast, context) {
  23399. var boundTextIndex = this.boundTextCount++;
  23400. this.bindingRecords.push(change_detection_1.BindingRecord.createForTextNode(ast.value, boundTextIndex));
  23401. return null;
  23402. };
  23403. ProtoViewVisitor.prototype.visitText = function (ast, context) { return null; };
  23404. ProtoViewVisitor.prototype.visitDirective = function (ast, directiveIndexAsNumber) {
  23405. var directiveIndex = new change_detection_1.DirectiveIndex(this.boundElementCount - 1, directiveIndexAsNumber);
  23406. var directiveMetadata = ast.directive;
  23407. var directiveRecord = new change_detection_1.DirectiveRecord({
  23408. directiveIndex: directiveIndex,
  23409. callAfterContentInit: directiveMetadata.lifecycleHooks.indexOf(interfaces_1.LifecycleHooks.AfterContentInit) !== -1,
  23410. callAfterContentChecked: directiveMetadata.lifecycleHooks.indexOf(interfaces_1.LifecycleHooks.AfterContentChecked) !== -1,
  23411. callAfterViewInit: directiveMetadata.lifecycleHooks.indexOf(interfaces_1.LifecycleHooks.AfterViewInit) !== -1,
  23412. callAfterViewChecked: directiveMetadata.lifecycleHooks.indexOf(interfaces_1.LifecycleHooks.AfterViewChecked) !== -1,
  23413. callOnChanges: directiveMetadata.lifecycleHooks.indexOf(interfaces_1.LifecycleHooks.OnChanges) !== -1,
  23414. callDoCheck: directiveMetadata.lifecycleHooks.indexOf(interfaces_1.LifecycleHooks.DoCheck) !== -1,
  23415. callOnInit: directiveMetadata.lifecycleHooks.indexOf(interfaces_1.LifecycleHooks.OnInit) !== -1,
  23416. changeDetection: directiveMetadata.changeDetection
  23417. });
  23418. this.directiveRecords.push(directiveRecord);
  23419. template_ast_1.templateVisitAll(this, ast.inputs, directiveRecord);
  23420. var bindingRecords = this.bindingRecords;
  23421. if (directiveRecord.callOnChanges) {
  23422. bindingRecords.push(change_detection_1.BindingRecord.createDirectiveOnChanges(directiveRecord));
  23423. }
  23424. if (directiveRecord.callOnInit) {
  23425. bindingRecords.push(change_detection_1.BindingRecord.createDirectiveOnInit(directiveRecord));
  23426. }
  23427. if (directiveRecord.callDoCheck) {
  23428. bindingRecords.push(change_detection_1.BindingRecord.createDirectiveDoCheck(directiveRecord));
  23429. }
  23430. template_ast_1.templateVisitAll(this, ast.hostProperties, directiveRecord);
  23431. template_ast_1.templateVisitAll(this, ast.hostEvents, directiveRecord);
  23432. template_ast_1.templateVisitAll(this, ast.exportAsVars);
  23433. return null;
  23434. };
  23435. ProtoViewVisitor.prototype.visitDirectiveProperty = function (ast, directiveRecord) {
  23436. // TODO: these setters should eventually be created by change detection, to make
  23437. // it monomorphic!
  23438. var setter = reflection_1.reflector.setter(ast.directiveName);
  23439. this.bindingRecords.push(change_detection_1.BindingRecord.createForDirective(ast.value, ast.directiveName, setter, directiveRecord));
  23440. return null;
  23441. };
  23442. return ProtoViewVisitor;
  23443. })();
  23444. function createChangeDefinitions(pvVisitors, componentType, genConfig) {
  23445. var pvVariableNames = _collectNestedProtoViewsVariableNames(pvVisitors);
  23446. return pvVisitors.map(function (pvVisitor) {
  23447. var id = componentType.name + "_" + pvVisitor.viewIndex;
  23448. return new change_detection_1.ChangeDetectorDefinition(id, pvVisitor.strategy, pvVariableNames[pvVisitor.viewIndex], pvVisitor.bindingRecords, pvVisitor.eventRecords, pvVisitor.directiveRecords, genConfig);
  23449. });
  23450. }
  23451. function _collectNestedProtoViewsVariableNames(pvVisitors) {
  23452. var nestedPvVariableNames = collection_1.ListWrapper.createFixedSize(pvVisitors.length);
  23453. pvVisitors.forEach(function (pv) {
  23454. var parentVariableNames = lang_1.isPresent(pv.parent) ? nestedPvVariableNames[pv.parent.viewIndex] : [];
  23455. nestedPvVariableNames[pv.viewIndex] = parentVariableNames.concat(pv.variableNames);
  23456. });
  23457. return nestedPvVariableNames;
  23458. }
  23459. /***/ },
  23460. /* 159 */
  23461. /***/ function(module, exports, __webpack_require__) {
  23462. var lang_1 = __webpack_require__(5);
  23463. /**
  23464. * A segment of text within the template.
  23465. */
  23466. var TextAst = (function () {
  23467. function TextAst(value, ngContentIndex, sourceSpan) {
  23468. this.value = value;
  23469. this.ngContentIndex = ngContentIndex;
  23470. this.sourceSpan = sourceSpan;
  23471. }
  23472. TextAst.prototype.visit = function (visitor, context) { return visitor.visitText(this, context); };
  23473. return TextAst;
  23474. })();
  23475. exports.TextAst = TextAst;
  23476. /**
  23477. * A bound expression within the text of a template.
  23478. */
  23479. var BoundTextAst = (function () {
  23480. function BoundTextAst(value, ngContentIndex, sourceSpan) {
  23481. this.value = value;
  23482. this.ngContentIndex = ngContentIndex;
  23483. this.sourceSpan = sourceSpan;
  23484. }
  23485. BoundTextAst.prototype.visit = function (visitor, context) {
  23486. return visitor.visitBoundText(this, context);
  23487. };
  23488. return BoundTextAst;
  23489. })();
  23490. exports.BoundTextAst = BoundTextAst;
  23491. /**
  23492. * A plain attribute on an element.
  23493. */
  23494. var AttrAst = (function () {
  23495. function AttrAst(name, value, sourceSpan) {
  23496. this.name = name;
  23497. this.value = value;
  23498. this.sourceSpan = sourceSpan;
  23499. }
  23500. AttrAst.prototype.visit = function (visitor, context) { return visitor.visitAttr(this, context); };
  23501. return AttrAst;
  23502. })();
  23503. exports.AttrAst = AttrAst;
  23504. /**
  23505. * A binding for an element property (e.g. `[property]="expression"`).
  23506. */
  23507. var BoundElementPropertyAst = (function () {
  23508. function BoundElementPropertyAst(name, type, value, unit, sourceSpan) {
  23509. this.name = name;
  23510. this.type = type;
  23511. this.value = value;
  23512. this.unit = unit;
  23513. this.sourceSpan = sourceSpan;
  23514. }
  23515. BoundElementPropertyAst.prototype.visit = function (visitor, context) {
  23516. return visitor.visitElementProperty(this, context);
  23517. };
  23518. return BoundElementPropertyAst;
  23519. })();
  23520. exports.BoundElementPropertyAst = BoundElementPropertyAst;
  23521. /**
  23522. * A binding for an element event (e.g. `(event)="handler()"`).
  23523. */
  23524. var BoundEventAst = (function () {
  23525. function BoundEventAst(name, target, handler, sourceSpan) {
  23526. this.name = name;
  23527. this.target = target;
  23528. this.handler = handler;
  23529. this.sourceSpan = sourceSpan;
  23530. }
  23531. BoundEventAst.prototype.visit = function (visitor, context) {
  23532. return visitor.visitEvent(this, context);
  23533. };
  23534. Object.defineProperty(BoundEventAst.prototype, "fullName", {
  23535. get: function () {
  23536. if (lang_1.isPresent(this.target)) {
  23537. return this.target + ":" + this.name;
  23538. }
  23539. else {
  23540. return this.name;
  23541. }
  23542. },
  23543. enumerable: true,
  23544. configurable: true
  23545. });
  23546. return BoundEventAst;
  23547. })();
  23548. exports.BoundEventAst = BoundEventAst;
  23549. /**
  23550. * A variable declaration on an element (e.g. `#var="expression"`).
  23551. */
  23552. var VariableAst = (function () {
  23553. function VariableAst(name, value, sourceSpan) {
  23554. this.name = name;
  23555. this.value = value;
  23556. this.sourceSpan = sourceSpan;
  23557. }
  23558. VariableAst.prototype.visit = function (visitor, context) {
  23559. return visitor.visitVariable(this, context);
  23560. };
  23561. return VariableAst;
  23562. })();
  23563. exports.VariableAst = VariableAst;
  23564. /**
  23565. * An element declaration in a template.
  23566. */
  23567. var ElementAst = (function () {
  23568. function ElementAst(name, attrs, inputs, outputs, exportAsVars, directives, children, ngContentIndex, sourceSpan) {
  23569. this.name = name;
  23570. this.attrs = attrs;
  23571. this.inputs = inputs;
  23572. this.outputs = outputs;
  23573. this.exportAsVars = exportAsVars;
  23574. this.directives = directives;
  23575. this.children = children;
  23576. this.ngContentIndex = ngContentIndex;
  23577. this.sourceSpan = sourceSpan;
  23578. }
  23579. ElementAst.prototype.visit = function (visitor, context) {
  23580. return visitor.visitElement(this, context);
  23581. };
  23582. /**
  23583. * Whether the element has any active bindings (inputs, outputs, vars, or directives).
  23584. */
  23585. ElementAst.prototype.isBound = function () {
  23586. return (this.inputs.length > 0 || this.outputs.length > 0 || this.exportAsVars.length > 0 ||
  23587. this.directives.length > 0);
  23588. };
  23589. /**
  23590. * Get the component associated with this element, if any.
  23591. */
  23592. ElementAst.prototype.getComponent = function () {
  23593. return this.directives.length > 0 && this.directives[0].directive.isComponent ?
  23594. this.directives[0].directive :
  23595. null;
  23596. };
  23597. return ElementAst;
  23598. })();
  23599. exports.ElementAst = ElementAst;
  23600. /**
  23601. * A `<template>` element included in an Angular template.
  23602. */
  23603. var EmbeddedTemplateAst = (function () {
  23604. function EmbeddedTemplateAst(attrs, outputs, vars, directives, children, ngContentIndex, sourceSpan) {
  23605. this.attrs = attrs;
  23606. this.outputs = outputs;
  23607. this.vars = vars;
  23608. this.directives = directives;
  23609. this.children = children;
  23610. this.ngContentIndex = ngContentIndex;
  23611. this.sourceSpan = sourceSpan;
  23612. }
  23613. EmbeddedTemplateAst.prototype.visit = function (visitor, context) {
  23614. return visitor.visitEmbeddedTemplate(this, context);
  23615. };
  23616. return EmbeddedTemplateAst;
  23617. })();
  23618. exports.EmbeddedTemplateAst = EmbeddedTemplateAst;
  23619. /**
  23620. * A directive property with a bound value (e.g. `*ngIf="condition").
  23621. */
  23622. var BoundDirectivePropertyAst = (function () {
  23623. function BoundDirectivePropertyAst(directiveName, templateName, value, sourceSpan) {
  23624. this.directiveName = directiveName;
  23625. this.templateName = templateName;
  23626. this.value = value;
  23627. this.sourceSpan = sourceSpan;
  23628. }
  23629. BoundDirectivePropertyAst.prototype.visit = function (visitor, context) {
  23630. return visitor.visitDirectiveProperty(this, context);
  23631. };
  23632. return BoundDirectivePropertyAst;
  23633. })();
  23634. exports.BoundDirectivePropertyAst = BoundDirectivePropertyAst;
  23635. /**
  23636. * A directive declared on an element.
  23637. */
  23638. var DirectiveAst = (function () {
  23639. function DirectiveAst(directive, inputs, hostProperties, hostEvents, exportAsVars, sourceSpan) {
  23640. this.directive = directive;
  23641. this.inputs = inputs;
  23642. this.hostProperties = hostProperties;
  23643. this.hostEvents = hostEvents;
  23644. this.exportAsVars = exportAsVars;
  23645. this.sourceSpan = sourceSpan;
  23646. }
  23647. DirectiveAst.prototype.visit = function (visitor, context) {
  23648. return visitor.visitDirective(this, context);
  23649. };
  23650. return DirectiveAst;
  23651. })();
  23652. exports.DirectiveAst = DirectiveAst;
  23653. /**
  23654. * Position where content is to be projected (instance of `<ng-content>` in a template).
  23655. */
  23656. var NgContentAst = (function () {
  23657. function NgContentAst(index, ngContentIndex, sourceSpan) {
  23658. this.index = index;
  23659. this.ngContentIndex = ngContentIndex;
  23660. this.sourceSpan = sourceSpan;
  23661. }
  23662. NgContentAst.prototype.visit = function (visitor, context) {
  23663. return visitor.visitNgContent(this, context);
  23664. };
  23665. return NgContentAst;
  23666. })();
  23667. exports.NgContentAst = NgContentAst;
  23668. /**
  23669. * Enumeration of types of property bindings.
  23670. */
  23671. (function (PropertyBindingType) {
  23672. /**
  23673. * A normal binding to a property (e.g. `[property]="expression"`).
  23674. */
  23675. PropertyBindingType[PropertyBindingType["Property"] = 0] = "Property";
  23676. /**
  23677. * A binding to an element attribute (e.g. `[attr.name]="expression"`).
  23678. */
  23679. PropertyBindingType[PropertyBindingType["Attribute"] = 1] = "Attribute";
  23680. /**
  23681. * A binding to a CSS class (e.g. `[class.name]="condition"`).
  23682. */
  23683. PropertyBindingType[PropertyBindingType["Class"] = 2] = "Class";
  23684. /**
  23685. * A binding to a style rule (e.g. `[style.rule]="expression"`).
  23686. */
  23687. PropertyBindingType[PropertyBindingType["Style"] = 3] = "Style";
  23688. })(exports.PropertyBindingType || (exports.PropertyBindingType = {}));
  23689. var PropertyBindingType = exports.PropertyBindingType;
  23690. /**
  23691. * Visit every node in a list of {@link TemplateAst}s with the given {@link TemplateAstVisitor}.
  23692. */
  23693. function templateVisitAll(visitor, asts, context) {
  23694. if (context === void 0) { context = null; }
  23695. var result = [];
  23696. asts.forEach(function (ast) {
  23697. var astResult = ast.visit(visitor, context);
  23698. if (lang_1.isPresent(astResult)) {
  23699. result.push(astResult);
  23700. }
  23701. });
  23702. return result;
  23703. }
  23704. exports.templateVisitAll = templateVisitAll;
  23705. /***/ },
  23706. /* 160 */
  23707. /***/ function(module, exports) {
  23708. // Note: This class is only here so that we can reference it from TypeScript code.
  23709. // The actual implementation lives under modules_dart.
  23710. // TODO(tbosch): Move the corresponding code into angular2/src/compiler once
  23711. // the new compiler is done.
  23712. var Codegen = (function () {
  23713. function Codegen(moduleAlias) {
  23714. }
  23715. Codegen.prototype.generate = function (typeName, changeDetectorTypeName, def) {
  23716. throw "Not implemented in JS";
  23717. };
  23718. Codegen.prototype.toString = function () { throw "Not implemented in JS"; };
  23719. return Codegen;
  23720. })();
  23721. exports.Codegen = Codegen;
  23722. /***/ },
  23723. /* 161 */
  23724. /***/ function(module, exports, __webpack_require__) {
  23725. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  23726. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  23727. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  23728. 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;
  23729. return c > 3 && r && Object.defineProperty(target, key, r), r;
  23730. };
  23731. var __metadata = (this && this.__metadata) || function (k, v) {
  23732. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  23733. };
  23734. var source_module_1 = __webpack_require__(156);
  23735. var view_1 = __webpack_require__(56);
  23736. var xhr_1 = __webpack_require__(149);
  23737. var lang_1 = __webpack_require__(5);
  23738. var async_1 = __webpack_require__(60);
  23739. var shadow_css_1 = __webpack_require__(162);
  23740. var url_resolver_1 = __webpack_require__(148);
  23741. var style_url_resolver_1 = __webpack_require__(163);
  23742. var util_1 = __webpack_require__(155);
  23743. var di_1 = __webpack_require__(6);
  23744. var view_factory_1 = __webpack_require__(164);
  23745. var StyleCompiler = (function () {
  23746. function StyleCompiler(_xhr, _urlResolver) {
  23747. this._xhr = _xhr;
  23748. this._urlResolver = _urlResolver;
  23749. this._styleCache = new Map();
  23750. this._shadowCss = new shadow_css_1.ShadowCss();
  23751. }
  23752. StyleCompiler.prototype.compileComponentRuntime = function (template) {
  23753. var styles = template.styles;
  23754. var styleAbsUrls = template.styleUrls;
  23755. return this._loadStyles(styles, styleAbsUrls, template.encapsulation === view_1.ViewEncapsulation.Emulated);
  23756. };
  23757. StyleCompiler.prototype.compileComponentCodeGen = function (template) {
  23758. var shim = template.encapsulation === view_1.ViewEncapsulation.Emulated;
  23759. return this._styleCodeGen(template.styles, template.styleUrls, shim);
  23760. };
  23761. StyleCompiler.prototype.compileStylesheetCodeGen = function (stylesheetUrl, cssText) {
  23762. var styleWithImports = style_url_resolver_1.extractStyleUrls(this._urlResolver, stylesheetUrl, cssText);
  23763. return [
  23764. this._styleModule(stylesheetUrl, false, this._styleCodeGen([styleWithImports.style], styleWithImports.styleUrls, false)),
  23765. this._styleModule(stylesheetUrl, true, this._styleCodeGen([styleWithImports.style], styleWithImports.styleUrls, true))
  23766. ];
  23767. };
  23768. StyleCompiler.prototype.clearCache = function () { this._styleCache.clear(); };
  23769. StyleCompiler.prototype._loadStyles = function (plainStyles, absUrls, encapsulate) {
  23770. var _this = this;
  23771. var promises = absUrls.map(function (absUrl) {
  23772. var cacheKey = "" + absUrl + (encapsulate ? '.shim' : '');
  23773. var result = _this._styleCache.get(cacheKey);
  23774. if (lang_1.isBlank(result)) {
  23775. result = _this._xhr.get(absUrl).then(function (style) {
  23776. var styleWithImports = style_url_resolver_1.extractStyleUrls(_this._urlResolver, absUrl, style);
  23777. return _this._loadStyles([styleWithImports.style], styleWithImports.styleUrls, encapsulate);
  23778. });
  23779. _this._styleCache.set(cacheKey, result);
  23780. }
  23781. return result;
  23782. });
  23783. return async_1.PromiseWrapper.all(promises).then(function (nestedStyles) {
  23784. var result = plainStyles.map(function (plainStyle) { return _this._shimIfNeeded(plainStyle, encapsulate); });
  23785. nestedStyles.forEach(function (styles) { return result.push(styles); });
  23786. return result;
  23787. });
  23788. };
  23789. StyleCompiler.prototype._styleCodeGen = function (plainStyles, absUrls, shim) {
  23790. var _this = this;
  23791. var arrayPrefix = lang_1.IS_DART ? "const" : '';
  23792. var styleExpressions = plainStyles.map(function (plainStyle) { return util_1.escapeSingleQuoteString(_this._shimIfNeeded(plainStyle, shim)); });
  23793. for (var i = 0; i < absUrls.length; i++) {
  23794. var moduleUrl = this._createModuleUrl(absUrls[i], shim);
  23795. styleExpressions.push(source_module_1.moduleRef(moduleUrl) + "STYLES");
  23796. }
  23797. var expressionSource = arrayPrefix + " [" + styleExpressions.join(',') + "]";
  23798. return new source_module_1.SourceExpression([], expressionSource);
  23799. };
  23800. StyleCompiler.prototype._styleModule = function (stylesheetUrl, shim, expression) {
  23801. var moduleSource = "\n " + expression.declarations.join('\n') + "\n " + util_1.codeGenExportVariable('STYLES') + expression.expression + ";\n ";
  23802. return new source_module_1.SourceModule(this._createModuleUrl(stylesheetUrl, shim), moduleSource);
  23803. };
  23804. StyleCompiler.prototype._shimIfNeeded = function (style, shim) {
  23805. return shim ? this._shadowCss.shimCssText(style, view_factory_1.CONTENT_ATTR, view_factory_1.HOST_ATTR) : style;
  23806. };
  23807. StyleCompiler.prototype._createModuleUrl = function (stylesheetUrl, shim) {
  23808. return shim ? stylesheetUrl + ".shim" + util_1.MODULE_SUFFIX : "" + stylesheetUrl + util_1.MODULE_SUFFIX;
  23809. };
  23810. StyleCompiler = __decorate([
  23811. di_1.Injectable(),
  23812. __metadata('design:paramtypes', [xhr_1.XHR, url_resolver_1.UrlResolver])
  23813. ], StyleCompiler);
  23814. return StyleCompiler;
  23815. })();
  23816. exports.StyleCompiler = StyleCompiler;
  23817. /***/ },
  23818. /* 162 */
  23819. /***/ function(module, exports, __webpack_require__) {
  23820. var collection_1 = __webpack_require__(12);
  23821. var lang_1 = __webpack_require__(5);
  23822. /**
  23823. * This file is a port of shadowCSS from webcomponents.js to TypeScript.
  23824. *
  23825. * Please make sure to keep to edits in sync with the source file.
  23826. *
  23827. * Source:
  23828. * https://github.com/webcomponents/webcomponentsjs/blob/4efecd7e0e/src/ShadowCSS/ShadowCSS.js
  23829. *
  23830. * The original file level comment is reproduced below
  23831. */
  23832. /*
  23833. This is a limited shim for ShadowDOM css styling.
  23834. https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles
  23835. The intention here is to support only the styling features which can be
  23836. relatively simply implemented. The goal is to allow users to avoid the
  23837. most obvious pitfalls and do so without compromising performance significantly.
  23838. For ShadowDOM styling that's not covered here, a set of best practices
  23839. can be provided that should allow users to accomplish more complex styling.
  23840. The following is a list of specific ShadowDOM styling features and a brief
  23841. discussion of the approach used to shim.
  23842. Shimmed features:
  23843. * :host, :host-context: ShadowDOM allows styling of the shadowRoot's host
  23844. element using the :host rule. To shim this feature, the :host styles are
  23845. reformatted and prefixed with a given scope name and promoted to a
  23846. document level stylesheet.
  23847. For example, given a scope name of .foo, a rule like this:
  23848. :host {
  23849. background: red;
  23850. }
  23851. }
  23852. becomes:
  23853. .foo {
  23854. background: red;
  23855. }
  23856. * encapsultion: Styles defined within ShadowDOM, apply only to
  23857. dom inside the ShadowDOM. Polymer uses one of two techniques to imlement
  23858. this feature.
  23859. By default, rules are prefixed with the host element tag name
  23860. as a descendant selector. This ensures styling does not leak out of the 'top'
  23861. of the element's ShadowDOM. For example,
  23862. div {
  23863. font-weight: bold;
  23864. }
  23865. becomes:
  23866. x-foo div {
  23867. font-weight: bold;
  23868. }
  23869. becomes:
  23870. Alternatively, if WebComponents.ShadowCSS.strictStyling is set to true then
  23871. selectors are scoped by adding an attribute selector suffix to each
  23872. simple selector that contains the host element tag name. Each element
  23873. in the element's ShadowDOM template is also given the scope attribute.
  23874. Thus, these rules match only elements that have the scope attribute.
  23875. For example, given a scope name of x-foo, a rule like this:
  23876. div {
  23877. font-weight: bold;
  23878. }
  23879. becomes:
  23880. div[x-foo] {
  23881. font-weight: bold;
  23882. }
  23883. Note that elements that are dynamically added to a scope must have the scope
  23884. selector added to them manually.
  23885. * upper/lower bound encapsulation: Styles which are defined outside a
  23886. shadowRoot should not cross the ShadowDOM boundary and should not apply
  23887. inside a shadowRoot.
  23888. This styling behavior is not emulated. Some possible ways to do this that
  23889. were rejected due to complexity and/or performance concerns include: (1) reset
  23890. every possible property for every possible selector for a given scope name;
  23891. (2) re-implement css in javascript.
  23892. As an alternative, users should make sure to use selectors
  23893. specific to the scope in which they are working.
  23894. * ::distributed: This behavior is not emulated. It's often not necessary
  23895. to style the contents of a specific insertion point and instead, descendants
  23896. of the host element can be styled selectively. Users can also create an
  23897. extra node around an insertion point and style that node's contents
  23898. via descendent selectors. For example, with a shadowRoot like this:
  23899. <style>
  23900. ::content(div) {
  23901. background: red;
  23902. }
  23903. </style>
  23904. <content></content>
  23905. could become:
  23906. <style>
  23907. / *@polyfill .content-container div * /
  23908. ::content(div) {
  23909. background: red;
  23910. }
  23911. </style>
  23912. <div class="content-container">
  23913. <content></content>
  23914. </div>
  23915. Note the use of @polyfill in the comment above a ShadowDOM specific style
  23916. declaration. This is a directive to the styling shim to use the selector
  23917. in comments in lieu of the next selector when running under polyfill.
  23918. */
  23919. var ShadowCss = (function () {
  23920. function ShadowCss() {
  23921. this.strictStyling = true;
  23922. }
  23923. /*
  23924. * Shim some cssText with the given selector. Returns cssText that can
  23925. * be included in the document via WebComponents.ShadowCSS.addCssToDocument(css).
  23926. *
  23927. * When strictStyling is true:
  23928. * - selector is the attribute added to all elements inside the host,
  23929. * - hostSelector is the attribute added to the host itself.
  23930. */
  23931. ShadowCss.prototype.shimCssText = function (cssText, selector, hostSelector) {
  23932. if (hostSelector === void 0) { hostSelector = ''; }
  23933. cssText = stripComments(cssText);
  23934. cssText = this._insertDirectives(cssText);
  23935. return this._scopeCssText(cssText, selector, hostSelector);
  23936. };
  23937. ShadowCss.prototype._insertDirectives = function (cssText) {
  23938. cssText = this._insertPolyfillDirectivesInCssText(cssText);
  23939. return this._insertPolyfillRulesInCssText(cssText);
  23940. };
  23941. /*
  23942. * Process styles to convert native ShadowDOM rules that will trip
  23943. * up the css parser; we rely on decorating the stylesheet with inert rules.
  23944. *
  23945. * For example, we convert this rule:
  23946. *
  23947. * polyfill-next-selector { content: ':host menu-item'; }
  23948. * ::content menu-item {
  23949. *
  23950. * to this:
  23951. *
  23952. * scopeName menu-item {
  23953. *
  23954. **/
  23955. ShadowCss.prototype._insertPolyfillDirectivesInCssText = function (cssText) {
  23956. // Difference with webcomponents.js: does not handle comments
  23957. return lang_1.StringWrapper.replaceAllMapped(cssText, _cssContentNextSelectorRe, function (m) { return m[1] + '{'; });
  23958. };
  23959. /*
  23960. * Process styles to add rules which will only apply under the polyfill
  23961. *
  23962. * For example, we convert this rule:
  23963. *
  23964. * polyfill-rule {
  23965. * content: ':host menu-item';
  23966. * ...
  23967. * }
  23968. *
  23969. * to this:
  23970. *
  23971. * scopeName menu-item {...}
  23972. *
  23973. **/
  23974. ShadowCss.prototype._insertPolyfillRulesInCssText = function (cssText) {
  23975. // Difference with webcomponents.js: does not handle comments
  23976. return lang_1.StringWrapper.replaceAllMapped(cssText, _cssContentRuleRe, function (m) {
  23977. var rule = m[0];
  23978. rule = lang_1.StringWrapper.replace(rule, m[1], '');
  23979. rule = lang_1.StringWrapper.replace(rule, m[2], '');
  23980. return m[3] + rule;
  23981. });
  23982. };
  23983. /* Ensure styles are scoped. Pseudo-scoping takes a rule like:
  23984. *
  23985. * .foo {... }
  23986. *
  23987. * and converts this to
  23988. *
  23989. * scopeName .foo { ... }
  23990. */
  23991. ShadowCss.prototype._scopeCssText = function (cssText, scopeSelector, hostSelector) {
  23992. var unscoped = this._extractUnscopedRulesFromCssText(cssText);
  23993. cssText = this._insertPolyfillHostInCssText(cssText);
  23994. cssText = this._convertColonHost(cssText);
  23995. cssText = this._convertColonHostContext(cssText);
  23996. cssText = this._convertShadowDOMSelectors(cssText);
  23997. if (lang_1.isPresent(scopeSelector)) {
  23998. cssText = this._scopeSelectors(cssText, scopeSelector, hostSelector);
  23999. }
  24000. cssText = cssText + '\n' + unscoped;
  24001. return cssText.trim();
  24002. };
  24003. /*
  24004. * Process styles to add rules which will only apply under the polyfill
  24005. * and do not process via CSSOM. (CSSOM is destructive to rules on rare
  24006. * occasions, e.g. -webkit-calc on Safari.)
  24007. * For example, we convert this rule:
  24008. *
  24009. * @polyfill-unscoped-rule {
  24010. * content: 'menu-item';
  24011. * ... }
  24012. *
  24013. * to this:
  24014. *
  24015. * menu-item {...}
  24016. *
  24017. **/
  24018. ShadowCss.prototype._extractUnscopedRulesFromCssText = function (cssText) {
  24019. // Difference with webcomponents.js: does not handle comments
  24020. var r = '', m;
  24021. var matcher = lang_1.RegExpWrapper.matcher(_cssContentUnscopedRuleRe, cssText);
  24022. while (lang_1.isPresent(m = lang_1.RegExpMatcherWrapper.next(matcher))) {
  24023. var rule = m[0];
  24024. rule = lang_1.StringWrapper.replace(rule, m[2], '');
  24025. rule = lang_1.StringWrapper.replace(rule, m[1], m[3]);
  24026. r += rule + '\n\n';
  24027. }
  24028. return r;
  24029. };
  24030. /*
  24031. * convert a rule like :host(.foo) > .bar { }
  24032. *
  24033. * to
  24034. *
  24035. * scopeName.foo > .bar
  24036. */
  24037. ShadowCss.prototype._convertColonHost = function (cssText) {
  24038. return this._convertColonRule(cssText, _cssColonHostRe, this._colonHostPartReplacer);
  24039. };
  24040. /*
  24041. * convert a rule like :host-context(.foo) > .bar { }
  24042. *
  24043. * to
  24044. *
  24045. * scopeName.foo > .bar, .foo scopeName > .bar { }
  24046. *
  24047. * and
  24048. *
  24049. * :host-context(.foo:host) .bar { ... }
  24050. *
  24051. * to
  24052. *
  24053. * scopeName.foo .bar { ... }
  24054. */
  24055. ShadowCss.prototype._convertColonHostContext = function (cssText) {
  24056. return this._convertColonRule(cssText, _cssColonHostContextRe, this._colonHostContextPartReplacer);
  24057. };
  24058. ShadowCss.prototype._convertColonRule = function (cssText, regExp, partReplacer) {
  24059. // p1 = :host, p2 = contents of (), p3 rest of rule
  24060. return lang_1.StringWrapper.replaceAllMapped(cssText, regExp, function (m) {
  24061. if (lang_1.isPresent(m[2])) {
  24062. var parts = m[2].split(','), r = [];
  24063. for (var i = 0; i < parts.length; i++) {
  24064. var p = parts[i];
  24065. if (lang_1.isBlank(p))
  24066. break;
  24067. p = p.trim();
  24068. r.push(partReplacer(_polyfillHostNoCombinator, p, m[3]));
  24069. }
  24070. return r.join(',');
  24071. }
  24072. else {
  24073. return _polyfillHostNoCombinator + m[3];
  24074. }
  24075. });
  24076. };
  24077. ShadowCss.prototype._colonHostContextPartReplacer = function (host, part, suffix) {
  24078. if (lang_1.StringWrapper.contains(part, _polyfillHost)) {
  24079. return this._colonHostPartReplacer(host, part, suffix);
  24080. }
  24081. else {
  24082. return host + part + suffix + ', ' + part + ' ' + host + suffix;
  24083. }
  24084. };
  24085. ShadowCss.prototype._colonHostPartReplacer = function (host, part, suffix) {
  24086. return host + lang_1.StringWrapper.replace(part, _polyfillHost, '') + suffix;
  24087. };
  24088. /*
  24089. * Convert combinators like ::shadow and pseudo-elements like ::content
  24090. * by replacing with space.
  24091. */
  24092. ShadowCss.prototype._convertShadowDOMSelectors = function (cssText) {
  24093. for (var i = 0; i < _shadowDOMSelectorsRe.length; i++) {
  24094. cssText = lang_1.StringWrapper.replaceAll(cssText, _shadowDOMSelectorsRe[i], ' ');
  24095. }
  24096. return cssText;
  24097. };
  24098. // change a selector like 'div' to 'name div'
  24099. ShadowCss.prototype._scopeSelectors = function (cssText, scopeSelector, hostSelector) {
  24100. var _this = this;
  24101. return processRules(cssText, function (rule) {
  24102. var selector = rule.selector;
  24103. var content = rule.content;
  24104. if (rule.selector[0] != '@' || rule.selector.startsWith('@page')) {
  24105. selector =
  24106. _this._scopeSelector(rule.selector, scopeSelector, hostSelector, _this.strictStyling);
  24107. }
  24108. else if (rule.selector.startsWith('@media')) {
  24109. content = _this._scopeSelectors(rule.content, scopeSelector, hostSelector);
  24110. }
  24111. return new CssRule(selector, content);
  24112. });
  24113. };
  24114. ShadowCss.prototype._scopeSelector = function (selector, scopeSelector, hostSelector, strict) {
  24115. var r = [], parts = selector.split(',');
  24116. for (var i = 0; i < parts.length; i++) {
  24117. var p = parts[i];
  24118. p = p.trim();
  24119. if (this._selectorNeedsScoping(p, scopeSelector)) {
  24120. p = strict && !lang_1.StringWrapper.contains(p, _polyfillHostNoCombinator) ?
  24121. this._applyStrictSelectorScope(p, scopeSelector) :
  24122. this._applySelectorScope(p, scopeSelector, hostSelector);
  24123. }
  24124. r.push(p);
  24125. }
  24126. return r.join(', ');
  24127. };
  24128. ShadowCss.prototype._selectorNeedsScoping = function (selector, scopeSelector) {
  24129. var re = this._makeScopeMatcher(scopeSelector);
  24130. return !lang_1.isPresent(lang_1.RegExpWrapper.firstMatch(re, selector));
  24131. };
  24132. ShadowCss.prototype._makeScopeMatcher = function (scopeSelector) {
  24133. var lre = /\[/g;
  24134. var rre = /\]/g;
  24135. scopeSelector = lang_1.StringWrapper.replaceAll(scopeSelector, lre, '\\[');
  24136. scopeSelector = lang_1.StringWrapper.replaceAll(scopeSelector, rre, '\\]');
  24137. return lang_1.RegExpWrapper.create('^(' + scopeSelector + ')' + _selectorReSuffix, 'm');
  24138. };
  24139. ShadowCss.prototype._applySelectorScope = function (selector, scopeSelector, hostSelector) {
  24140. // Difference from webcomponentsjs: scopeSelector could not be an array
  24141. return this._applySimpleSelectorScope(selector, scopeSelector, hostSelector);
  24142. };
  24143. // scope via name and [is=name]
  24144. ShadowCss.prototype._applySimpleSelectorScope = function (selector, scopeSelector, hostSelector) {
  24145. if (lang_1.isPresent(lang_1.RegExpWrapper.firstMatch(_polyfillHostRe, selector))) {
  24146. var replaceBy = this.strictStyling ? "[" + hostSelector + "]" : scopeSelector;
  24147. selector = lang_1.StringWrapper.replace(selector, _polyfillHostNoCombinator, replaceBy);
  24148. return lang_1.StringWrapper.replaceAll(selector, _polyfillHostRe, replaceBy + ' ');
  24149. }
  24150. else {
  24151. return scopeSelector + ' ' + selector;
  24152. }
  24153. };
  24154. // return a selector with [name] suffix on each simple selector
  24155. // e.g. .foo.bar > .zot becomes .foo[name].bar[name] > .zot[name] /** @internal */
  24156. ShadowCss.prototype._applyStrictSelectorScope = function (selector, scopeSelector) {
  24157. var isRe = /\[is=([^\]]*)\]/g;
  24158. scopeSelector = lang_1.StringWrapper.replaceAllMapped(scopeSelector, isRe, function (m) { return m[1]; });
  24159. var splits = [' ', '>', '+', '~'], scoped = selector, attrName = '[' + scopeSelector + ']';
  24160. for (var i = 0; i < splits.length; i++) {
  24161. var sep = splits[i];
  24162. var parts = scoped.split(sep);
  24163. scoped = parts.map(function (p) {
  24164. // remove :host since it should be unnecessary
  24165. var t = lang_1.StringWrapper.replaceAll(p.trim(), _polyfillHostRe, '');
  24166. if (t.length > 0 && !collection_1.ListWrapper.contains(splits, t) &&
  24167. !lang_1.StringWrapper.contains(t, attrName)) {
  24168. var re = /([^:]*)(:*)(.*)/g;
  24169. var m = lang_1.RegExpWrapper.firstMatch(re, t);
  24170. if (lang_1.isPresent(m)) {
  24171. p = m[1] + attrName + m[2] + m[3];
  24172. }
  24173. }
  24174. return p;
  24175. })
  24176. .join(sep);
  24177. }
  24178. return scoped;
  24179. };
  24180. ShadowCss.prototype._insertPolyfillHostInCssText = function (selector) {
  24181. selector = lang_1.StringWrapper.replaceAll(selector, _colonHostContextRe, _polyfillHostContext);
  24182. selector = lang_1.StringWrapper.replaceAll(selector, _colonHostRe, _polyfillHost);
  24183. return selector;
  24184. };
  24185. return ShadowCss;
  24186. })();
  24187. exports.ShadowCss = ShadowCss;
  24188. var _cssContentNextSelectorRe = /polyfill-next-selector[^}]*content:[\s]*?['"](.*?)['"][;\s]*}([^{]*?){/gim;
  24189. var _cssContentRuleRe = /(polyfill-rule)[^}]*(content:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim;
  24190. var _cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim;
  24191. var _polyfillHost = '-shadowcsshost';
  24192. // note: :host-context pre-processed to -shadowcsshostcontext.
  24193. var _polyfillHostContext = '-shadowcsscontext';
  24194. var _parenSuffix = ')(?:\\((' +
  24195. '(?:\\([^)(]*\\)|[^)(]*)+?' +
  24196. ')\\))?([^,{]*)';
  24197. var _cssColonHostRe = lang_1.RegExpWrapper.create('(' + _polyfillHost + _parenSuffix, 'im');
  24198. var _cssColonHostContextRe = lang_1.RegExpWrapper.create('(' + _polyfillHostContext + _parenSuffix, 'im');
  24199. var _polyfillHostNoCombinator = _polyfillHost + '-no-combinator';
  24200. var _shadowDOMSelectorsRe = [
  24201. />>>/g,
  24202. /::shadow/g,
  24203. /::content/g,
  24204. // Deprecated selectors
  24205. // TODO(vicb): see https://github.com/angular/clang-format/issues/16
  24206. // clang-format off
  24207. /\/deep\//g,
  24208. /\/shadow-deep\//g,
  24209. /\/shadow\//g,
  24210. ];
  24211. var _selectorReSuffix = '([>\\s~+\[.,{:][\\s\\S]*)?$';
  24212. var _polyfillHostRe = lang_1.RegExpWrapper.create(_polyfillHost, 'im');
  24213. var _colonHostRe = /:host/gim;
  24214. var _colonHostContextRe = /:host-context/gim;
  24215. var _commentRe = /\/\*[\s\S]*?\*\//g;
  24216. function stripComments(input) {
  24217. return lang_1.StringWrapper.replaceAllMapped(input, _commentRe, function (_) { return ''; });
  24218. }
  24219. var _ruleRe = /(\s*)([^;\{\}]+?)(\s*)((?:{%BLOCK%}?\s*;?)|(?:\s*;))/g;
  24220. var _curlyRe = /([{}])/g;
  24221. var OPEN_CURLY = '{';
  24222. var CLOSE_CURLY = '}';
  24223. var BLOCK_PLACEHOLDER = '%BLOCK%';
  24224. var CssRule = (function () {
  24225. function CssRule(selector, content) {
  24226. this.selector = selector;
  24227. this.content = content;
  24228. }
  24229. return CssRule;
  24230. })();
  24231. exports.CssRule = CssRule;
  24232. function processRules(input, ruleCallback) {
  24233. var inputWithEscapedBlocks = escapeBlocks(input);
  24234. var nextBlockIndex = 0;
  24235. return lang_1.StringWrapper.replaceAllMapped(inputWithEscapedBlocks.escapedString, _ruleRe, function (m) {
  24236. var selector = m[2];
  24237. var content = '';
  24238. var suffix = m[4];
  24239. var contentPrefix = '';
  24240. if (lang_1.isPresent(m[4]) && m[4].startsWith('{' + BLOCK_PLACEHOLDER)) {
  24241. content = inputWithEscapedBlocks.blocks[nextBlockIndex++];
  24242. suffix = m[4].substring(BLOCK_PLACEHOLDER.length + 1);
  24243. contentPrefix = '{';
  24244. }
  24245. var rule = ruleCallback(new CssRule(selector, content));
  24246. return "" + m[1] + rule.selector + m[3] + contentPrefix + rule.content + suffix;
  24247. });
  24248. }
  24249. exports.processRules = processRules;
  24250. var StringWithEscapedBlocks = (function () {
  24251. function StringWithEscapedBlocks(escapedString, blocks) {
  24252. this.escapedString = escapedString;
  24253. this.blocks = blocks;
  24254. }
  24255. return StringWithEscapedBlocks;
  24256. })();
  24257. function escapeBlocks(input) {
  24258. var inputParts = lang_1.StringWrapper.split(input, _curlyRe);
  24259. var resultParts = [];
  24260. var escapedBlocks = [];
  24261. var bracketCount = 0;
  24262. var currentBlockParts = [];
  24263. for (var partIndex = 0; partIndex < inputParts.length; partIndex++) {
  24264. var part = inputParts[partIndex];
  24265. if (part == CLOSE_CURLY) {
  24266. bracketCount--;
  24267. }
  24268. if (bracketCount > 0) {
  24269. currentBlockParts.push(part);
  24270. }
  24271. else {
  24272. if (currentBlockParts.length > 0) {
  24273. escapedBlocks.push(currentBlockParts.join(''));
  24274. resultParts.push(BLOCK_PLACEHOLDER);
  24275. currentBlockParts = [];
  24276. }
  24277. resultParts.push(part);
  24278. }
  24279. if (part == OPEN_CURLY) {
  24280. bracketCount++;
  24281. }
  24282. }
  24283. if (currentBlockParts.length > 0) {
  24284. escapedBlocks.push(currentBlockParts.join(''));
  24285. resultParts.push(BLOCK_PLACEHOLDER);
  24286. }
  24287. return new StringWithEscapedBlocks(resultParts.join(''), escapedBlocks);
  24288. }
  24289. /***/ },
  24290. /* 163 */
  24291. /***/ function(module, exports, __webpack_require__) {
  24292. // Some of the code comes from WebComponents.JS
  24293. // https://github.com/webcomponents/webcomponentsjs/blob/master/src/HTMLImports/path.js
  24294. var lang_1 = __webpack_require__(5);
  24295. var StyleWithImports = (function () {
  24296. function StyleWithImports(style, styleUrls) {
  24297. this.style = style;
  24298. this.styleUrls = styleUrls;
  24299. }
  24300. return StyleWithImports;
  24301. })();
  24302. exports.StyleWithImports = StyleWithImports;
  24303. function isStyleUrlResolvable(url) {
  24304. if (lang_1.isBlank(url) || url.length === 0 || url[0] == '/')
  24305. return false;
  24306. var schemeMatch = lang_1.RegExpWrapper.firstMatch(_urlWithSchemaRe, url);
  24307. return lang_1.isBlank(schemeMatch) || schemeMatch[1] == 'package' || schemeMatch[1] == 'asset';
  24308. }
  24309. exports.isStyleUrlResolvable = isStyleUrlResolvable;
  24310. /**
  24311. * Rewrites stylesheets by resolving and removing the @import urls that
  24312. * are either relative or don't have a `package:` scheme
  24313. */
  24314. function extractStyleUrls(resolver, baseUrl, cssText) {
  24315. var foundUrls = [];
  24316. var modifiedCssText = lang_1.StringWrapper.replaceAllMapped(cssText, _cssImportRe, function (m) {
  24317. var url = lang_1.isPresent(m[1]) ? m[1] : m[2];
  24318. if (!isStyleUrlResolvable(url)) {
  24319. // Do not attempt to resolve non-package absolute URLs with URI scheme
  24320. return m[0];
  24321. }
  24322. foundUrls.push(resolver.resolve(baseUrl, url));
  24323. return '';
  24324. });
  24325. return new StyleWithImports(modifiedCssText, foundUrls);
  24326. }
  24327. exports.extractStyleUrls = extractStyleUrls;
  24328. var _cssImportRe = /@import\s+(?:url\()?\s*(?:(?:['"]([^'"]*))|([^;\)\s]*))[^;]*;?/g;
  24329. // TODO: can't use /^[^:/?#.]+:/g due to clang-format bug:
  24330. // https://github.com/angular/angular/issues/4596
  24331. var _urlWithSchemaRe = /^([a-zA-Z\-\+\.]+):/g;
  24332. /***/ },
  24333. /* 164 */
  24334. /***/ function(module, exports, __webpack_require__) {
  24335. var lang_1 = __webpack_require__(5);
  24336. var view_1 = __webpack_require__(165);
  24337. var metadata_1 = __webpack_require__(3);
  24338. var collection_1 = __webpack_require__(12);
  24339. function encapsulateStyles(componentTemplate) {
  24340. var processedStyles = componentTemplate.styles;
  24341. if (componentTemplate.encapsulation === metadata_1.ViewEncapsulation.Emulated) {
  24342. processedStyles = collection_1.ListWrapper.createFixedSize(componentTemplate.styles.length);
  24343. for (var i = 0; i < componentTemplate.styles.length; i++) {
  24344. processedStyles[i] = lang_1.StringWrapper.replaceAll(componentTemplate.styles[i], COMPONENT_REGEX, componentTemplate.shortId);
  24345. }
  24346. }
  24347. return processedStyles;
  24348. }
  24349. exports.encapsulateStyles = encapsulateStyles;
  24350. function createRenderView(componentTemplate, cmds, inplaceElement, nodeFactory) {
  24351. var view;
  24352. var eventDispatcher = function (boundElementIndex, eventName, event) {
  24353. return view.dispatchRenderEvent(boundElementIndex, eventName, event);
  24354. };
  24355. var context = new BuildContext(eventDispatcher, nodeFactory, inplaceElement);
  24356. context.build(componentTemplate, cmds);
  24357. var fragments = [];
  24358. for (var i = 0; i < context.fragments.length; i++) {
  24359. fragments.push(new view_1.DefaultRenderFragmentRef(context.fragments[i]));
  24360. }
  24361. view = new view_1.DefaultRenderView(fragments, context.boundTextNodes, context.boundElements, context.nativeShadowRoots, context.globalEventAdders, context.rootContentInsertionPoints);
  24362. return view;
  24363. }
  24364. exports.createRenderView = createRenderView;
  24365. var BuildContext = (function () {
  24366. function BuildContext(_eventDispatcher, factory, _inplaceElement) {
  24367. this._eventDispatcher = _eventDispatcher;
  24368. this.factory = factory;
  24369. this._inplaceElement = _inplaceElement;
  24370. this._builders = [];
  24371. this.globalEventAdders = [];
  24372. this.boundElements = [];
  24373. this.boundTextNodes = [];
  24374. this.nativeShadowRoots = [];
  24375. this.fragments = [];
  24376. this.rootContentInsertionPoints = [];
  24377. this.componentCount = 0;
  24378. this.isHost = lang_1.isPresent((_inplaceElement));
  24379. }
  24380. BuildContext.prototype.build = function (template, cmds) {
  24381. this.enqueueRootBuilder(template, cmds);
  24382. this._build(this._builders[0]);
  24383. };
  24384. BuildContext.prototype._build = function (builder) {
  24385. this._builders = [];
  24386. builder.build(this);
  24387. var enqueuedBuilders = this._builders;
  24388. for (var i = 0; i < enqueuedBuilders.length; i++) {
  24389. this._build(enqueuedBuilders[i]);
  24390. }
  24391. };
  24392. BuildContext.prototype.enqueueComponentBuilder = function (component) {
  24393. this.componentCount++;
  24394. this._builders.push(new RenderViewBuilder(component, null, component.template, component.template.commands));
  24395. };
  24396. BuildContext.prototype.enqueueFragmentBuilder = function (parentComponent, parentTemplate, commands) {
  24397. var rootNodes = [];
  24398. this.fragments.push(rootNodes);
  24399. this._builders.push(new RenderViewBuilder(parentComponent, rootNodes, parentTemplate, commands));
  24400. };
  24401. BuildContext.prototype.enqueueRootBuilder = function (template, cmds) {
  24402. var rootNodes = [];
  24403. this.fragments.push(rootNodes);
  24404. this._builders.push(new RenderViewBuilder(null, rootNodes, template, cmds));
  24405. };
  24406. BuildContext.prototype.consumeInplaceElement = function () {
  24407. var result = this._inplaceElement;
  24408. this._inplaceElement = null;
  24409. return result;
  24410. };
  24411. BuildContext.prototype.addEventListener = function (boundElementIndex, target, eventName) {
  24412. if (lang_1.isPresent(target)) {
  24413. var handler = createEventHandler(boundElementIndex, target + ":" + eventName, this._eventDispatcher);
  24414. this.globalEventAdders.push(createGlobalEventAdder(target, eventName, handler, this.factory));
  24415. }
  24416. else {
  24417. var handler = createEventHandler(boundElementIndex, eventName, this._eventDispatcher);
  24418. this.factory.on(this.boundElements[boundElementIndex], eventName, handler);
  24419. }
  24420. };
  24421. return BuildContext;
  24422. })();
  24423. function createEventHandler(boundElementIndex, eventName, eventDispatcher) {
  24424. return function ($event) { return eventDispatcher(boundElementIndex, eventName, $event); };
  24425. }
  24426. function createGlobalEventAdder(target, eventName, eventHandler, nodeFactory) {
  24427. return function () { return nodeFactory.globalOn(target, eventName, eventHandler); };
  24428. }
  24429. var RenderViewBuilder = (function () {
  24430. function RenderViewBuilder(parentComponent, fragmentRootNodes, template, cmds) {
  24431. this.parentComponent = parentComponent;
  24432. this.fragmentRootNodes = fragmentRootNodes;
  24433. this.template = template;
  24434. this.cmds = cmds;
  24435. var rootNodesParent = lang_1.isPresent(fragmentRootNodes) ? null : parentComponent.shadowRoot;
  24436. this.parentStack = [rootNodesParent];
  24437. }
  24438. RenderViewBuilder.prototype.build = function (context) {
  24439. var cmds = this.cmds;
  24440. for (var i = 0; i < cmds.length; i++) {
  24441. cmds[i].visit(this, context);
  24442. }
  24443. };
  24444. Object.defineProperty(RenderViewBuilder.prototype, "parent", {
  24445. get: function () { return this.parentStack[this.parentStack.length - 1]; },
  24446. enumerable: true,
  24447. configurable: true
  24448. });
  24449. RenderViewBuilder.prototype.visitText = function (cmd, context) {
  24450. var text = context.factory.createText(cmd.value);
  24451. this._addChild(text, cmd.ngContentIndex, context);
  24452. if (cmd.isBound) {
  24453. context.boundTextNodes.push(text);
  24454. }
  24455. return null;
  24456. };
  24457. RenderViewBuilder.prototype.visitNgContent = function (cmd, context) {
  24458. if (lang_1.isPresent(this.parentComponent)) {
  24459. if (this.parentComponent.isRoot) {
  24460. var insertionPoint = context.factory.createRootContentInsertionPoint();
  24461. if (this.parent instanceof Component) {
  24462. context.factory.appendChild(this.parent.shadowRoot, insertionPoint);
  24463. }
  24464. else {
  24465. context.factory.appendChild(this.parent, insertionPoint);
  24466. }
  24467. context.rootContentInsertionPoints.push(insertionPoint);
  24468. }
  24469. else {
  24470. var projectedNodes = this.parentComponent.project(cmd.index);
  24471. for (var i = 0; i < projectedNodes.length; i++) {
  24472. var node = projectedNodes[i];
  24473. this._addChild(node, cmd.ngContentIndex, context);
  24474. }
  24475. }
  24476. }
  24477. return null;
  24478. };
  24479. RenderViewBuilder.prototype.visitBeginElement = function (cmd, context) {
  24480. this.parentStack.push(this._beginElement(cmd, context, null));
  24481. return null;
  24482. };
  24483. RenderViewBuilder.prototype.visitEndElement = function (context) {
  24484. this._endElement();
  24485. return null;
  24486. };
  24487. RenderViewBuilder.prototype.visitBeginComponent = function (cmd, context) {
  24488. var templateId = cmd.templateId;
  24489. var tpl = context.factory.resolveComponentTemplate(templateId);
  24490. var el = this._beginElement(cmd, context, tpl);
  24491. var root = el;
  24492. if (tpl.encapsulation === metadata_1.ViewEncapsulation.Native) {
  24493. root = context.factory.createShadowRoot(el, templateId);
  24494. context.nativeShadowRoots.push(root);
  24495. }
  24496. var isRoot = context.componentCount === 0 && context.isHost;
  24497. var component = new Component(el, root, isRoot, tpl);
  24498. context.enqueueComponentBuilder(component);
  24499. this.parentStack.push(component);
  24500. return null;
  24501. };
  24502. RenderViewBuilder.prototype.visitEndComponent = function (context) {
  24503. this._endElement();
  24504. return null;
  24505. };
  24506. RenderViewBuilder.prototype.visitEmbeddedTemplate = function (cmd, context) {
  24507. var el = context.factory.createTemplateAnchor(cmd.attrNameAndValues);
  24508. this._addChild(el, cmd.ngContentIndex, context);
  24509. context.boundElements.push(el);
  24510. if (cmd.isMerged) {
  24511. context.enqueueFragmentBuilder(this.parentComponent, this.template, cmd.children);
  24512. }
  24513. return null;
  24514. };
  24515. RenderViewBuilder.prototype._beginElement = function (cmd, context, componentTemplate) {
  24516. var el = context.consumeInplaceElement();
  24517. var attrNameAndValues = cmd.attrNameAndValues;
  24518. var templateEmulatedEncapsulation = this.template.encapsulation === metadata_1.ViewEncapsulation.Emulated;
  24519. var componentEmulatedEncapsulation = lang_1.isPresent(componentTemplate) &&
  24520. componentTemplate.encapsulation === metadata_1.ViewEncapsulation.Emulated;
  24521. var newAttrLength = attrNameAndValues.length + (templateEmulatedEncapsulation ? 2 : 0) +
  24522. (componentEmulatedEncapsulation ? 2 : 0);
  24523. if (newAttrLength > attrNameAndValues.length) {
  24524. // Note: Need to clone attrNameAndValues to make it writable!
  24525. var newAttrNameAndValues = collection_1.ListWrapper.createFixedSize(newAttrLength);
  24526. var attrIndex;
  24527. for (attrIndex = 0; attrIndex < attrNameAndValues.length; attrIndex++) {
  24528. newAttrNameAndValues[attrIndex] = attrNameAndValues[attrIndex];
  24529. }
  24530. if (templateEmulatedEncapsulation) {
  24531. newAttrNameAndValues[attrIndex++] = _shimContentAttribute(this.template.shortId);
  24532. newAttrNameAndValues[attrIndex++] = '';
  24533. }
  24534. if (componentEmulatedEncapsulation) {
  24535. newAttrNameAndValues[attrIndex++] = _shimHostAttribute(componentTemplate.shortId);
  24536. newAttrNameAndValues[attrIndex++] = '';
  24537. }
  24538. attrNameAndValues = newAttrNameAndValues;
  24539. }
  24540. if (lang_1.isPresent(el)) {
  24541. context.factory.mergeElement(el, attrNameAndValues);
  24542. this.fragmentRootNodes.push(el);
  24543. }
  24544. else {
  24545. el = context.factory.createElement(cmd.name, attrNameAndValues);
  24546. this._addChild(el, cmd.ngContentIndex, context);
  24547. }
  24548. if (cmd.isBound) {
  24549. var boundElementIndex = context.boundElements.length;
  24550. context.boundElements.push(el);
  24551. for (var i = 0; i < cmd.eventTargetAndNames.length; i += 2) {
  24552. var target = cmd.eventTargetAndNames[i];
  24553. var eventName = cmd.eventTargetAndNames[i + 1];
  24554. context.addEventListener(boundElementIndex, target, eventName);
  24555. }
  24556. }
  24557. return el;
  24558. };
  24559. RenderViewBuilder.prototype._endElement = function () { this.parentStack.pop(); };
  24560. RenderViewBuilder.prototype._addChild = function (node, ngContentIndex, context) {
  24561. var parent = this.parent;
  24562. if (lang_1.isPresent(parent)) {
  24563. if (parent instanceof Component) {
  24564. parent.addContentNode(ngContentIndex, node, context);
  24565. }
  24566. else {
  24567. context.factory.appendChild(parent, node);
  24568. }
  24569. }
  24570. else {
  24571. this.fragmentRootNodes.push(node);
  24572. }
  24573. };
  24574. return RenderViewBuilder;
  24575. })();
  24576. var Component = (function () {
  24577. function Component(hostElement, shadowRoot, isRoot, template) {
  24578. this.hostElement = hostElement;
  24579. this.shadowRoot = shadowRoot;
  24580. this.isRoot = isRoot;
  24581. this.template = template;
  24582. this.contentNodesByNgContentIndex = [];
  24583. }
  24584. Component.prototype.addContentNode = function (ngContentIndex, node, context) {
  24585. if (lang_1.isBlank(ngContentIndex)) {
  24586. if (this.template.encapsulation === metadata_1.ViewEncapsulation.Native) {
  24587. context.factory.appendChild(this.hostElement, node);
  24588. }
  24589. }
  24590. else {
  24591. while (this.contentNodesByNgContentIndex.length <= ngContentIndex) {
  24592. this.contentNodesByNgContentIndex.push([]);
  24593. }
  24594. this.contentNodesByNgContentIndex[ngContentIndex].push(node);
  24595. }
  24596. };
  24597. Component.prototype.project = function (ngContentIndex) {
  24598. return ngContentIndex < this.contentNodesByNgContentIndex.length ?
  24599. this.contentNodesByNgContentIndex[ngContentIndex] :
  24600. [];
  24601. };
  24602. return Component;
  24603. })();
  24604. var COMPONENT_REGEX = /%COMP%/g;
  24605. exports.COMPONENT_VARIABLE = '%COMP%';
  24606. exports.HOST_ATTR = "_nghost-" + exports.COMPONENT_VARIABLE;
  24607. exports.CONTENT_ATTR = "_ngcontent-" + exports.COMPONENT_VARIABLE;
  24608. function _shimContentAttribute(componentShortId) {
  24609. return lang_1.StringWrapper.replaceAll(exports.CONTENT_ATTR, COMPONENT_REGEX, componentShortId);
  24610. }
  24611. function _shimHostAttribute(componentShortId) {
  24612. return lang_1.StringWrapper.replaceAll(exports.HOST_ATTR, COMPONENT_REGEX, componentShortId);
  24613. }
  24614. /***/ },
  24615. /* 165 */
  24616. /***/ function(module, exports, __webpack_require__) {
  24617. var __extends = (this && this.__extends) || function (d, b) {
  24618. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  24619. function __() { this.constructor = d; }
  24620. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  24621. };
  24622. var exceptions_1 = __webpack_require__(14);
  24623. var collection_1 = __webpack_require__(12);
  24624. var lang_1 = __webpack_require__(5);
  24625. var api_1 = __webpack_require__(72);
  24626. var DefaultProtoViewRef = (function (_super) {
  24627. __extends(DefaultProtoViewRef, _super);
  24628. function DefaultProtoViewRef(template, cmds) {
  24629. _super.call(this);
  24630. this.template = template;
  24631. this.cmds = cmds;
  24632. }
  24633. return DefaultProtoViewRef;
  24634. })(api_1.RenderProtoViewRef);
  24635. exports.DefaultProtoViewRef = DefaultProtoViewRef;
  24636. var DefaultRenderFragmentRef = (function (_super) {
  24637. __extends(DefaultRenderFragmentRef, _super);
  24638. function DefaultRenderFragmentRef(nodes) {
  24639. _super.call(this);
  24640. this.nodes = nodes;
  24641. }
  24642. return DefaultRenderFragmentRef;
  24643. })(api_1.RenderFragmentRef);
  24644. exports.DefaultRenderFragmentRef = DefaultRenderFragmentRef;
  24645. var DefaultRenderView = (function (_super) {
  24646. __extends(DefaultRenderView, _super);
  24647. function DefaultRenderView(fragments, boundTextNodes, boundElements, nativeShadowRoots, globalEventAdders, rootContentInsertionPoints) {
  24648. _super.call(this);
  24649. this.fragments = fragments;
  24650. this.boundTextNodes = boundTextNodes;
  24651. this.boundElements = boundElements;
  24652. this.nativeShadowRoots = nativeShadowRoots;
  24653. this.globalEventAdders = globalEventAdders;
  24654. this.rootContentInsertionPoints = rootContentInsertionPoints;
  24655. this.hydrated = false;
  24656. this.eventDispatcher = null;
  24657. this.globalEventRemovers = null;
  24658. }
  24659. DefaultRenderView.prototype.hydrate = function () {
  24660. if (this.hydrated)
  24661. throw new exceptions_1.BaseException('The view is already hydrated.');
  24662. this.hydrated = true;
  24663. this.globalEventRemovers = collection_1.ListWrapper.createFixedSize(this.globalEventAdders.length);
  24664. for (var i = 0; i < this.globalEventAdders.length; i++) {
  24665. this.globalEventRemovers[i] = this.globalEventAdders[i]();
  24666. }
  24667. };
  24668. DefaultRenderView.prototype.dehydrate = function () {
  24669. if (!this.hydrated)
  24670. throw new exceptions_1.BaseException('The view is already dehydrated.');
  24671. for (var i = 0; i < this.globalEventRemovers.length; i++) {
  24672. this.globalEventRemovers[i]();
  24673. }
  24674. this.globalEventRemovers = null;
  24675. this.hydrated = false;
  24676. };
  24677. DefaultRenderView.prototype.setEventDispatcher = function (dispatcher) { this.eventDispatcher = dispatcher; };
  24678. DefaultRenderView.prototype.dispatchRenderEvent = function (boundElementIndex, eventName, event) {
  24679. var allowDefaultBehavior = true;
  24680. if (lang_1.isPresent(this.eventDispatcher)) {
  24681. var locals = new collection_1.Map();
  24682. locals.set('$event', event);
  24683. allowDefaultBehavior =
  24684. this.eventDispatcher.dispatchRenderEvent(boundElementIndex, eventName, locals);
  24685. }
  24686. return allowDefaultBehavior;
  24687. };
  24688. return DefaultRenderView;
  24689. })(api_1.RenderViewRef);
  24690. exports.DefaultRenderView = DefaultRenderView;
  24691. /***/ },
  24692. /* 166 */
  24693. /***/ function(module, exports, __webpack_require__) {
  24694. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  24695. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  24696. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  24697. 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;
  24698. return c > 3 && r && Object.defineProperty(target, key, r), r;
  24699. };
  24700. var __metadata = (this && this.__metadata) || function (k, v) {
  24701. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  24702. };
  24703. var lang_1 = __webpack_require__(5);
  24704. var collection_1 = __webpack_require__(12);
  24705. var template_commands_1 = __webpack_require__(96);
  24706. var template_ast_1 = __webpack_require__(159);
  24707. var source_module_1 = __webpack_require__(156);
  24708. var util_1 = __webpack_require__(155);
  24709. var di_1 = __webpack_require__(6);
  24710. exports.TEMPLATE_COMMANDS_MODULE_REF = source_module_1.moduleRef("package:angular2/src/core/linker/template_commands" + util_1.MODULE_SUFFIX);
  24711. var IMPLICIT_TEMPLATE_VAR = '\$implicit';
  24712. var CLASS_ATTR = 'class';
  24713. var STYLE_ATTR = 'style';
  24714. var CommandCompiler = (function () {
  24715. function CommandCompiler() {
  24716. }
  24717. CommandCompiler.prototype.compileComponentRuntime = function (component, template, changeDetectorFactories, componentTemplateFactory) {
  24718. var visitor = new CommandBuilderVisitor(new RuntimeCommandFactory(component, componentTemplateFactory, changeDetectorFactories), 0);
  24719. template_ast_1.templateVisitAll(visitor, template);
  24720. return visitor.result;
  24721. };
  24722. CommandCompiler.prototype.compileComponentCodeGen = function (component, template, changeDetectorFactoryExpressions, componentTemplateFactory) {
  24723. var visitor = new CommandBuilderVisitor(new CodegenCommandFactory(component, componentTemplateFactory, changeDetectorFactoryExpressions), 0);
  24724. template_ast_1.templateVisitAll(visitor, template);
  24725. return new source_module_1.SourceExpression([], codeGenArray(visitor.result));
  24726. };
  24727. CommandCompiler = __decorate([
  24728. di_1.Injectable(),
  24729. __metadata('design:paramtypes', [])
  24730. ], CommandCompiler);
  24731. return CommandCompiler;
  24732. })();
  24733. exports.CommandCompiler = CommandCompiler;
  24734. var RuntimeCommandFactory = (function () {
  24735. function RuntimeCommandFactory(component, componentTemplateFactory, changeDetectorFactories) {
  24736. this.component = component;
  24737. this.componentTemplateFactory = componentTemplateFactory;
  24738. this.changeDetectorFactories = changeDetectorFactories;
  24739. }
  24740. RuntimeCommandFactory.prototype._mapDirectives = function (directives) {
  24741. return directives.map(function (directive) { return directive.type.runtime; });
  24742. };
  24743. RuntimeCommandFactory.prototype.createText = function (value, isBound, ngContentIndex) {
  24744. return new template_commands_1.TextCmd(value, isBound, ngContentIndex);
  24745. };
  24746. RuntimeCommandFactory.prototype.createNgContent = function (index, ngContentIndex) {
  24747. return new template_commands_1.NgContentCmd(index, ngContentIndex);
  24748. };
  24749. RuntimeCommandFactory.prototype.createBeginElement = function (name, attrNameAndValues, eventTargetAndNames, variableNameAndValues, directives, isBound, ngContentIndex) {
  24750. return new template_commands_1.BeginElementCmd(name, attrNameAndValues, eventTargetAndNames, variableNameAndValues, this._mapDirectives(directives), isBound, ngContentIndex);
  24751. };
  24752. RuntimeCommandFactory.prototype.createEndElement = function () { return new template_commands_1.EndElementCmd(); };
  24753. RuntimeCommandFactory.prototype.createBeginComponent = function (name, attrNameAndValues, eventTargetAndNames, variableNameAndValues, directives, encapsulation, ngContentIndex) {
  24754. var nestedTemplateAccessor = this.componentTemplateFactory(directives[0]);
  24755. return new template_commands_1.BeginComponentCmd(name, attrNameAndValues, eventTargetAndNames, variableNameAndValues, this._mapDirectives(directives), encapsulation, ngContentIndex, nestedTemplateAccessor);
  24756. };
  24757. RuntimeCommandFactory.prototype.createEndComponent = function () { return new template_commands_1.EndComponentCmd(); };
  24758. RuntimeCommandFactory.prototype.createEmbeddedTemplate = function (embeddedTemplateIndex, attrNameAndValues, variableNameAndValues, directives, isMerged, ngContentIndex, children) {
  24759. return new template_commands_1.EmbeddedTemplateCmd(attrNameAndValues, variableNameAndValues, this._mapDirectives(directives), isMerged, ngContentIndex, this.changeDetectorFactories[embeddedTemplateIndex], children);
  24760. };
  24761. return RuntimeCommandFactory;
  24762. })();
  24763. var CodegenCommandFactory = (function () {
  24764. function CodegenCommandFactory(component, componentTemplateFactory, changeDetectorFactoryExpressions) {
  24765. this.component = component;
  24766. this.componentTemplateFactory = componentTemplateFactory;
  24767. this.changeDetectorFactoryExpressions = changeDetectorFactoryExpressions;
  24768. }
  24769. CodegenCommandFactory.prototype.createText = function (value, isBound, ngContentIndex) {
  24770. return new Expression(util_1.codeGenConstConstructorCall(exports.TEMPLATE_COMMANDS_MODULE_REF + 'TextCmd') + "(" + util_1.escapeSingleQuoteString(value) + ", " + isBound + ", " + ngContentIndex + ")");
  24771. };
  24772. CodegenCommandFactory.prototype.createNgContent = function (index, ngContentIndex) {
  24773. return new Expression(util_1.codeGenConstConstructorCall(exports.TEMPLATE_COMMANDS_MODULE_REF + 'NgContentCmd') + "(" + index + ", " + ngContentIndex + ")");
  24774. };
  24775. CodegenCommandFactory.prototype.createBeginElement = function (name, attrNameAndValues, eventTargetAndNames, variableNameAndValues, directives, isBound, ngContentIndex) {
  24776. var attrsExpression = codeGenArray(attrNameAndValues);
  24777. return new Expression((util_1.codeGenConstConstructorCall(exports.TEMPLATE_COMMANDS_MODULE_REF + 'BeginElementCmd') + "(" + util_1.escapeSingleQuoteString(name) + ", " + attrsExpression + ", ") +
  24778. (codeGenArray(eventTargetAndNames) + ", " + codeGenArray(variableNameAndValues) + ", " + codeGenDirectivesArray(directives) + ", " + isBound + ", " + ngContentIndex + ")"));
  24779. };
  24780. CodegenCommandFactory.prototype.createEndElement = function () {
  24781. return new Expression(util_1.codeGenConstConstructorCall(exports.TEMPLATE_COMMANDS_MODULE_REF + 'EndElementCmd') + "()");
  24782. };
  24783. CodegenCommandFactory.prototype.createBeginComponent = function (name, attrNameAndValues, eventTargetAndNames, variableNameAndValues, directives, encapsulation, ngContentIndex) {
  24784. var attrsExpression = codeGenArray(attrNameAndValues);
  24785. return new Expression((util_1.codeGenConstConstructorCall(exports.TEMPLATE_COMMANDS_MODULE_REF + 'BeginComponentCmd') + "(" + util_1.escapeSingleQuoteString(name) + ", " + attrsExpression + ", ") +
  24786. (codeGenArray(eventTargetAndNames) + ", " + codeGenArray(variableNameAndValues) + ", " + codeGenDirectivesArray(directives) + ", " + codeGenViewEncapsulation(encapsulation) + ", " + ngContentIndex + ", " + this.componentTemplateFactory(directives[0]) + ")"));
  24787. };
  24788. CodegenCommandFactory.prototype.createEndComponent = function () {
  24789. return new Expression(util_1.codeGenConstConstructorCall(exports.TEMPLATE_COMMANDS_MODULE_REF + 'EndComponentCmd') + "()");
  24790. };
  24791. CodegenCommandFactory.prototype.createEmbeddedTemplate = function (embeddedTemplateIndex, attrNameAndValues, variableNameAndValues, directives, isMerged, ngContentIndex, children) {
  24792. return new Expression((util_1.codeGenConstConstructorCall(exports.TEMPLATE_COMMANDS_MODULE_REF + 'EmbeddedTemplateCmd') + "(" + codeGenArray(attrNameAndValues) + ", " + codeGenArray(variableNameAndValues) + ", ") +
  24793. (codeGenDirectivesArray(directives) + ", " + isMerged + ", " + ngContentIndex + ", " + this.changeDetectorFactoryExpressions[embeddedTemplateIndex] + ", " + codeGenArray(children) + ")"));
  24794. };
  24795. return CodegenCommandFactory;
  24796. })();
  24797. function visitAndReturnContext(visitor, asts, context) {
  24798. template_ast_1.templateVisitAll(visitor, asts, context);
  24799. return context;
  24800. }
  24801. var CommandBuilderVisitor = (function () {
  24802. function CommandBuilderVisitor(commandFactory, embeddedTemplateIndex) {
  24803. this.commandFactory = commandFactory;
  24804. this.embeddedTemplateIndex = embeddedTemplateIndex;
  24805. this.result = [];
  24806. this.transitiveNgContentCount = 0;
  24807. }
  24808. CommandBuilderVisitor.prototype._readAttrNameAndValues = function (directives, attrAsts) {
  24809. var attrs = keyValueArrayToMap(visitAndReturnContext(this, attrAsts, []));
  24810. directives.forEach(function (directiveMeta) {
  24811. collection_1.StringMapWrapper.forEach(directiveMeta.hostAttributes, function (value, name) {
  24812. var prevValue = attrs[name];
  24813. attrs[name] = lang_1.isPresent(prevValue) ? mergeAttributeValue(name, prevValue, value) : value;
  24814. });
  24815. });
  24816. return mapToKeyValueArray(attrs);
  24817. };
  24818. CommandBuilderVisitor.prototype.visitNgContent = function (ast, context) {
  24819. this.transitiveNgContentCount++;
  24820. this.result.push(this.commandFactory.createNgContent(ast.index, ast.ngContentIndex));
  24821. return null;
  24822. };
  24823. CommandBuilderVisitor.prototype.visitEmbeddedTemplate = function (ast, context) {
  24824. var _this = this;
  24825. this.embeddedTemplateIndex++;
  24826. var childVisitor = new CommandBuilderVisitor(this.commandFactory, this.embeddedTemplateIndex);
  24827. template_ast_1.templateVisitAll(childVisitor, ast.children);
  24828. var isMerged = childVisitor.transitiveNgContentCount > 0;
  24829. var variableNameAndValues = [];
  24830. ast.vars.forEach(function (varAst) {
  24831. variableNameAndValues.push(varAst.name);
  24832. variableNameAndValues.push(varAst.value.length > 0 ? varAst.value : IMPLICIT_TEMPLATE_VAR);
  24833. });
  24834. var directives = [];
  24835. collection_1.ListWrapper.forEachWithIndex(ast.directives, function (directiveAst, index) {
  24836. directiveAst.visit(_this, new DirectiveContext(index, [], [], directives));
  24837. });
  24838. this.result.push(this.commandFactory.createEmbeddedTemplate(this.embeddedTemplateIndex, this._readAttrNameAndValues(directives, ast.attrs), variableNameAndValues, directives, isMerged, ast.ngContentIndex, childVisitor.result));
  24839. this.transitiveNgContentCount += childVisitor.transitiveNgContentCount;
  24840. this.embeddedTemplateIndex = childVisitor.embeddedTemplateIndex;
  24841. return null;
  24842. };
  24843. CommandBuilderVisitor.prototype.visitElement = function (ast, context) {
  24844. var _this = this;
  24845. var component = ast.getComponent();
  24846. var eventTargetAndNames = visitAndReturnContext(this, ast.outputs, []);
  24847. var variableNameAndValues = [];
  24848. if (lang_1.isBlank(component)) {
  24849. ast.exportAsVars.forEach(function (varAst) {
  24850. variableNameAndValues.push(varAst.name);
  24851. variableNameAndValues.push(null);
  24852. });
  24853. }
  24854. var directives = [];
  24855. collection_1.ListWrapper.forEachWithIndex(ast.directives, function (directiveAst, index) {
  24856. directiveAst.visit(_this, new DirectiveContext(index, eventTargetAndNames, variableNameAndValues, directives));
  24857. });
  24858. eventTargetAndNames = removeKeyValueArrayDuplicates(eventTargetAndNames);
  24859. var attrNameAndValues = this._readAttrNameAndValues(directives, ast.attrs);
  24860. if (lang_1.isPresent(component)) {
  24861. this.result.push(this.commandFactory.createBeginComponent(ast.name, attrNameAndValues, eventTargetAndNames, variableNameAndValues, directives, component.template.encapsulation, ast.ngContentIndex));
  24862. template_ast_1.templateVisitAll(this, ast.children);
  24863. this.result.push(this.commandFactory.createEndComponent());
  24864. }
  24865. else {
  24866. this.result.push(this.commandFactory.createBeginElement(ast.name, attrNameAndValues, eventTargetAndNames, variableNameAndValues, directives, ast.isBound(), ast.ngContentIndex));
  24867. template_ast_1.templateVisitAll(this, ast.children);
  24868. this.result.push(this.commandFactory.createEndElement());
  24869. }
  24870. return null;
  24871. };
  24872. CommandBuilderVisitor.prototype.visitVariable = function (ast, ctx) { return null; };
  24873. CommandBuilderVisitor.prototype.visitAttr = function (ast, attrNameAndValues) {
  24874. attrNameAndValues.push(ast.name);
  24875. attrNameAndValues.push(ast.value);
  24876. return null;
  24877. };
  24878. CommandBuilderVisitor.prototype.visitBoundText = function (ast, context) {
  24879. this.result.push(this.commandFactory.createText(null, true, ast.ngContentIndex));
  24880. return null;
  24881. };
  24882. CommandBuilderVisitor.prototype.visitText = function (ast, context) {
  24883. this.result.push(this.commandFactory.createText(ast.value, false, ast.ngContentIndex));
  24884. return null;
  24885. };
  24886. CommandBuilderVisitor.prototype.visitDirective = function (ast, ctx) {
  24887. ctx.targetDirectives.push(ast.directive);
  24888. template_ast_1.templateVisitAll(this, ast.hostEvents, ctx.eventTargetAndNames);
  24889. ast.exportAsVars.forEach(function (varAst) {
  24890. ctx.targetVariableNameAndValues.push(varAst.name);
  24891. ctx.targetVariableNameAndValues.push(ctx.index);
  24892. });
  24893. return null;
  24894. };
  24895. CommandBuilderVisitor.prototype.visitEvent = function (ast, eventTargetAndNames) {
  24896. eventTargetAndNames.push(ast.target);
  24897. eventTargetAndNames.push(ast.name);
  24898. return null;
  24899. };
  24900. CommandBuilderVisitor.prototype.visitDirectiveProperty = function (ast, context) { return null; };
  24901. CommandBuilderVisitor.prototype.visitElementProperty = function (ast, context) { return null; };
  24902. return CommandBuilderVisitor;
  24903. })();
  24904. function removeKeyValueArrayDuplicates(keyValueArray) {
  24905. var knownPairs = new Set();
  24906. var resultKeyValueArray = [];
  24907. for (var i = 0; i < keyValueArray.length; i += 2) {
  24908. var key = keyValueArray[i];
  24909. var value = keyValueArray[i + 1];
  24910. var pairId = key + ":" + value;
  24911. if (!collection_1.SetWrapper.has(knownPairs, pairId)) {
  24912. resultKeyValueArray.push(key);
  24913. resultKeyValueArray.push(value);
  24914. knownPairs.add(pairId);
  24915. }
  24916. }
  24917. return resultKeyValueArray;
  24918. }
  24919. function keyValueArrayToMap(keyValueArr) {
  24920. var data = {};
  24921. for (var i = 0; i < keyValueArr.length; i += 2) {
  24922. data[keyValueArr[i]] = keyValueArr[i + 1];
  24923. }
  24924. return data;
  24925. }
  24926. function mapToKeyValueArray(data) {
  24927. var entryArray = [];
  24928. collection_1.StringMapWrapper.forEach(data, function (value, name) { entryArray.push([name, value]); });
  24929. // We need to sort to get a defined output order
  24930. // for tests and for caching generated artifacts...
  24931. collection_1.ListWrapper.sort(entryArray, function (entry1, entry2) { return lang_1.StringWrapper.compare(entry1[0], entry2[0]); });
  24932. var keyValueArray = [];
  24933. entryArray.forEach(function (entry) {
  24934. keyValueArray.push(entry[0]);
  24935. keyValueArray.push(entry[1]);
  24936. });
  24937. return keyValueArray;
  24938. }
  24939. function mergeAttributeValue(attrName, attrValue1, attrValue2) {
  24940. if (attrName == CLASS_ATTR || attrName == STYLE_ATTR) {
  24941. return attrValue1 + " " + attrValue2;
  24942. }
  24943. else {
  24944. return attrValue2;
  24945. }
  24946. }
  24947. var DirectiveContext = (function () {
  24948. function DirectiveContext(index, eventTargetAndNames, targetVariableNameAndValues, targetDirectives) {
  24949. this.index = index;
  24950. this.eventTargetAndNames = eventTargetAndNames;
  24951. this.targetVariableNameAndValues = targetVariableNameAndValues;
  24952. this.targetDirectives = targetDirectives;
  24953. }
  24954. return DirectiveContext;
  24955. })();
  24956. var Expression = (function () {
  24957. function Expression(value) {
  24958. this.value = value;
  24959. }
  24960. return Expression;
  24961. })();
  24962. function escapeValue(value) {
  24963. if (value instanceof Expression) {
  24964. return value.value;
  24965. }
  24966. else if (lang_1.isString(value)) {
  24967. return util_1.escapeSingleQuoteString(value);
  24968. }
  24969. else if (lang_1.isBlank(value)) {
  24970. return 'null';
  24971. }
  24972. else {
  24973. return "" + value;
  24974. }
  24975. }
  24976. function codeGenArray(data) {
  24977. var base = "[" + data.map(escapeValue).join(',') + "]";
  24978. return lang_1.IS_DART ? "const " + base : base;
  24979. }
  24980. function codeGenDirectivesArray(directives) {
  24981. var expressions = directives.map(function (directiveType) { return ("" + source_module_1.moduleRef(directiveType.type.moduleUrl) + directiveType.type.name); });
  24982. var base = "[" + expressions.join(',') + "]";
  24983. return lang_1.IS_DART ? "const " + base : base;
  24984. }
  24985. function codeGenViewEncapsulation(value) {
  24986. if (lang_1.IS_DART) {
  24987. return "" + exports.TEMPLATE_COMMANDS_MODULE_REF + value;
  24988. }
  24989. else {
  24990. return "" + value;
  24991. }
  24992. }
  24993. /***/ },
  24994. /* 167 */
  24995. /***/ function(module, exports, __webpack_require__) {
  24996. var __extends = (this && this.__extends) || function (d, b) {
  24997. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  24998. function __() { this.constructor = d; }
  24999. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  25000. };
  25001. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  25002. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  25003. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  25004. 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;
  25005. return c > 3 && r && Object.defineProperty(target, key, r), r;
  25006. };
  25007. var __metadata = (this && this.__metadata) || function (k, v) {
  25008. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  25009. };
  25010. var __param = (this && this.__param) || function (paramIndex, decorator) {
  25011. return function (target, key) { decorator(target, key, paramIndex); }
  25012. };
  25013. var collection_1 = __webpack_require__(12);
  25014. var lang_1 = __webpack_require__(5);
  25015. var core_1 = __webpack_require__(2);
  25016. var lang_2 = __webpack_require__(5);
  25017. var exceptions_1 = __webpack_require__(14);
  25018. var change_detection_1 = __webpack_require__(25);
  25019. var html_parser_1 = __webpack_require__(168);
  25020. var html_tags_1 = __webpack_require__(172);
  25021. var parse_util_1 = __webpack_require__(171);
  25022. var template_ast_1 = __webpack_require__(159);
  25023. var selector_1 = __webpack_require__(154);
  25024. var element_schema_registry_1 = __webpack_require__(173);
  25025. var template_preparser_1 = __webpack_require__(174);
  25026. var style_url_resolver_1 = __webpack_require__(163);
  25027. var html_ast_1 = __webpack_require__(169);
  25028. var util_1 = __webpack_require__(155);
  25029. // Group 1 = "bind-"
  25030. // Group 2 = "var-" or "#"
  25031. // Group 3 = "on-"
  25032. // Group 4 = "bindon-"
  25033. // Group 5 = the identifier after "bind-", "var-/#", or "on-"
  25034. // Group 6 = idenitifer inside [()]
  25035. // Group 7 = idenitifer inside []
  25036. // Group 8 = identifier inside ()
  25037. var BIND_NAME_REGEXP = /^(?:(?:(?:(bind-)|(var-|#)|(on-)|(bindon-))(.+))|\[\(([^\)]+)\)\]|\[([^\]]+)\]|\(([^\)]+)\))$/g;
  25038. var TEMPLATE_ELEMENT = 'template';
  25039. var TEMPLATE_ATTR = 'template';
  25040. var TEMPLATE_ATTR_PREFIX = '*';
  25041. var CLASS_ATTR = 'class';
  25042. var PROPERTY_PARTS_SEPARATOR = '.';
  25043. var ATTRIBUTE_PREFIX = 'attr';
  25044. var CLASS_PREFIX = 'class';
  25045. var STYLE_PREFIX = 'style';
  25046. var TEXT_CSS_SELECTOR = selector_1.CssSelector.parse('*')[0];
  25047. /**
  25048. * Provides an array of {@link TemplateAstVisitor}s which will be used to transform
  25049. * parsed templates before compilation is invoked, allowing custom expression syntax
  25050. * and other advanced transformations.
  25051. *
  25052. * This is currently an internal-only feature and not meant for general use.
  25053. */
  25054. exports.TEMPLATE_TRANSFORMS = lang_2.CONST_EXPR(new core_1.OpaqueToken('TemplateTransforms'));
  25055. var TemplateParseError = (function (_super) {
  25056. __extends(TemplateParseError, _super);
  25057. function TemplateParseError(message, location) {
  25058. _super.call(this, location, message);
  25059. }
  25060. return TemplateParseError;
  25061. })(parse_util_1.ParseError);
  25062. exports.TemplateParseError = TemplateParseError;
  25063. var TemplateParser = (function () {
  25064. function TemplateParser(_exprParser, _schemaRegistry, _htmlParser, transforms) {
  25065. this._exprParser = _exprParser;
  25066. this._schemaRegistry = _schemaRegistry;
  25067. this._htmlParser = _htmlParser;
  25068. this.transforms = transforms;
  25069. }
  25070. TemplateParser.prototype.parse = function (template, directives, templateUrl) {
  25071. var parseVisitor = new TemplateParseVisitor(directives, this._exprParser, this._schemaRegistry);
  25072. var htmlAstWithErrors = this._htmlParser.parse(template, templateUrl);
  25073. var result = html_ast_1.htmlVisitAll(parseVisitor, htmlAstWithErrors.rootNodes, EMPTY_COMPONENT);
  25074. var errors = htmlAstWithErrors.errors.concat(parseVisitor.errors);
  25075. if (errors.length > 0) {
  25076. var errorString = errors.join('\n');
  25077. throw new exceptions_1.BaseException("Template parse errors:\n" + errorString);
  25078. }
  25079. if (lang_1.isPresent(this.transforms)) {
  25080. this.transforms.forEach(function (transform) { result = template_ast_1.templateVisitAll(transform, result); });
  25081. }
  25082. return result;
  25083. };
  25084. TemplateParser = __decorate([
  25085. core_1.Injectable(),
  25086. __param(3, core_1.Optional()),
  25087. __param(3, core_1.Inject(exports.TEMPLATE_TRANSFORMS)),
  25088. __metadata('design:paramtypes', [change_detection_1.Parser, element_schema_registry_1.ElementSchemaRegistry, html_parser_1.HtmlParser, Array])
  25089. ], TemplateParser);
  25090. return TemplateParser;
  25091. })();
  25092. exports.TemplateParser = TemplateParser;
  25093. var TemplateParseVisitor = (function () {
  25094. function TemplateParseVisitor(directives, _exprParser, _schemaRegistry) {
  25095. var _this = this;
  25096. this._exprParser = _exprParser;
  25097. this._schemaRegistry = _schemaRegistry;
  25098. this.errors = [];
  25099. this.directivesIndex = new Map();
  25100. this.ngContentCount = 0;
  25101. this.selectorMatcher = new selector_1.SelectorMatcher();
  25102. collection_1.ListWrapper.forEachWithIndex(directives, function (directive, index) {
  25103. var selector = selector_1.CssSelector.parse(directive.selector);
  25104. _this.selectorMatcher.addSelectables(selector, directive);
  25105. _this.directivesIndex.set(directive, index);
  25106. });
  25107. }
  25108. TemplateParseVisitor.prototype._reportError = function (message, sourceSpan) {
  25109. this.errors.push(new TemplateParseError(message, sourceSpan.start));
  25110. };
  25111. TemplateParseVisitor.prototype._parseInterpolation = function (value, sourceSpan) {
  25112. var sourceInfo = sourceSpan.start.toString();
  25113. try {
  25114. return this._exprParser.parseInterpolation(value, sourceInfo);
  25115. }
  25116. catch (e) {
  25117. this._reportError("" + e, sourceSpan);
  25118. return this._exprParser.wrapLiteralPrimitive('ERROR', sourceInfo);
  25119. }
  25120. };
  25121. TemplateParseVisitor.prototype._parseAction = function (value, sourceSpan) {
  25122. var sourceInfo = sourceSpan.start.toString();
  25123. try {
  25124. return this._exprParser.parseAction(value, sourceInfo);
  25125. }
  25126. catch (e) {
  25127. this._reportError("" + e, sourceSpan);
  25128. return this._exprParser.wrapLiteralPrimitive('ERROR', sourceInfo);
  25129. }
  25130. };
  25131. TemplateParseVisitor.prototype._parseBinding = function (value, sourceSpan) {
  25132. var sourceInfo = sourceSpan.start.toString();
  25133. try {
  25134. return this._exprParser.parseBinding(value, sourceInfo);
  25135. }
  25136. catch (e) {
  25137. this._reportError("" + e, sourceSpan);
  25138. return this._exprParser.wrapLiteralPrimitive('ERROR', sourceInfo);
  25139. }
  25140. };
  25141. TemplateParseVisitor.prototype._parseTemplateBindings = function (value, sourceSpan) {
  25142. var sourceInfo = sourceSpan.start.toString();
  25143. try {
  25144. return this._exprParser.parseTemplateBindings(value, sourceInfo);
  25145. }
  25146. catch (e) {
  25147. this._reportError("" + e, sourceSpan);
  25148. return [];
  25149. }
  25150. };
  25151. TemplateParseVisitor.prototype.visitText = function (ast, component) {
  25152. var ngContentIndex = component.findNgContentIndex(TEXT_CSS_SELECTOR);
  25153. var expr = this._parseInterpolation(ast.value, ast.sourceSpan);
  25154. if (lang_1.isPresent(expr)) {
  25155. return new template_ast_1.BoundTextAst(expr, ngContentIndex, ast.sourceSpan);
  25156. }
  25157. else {
  25158. return new template_ast_1.TextAst(ast.value, ngContentIndex, ast.sourceSpan);
  25159. }
  25160. };
  25161. TemplateParseVisitor.prototype.visitAttr = function (ast, contex) {
  25162. return new template_ast_1.AttrAst(ast.name, ast.value, ast.sourceSpan);
  25163. };
  25164. TemplateParseVisitor.prototype.visitElement = function (element, component) {
  25165. var _this = this;
  25166. var nodeName = element.name;
  25167. var preparsedElement = template_preparser_1.preparseElement(element);
  25168. if (preparsedElement.type === template_preparser_1.PreparsedElementType.SCRIPT ||
  25169. preparsedElement.type === template_preparser_1.PreparsedElementType.STYLE) {
  25170. // Skipping <script> for security reasons
  25171. // Skipping <style> as we already processed them
  25172. // in the StyleCompiler
  25173. return null;
  25174. }
  25175. if (preparsedElement.type === template_preparser_1.PreparsedElementType.STYLESHEET &&
  25176. style_url_resolver_1.isStyleUrlResolvable(preparsedElement.hrefAttr)) {
  25177. // Skipping stylesheets with either relative urls or package scheme as we already processed
  25178. // them in the StyleCompiler
  25179. return null;
  25180. }
  25181. var matchableAttrs = [];
  25182. var elementOrDirectiveProps = [];
  25183. var vars = [];
  25184. var events = [];
  25185. var templateElementOrDirectiveProps = [];
  25186. var templateVars = [];
  25187. var templateMatchableAttrs = [];
  25188. var hasInlineTemplates = false;
  25189. var attrs = [];
  25190. element.attrs.forEach(function (attr) {
  25191. matchableAttrs.push([attr.name, attr.value]);
  25192. var hasBinding = _this._parseAttr(attr, matchableAttrs, elementOrDirectiveProps, events, vars);
  25193. var hasTemplateBinding = _this._parseInlineTemplateBinding(attr, templateMatchableAttrs, templateElementOrDirectiveProps, templateVars);
  25194. if (!hasBinding && !hasTemplateBinding) {
  25195. // don't include the bindings as attributes as well in the AST
  25196. attrs.push(_this.visitAttr(attr, null));
  25197. }
  25198. if (hasTemplateBinding) {
  25199. hasInlineTemplates = true;
  25200. }
  25201. });
  25202. var lcElName = html_tags_1.splitNsName(nodeName.toLowerCase())[1];
  25203. var isTemplateElement = lcElName == TEMPLATE_ELEMENT;
  25204. var elementCssSelector = createElementCssSelector(nodeName, matchableAttrs);
  25205. var directives = this._createDirectiveAsts(element.name, this._parseDirectives(this.selectorMatcher, elementCssSelector), elementOrDirectiveProps, isTemplateElement ? [] : vars, element.sourceSpan);
  25206. var elementProps = this._createElementPropertyAsts(element.name, elementOrDirectiveProps, directives);
  25207. var children = html_ast_1.htmlVisitAll(preparsedElement.nonBindable ? NON_BINDABLE_VISITOR : this, element.children, Component.create(directives));
  25208. var elementNgContentIndex = hasInlineTemplates ? null : component.findNgContentIndex(elementCssSelector);
  25209. var parsedElement;
  25210. if (preparsedElement.type === template_preparser_1.PreparsedElementType.NG_CONTENT) {
  25211. if (lang_1.isPresent(element.children) && element.children.length > 0) {
  25212. this._reportError("<ng-content> element cannot have content. <ng-content> must be immediately followed by </ng-content>", element.sourceSpan);
  25213. }
  25214. parsedElement =
  25215. new template_ast_1.NgContentAst(this.ngContentCount++, elementNgContentIndex, element.sourceSpan);
  25216. }
  25217. else if (isTemplateElement) {
  25218. this._assertAllEventsPublishedByDirectives(directives, events);
  25219. this._assertNoComponentsNorElementBindingsOnTemplate(directives, elementProps, element.sourceSpan);
  25220. parsedElement = new template_ast_1.EmbeddedTemplateAst(attrs, events, vars, directives, children, elementNgContentIndex, element.sourceSpan);
  25221. }
  25222. else {
  25223. this._assertOnlyOneComponent(directives, element.sourceSpan);
  25224. var elementExportAsVars = vars.filter(function (varAst) { return varAst.value.length === 0; });
  25225. parsedElement =
  25226. new template_ast_1.ElementAst(nodeName, attrs, elementProps, events, elementExportAsVars, directives, children, elementNgContentIndex, element.sourceSpan);
  25227. }
  25228. if (hasInlineTemplates) {
  25229. var templateCssSelector = createElementCssSelector(TEMPLATE_ELEMENT, templateMatchableAttrs);
  25230. var templateDirectives = this._createDirectiveAsts(element.name, this._parseDirectives(this.selectorMatcher, templateCssSelector), templateElementOrDirectiveProps, [], element.sourceSpan);
  25231. var templateElementProps = this._createElementPropertyAsts(element.name, templateElementOrDirectiveProps, templateDirectives);
  25232. this._assertNoComponentsNorElementBindingsOnTemplate(templateDirectives, templateElementProps, element.sourceSpan);
  25233. parsedElement = new template_ast_1.EmbeddedTemplateAst([], [], templateVars, templateDirectives, [parsedElement], component.findNgContentIndex(templateCssSelector), element.sourceSpan);
  25234. }
  25235. return parsedElement;
  25236. };
  25237. TemplateParseVisitor.prototype._parseInlineTemplateBinding = function (attr, targetMatchableAttrs, targetProps, targetVars) {
  25238. var templateBindingsSource = null;
  25239. if (attr.name == TEMPLATE_ATTR) {
  25240. templateBindingsSource = attr.value;
  25241. }
  25242. else if (attr.name.startsWith(TEMPLATE_ATTR_PREFIX)) {
  25243. var key = attr.name.substring(TEMPLATE_ATTR_PREFIX.length); // remove the star
  25244. templateBindingsSource = (attr.value.length == 0) ? key : key + ' ' + attr.value;
  25245. }
  25246. if (lang_1.isPresent(templateBindingsSource)) {
  25247. var bindings = this._parseTemplateBindings(templateBindingsSource, attr.sourceSpan);
  25248. for (var i = 0; i < bindings.length; i++) {
  25249. var binding = bindings[i];
  25250. if (binding.keyIsVar) {
  25251. targetVars.push(new template_ast_1.VariableAst(binding.key, binding.name, attr.sourceSpan));
  25252. targetMatchableAttrs.push([binding.key, binding.name]);
  25253. }
  25254. else if (lang_1.isPresent(binding.expression)) {
  25255. this._parsePropertyAst(binding.key, binding.expression, attr.sourceSpan, targetMatchableAttrs, targetProps);
  25256. }
  25257. else {
  25258. targetMatchableAttrs.push([binding.key, '']);
  25259. this._parseLiteralAttr(binding.key, null, attr.sourceSpan, targetProps);
  25260. }
  25261. }
  25262. return true;
  25263. }
  25264. return false;
  25265. };
  25266. TemplateParseVisitor.prototype._parseAttr = function (attr, targetMatchableAttrs, targetProps, targetEvents, targetVars) {
  25267. var attrName = this._normalizeAttributeName(attr.name);
  25268. var attrValue = attr.value;
  25269. var bindParts = lang_1.RegExpWrapper.firstMatch(BIND_NAME_REGEXP, attrName);
  25270. var hasBinding = false;
  25271. if (lang_1.isPresent(bindParts)) {
  25272. hasBinding = true;
  25273. if (lang_1.isPresent(bindParts[1])) {
  25274. this._parseProperty(bindParts[5], attrValue, attr.sourceSpan, targetMatchableAttrs, targetProps);
  25275. }
  25276. else if (lang_1.isPresent(bindParts[2])) {
  25277. var identifier = bindParts[5];
  25278. this._parseVariable(identifier, attrValue, attr.sourceSpan, targetVars);
  25279. }
  25280. else if (lang_1.isPresent(bindParts[3])) {
  25281. this._parseEvent(bindParts[5], attrValue, attr.sourceSpan, targetMatchableAttrs, targetEvents);
  25282. }
  25283. else if (lang_1.isPresent(bindParts[4])) {
  25284. this._parseProperty(bindParts[5], attrValue, attr.sourceSpan, targetMatchableAttrs, targetProps);
  25285. this._parseAssignmentEvent(bindParts[5], attrValue, attr.sourceSpan, targetMatchableAttrs, targetEvents);
  25286. }
  25287. else if (lang_1.isPresent(bindParts[6])) {
  25288. this._parseProperty(bindParts[6], attrValue, attr.sourceSpan, targetMatchableAttrs, targetProps);
  25289. this._parseAssignmentEvent(bindParts[6], attrValue, attr.sourceSpan, targetMatchableAttrs, targetEvents);
  25290. }
  25291. else if (lang_1.isPresent(bindParts[7])) {
  25292. this._parseProperty(bindParts[7], attrValue, attr.sourceSpan, targetMatchableAttrs, targetProps);
  25293. }
  25294. else if (lang_1.isPresent(bindParts[8])) {
  25295. this._parseEvent(bindParts[8], attrValue, attr.sourceSpan, targetMatchableAttrs, targetEvents);
  25296. }
  25297. }
  25298. else {
  25299. hasBinding = this._parsePropertyInterpolation(attrName, attrValue, attr.sourceSpan, targetMatchableAttrs, targetProps);
  25300. }
  25301. if (!hasBinding) {
  25302. this._parseLiteralAttr(attrName, attrValue, attr.sourceSpan, targetProps);
  25303. }
  25304. return hasBinding;
  25305. };
  25306. TemplateParseVisitor.prototype._normalizeAttributeName = function (attrName) {
  25307. return attrName.toLowerCase().startsWith('data-') ? attrName.substring(5) : attrName;
  25308. };
  25309. TemplateParseVisitor.prototype._parseVariable = function (identifier, value, sourceSpan, targetVars) {
  25310. if (identifier.indexOf('-') > -1) {
  25311. this._reportError("\"-\" is not allowed in variable names", sourceSpan);
  25312. }
  25313. targetVars.push(new template_ast_1.VariableAst(identifier, value, sourceSpan));
  25314. };
  25315. TemplateParseVisitor.prototype._parseProperty = function (name, expression, sourceSpan, targetMatchableAttrs, targetProps) {
  25316. this._parsePropertyAst(name, this._parseBinding(expression, sourceSpan), sourceSpan, targetMatchableAttrs, targetProps);
  25317. };
  25318. TemplateParseVisitor.prototype._parsePropertyInterpolation = function (name, value, sourceSpan, targetMatchableAttrs, targetProps) {
  25319. var expr = this._parseInterpolation(value, sourceSpan);
  25320. if (lang_1.isPresent(expr)) {
  25321. this._parsePropertyAst(name, expr, sourceSpan, targetMatchableAttrs, targetProps);
  25322. return true;
  25323. }
  25324. return false;
  25325. };
  25326. TemplateParseVisitor.prototype._parsePropertyAst = function (name, ast, sourceSpan, targetMatchableAttrs, targetProps) {
  25327. targetMatchableAttrs.push([name, ast.source]);
  25328. targetProps.push(new BoundElementOrDirectiveProperty(name, ast, false, sourceSpan));
  25329. };
  25330. TemplateParseVisitor.prototype._parseAssignmentEvent = function (name, expression, sourceSpan, targetMatchableAttrs, targetEvents) {
  25331. this._parseEvent(name + "Change", expression + "=$event", sourceSpan, targetMatchableAttrs, targetEvents);
  25332. };
  25333. TemplateParseVisitor.prototype._parseEvent = function (name, expression, sourceSpan, targetMatchableAttrs, targetEvents) {
  25334. // long format: 'target: eventName'
  25335. var parts = util_1.splitAtColon(name, [null, name]);
  25336. var target = parts[0];
  25337. var eventName = parts[1];
  25338. targetEvents.push(new template_ast_1.BoundEventAst(eventName, target, this._parseAction(expression, sourceSpan), sourceSpan));
  25339. // Don't detect directives for event names for now,
  25340. // so don't add the event name to the matchableAttrs
  25341. };
  25342. TemplateParseVisitor.prototype._parseLiteralAttr = function (name, value, sourceSpan, targetProps) {
  25343. targetProps.push(new BoundElementOrDirectiveProperty(name, this._exprParser.wrapLiteralPrimitive(value, ''), true, sourceSpan));
  25344. };
  25345. TemplateParseVisitor.prototype._parseDirectives = function (selectorMatcher, elementCssSelector) {
  25346. var _this = this;
  25347. var directives = [];
  25348. selectorMatcher.match(elementCssSelector, function (selector, directive) { directives.push(directive); });
  25349. // Need to sort the directives so that we get consistent results throughout,
  25350. // as selectorMatcher uses Maps inside.
  25351. // Also need to make components the first directive in the array
  25352. collection_1.ListWrapper.sort(directives, function (dir1, dir2) {
  25353. var dir1Comp = dir1.isComponent;
  25354. var dir2Comp = dir2.isComponent;
  25355. if (dir1Comp && !dir2Comp) {
  25356. return -1;
  25357. }
  25358. else if (!dir1Comp && dir2Comp) {
  25359. return 1;
  25360. }
  25361. else {
  25362. return _this.directivesIndex.get(dir1) - _this.directivesIndex.get(dir2);
  25363. }
  25364. });
  25365. return directives;
  25366. };
  25367. TemplateParseVisitor.prototype._createDirectiveAsts = function (elementName, directives, props, possibleExportAsVars, sourceSpan) {
  25368. var _this = this;
  25369. var matchedVariables = new Set();
  25370. var directiveAsts = directives.map(function (directive) {
  25371. var hostProperties = [];
  25372. var hostEvents = [];
  25373. var directiveProperties = [];
  25374. _this._createDirectiveHostPropertyAsts(elementName, directive.hostProperties, sourceSpan, hostProperties);
  25375. _this._createDirectiveHostEventAsts(directive.hostListeners, sourceSpan, hostEvents);
  25376. _this._createDirectivePropertyAsts(directive.inputs, props, directiveProperties);
  25377. var exportAsVars = [];
  25378. possibleExportAsVars.forEach(function (varAst) {
  25379. if ((varAst.value.length === 0 && directive.isComponent) ||
  25380. (directive.exportAs == varAst.value)) {
  25381. exportAsVars.push(varAst);
  25382. matchedVariables.add(varAst.name);
  25383. }
  25384. });
  25385. return new template_ast_1.DirectiveAst(directive, directiveProperties, hostProperties, hostEvents, exportAsVars, sourceSpan);
  25386. });
  25387. possibleExportAsVars.forEach(function (varAst) {
  25388. if (varAst.value.length > 0 && !collection_1.SetWrapper.has(matchedVariables, varAst.name)) {
  25389. _this._reportError("There is no directive with \"exportAs\" set to \"" + varAst.value + "\"", varAst.sourceSpan);
  25390. }
  25391. });
  25392. return directiveAsts;
  25393. };
  25394. TemplateParseVisitor.prototype._createDirectiveHostPropertyAsts = function (elementName, hostProps, sourceSpan, targetPropertyAsts) {
  25395. var _this = this;
  25396. if (lang_1.isPresent(hostProps)) {
  25397. collection_1.StringMapWrapper.forEach(hostProps, function (expression, propName) {
  25398. var exprAst = _this._parseBinding(expression, sourceSpan);
  25399. targetPropertyAsts.push(_this._createElementPropertyAst(elementName, propName, exprAst, sourceSpan));
  25400. });
  25401. }
  25402. };
  25403. TemplateParseVisitor.prototype._createDirectiveHostEventAsts = function (hostListeners, sourceSpan, targetEventAsts) {
  25404. var _this = this;
  25405. if (lang_1.isPresent(hostListeners)) {
  25406. collection_1.StringMapWrapper.forEach(hostListeners, function (expression, propName) {
  25407. _this._parseEvent(propName, expression, sourceSpan, [], targetEventAsts);
  25408. });
  25409. }
  25410. };
  25411. TemplateParseVisitor.prototype._createDirectivePropertyAsts = function (directiveProperties, boundProps, targetBoundDirectiveProps) {
  25412. if (lang_1.isPresent(directiveProperties)) {
  25413. var boundPropsByName = new Map();
  25414. boundProps.forEach(function (boundProp) {
  25415. var prevValue = boundPropsByName.get(boundProp.name);
  25416. if (lang_1.isBlank(prevValue) || prevValue.isLiteral) {
  25417. // give [a]="b" a higher precedence than a="b" on the same element
  25418. boundPropsByName.set(boundProp.name, boundProp);
  25419. }
  25420. });
  25421. collection_1.StringMapWrapper.forEach(directiveProperties, function (elProp, dirProp) {
  25422. var boundProp = boundPropsByName.get(elProp);
  25423. // Bindings are optional, so this binding only needs to be set up if an expression is given.
  25424. if (lang_1.isPresent(boundProp)) {
  25425. targetBoundDirectiveProps.push(new template_ast_1.BoundDirectivePropertyAst(dirProp, boundProp.name, boundProp.expression, boundProp.sourceSpan));
  25426. }
  25427. });
  25428. }
  25429. };
  25430. TemplateParseVisitor.prototype._createElementPropertyAsts = function (elementName, props, directives) {
  25431. var _this = this;
  25432. var boundElementProps = [];
  25433. var boundDirectivePropsIndex = new Map();
  25434. directives.forEach(function (directive) {
  25435. directive.inputs.forEach(function (prop) {
  25436. boundDirectivePropsIndex.set(prop.templateName, prop);
  25437. });
  25438. });
  25439. props.forEach(function (prop) {
  25440. if (!prop.isLiteral && lang_1.isBlank(boundDirectivePropsIndex.get(prop.name))) {
  25441. boundElementProps.push(_this._createElementPropertyAst(elementName, prop.name, prop.expression, prop.sourceSpan));
  25442. }
  25443. });
  25444. return boundElementProps;
  25445. };
  25446. TemplateParseVisitor.prototype._createElementPropertyAst = function (elementName, name, ast, sourceSpan) {
  25447. var unit = null;
  25448. var bindingType;
  25449. var boundPropertyName;
  25450. var parts = name.split(PROPERTY_PARTS_SEPARATOR);
  25451. if (parts.length === 1) {
  25452. boundPropertyName = this._schemaRegistry.getMappedPropName(parts[0]);
  25453. bindingType = template_ast_1.PropertyBindingType.Property;
  25454. if (!this._schemaRegistry.hasProperty(elementName, boundPropertyName)) {
  25455. this._reportError("Can't bind to '" + boundPropertyName + "' since it isn't a known native property", sourceSpan);
  25456. }
  25457. }
  25458. else {
  25459. if (parts[0] == ATTRIBUTE_PREFIX) {
  25460. boundPropertyName = parts[1];
  25461. bindingType = template_ast_1.PropertyBindingType.Attribute;
  25462. }
  25463. else if (parts[0] == CLASS_PREFIX) {
  25464. boundPropertyName = parts[1];
  25465. bindingType = template_ast_1.PropertyBindingType.Class;
  25466. }
  25467. else if (parts[0] == STYLE_PREFIX) {
  25468. unit = parts.length > 2 ? parts[2] : null;
  25469. boundPropertyName = parts[1];
  25470. bindingType = template_ast_1.PropertyBindingType.Style;
  25471. }
  25472. else {
  25473. this._reportError("Invalid property name '" + name + "'", sourceSpan);
  25474. bindingType = null;
  25475. }
  25476. }
  25477. return new template_ast_1.BoundElementPropertyAst(boundPropertyName, bindingType, ast, unit, sourceSpan);
  25478. };
  25479. TemplateParseVisitor.prototype._findComponentDirectiveNames = function (directives) {
  25480. var componentTypeNames = [];
  25481. directives.forEach(function (directive) {
  25482. var typeName = directive.directive.type.name;
  25483. if (directive.directive.isComponent) {
  25484. componentTypeNames.push(typeName);
  25485. }
  25486. });
  25487. return componentTypeNames;
  25488. };
  25489. TemplateParseVisitor.prototype._assertOnlyOneComponent = function (directives, sourceSpan) {
  25490. var componentTypeNames = this._findComponentDirectiveNames(directives);
  25491. if (componentTypeNames.length > 1) {
  25492. this._reportError("More than one component: " + componentTypeNames.join(','), sourceSpan);
  25493. }
  25494. };
  25495. TemplateParseVisitor.prototype._assertNoComponentsNorElementBindingsOnTemplate = function (directives, elementProps, sourceSpan) {
  25496. var _this = this;
  25497. var componentTypeNames = this._findComponentDirectiveNames(directives);
  25498. if (componentTypeNames.length > 0) {
  25499. this._reportError("Components on an embedded template: " + componentTypeNames.join(','), sourceSpan);
  25500. }
  25501. elementProps.forEach(function (prop) {
  25502. _this._reportError("Property binding " + prop.name + " not used by any directive on an embedded template", sourceSpan);
  25503. });
  25504. };
  25505. TemplateParseVisitor.prototype._assertAllEventsPublishedByDirectives = function (directives, events) {
  25506. var _this = this;
  25507. var allDirectiveEvents = new Set();
  25508. directives.forEach(function (directive) {
  25509. collection_1.StringMapWrapper.forEach(directive.directive.outputs, function (eventName, _) { allDirectiveEvents.add(eventName); });
  25510. });
  25511. events.forEach(function (event) {
  25512. if (lang_1.isPresent(event.target) || !collection_1.SetWrapper.has(allDirectiveEvents, event.name)) {
  25513. _this._reportError("Event binding " + event.fullName + " not emitted by any directive on an embedded template", event.sourceSpan);
  25514. }
  25515. });
  25516. };
  25517. return TemplateParseVisitor;
  25518. })();
  25519. var NonBindableVisitor = (function () {
  25520. function NonBindableVisitor() {
  25521. }
  25522. NonBindableVisitor.prototype.visitElement = function (ast, component) {
  25523. var preparsedElement = template_preparser_1.preparseElement(ast);
  25524. if (preparsedElement.type === template_preparser_1.PreparsedElementType.SCRIPT ||
  25525. preparsedElement.type === template_preparser_1.PreparsedElementType.STYLE ||
  25526. preparsedElement.type === template_preparser_1.PreparsedElementType.STYLESHEET) {
  25527. // Skipping <script> for security reasons
  25528. // Skipping <style> and stylesheets as we already processed them
  25529. // in the StyleCompiler
  25530. return null;
  25531. }
  25532. var attrNameAndValues = ast.attrs.map(function (attrAst) { return [attrAst.name, attrAst.value]; });
  25533. var selector = createElementCssSelector(ast.name, attrNameAndValues);
  25534. var ngContentIndex = component.findNgContentIndex(selector);
  25535. var children = html_ast_1.htmlVisitAll(this, ast.children, EMPTY_COMPONENT);
  25536. return new template_ast_1.ElementAst(ast.name, html_ast_1.htmlVisitAll(this, ast.attrs), [], [], [], [], children, ngContentIndex, ast.sourceSpan);
  25537. };
  25538. NonBindableVisitor.prototype.visitAttr = function (ast, context) {
  25539. return new template_ast_1.AttrAst(ast.name, ast.value, ast.sourceSpan);
  25540. };
  25541. NonBindableVisitor.prototype.visitText = function (ast, component) {
  25542. var ngContentIndex = component.findNgContentIndex(TEXT_CSS_SELECTOR);
  25543. return new template_ast_1.TextAst(ast.value, ngContentIndex, ast.sourceSpan);
  25544. };
  25545. return NonBindableVisitor;
  25546. })();
  25547. var BoundElementOrDirectiveProperty = (function () {
  25548. function BoundElementOrDirectiveProperty(name, expression, isLiteral, sourceSpan) {
  25549. this.name = name;
  25550. this.expression = expression;
  25551. this.isLiteral = isLiteral;
  25552. this.sourceSpan = sourceSpan;
  25553. }
  25554. return BoundElementOrDirectiveProperty;
  25555. })();
  25556. function splitClasses(classAttrValue) {
  25557. return lang_1.StringWrapper.split(classAttrValue.trim(), /\s+/g);
  25558. }
  25559. exports.splitClasses = splitClasses;
  25560. var Component = (function () {
  25561. function Component(ngContentIndexMatcher, wildcardNgContentIndex) {
  25562. this.ngContentIndexMatcher = ngContentIndexMatcher;
  25563. this.wildcardNgContentIndex = wildcardNgContentIndex;
  25564. }
  25565. Component.create = function (directives) {
  25566. if (directives.length === 0 || !directives[0].directive.isComponent) {
  25567. return EMPTY_COMPONENT;
  25568. }
  25569. var matcher = new selector_1.SelectorMatcher();
  25570. var ngContentSelectors = directives[0].directive.template.ngContentSelectors;
  25571. var wildcardNgContentIndex = null;
  25572. for (var i = 0; i < ngContentSelectors.length; i++) {
  25573. var selector = ngContentSelectors[i];
  25574. if (lang_1.StringWrapper.equals(selector, '*')) {
  25575. wildcardNgContentIndex = i;
  25576. }
  25577. else {
  25578. matcher.addSelectables(selector_1.CssSelector.parse(ngContentSelectors[i]), i);
  25579. }
  25580. }
  25581. return new Component(matcher, wildcardNgContentIndex);
  25582. };
  25583. Component.prototype.findNgContentIndex = function (selector) {
  25584. var ngContentIndices = [];
  25585. this.ngContentIndexMatcher.match(selector, function (selector, ngContentIndex) { ngContentIndices.push(ngContentIndex); });
  25586. collection_1.ListWrapper.sort(ngContentIndices);
  25587. if (lang_1.isPresent(this.wildcardNgContentIndex)) {
  25588. ngContentIndices.push(this.wildcardNgContentIndex);
  25589. }
  25590. return ngContentIndices.length > 0 ? ngContentIndices[0] : null;
  25591. };
  25592. return Component;
  25593. })();
  25594. function createElementCssSelector(elementName, matchableAttrs) {
  25595. var cssSelector = new selector_1.CssSelector();
  25596. var elNameNoNs = html_tags_1.splitNsName(elementName)[1];
  25597. cssSelector.setElement(elNameNoNs);
  25598. for (var i = 0; i < matchableAttrs.length; i++) {
  25599. var attrName = matchableAttrs[i][0];
  25600. var attrNameNoNs = html_tags_1.splitNsName(attrName)[1];
  25601. var attrValue = matchableAttrs[i][1];
  25602. cssSelector.addAttribute(attrNameNoNs, attrValue);
  25603. if (attrName.toLowerCase() == CLASS_ATTR) {
  25604. var classes = splitClasses(attrValue);
  25605. classes.forEach(function (className) { return cssSelector.addClassName(className); });
  25606. }
  25607. }
  25608. return cssSelector;
  25609. }
  25610. var EMPTY_COMPONENT = new Component(new selector_1.SelectorMatcher(), null);
  25611. var NON_BINDABLE_VISITOR = new NonBindableVisitor();
  25612. /***/ },
  25613. /* 168 */
  25614. /***/ function(module, exports, __webpack_require__) {
  25615. var __extends = (this && this.__extends) || function (d, b) {
  25616. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  25617. function __() { this.constructor = d; }
  25618. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  25619. };
  25620. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  25621. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  25622. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  25623. 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;
  25624. return c > 3 && r && Object.defineProperty(target, key, r), r;
  25625. };
  25626. var __metadata = (this && this.__metadata) || function (k, v) {
  25627. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  25628. };
  25629. var lang_1 = __webpack_require__(5);
  25630. var collection_1 = __webpack_require__(12);
  25631. var html_ast_1 = __webpack_require__(169);
  25632. var di_1 = __webpack_require__(6);
  25633. var html_lexer_1 = __webpack_require__(170);
  25634. var parse_util_1 = __webpack_require__(171);
  25635. var html_tags_1 = __webpack_require__(172);
  25636. var HtmlTreeError = (function (_super) {
  25637. __extends(HtmlTreeError, _super);
  25638. function HtmlTreeError(elementName, location, msg) {
  25639. _super.call(this, location, msg);
  25640. this.elementName = elementName;
  25641. }
  25642. HtmlTreeError.create = function (elementName, location, msg) {
  25643. return new HtmlTreeError(elementName, location, msg);
  25644. };
  25645. return HtmlTreeError;
  25646. })(parse_util_1.ParseError);
  25647. exports.HtmlTreeError = HtmlTreeError;
  25648. var HtmlParseTreeResult = (function () {
  25649. function HtmlParseTreeResult(rootNodes, errors) {
  25650. this.rootNodes = rootNodes;
  25651. this.errors = errors;
  25652. }
  25653. return HtmlParseTreeResult;
  25654. })();
  25655. exports.HtmlParseTreeResult = HtmlParseTreeResult;
  25656. var HtmlParser = (function () {
  25657. function HtmlParser() {
  25658. }
  25659. HtmlParser.prototype.parse = function (sourceContent, sourceUrl) {
  25660. var tokensAndErrors = html_lexer_1.tokenizeHtml(sourceContent, sourceUrl);
  25661. var treeAndErrors = new TreeBuilder(tokensAndErrors.tokens).build();
  25662. return new HtmlParseTreeResult(treeAndErrors.rootNodes, tokensAndErrors.errors
  25663. .concat(treeAndErrors.errors));
  25664. };
  25665. HtmlParser = __decorate([
  25666. di_1.Injectable(),
  25667. __metadata('design:paramtypes', [])
  25668. ], HtmlParser);
  25669. return HtmlParser;
  25670. })();
  25671. exports.HtmlParser = HtmlParser;
  25672. var TreeBuilder = (function () {
  25673. function TreeBuilder(tokens) {
  25674. this.tokens = tokens;
  25675. this.index = -1;
  25676. this.rootNodes = [];
  25677. this.errors = [];
  25678. this.elementStack = [];
  25679. this._advance();
  25680. }
  25681. TreeBuilder.prototype.build = function () {
  25682. while (this.peek.type !== html_lexer_1.HtmlTokenType.EOF) {
  25683. if (this.peek.type === html_lexer_1.HtmlTokenType.TAG_OPEN_START) {
  25684. this._consumeStartTag(this._advance());
  25685. }
  25686. else if (this.peek.type === html_lexer_1.HtmlTokenType.TAG_CLOSE) {
  25687. this._consumeEndTag(this._advance());
  25688. }
  25689. else if (this.peek.type === html_lexer_1.HtmlTokenType.CDATA_START) {
  25690. this._closeVoidElement();
  25691. this._consumeCdata(this._advance());
  25692. }
  25693. else if (this.peek.type === html_lexer_1.HtmlTokenType.COMMENT_START) {
  25694. this._closeVoidElement();
  25695. this._consumeComment(this._advance());
  25696. }
  25697. else if (this.peek.type === html_lexer_1.HtmlTokenType.TEXT ||
  25698. this.peek.type === html_lexer_1.HtmlTokenType.RAW_TEXT ||
  25699. this.peek.type === html_lexer_1.HtmlTokenType.ESCAPABLE_RAW_TEXT) {
  25700. this._closeVoidElement();
  25701. this._consumeText(this._advance());
  25702. }
  25703. else {
  25704. // Skip all other tokens...
  25705. this._advance();
  25706. }
  25707. }
  25708. return new HtmlParseTreeResult(this.rootNodes, this.errors);
  25709. };
  25710. TreeBuilder.prototype._advance = function () {
  25711. var prev = this.peek;
  25712. if (this.index < this.tokens.length - 1) {
  25713. // Note: there is always an EOF token at the end
  25714. this.index++;
  25715. }
  25716. this.peek = this.tokens[this.index];
  25717. return prev;
  25718. };
  25719. TreeBuilder.prototype._advanceIf = function (type) {
  25720. if (this.peek.type === type) {
  25721. return this._advance();
  25722. }
  25723. return null;
  25724. };
  25725. TreeBuilder.prototype._consumeCdata = function (startToken) {
  25726. this._consumeText(this._advance());
  25727. this._advanceIf(html_lexer_1.HtmlTokenType.CDATA_END);
  25728. };
  25729. TreeBuilder.prototype._consumeComment = function (startToken) {
  25730. this._advanceIf(html_lexer_1.HtmlTokenType.RAW_TEXT);
  25731. this._advanceIf(html_lexer_1.HtmlTokenType.COMMENT_END);
  25732. };
  25733. TreeBuilder.prototype._consumeText = function (token) {
  25734. var text = token.parts[0];
  25735. if (text.length > 0 && text[0] == '\n') {
  25736. var parent_1 = this._getParentElement();
  25737. if (lang_1.isPresent(parent_1) && parent_1.children.length == 0 &&
  25738. html_tags_1.getHtmlTagDefinition(parent_1.name).ignoreFirstLf) {
  25739. text = text.substring(1);
  25740. }
  25741. }
  25742. if (text.length > 0) {
  25743. this._addToParent(new html_ast_1.HtmlTextAst(text, token.sourceSpan));
  25744. }
  25745. };
  25746. TreeBuilder.prototype._closeVoidElement = function () {
  25747. if (this.elementStack.length > 0) {
  25748. var el = collection_1.ListWrapper.last(this.elementStack);
  25749. if (html_tags_1.getHtmlTagDefinition(el.name).isVoid) {
  25750. this.elementStack.pop();
  25751. }
  25752. }
  25753. };
  25754. TreeBuilder.prototype._consumeStartTag = function (startTagToken) {
  25755. var prefix = startTagToken.parts[0];
  25756. var name = startTagToken.parts[1];
  25757. var attrs = [];
  25758. while (this.peek.type === html_lexer_1.HtmlTokenType.ATTR_NAME) {
  25759. attrs.push(this._consumeAttr(this._advance()));
  25760. }
  25761. var fullName = getElementFullName(prefix, name, this._getParentElement());
  25762. var selfClosing = false;
  25763. // Note: There could have been a tokenizer error
  25764. // so that we don't get a token for the end tag...
  25765. if (this.peek.type === html_lexer_1.HtmlTokenType.TAG_OPEN_END_VOID) {
  25766. this._advance();
  25767. selfClosing = true;
  25768. if (html_tags_1.getNsPrefix(fullName) == null && !html_tags_1.getHtmlTagDefinition(fullName).isVoid) {
  25769. this.errors.push(HtmlTreeError.create(fullName, startTagToken.sourceSpan.start, "Only void and foreign elements can be self closed \"" + startTagToken.parts[1] + "\""));
  25770. }
  25771. }
  25772. else if (this.peek.type === html_lexer_1.HtmlTokenType.TAG_OPEN_END) {
  25773. this._advance();
  25774. selfClosing = false;
  25775. }
  25776. var end = this.peek.sourceSpan.start;
  25777. var el = new html_ast_1.HtmlElementAst(fullName, attrs, [], new parse_util_1.ParseSourceSpan(startTagToken.sourceSpan.start, end));
  25778. this._pushElement(el);
  25779. if (selfClosing) {
  25780. this._popElement(fullName);
  25781. }
  25782. };
  25783. TreeBuilder.prototype._pushElement = function (el) {
  25784. if (this.elementStack.length > 0) {
  25785. var parentEl = collection_1.ListWrapper.last(this.elementStack);
  25786. if (html_tags_1.getHtmlTagDefinition(parentEl.name).isClosedByChild(el.name)) {
  25787. this.elementStack.pop();
  25788. }
  25789. }
  25790. var tagDef = html_tags_1.getHtmlTagDefinition(el.name);
  25791. var parentEl = this._getParentElement();
  25792. if (tagDef.requireExtraParent(lang_1.isPresent(parentEl) ? parentEl.name : null)) {
  25793. var newParent = new html_ast_1.HtmlElementAst(tagDef.parentToAdd, [], [el], el.sourceSpan);
  25794. this._addToParent(newParent);
  25795. this.elementStack.push(newParent);
  25796. this.elementStack.push(el);
  25797. }
  25798. else {
  25799. this._addToParent(el);
  25800. this.elementStack.push(el);
  25801. }
  25802. };
  25803. TreeBuilder.prototype._consumeEndTag = function (endTagToken) {
  25804. var fullName = getElementFullName(endTagToken.parts[0], endTagToken.parts[1], this._getParentElement());
  25805. if (html_tags_1.getHtmlTagDefinition(fullName).isVoid) {
  25806. this.errors.push(HtmlTreeError.create(fullName, endTagToken.sourceSpan.start, "Void elements do not have end tags \"" + endTagToken.parts[1] + "\""));
  25807. }
  25808. else if (!this._popElement(fullName)) {
  25809. this.errors.push(HtmlTreeError.create(fullName, endTagToken.sourceSpan.start, "Unexpected closing tag \"" + endTagToken.parts[1] + "\""));
  25810. }
  25811. };
  25812. TreeBuilder.prototype._popElement = function (fullName) {
  25813. for (var stackIndex = this.elementStack.length - 1; stackIndex >= 0; stackIndex--) {
  25814. var el = this.elementStack[stackIndex];
  25815. if (el.name == fullName) {
  25816. collection_1.ListWrapper.splice(this.elementStack, stackIndex, this.elementStack.length - stackIndex);
  25817. return true;
  25818. }
  25819. if (!html_tags_1.getHtmlTagDefinition(el.name).closedByParent) {
  25820. return false;
  25821. }
  25822. }
  25823. return false;
  25824. };
  25825. TreeBuilder.prototype._consumeAttr = function (attrName) {
  25826. var fullName = mergeNsAndName(attrName.parts[0], attrName.parts[1]);
  25827. var end = attrName.sourceSpan.end;
  25828. var value = '';
  25829. if (this.peek.type === html_lexer_1.HtmlTokenType.ATTR_VALUE) {
  25830. var valueToken = this._advance();
  25831. value = valueToken.parts[0];
  25832. end = valueToken.sourceSpan.end;
  25833. }
  25834. return new html_ast_1.HtmlAttrAst(fullName, value, new parse_util_1.ParseSourceSpan(attrName.sourceSpan.start, end));
  25835. };
  25836. TreeBuilder.prototype._getParentElement = function () {
  25837. return this.elementStack.length > 0 ? collection_1.ListWrapper.last(this.elementStack) : null;
  25838. };
  25839. TreeBuilder.prototype._addToParent = function (node) {
  25840. var parent = this._getParentElement();
  25841. if (lang_1.isPresent(parent)) {
  25842. parent.children.push(node);
  25843. }
  25844. else {
  25845. this.rootNodes.push(node);
  25846. }
  25847. };
  25848. return TreeBuilder;
  25849. })();
  25850. function mergeNsAndName(prefix, localName) {
  25851. return lang_1.isPresent(prefix) ? "@" + prefix + ":" + localName : localName;
  25852. }
  25853. function getElementFullName(prefix, localName, parentElement) {
  25854. if (lang_1.isBlank(prefix)) {
  25855. prefix = html_tags_1.getHtmlTagDefinition(localName).implicitNamespacePrefix;
  25856. if (lang_1.isBlank(prefix) && lang_1.isPresent(parentElement)) {
  25857. prefix = html_tags_1.getNsPrefix(parentElement.name);
  25858. }
  25859. }
  25860. return mergeNsAndName(prefix, localName);
  25861. }
  25862. /***/ },
  25863. /* 169 */
  25864. /***/ function(module, exports, __webpack_require__) {
  25865. var lang_1 = __webpack_require__(5);
  25866. var HtmlTextAst = (function () {
  25867. function HtmlTextAst(value, sourceSpan) {
  25868. this.value = value;
  25869. this.sourceSpan = sourceSpan;
  25870. }
  25871. HtmlTextAst.prototype.visit = function (visitor, context) { return visitor.visitText(this, context); };
  25872. return HtmlTextAst;
  25873. })();
  25874. exports.HtmlTextAst = HtmlTextAst;
  25875. var HtmlAttrAst = (function () {
  25876. function HtmlAttrAst(name, value, sourceSpan) {
  25877. this.name = name;
  25878. this.value = value;
  25879. this.sourceSpan = sourceSpan;
  25880. }
  25881. HtmlAttrAst.prototype.visit = function (visitor, context) { return visitor.visitAttr(this, context); };
  25882. return HtmlAttrAst;
  25883. })();
  25884. exports.HtmlAttrAst = HtmlAttrAst;
  25885. var HtmlElementAst = (function () {
  25886. function HtmlElementAst(name, attrs, children, sourceSpan) {
  25887. this.name = name;
  25888. this.attrs = attrs;
  25889. this.children = children;
  25890. this.sourceSpan = sourceSpan;
  25891. }
  25892. HtmlElementAst.prototype.visit = function (visitor, context) { return visitor.visitElement(this, context); };
  25893. return HtmlElementAst;
  25894. })();
  25895. exports.HtmlElementAst = HtmlElementAst;
  25896. function htmlVisitAll(visitor, asts, context) {
  25897. if (context === void 0) { context = null; }
  25898. var result = [];
  25899. asts.forEach(function (ast) {
  25900. var astResult = ast.visit(visitor, context);
  25901. if (lang_1.isPresent(astResult)) {
  25902. result.push(astResult);
  25903. }
  25904. });
  25905. return result;
  25906. }
  25907. exports.htmlVisitAll = htmlVisitAll;
  25908. /***/ },
  25909. /* 170 */
  25910. /***/ function(module, exports, __webpack_require__) {
  25911. var __extends = (this && this.__extends) || function (d, b) {
  25912. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  25913. function __() { this.constructor = d; }
  25914. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  25915. };
  25916. var lang_1 = __webpack_require__(5);
  25917. var collection_1 = __webpack_require__(12);
  25918. var parse_util_1 = __webpack_require__(171);
  25919. var html_tags_1 = __webpack_require__(172);
  25920. (function (HtmlTokenType) {
  25921. HtmlTokenType[HtmlTokenType["TAG_OPEN_START"] = 0] = "TAG_OPEN_START";
  25922. HtmlTokenType[HtmlTokenType["TAG_OPEN_END"] = 1] = "TAG_OPEN_END";
  25923. HtmlTokenType[HtmlTokenType["TAG_OPEN_END_VOID"] = 2] = "TAG_OPEN_END_VOID";
  25924. HtmlTokenType[HtmlTokenType["TAG_CLOSE"] = 3] = "TAG_CLOSE";
  25925. HtmlTokenType[HtmlTokenType["TEXT"] = 4] = "TEXT";
  25926. HtmlTokenType[HtmlTokenType["ESCAPABLE_RAW_TEXT"] = 5] = "ESCAPABLE_RAW_TEXT";
  25927. HtmlTokenType[HtmlTokenType["RAW_TEXT"] = 6] = "RAW_TEXT";
  25928. HtmlTokenType[HtmlTokenType["COMMENT_START"] = 7] = "COMMENT_START";
  25929. HtmlTokenType[HtmlTokenType["COMMENT_END"] = 8] = "COMMENT_END";
  25930. HtmlTokenType[HtmlTokenType["CDATA_START"] = 9] = "CDATA_START";
  25931. HtmlTokenType[HtmlTokenType["CDATA_END"] = 10] = "CDATA_END";
  25932. HtmlTokenType[HtmlTokenType["ATTR_NAME"] = 11] = "ATTR_NAME";
  25933. HtmlTokenType[HtmlTokenType["ATTR_VALUE"] = 12] = "ATTR_VALUE";
  25934. HtmlTokenType[HtmlTokenType["DOC_TYPE"] = 13] = "DOC_TYPE";
  25935. HtmlTokenType[HtmlTokenType["EOF"] = 14] = "EOF";
  25936. })(exports.HtmlTokenType || (exports.HtmlTokenType = {}));
  25937. var HtmlTokenType = exports.HtmlTokenType;
  25938. var HtmlToken = (function () {
  25939. function HtmlToken(type, parts, sourceSpan) {
  25940. this.type = type;
  25941. this.parts = parts;
  25942. this.sourceSpan = sourceSpan;
  25943. }
  25944. return HtmlToken;
  25945. })();
  25946. exports.HtmlToken = HtmlToken;
  25947. var HtmlTokenError = (function (_super) {
  25948. __extends(HtmlTokenError, _super);
  25949. function HtmlTokenError(errorMsg, tokenType, location) {
  25950. _super.call(this, location, errorMsg);
  25951. this.tokenType = tokenType;
  25952. }
  25953. return HtmlTokenError;
  25954. })(parse_util_1.ParseError);
  25955. exports.HtmlTokenError = HtmlTokenError;
  25956. var HtmlTokenizeResult = (function () {
  25957. function HtmlTokenizeResult(tokens, errors) {
  25958. this.tokens = tokens;
  25959. this.errors = errors;
  25960. }
  25961. return HtmlTokenizeResult;
  25962. })();
  25963. exports.HtmlTokenizeResult = HtmlTokenizeResult;
  25964. function tokenizeHtml(sourceContent, sourceUrl) {
  25965. return new _HtmlTokenizer(new parse_util_1.ParseSourceFile(sourceContent, sourceUrl)).tokenize();
  25966. }
  25967. exports.tokenizeHtml = tokenizeHtml;
  25968. var $EOF = 0;
  25969. var $TAB = 9;
  25970. var $LF = 10;
  25971. var $FF = 12;
  25972. var $CR = 13;
  25973. var $SPACE = 32;
  25974. var $BANG = 33;
  25975. var $DQ = 34;
  25976. var $HASH = 35;
  25977. var $$ = 36;
  25978. var $AMPERSAND = 38;
  25979. var $SQ = 39;
  25980. var $MINUS = 45;
  25981. var $SLASH = 47;
  25982. var $0 = 48;
  25983. var $SEMICOLON = 59;
  25984. var $9 = 57;
  25985. var $COLON = 58;
  25986. var $LT = 60;
  25987. var $EQ = 61;
  25988. var $GT = 62;
  25989. var $QUESTION = 63;
  25990. var $A = 65;
  25991. var $Z = 90;
  25992. var $LBRACKET = 91;
  25993. var $RBRACKET = 93;
  25994. var $a = 97;
  25995. var $f = 102;
  25996. var $z = 122;
  25997. var $x = 120;
  25998. var $NBSP = 160;
  25999. var CR_OR_CRLF_REGEXP = /\r\n?/g;
  26000. function unexpectedCharacterErrorMsg(charCode) {
  26001. var char = charCode === $EOF ? 'EOF' : lang_1.StringWrapper.fromCharCode(charCode);
  26002. return "Unexpected character \"" + char + "\"";
  26003. }
  26004. function unknownEntityErrorMsg(entitySrc) {
  26005. return "Unknown entity \"" + entitySrc + "\" - use the \"&#<decimal>;\" or \"&#x<hex>;\" syntax";
  26006. }
  26007. var ControlFlowError = (function () {
  26008. function ControlFlowError(error) {
  26009. this.error = error;
  26010. }
  26011. return ControlFlowError;
  26012. })();
  26013. // See http://www.w3.org/TR/html51/syntax.html#writing
  26014. var _HtmlTokenizer = (function () {
  26015. function _HtmlTokenizer(file) {
  26016. this.file = file;
  26017. // Note: this is always lowercase!
  26018. this.peek = -1;
  26019. this.index = -1;
  26020. this.line = 0;
  26021. this.column = -1;
  26022. this.tokens = [];
  26023. this.errors = [];
  26024. this.input = file.content;
  26025. this.inputLowercase = file.content.toLowerCase();
  26026. this.length = file.content.length;
  26027. this._advance();
  26028. }
  26029. _HtmlTokenizer.prototype._processCarriageReturns = function (content) {
  26030. // http://www.w3.org/TR/html5/syntax.html#preprocessing-the-input-stream
  26031. // In order to keep the original position in the source, we can not pre-process it.
  26032. // Instead CRs are processed right before instantiating the tokens.
  26033. return lang_1.StringWrapper.replaceAll(content, CR_OR_CRLF_REGEXP, '\n');
  26034. };
  26035. _HtmlTokenizer.prototype.tokenize = function () {
  26036. while (this.peek !== $EOF) {
  26037. var start = this._getLocation();
  26038. try {
  26039. if (this._attemptChar($LT)) {
  26040. if (this._attemptChar($BANG)) {
  26041. if (this._attemptChar($LBRACKET)) {
  26042. this._consumeCdata(start);
  26043. }
  26044. else if (this._attemptChar($MINUS)) {
  26045. this._consumeComment(start);
  26046. }
  26047. else {
  26048. this._consumeDocType(start);
  26049. }
  26050. }
  26051. else if (this._attemptChar($SLASH)) {
  26052. this._consumeTagClose(start);
  26053. }
  26054. else {
  26055. this._consumeTagOpen(start);
  26056. }
  26057. }
  26058. else {
  26059. this._consumeText();
  26060. }
  26061. }
  26062. catch (e) {
  26063. if (e instanceof ControlFlowError) {
  26064. this.errors.push(e.error);
  26065. }
  26066. else {
  26067. throw e;
  26068. }
  26069. }
  26070. }
  26071. this._beginToken(HtmlTokenType.EOF);
  26072. this._endToken([]);
  26073. return new HtmlTokenizeResult(mergeTextTokens(this.tokens), this.errors);
  26074. };
  26075. _HtmlTokenizer.prototype._getLocation = function () {
  26076. return new parse_util_1.ParseLocation(this.file, this.index, this.line, this.column);
  26077. };
  26078. _HtmlTokenizer.prototype._beginToken = function (type, start) {
  26079. if (start === void 0) { start = null; }
  26080. if (lang_1.isBlank(start)) {
  26081. start = this._getLocation();
  26082. }
  26083. this.currentTokenStart = start;
  26084. this.currentTokenType = type;
  26085. };
  26086. _HtmlTokenizer.prototype._endToken = function (parts, end) {
  26087. if (end === void 0) { end = null; }
  26088. if (lang_1.isBlank(end)) {
  26089. end = this._getLocation();
  26090. }
  26091. var token = new HtmlToken(this.currentTokenType, parts, new parse_util_1.ParseSourceSpan(this.currentTokenStart, end));
  26092. this.tokens.push(token);
  26093. this.currentTokenStart = null;
  26094. this.currentTokenType = null;
  26095. return token;
  26096. };
  26097. _HtmlTokenizer.prototype._createError = function (msg, position) {
  26098. var error = new HtmlTokenError(msg, this.currentTokenType, position);
  26099. this.currentTokenStart = null;
  26100. this.currentTokenType = null;
  26101. return new ControlFlowError(error);
  26102. };
  26103. _HtmlTokenizer.prototype._advance = function () {
  26104. if (this.index >= this.length) {
  26105. throw this._createError(unexpectedCharacterErrorMsg($EOF), this._getLocation());
  26106. }
  26107. if (this.peek === $LF) {
  26108. this.line++;
  26109. this.column = 0;
  26110. }
  26111. else if (this.peek !== $LF && this.peek !== $CR) {
  26112. this.column++;
  26113. }
  26114. this.index++;
  26115. this.peek = this.index >= this.length ? $EOF : lang_1.StringWrapper.charCodeAt(this.inputLowercase, this.index);
  26116. };
  26117. _HtmlTokenizer.prototype._attemptChar = function (charCode) {
  26118. if (this.peek === charCode) {
  26119. this._advance();
  26120. return true;
  26121. }
  26122. return false;
  26123. };
  26124. _HtmlTokenizer.prototype._requireChar = function (charCode) {
  26125. var location = this._getLocation();
  26126. if (!this._attemptChar(charCode)) {
  26127. throw this._createError(unexpectedCharacterErrorMsg(this.peek), location);
  26128. }
  26129. };
  26130. _HtmlTokenizer.prototype._attemptChars = function (chars) {
  26131. for (var i = 0; i < chars.length; i++) {
  26132. if (!this._attemptChar(lang_1.StringWrapper.charCodeAt(chars, i))) {
  26133. return false;
  26134. }
  26135. }
  26136. return true;
  26137. };
  26138. _HtmlTokenizer.prototype._requireChars = function (chars) {
  26139. var location = this._getLocation();
  26140. if (!this._attemptChars(chars)) {
  26141. throw this._createError(unexpectedCharacterErrorMsg(this.peek), location);
  26142. }
  26143. };
  26144. _HtmlTokenizer.prototype._attemptUntilFn = function (predicate) {
  26145. while (!predicate(this.peek)) {
  26146. this._advance();
  26147. }
  26148. };
  26149. _HtmlTokenizer.prototype._requireUntilFn = function (predicate, len) {
  26150. var start = this._getLocation();
  26151. this._attemptUntilFn(predicate);
  26152. if (this.index - start.offset < len) {
  26153. throw this._createError(unexpectedCharacterErrorMsg(this.peek), start);
  26154. }
  26155. };
  26156. _HtmlTokenizer.prototype._attemptUntilChar = function (char) {
  26157. while (this.peek !== char) {
  26158. this._advance();
  26159. }
  26160. };
  26161. _HtmlTokenizer.prototype._readChar = function (decodeEntities) {
  26162. if (decodeEntities && this.peek === $AMPERSAND) {
  26163. return this._decodeEntity();
  26164. }
  26165. else {
  26166. var index = this.index;
  26167. this._advance();
  26168. return this.input[index];
  26169. }
  26170. };
  26171. _HtmlTokenizer.prototype._decodeEntity = function () {
  26172. var start = this._getLocation();
  26173. this._advance();
  26174. if (this._attemptChar($HASH)) {
  26175. var isHex = this._attemptChar($x);
  26176. var numberStart = this._getLocation().offset;
  26177. this._attemptUntilFn(isDigitEntityEnd);
  26178. if (this.peek != $SEMICOLON) {
  26179. throw this._createError(unexpectedCharacterErrorMsg(this.peek), this._getLocation());
  26180. }
  26181. this._advance();
  26182. var strNum = this.input.substring(numberStart, this.index - 1);
  26183. try {
  26184. var charCode = lang_1.NumberWrapper.parseInt(strNum, isHex ? 16 : 10);
  26185. return lang_1.StringWrapper.fromCharCode(charCode);
  26186. }
  26187. catch (e) {
  26188. var entity = this.input.substring(start.offset + 1, this.index - 1);
  26189. throw this._createError(unknownEntityErrorMsg(entity), start);
  26190. }
  26191. }
  26192. else {
  26193. var startPosition = this._savePosition();
  26194. this._attemptUntilFn(isNamedEntityEnd);
  26195. if (this.peek != $SEMICOLON) {
  26196. this._restorePosition(startPosition);
  26197. return '&';
  26198. }
  26199. this._advance();
  26200. var name_1 = this.input.substring(start.offset + 1, this.index - 1);
  26201. var char = html_tags_1.NAMED_ENTITIES[name_1];
  26202. if (lang_1.isBlank(char)) {
  26203. throw this._createError(unknownEntityErrorMsg(name_1), start);
  26204. }
  26205. return char;
  26206. }
  26207. };
  26208. _HtmlTokenizer.prototype._consumeRawText = function (decodeEntities, firstCharOfEnd, attemptEndRest) {
  26209. var tagCloseStart;
  26210. var textStart = this._getLocation();
  26211. this._beginToken(decodeEntities ? HtmlTokenType.ESCAPABLE_RAW_TEXT : HtmlTokenType.RAW_TEXT, textStart);
  26212. var parts = [];
  26213. while (true) {
  26214. tagCloseStart = this._getLocation();
  26215. if (this._attemptChar(firstCharOfEnd) && attemptEndRest()) {
  26216. break;
  26217. }
  26218. if (this.index > tagCloseStart.offset) {
  26219. parts.push(this.input.substring(tagCloseStart.offset, this.index));
  26220. }
  26221. while (this.peek !== firstCharOfEnd) {
  26222. parts.push(this._readChar(decodeEntities));
  26223. }
  26224. }
  26225. return this._endToken([this._processCarriageReturns(parts.join(''))], tagCloseStart);
  26226. };
  26227. _HtmlTokenizer.prototype._consumeComment = function (start) {
  26228. var _this = this;
  26229. this._beginToken(HtmlTokenType.COMMENT_START, start);
  26230. this._requireChar($MINUS);
  26231. this._endToken([]);
  26232. var textToken = this._consumeRawText(false, $MINUS, function () { return _this._attemptChars('->'); });
  26233. this._beginToken(HtmlTokenType.COMMENT_END, textToken.sourceSpan.end);
  26234. this._endToken([]);
  26235. };
  26236. _HtmlTokenizer.prototype._consumeCdata = function (start) {
  26237. var _this = this;
  26238. this._beginToken(HtmlTokenType.CDATA_START, start);
  26239. this._requireChars('cdata[');
  26240. this._endToken([]);
  26241. var textToken = this._consumeRawText(false, $RBRACKET, function () { return _this._attemptChars(']>'); });
  26242. this._beginToken(HtmlTokenType.CDATA_END, textToken.sourceSpan.end);
  26243. this._endToken([]);
  26244. };
  26245. _HtmlTokenizer.prototype._consumeDocType = function (start) {
  26246. this._beginToken(HtmlTokenType.DOC_TYPE, start);
  26247. this._attemptUntilChar($GT);
  26248. this._advance();
  26249. this._endToken([this.input.substring(start.offset + 2, this.index - 1)]);
  26250. };
  26251. _HtmlTokenizer.prototype._consumePrefixAndName = function () {
  26252. var nameOrPrefixStart = this.index;
  26253. var prefix = null;
  26254. while (this.peek !== $COLON && !isPrefixEnd(this.peek)) {
  26255. this._advance();
  26256. }
  26257. var nameStart;
  26258. if (this.peek === $COLON) {
  26259. this._advance();
  26260. prefix = this.input.substring(nameOrPrefixStart, this.index - 1);
  26261. nameStart = this.index;
  26262. }
  26263. else {
  26264. nameStart = nameOrPrefixStart;
  26265. }
  26266. this._requireUntilFn(isNameEnd, this.index === nameStart ? 1 : 0);
  26267. var name = this.input.substring(nameStart, this.index);
  26268. return [prefix, name];
  26269. };
  26270. _HtmlTokenizer.prototype._consumeTagOpen = function (start) {
  26271. var savedPos = this._savePosition();
  26272. var lowercaseTagName;
  26273. try {
  26274. if (!isAsciiLetter(this.peek)) {
  26275. throw this._createError(unexpectedCharacterErrorMsg(this.peek), this._getLocation());
  26276. }
  26277. var nameStart = this.index;
  26278. this._consumeTagOpenStart(start);
  26279. lowercaseTagName = this.inputLowercase.substring(nameStart, this.index);
  26280. this._attemptUntilFn(isNotWhitespace);
  26281. while (this.peek !== $SLASH && this.peek !== $GT) {
  26282. this._consumeAttributeName();
  26283. this._attemptUntilFn(isNotWhitespace);
  26284. if (this._attemptChar($EQ)) {
  26285. this._attemptUntilFn(isNotWhitespace);
  26286. this._consumeAttributeValue();
  26287. }
  26288. this._attemptUntilFn(isNotWhitespace);
  26289. }
  26290. this._consumeTagOpenEnd();
  26291. }
  26292. catch (e) {
  26293. if (e instanceof ControlFlowError) {
  26294. // When the start tag is invalid, assume we want a "<"
  26295. this._restorePosition(savedPos);
  26296. // Back to back text tokens are merged at the end
  26297. this._beginToken(HtmlTokenType.TEXT, start);
  26298. this._endToken(['<']);
  26299. return;
  26300. }
  26301. throw e;
  26302. }
  26303. var contentTokenType = html_tags_1.getHtmlTagDefinition(lowercaseTagName).contentType;
  26304. if (contentTokenType === html_tags_1.HtmlTagContentType.RAW_TEXT) {
  26305. this._consumeRawTextWithTagClose(lowercaseTagName, false);
  26306. }
  26307. else if (contentTokenType === html_tags_1.HtmlTagContentType.ESCAPABLE_RAW_TEXT) {
  26308. this._consumeRawTextWithTagClose(lowercaseTagName, true);
  26309. }
  26310. };
  26311. _HtmlTokenizer.prototype._consumeRawTextWithTagClose = function (lowercaseTagName, decodeEntities) {
  26312. var _this = this;
  26313. var textToken = this._consumeRawText(decodeEntities, $LT, function () {
  26314. if (!_this._attemptChar($SLASH))
  26315. return false;
  26316. _this._attemptUntilFn(isNotWhitespace);
  26317. if (!_this._attemptChars(lowercaseTagName))
  26318. return false;
  26319. _this._attemptUntilFn(isNotWhitespace);
  26320. if (!_this._attemptChar($GT))
  26321. return false;
  26322. return true;
  26323. });
  26324. this._beginToken(HtmlTokenType.TAG_CLOSE, textToken.sourceSpan.end);
  26325. this._endToken([null, lowercaseTagName]);
  26326. };
  26327. _HtmlTokenizer.prototype._consumeTagOpenStart = function (start) {
  26328. this._beginToken(HtmlTokenType.TAG_OPEN_START, start);
  26329. var parts = this._consumePrefixAndName();
  26330. this._endToken(parts);
  26331. };
  26332. _HtmlTokenizer.prototype._consumeAttributeName = function () {
  26333. this._beginToken(HtmlTokenType.ATTR_NAME);
  26334. var prefixAndName = this._consumePrefixAndName();
  26335. this._endToken(prefixAndName);
  26336. };
  26337. _HtmlTokenizer.prototype._consumeAttributeValue = function () {
  26338. this._beginToken(HtmlTokenType.ATTR_VALUE);
  26339. var value;
  26340. if (this.peek === $SQ || this.peek === $DQ) {
  26341. var quoteChar = this.peek;
  26342. this._advance();
  26343. var parts = [];
  26344. while (this.peek !== quoteChar) {
  26345. parts.push(this._readChar(true));
  26346. }
  26347. value = parts.join('');
  26348. this._advance();
  26349. }
  26350. else {
  26351. var valueStart = this.index;
  26352. this._requireUntilFn(isNameEnd, 1);
  26353. value = this.input.substring(valueStart, this.index);
  26354. }
  26355. this._endToken([this._processCarriageReturns(value)]);
  26356. };
  26357. _HtmlTokenizer.prototype._consumeTagOpenEnd = function () {
  26358. var tokenType = this._attemptChar($SLASH) ? HtmlTokenType.TAG_OPEN_END_VOID : HtmlTokenType.TAG_OPEN_END;
  26359. this._beginToken(tokenType);
  26360. this._requireChar($GT);
  26361. this._endToken([]);
  26362. };
  26363. _HtmlTokenizer.prototype._consumeTagClose = function (start) {
  26364. this._beginToken(HtmlTokenType.TAG_CLOSE, start);
  26365. this._attemptUntilFn(isNotWhitespace);
  26366. var prefixAndName;
  26367. prefixAndName = this._consumePrefixAndName();
  26368. this._attemptUntilFn(isNotWhitespace);
  26369. this._requireChar($GT);
  26370. this._endToken(prefixAndName);
  26371. };
  26372. _HtmlTokenizer.prototype._consumeText = function () {
  26373. var start = this._getLocation();
  26374. this._beginToken(HtmlTokenType.TEXT, start);
  26375. var parts = [this._readChar(true)];
  26376. while (!isTextEnd(this.peek)) {
  26377. parts.push(this._readChar(true));
  26378. }
  26379. this._endToken([this._processCarriageReturns(parts.join(''))]);
  26380. };
  26381. _HtmlTokenizer.prototype._savePosition = function () {
  26382. return [this.peek, this.index, this.column, this.line, this.tokens.length];
  26383. };
  26384. _HtmlTokenizer.prototype._restorePosition = function (position) {
  26385. this.peek = position[0];
  26386. this.index = position[1];
  26387. this.column = position[2];
  26388. this.line = position[3];
  26389. var nbTokens = position[4];
  26390. if (nbTokens < this.tokens.length) {
  26391. // remove any extra tokens
  26392. this.tokens = collection_1.ListWrapper.slice(this.tokens, 0, nbTokens);
  26393. }
  26394. };
  26395. return _HtmlTokenizer;
  26396. })();
  26397. function isNotWhitespace(code) {
  26398. return !isWhitespace(code) || code === $EOF;
  26399. }
  26400. function isWhitespace(code) {
  26401. return (code >= $TAB && code <= $SPACE) || (code === $NBSP);
  26402. }
  26403. function isNameEnd(code) {
  26404. return isWhitespace(code) || code === $GT || code === $SLASH || code === $SQ || code === $DQ ||
  26405. code === $EQ;
  26406. }
  26407. function isPrefixEnd(code) {
  26408. return (code < $a || $z < code) && (code < $A || $Z < code) && (code < $0 || code > $9);
  26409. }
  26410. function isDigitEntityEnd(code) {
  26411. return code == $SEMICOLON || code == $EOF || !isAsciiHexDigit(code);
  26412. }
  26413. function isNamedEntityEnd(code) {
  26414. return code == $SEMICOLON || code == $EOF || !isAsciiLetter(code);
  26415. }
  26416. function isTextEnd(code) {
  26417. return code === $LT || code === $EOF;
  26418. }
  26419. function isAsciiLetter(code) {
  26420. return code >= $a && code <= $z;
  26421. }
  26422. function isAsciiHexDigit(code) {
  26423. return code >= $a && code <= $f || code >= $0 && code <= $9;
  26424. }
  26425. function mergeTextTokens(srcTokens) {
  26426. var dstTokens = [];
  26427. var lastDstToken;
  26428. for (var i = 0; i < srcTokens.length; i++) {
  26429. var token = srcTokens[i];
  26430. if (lang_1.isPresent(lastDstToken) && lastDstToken.type == HtmlTokenType.TEXT &&
  26431. token.type == HtmlTokenType.TEXT) {
  26432. lastDstToken.parts[0] += token.parts[0];
  26433. lastDstToken.sourceSpan.end = token.sourceSpan.end;
  26434. }
  26435. else {
  26436. lastDstToken = token;
  26437. dstTokens.push(lastDstToken);
  26438. }
  26439. }
  26440. return dstTokens;
  26441. }
  26442. /***/ },
  26443. /* 171 */
  26444. /***/ function(module, exports) {
  26445. var ParseLocation = (function () {
  26446. function ParseLocation(file, offset, line, col) {
  26447. this.file = file;
  26448. this.offset = offset;
  26449. this.line = line;
  26450. this.col = col;
  26451. }
  26452. ParseLocation.prototype.toString = function () { return this.file.url + "@" + this.line + ":" + this.col; };
  26453. return ParseLocation;
  26454. })();
  26455. exports.ParseLocation = ParseLocation;
  26456. var ParseSourceFile = (function () {
  26457. function ParseSourceFile(content, url) {
  26458. this.content = content;
  26459. this.url = url;
  26460. }
  26461. return ParseSourceFile;
  26462. })();
  26463. exports.ParseSourceFile = ParseSourceFile;
  26464. var ParseError = (function () {
  26465. function ParseError(location, msg) {
  26466. this.location = location;
  26467. this.msg = msg;
  26468. }
  26469. ParseError.prototype.toString = function () {
  26470. var source = this.location.file.content;
  26471. var ctxStart = this.location.offset;
  26472. if (ctxStart > source.length - 1) {
  26473. ctxStart = source.length - 1;
  26474. }
  26475. var ctxEnd = ctxStart;
  26476. var ctxLen = 0;
  26477. var ctxLines = 0;
  26478. while (ctxLen < 100 && ctxStart > 0) {
  26479. ctxStart--;
  26480. ctxLen++;
  26481. if (source[ctxStart] == "\n") {
  26482. if (++ctxLines == 3) {
  26483. break;
  26484. }
  26485. }
  26486. }
  26487. ctxLen = 0;
  26488. ctxLines = 0;
  26489. while (ctxLen < 100 && ctxEnd < source.length - 1) {
  26490. ctxEnd++;
  26491. ctxLen++;
  26492. if (source[ctxEnd] == "\n") {
  26493. if (++ctxLines == 3) {
  26494. break;
  26495. }
  26496. }
  26497. }
  26498. var context = source.substring(ctxStart, this.location.offset) + '[ERROR ->]' +
  26499. source.substring(this.location.offset, ctxEnd + 1);
  26500. return this.msg + " (\"" + context + "\"): " + this.location;
  26501. };
  26502. return ParseError;
  26503. })();
  26504. exports.ParseError = ParseError;
  26505. var ParseSourceSpan = (function () {
  26506. function ParseSourceSpan(start, end) {
  26507. this.start = start;
  26508. this.end = end;
  26509. }
  26510. ParseSourceSpan.prototype.toString = function () {
  26511. return this.start.file.content.substring(this.start.offset, this.end.offset);
  26512. };
  26513. return ParseSourceSpan;
  26514. })();
  26515. exports.ParseSourceSpan = ParseSourceSpan;
  26516. /***/ },
  26517. /* 172 */
  26518. /***/ function(module, exports, __webpack_require__) {
  26519. var lang_1 = __webpack_require__(5);
  26520. // see http://www.w3.org/TR/html51/syntax.html#named-character-references
  26521. // see https://html.spec.whatwg.org/multipage/entities.json
  26522. // This list is not exhaustive to keep the compiler footprint low.
  26523. // The `&#123;` / `&#x1ab;` syntax should be used when the named character reference does not exist.
  26524. exports.NAMED_ENTITIES = lang_1.CONST_EXPR({
  26525. 'Aacute': '\u00C1',
  26526. 'aacute': '\u00E1',
  26527. 'Acirc': '\u00C2',
  26528. 'acirc': '\u00E2',
  26529. 'acute': '\u00B4',
  26530. 'AElig': '\u00C6',
  26531. 'aelig': '\u00E6',
  26532. 'Agrave': '\u00C0',
  26533. 'agrave': '\u00E0',
  26534. 'alefsym': '\u2135',
  26535. 'Alpha': '\u0391',
  26536. 'alpha': '\u03B1',
  26537. 'amp': '&',
  26538. 'and': '\u2227',
  26539. 'ang': '\u2220',
  26540. 'apos': '\u0027',
  26541. 'Aring': '\u00C5',
  26542. 'aring': '\u00E5',
  26543. 'asymp': '\u2248',
  26544. 'Atilde': '\u00C3',
  26545. 'atilde': '\u00E3',
  26546. 'Auml': '\u00C4',
  26547. 'auml': '\u00E4',
  26548. 'bdquo': '\u201E',
  26549. 'Beta': '\u0392',
  26550. 'beta': '\u03B2',
  26551. 'brvbar': '\u00A6',
  26552. 'bull': '\u2022',
  26553. 'cap': '\u2229',
  26554. 'Ccedil': '\u00C7',
  26555. 'ccedil': '\u00E7',
  26556. 'cedil': '\u00B8',
  26557. 'cent': '\u00A2',
  26558. 'Chi': '\u03A7',
  26559. 'chi': '\u03C7',
  26560. 'circ': '\u02C6',
  26561. 'clubs': '\u2663',
  26562. 'cong': '\u2245',
  26563. 'copy': '\u00A9',
  26564. 'crarr': '\u21B5',
  26565. 'cup': '\u222A',
  26566. 'curren': '\u00A4',
  26567. 'dagger': '\u2020',
  26568. 'Dagger': '\u2021',
  26569. 'darr': '\u2193',
  26570. 'dArr': '\u21D3',
  26571. 'deg': '\u00B0',
  26572. 'Delta': '\u0394',
  26573. 'delta': '\u03B4',
  26574. 'diams': '\u2666',
  26575. 'divide': '\u00F7',
  26576. 'Eacute': '\u00C9',
  26577. 'eacute': '\u00E9',
  26578. 'Ecirc': '\u00CA',
  26579. 'ecirc': '\u00EA',
  26580. 'Egrave': '\u00C8',
  26581. 'egrave': '\u00E8',
  26582. 'empty': '\u2205',
  26583. 'emsp': '\u2003',
  26584. 'ensp': '\u2002',
  26585. 'Epsilon': '\u0395',
  26586. 'epsilon': '\u03B5',
  26587. 'equiv': '\u2261',
  26588. 'Eta': '\u0397',
  26589. 'eta': '\u03B7',
  26590. 'ETH': '\u00D0',
  26591. 'eth': '\u00F0',
  26592. 'Euml': '\u00CB',
  26593. 'euml': '\u00EB',
  26594. 'euro': '\u20AC',
  26595. 'exist': '\u2203',
  26596. 'fnof': '\u0192',
  26597. 'forall': '\u2200',
  26598. 'frac12': '\u00BD',
  26599. 'frac14': '\u00BC',
  26600. 'frac34': '\u00BE',
  26601. 'frasl': '\u2044',
  26602. 'Gamma': '\u0393',
  26603. 'gamma': '\u03B3',
  26604. 'ge': '\u2265',
  26605. 'gt': '>',
  26606. 'harr': '\u2194',
  26607. 'hArr': '\u21D4',
  26608. 'hearts': '\u2665',
  26609. 'hellip': '\u2026',
  26610. 'Iacute': '\u00CD',
  26611. 'iacute': '\u00ED',
  26612. 'Icirc': '\u00CE',
  26613. 'icirc': '\u00EE',
  26614. 'iexcl': '\u00A1',
  26615. 'Igrave': '\u00CC',
  26616. 'igrave': '\u00EC',
  26617. 'image': '\u2111',
  26618. 'infin': '\u221E',
  26619. 'int': '\u222B',
  26620. 'Iota': '\u0399',
  26621. 'iota': '\u03B9',
  26622. 'iquest': '\u00BF',
  26623. 'isin': '\u2208',
  26624. 'Iuml': '\u00CF',
  26625. 'iuml': '\u00EF',
  26626. 'Kappa': '\u039A',
  26627. 'kappa': '\u03BA',
  26628. 'Lambda': '\u039B',
  26629. 'lambda': '\u03BB',
  26630. 'lang': '\u27E8',
  26631. 'laquo': '\u00AB',
  26632. 'larr': '\u2190',
  26633. 'lArr': '\u21D0',
  26634. 'lceil': '\u2308',
  26635. 'ldquo': '\u201C',
  26636. 'le': '\u2264',
  26637. 'lfloor': '\u230A',
  26638. 'lowast': '\u2217',
  26639. 'loz': '\u25CA',
  26640. 'lrm': '\u200E',
  26641. 'lsaquo': '\u2039',
  26642. 'lsquo': '\u2018',
  26643. 'lt': '<',
  26644. 'macr': '\u00AF',
  26645. 'mdash': '\u2014',
  26646. 'micro': '\u00B5',
  26647. 'middot': '\u00B7',
  26648. 'minus': '\u2212',
  26649. 'Mu': '\u039C',
  26650. 'mu': '\u03BC',
  26651. 'nabla': '\u2207',
  26652. 'nbsp': '\u00A0',
  26653. 'ndash': '\u2013',
  26654. 'ne': '\u2260',
  26655. 'ni': '\u220B',
  26656. 'not': '\u00AC',
  26657. 'notin': '\u2209',
  26658. 'nsub': '\u2284',
  26659. 'Ntilde': '\u00D1',
  26660. 'ntilde': '\u00F1',
  26661. 'Nu': '\u039D',
  26662. 'nu': '\u03BD',
  26663. 'Oacute': '\u00D3',
  26664. 'oacute': '\u00F3',
  26665. 'Ocirc': '\u00D4',
  26666. 'ocirc': '\u00F4',
  26667. 'OElig': '\u0152',
  26668. 'oelig': '\u0153',
  26669. 'Ograve': '\u00D2',
  26670. 'ograve': '\u00F2',
  26671. 'oline': '\u203E',
  26672. 'Omega': '\u03A9',
  26673. 'omega': '\u03C9',
  26674. 'Omicron': '\u039F',
  26675. 'omicron': '\u03BF',
  26676. 'oplus': '\u2295',
  26677. 'or': '\u2228',
  26678. 'ordf': '\u00AA',
  26679. 'ordm': '\u00BA',
  26680. 'Oslash': '\u00D8',
  26681. 'oslash': '\u00F8',
  26682. 'Otilde': '\u00D5',
  26683. 'otilde': '\u00F5',
  26684. 'otimes': '\u2297',
  26685. 'Ouml': '\u00D6',
  26686. 'ouml': '\u00F6',
  26687. 'para': '\u00B6',
  26688. 'permil': '\u2030',
  26689. 'perp': '\u22A5',
  26690. 'Phi': '\u03A6',
  26691. 'phi': '\u03C6',
  26692. 'Pi': '\u03A0',
  26693. 'pi': '\u03C0',
  26694. 'piv': '\u03D6',
  26695. 'plusmn': '\u00B1',
  26696. 'pound': '\u00A3',
  26697. 'prime': '\u2032',
  26698. 'Prime': '\u2033',
  26699. 'prod': '\u220F',
  26700. 'prop': '\u221D',
  26701. 'Psi': '\u03A8',
  26702. 'psi': '\u03C8',
  26703. 'quot': '\u0022',
  26704. 'radic': '\u221A',
  26705. 'rang': '\u27E9',
  26706. 'raquo': '\u00BB',
  26707. 'rarr': '\u2192',
  26708. 'rArr': '\u21D2',
  26709. 'rceil': '\u2309',
  26710. 'rdquo': '\u201D',
  26711. 'real': '\u211C',
  26712. 'reg': '\u00AE',
  26713. 'rfloor': '\u230B',
  26714. 'Rho': '\u03A1',
  26715. 'rho': '\u03C1',
  26716. 'rlm': '\u200F',
  26717. 'rsaquo': '\u203A',
  26718. 'rsquo': '\u2019',
  26719. 'sbquo': '\u201A',
  26720. 'Scaron': '\u0160',
  26721. 'scaron': '\u0161',
  26722. 'sdot': '\u22C5',
  26723. 'sect': '\u00A7',
  26724. 'shy': '\u00AD',
  26725. 'Sigma': '\u03A3',
  26726. 'sigma': '\u03C3',
  26727. 'sigmaf': '\u03C2',
  26728. 'sim': '\u223C',
  26729. 'spades': '\u2660',
  26730. 'sub': '\u2282',
  26731. 'sube': '\u2286',
  26732. 'sum': '\u2211',
  26733. 'sup': '\u2283',
  26734. 'sup1': '\u00B9',
  26735. 'sup2': '\u00B2',
  26736. 'sup3': '\u00B3',
  26737. 'supe': '\u2287',
  26738. 'szlig': '\u00DF',
  26739. 'Tau': '\u03A4',
  26740. 'tau': '\u03C4',
  26741. 'there4': '\u2234',
  26742. 'Theta': '\u0398',
  26743. 'theta': '\u03B8',
  26744. 'thetasym': '\u03D1',
  26745. 'thinsp': '\u2009',
  26746. 'THORN': '\u00DE',
  26747. 'thorn': '\u00FE',
  26748. 'tilde': '\u02DC',
  26749. 'times': '\u00D7',
  26750. 'trade': '\u2122',
  26751. 'Uacute': '\u00DA',
  26752. 'uacute': '\u00FA',
  26753. 'uarr': '\u2191',
  26754. 'uArr': '\u21D1',
  26755. 'Ucirc': '\u00DB',
  26756. 'ucirc': '\u00FB',
  26757. 'Ugrave': '\u00D9',
  26758. 'ugrave': '\u00F9',
  26759. 'uml': '\u00A8',
  26760. 'upsih': '\u03D2',
  26761. 'Upsilon': '\u03A5',
  26762. 'upsilon': '\u03C5',
  26763. 'Uuml': '\u00DC',
  26764. 'uuml': '\u00FC',
  26765. 'weierp': '\u2118',
  26766. 'Xi': '\u039E',
  26767. 'xi': '\u03BE',
  26768. 'Yacute': '\u00DD',
  26769. 'yacute': '\u00FD',
  26770. 'yen': '\u00A5',
  26771. 'yuml': '\u00FF',
  26772. 'Yuml': '\u0178',
  26773. 'Zeta': '\u0396',
  26774. 'zeta': '\u03B6',
  26775. 'zwj': '\u200D',
  26776. 'zwnj': '\u200C',
  26777. });
  26778. (function (HtmlTagContentType) {
  26779. HtmlTagContentType[HtmlTagContentType["RAW_TEXT"] = 0] = "RAW_TEXT";
  26780. HtmlTagContentType[HtmlTagContentType["ESCAPABLE_RAW_TEXT"] = 1] = "ESCAPABLE_RAW_TEXT";
  26781. HtmlTagContentType[HtmlTagContentType["PARSABLE_DATA"] = 2] = "PARSABLE_DATA";
  26782. })(exports.HtmlTagContentType || (exports.HtmlTagContentType = {}));
  26783. var HtmlTagContentType = exports.HtmlTagContentType;
  26784. var HtmlTagDefinition = (function () {
  26785. function HtmlTagDefinition(_a) {
  26786. var _this = this;
  26787. 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;
  26788. this.closedByChildren = {};
  26789. this.closedByParent = false;
  26790. if (lang_1.isPresent(closedByChildren) && closedByChildren.length > 0) {
  26791. closedByChildren.forEach(function (tagName) { return _this.closedByChildren[tagName] = true; });
  26792. }
  26793. this.isVoid = lang_1.normalizeBool(isVoid);
  26794. this.closedByParent = lang_1.normalizeBool(closedByParent) || this.isVoid;
  26795. if (lang_1.isPresent(requiredParents) && requiredParents.length > 0) {
  26796. this.requiredParents = {};
  26797. this.parentToAdd = requiredParents[0];
  26798. requiredParents.forEach(function (tagName) { return _this.requiredParents[tagName] = true; });
  26799. }
  26800. this.implicitNamespacePrefix = implicitNamespacePrefix;
  26801. this.contentType = lang_1.isPresent(contentType) ? contentType : HtmlTagContentType.PARSABLE_DATA;
  26802. this.ignoreFirstLf = lang_1.normalizeBool(ignoreFirstLf);
  26803. }
  26804. HtmlTagDefinition.prototype.requireExtraParent = function (currentParent) {
  26805. if (lang_1.isBlank(this.requiredParents)) {
  26806. return false;
  26807. }
  26808. if (lang_1.isBlank(currentParent)) {
  26809. return true;
  26810. }
  26811. var lcParent = currentParent.toLowerCase();
  26812. return this.requiredParents[lcParent] != true && lcParent != 'template';
  26813. };
  26814. HtmlTagDefinition.prototype.isClosedByChild = function (name) {
  26815. return this.isVoid || lang_1.normalizeBool(this.closedByChildren[name.toLowerCase()]);
  26816. };
  26817. return HtmlTagDefinition;
  26818. })();
  26819. exports.HtmlTagDefinition = HtmlTagDefinition;
  26820. // see http://www.w3.org/TR/html51/syntax.html#optional-tags
  26821. // This implementation does not fully conform to the HTML5 spec.
  26822. var TAG_DEFINITIONS = {
  26823. 'area': new HtmlTagDefinition({ isVoid: true }),
  26824. 'embed': new HtmlTagDefinition({ isVoid: true }),
  26825. 'link': new HtmlTagDefinition({ isVoid: true }),
  26826. 'img': new HtmlTagDefinition({ isVoid: true }),
  26827. 'input': new HtmlTagDefinition({ isVoid: true }),
  26828. 'param': new HtmlTagDefinition({ isVoid: true }),
  26829. 'hr': new HtmlTagDefinition({ isVoid: true }),
  26830. 'br': new HtmlTagDefinition({ isVoid: true }),
  26831. 'source': new HtmlTagDefinition({ isVoid: true }),
  26832. 'track': new HtmlTagDefinition({ isVoid: true }),
  26833. 'wbr': new HtmlTagDefinition({ isVoid: true }),
  26834. 'p': new HtmlTagDefinition({
  26835. closedByChildren: [
  26836. 'address',
  26837. 'article',
  26838. 'aside',
  26839. 'blockquote',
  26840. 'div',
  26841. 'dl',
  26842. 'fieldset',
  26843. 'footer',
  26844. 'form',
  26845. 'h1',
  26846. 'h2',
  26847. 'h3',
  26848. 'h4',
  26849. 'h5',
  26850. 'h6',
  26851. 'header',
  26852. 'hgroup',
  26853. 'hr',
  26854. 'main',
  26855. 'nav',
  26856. 'ol',
  26857. 'p',
  26858. 'pre',
  26859. 'section',
  26860. 'table',
  26861. 'ul'
  26862. ],
  26863. closedByParent: true
  26864. }),
  26865. 'thead': new HtmlTagDefinition({ closedByChildren: ['tbody', 'tfoot'] }),
  26866. 'tbody': new HtmlTagDefinition({ closedByChildren: ['tbody', 'tfoot'], closedByParent: true }),
  26867. 'tfoot': new HtmlTagDefinition({ closedByChildren: ['tbody'], closedByParent: true }),
  26868. 'tr': new HtmlTagDefinition({
  26869. closedByChildren: ['tr'],
  26870. requiredParents: ['tbody', 'tfoot', 'thead'],
  26871. closedByParent: true
  26872. }),
  26873. 'td': new HtmlTagDefinition({ closedByChildren: ['td', 'th'], closedByParent: true }),
  26874. 'th': new HtmlTagDefinition({ closedByChildren: ['td', 'th'], closedByParent: true }),
  26875. 'col': new HtmlTagDefinition({ requiredParents: ['colgroup'], isVoid: true }),
  26876. 'svg': new HtmlTagDefinition({ implicitNamespacePrefix: 'svg' }),
  26877. 'math': new HtmlTagDefinition({ implicitNamespacePrefix: 'math' }),
  26878. 'li': new HtmlTagDefinition({ closedByChildren: ['li'], closedByParent: true }),
  26879. 'dt': new HtmlTagDefinition({ closedByChildren: ['dt', 'dd'] }),
  26880. 'dd': new HtmlTagDefinition({ closedByChildren: ['dt', 'dd'], closedByParent: true }),
  26881. 'rb': new HtmlTagDefinition({ closedByChildren: ['rb', 'rt', 'rtc', 'rp'], closedByParent: true }),
  26882. 'rt': new HtmlTagDefinition({ closedByChildren: ['rb', 'rt', 'rtc', 'rp'], closedByParent: true }),
  26883. 'rtc': new HtmlTagDefinition({ closedByChildren: ['rb', 'rtc', 'rp'], closedByParent: true }),
  26884. 'rp': new HtmlTagDefinition({ closedByChildren: ['rb', 'rt', 'rtc', 'rp'], closedByParent: true }),
  26885. 'optgroup': new HtmlTagDefinition({ closedByChildren: ['optgroup'], closedByParent: true }),
  26886. 'option': new HtmlTagDefinition({ closedByChildren: ['option', 'optgroup'], closedByParent: true }),
  26887. 'pre': new HtmlTagDefinition({ ignoreFirstLf: true }),
  26888. 'listing': new HtmlTagDefinition({ ignoreFirstLf: true }),
  26889. 'style': new HtmlTagDefinition({ contentType: HtmlTagContentType.RAW_TEXT }),
  26890. 'script': new HtmlTagDefinition({ contentType: HtmlTagContentType.RAW_TEXT }),
  26891. 'title': new HtmlTagDefinition({ contentType: HtmlTagContentType.ESCAPABLE_RAW_TEXT }),
  26892. 'textarea': new HtmlTagDefinition({ contentType: HtmlTagContentType.ESCAPABLE_RAW_TEXT, ignoreFirstLf: true }),
  26893. };
  26894. var DEFAULT_TAG_DEFINITION = new HtmlTagDefinition();
  26895. function getHtmlTagDefinition(tagName) {
  26896. var result = TAG_DEFINITIONS[tagName.toLowerCase()];
  26897. return lang_1.isPresent(result) ? result : DEFAULT_TAG_DEFINITION;
  26898. }
  26899. exports.getHtmlTagDefinition = getHtmlTagDefinition;
  26900. var NS_PREFIX_RE = /^@([^:]+):(.+)/g;
  26901. function splitNsName(elementName) {
  26902. if (elementName[0] != '@') {
  26903. return [null, elementName];
  26904. }
  26905. var match = lang_1.RegExpWrapper.firstMatch(NS_PREFIX_RE, elementName);
  26906. return [match[1], match[2]];
  26907. }
  26908. exports.splitNsName = splitNsName;
  26909. function getNsPrefix(elementName) {
  26910. return splitNsName(elementName)[0];
  26911. }
  26912. exports.getNsPrefix = getNsPrefix;
  26913. /***/ },
  26914. /* 173 */
  26915. /***/ function(module, exports) {
  26916. var ElementSchemaRegistry = (function () {
  26917. function ElementSchemaRegistry() {
  26918. }
  26919. ElementSchemaRegistry.prototype.hasProperty = function (tagName, propName) { return true; };
  26920. ElementSchemaRegistry.prototype.getMappedPropName = function (propName) { return propName; };
  26921. return ElementSchemaRegistry;
  26922. })();
  26923. exports.ElementSchemaRegistry = ElementSchemaRegistry;
  26924. /***/ },
  26925. /* 174 */
  26926. /***/ function(module, exports, __webpack_require__) {
  26927. var lang_1 = __webpack_require__(5);
  26928. var html_tags_1 = __webpack_require__(172);
  26929. var NG_CONTENT_SELECT_ATTR = 'select';
  26930. var NG_CONTENT_ELEMENT = 'ng-content';
  26931. var LINK_ELEMENT = 'link';
  26932. var LINK_STYLE_REL_ATTR = 'rel';
  26933. var LINK_STYLE_HREF_ATTR = 'href';
  26934. var LINK_STYLE_REL_VALUE = 'stylesheet';
  26935. var STYLE_ELEMENT = 'style';
  26936. var SCRIPT_ELEMENT = 'script';
  26937. var NG_NON_BINDABLE_ATTR = 'ngNonBindable';
  26938. function preparseElement(ast) {
  26939. var selectAttr = null;
  26940. var hrefAttr = null;
  26941. var relAttr = null;
  26942. var nonBindable = false;
  26943. ast.attrs.forEach(function (attr) {
  26944. var lcAttrName = attr.name.toLowerCase();
  26945. if (lcAttrName == NG_CONTENT_SELECT_ATTR) {
  26946. selectAttr = attr.value;
  26947. }
  26948. else if (lcAttrName == LINK_STYLE_HREF_ATTR) {
  26949. hrefAttr = attr.value;
  26950. }
  26951. else if (lcAttrName == LINK_STYLE_REL_ATTR) {
  26952. relAttr = attr.value;
  26953. }
  26954. else if (attr.name == NG_NON_BINDABLE_ATTR) {
  26955. nonBindable = true;
  26956. }
  26957. });
  26958. selectAttr = normalizeNgContentSelect(selectAttr);
  26959. var nodeName = ast.name.toLowerCase();
  26960. var type = PreparsedElementType.OTHER;
  26961. if (html_tags_1.splitNsName(nodeName)[1] == NG_CONTENT_ELEMENT) {
  26962. type = PreparsedElementType.NG_CONTENT;
  26963. }
  26964. else if (nodeName == STYLE_ELEMENT) {
  26965. type = PreparsedElementType.STYLE;
  26966. }
  26967. else if (nodeName == SCRIPT_ELEMENT) {
  26968. type = PreparsedElementType.SCRIPT;
  26969. }
  26970. else if (nodeName == LINK_ELEMENT && relAttr == LINK_STYLE_REL_VALUE) {
  26971. type = PreparsedElementType.STYLESHEET;
  26972. }
  26973. return new PreparsedElement(type, selectAttr, hrefAttr, nonBindable);
  26974. }
  26975. exports.preparseElement = preparseElement;
  26976. (function (PreparsedElementType) {
  26977. PreparsedElementType[PreparsedElementType["NG_CONTENT"] = 0] = "NG_CONTENT";
  26978. PreparsedElementType[PreparsedElementType["STYLE"] = 1] = "STYLE";
  26979. PreparsedElementType[PreparsedElementType["STYLESHEET"] = 2] = "STYLESHEET";
  26980. PreparsedElementType[PreparsedElementType["SCRIPT"] = 3] = "SCRIPT";
  26981. PreparsedElementType[PreparsedElementType["OTHER"] = 4] = "OTHER";
  26982. })(exports.PreparsedElementType || (exports.PreparsedElementType = {}));
  26983. var PreparsedElementType = exports.PreparsedElementType;
  26984. var PreparsedElement = (function () {
  26985. function PreparsedElement(type, selectAttr, hrefAttr, nonBindable) {
  26986. this.type = type;
  26987. this.selectAttr = selectAttr;
  26988. this.hrefAttr = hrefAttr;
  26989. this.nonBindable = nonBindable;
  26990. }
  26991. return PreparsedElement;
  26992. })();
  26993. exports.PreparsedElement = PreparsedElement;
  26994. function normalizeNgContentSelect(selectAttr) {
  26995. if (lang_1.isBlank(selectAttr) || selectAttr.length === 0) {
  26996. return '*';
  26997. }
  26998. return selectAttr;
  26999. }
  27000. /***/ },
  27001. /* 175 */
  27002. /***/ function(module, exports, __webpack_require__) {
  27003. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  27004. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  27005. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  27006. 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;
  27007. return c > 3 && r && Object.defineProperty(target, key, r), r;
  27008. };
  27009. var __metadata = (this && this.__metadata) || function (k, v) {
  27010. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  27011. };
  27012. var directive_metadata_1 = __webpack_require__(153);
  27013. var lang_1 = __webpack_require__(5);
  27014. var exceptions_1 = __webpack_require__(14);
  27015. var async_1 = __webpack_require__(60);
  27016. var xhr_1 = __webpack_require__(149);
  27017. var url_resolver_1 = __webpack_require__(148);
  27018. var style_url_resolver_1 = __webpack_require__(163);
  27019. var di_1 = __webpack_require__(6);
  27020. var view_1 = __webpack_require__(56);
  27021. var html_ast_1 = __webpack_require__(169);
  27022. var html_parser_1 = __webpack_require__(168);
  27023. var template_preparser_1 = __webpack_require__(174);
  27024. var TemplateNormalizer = (function () {
  27025. function TemplateNormalizer(_xhr, _urlResolver, _htmlParser) {
  27026. this._xhr = _xhr;
  27027. this._urlResolver = _urlResolver;
  27028. this._htmlParser = _htmlParser;
  27029. }
  27030. TemplateNormalizer.prototype.normalizeTemplate = function (directiveType, template) {
  27031. var _this = this;
  27032. if (lang_1.isPresent(template.template)) {
  27033. return async_1.PromiseWrapper.resolve(this.normalizeLoadedTemplate(directiveType, template, template.template, directiveType.moduleUrl));
  27034. }
  27035. else if (lang_1.isPresent(template.templateUrl)) {
  27036. var sourceAbsUrl = this._urlResolver.resolve(directiveType.moduleUrl, template.templateUrl);
  27037. return this._xhr.get(sourceAbsUrl)
  27038. .then(function (templateContent) { return _this.normalizeLoadedTemplate(directiveType, template, templateContent, sourceAbsUrl); });
  27039. }
  27040. else {
  27041. throw new exceptions_1.BaseException("No template specified for component " + directiveType.name);
  27042. }
  27043. };
  27044. TemplateNormalizer.prototype.normalizeLoadedTemplate = function (directiveType, templateMeta, template, templateAbsUrl) {
  27045. var _this = this;
  27046. var rootNodesAndErrors = this._htmlParser.parse(template, directiveType.name);
  27047. if (rootNodesAndErrors.errors.length > 0) {
  27048. var errorString = rootNodesAndErrors.errors.join('\n');
  27049. throw new exceptions_1.BaseException("Template parse errors:\n" + errorString);
  27050. }
  27051. var visitor = new TemplatePreparseVisitor();
  27052. html_ast_1.htmlVisitAll(visitor, rootNodesAndErrors.rootNodes);
  27053. var allStyles = templateMeta.styles.concat(visitor.styles);
  27054. var allStyleAbsUrls = visitor.styleUrls.filter(style_url_resolver_1.isStyleUrlResolvable)
  27055. .map(function (url) { return _this._urlResolver.resolve(templateAbsUrl, url); })
  27056. .concat(templateMeta.styleUrls.filter(style_url_resolver_1.isStyleUrlResolvable)
  27057. .map(function (url) { return _this._urlResolver.resolve(directiveType.moduleUrl, url); }));
  27058. var allResolvedStyles = allStyles.map(function (style) {
  27059. var styleWithImports = style_url_resolver_1.extractStyleUrls(_this._urlResolver, templateAbsUrl, style);
  27060. styleWithImports.styleUrls.forEach(function (styleUrl) { return allStyleAbsUrls.push(styleUrl); });
  27061. return styleWithImports.style;
  27062. });
  27063. var encapsulation = templateMeta.encapsulation;
  27064. if (encapsulation === view_1.ViewEncapsulation.Emulated && allResolvedStyles.length === 0 &&
  27065. allStyleAbsUrls.length === 0) {
  27066. encapsulation = view_1.ViewEncapsulation.None;
  27067. }
  27068. return new directive_metadata_1.CompileTemplateMetadata({
  27069. encapsulation: encapsulation,
  27070. template: template,
  27071. templateUrl: templateAbsUrl,
  27072. styles: allResolvedStyles,
  27073. styleUrls: allStyleAbsUrls,
  27074. ngContentSelectors: visitor.ngContentSelectors
  27075. });
  27076. };
  27077. TemplateNormalizer = __decorate([
  27078. di_1.Injectable(),
  27079. __metadata('design:paramtypes', [xhr_1.XHR, url_resolver_1.UrlResolver, html_parser_1.HtmlParser])
  27080. ], TemplateNormalizer);
  27081. return TemplateNormalizer;
  27082. })();
  27083. exports.TemplateNormalizer = TemplateNormalizer;
  27084. var TemplatePreparseVisitor = (function () {
  27085. function TemplatePreparseVisitor() {
  27086. this.ngContentSelectors = [];
  27087. this.styles = [];
  27088. this.styleUrls = [];
  27089. this.ngNonBindableStackCount = 0;
  27090. }
  27091. TemplatePreparseVisitor.prototype.visitElement = function (ast, context) {
  27092. var preparsedElement = template_preparser_1.preparseElement(ast);
  27093. switch (preparsedElement.type) {
  27094. case template_preparser_1.PreparsedElementType.NG_CONTENT:
  27095. if (this.ngNonBindableStackCount === 0) {
  27096. this.ngContentSelectors.push(preparsedElement.selectAttr);
  27097. }
  27098. break;
  27099. case template_preparser_1.PreparsedElementType.STYLE:
  27100. var textContent = '';
  27101. ast.children.forEach(function (child) {
  27102. if (child instanceof html_ast_1.HtmlTextAst) {
  27103. textContent += child.value;
  27104. }
  27105. });
  27106. this.styles.push(textContent);
  27107. break;
  27108. case template_preparser_1.PreparsedElementType.STYLESHEET:
  27109. this.styleUrls.push(preparsedElement.hrefAttr);
  27110. break;
  27111. }
  27112. if (preparsedElement.nonBindable) {
  27113. this.ngNonBindableStackCount++;
  27114. }
  27115. html_ast_1.htmlVisitAll(this, ast.children);
  27116. if (preparsedElement.nonBindable) {
  27117. this.ngNonBindableStackCount--;
  27118. }
  27119. return null;
  27120. };
  27121. TemplatePreparseVisitor.prototype.visitAttr = function (ast, context) { return null; };
  27122. TemplatePreparseVisitor.prototype.visitText = function (ast, context) { return null; };
  27123. return TemplatePreparseVisitor;
  27124. })();
  27125. /***/ },
  27126. /* 176 */
  27127. /***/ function(module, exports, __webpack_require__) {
  27128. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  27129. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  27130. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  27131. 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;
  27132. return c > 3 && r && Object.defineProperty(target, key, r), r;
  27133. };
  27134. var __metadata = (this && this.__metadata) || function (k, v) {
  27135. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  27136. };
  27137. var __param = (this && this.__param) || function (paramIndex, decorator) {
  27138. return function (target, key) { decorator(target, key, paramIndex); }
  27139. };
  27140. var di_1 = __webpack_require__(6);
  27141. var lang_1 = __webpack_require__(5);
  27142. var exceptions_1 = __webpack_require__(14);
  27143. var cpl = __webpack_require__(153);
  27144. var md = __webpack_require__(23);
  27145. var directive_resolver_1 = __webpack_require__(92);
  27146. var view_resolver_1 = __webpack_require__(93);
  27147. var directive_lifecycle_reflector_1 = __webpack_require__(88);
  27148. var interfaces_1 = __webpack_require__(89);
  27149. var reflection_1 = __webpack_require__(16);
  27150. var di_2 = __webpack_require__(6);
  27151. var platform_directives_and_pipes_1 = __webpack_require__(95);
  27152. var util_1 = __webpack_require__(155);
  27153. var url_resolver_1 = __webpack_require__(148);
  27154. var RuntimeMetadataResolver = (function () {
  27155. function RuntimeMetadataResolver(_directiveResolver, _viewResolver, _platformDirectives) {
  27156. this._directiveResolver = _directiveResolver;
  27157. this._viewResolver = _viewResolver;
  27158. this._platformDirectives = _platformDirectives;
  27159. this._cache = new Map();
  27160. }
  27161. RuntimeMetadataResolver.prototype.getMetadata = function (directiveType) {
  27162. var meta = this._cache.get(directiveType);
  27163. if (lang_1.isBlank(meta)) {
  27164. var dirMeta = this._directiveResolver.resolve(directiveType);
  27165. var moduleUrl = null;
  27166. var templateMeta = null;
  27167. var changeDetectionStrategy = null;
  27168. if (dirMeta instanceof md.ComponentMetadata) {
  27169. var cmpMeta = dirMeta;
  27170. moduleUrl = calcModuleUrl(directiveType, cmpMeta);
  27171. var viewMeta = this._viewResolver.resolve(directiveType);
  27172. templateMeta = new cpl.CompileTemplateMetadata({
  27173. encapsulation: viewMeta.encapsulation,
  27174. template: viewMeta.template,
  27175. templateUrl: viewMeta.templateUrl,
  27176. styles: viewMeta.styles,
  27177. styleUrls: viewMeta.styleUrls
  27178. });
  27179. changeDetectionStrategy = cmpMeta.changeDetection;
  27180. }
  27181. meta = cpl.CompileDirectiveMetadata.create({
  27182. selector: dirMeta.selector,
  27183. exportAs: dirMeta.exportAs,
  27184. isComponent: lang_1.isPresent(templateMeta),
  27185. dynamicLoadable: true,
  27186. type: new cpl.CompileTypeMetadata({ name: lang_1.stringify(directiveType), moduleUrl: moduleUrl, runtime: directiveType }),
  27187. template: templateMeta,
  27188. changeDetection: changeDetectionStrategy,
  27189. inputs: dirMeta.inputs,
  27190. outputs: dirMeta.outputs,
  27191. host: dirMeta.host,
  27192. lifecycleHooks: interfaces_1.LIFECYCLE_HOOKS_VALUES.filter(function (hook) { return directive_lifecycle_reflector_1.hasLifecycleHook(hook, directiveType); })
  27193. });
  27194. this._cache.set(directiveType, meta);
  27195. }
  27196. return meta;
  27197. };
  27198. RuntimeMetadataResolver.prototype.getViewDirectivesMetadata = function (component) {
  27199. var _this = this;
  27200. var view = this._viewResolver.resolve(component);
  27201. var directives = flattenDirectives(view, this._platformDirectives);
  27202. for (var i = 0; i < directives.length; i++) {
  27203. if (!isValidDirective(directives[i])) {
  27204. throw new exceptions_1.BaseException("Unexpected directive value '" + lang_1.stringify(directives[i]) + "' on the View of component '" + lang_1.stringify(component) + "'");
  27205. }
  27206. }
  27207. return directives.map(function (type) { return _this.getMetadata(type); });
  27208. };
  27209. RuntimeMetadataResolver = __decorate([
  27210. di_2.Injectable(),
  27211. __param(2, di_2.Optional()),
  27212. __param(2, di_2.Inject(platform_directives_and_pipes_1.PLATFORM_DIRECTIVES)),
  27213. __metadata('design:paramtypes', [directive_resolver_1.DirectiveResolver, view_resolver_1.ViewResolver, Array])
  27214. ], RuntimeMetadataResolver);
  27215. return RuntimeMetadataResolver;
  27216. })();
  27217. exports.RuntimeMetadataResolver = RuntimeMetadataResolver;
  27218. function flattenDirectives(view, platformDirectives) {
  27219. var directives = [];
  27220. if (lang_1.isPresent(platformDirectives)) {
  27221. flattenArray(platformDirectives, directives);
  27222. }
  27223. if (lang_1.isPresent(view.directives)) {
  27224. flattenArray(view.directives, directives);
  27225. }
  27226. return directives;
  27227. }
  27228. function flattenArray(tree, out) {
  27229. for (var i = 0; i < tree.length; i++) {
  27230. var item = di_1.resolveForwardRef(tree[i]);
  27231. if (lang_1.isArray(item)) {
  27232. flattenArray(item, out);
  27233. }
  27234. else {
  27235. out.push(item);
  27236. }
  27237. }
  27238. }
  27239. function isValidDirective(value) {
  27240. return lang_1.isPresent(value) && (value instanceof lang_1.Type);
  27241. }
  27242. function calcModuleUrl(type, cmpMetadata) {
  27243. var moduleId = cmpMetadata.moduleId;
  27244. if (lang_1.isPresent(moduleId)) {
  27245. var scheme = url_resolver_1.getUrlScheme(moduleId);
  27246. return lang_1.isPresent(scheme) && scheme.length > 0 ? moduleId :
  27247. "package:" + moduleId + util_1.MODULE_SUFFIX;
  27248. }
  27249. else {
  27250. return reflection_1.reflector.importUri(type);
  27251. }
  27252. }
  27253. /***/ },
  27254. /* 177 */
  27255. /***/ function(module, exports, __webpack_require__) {
  27256. var __extends = (this && this.__extends) || function (d, b) {
  27257. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  27258. function __() { this.constructor = d; }
  27259. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  27260. };
  27261. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  27262. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  27263. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  27264. 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;
  27265. return c > 3 && r && Object.defineProperty(target, key, r), r;
  27266. };
  27267. var __metadata = (this && this.__metadata) || function (k, v) {
  27268. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  27269. };
  27270. var di_1 = __webpack_require__(6);
  27271. var lang_1 = __webpack_require__(5);
  27272. var collection_1 = __webpack_require__(12);
  27273. var dom_adapter_1 = __webpack_require__(178);
  27274. var html_tags_1 = __webpack_require__(172);
  27275. var element_schema_registry_1 = __webpack_require__(173);
  27276. var NAMESPACE_URIS = lang_1.CONST_EXPR({ 'xlink': 'http://www.w3.org/1999/xlink', 'svg': 'http://www.w3.org/2000/svg' });
  27277. var DomElementSchemaRegistry = (function (_super) {
  27278. __extends(DomElementSchemaRegistry, _super);
  27279. function DomElementSchemaRegistry() {
  27280. _super.apply(this, arguments);
  27281. this._protoElements = new Map();
  27282. }
  27283. DomElementSchemaRegistry.prototype._getProtoElement = function (tagName) {
  27284. var element = this._protoElements.get(tagName);
  27285. if (lang_1.isBlank(element)) {
  27286. var nsAndName = html_tags_1.splitNsName(tagName);
  27287. element = lang_1.isPresent(nsAndName[0]) ?
  27288. dom_adapter_1.DOM.createElementNS(NAMESPACE_URIS[nsAndName[0]], nsAndName[1]) :
  27289. dom_adapter_1.DOM.createElement(nsAndName[1]);
  27290. this._protoElements.set(tagName, element);
  27291. }
  27292. return element;
  27293. };
  27294. DomElementSchemaRegistry.prototype.hasProperty = function (tagName, propName) {
  27295. if (tagName.indexOf('-') !== -1) {
  27296. // can't tell now as we don't know which properties a custom element will get
  27297. // once it is instantiated
  27298. return true;
  27299. }
  27300. else {
  27301. var elm = this._getProtoElement(tagName);
  27302. return dom_adapter_1.DOM.hasProperty(elm, propName);
  27303. }
  27304. };
  27305. DomElementSchemaRegistry.prototype.getMappedPropName = function (propName) {
  27306. var mappedPropName = collection_1.StringMapWrapper.get(dom_adapter_1.DOM.attrToPropMap, propName);
  27307. return lang_1.isPresent(mappedPropName) ? mappedPropName : propName;
  27308. };
  27309. DomElementSchemaRegistry = __decorate([
  27310. di_1.Injectable(),
  27311. __metadata('design:paramtypes', [])
  27312. ], DomElementSchemaRegistry);
  27313. return DomElementSchemaRegistry;
  27314. })(element_schema_registry_1.ElementSchemaRegistry);
  27315. exports.DomElementSchemaRegistry = DomElementSchemaRegistry;
  27316. /***/ },
  27317. /* 178 */
  27318. /***/ function(module, exports, __webpack_require__) {
  27319. var lang_1 = __webpack_require__(5);
  27320. exports.DOM = null;
  27321. function setRootDomAdapter(adapter) {
  27322. if (lang_1.isBlank(exports.DOM)) {
  27323. exports.DOM = adapter;
  27324. }
  27325. }
  27326. exports.setRootDomAdapter = setRootDomAdapter;
  27327. /* tslint:disable:requireParameterType */
  27328. /**
  27329. * Provides DOM operations in an environment-agnostic way.
  27330. */
  27331. var DomAdapter = (function () {
  27332. function DomAdapter() {
  27333. }
  27334. return DomAdapter;
  27335. })();
  27336. exports.DomAdapter = DomAdapter;
  27337. /***/ },
  27338. /* 179 */
  27339. /***/ function(module, exports, __webpack_require__) {
  27340. var angular_entrypoint_1 = __webpack_require__(180);
  27341. exports.AngularEntrypoint = angular_entrypoint_1.AngularEntrypoint;
  27342. var browser_common_1 = __webpack_require__(181);
  27343. exports.BROWSER_PROVIDERS = browser_common_1.BROWSER_PROVIDERS;
  27344. exports.ELEMENT_PROBE_BINDINGS = browser_common_1.ELEMENT_PROBE_BINDINGS;
  27345. exports.ELEMENT_PROBE_PROVIDERS = browser_common_1.ELEMENT_PROBE_PROVIDERS;
  27346. exports.inspectNativeElement = browser_common_1.inspectNativeElement;
  27347. exports.BrowserDomAdapter = browser_common_1.BrowserDomAdapter;
  27348. exports.By = browser_common_1.By;
  27349. exports.Title = browser_common_1.Title;
  27350. exports.DOCUMENT = browser_common_1.DOCUMENT;
  27351. exports.enableDebugTools = browser_common_1.enableDebugTools;
  27352. exports.disableDebugTools = browser_common_1.disableDebugTools;
  27353. var lang_1 = __webpack_require__(5);
  27354. var browser_common_2 = __webpack_require__(181);
  27355. var compiler_1 = __webpack_require__(147);
  27356. var core_1 = __webpack_require__(2);
  27357. var reflection_capabilities_1 = __webpack_require__(18);
  27358. var xhr_impl_1 = __webpack_require__(199);
  27359. var compiler_2 = __webpack_require__(147);
  27360. var di_1 = __webpack_require__(6);
  27361. /**
  27362. * An array of providers that should be passed into `application()` when bootstrapping a component.
  27363. */
  27364. exports.BROWSER_APP_PROVIDERS = lang_1.CONST_EXPR([
  27365. browser_common_2.BROWSER_APP_COMMON_PROVIDERS,
  27366. compiler_1.COMPILER_PROVIDERS,
  27367. new di_1.Provider(compiler_2.XHR, { useClass: xhr_impl_1.XHRImpl }),
  27368. ]);
  27369. /**
  27370. * Bootstrapping for Angular applications.
  27371. *
  27372. * You instantiate an Angular application by explicitly specifying a component to use
  27373. * as the root component for your application via the `bootstrap()` method.
  27374. *
  27375. * ## Simple Example
  27376. *
  27377. * Assuming this `index.html`:
  27378. *
  27379. * ```html
  27380. * <html>
  27381. * <!-- load Angular script tags here. -->
  27382. * <body>
  27383. * <my-app>loading...</my-app>
  27384. * </body>
  27385. * </html>
  27386. * ```
  27387. *
  27388. * An application is bootstrapped inside an existing browser DOM, typically `index.html`.
  27389. * Unlike Angular 1, Angular 2 does not compile/process providers in `index.html`. This is
  27390. * mainly for security reasons, as well as architectural changes in Angular 2. This means
  27391. * that `index.html` can safely be processed using server-side technologies such as
  27392. * providers. Bindings can thus use double-curly `{{ syntax }}` without collision from
  27393. * Angular 2 component double-curly `{{ syntax }}`.
  27394. *
  27395. * We can use this script code:
  27396. *
  27397. * {@example core/ts/bootstrap/bootstrap.ts region='bootstrap'}
  27398. *
  27399. * When the app developer invokes `bootstrap()` with the root component `MyApp` as its
  27400. * argument, Angular performs the following tasks:
  27401. *
  27402. * 1. It uses the component's `selector` property to locate the DOM element which needs
  27403. * to be upgraded into the angular component.
  27404. * 2. It creates a new child injector (from the platform injector). Optionally, you can
  27405. * also override the injector configuration for an app by invoking `bootstrap` with the
  27406. * `componentInjectableBindings` argument.
  27407. * 3. It creates a new `Zone` and connects it to the angular application's change detection
  27408. * domain instance.
  27409. * 4. It creates an emulated or shadow DOM on the selected component's host element and loads the
  27410. * template into it.
  27411. * 5. It instantiates the specified component.
  27412. * 6. Finally, Angular performs change detection to apply the initial data providers for the
  27413. * application.
  27414. *
  27415. *
  27416. * ## Bootstrapping Multiple Applications
  27417. *
  27418. * When working within a browser window, there are many singleton resources: cookies, title,
  27419. * location, and others. Angular services that represent these resources must likewise be
  27420. * shared across all Angular applications that occupy the same browser window. For this
  27421. * reason, Angular creates exactly one global platform object which stores all shared
  27422. * services, and each angular application injector has the platform injector as its parent.
  27423. *
  27424. * Each application has its own private injector as well. When there are multiple
  27425. * applications on a page, Angular treats each application injector's services as private
  27426. * to that application.
  27427. *
  27428. * ## API
  27429. *
  27430. * - `appComponentType`: The root component which should act as the application. This is
  27431. * a reference to a `Type` which is annotated with `@Component(...)`.
  27432. * - `customProviders`: An additional set of providers that can be added to the
  27433. * app injector to override default injection behavior.
  27434. *
  27435. * Returns a `Promise` of {@link ComponentRef}.
  27436. */
  27437. function bootstrap(appComponentType, customProviders) {
  27438. core_1.reflector.reflectionCapabilities = new reflection_capabilities_1.ReflectionCapabilities();
  27439. var appProviders = lang_1.isPresent(customProviders) ? [exports.BROWSER_APP_PROVIDERS, customProviders] : exports.BROWSER_APP_PROVIDERS;
  27440. return core_1.platform(browser_common_2.BROWSER_PROVIDERS).application(appProviders).bootstrap(appComponentType);
  27441. }
  27442. exports.bootstrap = bootstrap;
  27443. /***/ },
  27444. /* 180 */
  27445. /***/ function(module, exports, __webpack_require__) {
  27446. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  27447. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  27448. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  27449. 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;
  27450. return c > 3 && r && Object.defineProperty(target, key, r), r;
  27451. };
  27452. var __metadata = (this && this.__metadata) || function (k, v) {
  27453. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  27454. };
  27455. var lang_1 = __webpack_require__(5);
  27456. /**
  27457. * Marks a function or method as an Angular 2 entrypoint. Only necessary in Dart code.
  27458. *
  27459. * The optional `name` parameter will be reflected in logs when the entry point is processed.
  27460. *
  27461. * See [the wiki][] for detailed documentation.
  27462. * [the wiki]: https://github.com/angular/angular/wiki/Angular-2-Dart-Transformer#entry_points
  27463. *
  27464. * ## Example
  27465. *
  27466. * ```
  27467. * @AngularEntrypoint("name-for-debug")
  27468. * void main() {
  27469. * bootstrap(MyComponent);
  27470. * }
  27471. * ```
  27472. */
  27473. var AngularEntrypoint = (function () {
  27474. function AngularEntrypoint(name) {
  27475. this.name = name;
  27476. }
  27477. AngularEntrypoint = __decorate([
  27478. lang_1.CONST(),
  27479. __metadata('design:paramtypes', [String])
  27480. ], AngularEntrypoint);
  27481. return AngularEntrypoint;
  27482. })();
  27483. exports.AngularEntrypoint = AngularEntrypoint;
  27484. /***/ },
  27485. /* 181 */
  27486. /***/ function(module, exports, __webpack_require__) {
  27487. var lang_1 = __webpack_require__(5);
  27488. var di_1 = __webpack_require__(6);
  27489. var core_1 = __webpack_require__(2);
  27490. var common_1 = __webpack_require__(104);
  27491. var testability_1 = __webpack_require__(68);
  27492. var dom_adapter_1 = __webpack_require__(178);
  27493. var dom_events_1 = __webpack_require__(182);
  27494. var key_events_1 = __webpack_require__(184);
  27495. var hammer_gestures_1 = __webpack_require__(185);
  27496. var dom_tokens_1 = __webpack_require__(187);
  27497. var dom_renderer_1 = __webpack_require__(188);
  27498. var shared_styles_host_1 = __webpack_require__(196);
  27499. var shared_styles_host_2 = __webpack_require__(196);
  27500. var browser_details_1 = __webpack_require__(195);
  27501. var animation_builder_1 = __webpack_require__(189);
  27502. var browser_adapter_1 = __webpack_require__(197);
  27503. var testability_2 = __webpack_require__(200);
  27504. var wtf_init_1 = __webpack_require__(201);
  27505. var event_manager_1 = __webpack_require__(183);
  27506. var dom_tokens_2 = __webpack_require__(187);
  27507. exports.DOCUMENT = dom_tokens_2.DOCUMENT;
  27508. var title_1 = __webpack_require__(202);
  27509. exports.Title = title_1.Title;
  27510. var common_dom_1 = __webpack_require__(203);
  27511. exports.DebugElementViewListener = common_dom_1.DebugElementViewListener;
  27512. exports.ELEMENT_PROBE_PROVIDERS = common_dom_1.ELEMENT_PROBE_PROVIDERS;
  27513. exports.ELEMENT_PROBE_BINDINGS = common_dom_1.ELEMENT_PROBE_BINDINGS;
  27514. exports.inspectNativeElement = common_dom_1.inspectNativeElement;
  27515. exports.By = common_dom_1.By;
  27516. var browser_adapter_2 = __webpack_require__(197);
  27517. exports.BrowserDomAdapter = browser_adapter_2.BrowserDomAdapter;
  27518. var tools_1 = __webpack_require__(206);
  27519. exports.enableDebugTools = tools_1.enableDebugTools;
  27520. exports.disableDebugTools = tools_1.disableDebugTools;
  27521. /**
  27522. * A set of providers to initialize the Angular platform in a web browser.
  27523. *
  27524. * Used automatically by `bootstrap`, or can be passed to {@link platform}.
  27525. */
  27526. exports.BROWSER_PROVIDERS = lang_1.CONST_EXPR([
  27527. core_1.PLATFORM_COMMON_PROVIDERS,
  27528. new di_1.Provider(core_1.PLATFORM_INITIALIZER, { useValue: initDomAdapter, multi: true }),
  27529. ]);
  27530. function _exceptionHandler() {
  27531. // !IS_DART is required because we must rethrow exceptions in JS,
  27532. // but must not rethrow exceptions in Dart
  27533. return new core_1.ExceptionHandler(dom_adapter_1.DOM, !lang_1.IS_DART);
  27534. }
  27535. function _document() {
  27536. return dom_adapter_1.DOM.defaultDoc();
  27537. }
  27538. /**
  27539. * A set of providers to initialize an Angular application in a web browser.
  27540. *
  27541. * Used automatically by `bootstrap`, or can be passed to {@link PlatformRef.application}.
  27542. */
  27543. exports.BROWSER_APP_COMMON_PROVIDERS = lang_1.CONST_EXPR([
  27544. core_1.APPLICATION_COMMON_PROVIDERS,
  27545. common_1.FORM_PROVIDERS,
  27546. new di_1.Provider(core_1.PLATFORM_PIPES, { useValue: common_1.COMMON_PIPES, multi: true }),
  27547. new di_1.Provider(core_1.PLATFORM_DIRECTIVES, { useValue: common_1.COMMON_DIRECTIVES, multi: true }),
  27548. new di_1.Provider(core_1.ExceptionHandler, { useFactory: _exceptionHandler, deps: [] }),
  27549. new di_1.Provider(dom_tokens_1.DOCUMENT, { useFactory: _document, deps: [] }),
  27550. new di_1.Provider(event_manager_1.EVENT_MANAGER_PLUGINS, { useClass: dom_events_1.DomEventsPlugin, multi: true }),
  27551. new di_1.Provider(event_manager_1.EVENT_MANAGER_PLUGINS, { useClass: key_events_1.KeyEventsPlugin, multi: true }),
  27552. new di_1.Provider(event_manager_1.EVENT_MANAGER_PLUGINS, { useClass: hammer_gestures_1.HammerGesturesPlugin, multi: true }),
  27553. new di_1.Provider(dom_renderer_1.DomRenderer, { useClass: dom_renderer_1.DomRenderer_ }),
  27554. new di_1.Provider(core_1.Renderer, { useExisting: dom_renderer_1.DomRenderer }),
  27555. new di_1.Provider(shared_styles_host_2.SharedStylesHost, { useExisting: shared_styles_host_1.DomSharedStylesHost }),
  27556. shared_styles_host_1.DomSharedStylesHost,
  27557. testability_1.Testability,
  27558. browser_details_1.BrowserDetails,
  27559. animation_builder_1.AnimationBuilder,
  27560. event_manager_1.EventManager
  27561. ]);
  27562. function initDomAdapter() {
  27563. browser_adapter_1.BrowserDomAdapter.makeCurrent();
  27564. wtf_init_1.wtfInit();
  27565. testability_2.BrowserGetTestability.init();
  27566. }
  27567. exports.initDomAdapter = initDomAdapter;
  27568. /***/ },
  27569. /* 182 */
  27570. /***/ function(module, exports, __webpack_require__) {
  27571. var __extends = (this && this.__extends) || function (d, b) {
  27572. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  27573. function __() { this.constructor = d; }
  27574. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  27575. };
  27576. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  27577. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  27578. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  27579. 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;
  27580. return c > 3 && r && Object.defineProperty(target, key, r), r;
  27581. };
  27582. var __metadata = (this && this.__metadata) || function (k, v) {
  27583. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  27584. };
  27585. var dom_adapter_1 = __webpack_require__(178);
  27586. var core_1 = __webpack_require__(2);
  27587. var event_manager_1 = __webpack_require__(183);
  27588. var DomEventsPlugin = (function (_super) {
  27589. __extends(DomEventsPlugin, _super);
  27590. function DomEventsPlugin() {
  27591. _super.apply(this, arguments);
  27592. }
  27593. // This plugin should come last in the list of plugins, because it accepts all
  27594. // events.
  27595. DomEventsPlugin.prototype.supports = function (eventName) { return true; };
  27596. DomEventsPlugin.prototype.addEventListener = function (element, eventName, handler) {
  27597. var zone = this.manager.getZone();
  27598. var outsideHandler = function (event) { return zone.run(function () { return handler(event); }); };
  27599. this.manager.getZone().runOutsideAngular(function () { dom_adapter_1.DOM.on(element, eventName, outsideHandler); });
  27600. };
  27601. DomEventsPlugin.prototype.addGlobalEventListener = function (target, eventName, handler) {
  27602. var element = dom_adapter_1.DOM.getGlobalEventTarget(target);
  27603. var zone = this.manager.getZone();
  27604. var outsideHandler = function (event) { return zone.run(function () { return handler(event); }); };
  27605. return this.manager.getZone().runOutsideAngular(function () { return dom_adapter_1.DOM.onAndCancel(element, eventName, outsideHandler); });
  27606. };
  27607. DomEventsPlugin = __decorate([
  27608. core_1.Injectable(),
  27609. __metadata('design:paramtypes', [])
  27610. ], DomEventsPlugin);
  27611. return DomEventsPlugin;
  27612. })(event_manager_1.EventManagerPlugin);
  27613. exports.DomEventsPlugin = DomEventsPlugin;
  27614. /***/ },
  27615. /* 183 */
  27616. /***/ function(module, exports, __webpack_require__) {
  27617. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  27618. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  27619. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  27620. 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;
  27621. return c > 3 && r && Object.defineProperty(target, key, r), r;
  27622. };
  27623. var __metadata = (this && this.__metadata) || function (k, v) {
  27624. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  27625. };
  27626. var __param = (this && this.__param) || function (paramIndex, decorator) {
  27627. return function (target, key) { decorator(target, key, paramIndex); }
  27628. };
  27629. var lang_1 = __webpack_require__(5);
  27630. var exceptions_1 = __webpack_require__(14);
  27631. var di_1 = __webpack_require__(6);
  27632. var ng_zone_1 = __webpack_require__(66);
  27633. var collection_1 = __webpack_require__(12);
  27634. exports.EVENT_MANAGER_PLUGINS = lang_1.CONST_EXPR(new di_1.OpaqueToken("EventManagerPlugins"));
  27635. var EventManager = (function () {
  27636. function EventManager(plugins, _zone) {
  27637. var _this = this;
  27638. this._zone = _zone;
  27639. plugins.forEach(function (p) { return p.manager = _this; });
  27640. this._plugins = collection_1.ListWrapper.reversed(plugins);
  27641. }
  27642. EventManager.prototype.addEventListener = function (element, eventName, handler) {
  27643. var plugin = this._findPluginFor(eventName);
  27644. plugin.addEventListener(element, eventName, handler);
  27645. };
  27646. EventManager.prototype.addGlobalEventListener = function (target, eventName, handler) {
  27647. var plugin = this._findPluginFor(eventName);
  27648. return plugin.addGlobalEventListener(target, eventName, handler);
  27649. };
  27650. EventManager.prototype.getZone = function () { return this._zone; };
  27651. /** @internal */
  27652. EventManager.prototype._findPluginFor = function (eventName) {
  27653. var plugins = this._plugins;
  27654. for (var i = 0; i < plugins.length; i++) {
  27655. var plugin = plugins[i];
  27656. if (plugin.supports(eventName)) {
  27657. return plugin;
  27658. }
  27659. }
  27660. throw new exceptions_1.BaseException("No event manager plugin found for event " + eventName);
  27661. };
  27662. EventManager = __decorate([
  27663. di_1.Injectable(),
  27664. __param(0, di_1.Inject(exports.EVENT_MANAGER_PLUGINS)),
  27665. __metadata('design:paramtypes', [Array, ng_zone_1.NgZone])
  27666. ], EventManager);
  27667. return EventManager;
  27668. })();
  27669. exports.EventManager = EventManager;
  27670. var EventManagerPlugin = (function () {
  27671. function EventManagerPlugin() {
  27672. }
  27673. // That is equivalent to having supporting $event.target
  27674. EventManagerPlugin.prototype.supports = function (eventName) { return false; };
  27675. EventManagerPlugin.prototype.addEventListener = function (element, eventName, handler) {
  27676. throw "not implemented";
  27677. };
  27678. EventManagerPlugin.prototype.addGlobalEventListener = function (element, eventName, handler) {
  27679. throw "not implemented";
  27680. };
  27681. return EventManagerPlugin;
  27682. })();
  27683. exports.EventManagerPlugin = EventManagerPlugin;
  27684. /***/ },
  27685. /* 184 */
  27686. /***/ function(module, exports, __webpack_require__) {
  27687. var __extends = (this && this.__extends) || function (d, b) {
  27688. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  27689. function __() { this.constructor = d; }
  27690. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  27691. };
  27692. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  27693. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  27694. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  27695. 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;
  27696. return c > 3 && r && Object.defineProperty(target, key, r), r;
  27697. };
  27698. var __metadata = (this && this.__metadata) || function (k, v) {
  27699. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  27700. };
  27701. var dom_adapter_1 = __webpack_require__(178);
  27702. var lang_1 = __webpack_require__(5);
  27703. var collection_1 = __webpack_require__(12);
  27704. var event_manager_1 = __webpack_require__(183);
  27705. var di_1 = __webpack_require__(6);
  27706. var modifierKeys = ['alt', 'control', 'meta', 'shift'];
  27707. var modifierKeyGetters = {
  27708. 'alt': function (event) { return event.altKey; },
  27709. 'control': function (event) { return event.ctrlKey; },
  27710. 'meta': function (event) { return event.metaKey; },
  27711. 'shift': function (event) { return event.shiftKey; }
  27712. };
  27713. var KeyEventsPlugin = (function (_super) {
  27714. __extends(KeyEventsPlugin, _super);
  27715. function KeyEventsPlugin() {
  27716. _super.call(this);
  27717. }
  27718. KeyEventsPlugin.prototype.supports = function (eventName) {
  27719. return lang_1.isPresent(KeyEventsPlugin.parseEventName(eventName));
  27720. };
  27721. KeyEventsPlugin.prototype.addEventListener = function (element, eventName, handler) {
  27722. var parsedEvent = KeyEventsPlugin.parseEventName(eventName);
  27723. var outsideHandler = KeyEventsPlugin.eventCallback(element, collection_1.StringMapWrapper.get(parsedEvent, 'fullKey'), handler, this.manager.getZone());
  27724. this.manager.getZone().runOutsideAngular(function () {
  27725. dom_adapter_1.DOM.on(element, collection_1.StringMapWrapper.get(parsedEvent, 'domEventName'), outsideHandler);
  27726. });
  27727. };
  27728. KeyEventsPlugin.parseEventName = function (eventName) {
  27729. var parts = eventName.toLowerCase().split('.');
  27730. var domEventName = parts.shift();
  27731. if ((parts.length === 0) ||
  27732. !(lang_1.StringWrapper.equals(domEventName, 'keydown') ||
  27733. lang_1.StringWrapper.equals(domEventName, 'keyup'))) {
  27734. return null;
  27735. }
  27736. var key = KeyEventsPlugin._normalizeKey(parts.pop());
  27737. var fullKey = '';
  27738. modifierKeys.forEach(function (modifierName) {
  27739. if (collection_1.ListWrapper.contains(parts, modifierName)) {
  27740. collection_1.ListWrapper.remove(parts, modifierName);
  27741. fullKey += modifierName + '.';
  27742. }
  27743. });
  27744. fullKey += key;
  27745. if (parts.length != 0 || key.length === 0) {
  27746. // returning null instead of throwing to let another plugin process the event
  27747. return null;
  27748. }
  27749. var result = collection_1.StringMapWrapper.create();
  27750. collection_1.StringMapWrapper.set(result, 'domEventName', domEventName);
  27751. collection_1.StringMapWrapper.set(result, 'fullKey', fullKey);
  27752. return result;
  27753. };
  27754. KeyEventsPlugin.getEventFullKey = function (event) {
  27755. var fullKey = '';
  27756. var key = dom_adapter_1.DOM.getEventKey(event);
  27757. key = key.toLowerCase();
  27758. if (lang_1.StringWrapper.equals(key, ' ')) {
  27759. key = 'space'; // for readability
  27760. }
  27761. else if (lang_1.StringWrapper.equals(key, '.')) {
  27762. key = 'dot'; // because '.' is used as a separator in event names
  27763. }
  27764. modifierKeys.forEach(function (modifierName) {
  27765. if (modifierName != key) {
  27766. var modifierGetter = collection_1.StringMapWrapper.get(modifierKeyGetters, modifierName);
  27767. if (modifierGetter(event)) {
  27768. fullKey += modifierName + '.';
  27769. }
  27770. }
  27771. });
  27772. fullKey += key;
  27773. return fullKey;
  27774. };
  27775. KeyEventsPlugin.eventCallback = function (element, fullKey, handler, zone) {
  27776. return function (event) {
  27777. if (lang_1.StringWrapper.equals(KeyEventsPlugin.getEventFullKey(event), fullKey)) {
  27778. zone.run(function () { return handler(event); });
  27779. }
  27780. };
  27781. };
  27782. /** @internal */
  27783. KeyEventsPlugin._normalizeKey = function (keyName) {
  27784. // TODO: switch to a StringMap if the mapping grows too much
  27785. switch (keyName) {
  27786. case 'esc':
  27787. return 'escape';
  27788. default:
  27789. return keyName;
  27790. }
  27791. };
  27792. KeyEventsPlugin = __decorate([
  27793. di_1.Injectable(),
  27794. __metadata('design:paramtypes', [])
  27795. ], KeyEventsPlugin);
  27796. return KeyEventsPlugin;
  27797. })(event_manager_1.EventManagerPlugin);
  27798. exports.KeyEventsPlugin = KeyEventsPlugin;
  27799. /***/ },
  27800. /* 185 */
  27801. /***/ function(module, exports, __webpack_require__) {
  27802. var __extends = (this && this.__extends) || function (d, b) {
  27803. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  27804. function __() { this.constructor = d; }
  27805. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  27806. };
  27807. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  27808. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  27809. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  27810. 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;
  27811. return c > 3 && r && Object.defineProperty(target, key, r), r;
  27812. };
  27813. var __metadata = (this && this.__metadata) || function (k, v) {
  27814. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  27815. };
  27816. var hammer_common_1 = __webpack_require__(186);
  27817. var lang_1 = __webpack_require__(5);
  27818. var exceptions_1 = __webpack_require__(14);
  27819. var di_1 = __webpack_require__(6);
  27820. var HammerGesturesPlugin = (function (_super) {
  27821. __extends(HammerGesturesPlugin, _super);
  27822. function HammerGesturesPlugin() {
  27823. _super.apply(this, arguments);
  27824. }
  27825. HammerGesturesPlugin.prototype.supports = function (eventName) {
  27826. if (!_super.prototype.supports.call(this, eventName))
  27827. return false;
  27828. if (!lang_1.isPresent(window['Hammer'])) {
  27829. throw new exceptions_1.BaseException("Hammer.js is not loaded, can not bind " + eventName + " event");
  27830. }
  27831. return true;
  27832. };
  27833. HammerGesturesPlugin.prototype.addEventListener = function (element, eventName, handler) {
  27834. var zone = this.manager.getZone();
  27835. eventName = eventName.toLowerCase();
  27836. zone.runOutsideAngular(function () {
  27837. // Creating the manager bind events, must be done outside of angular
  27838. var mc = new Hammer(element);
  27839. mc.get('pinch').set({ enable: true });
  27840. mc.get('rotate').set({ enable: true });
  27841. mc.on(eventName, function (eventObj) { zone.run(function () { handler(eventObj); }); });
  27842. });
  27843. };
  27844. HammerGesturesPlugin = __decorate([
  27845. di_1.Injectable(),
  27846. __metadata('design:paramtypes', [])
  27847. ], HammerGesturesPlugin);
  27848. return HammerGesturesPlugin;
  27849. })(hammer_common_1.HammerGesturesPluginCommon);
  27850. exports.HammerGesturesPlugin = HammerGesturesPlugin;
  27851. /***/ },
  27852. /* 186 */
  27853. /***/ function(module, exports, __webpack_require__) {
  27854. var __extends = (this && this.__extends) || function (d, b) {
  27855. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  27856. function __() { this.constructor = d; }
  27857. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  27858. };
  27859. var event_manager_1 = __webpack_require__(183);
  27860. var collection_1 = __webpack_require__(12);
  27861. var _eventNames = {
  27862. // pan
  27863. 'pan': true,
  27864. 'panstart': true,
  27865. 'panmove': true,
  27866. 'panend': true,
  27867. 'pancancel': true,
  27868. 'panleft': true,
  27869. 'panright': true,
  27870. 'panup': true,
  27871. 'pandown': true,
  27872. // pinch
  27873. 'pinch': true,
  27874. 'pinchstart': true,
  27875. 'pinchmove': true,
  27876. 'pinchend': true,
  27877. 'pinchcancel': true,
  27878. 'pinchin': true,
  27879. 'pinchout': true,
  27880. // press
  27881. 'press': true,
  27882. 'pressup': true,
  27883. // rotate
  27884. 'rotate': true,
  27885. 'rotatestart': true,
  27886. 'rotatemove': true,
  27887. 'rotateend': true,
  27888. 'rotatecancel': true,
  27889. // swipe
  27890. 'swipe': true,
  27891. 'swipeleft': true,
  27892. 'swiperight': true,
  27893. 'swipeup': true,
  27894. 'swipedown': true,
  27895. // tap
  27896. 'tap': true,
  27897. };
  27898. var HammerGesturesPluginCommon = (function (_super) {
  27899. __extends(HammerGesturesPluginCommon, _super);
  27900. function HammerGesturesPluginCommon() {
  27901. _super.call(this);
  27902. }
  27903. HammerGesturesPluginCommon.prototype.supports = function (eventName) {
  27904. eventName = eventName.toLowerCase();
  27905. return collection_1.StringMapWrapper.contains(_eventNames, eventName);
  27906. };
  27907. return HammerGesturesPluginCommon;
  27908. })(event_manager_1.EventManagerPlugin);
  27909. exports.HammerGesturesPluginCommon = HammerGesturesPluginCommon;
  27910. /***/ },
  27911. /* 187 */
  27912. /***/ function(module, exports, __webpack_require__) {
  27913. var di_1 = __webpack_require__(6);
  27914. var lang_1 = __webpack_require__(5);
  27915. /**
  27916. * A DI Token representing the main rendering context. In a browser this is the DOM Document.
  27917. *
  27918. * Note: Document might not be available in the Application Context when Application and Rendering
  27919. * Contexts are not the same (e.g. when running the application into a Web Worker).
  27920. */
  27921. exports.DOCUMENT = lang_1.CONST_EXPR(new di_1.OpaqueToken('DocumentToken'));
  27922. /***/ },
  27923. /* 188 */
  27924. /***/ function(module, exports, __webpack_require__) {
  27925. var __extends = (this && this.__extends) || function (d, b) {
  27926. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  27927. function __() { this.constructor = d; }
  27928. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  27929. };
  27930. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  27931. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  27932. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  27933. 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;
  27934. return c > 3 && r && Object.defineProperty(target, key, r), r;
  27935. };
  27936. var __metadata = (this && this.__metadata) || function (k, v) {
  27937. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  27938. };
  27939. var __param = (this && this.__param) || function (paramIndex, decorator) {
  27940. return function (target, key) { decorator(target, key, paramIndex); }
  27941. };
  27942. var di_1 = __webpack_require__(6);
  27943. var animation_builder_1 = __webpack_require__(189);
  27944. var lang_1 = __webpack_require__(5);
  27945. var exceptions_1 = __webpack_require__(14);
  27946. var shared_styles_host_1 = __webpack_require__(196);
  27947. var profile_1 = __webpack_require__(45);
  27948. var core_1 = __webpack_require__(2);
  27949. var event_manager_1 = __webpack_require__(183);
  27950. var dom_tokens_1 = __webpack_require__(187);
  27951. var view_factory_1 = __webpack_require__(164);
  27952. var view_1 = __webpack_require__(165);
  27953. var metadata_1 = __webpack_require__(3);
  27954. var dom_adapter_1 = __webpack_require__(178);
  27955. var util_1 = __webpack_require__(194);
  27956. var NAMESPACE_URIS = lang_1.CONST_EXPR({ 'xlink': 'http://www.w3.org/1999/xlink', 'svg': 'http://www.w3.org/2000/svg' });
  27957. var TEMPLATE_COMMENT_TEXT = 'template bindings={}';
  27958. var TEMPLATE_BINDINGS_EXP = /^template bindings=(.*)$/g;
  27959. var DomRenderer = (function (_super) {
  27960. __extends(DomRenderer, _super);
  27961. function DomRenderer() {
  27962. _super.apply(this, arguments);
  27963. }
  27964. DomRenderer.prototype.getNativeElementSync = function (location) {
  27965. return resolveInternalDomView(location.renderView).boundElements[location.boundElementIndex];
  27966. };
  27967. DomRenderer.prototype.getRootNodes = function (fragment) { return resolveInternalDomFragment(fragment); };
  27968. DomRenderer.prototype.attachFragmentAfterFragment = function (previousFragmentRef, fragmentRef) {
  27969. var previousFragmentNodes = resolveInternalDomFragment(previousFragmentRef);
  27970. if (previousFragmentNodes.length > 0) {
  27971. var sibling = previousFragmentNodes[previousFragmentNodes.length - 1];
  27972. var nodes = resolveInternalDomFragment(fragmentRef);
  27973. moveNodesAfterSibling(sibling, nodes);
  27974. this.animateNodesEnter(nodes);
  27975. }
  27976. };
  27977. /**
  27978. * Iterates through all nodes being added to the DOM and animates them if necessary
  27979. * @param nodes
  27980. */
  27981. DomRenderer.prototype.animateNodesEnter = function (nodes) {
  27982. for (var i = 0; i < nodes.length; i++)
  27983. this.animateNodeEnter(nodes[i]);
  27984. };
  27985. DomRenderer.prototype.attachFragmentAfterElement = function (elementRef, fragmentRef) {
  27986. var parentView = resolveInternalDomView(elementRef.renderView);
  27987. var element = parentView.boundElements[elementRef.boundElementIndex];
  27988. var nodes = resolveInternalDomFragment(fragmentRef);
  27989. moveNodesAfterSibling(element, nodes);
  27990. this.animateNodesEnter(nodes);
  27991. };
  27992. DomRenderer.prototype.hydrateView = function (viewRef) { resolveInternalDomView(viewRef).hydrate(); };
  27993. DomRenderer.prototype.dehydrateView = function (viewRef) { resolveInternalDomView(viewRef).dehydrate(); };
  27994. DomRenderer.prototype.createTemplateAnchor = function (attrNameAndValues) {
  27995. return dom_adapter_1.DOM.createComment(TEMPLATE_COMMENT_TEXT);
  27996. };
  27997. DomRenderer.prototype.createText = function (value) { return dom_adapter_1.DOM.createTextNode(lang_1.isPresent(value) ? value : ''); };
  27998. DomRenderer.prototype.appendChild = function (parent, child) { dom_adapter_1.DOM.appendChild(parent, child); };
  27999. DomRenderer.prototype.setElementProperty = function (location, propertyName, propertyValue) {
  28000. var view = resolveInternalDomView(location.renderView);
  28001. dom_adapter_1.DOM.setProperty(view.boundElements[location.boundElementIndex], propertyName, propertyValue);
  28002. };
  28003. DomRenderer.prototype.setElementAttribute = function (location, attributeName, attributeValue) {
  28004. var view = resolveInternalDomView(location.renderView);
  28005. var element = view.boundElements[location.boundElementIndex];
  28006. if (lang_1.isPresent(attributeValue)) {
  28007. dom_adapter_1.DOM.setAttribute(element, attributeName, lang_1.stringify(attributeValue));
  28008. }
  28009. else {
  28010. dom_adapter_1.DOM.removeAttribute(element, attributeName);
  28011. }
  28012. };
  28013. /**
  28014. * Used only in debug mode to serialize property changes to comment nodes,
  28015. * such as <template> placeholders.
  28016. */
  28017. DomRenderer.prototype.setBindingDebugInfo = function (location, propertyName, propertyValue) {
  28018. var view = resolveInternalDomView(location.renderView);
  28019. var element = view.boundElements[location.boundElementIndex];
  28020. var dashCasedPropertyName = util_1.camelCaseToDashCase(propertyName);
  28021. if (dom_adapter_1.DOM.isCommentNode(element)) {
  28022. var existingBindings = lang_1.RegExpWrapper.firstMatch(TEMPLATE_BINDINGS_EXP, lang_1.StringWrapper.replaceAll(dom_adapter_1.DOM.getText(element), /\n/g, ''));
  28023. var parsedBindings = lang_1.Json.parse(existingBindings[1]);
  28024. parsedBindings[dashCasedPropertyName] = propertyValue;
  28025. dom_adapter_1.DOM.setText(element, lang_1.StringWrapper.replace(TEMPLATE_COMMENT_TEXT, '{}', lang_1.Json.stringify(parsedBindings)));
  28026. }
  28027. else {
  28028. this.setElementAttribute(location, propertyName, propertyValue);
  28029. }
  28030. };
  28031. DomRenderer.prototype.setElementClass = function (location, className, isAdd) {
  28032. var view = resolveInternalDomView(location.renderView);
  28033. var element = view.boundElements[location.boundElementIndex];
  28034. if (isAdd) {
  28035. dom_adapter_1.DOM.addClass(element, className);
  28036. }
  28037. else {
  28038. dom_adapter_1.DOM.removeClass(element, className);
  28039. }
  28040. };
  28041. DomRenderer.prototype.setElementStyle = function (location, styleName, styleValue) {
  28042. var view = resolveInternalDomView(location.renderView);
  28043. var element = view.boundElements[location.boundElementIndex];
  28044. if (lang_1.isPresent(styleValue)) {
  28045. dom_adapter_1.DOM.setStyle(element, styleName, lang_1.stringify(styleValue));
  28046. }
  28047. else {
  28048. dom_adapter_1.DOM.removeStyle(element, styleName);
  28049. }
  28050. };
  28051. DomRenderer.prototype.invokeElementMethod = function (location, methodName, args) {
  28052. var view = resolveInternalDomView(location.renderView);
  28053. var element = view.boundElements[location.boundElementIndex];
  28054. dom_adapter_1.DOM.invoke(element, methodName, args);
  28055. };
  28056. DomRenderer.prototype.setText = function (viewRef, textNodeIndex, text) {
  28057. var view = resolveInternalDomView(viewRef);
  28058. dom_adapter_1.DOM.setText(view.boundTextNodes[textNodeIndex], text);
  28059. };
  28060. DomRenderer.prototype.setEventDispatcher = function (viewRef, dispatcher) {
  28061. resolveInternalDomView(viewRef).setEventDispatcher(dispatcher);
  28062. };
  28063. return DomRenderer;
  28064. })(core_1.Renderer);
  28065. exports.DomRenderer = DomRenderer;
  28066. var DomRenderer_ = (function (_super) {
  28067. __extends(DomRenderer_, _super);
  28068. function DomRenderer_(_eventManager, _domSharedStylesHost, _animate, document) {
  28069. _super.call(this);
  28070. this._eventManager = _eventManager;
  28071. this._domSharedStylesHost = _domSharedStylesHost;
  28072. this._animate = _animate;
  28073. this._componentTpls = new Map();
  28074. /** @internal */
  28075. this._createRootHostViewScope = profile_1.wtfCreateScope('DomRenderer#createRootHostView()');
  28076. /** @internal */
  28077. this._createViewScope = profile_1.wtfCreateScope('DomRenderer#createView()');
  28078. /** @internal */
  28079. this._detachFragmentScope = profile_1.wtfCreateScope('DomRenderer#detachFragment()');
  28080. this._document = document;
  28081. }
  28082. DomRenderer_.prototype.registerComponentTemplate = function (template) {
  28083. this._componentTpls.set(template.id, template);
  28084. if (template.encapsulation !== metadata_1.ViewEncapsulation.Native) {
  28085. var encapsulatedStyles = view_factory_1.encapsulateStyles(template);
  28086. this._domSharedStylesHost.addStyles(encapsulatedStyles);
  28087. }
  28088. };
  28089. DomRenderer_.prototype.createProtoView = function (componentTemplateId, cmds) {
  28090. return new view_1.DefaultProtoViewRef(this._componentTpls.get(componentTemplateId), cmds);
  28091. };
  28092. DomRenderer_.prototype.resolveComponentTemplate = function (templateId) {
  28093. return this._componentTpls.get(templateId);
  28094. };
  28095. DomRenderer_.prototype.createRootHostView = function (hostProtoViewRef, fragmentCount, hostElementSelector) {
  28096. var s = this._createRootHostViewScope();
  28097. var element = dom_adapter_1.DOM.querySelector(this._document, hostElementSelector);
  28098. if (lang_1.isBlank(element)) {
  28099. profile_1.wtfLeave(s);
  28100. throw new exceptions_1.BaseException("The selector \"" + hostElementSelector + "\" did not match any elements");
  28101. }
  28102. return profile_1.wtfLeave(s, this._createView(hostProtoViewRef, element));
  28103. };
  28104. DomRenderer_.prototype.createView = function (protoViewRef, fragmentCount) {
  28105. var s = this._createViewScope();
  28106. return profile_1.wtfLeave(s, this._createView(protoViewRef, null));
  28107. };
  28108. DomRenderer_.prototype._createView = function (protoViewRef, inplaceElement) {
  28109. var dpvr = protoViewRef;
  28110. var view = view_factory_1.createRenderView(dpvr.template, dpvr.cmds, inplaceElement, this);
  28111. var sdRoots = view.nativeShadowRoots;
  28112. for (var i = 0; i < sdRoots.length; i++) {
  28113. this._domSharedStylesHost.addHost(sdRoots[i]);
  28114. }
  28115. return new core_1.RenderViewWithFragments(view, view.fragments);
  28116. };
  28117. DomRenderer_.prototype.destroyView = function (viewRef) {
  28118. var view = viewRef;
  28119. var sdRoots = view.nativeShadowRoots;
  28120. for (var i = 0; i < sdRoots.length; i++) {
  28121. this._domSharedStylesHost.removeHost(sdRoots[i]);
  28122. }
  28123. };
  28124. DomRenderer_.prototype.animateNodeEnter = function (node) {
  28125. if (dom_adapter_1.DOM.isElementNode(node) && dom_adapter_1.DOM.hasClass(node, 'ng-animate')) {
  28126. dom_adapter_1.DOM.addClass(node, 'ng-enter');
  28127. this._animate.css()
  28128. .addAnimationClass('ng-enter-active')
  28129. .start(node)
  28130. .onComplete(function () { dom_adapter_1.DOM.removeClass(node, 'ng-enter'); });
  28131. }
  28132. };
  28133. DomRenderer_.prototype.animateNodeLeave = function (node) {
  28134. if (dom_adapter_1.DOM.isElementNode(node) && dom_adapter_1.DOM.hasClass(node, 'ng-animate')) {
  28135. dom_adapter_1.DOM.addClass(node, 'ng-leave');
  28136. this._animate.css()
  28137. .addAnimationClass('ng-leave-active')
  28138. .start(node)
  28139. .onComplete(function () {
  28140. dom_adapter_1.DOM.removeClass(node, 'ng-leave');
  28141. dom_adapter_1.DOM.remove(node);
  28142. });
  28143. }
  28144. else {
  28145. dom_adapter_1.DOM.remove(node);
  28146. }
  28147. };
  28148. DomRenderer_.prototype.detachFragment = function (fragmentRef) {
  28149. var s = this._detachFragmentScope();
  28150. var fragmentNodes = resolveInternalDomFragment(fragmentRef);
  28151. for (var i = 0; i < fragmentNodes.length; i++) {
  28152. this.animateNodeLeave(fragmentNodes[i]);
  28153. }
  28154. profile_1.wtfLeave(s);
  28155. };
  28156. DomRenderer_.prototype.createElement = function (name, attrNameAndValues) {
  28157. var nsAndName = splitNamespace(name);
  28158. var el = lang_1.isPresent(nsAndName[0]) ?
  28159. dom_adapter_1.DOM.createElementNS(NAMESPACE_URIS[nsAndName[0]], nsAndName[1]) :
  28160. dom_adapter_1.DOM.createElement(nsAndName[1]);
  28161. this._setAttributes(el, attrNameAndValues);
  28162. return el;
  28163. };
  28164. DomRenderer_.prototype.mergeElement = function (existing, attrNameAndValues) {
  28165. dom_adapter_1.DOM.clearNodes(existing);
  28166. this._setAttributes(existing, attrNameAndValues);
  28167. };
  28168. DomRenderer_.prototype._setAttributes = function (node, attrNameAndValues) {
  28169. for (var attrIdx = 0; attrIdx < attrNameAndValues.length; attrIdx += 2) {
  28170. var attrNs;
  28171. var attrName = attrNameAndValues[attrIdx];
  28172. var nsAndName = splitNamespace(attrName);
  28173. if (lang_1.isPresent(nsAndName[0])) {
  28174. attrName = nsAndName[0] + ':' + nsAndName[1];
  28175. attrNs = NAMESPACE_URIS[nsAndName[0]];
  28176. }
  28177. var attrValue = attrNameAndValues[attrIdx + 1];
  28178. if (lang_1.isPresent(attrNs)) {
  28179. dom_adapter_1.DOM.setAttributeNS(node, attrNs, attrName, attrValue);
  28180. }
  28181. else {
  28182. dom_adapter_1.DOM.setAttribute(node, nsAndName[1], attrValue);
  28183. }
  28184. }
  28185. };
  28186. DomRenderer_.prototype.createRootContentInsertionPoint = function () {
  28187. return dom_adapter_1.DOM.createComment('root-content-insertion-point');
  28188. };
  28189. DomRenderer_.prototype.createShadowRoot = function (host, templateId) {
  28190. var sr = dom_adapter_1.DOM.createShadowRoot(host);
  28191. var tpl = this._componentTpls.get(templateId);
  28192. for (var i = 0; i < tpl.styles.length; i++) {
  28193. dom_adapter_1.DOM.appendChild(sr, dom_adapter_1.DOM.createStyleElement(tpl.styles[i]));
  28194. }
  28195. return sr;
  28196. };
  28197. DomRenderer_.prototype.on = function (element, eventName, callback) {
  28198. this._eventManager.addEventListener(element, eventName, decoratePreventDefault(callback));
  28199. };
  28200. DomRenderer_.prototype.globalOn = function (target, eventName, callback) {
  28201. return this._eventManager.addGlobalEventListener(target, eventName, decoratePreventDefault(callback));
  28202. };
  28203. DomRenderer_ = __decorate([
  28204. di_1.Injectable(),
  28205. __param(3, di_1.Inject(dom_tokens_1.DOCUMENT)),
  28206. __metadata('design:paramtypes', [event_manager_1.EventManager, shared_styles_host_1.DomSharedStylesHost, animation_builder_1.AnimationBuilder, Object])
  28207. ], DomRenderer_);
  28208. return DomRenderer_;
  28209. })(DomRenderer);
  28210. exports.DomRenderer_ = DomRenderer_;
  28211. function resolveInternalDomView(viewRef) {
  28212. return viewRef;
  28213. }
  28214. function resolveInternalDomFragment(fragmentRef) {
  28215. return fragmentRef.nodes;
  28216. }
  28217. function moveNodesAfterSibling(sibling, nodes) {
  28218. var parent = dom_adapter_1.DOM.parentElement(sibling);
  28219. if (nodes.length > 0 && lang_1.isPresent(parent)) {
  28220. var nextSibling = dom_adapter_1.DOM.nextSibling(sibling);
  28221. if (lang_1.isPresent(nextSibling)) {
  28222. for (var i = 0; i < nodes.length; i++) {
  28223. dom_adapter_1.DOM.insertBefore(nextSibling, nodes[i]);
  28224. }
  28225. }
  28226. else {
  28227. for (var i = 0; i < nodes.length; i++) {
  28228. dom_adapter_1.DOM.appendChild(parent, nodes[i]);
  28229. }
  28230. }
  28231. }
  28232. }
  28233. function decoratePreventDefault(eventHandler) {
  28234. return function (event) {
  28235. var allowDefaultBehavior = eventHandler(event);
  28236. if (!allowDefaultBehavior) {
  28237. // TODO(tbosch): move preventDefault into event plugins...
  28238. dom_adapter_1.DOM.preventDefault(event);
  28239. }
  28240. };
  28241. }
  28242. var NS_PREFIX_RE = /^@([^:]+):(.+)/g;
  28243. function splitNamespace(name) {
  28244. if (name[0] != '@') {
  28245. return [null, name];
  28246. }
  28247. var match = lang_1.RegExpWrapper.firstMatch(NS_PREFIX_RE, name);
  28248. return [match[1], match[2]];
  28249. }
  28250. /***/ },
  28251. /* 189 */
  28252. /***/ function(module, exports, __webpack_require__) {
  28253. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  28254. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  28255. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  28256. 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;
  28257. return c > 3 && r && Object.defineProperty(target, key, r), r;
  28258. };
  28259. var __metadata = (this && this.__metadata) || function (k, v) {
  28260. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  28261. };
  28262. var di_1 = __webpack_require__(6);
  28263. var css_animation_builder_1 = __webpack_require__(190);
  28264. var browser_details_1 = __webpack_require__(195);
  28265. var AnimationBuilder = (function () {
  28266. /**
  28267. * Used for DI
  28268. * @param browserDetails
  28269. */
  28270. function AnimationBuilder(browserDetails) {
  28271. this.browserDetails = browserDetails;
  28272. }
  28273. /**
  28274. * Creates a new CSS Animation
  28275. * @returns {CssAnimationBuilder}
  28276. */
  28277. AnimationBuilder.prototype.css = function () { return new css_animation_builder_1.CssAnimationBuilder(this.browserDetails); };
  28278. AnimationBuilder = __decorate([
  28279. di_1.Injectable(),
  28280. __metadata('design:paramtypes', [browser_details_1.BrowserDetails])
  28281. ], AnimationBuilder);
  28282. return AnimationBuilder;
  28283. })();
  28284. exports.AnimationBuilder = AnimationBuilder;
  28285. /***/ },
  28286. /* 190 */
  28287. /***/ function(module, exports, __webpack_require__) {
  28288. var css_animation_options_1 = __webpack_require__(191);
  28289. var animation_1 = __webpack_require__(192);
  28290. var CssAnimationBuilder = (function () {
  28291. /**
  28292. * Accepts public properties for CssAnimationBuilder
  28293. */
  28294. function CssAnimationBuilder(browserDetails) {
  28295. this.browserDetails = browserDetails;
  28296. /** @type {CssAnimationOptions} */
  28297. this.data = new css_animation_options_1.CssAnimationOptions();
  28298. }
  28299. /**
  28300. * Adds a temporary class that will be removed at the end of the animation
  28301. * @param className
  28302. */
  28303. CssAnimationBuilder.prototype.addAnimationClass = function (className) {
  28304. this.data.animationClasses.push(className);
  28305. return this;
  28306. };
  28307. /**
  28308. * Adds a class that will remain on the element after the animation has finished
  28309. * @param className
  28310. */
  28311. CssAnimationBuilder.prototype.addClass = function (className) {
  28312. this.data.classesToAdd.push(className);
  28313. return this;
  28314. };
  28315. /**
  28316. * Removes a class from the element
  28317. * @param className
  28318. */
  28319. CssAnimationBuilder.prototype.removeClass = function (className) {
  28320. this.data.classesToRemove.push(className);
  28321. return this;
  28322. };
  28323. /**
  28324. * Sets the animation duration (and overrides any defined through CSS)
  28325. * @param duration
  28326. */
  28327. CssAnimationBuilder.prototype.setDuration = function (duration) {
  28328. this.data.duration = duration;
  28329. return this;
  28330. };
  28331. /**
  28332. * Sets the animation delay (and overrides any defined through CSS)
  28333. * @param delay
  28334. */
  28335. CssAnimationBuilder.prototype.setDelay = function (delay) {
  28336. this.data.delay = delay;
  28337. return this;
  28338. };
  28339. /**
  28340. * Sets styles for both the initial state and the destination state
  28341. * @param from
  28342. * @param to
  28343. */
  28344. CssAnimationBuilder.prototype.setStyles = function (from, to) {
  28345. return this.setFromStyles(from).setToStyles(to);
  28346. };
  28347. /**
  28348. * Sets the initial styles for the animation
  28349. * @param from
  28350. */
  28351. CssAnimationBuilder.prototype.setFromStyles = function (from) {
  28352. this.data.fromStyles = from;
  28353. return this;
  28354. };
  28355. /**
  28356. * Sets the destination styles for the animation
  28357. * @param to
  28358. */
  28359. CssAnimationBuilder.prototype.setToStyles = function (to) {
  28360. this.data.toStyles = to;
  28361. return this;
  28362. };
  28363. /**
  28364. * Starts the animation and returns a promise
  28365. * @param element
  28366. */
  28367. CssAnimationBuilder.prototype.start = function (element) {
  28368. return new animation_1.Animation(element, this.data, this.browserDetails);
  28369. };
  28370. return CssAnimationBuilder;
  28371. })();
  28372. exports.CssAnimationBuilder = CssAnimationBuilder;
  28373. /***/ },
  28374. /* 191 */
  28375. /***/ function(module, exports) {
  28376. var CssAnimationOptions = (function () {
  28377. function CssAnimationOptions() {
  28378. /** classes to be added to the element */
  28379. this.classesToAdd = [];
  28380. /** classes to be removed from the element */
  28381. this.classesToRemove = [];
  28382. /** classes to be added for the duration of the animation */
  28383. this.animationClasses = [];
  28384. }
  28385. return CssAnimationOptions;
  28386. })();
  28387. exports.CssAnimationOptions = CssAnimationOptions;
  28388. /***/ },
  28389. /* 192 */
  28390. /***/ function(module, exports, __webpack_require__) {
  28391. var lang_1 = __webpack_require__(5);
  28392. var math_1 = __webpack_require__(193);
  28393. var util_1 = __webpack_require__(194);
  28394. var collection_1 = __webpack_require__(12);
  28395. var dom_adapter_1 = __webpack_require__(178);
  28396. var Animation = (function () {
  28397. /**
  28398. * Stores the start time and starts the animation
  28399. * @param element
  28400. * @param data
  28401. * @param browserDetails
  28402. */
  28403. function Animation(element, data, browserDetails) {
  28404. var _this = this;
  28405. this.element = element;
  28406. this.data = data;
  28407. this.browserDetails = browserDetails;
  28408. /** functions to be called upon completion */
  28409. this.callbacks = [];
  28410. /** functions for removing event listeners */
  28411. this.eventClearFunctions = [];
  28412. /** flag used to track whether or not the animation has finished */
  28413. this.completed = false;
  28414. this._stringPrefix = '';
  28415. this.startTime = lang_1.DateWrapper.toMillis(lang_1.DateWrapper.now());
  28416. this._stringPrefix = dom_adapter_1.DOM.getAnimationPrefix();
  28417. this.setup();
  28418. this.wait(function (timestamp) { return _this.start(); });
  28419. }
  28420. Object.defineProperty(Animation.prototype, "totalTime", {
  28421. /** total amount of time that the animation should take including delay */
  28422. get: function () {
  28423. var delay = this.computedDelay != null ? this.computedDelay : 0;
  28424. var duration = this.computedDuration != null ? this.computedDuration : 0;
  28425. return delay + duration;
  28426. },
  28427. enumerable: true,
  28428. configurable: true
  28429. });
  28430. Animation.prototype.wait = function (callback) {
  28431. // Firefox requires 2 frames for some reason
  28432. this.browserDetails.raf(callback, 2);
  28433. };
  28434. /**
  28435. * Sets up the initial styles before the animation is started
  28436. */
  28437. Animation.prototype.setup = function () {
  28438. if (this.data.fromStyles != null)
  28439. this.applyStyles(this.data.fromStyles);
  28440. if (this.data.duration != null)
  28441. this.applyStyles({ 'transitionDuration': this.data.duration.toString() + 'ms' });
  28442. if (this.data.delay != null)
  28443. this.applyStyles({ 'transitionDelay': this.data.delay.toString() + 'ms' });
  28444. };
  28445. /**
  28446. * After the initial setup has occurred, this method adds the animation styles
  28447. */
  28448. Animation.prototype.start = function () {
  28449. this.addClasses(this.data.classesToAdd);
  28450. this.addClasses(this.data.animationClasses);
  28451. this.removeClasses(this.data.classesToRemove);
  28452. if (this.data.toStyles != null)
  28453. this.applyStyles(this.data.toStyles);
  28454. var computedStyles = dom_adapter_1.DOM.getComputedStyle(this.element);
  28455. this.computedDelay =
  28456. math_1.Math.max(this.parseDurationString(computedStyles.getPropertyValue(this._stringPrefix + 'transition-delay')), this.parseDurationString(this.element.style.getPropertyValue(this._stringPrefix + 'transition-delay')));
  28457. this.computedDuration = math_1.Math.max(this.parseDurationString(computedStyles.getPropertyValue(this._stringPrefix + 'transition-duration')), this.parseDurationString(this.element.style.getPropertyValue(this._stringPrefix + 'transition-duration')));
  28458. this.addEvents();
  28459. };
  28460. /**
  28461. * Applies the provided styles to the element
  28462. * @param styles
  28463. */
  28464. Animation.prototype.applyStyles = function (styles) {
  28465. var _this = this;
  28466. collection_1.StringMapWrapper.forEach(styles, function (value, key) {
  28467. var dashCaseKey = util_1.camelCaseToDashCase(key);
  28468. if (lang_1.isPresent(dom_adapter_1.DOM.getStyle(_this.element, dashCaseKey))) {
  28469. dom_adapter_1.DOM.setStyle(_this.element, dashCaseKey, value.toString());
  28470. }
  28471. else {
  28472. dom_adapter_1.DOM.setStyle(_this.element, _this._stringPrefix + dashCaseKey, value.toString());
  28473. }
  28474. });
  28475. };
  28476. /**
  28477. * Adds the provided classes to the element
  28478. * @param classes
  28479. */
  28480. Animation.prototype.addClasses = function (classes) {
  28481. for (var i = 0, len = classes.length; i < len; i++)
  28482. dom_adapter_1.DOM.addClass(this.element, classes[i]);
  28483. };
  28484. /**
  28485. * Removes the provided classes from the element
  28486. * @param classes
  28487. */
  28488. Animation.prototype.removeClasses = function (classes) {
  28489. for (var i = 0, len = classes.length; i < len; i++)
  28490. dom_adapter_1.DOM.removeClass(this.element, classes[i]);
  28491. };
  28492. /**
  28493. * Adds events to track when animations have finished
  28494. */
  28495. Animation.prototype.addEvents = function () {
  28496. var _this = this;
  28497. if (this.totalTime > 0) {
  28498. this.eventClearFunctions.push(dom_adapter_1.DOM.onAndCancel(this.element, dom_adapter_1.DOM.getTransitionEnd(), function (event) { return _this.handleAnimationEvent(event); }));
  28499. }
  28500. else {
  28501. this.handleAnimationCompleted();
  28502. }
  28503. };
  28504. Animation.prototype.handleAnimationEvent = function (event) {
  28505. var elapsedTime = math_1.Math.round(event.elapsedTime * 1000);
  28506. if (!this.browserDetails.elapsedTimeIncludesDelay)
  28507. elapsedTime += this.computedDelay;
  28508. event.stopPropagation();
  28509. if (elapsedTime >= this.totalTime)
  28510. this.handleAnimationCompleted();
  28511. };
  28512. /**
  28513. * Runs all animation callbacks and removes temporary classes
  28514. */
  28515. Animation.prototype.handleAnimationCompleted = function () {
  28516. this.removeClasses(this.data.animationClasses);
  28517. this.callbacks.forEach(function (callback) { return callback(); });
  28518. this.callbacks = [];
  28519. this.eventClearFunctions.forEach(function (fn) { return fn(); });
  28520. this.eventClearFunctions = [];
  28521. this.completed = true;
  28522. };
  28523. /**
  28524. * Adds animation callbacks to be called upon completion
  28525. * @param callback
  28526. * @returns {Animation}
  28527. */
  28528. Animation.prototype.onComplete = function (callback) {
  28529. if (this.completed) {
  28530. callback();
  28531. }
  28532. else {
  28533. this.callbacks.push(callback);
  28534. }
  28535. return this;
  28536. };
  28537. /**
  28538. * Converts the duration string to the number of milliseconds
  28539. * @param duration
  28540. * @returns {number}
  28541. */
  28542. Animation.prototype.parseDurationString = function (duration) {
  28543. var maxValue = 0;
  28544. // duration must have at least 2 characters to be valid. (number + type)
  28545. if (duration == null || duration.length < 2) {
  28546. return maxValue;
  28547. }
  28548. else if (duration.substring(duration.length - 2) == 'ms') {
  28549. var value = lang_1.NumberWrapper.parseInt(this.stripLetters(duration), 10);
  28550. if (value > maxValue)
  28551. maxValue = value;
  28552. }
  28553. else if (duration.substring(duration.length - 1) == 's') {
  28554. var ms = lang_1.NumberWrapper.parseFloat(this.stripLetters(duration)) * 1000;
  28555. var value = math_1.Math.floor(ms);
  28556. if (value > maxValue)
  28557. maxValue = value;
  28558. }
  28559. return maxValue;
  28560. };
  28561. /**
  28562. * Strips the letters from the duration string
  28563. * @param str
  28564. * @returns {string}
  28565. */
  28566. Animation.prototype.stripLetters = function (str) {
  28567. return lang_1.StringWrapper.replaceAll(str, lang_1.RegExpWrapper.create('[^0-9]+$', ''), '');
  28568. };
  28569. return Animation;
  28570. })();
  28571. exports.Animation = Animation;
  28572. /***/ },
  28573. /* 193 */
  28574. /***/ function(module, exports, __webpack_require__) {
  28575. var lang_1 = __webpack_require__(5);
  28576. exports.Math = lang_1.global.Math;
  28577. exports.NaN = typeof exports.NaN;
  28578. /***/ },
  28579. /* 194 */
  28580. /***/ function(module, exports, __webpack_require__) {
  28581. var lang_1 = __webpack_require__(5);
  28582. var CAMEL_CASE_REGEXP = /([A-Z])/g;
  28583. var DASH_CASE_REGEXP = /-([a-z])/g;
  28584. function camelCaseToDashCase(input) {
  28585. return lang_1.StringWrapper.replaceAllMapped(input, CAMEL_CASE_REGEXP, function (m) { return '-' + m[1].toLowerCase(); });
  28586. }
  28587. exports.camelCaseToDashCase = camelCaseToDashCase;
  28588. function dashCaseToCamelCase(input) {
  28589. return lang_1.StringWrapper.replaceAllMapped(input, DASH_CASE_REGEXP, function (m) { return m[1].toUpperCase(); });
  28590. }
  28591. exports.dashCaseToCamelCase = dashCaseToCamelCase;
  28592. /***/ },
  28593. /* 195 */
  28594. /***/ function(module, exports, __webpack_require__) {
  28595. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  28596. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  28597. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  28598. 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;
  28599. return c > 3 && r && Object.defineProperty(target, key, r), r;
  28600. };
  28601. var __metadata = (this && this.__metadata) || function (k, v) {
  28602. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  28603. };
  28604. var di_1 = __webpack_require__(6);
  28605. var math_1 = __webpack_require__(193);
  28606. var dom_adapter_1 = __webpack_require__(178);
  28607. var BrowserDetails = (function () {
  28608. function BrowserDetails() {
  28609. this.elapsedTimeIncludesDelay = false;
  28610. this.doesElapsedTimeIncludesDelay();
  28611. }
  28612. /**
  28613. * Determines if `event.elapsedTime` includes transition delay in the current browser. At this
  28614. * time, Chrome and Opera seem to be the only browsers that include this.
  28615. */
  28616. BrowserDetails.prototype.doesElapsedTimeIncludesDelay = function () {
  28617. var _this = this;
  28618. var div = dom_adapter_1.DOM.createElement('div');
  28619. dom_adapter_1.DOM.setAttribute(div, 'style', "position: absolute; top: -9999px; left: -9999px; width: 1px;\n height: 1px; transition: all 1ms linear 1ms;");
  28620. // Firefox requires that we wait for 2 frames for some reason
  28621. this.raf(function (timestamp) {
  28622. dom_adapter_1.DOM.on(div, 'transitionend', function (event) {
  28623. var elapsed = math_1.Math.round(event.elapsedTime * 1000);
  28624. _this.elapsedTimeIncludesDelay = elapsed == 2;
  28625. dom_adapter_1.DOM.remove(div);
  28626. });
  28627. dom_adapter_1.DOM.setStyle(div, 'width', '2px');
  28628. }, 2);
  28629. };
  28630. BrowserDetails.prototype.raf = function (callback, frames) {
  28631. if (frames === void 0) { frames = 1; }
  28632. var queue = new RafQueue(callback, frames);
  28633. return function () { return queue.cancel(); };
  28634. };
  28635. BrowserDetails = __decorate([
  28636. di_1.Injectable(),
  28637. __metadata('design:paramtypes', [])
  28638. ], BrowserDetails);
  28639. return BrowserDetails;
  28640. })();
  28641. exports.BrowserDetails = BrowserDetails;
  28642. var RafQueue = (function () {
  28643. function RafQueue(callback, frames) {
  28644. this.callback = callback;
  28645. this.frames = frames;
  28646. this._raf();
  28647. }
  28648. RafQueue.prototype._raf = function () {
  28649. var _this = this;
  28650. this.currentFrameId = dom_adapter_1.DOM.requestAnimationFrame(function (timestamp) { return _this._nextFrame(timestamp); });
  28651. };
  28652. RafQueue.prototype._nextFrame = function (timestamp) {
  28653. this.frames--;
  28654. if (this.frames > 0) {
  28655. this._raf();
  28656. }
  28657. else {
  28658. this.callback(timestamp);
  28659. }
  28660. };
  28661. RafQueue.prototype.cancel = function () {
  28662. dom_adapter_1.DOM.cancelAnimationFrame(this.currentFrameId);
  28663. this.currentFrameId = null;
  28664. };
  28665. return RafQueue;
  28666. })();
  28667. /***/ },
  28668. /* 196 */
  28669. /***/ function(module, exports, __webpack_require__) {
  28670. var __extends = (this && this.__extends) || function (d, b) {
  28671. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  28672. function __() { this.constructor = d; }
  28673. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  28674. };
  28675. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  28676. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  28677. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  28678. 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;
  28679. return c > 3 && r && Object.defineProperty(target, key, r), r;
  28680. };
  28681. var __metadata = (this && this.__metadata) || function (k, v) {
  28682. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  28683. };
  28684. var __param = (this && this.__param) || function (paramIndex, decorator) {
  28685. return function (target, key) { decorator(target, key, paramIndex); }
  28686. };
  28687. var dom_adapter_1 = __webpack_require__(178);
  28688. var di_1 = __webpack_require__(6);
  28689. var collection_1 = __webpack_require__(12);
  28690. var dom_tokens_1 = __webpack_require__(187);
  28691. var SharedStylesHost = (function () {
  28692. function SharedStylesHost() {
  28693. /** @internal */
  28694. this._styles = [];
  28695. /** @internal */
  28696. this._stylesSet = new Set();
  28697. }
  28698. SharedStylesHost.prototype.addStyles = function (styles) {
  28699. var _this = this;
  28700. var additions = [];
  28701. styles.forEach(function (style) {
  28702. if (!collection_1.SetWrapper.has(_this._stylesSet, style)) {
  28703. _this._stylesSet.add(style);
  28704. _this._styles.push(style);
  28705. additions.push(style);
  28706. }
  28707. });
  28708. this.onStylesAdded(additions);
  28709. };
  28710. SharedStylesHost.prototype.onStylesAdded = function (additions) { };
  28711. SharedStylesHost.prototype.getAllStyles = function () { return this._styles; };
  28712. SharedStylesHost = __decorate([
  28713. di_1.Injectable(),
  28714. __metadata('design:paramtypes', [])
  28715. ], SharedStylesHost);
  28716. return SharedStylesHost;
  28717. })();
  28718. exports.SharedStylesHost = SharedStylesHost;
  28719. var DomSharedStylesHost = (function (_super) {
  28720. __extends(DomSharedStylesHost, _super);
  28721. function DomSharedStylesHost(doc) {
  28722. _super.call(this);
  28723. this._hostNodes = new Set();
  28724. this._hostNodes.add(doc.head);
  28725. }
  28726. /** @internal */
  28727. DomSharedStylesHost.prototype._addStylesToHost = function (styles, host) {
  28728. for (var i = 0; i < styles.length; i++) {
  28729. var style = styles[i];
  28730. dom_adapter_1.DOM.appendChild(host, dom_adapter_1.DOM.createStyleElement(style));
  28731. }
  28732. };
  28733. DomSharedStylesHost.prototype.addHost = function (hostNode) {
  28734. this._addStylesToHost(this._styles, hostNode);
  28735. this._hostNodes.add(hostNode);
  28736. };
  28737. DomSharedStylesHost.prototype.removeHost = function (hostNode) { collection_1.SetWrapper.delete(this._hostNodes, hostNode); };
  28738. DomSharedStylesHost.prototype.onStylesAdded = function (additions) {
  28739. var _this = this;
  28740. this._hostNodes.forEach(function (hostNode) { _this._addStylesToHost(additions, hostNode); });
  28741. };
  28742. DomSharedStylesHost = __decorate([
  28743. di_1.Injectable(),
  28744. __param(0, di_1.Inject(dom_tokens_1.DOCUMENT)),
  28745. __metadata('design:paramtypes', [Object])
  28746. ], DomSharedStylesHost);
  28747. return DomSharedStylesHost;
  28748. })(SharedStylesHost);
  28749. exports.DomSharedStylesHost = DomSharedStylesHost;
  28750. /***/ },
  28751. /* 197 */
  28752. /***/ function(module, exports, __webpack_require__) {
  28753. var __extends = (this && this.__extends) || function (d, b) {
  28754. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  28755. function __() { this.constructor = d; }
  28756. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  28757. };
  28758. var collection_1 = __webpack_require__(12);
  28759. var lang_1 = __webpack_require__(5);
  28760. var dom_adapter_1 = __webpack_require__(178);
  28761. var generic_browser_adapter_1 = __webpack_require__(198);
  28762. var _attrToPropMap = {
  28763. 'class': 'className',
  28764. 'innerHtml': 'innerHTML',
  28765. 'readonly': 'readOnly',
  28766. 'tabindex': 'tabIndex'
  28767. };
  28768. var DOM_KEY_LOCATION_NUMPAD = 3;
  28769. // Map to convert some key or keyIdentifier values to what will be returned by getEventKey
  28770. var _keyMap = {
  28771. // The following values are here for cross-browser compatibility and to match the W3C standard
  28772. // cf http://www.w3.org/TR/DOM-Level-3-Events-key/
  28773. '\b': 'Backspace',
  28774. '\t': 'Tab',
  28775. '\x7F': 'Delete',
  28776. '\x1B': 'Escape',
  28777. 'Del': 'Delete',
  28778. 'Esc': 'Escape',
  28779. 'Left': 'ArrowLeft',
  28780. 'Right': 'ArrowRight',
  28781. 'Up': 'ArrowUp',
  28782. 'Down': 'ArrowDown',
  28783. 'Menu': 'ContextMenu',
  28784. 'Scroll': 'ScrollLock',
  28785. 'Win': 'OS'
  28786. };
  28787. // There is a bug in Chrome for numeric keypad keys:
  28788. // https://code.google.com/p/chromium/issues/detail?id=155654
  28789. // 1, 2, 3 ... are reported as A, B, C ...
  28790. var _chromeNumKeyPadMap = {
  28791. 'A': '1',
  28792. 'B': '2',
  28793. 'C': '3',
  28794. 'D': '4',
  28795. 'E': '5',
  28796. 'F': '6',
  28797. 'G': '7',
  28798. 'H': '8',
  28799. 'I': '9',
  28800. 'J': '*',
  28801. 'K': '+',
  28802. 'M': '-',
  28803. 'N': '.',
  28804. 'O': '/',
  28805. '\x60': '0',
  28806. '\x90': 'NumLock'
  28807. };
  28808. /**
  28809. * A `DomAdapter` powered by full browser DOM APIs.
  28810. */
  28811. /* tslint:disable:requireParameterType */
  28812. var BrowserDomAdapter = (function (_super) {
  28813. __extends(BrowserDomAdapter, _super);
  28814. function BrowserDomAdapter() {
  28815. _super.apply(this, arguments);
  28816. }
  28817. BrowserDomAdapter.prototype.parse = function (templateHtml) { throw new Error("parse not implemented"); };
  28818. BrowserDomAdapter.makeCurrent = function () { dom_adapter_1.setRootDomAdapter(new BrowserDomAdapter()); };
  28819. BrowserDomAdapter.prototype.hasProperty = function (element, name) { return name in element; };
  28820. BrowserDomAdapter.prototype.setProperty = function (el, name, value) { el[name] = value; };
  28821. BrowserDomAdapter.prototype.getProperty = function (el, name) { return el[name]; };
  28822. BrowserDomAdapter.prototype.invoke = function (el, methodName, args) {
  28823. el[methodName].apply(el, args);
  28824. };
  28825. // TODO(tbosch): move this into a separate environment class once we have it
  28826. BrowserDomAdapter.prototype.logError = function (error) {
  28827. if (window.console.error) {
  28828. window.console.error(error);
  28829. }
  28830. else {
  28831. window.console.log(error);
  28832. }
  28833. };
  28834. BrowserDomAdapter.prototype.log = function (error) { window.console.log(error); };
  28835. BrowserDomAdapter.prototype.logGroup = function (error) {
  28836. if (window.console.group) {
  28837. window.console.group(error);
  28838. this.logError(error);
  28839. }
  28840. else {
  28841. window.console.log(error);
  28842. }
  28843. };
  28844. BrowserDomAdapter.prototype.logGroupEnd = function () {
  28845. if (window.console.groupEnd) {
  28846. window.console.groupEnd();
  28847. }
  28848. };
  28849. Object.defineProperty(BrowserDomAdapter.prototype, "attrToPropMap", {
  28850. get: function () { return _attrToPropMap; },
  28851. enumerable: true,
  28852. configurable: true
  28853. });
  28854. BrowserDomAdapter.prototype.query = function (selector) { return document.querySelector(selector); };
  28855. BrowserDomAdapter.prototype.querySelector = function (el, selector) { return el.querySelector(selector); };
  28856. BrowserDomAdapter.prototype.querySelectorAll = function (el, selector) { return el.querySelectorAll(selector); };
  28857. BrowserDomAdapter.prototype.on = function (el, evt, listener) { el.addEventListener(evt, listener, false); };
  28858. BrowserDomAdapter.prototype.onAndCancel = function (el, evt, listener) {
  28859. el.addEventListener(evt, listener, false);
  28860. // Needed to follow Dart's subscription semantic, until fix of
  28861. // https://code.google.com/p/dart/issues/detail?id=17406
  28862. return function () { el.removeEventListener(evt, listener, false); };
  28863. };
  28864. BrowserDomAdapter.prototype.dispatchEvent = function (el, evt) { el.dispatchEvent(evt); };
  28865. BrowserDomAdapter.prototype.createMouseEvent = function (eventType) {
  28866. var evt = document.createEvent('MouseEvent');
  28867. evt.initEvent(eventType, true, true);
  28868. return evt;
  28869. };
  28870. BrowserDomAdapter.prototype.createEvent = function (eventType) {
  28871. var evt = document.createEvent('Event');
  28872. evt.initEvent(eventType, true, true);
  28873. return evt;
  28874. };
  28875. BrowserDomAdapter.prototype.preventDefault = function (evt) {
  28876. evt.preventDefault();
  28877. evt.returnValue = false;
  28878. };
  28879. BrowserDomAdapter.prototype.isPrevented = function (evt) {
  28880. return evt.defaultPrevented || lang_1.isPresent(evt.returnValue) && !evt.returnValue;
  28881. };
  28882. BrowserDomAdapter.prototype.getInnerHTML = function (el) { return el.innerHTML; };
  28883. BrowserDomAdapter.prototype.getOuterHTML = function (el) { return el.outerHTML; };
  28884. BrowserDomAdapter.prototype.nodeName = function (node) { return node.nodeName; };
  28885. BrowserDomAdapter.prototype.nodeValue = function (node) { return node.nodeValue; };
  28886. BrowserDomAdapter.prototype.type = function (node) { return node.type; };
  28887. BrowserDomAdapter.prototype.content = function (node) {
  28888. if (this.hasProperty(node, "content")) {
  28889. return node.content;
  28890. }
  28891. else {
  28892. return node;
  28893. }
  28894. };
  28895. BrowserDomAdapter.prototype.firstChild = function (el) { return el.firstChild; };
  28896. BrowserDomAdapter.prototype.nextSibling = function (el) { return el.nextSibling; };
  28897. BrowserDomAdapter.prototype.parentElement = function (el) { return el.parentNode; };
  28898. BrowserDomAdapter.prototype.childNodes = function (el) { return el.childNodes; };
  28899. BrowserDomAdapter.prototype.childNodesAsList = function (el) {
  28900. var childNodes = el.childNodes;
  28901. var res = collection_1.ListWrapper.createFixedSize(childNodes.length);
  28902. for (var i = 0; i < childNodes.length; i++) {
  28903. res[i] = childNodes[i];
  28904. }
  28905. return res;
  28906. };
  28907. BrowserDomAdapter.prototype.clearNodes = function (el) {
  28908. while (el.firstChild) {
  28909. el.removeChild(el.firstChild);
  28910. }
  28911. };
  28912. BrowserDomAdapter.prototype.appendChild = function (el, node) { el.appendChild(node); };
  28913. BrowserDomAdapter.prototype.removeChild = function (el, node) { el.removeChild(node); };
  28914. BrowserDomAdapter.prototype.replaceChild = function (el, newChild, oldChild) { el.replaceChild(newChild, oldChild); };
  28915. BrowserDomAdapter.prototype.remove = function (node) {
  28916. if (node.parentNode) {
  28917. node.parentNode.removeChild(node);
  28918. }
  28919. return node;
  28920. };
  28921. BrowserDomAdapter.prototype.insertBefore = function (el, node) { el.parentNode.insertBefore(node, el); };
  28922. BrowserDomAdapter.prototype.insertAllBefore = function (el, nodes) { nodes.forEach(function (n) { return el.parentNode.insertBefore(n, el); }); };
  28923. BrowserDomAdapter.prototype.insertAfter = function (el, node) { el.parentNode.insertBefore(node, el.nextSibling); };
  28924. BrowserDomAdapter.prototype.setInnerHTML = function (el, value) { el.innerHTML = value; };
  28925. BrowserDomAdapter.prototype.getText = function (el) { return el.textContent; };
  28926. // TODO(vicb): removed Element type because it does not support StyleElement
  28927. BrowserDomAdapter.prototype.setText = function (el, value) { el.textContent = value; };
  28928. BrowserDomAdapter.prototype.getValue = function (el) { return el.value; };
  28929. BrowserDomAdapter.prototype.setValue = function (el, value) { el.value = value; };
  28930. BrowserDomAdapter.prototype.getChecked = function (el) { return el.checked; };
  28931. BrowserDomAdapter.prototype.setChecked = function (el, value) { el.checked = value; };
  28932. BrowserDomAdapter.prototype.createComment = function (text) { return document.createComment(text); };
  28933. BrowserDomAdapter.prototype.createTemplate = function (html) {
  28934. var t = document.createElement('template');
  28935. t.innerHTML = html;
  28936. return t;
  28937. };
  28938. BrowserDomAdapter.prototype.createElement = function (tagName, doc) {
  28939. if (doc === void 0) { doc = document; }
  28940. return doc.createElement(tagName);
  28941. };
  28942. BrowserDomAdapter.prototype.createElementNS = function (ns, tagName, doc) {
  28943. if (doc === void 0) { doc = document; }
  28944. return doc.createElementNS(ns, tagName);
  28945. };
  28946. BrowserDomAdapter.prototype.createTextNode = function (text, doc) {
  28947. if (doc === void 0) { doc = document; }
  28948. return doc.createTextNode(text);
  28949. };
  28950. BrowserDomAdapter.prototype.createScriptTag = function (attrName, attrValue, doc) {
  28951. if (doc === void 0) { doc = document; }
  28952. var el = doc.createElement('SCRIPT');
  28953. el.setAttribute(attrName, attrValue);
  28954. return el;
  28955. };
  28956. BrowserDomAdapter.prototype.createStyleElement = function (css, doc) {
  28957. if (doc === void 0) { doc = document; }
  28958. var style = doc.createElement('style');
  28959. this.appendChild(style, this.createTextNode(css));
  28960. return style;
  28961. };
  28962. BrowserDomAdapter.prototype.createShadowRoot = function (el) { return el.createShadowRoot(); };
  28963. BrowserDomAdapter.prototype.getShadowRoot = function (el) { return el.shadowRoot; };
  28964. BrowserDomAdapter.prototype.getHost = function (el) { return el.host; };
  28965. BrowserDomAdapter.prototype.clone = function (node) { return node.cloneNode(true); };
  28966. BrowserDomAdapter.prototype.getElementsByClassName = function (element, name) {
  28967. return element.getElementsByClassName(name);
  28968. };
  28969. BrowserDomAdapter.prototype.getElementsByTagName = function (element, name) {
  28970. return element.getElementsByTagName(name);
  28971. };
  28972. BrowserDomAdapter.prototype.classList = function (element) { return Array.prototype.slice.call(element.classList, 0); };
  28973. BrowserDomAdapter.prototype.addClass = function (element, className) { element.classList.add(className); };
  28974. BrowserDomAdapter.prototype.removeClass = function (element, className) { element.classList.remove(className); };
  28975. BrowserDomAdapter.prototype.hasClass = function (element, className) { return element.classList.contains(className); };
  28976. BrowserDomAdapter.prototype.setStyle = function (element, styleName, styleValue) {
  28977. element.style[styleName] = styleValue;
  28978. };
  28979. BrowserDomAdapter.prototype.removeStyle = function (element, stylename) { element.style[stylename] = null; };
  28980. BrowserDomAdapter.prototype.getStyle = function (element, stylename) { return element.style[stylename]; };
  28981. BrowserDomAdapter.prototype.hasStyle = function (element, styleName, styleValue) {
  28982. if (styleValue === void 0) { styleValue = null; }
  28983. var value = this.getStyle(element, styleName) || '';
  28984. return styleValue ? value == styleValue : value.length > 0;
  28985. };
  28986. BrowserDomAdapter.prototype.tagName = function (element) { return element.tagName; };
  28987. BrowserDomAdapter.prototype.attributeMap = function (element) {
  28988. var res = new Map();
  28989. var elAttrs = element.attributes;
  28990. for (var i = 0; i < elAttrs.length; i++) {
  28991. var attrib = elAttrs[i];
  28992. res.set(attrib.name, attrib.value);
  28993. }
  28994. return res;
  28995. };
  28996. BrowserDomAdapter.prototype.hasAttribute = function (element, attribute) { return element.hasAttribute(attribute); };
  28997. BrowserDomAdapter.prototype.getAttribute = function (element, attribute) { return element.getAttribute(attribute); };
  28998. BrowserDomAdapter.prototype.setAttribute = function (element, name, value) { element.setAttribute(name, value); };
  28999. BrowserDomAdapter.prototype.setAttributeNS = function (element, ns, name, value) {
  29000. element.setAttributeNS(ns, name, value);
  29001. };
  29002. BrowserDomAdapter.prototype.removeAttribute = function (element, attribute) { element.removeAttribute(attribute); };
  29003. BrowserDomAdapter.prototype.templateAwareRoot = function (el) { return this.isTemplateElement(el) ? this.content(el) : el; };
  29004. BrowserDomAdapter.prototype.createHtmlDocument = function () {
  29005. return document.implementation.createHTMLDocument('fakeTitle');
  29006. };
  29007. BrowserDomAdapter.prototype.defaultDoc = function () { return document; };
  29008. BrowserDomAdapter.prototype.getBoundingClientRect = function (el) {
  29009. try {
  29010. return el.getBoundingClientRect();
  29011. }
  29012. catch (e) {
  29013. return { top: 0, bottom: 0, left: 0, right: 0, width: 0, height: 0 };
  29014. }
  29015. };
  29016. BrowserDomAdapter.prototype.getTitle = function () { return document.title; };
  29017. BrowserDomAdapter.prototype.setTitle = function (newTitle) { document.title = newTitle || ''; };
  29018. BrowserDomAdapter.prototype.elementMatches = function (n, selector) {
  29019. var matches = false;
  29020. if (n instanceof HTMLElement) {
  29021. if (n.matches) {
  29022. matches = n.matches(selector);
  29023. }
  29024. else if (n.msMatchesSelector) {
  29025. matches = n.msMatchesSelector(selector);
  29026. }
  29027. else if (n.webkitMatchesSelector) {
  29028. matches = n.webkitMatchesSelector(selector);
  29029. }
  29030. }
  29031. return matches;
  29032. };
  29033. BrowserDomAdapter.prototype.isTemplateElement = function (el) {
  29034. return el instanceof HTMLElement && el.nodeName == "TEMPLATE";
  29035. };
  29036. BrowserDomAdapter.prototype.isTextNode = function (node) { return node.nodeType === Node.TEXT_NODE; };
  29037. BrowserDomAdapter.prototype.isCommentNode = function (node) { return node.nodeType === Node.COMMENT_NODE; };
  29038. BrowserDomAdapter.prototype.isElementNode = function (node) { return node.nodeType === Node.ELEMENT_NODE; };
  29039. BrowserDomAdapter.prototype.hasShadowRoot = function (node) { return node instanceof HTMLElement && lang_1.isPresent(node.shadowRoot); };
  29040. BrowserDomAdapter.prototype.isShadowRoot = function (node) { return node instanceof DocumentFragment; };
  29041. BrowserDomAdapter.prototype.importIntoDoc = function (node) {
  29042. var toImport = node;
  29043. if (this.isTemplateElement(node)) {
  29044. toImport = this.content(node);
  29045. }
  29046. return document.importNode(toImport, true);
  29047. };
  29048. BrowserDomAdapter.prototype.adoptNode = function (node) { return document.adoptNode(node); };
  29049. BrowserDomAdapter.prototype.getHref = function (el) { return el.href; };
  29050. BrowserDomAdapter.prototype.getEventKey = function (event) {
  29051. var key = event.key;
  29052. if (lang_1.isBlank(key)) {
  29053. key = event.keyIdentifier;
  29054. // keyIdentifier is defined in the old draft of DOM Level 3 Events implemented by Chrome and
  29055. // Safari
  29056. // cf
  29057. // http://www.w3.org/TR/2007/WD-DOM-Level-3-Events-20071221/events.html#Events-KeyboardEvents-Interfaces
  29058. if (lang_1.isBlank(key)) {
  29059. return 'Unidentified';
  29060. }
  29061. if (key.startsWith('U+')) {
  29062. key = String.fromCharCode(parseInt(key.substring(2), 16));
  29063. if (event.location === DOM_KEY_LOCATION_NUMPAD && _chromeNumKeyPadMap.hasOwnProperty(key)) {
  29064. // There is a bug in Chrome for numeric keypad keys:
  29065. // https://code.google.com/p/chromium/issues/detail?id=155654
  29066. // 1, 2, 3 ... are reported as A, B, C ...
  29067. key = _chromeNumKeyPadMap[key];
  29068. }
  29069. }
  29070. }
  29071. if (_keyMap.hasOwnProperty(key)) {
  29072. key = _keyMap[key];
  29073. }
  29074. return key;
  29075. };
  29076. BrowserDomAdapter.prototype.getGlobalEventTarget = function (target) {
  29077. if (target == "window") {
  29078. return window;
  29079. }
  29080. else if (target == "document") {
  29081. return document;
  29082. }
  29083. else if (target == "body") {
  29084. return document.body;
  29085. }
  29086. };
  29087. BrowserDomAdapter.prototype.getHistory = function () { return window.history; };
  29088. BrowserDomAdapter.prototype.getLocation = function () { return window.location; };
  29089. BrowserDomAdapter.prototype.getBaseHref = function () {
  29090. var href = getBaseElementHref();
  29091. if (lang_1.isBlank(href)) {
  29092. return null;
  29093. }
  29094. return relativePath(href);
  29095. };
  29096. BrowserDomAdapter.prototype.resetBaseElement = function () { baseElement = null; };
  29097. BrowserDomAdapter.prototype.getUserAgent = function () { return window.navigator.userAgent; };
  29098. BrowserDomAdapter.prototype.setData = function (element, name, value) {
  29099. this.setAttribute(element, 'data-' + name, value);
  29100. };
  29101. BrowserDomAdapter.prototype.getData = function (element, name) { return this.getAttribute(element, 'data-' + name); };
  29102. BrowserDomAdapter.prototype.getComputedStyle = function (element) { return getComputedStyle(element); };
  29103. // TODO(tbosch): move this into a separate environment class once we have it
  29104. BrowserDomAdapter.prototype.setGlobalVar = function (path, value) { lang_1.setValueOnPath(lang_1.global, path, value); };
  29105. BrowserDomAdapter.prototype.requestAnimationFrame = function (callback) { return window.requestAnimationFrame(callback); };
  29106. BrowserDomAdapter.prototype.cancelAnimationFrame = function (id) { window.cancelAnimationFrame(id); };
  29107. BrowserDomAdapter.prototype.performanceNow = function () {
  29108. // performance.now() is not available in all browsers, see
  29109. // http://caniuse.com/#search=performance.now
  29110. if (lang_1.isPresent(window.performance) && lang_1.isPresent(window.performance.now)) {
  29111. return window.performance.now();
  29112. }
  29113. else {
  29114. return lang_1.DateWrapper.toMillis(lang_1.DateWrapper.now());
  29115. }
  29116. };
  29117. return BrowserDomAdapter;
  29118. })(generic_browser_adapter_1.GenericBrowserDomAdapter);
  29119. exports.BrowserDomAdapter = BrowserDomAdapter;
  29120. var baseElement = null;
  29121. function getBaseElementHref() {
  29122. if (lang_1.isBlank(baseElement)) {
  29123. baseElement = document.querySelector('base');
  29124. if (lang_1.isBlank(baseElement)) {
  29125. return null;
  29126. }
  29127. }
  29128. return baseElement.getAttribute('href');
  29129. }
  29130. // based on urlUtils.js in AngularJS 1
  29131. var urlParsingNode = null;
  29132. function relativePath(url) {
  29133. if (lang_1.isBlank(urlParsingNode)) {
  29134. urlParsingNode = document.createElement("a");
  29135. }
  29136. urlParsingNode.setAttribute('href', url);
  29137. return (urlParsingNode.pathname.charAt(0) === '/') ? urlParsingNode.pathname :
  29138. '/' + urlParsingNode.pathname;
  29139. }
  29140. /***/ },
  29141. /* 198 */
  29142. /***/ function(module, exports, __webpack_require__) {
  29143. var __extends = (this && this.__extends) || function (d, b) {
  29144. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  29145. function __() { this.constructor = d; }
  29146. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  29147. };
  29148. var collection_1 = __webpack_require__(12);
  29149. var lang_1 = __webpack_require__(5);
  29150. var dom_adapter_1 = __webpack_require__(178);
  29151. var xhr_impl_1 = __webpack_require__(199);
  29152. /**
  29153. * Provides DOM operations in any browser environment.
  29154. */
  29155. var GenericBrowserDomAdapter = (function (_super) {
  29156. __extends(GenericBrowserDomAdapter, _super);
  29157. function GenericBrowserDomAdapter() {
  29158. var _this = this;
  29159. _super.call(this);
  29160. this._animationPrefix = null;
  29161. this._transitionEnd = null;
  29162. try {
  29163. var element = this.createElement('div', this.defaultDoc());
  29164. if (lang_1.isPresent(this.getStyle(element, 'animationName'))) {
  29165. this._animationPrefix = '';
  29166. }
  29167. else {
  29168. var domPrefixes = ['Webkit', 'Moz', 'O', 'ms'];
  29169. for (var i = 0; i < domPrefixes.length; i++) {
  29170. if (lang_1.isPresent(this.getStyle(element, domPrefixes[i] + 'AnimationName'))) {
  29171. this._animationPrefix = '-' + domPrefixes[i].toLowerCase() + '-';
  29172. break;
  29173. }
  29174. }
  29175. }
  29176. var transEndEventNames = {
  29177. WebkitTransition: 'webkitTransitionEnd',
  29178. MozTransition: 'transitionend',
  29179. OTransition: 'oTransitionEnd otransitionend',
  29180. transition: 'transitionend'
  29181. };
  29182. collection_1.StringMapWrapper.forEach(transEndEventNames, function (value, key) {
  29183. if (lang_1.isPresent(_this.getStyle(element, key))) {
  29184. _this._transitionEnd = value;
  29185. }
  29186. });
  29187. }
  29188. catch (e) {
  29189. this._animationPrefix = null;
  29190. this._transitionEnd = null;
  29191. }
  29192. }
  29193. GenericBrowserDomAdapter.prototype.getXHR = function () { return xhr_impl_1.XHRImpl; };
  29194. GenericBrowserDomAdapter.prototype.getDistributedNodes = function (el) { return el.getDistributedNodes(); };
  29195. GenericBrowserDomAdapter.prototype.resolveAndSetHref = function (el, baseUrl, href) {
  29196. el.href = href == null ? baseUrl : baseUrl + '/../' + href;
  29197. };
  29198. GenericBrowserDomAdapter.prototype.supportsDOMEvents = function () { return true; };
  29199. GenericBrowserDomAdapter.prototype.supportsNativeShadowDOM = function () {
  29200. return lang_1.isFunction(this.defaultDoc().body.createShadowRoot);
  29201. };
  29202. GenericBrowserDomAdapter.prototype.getAnimationPrefix = function () {
  29203. return lang_1.isPresent(this._animationPrefix) ? this._animationPrefix : "";
  29204. };
  29205. GenericBrowserDomAdapter.prototype.getTransitionEnd = function () { return lang_1.isPresent(this._transitionEnd) ? this._transitionEnd : ""; };
  29206. GenericBrowserDomAdapter.prototype.supportsAnimation = function () {
  29207. return lang_1.isPresent(this._animationPrefix) && lang_1.isPresent(this._transitionEnd);
  29208. };
  29209. return GenericBrowserDomAdapter;
  29210. })(dom_adapter_1.DomAdapter);
  29211. exports.GenericBrowserDomAdapter = GenericBrowserDomAdapter;
  29212. /***/ },
  29213. /* 199 */
  29214. /***/ function(module, exports, __webpack_require__) {
  29215. var __extends = (this && this.__extends) || function (d, b) {
  29216. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  29217. function __() { this.constructor = d; }
  29218. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  29219. };
  29220. var promise_1 = __webpack_require__(61);
  29221. var lang_1 = __webpack_require__(5);
  29222. var xhr_1 = __webpack_require__(149);
  29223. var XHRImpl = (function (_super) {
  29224. __extends(XHRImpl, _super);
  29225. function XHRImpl() {
  29226. _super.apply(this, arguments);
  29227. }
  29228. XHRImpl.prototype.get = function (url) {
  29229. var completer = promise_1.PromiseWrapper.completer();
  29230. var xhr = new XMLHttpRequest();
  29231. xhr.open('GET', url, true);
  29232. xhr.responseType = 'text';
  29233. xhr.onload = function () {
  29234. // responseText is the old-school way of retrieving response (supported by IE8 & 9)
  29235. // response/responseType properties were introduced in XHR Level2 spec (supported by IE10)
  29236. var response = lang_1.isPresent(xhr.response) ? xhr.response : xhr.responseText;
  29237. // normalize IE9 bug (http://bugs.jquery.com/ticket/1450)
  29238. var status = xhr.status === 1223 ? 204 : xhr.status;
  29239. // fix status code when it is 0 (0 status is undocumented).
  29240. // Occurs when accessing file resources or on Android 4.1 stock browser
  29241. // while retrieving files from application cache.
  29242. if (status === 0) {
  29243. status = response ? 200 : 0;
  29244. }
  29245. if (200 <= status && status <= 300) {
  29246. completer.resolve(response);
  29247. }
  29248. else {
  29249. completer.reject("Failed to load " + url, null);
  29250. }
  29251. };
  29252. xhr.onerror = function () { completer.reject("Failed to load " + url, null); };
  29253. xhr.send();
  29254. return completer.promise;
  29255. };
  29256. return XHRImpl;
  29257. })(xhr_1.XHR);
  29258. exports.XHRImpl = XHRImpl;
  29259. /***/ },
  29260. /* 200 */
  29261. /***/ function(module, exports, __webpack_require__) {
  29262. var lang_1 = __webpack_require__(5);
  29263. var dom_adapter_1 = __webpack_require__(178);
  29264. var core_1 = __webpack_require__(2);
  29265. var PublicTestability = (function () {
  29266. function PublicTestability(testability) {
  29267. this._testability = testability;
  29268. }
  29269. PublicTestability.prototype.isStable = function () { return this._testability.isStable(); };
  29270. PublicTestability.prototype.whenStable = function (callback) { this._testability.whenStable(callback); };
  29271. PublicTestability.prototype.findBindings = function (using, provider, exactMatch) {
  29272. return this.findProviders(using, provider, exactMatch);
  29273. };
  29274. PublicTestability.prototype.findProviders = function (using, provider, exactMatch) {
  29275. return this._testability.findBindings(using, provider, exactMatch);
  29276. };
  29277. return PublicTestability;
  29278. })();
  29279. var BrowserGetTestability = (function () {
  29280. function BrowserGetTestability() {
  29281. }
  29282. BrowserGetTestability.init = function () { core_1.setTestabilityGetter(new BrowserGetTestability()); };
  29283. BrowserGetTestability.prototype.addToWindow = function (registry) {
  29284. lang_1.global.getAngularTestability = function (elem, findInAncestors) {
  29285. if (findInAncestors === void 0) { findInAncestors = true; }
  29286. var testability = registry.findTestabilityInTree(elem, findInAncestors);
  29287. if (testability == null) {
  29288. throw new Error('Could not find testability for element.');
  29289. }
  29290. return new PublicTestability(testability);
  29291. };
  29292. lang_1.global.getAllAngularTestabilities = function () {
  29293. var testabilities = registry.getAllTestabilities();
  29294. return testabilities.map(function (testability) { return new PublicTestability(testability); });
  29295. };
  29296. };
  29297. BrowserGetTestability.prototype.findTestabilityInTree = function (registry, elem, findInAncestors) {
  29298. if (elem == null) {
  29299. return null;
  29300. }
  29301. var t = registry.getTestability(elem);
  29302. if (lang_1.isPresent(t)) {
  29303. return t;
  29304. }
  29305. else if (!findInAncestors) {
  29306. return null;
  29307. }
  29308. if (dom_adapter_1.DOM.isShadowRoot(elem)) {
  29309. return this.findTestabilityInTree(registry, dom_adapter_1.DOM.getHost(elem), true);
  29310. }
  29311. return this.findTestabilityInTree(registry, dom_adapter_1.DOM.parentElement(elem), true);
  29312. };
  29313. return BrowserGetTestability;
  29314. })();
  29315. exports.BrowserGetTestability = BrowserGetTestability;
  29316. /***/ },
  29317. /* 201 */
  29318. /***/ function(module, exports) {
  29319. /**
  29320. * This is here because DART requires it. It is noop in JS.
  29321. */
  29322. function wtfInit() { }
  29323. exports.wtfInit = wtfInit;
  29324. /***/ },
  29325. /* 202 */
  29326. /***/ function(module, exports, __webpack_require__) {
  29327. var dom_adapter_1 = __webpack_require__(178);
  29328. /**
  29329. * A service that can be used to get and set the title of a current HTML document.
  29330. *
  29331. * Since an Angular 2 application can't be bootstrapped on the entire HTML document (`<html>` tag)
  29332. * it is not possible to bind to the `text` property of the `HTMLTitleElement` elements
  29333. * (representing the `<title>` tag). Instead, this service can be used to set and get the current
  29334. * title value.
  29335. */
  29336. var Title = (function () {
  29337. function Title() {
  29338. }
  29339. /**
  29340. * Get the title of the current HTML document.
  29341. * @returns {string}
  29342. */
  29343. Title.prototype.getTitle = function () { return dom_adapter_1.DOM.getTitle(); };
  29344. /**
  29345. * Set the title of the current HTML document.
  29346. * @param newTitle
  29347. */
  29348. Title.prototype.setTitle = function (newTitle) { dom_adapter_1.DOM.setTitle(newTitle); };
  29349. return Title;
  29350. })();
  29351. exports.Title = Title;
  29352. /***/ },
  29353. /* 203 */
  29354. /***/ function(module, exports, __webpack_require__) {
  29355. function __export(m) {
  29356. for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
  29357. }
  29358. /**
  29359. * This is a set of classes and objects that can be used both in the browser and on the server.
  29360. */
  29361. var dom_adapter_1 = __webpack_require__(178);
  29362. exports.DOM = dom_adapter_1.DOM;
  29363. exports.setRootDomAdapter = dom_adapter_1.setRootDomAdapter;
  29364. exports.DomAdapter = dom_adapter_1.DomAdapter;
  29365. var dom_renderer_1 = __webpack_require__(188);
  29366. exports.DomRenderer = dom_renderer_1.DomRenderer;
  29367. var dom_tokens_1 = __webpack_require__(187);
  29368. exports.DOCUMENT = dom_tokens_1.DOCUMENT;
  29369. var shared_styles_host_1 = __webpack_require__(196);
  29370. exports.SharedStylesHost = shared_styles_host_1.SharedStylesHost;
  29371. exports.DomSharedStylesHost = shared_styles_host_1.DomSharedStylesHost;
  29372. var dom_events_1 = __webpack_require__(182);
  29373. exports.DomEventsPlugin = dom_events_1.DomEventsPlugin;
  29374. var event_manager_1 = __webpack_require__(183);
  29375. exports.EVENT_MANAGER_PLUGINS = event_manager_1.EVENT_MANAGER_PLUGINS;
  29376. exports.EventManager = event_manager_1.EventManager;
  29377. exports.EventManagerPlugin = event_manager_1.EventManagerPlugin;
  29378. __export(__webpack_require__(204));
  29379. __export(__webpack_require__(205));
  29380. /***/ },
  29381. /* 204 */
  29382. /***/ function(module, exports, __webpack_require__) {
  29383. var lang_1 = __webpack_require__(5);
  29384. var dom_adapter_1 = __webpack_require__(178);
  29385. /**
  29386. * Predicates for use with {@link DebugElement}'s query functions.
  29387. */
  29388. var By = (function () {
  29389. function By() {
  29390. }
  29391. /**
  29392. * Match all elements.
  29393. *
  29394. * ## Example
  29395. *
  29396. * {@example platform/dom/debug/ts/by/by.ts region='by_all'}
  29397. */
  29398. By.all = function () { return function (debugElement) { return true; }; };
  29399. /**
  29400. * Match elements by the given CSS selector.
  29401. *
  29402. * ## Example
  29403. *
  29404. * {@example platform/dom/debug/ts/by/by.ts region='by_css'}
  29405. */
  29406. By.css = function (selector) {
  29407. return function (debugElement) {
  29408. return lang_1.isPresent(debugElement.nativeElement) ?
  29409. dom_adapter_1.DOM.elementMatches(debugElement.nativeElement, selector) :
  29410. false;
  29411. };
  29412. };
  29413. /**
  29414. * Match elements that have the given directive present.
  29415. *
  29416. * ## Example
  29417. *
  29418. * {@example platform/dom/debug/ts/by/by.ts region='by_directive'}
  29419. */
  29420. By.directive = function (type) {
  29421. return function (debugElement) { return debugElement.hasDirective(type); };
  29422. };
  29423. return By;
  29424. })();
  29425. exports.By = By;
  29426. /***/ },
  29427. /* 205 */
  29428. /***/ function(module, exports, __webpack_require__) {
  29429. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  29430. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  29431. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  29432. 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;
  29433. return c > 3 && r && Object.defineProperty(target, key, r), r;
  29434. };
  29435. var __metadata = (this && this.__metadata) || function (k, v) {
  29436. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  29437. };
  29438. var lang_1 = __webpack_require__(5);
  29439. var collection_1 = __webpack_require__(12);
  29440. var di_1 = __webpack_require__(6);
  29441. var view_listener_1 = __webpack_require__(86);
  29442. var dom_adapter_1 = __webpack_require__(178);
  29443. var api_1 = __webpack_require__(72);
  29444. var debug_element_1 = __webpack_require__(101);
  29445. var NG_ID_PROPERTY = 'ngid';
  29446. var INSPECT_GLOBAL_NAME = 'ng.probe';
  29447. var NG_ID_SEPARATOR = '#';
  29448. // Need to keep the views in a global Map so that multiple angular apps are supported
  29449. var _allIdsByView = new collection_1.Map();
  29450. var _allViewsById = new collection_1.Map();
  29451. var _nextId = 0;
  29452. function _setElementId(element, indices) {
  29453. if (lang_1.isPresent(element) && dom_adapter_1.DOM.isElementNode(element)) {
  29454. dom_adapter_1.DOM.setData(element, NG_ID_PROPERTY, indices.join(NG_ID_SEPARATOR));
  29455. }
  29456. }
  29457. function _getElementId(element) {
  29458. var elId = dom_adapter_1.DOM.getData(element, NG_ID_PROPERTY);
  29459. if (lang_1.isPresent(elId)) {
  29460. return elId.split(NG_ID_SEPARATOR).map(function (partStr) { return lang_1.NumberWrapper.parseInt(partStr, 10); });
  29461. }
  29462. else {
  29463. return null;
  29464. }
  29465. }
  29466. /**
  29467. * Returns a {@link DebugElement} for the given native DOM element, or
  29468. * null if the given native element does not have an Angular view associated
  29469. * with it.
  29470. */
  29471. function inspectNativeElement(element) {
  29472. var elId = _getElementId(element);
  29473. if (lang_1.isPresent(elId)) {
  29474. var view = _allViewsById.get(elId[0]);
  29475. if (lang_1.isPresent(view)) {
  29476. return new debug_element_1.DebugElement_(view, elId[1]);
  29477. }
  29478. }
  29479. return null;
  29480. }
  29481. exports.inspectNativeElement = inspectNativeElement;
  29482. var DebugElementViewListener = (function () {
  29483. function DebugElementViewListener(_renderer) {
  29484. this._renderer = _renderer;
  29485. dom_adapter_1.DOM.setGlobalVar(INSPECT_GLOBAL_NAME, inspectNativeElement);
  29486. }
  29487. DebugElementViewListener.prototype.onViewCreated = function (view) {
  29488. var viewId = _nextId++;
  29489. _allViewsById.set(viewId, view);
  29490. _allIdsByView.set(view, viewId);
  29491. for (var i = 0; i < view.elementRefs.length; i++) {
  29492. var el = view.elementRefs[i];
  29493. _setElementId(this._renderer.getNativeElementSync(el), [viewId, i]);
  29494. }
  29495. };
  29496. DebugElementViewListener.prototype.onViewDestroyed = function (view) {
  29497. var viewId = _allIdsByView.get(view);
  29498. _allIdsByView.delete(view);
  29499. _allViewsById.delete(viewId);
  29500. };
  29501. DebugElementViewListener = __decorate([
  29502. di_1.Injectable(),
  29503. __metadata('design:paramtypes', [api_1.Renderer])
  29504. ], DebugElementViewListener);
  29505. return DebugElementViewListener;
  29506. })();
  29507. exports.DebugElementViewListener = DebugElementViewListener;
  29508. /**
  29509. * Providers which support debugging Angular applications (e.g. via `ng.probe`).
  29510. *
  29511. * ## Example
  29512. *
  29513. * {@example platform/dom/debug/ts/debug_element_view_listener/providers.ts region='providers'}
  29514. */
  29515. exports.ELEMENT_PROBE_PROVIDERS = lang_1.CONST_EXPR([
  29516. DebugElementViewListener,
  29517. lang_1.CONST_EXPR(new di_1.Provider(view_listener_1.AppViewListener, { useExisting: DebugElementViewListener })),
  29518. ]);
  29519. /**
  29520. * Use {@link ELEMENT_PROBE_PROVIDERS}.
  29521. *
  29522. * @deprecated
  29523. */
  29524. exports.ELEMENT_PROBE_BINDINGS = exports.ELEMENT_PROBE_PROVIDERS;
  29525. /***/ },
  29526. /* 206 */
  29527. /***/ function(module, exports, __webpack_require__) {
  29528. var lang_1 = __webpack_require__(5);
  29529. var common_tools_1 = __webpack_require__(207);
  29530. var context = lang_1.global;
  29531. /**
  29532. * Enabled Angular 2 debug tools that are accessible via your browser's
  29533. * developer console.
  29534. *
  29535. * Usage:
  29536. *
  29537. * 1. Open developer console (e.g. in Chrome Ctrl + Shift + j)
  29538. * 1. Type `ng.` (usually the console will show auto-complete suggestion)
  29539. * 1. Try the change detection profiler `ng.profiler.timeChangeDetection()`
  29540. * then hit Enter.
  29541. */
  29542. function enableDebugTools(ref) {
  29543. context.ng = new common_tools_1.AngularTools(ref);
  29544. }
  29545. exports.enableDebugTools = enableDebugTools;
  29546. /**
  29547. * Disables Angular 2 tools.
  29548. */
  29549. function disableDebugTools() {
  29550. delete context.ng;
  29551. }
  29552. exports.disableDebugTools = disableDebugTools;
  29553. /***/ },
  29554. /* 207 */
  29555. /***/ function(module, exports, __webpack_require__) {
  29556. var application_ref_1 = __webpack_require__(65);
  29557. var lang_1 = __webpack_require__(5);
  29558. var browser_1 = __webpack_require__(208);
  29559. var dom_adapter_1 = __webpack_require__(178);
  29560. /**
  29561. * Entry point for all Angular debug tools. This object corresponds to the `ng`
  29562. * global variable accessible in the dev console.
  29563. */
  29564. var AngularTools = (function () {
  29565. function AngularTools(ref) {
  29566. this.profiler = new AngularProfiler(ref);
  29567. }
  29568. return AngularTools;
  29569. })();
  29570. exports.AngularTools = AngularTools;
  29571. /**
  29572. * Entry point for all Angular profiling-related debug tools. This object
  29573. * corresponds to the `ng.profiler` in the dev console.
  29574. */
  29575. var AngularProfiler = (function () {
  29576. function AngularProfiler(ref) {
  29577. this.appRef = ref.injector.get(application_ref_1.ApplicationRef);
  29578. }
  29579. /**
  29580. * Exercises change detection in a loop and then prints the average amount of
  29581. * time in milliseconds how long a single round of change detection takes for
  29582. * the current state of the UI. It runs a minimum of 5 rounds for a minimum
  29583. * of 500 milliseconds.
  29584. *
  29585. * Optionally, a user may pass a `config` parameter containing a map of
  29586. * options. Supported options are:
  29587. *
  29588. * `record` (boolean) - causes the profiler to record a CPU profile while
  29589. * it exercises the change detector. Example:
  29590. *
  29591. * ```
  29592. * ng.profiler.timeChangeDetection({record: true})
  29593. * ```
  29594. */
  29595. AngularProfiler.prototype.timeChangeDetection = function (config) {
  29596. var record = lang_1.isPresent(config) && config['record'];
  29597. var profileName = 'Change Detection';
  29598. // Profiler is not available in Android browsers, nor in IE 9 without dev tools opened
  29599. var isProfilerAvailable = lang_1.isPresent(browser_1.window.console.profile);
  29600. if (record && isProfilerAvailable) {
  29601. browser_1.window.console.profile(profileName);
  29602. }
  29603. var start = dom_adapter_1.DOM.performanceNow();
  29604. var numTicks = 0;
  29605. while (numTicks < 5 || (dom_adapter_1.DOM.performanceNow() - start) < 500) {
  29606. this.appRef.tick();
  29607. numTicks++;
  29608. }
  29609. var end = dom_adapter_1.DOM.performanceNow();
  29610. if (record && isProfilerAvailable) {
  29611. // need to cast to <any> because type checker thinks there's no argument
  29612. // while in fact there is:
  29613. //
  29614. // https://developer.mozilla.org/en-US/docs/Web/API/Console/profileEnd
  29615. browser_1.window.console.profileEnd(profileName);
  29616. }
  29617. var msPerTick = (end - start) / numTicks;
  29618. browser_1.window.console.log("ran " + numTicks + " change detection cycles");
  29619. browser_1.window.console.log(lang_1.NumberWrapper.toFixed(msPerTick, 2) + " ms per check");
  29620. };
  29621. return AngularProfiler;
  29622. })();
  29623. exports.AngularProfiler = AngularProfiler;
  29624. /***/ },
  29625. /* 208 */
  29626. /***/ function(module, exports) {
  29627. /**
  29628. * JS version of browser APIs. This library can only run in the browser.
  29629. */
  29630. var win = window;
  29631. exports.window = win;
  29632. exports.document = window.document;
  29633. exports.location = window.location;
  29634. exports.gc = window['gc'] ? function () { return window['gc'](); } : function () { return null; };
  29635. exports.performance = window['performance'] ? window['performance'] : null;
  29636. exports.Event = window['Event'];
  29637. exports.MouseEvent = window['MouseEvent'];
  29638. exports.KeyboardEvent = window['KeyboardEvent'];
  29639. exports.EventTarget = window['EventTarget'];
  29640. exports.History = window['History'];
  29641. exports.Location = window['Location'];
  29642. exports.EventListener = window['EventListener'];
  29643. /***/ },
  29644. /* 209 */
  29645. /***/ function(module, exports, __webpack_require__) {
  29646. /**
  29647. * @module
  29648. * @description
  29649. * The http module provides services to perform http requests. To get started, see the {@link Http}
  29650. * class.
  29651. */
  29652. var core_1 = __webpack_require__(2);
  29653. var http_1 = __webpack_require__(210);
  29654. var xhr_backend_1 = __webpack_require__(218);
  29655. var jsonp_backend_1 = __webpack_require__(222);
  29656. var browser_xhr_1 = __webpack_require__(221);
  29657. var browser_jsonp_1 = __webpack_require__(223);
  29658. var base_request_options_1 = __webpack_require__(216);
  29659. var base_response_options_1 = __webpack_require__(220);
  29660. var static_request_1 = __webpack_require__(212);
  29661. exports.Request = static_request_1.Request;
  29662. var static_response_1 = __webpack_require__(219);
  29663. exports.Response = static_response_1.Response;
  29664. var interfaces_1 = __webpack_require__(211);
  29665. exports.Connection = interfaces_1.Connection;
  29666. exports.ConnectionBackend = interfaces_1.ConnectionBackend;
  29667. var browser_xhr_2 = __webpack_require__(221);
  29668. exports.BrowserXhr = browser_xhr_2.BrowserXhr;
  29669. var base_request_options_2 = __webpack_require__(216);
  29670. exports.BaseRequestOptions = base_request_options_2.BaseRequestOptions;
  29671. exports.RequestOptions = base_request_options_2.RequestOptions;
  29672. var base_response_options_2 = __webpack_require__(220);
  29673. exports.BaseResponseOptions = base_response_options_2.BaseResponseOptions;
  29674. exports.ResponseOptions = base_response_options_2.ResponseOptions;
  29675. var xhr_backend_2 = __webpack_require__(218);
  29676. exports.XHRBackend = xhr_backend_2.XHRBackend;
  29677. exports.XHRConnection = xhr_backend_2.XHRConnection;
  29678. var jsonp_backend_2 = __webpack_require__(222);
  29679. exports.JSONPBackend = jsonp_backend_2.JSONPBackend;
  29680. exports.JSONPConnection = jsonp_backend_2.JSONPConnection;
  29681. var http_2 = __webpack_require__(210);
  29682. exports.Http = http_2.Http;
  29683. exports.Jsonp = http_2.Jsonp;
  29684. var headers_1 = __webpack_require__(213);
  29685. exports.Headers = headers_1.Headers;
  29686. var enums_1 = __webpack_require__(215);
  29687. exports.ResponseType = enums_1.ResponseType;
  29688. exports.ReadyState = enums_1.ReadyState;
  29689. exports.RequestMethod = enums_1.RequestMethod;
  29690. var url_search_params_1 = __webpack_require__(217);
  29691. exports.URLSearchParams = url_search_params_1.URLSearchParams;
  29692. /**
  29693. * Provides a basic set of injectables to use the {@link Http} service in any application.
  29694. *
  29695. * The `HTTP_PROVIDERS` should be included either in a component's injector,
  29696. * or in the root injector when bootstrapping an application.
  29697. *
  29698. * ### Example ([live demo](http://plnkr.co/edit/snj7Nv?p=preview))
  29699. *
  29700. * ```
  29701. * import {Component} from 'angular2/core';
  29702. * import {bootstrap} from 'angular2/platform/browser';
  29703. * import {NgFor} from 'angular2/common';
  29704. * import {HTTP_PROVIDERS, Http} from 'angular2/http';
  29705. *
  29706. * @Component({
  29707. * selector: 'app',
  29708. * providers: [HTTP_PROVIDERS],
  29709. * template: `
  29710. * <div>
  29711. * <h1>People</h1>
  29712. * <ul>
  29713. * <li *ngFor="#person of people">
  29714. * {{person.name}}
  29715. * </li>
  29716. * </ul>
  29717. * </div>
  29718. * `,
  29719. * directives: [NgFor]
  29720. * })
  29721. * export class App {
  29722. * people: Object[];
  29723. * constructor(http:Http) {
  29724. * http.get('people.json').subscribe(res => {
  29725. * this.people = res.json();
  29726. * });
  29727. * }
  29728. * active:boolean = false;
  29729. * toggleActiveState() {
  29730. * this.active = !this.active;
  29731. * }
  29732. * }
  29733. *
  29734. * bootstrap(App)
  29735. * .catch(err => console.error(err));
  29736. * ```
  29737. *
  29738. * The primary public API included in `HTTP_PROVIDERS` is the {@link Http} class.
  29739. * However, other providers required by `Http` are included,
  29740. * which may be beneficial to override in certain cases.
  29741. *
  29742. * The providers included in `HTTP_PROVIDERS` include:
  29743. * * {@link Http}
  29744. * * {@link XHRBackend}
  29745. * * `BrowserXHR` - Private factory to create `XMLHttpRequest` instances
  29746. * * {@link RequestOptions} - Bound to {@link BaseRequestOptions} class
  29747. * * {@link ResponseOptions} - Bound to {@link BaseResponseOptions} class
  29748. *
  29749. * There may be cases where it makes sense to extend the base request options,
  29750. * such as to add a search string to be appended to all URLs.
  29751. * To accomplish this, a new provider for {@link RequestOptions} should
  29752. * be added in the same injector as `HTTP_PROVIDERS`.
  29753. *
  29754. * ### Example ([live demo](http://plnkr.co/edit/aCMEXi?p=preview))
  29755. *
  29756. * ```
  29757. * import {provide} from 'angular2/core';
  29758. * import {bootstrap} from 'angular2/platform/browser';
  29759. * import {HTTP_PROVIDERS, BaseRequestOptions, RequestOptions} from 'angular2/http';
  29760. *
  29761. * class MyOptions extends BaseRequestOptions {
  29762. * search: string = 'coreTeam=true';
  29763. * }
  29764. *
  29765. * bootstrap(App, [HTTP_PROVIDERS, provide(RequestOptions, {useClass: MyOptions})])
  29766. * .catch(err => console.error(err));
  29767. * ```
  29768. *
  29769. * Likewise, to use a mock backend for unit tests, the {@link XHRBackend}
  29770. * provider should be bound to {@link MockBackend}.
  29771. *
  29772. * ### Example ([live demo](http://plnkr.co/edit/7LWALD?p=preview))
  29773. *
  29774. * ```
  29775. * import {provide} from 'angular2/core';
  29776. * import {bootstrap} from 'angular2/platform/browser';
  29777. * import {HTTP_PROVIDERS, Http, Response, XHRBackend} from 'angular2/http';
  29778. * import {MockBackend} from 'angular2/http/testing';
  29779. *
  29780. * var people = [{name: 'Jeff'}, {name: 'Tobias'}];
  29781. *
  29782. * var injector = Injector.resolveAndCreate([
  29783. * HTTP_PROVIDERS,
  29784. * MockBackend,
  29785. * provide(XHRBackend, {useExisting: MockBackend})
  29786. * ]);
  29787. * var http = injector.get(Http);
  29788. * var backend = injector.get(MockBackend);
  29789. *
  29790. * // Listen for any new requests
  29791. * backend.connections.observer({
  29792. * next: connection => {
  29793. * var response = new Response({body: people});
  29794. * setTimeout(() => {
  29795. * // Send a response to the request
  29796. * connection.mockRespond(response);
  29797. * });
  29798. * });
  29799. *
  29800. * http.get('people.json').observer({
  29801. * next: res => {
  29802. * // Response came from mock backend
  29803. * console.log('first person', res.json()[0].name);
  29804. * }
  29805. * });
  29806. * ```
  29807. */
  29808. exports.HTTP_PROVIDERS = [
  29809. // TODO(pascal): use factory type annotations once supported in DI
  29810. // issue: https://github.com/angular/angular/issues/3183
  29811. core_1.provide(http_1.Http, {
  29812. useFactory: function (xhrBackend, requestOptions) { return new http_1.Http(xhrBackend, requestOptions); },
  29813. deps: [xhr_backend_1.XHRBackend, base_request_options_1.RequestOptions]
  29814. }),
  29815. browser_xhr_1.BrowserXhr,
  29816. core_1.provide(base_request_options_1.RequestOptions, { useClass: base_request_options_1.BaseRequestOptions }),
  29817. core_1.provide(base_response_options_1.ResponseOptions, { useClass: base_response_options_1.BaseResponseOptions }),
  29818. xhr_backend_1.XHRBackend
  29819. ];
  29820. /**
  29821. * See {@link HTTP_PROVIDERS} instead.
  29822. *
  29823. * @deprecated
  29824. */
  29825. exports.HTTP_BINDINGS = exports.HTTP_PROVIDERS;
  29826. /**
  29827. * Provides a basic set of providers to use the {@link Jsonp} service in any application.
  29828. *
  29829. * The `JSONP_PROVIDERS` should be included either in a component's injector,
  29830. * or in the root injector when bootstrapping an application.
  29831. *
  29832. * ### Example ([live demo](http://plnkr.co/edit/vmeN4F?p=preview))
  29833. *
  29834. * ```
  29835. * import {Component} from 'angular2/core';
  29836. * import {NgFor} from 'angular2/common';
  29837. * import {JSONP_PROVIDERS, Jsonp} from 'angular2/http';
  29838. *
  29839. * @Component({
  29840. * selector: 'app',
  29841. * providers: [JSONP_PROVIDERS],
  29842. * template: `
  29843. * <div>
  29844. * <h1>People</h1>
  29845. * <ul>
  29846. * <li *ngFor="#person of people">
  29847. * {{person.name}}
  29848. * </li>
  29849. * </ul>
  29850. * </div>
  29851. * `,
  29852. * directives: [NgFor]
  29853. * })
  29854. * export class App {
  29855. * people: Array<Object>;
  29856. * constructor(jsonp:Jsonp) {
  29857. * jsonp.request('people.json').subscribe(res => {
  29858. * this.people = res.json();
  29859. * })
  29860. * }
  29861. * }
  29862. * ```
  29863. *
  29864. * The primary public API included in `JSONP_PROVIDERS` is the {@link Jsonp} class.
  29865. * However, other providers required by `Jsonp` are included,
  29866. * which may be beneficial to override in certain cases.
  29867. *
  29868. * The providers included in `JSONP_PROVIDERS` include:
  29869. * * {@link Jsonp}
  29870. * * {@link JSONPBackend}
  29871. * * `BrowserJsonp` - Private factory
  29872. * * {@link RequestOptions} - Bound to {@link BaseRequestOptions} class
  29873. * * {@link ResponseOptions} - Bound to {@link BaseResponseOptions} class
  29874. *
  29875. * There may be cases where it makes sense to extend the base request options,
  29876. * such as to add a search string to be appended to all URLs.
  29877. * To accomplish this, a new provider for {@link RequestOptions} should
  29878. * be added in the same injector as `JSONP_PROVIDERS`.
  29879. *
  29880. * ### Example ([live demo](http://plnkr.co/edit/TFug7x?p=preview))
  29881. *
  29882. * ```
  29883. * import {provide} from 'angular2/core';
  29884. * import {bootstrap} from 'angular2/platform/browser';
  29885. * import {JSONP_PROVIDERS, BaseRequestOptions, RequestOptions} from 'angular2/http';
  29886. *
  29887. * class MyOptions extends BaseRequestOptions {
  29888. * search: string = 'coreTeam=true';
  29889. * }
  29890. *
  29891. * bootstrap(App, [JSONP_PROVIDERS, provide(RequestOptions, {useClass: MyOptions})])
  29892. * .catch(err => console.error(err));
  29893. * ```
  29894. *
  29895. * Likewise, to use a mock backend for unit tests, the {@link JSONPBackend}
  29896. * provider should be bound to {@link MockBackend}.
  29897. *
  29898. * ### Example ([live demo](http://plnkr.co/edit/HDqZWL?p=preview))
  29899. *
  29900. * ```
  29901. * import {provide, Injector} from 'angular2/core';
  29902. * import {JSONP_PROVIDERS, Jsonp, Response, JSONPBackend} from 'angular2/http';
  29903. * import {MockBackend} from 'angular2/http/testing';
  29904. *
  29905. * var people = [{name: 'Jeff'}, {name: 'Tobias'}];
  29906. * var injector = Injector.resolveAndCreate([
  29907. * JSONP_PROVIDERS,
  29908. * MockBackend,
  29909. * provide(JSONPBackend, {useExisting: MockBackend})
  29910. * ]);
  29911. * var jsonp = injector.get(Jsonp);
  29912. * var backend = injector.get(MockBackend);
  29913. *
  29914. * // Listen for any new requests
  29915. * backend.connections.observer({
  29916. * next: connection => {
  29917. * var response = new Response({body: people});
  29918. * setTimeout(() => {
  29919. * // Send a response to the request
  29920. * connection.mockRespond(response);
  29921. * });
  29922. * });
  29923. * jsonp.get('people.json').observer({
  29924. * next: res => {
  29925. * // Response came from mock backend
  29926. * console.log('first person', res.json()[0].name);
  29927. * }
  29928. * });
  29929. * ```
  29930. */
  29931. exports.JSONP_PROVIDERS = [
  29932. // TODO(pascal): use factory type annotations once supported in DI
  29933. // issue: https://github.com/angular/angular/issues/3183
  29934. core_1.provide(http_1.Jsonp, {
  29935. useFactory: function (jsonpBackend, requestOptions) { return new http_1.Jsonp(jsonpBackend, requestOptions); },
  29936. deps: [jsonp_backend_1.JSONPBackend, base_request_options_1.RequestOptions]
  29937. }),
  29938. browser_jsonp_1.BrowserJsonp,
  29939. core_1.provide(base_request_options_1.RequestOptions, { useClass: base_request_options_1.BaseRequestOptions }),
  29940. core_1.provide(base_response_options_1.ResponseOptions, { useClass: base_response_options_1.BaseResponseOptions }),
  29941. core_1.provide(jsonp_backend_1.JSONPBackend, { useClass: jsonp_backend_1.JSONPBackend_ })
  29942. ];
  29943. /**
  29944. * See {@link JSONP_PROVIDERS} instead.
  29945. *
  29946. * @deprecated
  29947. */
  29948. exports.JSON_BINDINGS = exports.JSONP_PROVIDERS;
  29949. /***/ },
  29950. /* 210 */
  29951. /***/ function(module, exports, __webpack_require__) {
  29952. var __extends = (this && this.__extends) || function (d, b) {
  29953. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  29954. function __() { this.constructor = d; }
  29955. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  29956. };
  29957. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  29958. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  29959. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  29960. 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;
  29961. return c > 3 && r && Object.defineProperty(target, key, r), r;
  29962. };
  29963. var __metadata = (this && this.__metadata) || function (k, v) {
  29964. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  29965. };
  29966. var lang_1 = __webpack_require__(5);
  29967. var exceptions_1 = __webpack_require__(14);
  29968. var core_1 = __webpack_require__(2);
  29969. var interfaces_1 = __webpack_require__(211);
  29970. var static_request_1 = __webpack_require__(212);
  29971. var base_request_options_1 = __webpack_require__(216);
  29972. var enums_1 = __webpack_require__(215);
  29973. function httpRequest(backend, request) {
  29974. return backend.createConnection(request).response;
  29975. }
  29976. function mergeOptions(defaultOpts, providedOpts, method, url) {
  29977. var newOptions = defaultOpts;
  29978. if (lang_1.isPresent(providedOpts)) {
  29979. // Hack so Dart can used named parameters
  29980. return newOptions.merge(new base_request_options_1.RequestOptions({
  29981. method: providedOpts.method || method,
  29982. url: providedOpts.url || url,
  29983. search: providedOpts.search,
  29984. headers: providedOpts.headers,
  29985. body: providedOpts.body
  29986. }));
  29987. }
  29988. if (lang_1.isPresent(method)) {
  29989. return newOptions.merge(new base_request_options_1.RequestOptions({ method: method, url: url }));
  29990. }
  29991. else {
  29992. return newOptions.merge(new base_request_options_1.RequestOptions({ url: url }));
  29993. }
  29994. }
  29995. /**
  29996. * Performs http requests using `XMLHttpRequest` as the default backend.
  29997. *
  29998. * `Http` is available as an injectable class, with methods to perform http requests. Calling
  29999. * `request` returns an `Observable` which will emit a single {@link Response} when a
  30000. * response is received.
  30001. *
  30002. * ### Example
  30003. *
  30004. * ```typescript
  30005. * import {Http, HTTP_PROVIDERS} from 'angular2/http';
  30006. * @Component({
  30007. * selector: 'http-app',
  30008. * viewProviders: [HTTP_PROVIDERS],
  30009. * templateUrl: 'people.html'
  30010. * })
  30011. * class PeopleComponent {
  30012. * constructor(http: Http) {
  30013. * http.get('people.json')
  30014. * // Call map on the response observable to get the parsed people object
  30015. * .map(res => res.json())
  30016. * // Subscribe to the observable to get the parsed people object and attach it to the
  30017. * // component
  30018. * .subscribe(people => this.people = people);
  30019. * }
  30020. * }
  30021. * ```
  30022. *
  30023. *
  30024. * ### Example
  30025. *
  30026. * ```
  30027. * http.get('people.json').observer({next: (value) => this.people = value});
  30028. * ```
  30029. *
  30030. * The default construct used to perform requests, `XMLHttpRequest`, is abstracted as a "Backend" (
  30031. * {@link XHRBackend} in this case), which could be mocked with dependency injection by replacing
  30032. * the {@link XHRBackend} provider, as in the following example:
  30033. *
  30034. * ### Example
  30035. *
  30036. * ```typescript
  30037. * import {BaseRequestOptions, Http} from 'angular2/http';
  30038. * import {MockBackend} from 'angular2/http/testing';
  30039. * var injector = Injector.resolveAndCreate([
  30040. * BaseRequestOptions,
  30041. * MockBackend,
  30042. * provide(Http, {useFactory:
  30043. * function(backend, defaultOptions) {
  30044. * return new Http(backend, defaultOptions);
  30045. * },
  30046. * deps: [MockBackend, BaseRequestOptions]})
  30047. * ]);
  30048. * var http = injector.get(Http);
  30049. * http.get('request-from-mock-backend.json').subscribe((res:Response) => doSomething(res));
  30050. * ```
  30051. *
  30052. **/
  30053. var Http = (function () {
  30054. function Http(_backend, _defaultOptions) {
  30055. this._backend = _backend;
  30056. this._defaultOptions = _defaultOptions;
  30057. }
  30058. /**
  30059. * Performs any type of http request. First argument is required, and can either be a url or
  30060. * a {@link Request} instance. If the first argument is a url, an optional {@link RequestOptions}
  30061. * object can be provided as the 2nd argument. The options object will be merged with the values
  30062. * of {@link BaseRequestOptions} before performing the request.
  30063. */
  30064. Http.prototype.request = function (url, options) {
  30065. var responseObservable;
  30066. if (lang_1.isString(url)) {
  30067. responseObservable = httpRequest(this._backend, new static_request_1.Request(mergeOptions(this._defaultOptions, options, enums_1.RequestMethod.Get, url)));
  30068. }
  30069. else if (url instanceof static_request_1.Request) {
  30070. responseObservable = httpRequest(this._backend, url);
  30071. }
  30072. else {
  30073. throw exceptions_1.makeTypeError('First argument must be a url string or Request instance.');
  30074. }
  30075. return responseObservable;
  30076. };
  30077. /**
  30078. * Performs a request with `get` http method.
  30079. */
  30080. Http.prototype.get = function (url, options) {
  30081. return httpRequest(this._backend, new static_request_1.Request(mergeOptions(this._defaultOptions, options, enums_1.RequestMethod.Get, url)));
  30082. };
  30083. /**
  30084. * Performs a request with `post` http method.
  30085. */
  30086. Http.prototype.post = function (url, body, options) {
  30087. 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)));
  30088. };
  30089. /**
  30090. * Performs a request with `put` http method.
  30091. */
  30092. Http.prototype.put = function (url, body, options) {
  30093. 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)));
  30094. };
  30095. /**
  30096. * Performs a request with `delete` http method.
  30097. */
  30098. Http.prototype.delete = function (url, options) {
  30099. return httpRequest(this._backend, new static_request_1.Request(mergeOptions(this._defaultOptions, options, enums_1.RequestMethod.Delete, url)));
  30100. };
  30101. /**
  30102. * Performs a request with `patch` http method.
  30103. */
  30104. Http.prototype.patch = function (url, body, options) {
  30105. 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)));
  30106. };
  30107. /**
  30108. * Performs a request with `head` http method.
  30109. */
  30110. Http.prototype.head = function (url, options) {
  30111. return httpRequest(this._backend, new static_request_1.Request(mergeOptions(this._defaultOptions, options, enums_1.RequestMethod.Head, url)));
  30112. };
  30113. Http = __decorate([
  30114. core_1.Injectable(),
  30115. __metadata('design:paramtypes', [interfaces_1.ConnectionBackend, base_request_options_1.RequestOptions])
  30116. ], Http);
  30117. return Http;
  30118. })();
  30119. exports.Http = Http;
  30120. var Jsonp = (function (_super) {
  30121. __extends(Jsonp, _super);
  30122. function Jsonp(backend, defaultOptions) {
  30123. _super.call(this, backend, defaultOptions);
  30124. }
  30125. /**
  30126. * Performs any type of http request. First argument is required, and can either be a url or
  30127. * a {@link Request} instance. If the first argument is a url, an optional {@link RequestOptions}
  30128. * object can be provided as the 2nd argument. The options object will be merged with the values
  30129. * of {@link BaseRequestOptions} before performing the request.
  30130. */
  30131. Jsonp.prototype.request = function (url, options) {
  30132. var responseObservable;
  30133. if (lang_1.isString(url)) {
  30134. url = new static_request_1.Request(mergeOptions(this._defaultOptions, options, enums_1.RequestMethod.Get, url));
  30135. }
  30136. if (url instanceof static_request_1.Request) {
  30137. if (url.method !== enums_1.RequestMethod.Get) {
  30138. exceptions_1.makeTypeError('JSONP requests must use GET request method.');
  30139. }
  30140. responseObservable = httpRequest(this._backend, url);
  30141. }
  30142. else {
  30143. throw exceptions_1.makeTypeError('First argument must be a url string or Request instance.');
  30144. }
  30145. return responseObservable;
  30146. };
  30147. Jsonp = __decorate([
  30148. core_1.Injectable(),
  30149. __metadata('design:paramtypes', [interfaces_1.ConnectionBackend, base_request_options_1.RequestOptions])
  30150. ], Jsonp);
  30151. return Jsonp;
  30152. })(Http);
  30153. exports.Jsonp = Jsonp;
  30154. /***/ },
  30155. /* 211 */
  30156. /***/ function(module, exports) {
  30157. /**
  30158. * Abstract class from which real backends are derived.
  30159. *
  30160. * The primary purpose of a `ConnectionBackend` is to create new connections to fulfill a given
  30161. * {@link Request}.
  30162. */
  30163. var ConnectionBackend = (function () {
  30164. function ConnectionBackend() {
  30165. }
  30166. return ConnectionBackend;
  30167. })();
  30168. exports.ConnectionBackend = ConnectionBackend;
  30169. /**
  30170. * Abstract class from which real connections are derived.
  30171. */
  30172. var Connection = (function () {
  30173. function Connection() {
  30174. }
  30175. return Connection;
  30176. })();
  30177. exports.Connection = Connection;
  30178. /***/ },
  30179. /* 212 */
  30180. /***/ function(module, exports, __webpack_require__) {
  30181. var headers_1 = __webpack_require__(213);
  30182. var http_utils_1 = __webpack_require__(214);
  30183. var lang_1 = __webpack_require__(5);
  30184. // TODO(jeffbcross): properly implement body accessors
  30185. /**
  30186. * Creates `Request` instances from provided values.
  30187. *
  30188. * The Request's interface is inspired by the Request constructor defined in the [Fetch
  30189. * Spec](https://fetch.spec.whatwg.org/#request-class),
  30190. * but is considered a static value whose body can be accessed many times. There are other
  30191. * differences in the implementation, but this is the most significant.
  30192. *
  30193. * `Request` instances are typically created by higher-level classes, like {@link Http} and
  30194. * {@link Jsonp}, but it may occasionally be useful to explicitly create `Request` instances.
  30195. * One such example is when creating services that wrap higher-level services, like {@link Http},
  30196. * where it may be useful to generate a `Request` with arbitrary headers and search params.
  30197. *
  30198. * ```typescript
  30199. * import {Injectable, Injector} from 'angular2/core';
  30200. * import {HTTP_PROVIDERS, Http, Request, RequestMethod} from 'angular2/http';
  30201. *
  30202. * @Injectable()
  30203. * class AutoAuthenticator {
  30204. * constructor(public http:Http) {}
  30205. * request(url:string) {
  30206. * return this.http.request(new Request({
  30207. * method: RequestMethod.Get,
  30208. * url: url,
  30209. * search: 'password=123'
  30210. * }));
  30211. * }
  30212. * }
  30213. *
  30214. * var injector = Injector.resolveAndCreate([HTTP_PROVIDERS, AutoAuthenticator]);
  30215. * var authenticator = injector.get(AutoAuthenticator);
  30216. * authenticator.request('people.json').subscribe(res => {
  30217. * //URL should have included '?password=123'
  30218. * console.log('people', res.json());
  30219. * });
  30220. * ```
  30221. */
  30222. var Request = (function () {
  30223. function Request(requestOptions) {
  30224. // TODO: assert that url is present
  30225. var url = requestOptions.url;
  30226. this.url = requestOptions.url;
  30227. if (lang_1.isPresent(requestOptions.search)) {
  30228. var search = requestOptions.search.toString();
  30229. if (search.length > 0) {
  30230. var prefix = '?';
  30231. if (lang_1.StringWrapper.contains(this.url, '?')) {
  30232. prefix = (this.url[this.url.length - 1] == '&') ? '' : '&';
  30233. }
  30234. // TODO: just delete search-query-looking string in url?
  30235. this.url = url + prefix + search;
  30236. }
  30237. }
  30238. this._body = requestOptions.body;
  30239. this.method = http_utils_1.normalizeMethodName(requestOptions.method);
  30240. // TODO(jeffbcross): implement behavior
  30241. // Defaults to 'omit', consistent with browser
  30242. // TODO(jeffbcross): implement behavior
  30243. this.headers = new headers_1.Headers(requestOptions.headers);
  30244. }
  30245. /**
  30246. * Returns the request's body as string, assuming that body exists. If body is undefined, return
  30247. * empty
  30248. * string.
  30249. */
  30250. Request.prototype.text = function () { return lang_1.isPresent(this._body) ? this._body.toString() : ''; };
  30251. return Request;
  30252. })();
  30253. exports.Request = Request;
  30254. /***/ },
  30255. /* 213 */
  30256. /***/ function(module, exports, __webpack_require__) {
  30257. var lang_1 = __webpack_require__(5);
  30258. var exceptions_1 = __webpack_require__(14);
  30259. var collection_1 = __webpack_require__(12);
  30260. /**
  30261. * Polyfill for [Headers](https://developer.mozilla.org/en-US/docs/Web/API/Headers/Headers), as
  30262. * specified in the [Fetch Spec](https://fetch.spec.whatwg.org/#headers-class).
  30263. *
  30264. * The only known difference between this `Headers` implementation and the spec is the
  30265. * lack of an `entries` method.
  30266. *
  30267. * ### Example ([live demo](http://plnkr.co/edit/MTdwT6?p=preview))
  30268. *
  30269. * ```
  30270. * import {Headers} from 'angular2/http';
  30271. *
  30272. * var firstHeaders = new Headers();
  30273. * firstHeaders.append('Content-Type', 'image/jpeg');
  30274. * console.log(firstHeaders.get('Content-Type')) //'image/jpeg'
  30275. *
  30276. * // Create headers from Plain Old JavaScript Object
  30277. * var secondHeaders = new Headers({
  30278. * 'X-My-Custom-Header': 'Angular'
  30279. * });
  30280. * console.log(secondHeaders.get('X-My-Custom-Header')); //'Angular'
  30281. *
  30282. * var thirdHeaders = new Headers(secondHeaders);
  30283. * console.log(thirdHeaders.get('X-My-Custom-Header')); //'Angular'
  30284. * ```
  30285. */
  30286. var Headers = (function () {
  30287. function Headers(headers) {
  30288. var _this = this;
  30289. if (headers instanceof Headers) {
  30290. this._headersMap = headers._headersMap;
  30291. return;
  30292. }
  30293. this._headersMap = new collection_1.Map();
  30294. if (lang_1.isBlank(headers)) {
  30295. return;
  30296. }
  30297. // headers instanceof StringMap
  30298. collection_1.StringMapWrapper.forEach(headers, function (v, k) { _this._headersMap.set(k, collection_1.isListLikeIterable(v) ? v : [v]); });
  30299. }
  30300. /**
  30301. * Returns a new Headers instance from the given DOMString of Response Headers
  30302. */
  30303. Headers.fromResponseHeaderString = function (headersString) {
  30304. return headersString.trim()
  30305. .split('\n')
  30306. .map(function (val) { return val.split(':'); })
  30307. .map(function (_a) {
  30308. var key = _a[0], parts = _a.slice(1);
  30309. return ([key.trim(), parts.join(':').trim()]);
  30310. })
  30311. .reduce(function (headers, _a) {
  30312. var key = _a[0], value = _a[1];
  30313. return !headers.set(key, value) && headers;
  30314. }, new Headers());
  30315. };
  30316. /**
  30317. * Appends a header to existing list of header values for a given header name.
  30318. */
  30319. Headers.prototype.append = function (name, value) {
  30320. var mapName = this._headersMap.get(name);
  30321. var list = collection_1.isListLikeIterable(mapName) ? mapName : [];
  30322. list.push(value);
  30323. this._headersMap.set(name, list);
  30324. };
  30325. /**
  30326. * Deletes all header values for the given name.
  30327. */
  30328. Headers.prototype.delete = function (name) { this._headersMap.delete(name); };
  30329. Headers.prototype.forEach = function (fn) {
  30330. this._headersMap.forEach(fn);
  30331. };
  30332. /**
  30333. * Returns first header that matches given name.
  30334. */
  30335. Headers.prototype.get = function (header) { return collection_1.ListWrapper.first(this._headersMap.get(header)); };
  30336. /**
  30337. * Check for existence of header by given name.
  30338. */
  30339. Headers.prototype.has = function (header) { return this._headersMap.has(header); };
  30340. /**
  30341. * Provides names of set headers
  30342. */
  30343. Headers.prototype.keys = function () { return collection_1.MapWrapper.keys(this._headersMap); };
  30344. /**
  30345. * Sets or overrides header value for given name.
  30346. */
  30347. Headers.prototype.set = function (header, value) {
  30348. var list = [];
  30349. if (collection_1.isListLikeIterable(value)) {
  30350. var pushValue = value.join(',');
  30351. list.push(pushValue);
  30352. }
  30353. else {
  30354. list.push(value);
  30355. }
  30356. this._headersMap.set(header, list);
  30357. };
  30358. /**
  30359. * Returns values of all headers.
  30360. */
  30361. Headers.prototype.values = function () { return collection_1.MapWrapper.values(this._headersMap); };
  30362. /**
  30363. * Returns string of all headers.
  30364. */
  30365. Headers.prototype.toJSON = function () { return lang_1.Json.stringify(this.values()); };
  30366. /**
  30367. * Returns list of header values for a given name.
  30368. */
  30369. Headers.prototype.getAll = function (header) {
  30370. var headers = this._headersMap.get(header);
  30371. return collection_1.isListLikeIterable(headers) ? headers : [];
  30372. };
  30373. /**
  30374. * This method is not implemented.
  30375. */
  30376. Headers.prototype.entries = function () { throw new exceptions_1.BaseException('"entries" method is not implemented on Headers class'); };
  30377. return Headers;
  30378. })();
  30379. exports.Headers = Headers;
  30380. /***/ },
  30381. /* 214 */
  30382. /***/ function(module, exports, __webpack_require__) {
  30383. var lang_1 = __webpack_require__(5);
  30384. var enums_1 = __webpack_require__(215);
  30385. var exceptions_1 = __webpack_require__(14);
  30386. function normalizeMethodName(method) {
  30387. if (lang_1.isString(method)) {
  30388. var originalMethod = method;
  30389. method = method.replace(/(\w)(\w*)/g, function (g0, g1, g2) { return g1.toUpperCase() + g2.toLowerCase(); });
  30390. method = enums_1.RequestMethod[method];
  30391. if (typeof method !== 'number')
  30392. throw exceptions_1.makeTypeError("Invalid request method. The method \"" + originalMethod + "\" is not supported.");
  30393. }
  30394. return method;
  30395. }
  30396. exports.normalizeMethodName = normalizeMethodName;
  30397. exports.isSuccess = function (status) { return (status >= 200 && status < 300); };
  30398. function getResponseURL(xhr) {
  30399. if ('responseURL' in xhr) {
  30400. return xhr.responseURL;
  30401. }
  30402. if (/^X-Request-URL:/m.test(xhr.getAllResponseHeaders())) {
  30403. return xhr.getResponseHeader('X-Request-URL');
  30404. }
  30405. return;
  30406. }
  30407. exports.getResponseURL = getResponseURL;
  30408. var lang_2 = __webpack_require__(5);
  30409. exports.isJsObject = lang_2.isJsObject;
  30410. /***/ },
  30411. /* 215 */
  30412. /***/ function(module, exports) {
  30413. /**
  30414. * Supported http methods.
  30415. */
  30416. (function (RequestMethod) {
  30417. RequestMethod[RequestMethod["Get"] = 0] = "Get";
  30418. RequestMethod[RequestMethod["Post"] = 1] = "Post";
  30419. RequestMethod[RequestMethod["Put"] = 2] = "Put";
  30420. RequestMethod[RequestMethod["Delete"] = 3] = "Delete";
  30421. RequestMethod[RequestMethod["Options"] = 4] = "Options";
  30422. RequestMethod[RequestMethod["Head"] = 5] = "Head";
  30423. RequestMethod[RequestMethod["Patch"] = 6] = "Patch";
  30424. })(exports.RequestMethod || (exports.RequestMethod = {}));
  30425. var RequestMethod = exports.RequestMethod;
  30426. /**
  30427. * All possible states in which a connection can be, based on
  30428. * [States](http://www.w3.org/TR/XMLHttpRequest/#states) from the `XMLHttpRequest` spec, but with an
  30429. * additional "CANCELLED" state.
  30430. */
  30431. (function (ReadyState) {
  30432. ReadyState[ReadyState["Unsent"] = 0] = "Unsent";
  30433. ReadyState[ReadyState["Open"] = 1] = "Open";
  30434. ReadyState[ReadyState["HeadersReceived"] = 2] = "HeadersReceived";
  30435. ReadyState[ReadyState["Loading"] = 3] = "Loading";
  30436. ReadyState[ReadyState["Done"] = 4] = "Done";
  30437. ReadyState[ReadyState["Cancelled"] = 5] = "Cancelled";
  30438. })(exports.ReadyState || (exports.ReadyState = {}));
  30439. var ReadyState = exports.ReadyState;
  30440. /**
  30441. * Acceptable response types to be associated with a {@link Response}, based on
  30442. * [ResponseType](https://fetch.spec.whatwg.org/#responsetype) from the Fetch spec.
  30443. */
  30444. (function (ResponseType) {
  30445. ResponseType[ResponseType["Basic"] = 0] = "Basic";
  30446. ResponseType[ResponseType["Cors"] = 1] = "Cors";
  30447. ResponseType[ResponseType["Default"] = 2] = "Default";
  30448. ResponseType[ResponseType["Error"] = 3] = "Error";
  30449. ResponseType[ResponseType["Opaque"] = 4] = "Opaque";
  30450. })(exports.ResponseType || (exports.ResponseType = {}));
  30451. var ResponseType = exports.ResponseType;
  30452. /***/ },
  30453. /* 216 */
  30454. /***/ function(module, exports, __webpack_require__) {
  30455. var __extends = (this && this.__extends) || function (d, b) {
  30456. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  30457. function __() { this.constructor = d; }
  30458. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  30459. };
  30460. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  30461. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  30462. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  30463. 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;
  30464. return c > 3 && r && Object.defineProperty(target, key, r), r;
  30465. };
  30466. var __metadata = (this && this.__metadata) || function (k, v) {
  30467. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  30468. };
  30469. var lang_1 = __webpack_require__(5);
  30470. var headers_1 = __webpack_require__(213);
  30471. var enums_1 = __webpack_require__(215);
  30472. var core_1 = __webpack_require__(2);
  30473. var url_search_params_1 = __webpack_require__(217);
  30474. var http_utils_1 = __webpack_require__(214);
  30475. /**
  30476. * Creates a request options object to be optionally provided when instantiating a
  30477. * {@link Request}.
  30478. *
  30479. * This class is based on the `RequestInit` description in the [Fetch
  30480. * Spec](https://fetch.spec.whatwg.org/#requestinit).
  30481. *
  30482. * All values are null by default. Typical defaults can be found in the {@link BaseRequestOptions}
  30483. * class, which sub-classes `RequestOptions`.
  30484. *
  30485. * ### Example ([live demo](http://plnkr.co/edit/7Wvi3lfLq41aQPKlxB4O?p=preview))
  30486. *
  30487. * ```typescript
  30488. * import {RequestOptions, Request, RequestMethod} from 'angular2/http';
  30489. *
  30490. * var options = new RequestOptions({
  30491. * method: RequestMethod.Post,
  30492. * url: 'https://google.com'
  30493. * });
  30494. * var req = new Request(options);
  30495. * console.log('req.method:', RequestMethod[req.method]); // Post
  30496. * console.log('options.url:', options.url); // https://google.com
  30497. * ```
  30498. */
  30499. var RequestOptions = (function () {
  30500. function RequestOptions(_a) {
  30501. var _b = _a === void 0 ? {} : _a, method = _b.method, headers = _b.headers, body = _b.body, url = _b.url, search = _b.search;
  30502. this.method = lang_1.isPresent(method) ? http_utils_1.normalizeMethodName(method) : null;
  30503. this.headers = lang_1.isPresent(headers) ? headers : null;
  30504. this.body = lang_1.isPresent(body) ? body : null;
  30505. this.url = lang_1.isPresent(url) ? url : null;
  30506. this.search = lang_1.isPresent(search) ? (lang_1.isString(search) ? new url_search_params_1.URLSearchParams((search)) :
  30507. (search)) :
  30508. null;
  30509. }
  30510. /**
  30511. * Creates a copy of the `RequestOptions` instance, using the optional input as values to override
  30512. * existing values. This method will not change the values of the instance on which it is being
  30513. * called.
  30514. *
  30515. * Note that `headers` and `search` will override existing values completely if present in
  30516. * the `options` object. If these values should be merged, it should be done prior to calling
  30517. * `merge` on the `RequestOptions` instance.
  30518. *
  30519. * ### Example ([live demo](http://plnkr.co/edit/6w8XA8YTkDRcPYpdB9dk?p=preview))
  30520. *
  30521. * ```typescript
  30522. * import {RequestOptions, Request, RequestMethod} from 'angular2/http';
  30523. *
  30524. * var options = new RequestOptions({
  30525. * method: RequestMethod.Post
  30526. * });
  30527. * var req = new Request(options.merge({
  30528. * url: 'https://google.com'
  30529. * }));
  30530. * console.log('req.method:', RequestMethod[req.method]); // Post
  30531. * console.log('options.url:', options.url); // null
  30532. * console.log('req.url:', req.url); // https://google.com
  30533. * ```
  30534. */
  30535. RequestOptions.prototype.merge = function (options) {
  30536. return new RequestOptions({
  30537. method: lang_1.isPresent(options) && lang_1.isPresent(options.method) ? options.method : this.method,
  30538. headers: lang_1.isPresent(options) && lang_1.isPresent(options.headers) ? options.headers : this.headers,
  30539. body: lang_1.isPresent(options) && lang_1.isPresent(options.body) ? options.body : this.body,
  30540. url: lang_1.isPresent(options) && lang_1.isPresent(options.url) ? options.url : this.url,
  30541. search: lang_1.isPresent(options) && lang_1.isPresent(options.search) ?
  30542. (lang_1.isString(options.search) ? new url_search_params_1.URLSearchParams((options.search)) :
  30543. (options.search).clone()) :
  30544. this.search
  30545. });
  30546. };
  30547. return RequestOptions;
  30548. })();
  30549. exports.RequestOptions = RequestOptions;
  30550. /**
  30551. * Subclass of {@link RequestOptions}, with default values.
  30552. *
  30553. * Default values:
  30554. * * method: {@link RequestMethod RequestMethod.Get}
  30555. * * headers: empty {@link Headers} object
  30556. *
  30557. * This class could be extended and bound to the {@link RequestOptions} class
  30558. * when configuring an {@link Injector}, in order to override the default options
  30559. * used by {@link Http} to create and send {@link Request Requests}.
  30560. *
  30561. * ### Example ([live demo](http://plnkr.co/edit/LEKVSx?p=preview))
  30562. *
  30563. * ```typescript
  30564. * import {provide} from 'angular2/core';
  30565. * import {bootstrap} from 'angular2/platform/browser';
  30566. * import {HTTP_PROVIDERS, Http, BaseRequestOptions, RequestOptions} from 'angular2/http';
  30567. * import {App} from './myapp';
  30568. *
  30569. * class MyOptions extends BaseRequestOptions {
  30570. * search: string = 'coreTeam=true';
  30571. * }
  30572. *
  30573. * bootstrap(App, [HTTP_PROVIDERS, provide(RequestOptions, {useClass: MyOptions})]);
  30574. * ```
  30575. *
  30576. * The options could also be extended when manually creating a {@link Request}
  30577. * object.
  30578. *
  30579. * ### Example ([live demo](http://plnkr.co/edit/oyBoEvNtDhOSfi9YxaVb?p=preview))
  30580. *
  30581. * ```
  30582. * import {BaseRequestOptions, Request, RequestMethod} from 'angular2/http';
  30583. *
  30584. * var options = new BaseRequestOptions();
  30585. * var req = new Request(options.merge({
  30586. * method: RequestMethod.Post,
  30587. * url: 'https://google.com'
  30588. * }));
  30589. * console.log('req.method:', RequestMethod[req.method]); // Post
  30590. * console.log('options.url:', options.url); // null
  30591. * console.log('req.url:', req.url); // https://google.com
  30592. * ```
  30593. */
  30594. var BaseRequestOptions = (function (_super) {
  30595. __extends(BaseRequestOptions, _super);
  30596. function BaseRequestOptions() {
  30597. _super.call(this, { method: enums_1.RequestMethod.Get, headers: new headers_1.Headers() });
  30598. }
  30599. BaseRequestOptions = __decorate([
  30600. core_1.Injectable(),
  30601. __metadata('design:paramtypes', [])
  30602. ], BaseRequestOptions);
  30603. return BaseRequestOptions;
  30604. })(RequestOptions);
  30605. exports.BaseRequestOptions = BaseRequestOptions;
  30606. /***/ },
  30607. /* 217 */
  30608. /***/ function(module, exports, __webpack_require__) {
  30609. var lang_1 = __webpack_require__(5);
  30610. var collection_1 = __webpack_require__(12);
  30611. function paramParser(rawParams) {
  30612. if (rawParams === void 0) { rawParams = ''; }
  30613. var map = new collection_1.Map();
  30614. if (rawParams.length > 0) {
  30615. var params = rawParams.split('&');
  30616. params.forEach(function (param) {
  30617. var split = param.split('=');
  30618. var key = split[0];
  30619. var val = split[1];
  30620. var list = lang_1.isPresent(map.get(key)) ? map.get(key) : [];
  30621. list.push(val);
  30622. map.set(key, list);
  30623. });
  30624. }
  30625. return map;
  30626. }
  30627. /**
  30628. * Map-like representation of url search parameters, based on
  30629. * [URLSearchParams](https://url.spec.whatwg.org/#urlsearchparams) in the url living standard,
  30630. * with several extensions for merging URLSearchParams objects:
  30631. * - setAll()
  30632. * - appendAll()
  30633. * - replaceAll()
  30634. */
  30635. var URLSearchParams = (function () {
  30636. function URLSearchParams(rawParams) {
  30637. if (rawParams === void 0) { rawParams = ''; }
  30638. this.rawParams = rawParams;
  30639. this.paramsMap = paramParser(rawParams);
  30640. }
  30641. URLSearchParams.prototype.clone = function () {
  30642. var clone = new URLSearchParams();
  30643. clone.appendAll(this);
  30644. return clone;
  30645. };
  30646. URLSearchParams.prototype.has = function (param) { return this.paramsMap.has(param); };
  30647. URLSearchParams.prototype.get = function (param) {
  30648. var storedParam = this.paramsMap.get(param);
  30649. if (collection_1.isListLikeIterable(storedParam)) {
  30650. return collection_1.ListWrapper.first(storedParam);
  30651. }
  30652. else {
  30653. return null;
  30654. }
  30655. };
  30656. URLSearchParams.prototype.getAll = function (param) {
  30657. var mapParam = this.paramsMap.get(param);
  30658. return lang_1.isPresent(mapParam) ? mapParam : [];
  30659. };
  30660. URLSearchParams.prototype.set = function (param, val) {
  30661. var mapParam = this.paramsMap.get(param);
  30662. var list = lang_1.isPresent(mapParam) ? mapParam : [];
  30663. collection_1.ListWrapper.clear(list);
  30664. list.push(val);
  30665. this.paramsMap.set(param, list);
  30666. };
  30667. // A merge operation
  30668. // For each name-values pair in `searchParams`, perform `set(name, values[0])`
  30669. //
  30670. // E.g: "a=[1,2,3], c=[8]" + "a=[4,5,6], b=[7]" = "a=[4], c=[8], b=[7]"
  30671. //
  30672. // TODO(@caitp): document this better
  30673. URLSearchParams.prototype.setAll = function (searchParams) {
  30674. var _this = this;
  30675. searchParams.paramsMap.forEach(function (value, param) {
  30676. var mapParam = _this.paramsMap.get(param);
  30677. var list = lang_1.isPresent(mapParam) ? mapParam : [];
  30678. collection_1.ListWrapper.clear(list);
  30679. list.push(value[0]);
  30680. _this.paramsMap.set(param, list);
  30681. });
  30682. };
  30683. URLSearchParams.prototype.append = function (param, val) {
  30684. var mapParam = this.paramsMap.get(param);
  30685. var list = lang_1.isPresent(mapParam) ? mapParam : [];
  30686. list.push(val);
  30687. this.paramsMap.set(param, list);
  30688. };
  30689. // A merge operation
  30690. // For each name-values pair in `searchParams`, perform `append(name, value)`
  30691. // for each value in `values`.
  30692. //
  30693. // E.g: "a=[1,2], c=[8]" + "a=[3,4], b=[7]" = "a=[1,2,3,4], c=[8], b=[7]"
  30694. //
  30695. // TODO(@caitp): document this better
  30696. URLSearchParams.prototype.appendAll = function (searchParams) {
  30697. var _this = this;
  30698. searchParams.paramsMap.forEach(function (value, param) {
  30699. var mapParam = _this.paramsMap.get(param);
  30700. var list = lang_1.isPresent(mapParam) ? mapParam : [];
  30701. for (var i = 0; i < value.length; ++i) {
  30702. list.push(value[i]);
  30703. }
  30704. _this.paramsMap.set(param, list);
  30705. });
  30706. };
  30707. // A merge operation
  30708. // For each name-values pair in `searchParams`, perform `delete(name)`,
  30709. // followed by `set(name, values)`
  30710. //
  30711. // E.g: "a=[1,2,3], c=[8]" + "a=[4,5,6], b=[7]" = "a=[4,5,6], c=[8], b=[7]"
  30712. //
  30713. // TODO(@caitp): document this better
  30714. URLSearchParams.prototype.replaceAll = function (searchParams) {
  30715. var _this = this;
  30716. searchParams.paramsMap.forEach(function (value, param) {
  30717. var mapParam = _this.paramsMap.get(param);
  30718. var list = lang_1.isPresent(mapParam) ? mapParam : [];
  30719. collection_1.ListWrapper.clear(list);
  30720. for (var i = 0; i < value.length; ++i) {
  30721. list.push(value[i]);
  30722. }
  30723. _this.paramsMap.set(param, list);
  30724. });
  30725. };
  30726. URLSearchParams.prototype.toString = function () {
  30727. var paramsList = [];
  30728. this.paramsMap.forEach(function (values, k) { values.forEach(function (v) { return paramsList.push(k + '=' + v); }); });
  30729. return paramsList.join('&');
  30730. };
  30731. URLSearchParams.prototype.delete = function (param) { this.paramsMap.delete(param); };
  30732. return URLSearchParams;
  30733. })();
  30734. exports.URLSearchParams = URLSearchParams;
  30735. /***/ },
  30736. /* 218 */
  30737. /***/ function(module, exports, __webpack_require__) {
  30738. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  30739. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  30740. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  30741. 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;
  30742. return c > 3 && r && Object.defineProperty(target, key, r), r;
  30743. };
  30744. var __metadata = (this && this.__metadata) || function (k, v) {
  30745. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  30746. };
  30747. var enums_1 = __webpack_require__(215);
  30748. var static_response_1 = __webpack_require__(219);
  30749. var headers_1 = __webpack_require__(213);
  30750. var base_response_options_1 = __webpack_require__(220);
  30751. var core_1 = __webpack_require__(2);
  30752. var browser_xhr_1 = __webpack_require__(221);
  30753. var lang_1 = __webpack_require__(5);
  30754. var Observable_1 = __webpack_require__(62);
  30755. var http_utils_1 = __webpack_require__(214);
  30756. /**
  30757. * Creates connections using `XMLHttpRequest`. Given a fully-qualified
  30758. * request, an `XHRConnection` will immediately create an `XMLHttpRequest` object and send the
  30759. * request.
  30760. *
  30761. * This class would typically not be created or interacted with directly inside applications, though
  30762. * the {@link MockConnection} may be interacted with in tests.
  30763. */
  30764. var XHRConnection = (function () {
  30765. function XHRConnection(req, browserXHR, baseResponseOptions) {
  30766. var _this = this;
  30767. this.request = req;
  30768. this.response = new Observable_1.Observable(function (responseObserver) {
  30769. var _xhr = browserXHR.build();
  30770. _xhr.open(enums_1.RequestMethod[req.method].toUpperCase(), req.url);
  30771. // load event handler
  30772. var onLoad = function () {
  30773. // responseText is the old-school way of retrieving response (supported by IE8 & 9)
  30774. // response/responseType properties were introduced in XHR Level2 spec (supported by
  30775. // IE10)
  30776. var body = lang_1.isPresent(_xhr.response) ? _xhr.response : _xhr.responseText;
  30777. var headers = headers_1.Headers.fromResponseHeaderString(_xhr.getAllResponseHeaders());
  30778. var url = http_utils_1.getResponseURL(_xhr);
  30779. // normalize IE9 bug (http://bugs.jquery.com/ticket/1450)
  30780. var status = _xhr.status === 1223 ? 204 : _xhr.status;
  30781. // fix status code when it is 0 (0 status is undocumented).
  30782. // Occurs when accessing file resources or on Android 4.1 stock browser
  30783. // while retrieving files from application cache.
  30784. if (status === 0) {
  30785. status = body ? 200 : 0;
  30786. }
  30787. var responseOptions = new base_response_options_1.ResponseOptions({ body: body, status: status, headers: headers, url: url });
  30788. if (lang_1.isPresent(baseResponseOptions)) {
  30789. responseOptions = baseResponseOptions.merge(responseOptions);
  30790. }
  30791. var response = new static_response_1.Response(responseOptions);
  30792. if (http_utils_1.isSuccess(status)) {
  30793. responseObserver.next(response);
  30794. // TODO(gdi2290): defer complete if array buffer until done
  30795. responseObserver.complete();
  30796. return;
  30797. }
  30798. responseObserver.error(response);
  30799. };
  30800. // error event handler
  30801. var onError = function (err) {
  30802. var responseOptions = new base_response_options_1.ResponseOptions({ body: err, type: enums_1.ResponseType.Error });
  30803. if (lang_1.isPresent(baseResponseOptions)) {
  30804. responseOptions = baseResponseOptions.merge(responseOptions);
  30805. }
  30806. responseObserver.error(new static_response_1.Response(responseOptions));
  30807. };
  30808. if (lang_1.isPresent(req.headers)) {
  30809. req.headers.forEach(function (values, name) { return _xhr.setRequestHeader(name, values.join(',')); });
  30810. }
  30811. _xhr.addEventListener('load', onLoad);
  30812. _xhr.addEventListener('error', onError);
  30813. _xhr.send(_this.request.text());
  30814. return function () {
  30815. _xhr.removeEventListener('load', onLoad);
  30816. _xhr.removeEventListener('error', onError);
  30817. _xhr.abort();
  30818. };
  30819. });
  30820. }
  30821. return XHRConnection;
  30822. })();
  30823. exports.XHRConnection = XHRConnection;
  30824. /**
  30825. * Creates {@link XHRConnection} instances.
  30826. *
  30827. * This class would typically not be used by end users, but could be
  30828. * overridden if a different backend implementation should be used,
  30829. * such as in a node backend.
  30830. *
  30831. * ### Example
  30832. *
  30833. * ```
  30834. * import {Http, MyNodeBackend, HTTP_PROVIDERS, BaseRequestOptions} from 'angular2/http';
  30835. * @Component({
  30836. * viewProviders: [
  30837. * HTTP_PROVIDERS,
  30838. * provide(Http, {useFactory: (backend, options) => {
  30839. * return new Http(backend, options);
  30840. * }, deps: [MyNodeBackend, BaseRequestOptions]})]
  30841. * })
  30842. * class MyComponent {
  30843. * constructor(http:Http) {
  30844. * http.request('people.json').subscribe(res => this.people = res.json());
  30845. * }
  30846. * }
  30847. * ```
  30848. *
  30849. **/
  30850. var XHRBackend = (function () {
  30851. function XHRBackend(_browserXHR, _baseResponseOptions) {
  30852. this._browserXHR = _browserXHR;
  30853. this._baseResponseOptions = _baseResponseOptions;
  30854. }
  30855. XHRBackend.prototype.createConnection = function (request) {
  30856. return new XHRConnection(request, this._browserXHR, this._baseResponseOptions);
  30857. };
  30858. XHRBackend = __decorate([
  30859. core_1.Injectable(),
  30860. __metadata('design:paramtypes', [browser_xhr_1.BrowserXhr, base_response_options_1.ResponseOptions])
  30861. ], XHRBackend);
  30862. return XHRBackend;
  30863. })();
  30864. exports.XHRBackend = XHRBackend;
  30865. /***/ },
  30866. /* 219 */
  30867. /***/ function(module, exports, __webpack_require__) {
  30868. var lang_1 = __webpack_require__(5);
  30869. var exceptions_1 = __webpack_require__(14);
  30870. var http_utils_1 = __webpack_require__(214);
  30871. /**
  30872. * Creates `Response` instances from provided values.
  30873. *
  30874. * Though this object isn't
  30875. * usually instantiated by end-users, it is the primary object interacted with when it comes time to
  30876. * add data to a view.
  30877. *
  30878. * ### Example
  30879. *
  30880. * ```
  30881. * http.request('my-friends.txt').subscribe(response => this.friends = response.text());
  30882. * ```
  30883. *
  30884. * The Response's interface is inspired by the Response constructor defined in the [Fetch
  30885. * Spec](https://fetch.spec.whatwg.org/#response-class), but is considered a static value whose body
  30886. * can be accessed many times. There are other differences in the implementation, but this is the
  30887. * most significant.
  30888. */
  30889. var Response = (function () {
  30890. function Response(responseOptions) {
  30891. this._body = responseOptions.body;
  30892. this.status = responseOptions.status;
  30893. this.statusText = responseOptions.statusText;
  30894. this.headers = responseOptions.headers;
  30895. this.type = responseOptions.type;
  30896. this.url = responseOptions.url;
  30897. }
  30898. /**
  30899. * Not yet implemented
  30900. */
  30901. // TODO: Blob return type
  30902. Response.prototype.blob = function () { throw new exceptions_1.BaseException('"blob()" method not implemented on Response superclass'); };
  30903. /**
  30904. * Attempts to return body as parsed `JSON` object, or raises an exception.
  30905. */
  30906. Response.prototype.json = function () {
  30907. var jsonResponse;
  30908. if (http_utils_1.isJsObject(this._body)) {
  30909. jsonResponse = this._body;
  30910. }
  30911. else if (lang_1.isString(this._body)) {
  30912. jsonResponse = lang_1.Json.parse(this._body);
  30913. }
  30914. return jsonResponse;
  30915. };
  30916. /**
  30917. * Returns the body as a string, presuming `toString()` can be called on the response body.
  30918. */
  30919. Response.prototype.text = function () { return this._body.toString(); };
  30920. /**
  30921. * Not yet implemented
  30922. */
  30923. // TODO: ArrayBuffer return type
  30924. Response.prototype.arrayBuffer = function () {
  30925. throw new exceptions_1.BaseException('"arrayBuffer()" method not implemented on Response superclass');
  30926. };
  30927. return Response;
  30928. })();
  30929. exports.Response = Response;
  30930. /***/ },
  30931. /* 220 */
  30932. /***/ function(module, exports, __webpack_require__) {
  30933. var __extends = (this && this.__extends) || function (d, b) {
  30934. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  30935. function __() { this.constructor = d; }
  30936. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  30937. };
  30938. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  30939. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  30940. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  30941. 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;
  30942. return c > 3 && r && Object.defineProperty(target, key, r), r;
  30943. };
  30944. var __metadata = (this && this.__metadata) || function (k, v) {
  30945. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  30946. };
  30947. var core_1 = __webpack_require__(2);
  30948. var lang_1 = __webpack_require__(5);
  30949. var headers_1 = __webpack_require__(213);
  30950. var enums_1 = __webpack_require__(215);
  30951. /**
  30952. * Creates a response options object to be optionally provided when instantiating a
  30953. * {@link Response}.
  30954. *
  30955. * This class is based on the `ResponseInit` description in the [Fetch
  30956. * Spec](https://fetch.spec.whatwg.org/#responseinit).
  30957. *
  30958. * All values are null by default. Typical defaults can be found in the
  30959. * {@link BaseResponseOptions} class, which sub-classes `ResponseOptions`.
  30960. *
  30961. * This class may be used in tests to build {@link Response Responses} for
  30962. * mock responses (see {@link MockBackend}).
  30963. *
  30964. * ### Example ([live demo](http://plnkr.co/edit/P9Jkk8e8cz6NVzbcxEsD?p=preview))
  30965. *
  30966. * ```typescript
  30967. * import {ResponseOptions, Response} from 'angular2/http';
  30968. *
  30969. * var options = new ResponseOptions({
  30970. * body: '{"name":"Jeff"}'
  30971. * });
  30972. * var res = new Response(options);
  30973. *
  30974. * console.log('res.json():', res.json()); // Object {name: "Jeff"}
  30975. * ```
  30976. */
  30977. var ResponseOptions = (function () {
  30978. function ResponseOptions(_a) {
  30979. var _b = _a === void 0 ? {} : _a, body = _b.body, status = _b.status, headers = _b.headers, statusText = _b.statusText, type = _b.type, url = _b.url;
  30980. this.body = lang_1.isPresent(body) ? body : null;
  30981. this.status = lang_1.isPresent(status) ? status : null;
  30982. this.headers = lang_1.isPresent(headers) ? headers : null;
  30983. this.statusText = lang_1.isPresent(statusText) ? statusText : null;
  30984. this.type = lang_1.isPresent(type) ? type : null;
  30985. this.url = lang_1.isPresent(url) ? url : null;
  30986. }
  30987. /**
  30988. * Creates a copy of the `ResponseOptions` instance, using the optional input as values to
  30989. * override
  30990. * existing values. This method will not change the values of the instance on which it is being
  30991. * called.
  30992. *
  30993. * This may be useful when sharing a base `ResponseOptions` object inside tests,
  30994. * where certain properties may change from test to test.
  30995. *
  30996. * ### Example ([live demo](http://plnkr.co/edit/1lXquqFfgduTFBWjNoRE?p=preview))
  30997. *
  30998. * ```typescript
  30999. * import {ResponseOptions, Response} from 'angular2/http';
  31000. *
  31001. * var options = new ResponseOptions({
  31002. * body: {name: 'Jeff'}
  31003. * });
  31004. * var res = new Response(options.merge({
  31005. * url: 'https://google.com'
  31006. * }));
  31007. * console.log('options.url:', options.url); // null
  31008. * console.log('res.json():', res.json()); // Object {name: "Jeff"}
  31009. * console.log('res.url:', res.url); // https://google.com
  31010. * ```
  31011. */
  31012. ResponseOptions.prototype.merge = function (options) {
  31013. return new ResponseOptions({
  31014. body: lang_1.isPresent(options) && lang_1.isPresent(options.body) ? options.body : this.body,
  31015. status: lang_1.isPresent(options) && lang_1.isPresent(options.status) ? options.status : this.status,
  31016. headers: lang_1.isPresent(options) && lang_1.isPresent(options.headers) ? options.headers : this.headers,
  31017. statusText: lang_1.isPresent(options) && lang_1.isPresent(options.statusText) ? options.statusText :
  31018. this.statusText,
  31019. type: lang_1.isPresent(options) && lang_1.isPresent(options.type) ? options.type : this.type,
  31020. url: lang_1.isPresent(options) && lang_1.isPresent(options.url) ? options.url : this.url,
  31021. });
  31022. };
  31023. return ResponseOptions;
  31024. })();
  31025. exports.ResponseOptions = ResponseOptions;
  31026. /**
  31027. * Subclass of {@link ResponseOptions}, with default values.
  31028. *
  31029. * Default values:
  31030. * * status: 200
  31031. * * headers: empty {@link Headers} object
  31032. *
  31033. * This class could be extended and bound to the {@link ResponseOptions} class
  31034. * when configuring an {@link Injector}, in order to override the default options
  31035. * used by {@link Http} to create {@link Response Responses}.
  31036. *
  31037. * ### Example ([live demo](http://plnkr.co/edit/qv8DLT?p=preview))
  31038. *
  31039. * ```typescript
  31040. * import {provide} from 'angular2/core';
  31041. * import {bootstrap} from 'angular2/platform/browser';
  31042. * import {HTTP_PROVIDERS, Headers, Http, BaseResponseOptions, ResponseOptions} from
  31043. * 'angular2/http';
  31044. * import {App} from './myapp';
  31045. *
  31046. * class MyOptions extends BaseResponseOptions {
  31047. * headers:Headers = new Headers({network: 'github'});
  31048. * }
  31049. *
  31050. * bootstrap(App, [HTTP_PROVIDERS, provide(ResponseOptions, {useClass: MyOptions})]);
  31051. * ```
  31052. *
  31053. * The options could also be extended when manually creating a {@link Response}
  31054. * object.
  31055. *
  31056. * ### Example ([live demo](http://plnkr.co/edit/VngosOWiaExEtbstDoix?p=preview))
  31057. *
  31058. * ```
  31059. * import {BaseResponseOptions, Response} from 'angular2/http';
  31060. *
  31061. * var options = new BaseResponseOptions();
  31062. * var res = new Response(options.merge({
  31063. * body: 'Angular2',
  31064. * headers: new Headers({framework: 'angular'})
  31065. * }));
  31066. * console.log('res.headers.get("framework"):', res.headers.get('framework')); // angular
  31067. * console.log('res.text():', res.text()); // Angular2;
  31068. * ```
  31069. */
  31070. var BaseResponseOptions = (function (_super) {
  31071. __extends(BaseResponseOptions, _super);
  31072. function BaseResponseOptions() {
  31073. _super.call(this, { status: 200, statusText: 'Ok', type: enums_1.ResponseType.Default, headers: new headers_1.Headers() });
  31074. }
  31075. BaseResponseOptions = __decorate([
  31076. core_1.Injectable(),
  31077. __metadata('design:paramtypes', [])
  31078. ], BaseResponseOptions);
  31079. return BaseResponseOptions;
  31080. })(ResponseOptions);
  31081. exports.BaseResponseOptions = BaseResponseOptions;
  31082. /***/ },
  31083. /* 221 */
  31084. /***/ function(module, exports, __webpack_require__) {
  31085. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  31086. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  31087. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  31088. 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;
  31089. return c > 3 && r && Object.defineProperty(target, key, r), r;
  31090. };
  31091. var __metadata = (this && this.__metadata) || function (k, v) {
  31092. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  31093. };
  31094. var core_1 = __webpack_require__(2);
  31095. /**
  31096. * A backend for http that uses the `XMLHttpRequest` browser API.
  31097. *
  31098. * Take care not to evaluate this in non-browser contexts.
  31099. */
  31100. var BrowserXhr = (function () {
  31101. function BrowserXhr() {
  31102. }
  31103. BrowserXhr.prototype.build = function () { return (new XMLHttpRequest()); };
  31104. BrowserXhr = __decorate([
  31105. core_1.Injectable(),
  31106. __metadata('design:paramtypes', [])
  31107. ], BrowserXhr);
  31108. return BrowserXhr;
  31109. })();
  31110. exports.BrowserXhr = BrowserXhr;
  31111. /***/ },
  31112. /* 222 */
  31113. /***/ function(module, exports, __webpack_require__) {
  31114. var __extends = (this && this.__extends) || function (d, b) {
  31115. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  31116. function __() { this.constructor = d; }
  31117. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  31118. };
  31119. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  31120. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  31121. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  31122. 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;
  31123. return c > 3 && r && Object.defineProperty(target, key, r), r;
  31124. };
  31125. var __metadata = (this && this.__metadata) || function (k, v) {
  31126. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  31127. };
  31128. var interfaces_1 = __webpack_require__(211);
  31129. var enums_1 = __webpack_require__(215);
  31130. var static_response_1 = __webpack_require__(219);
  31131. var base_response_options_1 = __webpack_require__(220);
  31132. var core_1 = __webpack_require__(2);
  31133. var browser_jsonp_1 = __webpack_require__(223);
  31134. var exceptions_1 = __webpack_require__(14);
  31135. var lang_1 = __webpack_require__(5);
  31136. var Observable_1 = __webpack_require__(62);
  31137. var JSONP_ERR_NO_CALLBACK = 'JSONP injected script did not invoke callback.';
  31138. var JSONP_ERR_WRONG_METHOD = 'JSONP requests must use GET request method.';
  31139. /**
  31140. * Abstract base class for an in-flight JSONP request.
  31141. */
  31142. var JSONPConnection = (function () {
  31143. function JSONPConnection() {
  31144. }
  31145. return JSONPConnection;
  31146. })();
  31147. exports.JSONPConnection = JSONPConnection;
  31148. var JSONPConnection_ = (function (_super) {
  31149. __extends(JSONPConnection_, _super);
  31150. function JSONPConnection_(req, _dom, baseResponseOptions) {
  31151. var _this = this;
  31152. _super.call(this);
  31153. this._dom = _dom;
  31154. this.baseResponseOptions = baseResponseOptions;
  31155. this._finished = false;
  31156. if (req.method !== enums_1.RequestMethod.Get) {
  31157. throw exceptions_1.makeTypeError(JSONP_ERR_WRONG_METHOD);
  31158. }
  31159. this.request = req;
  31160. this.response = new Observable_1.Observable(function (responseObserver) {
  31161. _this.readyState = enums_1.ReadyState.Loading;
  31162. var id = _this._id = _dom.nextRequestID();
  31163. _dom.exposeConnection(id, _this);
  31164. // Workaround Dart
  31165. // url = url.replace(/=JSONP_CALLBACK(&|$)/, `generated method`);
  31166. var callback = _dom.requestCallback(_this._id);
  31167. var url = req.url;
  31168. if (url.indexOf('=JSONP_CALLBACK&') > -1) {
  31169. url = lang_1.StringWrapper.replace(url, '=JSONP_CALLBACK&', "=" + callback + "&");
  31170. }
  31171. else if (url.lastIndexOf('=JSONP_CALLBACK') === url.length - '=JSONP_CALLBACK'.length) {
  31172. url = url.substring(0, url.length - '=JSONP_CALLBACK'.length) + ("=" + callback);
  31173. }
  31174. var script = _this._script = _dom.build(url);
  31175. var onLoad = function (event) {
  31176. if (_this.readyState === enums_1.ReadyState.Cancelled)
  31177. return;
  31178. _this.readyState = enums_1.ReadyState.Done;
  31179. _dom.cleanup(script);
  31180. if (!_this._finished) {
  31181. var responseOptions_1 = new base_response_options_1.ResponseOptions({ body: JSONP_ERR_NO_CALLBACK, type: enums_1.ResponseType.Error, url: url });
  31182. if (lang_1.isPresent(baseResponseOptions)) {
  31183. responseOptions_1 = baseResponseOptions.merge(responseOptions_1);
  31184. }
  31185. responseObserver.error(new static_response_1.Response(responseOptions_1));
  31186. return;
  31187. }
  31188. var responseOptions = new base_response_options_1.ResponseOptions({ body: _this._responseData, url: url });
  31189. if (lang_1.isPresent(_this.baseResponseOptions)) {
  31190. responseOptions = _this.baseResponseOptions.merge(responseOptions);
  31191. }
  31192. responseObserver.next(new static_response_1.Response(responseOptions));
  31193. responseObserver.complete();
  31194. };
  31195. var onError = function (error) {
  31196. if (_this.readyState === enums_1.ReadyState.Cancelled)
  31197. return;
  31198. _this.readyState = enums_1.ReadyState.Done;
  31199. _dom.cleanup(script);
  31200. var responseOptions = new base_response_options_1.ResponseOptions({ body: error.message, type: enums_1.ResponseType.Error });
  31201. if (lang_1.isPresent(baseResponseOptions)) {
  31202. responseOptions = baseResponseOptions.merge(responseOptions);
  31203. }
  31204. responseObserver.error(new static_response_1.Response(responseOptions));
  31205. };
  31206. script.addEventListener('load', onLoad);
  31207. script.addEventListener('error', onError);
  31208. _dom.send(script);
  31209. return function () {
  31210. _this.readyState = enums_1.ReadyState.Cancelled;
  31211. script.removeEventListener('load', onLoad);
  31212. script.removeEventListener('error', onError);
  31213. if (lang_1.isPresent(script)) {
  31214. _this._dom.cleanup(script);
  31215. }
  31216. };
  31217. });
  31218. }
  31219. JSONPConnection_.prototype.finished = function (data) {
  31220. // Don't leak connections
  31221. this._finished = true;
  31222. this._dom.removeConnection(this._id);
  31223. if (this.readyState === enums_1.ReadyState.Cancelled)
  31224. return;
  31225. this._responseData = data;
  31226. };
  31227. return JSONPConnection_;
  31228. })(JSONPConnection);
  31229. exports.JSONPConnection_ = JSONPConnection_;
  31230. /**
  31231. * A {@link ConnectionBackend} that uses the JSONP strategy of making requests.
  31232. */
  31233. var JSONPBackend = (function (_super) {
  31234. __extends(JSONPBackend, _super);
  31235. function JSONPBackend() {
  31236. _super.apply(this, arguments);
  31237. }
  31238. return JSONPBackend;
  31239. })(interfaces_1.ConnectionBackend);
  31240. exports.JSONPBackend = JSONPBackend;
  31241. var JSONPBackend_ = (function (_super) {
  31242. __extends(JSONPBackend_, _super);
  31243. function JSONPBackend_(_browserJSONP, _baseResponseOptions) {
  31244. _super.call(this);
  31245. this._browserJSONP = _browserJSONP;
  31246. this._baseResponseOptions = _baseResponseOptions;
  31247. }
  31248. JSONPBackend_.prototype.createConnection = function (request) {
  31249. return new JSONPConnection_(request, this._browserJSONP, this._baseResponseOptions);
  31250. };
  31251. JSONPBackend_ = __decorate([
  31252. core_1.Injectable(),
  31253. __metadata('design:paramtypes', [browser_jsonp_1.BrowserJsonp, base_response_options_1.ResponseOptions])
  31254. ], JSONPBackend_);
  31255. return JSONPBackend_;
  31256. })(JSONPBackend);
  31257. exports.JSONPBackend_ = JSONPBackend_;
  31258. /***/ },
  31259. /* 223 */
  31260. /***/ function(module, exports, __webpack_require__) {
  31261. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  31262. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  31263. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  31264. 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;
  31265. return c > 3 && r && Object.defineProperty(target, key, r), r;
  31266. };
  31267. var __metadata = (this && this.__metadata) || function (k, v) {
  31268. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  31269. };
  31270. var core_1 = __webpack_require__(2);
  31271. var lang_1 = __webpack_require__(5);
  31272. var _nextRequestId = 0;
  31273. exports.JSONP_HOME = '__ng_jsonp__';
  31274. var _jsonpConnections = null;
  31275. function _getJsonpConnections() {
  31276. if (_jsonpConnections === null) {
  31277. _jsonpConnections = lang_1.global[exports.JSONP_HOME] = {};
  31278. }
  31279. return _jsonpConnections;
  31280. }
  31281. // Make sure not to evaluate this in a non-browser environment!
  31282. var BrowserJsonp = (function () {
  31283. function BrowserJsonp() {
  31284. }
  31285. // Construct a <script> element with the specified URL
  31286. BrowserJsonp.prototype.build = function (url) {
  31287. var node = document.createElement('script');
  31288. node.src = url;
  31289. return node;
  31290. };
  31291. BrowserJsonp.prototype.nextRequestID = function () { return "__req" + _nextRequestId++; };
  31292. BrowserJsonp.prototype.requestCallback = function (id) { return exports.JSONP_HOME + "." + id + ".finished"; };
  31293. BrowserJsonp.prototype.exposeConnection = function (id, connection) {
  31294. var connections = _getJsonpConnections();
  31295. connections[id] = connection;
  31296. };
  31297. BrowserJsonp.prototype.removeConnection = function (id) {
  31298. var connections = _getJsonpConnections();
  31299. connections[id] = null;
  31300. };
  31301. // Attach the <script> element to the DOM
  31302. BrowserJsonp.prototype.send = function (node) { document.body.appendChild((node)); };
  31303. // Remove <script> element from the DOM
  31304. BrowserJsonp.prototype.cleanup = function (node) {
  31305. if (node.parentNode) {
  31306. node.parentNode.removeChild((node));
  31307. }
  31308. };
  31309. BrowserJsonp = __decorate([
  31310. core_1.Injectable(),
  31311. __metadata('design:paramtypes', [])
  31312. ], BrowserJsonp);
  31313. return BrowserJsonp;
  31314. })();
  31315. exports.BrowserJsonp = BrowserJsonp;
  31316. /***/ },
  31317. /* 224 */
  31318. /***/ function(module, exports, __webpack_require__) {
  31319. /**
  31320. * @module
  31321. * @description
  31322. * Maps application URLs into application states, to support deep-linking and navigation.
  31323. */
  31324. function __export(m) {
  31325. for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
  31326. }
  31327. var router_1 = __webpack_require__(225);
  31328. exports.Router = router_1.Router;
  31329. var router_outlet_1 = __webpack_require__(241);
  31330. exports.RouterOutlet = router_outlet_1.RouterOutlet;
  31331. var router_link_1 = __webpack_require__(243);
  31332. exports.RouterLink = router_link_1.RouterLink;
  31333. var instruction_1 = __webpack_require__(229);
  31334. exports.RouteParams = instruction_1.RouteParams;
  31335. exports.RouteData = instruction_1.RouteData;
  31336. var platform_location_1 = __webpack_require__(244);
  31337. exports.PlatformLocation = platform_location_1.PlatformLocation;
  31338. var route_registry_1 = __webpack_require__(226);
  31339. exports.RouteRegistry = route_registry_1.RouteRegistry;
  31340. exports.ROUTER_PRIMARY_COMPONENT = route_registry_1.ROUTER_PRIMARY_COMPONENT;
  31341. var location_strategy_1 = __webpack_require__(238);
  31342. exports.LocationStrategy = location_strategy_1.LocationStrategy;
  31343. exports.APP_BASE_HREF = location_strategy_1.APP_BASE_HREF;
  31344. var hash_location_strategy_1 = __webpack_require__(245);
  31345. exports.HashLocationStrategy = hash_location_strategy_1.HashLocationStrategy;
  31346. var path_location_strategy_1 = __webpack_require__(246);
  31347. exports.PathLocationStrategy = path_location_strategy_1.PathLocationStrategy;
  31348. var location_1 = __webpack_require__(237);
  31349. exports.Location = location_1.Location;
  31350. __export(__webpack_require__(236));
  31351. __export(__webpack_require__(247));
  31352. var lifecycle_annotations_1 = __webpack_require__(242);
  31353. exports.CanActivate = lifecycle_annotations_1.CanActivate;
  31354. var instruction_2 = __webpack_require__(229);
  31355. exports.Instruction = instruction_2.Instruction;
  31356. exports.ComponentInstruction = instruction_2.ComponentInstruction;
  31357. var core_1 = __webpack_require__(2);
  31358. exports.OpaqueToken = core_1.OpaqueToken;
  31359. var platform_location_2 = __webpack_require__(244);
  31360. var location_strategy_2 = __webpack_require__(238);
  31361. var path_location_strategy_2 = __webpack_require__(246);
  31362. var router_2 = __webpack_require__(225);
  31363. var router_outlet_2 = __webpack_require__(241);
  31364. var router_link_2 = __webpack_require__(243);
  31365. var route_registry_2 = __webpack_require__(226);
  31366. var location_2 = __webpack_require__(237);
  31367. var core_2 = __webpack_require__(2);
  31368. var lang_1 = __webpack_require__(5);
  31369. var exceptions_1 = __webpack_require__(14);
  31370. /**
  31371. * A list of directives. To use the router directives like {@link RouterOutlet} and
  31372. * {@link RouterLink}, add this to your `directives` array in the {@link View} decorator of your
  31373. * component.
  31374. *
  31375. * ### Example ([live demo](http://plnkr.co/edit/iRUP8B5OUbxCWQ3AcIDm))
  31376. *
  31377. * ```
  31378. * import {Component} from 'angular2/core';
  31379. * import {ROUTER_DIRECTIVES, ROUTER_PROVIDERS, RouteConfig} from 'angular2/router';
  31380. *
  31381. * @Component({directives: [ROUTER_DIRECTIVES]})
  31382. * @RouteConfig([
  31383. * {...},
  31384. * ])
  31385. * class AppCmp {
  31386. * // ...
  31387. * }
  31388. *
  31389. * bootstrap(AppCmp, [ROUTER_PROVIDERS]);
  31390. * ```
  31391. */
  31392. exports.ROUTER_DIRECTIVES = lang_1.CONST_EXPR([router_outlet_2.RouterOutlet, router_link_2.RouterLink]);
  31393. /**
  31394. * A list of {@link Provider}s. To use the router, you must add this to your application.
  31395. *
  31396. * ### Example ([live demo](http://plnkr.co/edit/iRUP8B5OUbxCWQ3AcIDm))
  31397. *
  31398. * ```
  31399. * import {Component} from 'angular2/core';
  31400. * import {
  31401. * ROUTER_DIRECTIVES,
  31402. * ROUTER_PROVIDERS,
  31403. * RouteConfig
  31404. * } from 'angular2/router';
  31405. *
  31406. * @Component({directives: [ROUTER_DIRECTIVES]})
  31407. * @RouteConfig([
  31408. * {...},
  31409. * ])
  31410. * class AppCmp {
  31411. * // ...
  31412. * }
  31413. *
  31414. * bootstrap(AppCmp, [ROUTER_PROVIDERS]);
  31415. * ```
  31416. */
  31417. exports.ROUTER_PROVIDERS = lang_1.CONST_EXPR([
  31418. route_registry_2.RouteRegistry,
  31419. lang_1.CONST_EXPR(new core_2.Provider(location_strategy_2.LocationStrategy, { useClass: path_location_strategy_2.PathLocationStrategy })),
  31420. platform_location_2.PlatformLocation,
  31421. location_2.Location,
  31422. lang_1.CONST_EXPR(new core_2.Provider(router_2.Router, {
  31423. useFactory: routerFactory,
  31424. deps: lang_1.CONST_EXPR([route_registry_2.RouteRegistry, location_2.Location, route_registry_2.ROUTER_PRIMARY_COMPONENT, core_2.ApplicationRef])
  31425. })),
  31426. lang_1.CONST_EXPR(new core_2.Provider(route_registry_2.ROUTER_PRIMARY_COMPONENT, { useFactory: routerPrimaryComponentFactory, deps: lang_1.CONST_EXPR([core_2.ApplicationRef]) }))
  31427. ]);
  31428. /**
  31429. * Use {@link ROUTER_PROVIDERS} instead.
  31430. *
  31431. * @deprecated
  31432. */
  31433. exports.ROUTER_BINDINGS = exports.ROUTER_PROVIDERS;
  31434. function routerFactory(registry, location, primaryComponent, appRef) {
  31435. var rootRouter = new router_2.RootRouter(registry, location, primaryComponent);
  31436. appRef.registerDisposeListener(function () { return rootRouter.dispose(); });
  31437. return rootRouter;
  31438. }
  31439. function routerPrimaryComponentFactory(app) {
  31440. if (app.componentTypes.length == 0) {
  31441. throw new exceptions_1.BaseException("Bootstrap at least one component before injecting Router.");
  31442. }
  31443. return app.componentTypes[0];
  31444. }
  31445. /***/ },
  31446. /* 225 */
  31447. /***/ function(module, exports, __webpack_require__) {
  31448. var __extends = (this && this.__extends) || function (d, b) {
  31449. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  31450. function __() { this.constructor = d; }
  31451. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  31452. };
  31453. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  31454. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  31455. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  31456. 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;
  31457. return c > 3 && r && Object.defineProperty(target, key, r), r;
  31458. };
  31459. var __metadata = (this && this.__metadata) || function (k, v) {
  31460. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  31461. };
  31462. var __param = (this && this.__param) || function (paramIndex, decorator) {
  31463. return function (target, key) { decorator(target, key, paramIndex); }
  31464. };
  31465. var async_1 = __webpack_require__(60);
  31466. var collection_1 = __webpack_require__(12);
  31467. var lang_1 = __webpack_require__(5);
  31468. var exceptions_1 = __webpack_require__(14);
  31469. var core_1 = __webpack_require__(2);
  31470. var route_registry_1 = __webpack_require__(226);
  31471. var location_1 = __webpack_require__(237);
  31472. var route_lifecycle_reflector_1 = __webpack_require__(239);
  31473. var _resolveToTrue = async_1.PromiseWrapper.resolve(true);
  31474. var _resolveToFalse = async_1.PromiseWrapper.resolve(false);
  31475. /**
  31476. * The `Router` is responsible for mapping URLs to components.
  31477. *
  31478. * You can see the state of the router by inspecting the read-only field `router.navigating`.
  31479. * This may be useful for showing a spinner, for instance.
  31480. *
  31481. * ## Concepts
  31482. *
  31483. * Routers and component instances have a 1:1 correspondence.
  31484. *
  31485. * The router holds reference to a number of {@link RouterOutlet}.
  31486. * An outlet is a placeholder that the router dynamically fills in depending on the current URL.
  31487. *
  31488. * When the router navigates from a URL, it must first recognize it and serialize it into an
  31489. * `Instruction`.
  31490. * The router uses the `RouteRegistry` to get an `Instruction`.
  31491. */
  31492. var Router = (function () {
  31493. function Router(registry, parent, hostComponent) {
  31494. this.registry = registry;
  31495. this.parent = parent;
  31496. this.hostComponent = hostComponent;
  31497. this.navigating = false;
  31498. this._currentInstruction = null;
  31499. this._currentNavigation = _resolveToTrue;
  31500. this._outlet = null;
  31501. this._auxRouters = new collection_1.Map();
  31502. this._subject = new async_1.EventEmitter();
  31503. }
  31504. /**
  31505. * Constructs a child router. You probably don't need to use this unless you're writing a reusable
  31506. * component.
  31507. */
  31508. Router.prototype.childRouter = function (hostComponent) {
  31509. return this._childRouter = new ChildRouter(this, hostComponent);
  31510. };
  31511. /**
  31512. * Constructs a child router. You probably don't need to use this unless you're writing a reusable
  31513. * component.
  31514. */
  31515. Router.prototype.auxRouter = function (hostComponent) { return new ChildRouter(this, hostComponent); };
  31516. /**
  31517. * Register an outlet to be notified of primary route changes.
  31518. *
  31519. * You probably don't need to use this unless you're writing a reusable component.
  31520. */
  31521. Router.prototype.registerPrimaryOutlet = function (outlet) {
  31522. if (lang_1.isPresent(outlet.name)) {
  31523. throw new exceptions_1.BaseException("registerPrimaryOutlet expects to be called with an unnamed outlet.");
  31524. }
  31525. this._outlet = outlet;
  31526. if (lang_1.isPresent(this._currentInstruction)) {
  31527. return this.commit(this._currentInstruction, false);
  31528. }
  31529. return _resolveToTrue;
  31530. };
  31531. /**
  31532. * Register an outlet to notified of auxiliary route changes.
  31533. *
  31534. * You probably don't need to use this unless you're writing a reusable component.
  31535. */
  31536. Router.prototype.registerAuxOutlet = function (outlet) {
  31537. var outletName = outlet.name;
  31538. if (lang_1.isBlank(outletName)) {
  31539. throw new exceptions_1.BaseException("registerAuxOutlet expects to be called with an outlet with a name.");
  31540. }
  31541. // TODO...
  31542. // what is the host of an aux route???
  31543. var router = this.auxRouter(this.hostComponent);
  31544. this._auxRouters.set(outletName, router);
  31545. router._outlet = outlet;
  31546. var auxInstruction;
  31547. if (lang_1.isPresent(this._currentInstruction) &&
  31548. lang_1.isPresent(auxInstruction = this._currentInstruction.auxInstruction[outletName])) {
  31549. return router.commit(auxInstruction);
  31550. }
  31551. return _resolveToTrue;
  31552. };
  31553. /**
  31554. * Given an instruction, returns `true` if the instruction is currently active,
  31555. * otherwise `false`.
  31556. */
  31557. Router.prototype.isRouteActive = function (instruction) {
  31558. var router = this;
  31559. while (lang_1.isPresent(router.parent) && lang_1.isPresent(instruction.child)) {
  31560. router = router.parent;
  31561. instruction = instruction.child;
  31562. }
  31563. return lang_1.isPresent(this._currentInstruction) &&
  31564. this._currentInstruction.component == instruction.component;
  31565. };
  31566. /**
  31567. * Dynamically update the routing configuration and trigger a navigation.
  31568. *
  31569. * ### Usage
  31570. *
  31571. * ```
  31572. * router.config([
  31573. * { 'path': '/', 'component': IndexComp },
  31574. * { 'path': '/user/:id', 'component': UserComp },
  31575. * ]);
  31576. * ```
  31577. */
  31578. Router.prototype.config = function (definitions) {
  31579. var _this = this;
  31580. definitions.forEach(function (routeDefinition) { _this.registry.config(_this.hostComponent, routeDefinition); });
  31581. return this.renavigate();
  31582. };
  31583. /**
  31584. * Navigate based on the provided Route Link DSL. It's preferred to navigate with this method
  31585. * over `navigateByUrl`.
  31586. *
  31587. * ### Usage
  31588. *
  31589. * This method takes an array representing the Route Link DSL:
  31590. * ```
  31591. * ['./MyCmp', {param: 3}]
  31592. * ```
  31593. * See the {@link RouterLink} directive for more.
  31594. */
  31595. Router.prototype.navigate = function (linkParams) {
  31596. var instruction = this.generate(linkParams);
  31597. return this.navigateByInstruction(instruction, false);
  31598. };
  31599. /**
  31600. * Navigate to a URL. Returns a promise that resolves when navigation is complete.
  31601. * It's preferred to navigate with `navigate` instead of this method, since URLs are more brittle.
  31602. *
  31603. * If the given URL begins with a `/`, router will navigate absolutely.
  31604. * If the given URL does not begin with `/`, the router will navigate relative to this component.
  31605. */
  31606. Router.prototype.navigateByUrl = function (url, _skipLocationChange) {
  31607. var _this = this;
  31608. if (_skipLocationChange === void 0) { _skipLocationChange = false; }
  31609. return this._currentNavigation = this._currentNavigation.then(function (_) {
  31610. _this.lastNavigationAttempt = url;
  31611. _this._startNavigating();
  31612. return _this._afterPromiseFinishNavigating(_this.recognize(url).then(function (instruction) {
  31613. if (lang_1.isBlank(instruction)) {
  31614. return false;
  31615. }
  31616. return _this._navigate(instruction, _skipLocationChange);
  31617. }));
  31618. });
  31619. };
  31620. /**
  31621. * Navigate via the provided instruction. Returns a promise that resolves when navigation is
  31622. * complete.
  31623. */
  31624. Router.prototype.navigateByInstruction = function (instruction, _skipLocationChange) {
  31625. var _this = this;
  31626. if (_skipLocationChange === void 0) { _skipLocationChange = false; }
  31627. if (lang_1.isBlank(instruction)) {
  31628. return _resolveToFalse;
  31629. }
  31630. return this._currentNavigation = this._currentNavigation.then(function (_) {
  31631. _this._startNavigating();
  31632. return _this._afterPromiseFinishNavigating(_this._navigate(instruction, _skipLocationChange));
  31633. });
  31634. };
  31635. /** @internal */
  31636. Router.prototype._navigate = function (instruction, _skipLocationChange) {
  31637. var _this = this;
  31638. return this._settleInstruction(instruction)
  31639. .then(function (_) { return _this._routerCanReuse(instruction); })
  31640. .then(function (_) { return _this._canActivate(instruction); })
  31641. .then(function (result) {
  31642. if (!result) {
  31643. return false;
  31644. }
  31645. return _this._routerCanDeactivate(instruction)
  31646. .then(function (result) {
  31647. if (result) {
  31648. return _this.commit(instruction, _skipLocationChange)
  31649. .then(function (_) {
  31650. _this._emitNavigationFinish(instruction.toRootUrl());
  31651. return true;
  31652. });
  31653. }
  31654. });
  31655. });
  31656. };
  31657. /** @internal */
  31658. Router.prototype._settleInstruction = function (instruction) {
  31659. var _this = this;
  31660. return instruction.resolveComponent().then(function (_) {
  31661. instruction.component.reuse = false;
  31662. var unsettledInstructions = [];
  31663. if (lang_1.isPresent(instruction.child)) {
  31664. unsettledInstructions.push(_this._settleInstruction(instruction.child));
  31665. }
  31666. collection_1.StringMapWrapper.forEach(instruction.auxInstruction, function (instruction, _) {
  31667. unsettledInstructions.push(_this._settleInstruction(instruction));
  31668. });
  31669. return async_1.PromiseWrapper.all(unsettledInstructions);
  31670. });
  31671. };
  31672. Router.prototype._emitNavigationFinish = function (url) { async_1.ObservableWrapper.callEmit(this._subject, url); };
  31673. Router.prototype._afterPromiseFinishNavigating = function (promise) {
  31674. var _this = this;
  31675. return async_1.PromiseWrapper.catchError(promise.then(function (_) { return _this._finishNavigating(); }), function (err) {
  31676. _this._finishNavigating();
  31677. throw err;
  31678. });
  31679. };
  31680. /*
  31681. * Recursively set reuse flags
  31682. */
  31683. /** @internal */
  31684. Router.prototype._routerCanReuse = function (instruction) {
  31685. var _this = this;
  31686. if (lang_1.isBlank(this._outlet)) {
  31687. return _resolveToFalse;
  31688. }
  31689. return this._outlet.routerCanReuse(instruction.component)
  31690. .then(function (result) {
  31691. instruction.component.reuse = result;
  31692. if (result && lang_1.isPresent(_this._childRouter) && lang_1.isPresent(instruction.child)) {
  31693. return _this._childRouter._routerCanReuse(instruction.child);
  31694. }
  31695. });
  31696. };
  31697. Router.prototype._canActivate = function (nextInstruction) {
  31698. return canActivateOne(nextInstruction, this._currentInstruction);
  31699. };
  31700. Router.prototype._routerCanDeactivate = function (instruction) {
  31701. var _this = this;
  31702. if (lang_1.isBlank(this._outlet)) {
  31703. return _resolveToTrue;
  31704. }
  31705. var next;
  31706. var childInstruction = null;
  31707. var reuse = false;
  31708. var componentInstruction = null;
  31709. if (lang_1.isPresent(instruction)) {
  31710. childInstruction = instruction.child;
  31711. componentInstruction = instruction.component;
  31712. reuse = instruction.component.reuse;
  31713. }
  31714. if (reuse) {
  31715. next = _resolveToTrue;
  31716. }
  31717. else {
  31718. next = this._outlet.routerCanDeactivate(componentInstruction);
  31719. }
  31720. // TODO: aux route lifecycle hooks
  31721. return next.then(function (result) {
  31722. if (result == false) {
  31723. return false;
  31724. }
  31725. if (lang_1.isPresent(_this._childRouter)) {
  31726. return _this._childRouter._routerCanDeactivate(childInstruction);
  31727. }
  31728. return true;
  31729. });
  31730. };
  31731. /**
  31732. * Updates this router and all descendant routers according to the given instruction
  31733. */
  31734. Router.prototype.commit = function (instruction, _skipLocationChange) {
  31735. var _this = this;
  31736. if (_skipLocationChange === void 0) { _skipLocationChange = false; }
  31737. this._currentInstruction = instruction;
  31738. var next = _resolveToTrue;
  31739. if (lang_1.isPresent(this._outlet)) {
  31740. var componentInstruction = instruction.component;
  31741. if (componentInstruction.reuse) {
  31742. next = this._outlet.reuse(componentInstruction);
  31743. }
  31744. else {
  31745. next =
  31746. this.deactivate(instruction).then(function (_) { return _this._outlet.activate(componentInstruction); });
  31747. }
  31748. if (lang_1.isPresent(instruction.child)) {
  31749. next = next.then(function (_) {
  31750. if (lang_1.isPresent(_this._childRouter)) {
  31751. return _this._childRouter.commit(instruction.child);
  31752. }
  31753. });
  31754. }
  31755. }
  31756. var promises = [];
  31757. this._auxRouters.forEach(function (router, name) {
  31758. if (lang_1.isPresent(instruction.auxInstruction[name])) {
  31759. promises.push(router.commit(instruction.auxInstruction[name]));
  31760. }
  31761. });
  31762. return next.then(function (_) { return async_1.PromiseWrapper.all(promises); });
  31763. };
  31764. /** @internal */
  31765. Router.prototype._startNavigating = function () { this.navigating = true; };
  31766. /** @internal */
  31767. Router.prototype._finishNavigating = function () { this.navigating = false; };
  31768. /**
  31769. * Subscribe to URL updates from the router
  31770. */
  31771. Router.prototype.subscribe = function (onNext) {
  31772. return async_1.ObservableWrapper.subscribe(this._subject, onNext);
  31773. };
  31774. /**
  31775. * Removes the contents of this router's outlet and all descendant outlets
  31776. */
  31777. Router.prototype.deactivate = function (instruction) {
  31778. var _this = this;
  31779. var childInstruction = null;
  31780. var componentInstruction = null;
  31781. if (lang_1.isPresent(instruction)) {
  31782. childInstruction = instruction.child;
  31783. componentInstruction = instruction.component;
  31784. }
  31785. var next = _resolveToTrue;
  31786. if (lang_1.isPresent(this._childRouter)) {
  31787. next = this._childRouter.deactivate(childInstruction);
  31788. }
  31789. if (lang_1.isPresent(this._outlet)) {
  31790. next = next.then(function (_) { return _this._outlet.deactivate(componentInstruction); });
  31791. }
  31792. // TODO: handle aux routes
  31793. return next;
  31794. };
  31795. /**
  31796. * Given a URL, returns an instruction representing the component graph
  31797. */
  31798. Router.prototype.recognize = function (url) {
  31799. var ancestorComponents = this._getAncestorInstructions();
  31800. return this.registry.recognize(url, ancestorComponents);
  31801. };
  31802. Router.prototype._getAncestorInstructions = function () {
  31803. var ancestorComponents = [];
  31804. var ancestorRouter = this;
  31805. while (lang_1.isPresent(ancestorRouter.parent) &&
  31806. lang_1.isPresent(ancestorRouter.parent._currentInstruction)) {
  31807. ancestorRouter = ancestorRouter.parent;
  31808. ancestorComponents.unshift(ancestorRouter._currentInstruction);
  31809. }
  31810. return ancestorComponents;
  31811. };
  31812. /**
  31813. * Navigates to either the last URL successfully navigated to, or the last URL requested if the
  31814. * router has yet to successfully navigate.
  31815. */
  31816. Router.prototype.renavigate = function () {
  31817. if (lang_1.isBlank(this.lastNavigationAttempt)) {
  31818. return this._currentNavigation;
  31819. }
  31820. return this.navigateByUrl(this.lastNavigationAttempt);
  31821. };
  31822. /**
  31823. * Generate an `Instruction` based on the provided Route Link DSL.
  31824. */
  31825. Router.prototype.generate = function (linkParams) {
  31826. var ancestorInstructions = this._getAncestorInstructions();
  31827. return this.registry.generate(linkParams, ancestorInstructions);
  31828. };
  31829. return Router;
  31830. })();
  31831. exports.Router = Router;
  31832. var RootRouter = (function (_super) {
  31833. __extends(RootRouter, _super);
  31834. function RootRouter(registry, location, primaryComponent) {
  31835. var _this = this;
  31836. _super.call(this, registry, null, primaryComponent);
  31837. this._location = location;
  31838. this._locationSub = this._location.subscribe(function (change) {
  31839. // we call recognize ourselves
  31840. _this.recognize(change['url'])
  31841. .then(function (instruction) {
  31842. _this.navigateByInstruction(instruction, lang_1.isPresent(change['pop']))
  31843. .then(function (_) {
  31844. // this is a popstate event; no need to change the URL
  31845. if (lang_1.isPresent(change['pop']) && change['type'] != 'hashchange') {
  31846. return;
  31847. }
  31848. var emitPath = instruction.toUrlPath();
  31849. var emitQuery = instruction.toUrlQuery();
  31850. if (emitPath.length > 0) {
  31851. emitPath = '/' + emitPath;
  31852. }
  31853. // Because we've opted to use All hashchange events occur outside Angular.
  31854. // However, apps that are migrating might have hash links that operate outside
  31855. // angular to which routing must respond.
  31856. // To support these cases where we respond to hashchanges and redirect as a
  31857. // result, we need to replace the top item on the stack.
  31858. if (change['type'] == 'hashchange') {
  31859. if (instruction.toRootUrl() != _this._location.path()) {
  31860. _this._location.replaceState(emitPath, emitQuery);
  31861. }
  31862. }
  31863. else {
  31864. _this._location.go(emitPath, emitQuery);
  31865. }
  31866. });
  31867. });
  31868. });
  31869. this.registry.configFromComponent(primaryComponent);
  31870. this.navigateByUrl(location.path());
  31871. }
  31872. RootRouter.prototype.commit = function (instruction, _skipLocationChange) {
  31873. var _this = this;
  31874. if (_skipLocationChange === void 0) { _skipLocationChange = false; }
  31875. var emitPath = instruction.toUrlPath();
  31876. var emitQuery = instruction.toUrlQuery();
  31877. if (emitPath.length > 0) {
  31878. emitPath = '/' + emitPath;
  31879. }
  31880. var promise = _super.prototype.commit.call(this, instruction);
  31881. if (!_skipLocationChange) {
  31882. promise = promise.then(function (_) { _this._location.go(emitPath, emitQuery); });
  31883. }
  31884. return promise;
  31885. };
  31886. RootRouter.prototype.dispose = function () {
  31887. if (lang_1.isPresent(this._locationSub)) {
  31888. async_1.ObservableWrapper.dispose(this._locationSub);
  31889. this._locationSub = null;
  31890. }
  31891. };
  31892. RootRouter = __decorate([
  31893. core_1.Injectable(),
  31894. __param(2, core_1.Inject(route_registry_1.ROUTER_PRIMARY_COMPONENT)),
  31895. __metadata('design:paramtypes', [route_registry_1.RouteRegistry, location_1.Location, lang_1.Type])
  31896. ], RootRouter);
  31897. return RootRouter;
  31898. })(Router);
  31899. exports.RootRouter = RootRouter;
  31900. var ChildRouter = (function (_super) {
  31901. __extends(ChildRouter, _super);
  31902. function ChildRouter(parent, hostComponent) {
  31903. _super.call(this, parent.registry, parent, hostComponent);
  31904. this.parent = parent;
  31905. }
  31906. ChildRouter.prototype.navigateByUrl = function (url, _skipLocationChange) {
  31907. if (_skipLocationChange === void 0) { _skipLocationChange = false; }
  31908. // Delegate navigation to the root router
  31909. return this.parent.navigateByUrl(url, _skipLocationChange);
  31910. };
  31911. ChildRouter.prototype.navigateByInstruction = function (instruction, _skipLocationChange) {
  31912. if (_skipLocationChange === void 0) { _skipLocationChange = false; }
  31913. // Delegate navigation to the root router
  31914. return this.parent.navigateByInstruction(instruction, _skipLocationChange);
  31915. };
  31916. return ChildRouter;
  31917. })(Router);
  31918. function canActivateOne(nextInstruction, prevInstruction) {
  31919. var next = _resolveToTrue;
  31920. if (lang_1.isPresent(nextInstruction.child)) {
  31921. next = canActivateOne(nextInstruction.child, lang_1.isPresent(prevInstruction) ? prevInstruction.child : null);
  31922. }
  31923. return next.then(function (result) {
  31924. if (result == false) {
  31925. return false;
  31926. }
  31927. if (nextInstruction.component.reuse) {
  31928. return true;
  31929. }
  31930. var hook = route_lifecycle_reflector_1.getCanActivateHook(nextInstruction.component.componentType);
  31931. if (lang_1.isPresent(hook)) {
  31932. return hook(nextInstruction.component, lang_1.isPresent(prevInstruction) ? prevInstruction.component : null);
  31933. }
  31934. return true;
  31935. });
  31936. }
  31937. /***/ },
  31938. /* 226 */
  31939. /***/ function(module, exports, __webpack_require__) {
  31940. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  31941. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  31942. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  31943. 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;
  31944. return c > 3 && r && Object.defineProperty(target, key, r), r;
  31945. };
  31946. var __metadata = (this && this.__metadata) || function (k, v) {
  31947. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  31948. };
  31949. var __param = (this && this.__param) || function (paramIndex, decorator) {
  31950. return function (target, key) { decorator(target, key, paramIndex); }
  31951. };
  31952. var collection_1 = __webpack_require__(12);
  31953. var async_1 = __webpack_require__(60);
  31954. var lang_1 = __webpack_require__(5);
  31955. var exceptions_1 = __webpack_require__(14);
  31956. var reflection_1 = __webpack_require__(16);
  31957. var core_1 = __webpack_require__(2);
  31958. var route_config_impl_1 = __webpack_require__(227);
  31959. var route_recognizer_1 = __webpack_require__(228);
  31960. var component_recognizer_1 = __webpack_require__(232);
  31961. var instruction_1 = __webpack_require__(229);
  31962. var route_config_nomalizer_1 = __webpack_require__(235);
  31963. var url_parser_1 = __webpack_require__(231);
  31964. var _resolveToNull = async_1.PromiseWrapper.resolve(null);
  31965. /**
  31966. * Token used to bind the component with the top-level {@link RouteConfig}s for the
  31967. * application.
  31968. *
  31969. * ### Example ([live demo](http://plnkr.co/edit/iRUP8B5OUbxCWQ3AcIDm))
  31970. *
  31971. * ```
  31972. * import {Component} from 'angular2/core';
  31973. * import {
  31974. * ROUTER_DIRECTIVES,
  31975. * ROUTER_PROVIDERS,
  31976. * RouteConfig
  31977. * } from 'angular2/router';
  31978. *
  31979. * @Component({directives: [ROUTER_DIRECTIVES]})
  31980. * @RouteConfig([
  31981. * {...},
  31982. * ])
  31983. * class AppCmp {
  31984. * // ...
  31985. * }
  31986. *
  31987. * bootstrap(AppCmp, [ROUTER_PROVIDERS]);
  31988. * ```
  31989. */
  31990. exports.ROUTER_PRIMARY_COMPONENT = lang_1.CONST_EXPR(new core_1.OpaqueToken('RouterPrimaryComponent'));
  31991. /**
  31992. * The RouteRegistry holds route configurations for each component in an Angular app.
  31993. * It is responsible for creating Instructions from URLs, and generating URLs based on route and
  31994. * parameters.
  31995. */
  31996. var RouteRegistry = (function () {
  31997. function RouteRegistry(_rootComponent) {
  31998. this._rootComponent = _rootComponent;
  31999. this._rules = new collection_1.Map();
  32000. }
  32001. /**
  32002. * Given a component and a configuration object, add the route to this registry
  32003. */
  32004. RouteRegistry.prototype.config = function (parentComponent, config) {
  32005. config = route_config_nomalizer_1.normalizeRouteConfig(config, this);
  32006. // this is here because Dart type guard reasons
  32007. if (config instanceof route_config_impl_1.Route) {
  32008. route_config_nomalizer_1.assertComponentExists(config.component, config.path);
  32009. }
  32010. else if (config instanceof route_config_impl_1.AuxRoute) {
  32011. route_config_nomalizer_1.assertComponentExists(config.component, config.path);
  32012. }
  32013. var recognizer = this._rules.get(parentComponent);
  32014. if (lang_1.isBlank(recognizer)) {
  32015. recognizer = new component_recognizer_1.ComponentRecognizer();
  32016. this._rules.set(parentComponent, recognizer);
  32017. }
  32018. var terminal = recognizer.config(config);
  32019. if (config instanceof route_config_impl_1.Route) {
  32020. if (terminal) {
  32021. assertTerminalComponent(config.component, config.path);
  32022. }
  32023. else {
  32024. this.configFromComponent(config.component);
  32025. }
  32026. }
  32027. };
  32028. /**
  32029. * Reads the annotations of a component and configures the registry based on them
  32030. */
  32031. RouteRegistry.prototype.configFromComponent = function (component) {
  32032. var _this = this;
  32033. if (!lang_1.isType(component)) {
  32034. return;
  32035. }
  32036. // Don't read the annotations from a type more than once –
  32037. // this prevents an infinite loop if a component routes recursively.
  32038. if (this._rules.has(component)) {
  32039. return;
  32040. }
  32041. var annotations = reflection_1.reflector.annotations(component);
  32042. if (lang_1.isPresent(annotations)) {
  32043. for (var i = 0; i < annotations.length; i++) {
  32044. var annotation = annotations[i];
  32045. if (annotation instanceof route_config_impl_1.RouteConfig) {
  32046. var routeCfgs = annotation.configs;
  32047. routeCfgs.forEach(function (config) { return _this.config(component, config); });
  32048. }
  32049. }
  32050. }
  32051. };
  32052. /**
  32053. * Given a URL and a parent component, return the most specific instruction for navigating
  32054. * the application into the state specified by the url
  32055. */
  32056. RouteRegistry.prototype.recognize = function (url, ancestorInstructions) {
  32057. var parsedUrl = url_parser_1.parser.parse(url);
  32058. return this._recognize(parsedUrl, ancestorInstructions);
  32059. };
  32060. /**
  32061. * Recognizes all parent-child routes, but creates unresolved auxiliary routes
  32062. */
  32063. RouteRegistry.prototype._recognize = function (parsedUrl, ancestorInstructions, _aux) {
  32064. var _this = this;
  32065. if (_aux === void 0) { _aux = false; }
  32066. var parentComponent = ancestorInstructions.length > 0 ?
  32067. ancestorInstructions[ancestorInstructions.length - 1].component.componentType :
  32068. this._rootComponent;
  32069. var componentRecognizer = this._rules.get(parentComponent);
  32070. if (lang_1.isBlank(componentRecognizer)) {
  32071. return _resolveToNull;
  32072. }
  32073. // Matches some beginning part of the given URL
  32074. var possibleMatches = _aux ? componentRecognizer.recognizeAuxiliary(parsedUrl) :
  32075. componentRecognizer.recognize(parsedUrl);
  32076. var matchPromises = possibleMatches.map(function (candidate) { return candidate.then(function (candidate) {
  32077. if (candidate instanceof route_recognizer_1.PathMatch) {
  32078. var auxParentInstructions = ancestorInstructions.length > 0 ?
  32079. [ancestorInstructions[ancestorInstructions.length - 1]] :
  32080. [];
  32081. var auxInstructions = _this._auxRoutesToUnresolved(candidate.remainingAux, auxParentInstructions);
  32082. var instruction = new instruction_1.ResolvedInstruction(candidate.instruction, null, auxInstructions);
  32083. if (candidate.instruction.terminal) {
  32084. return instruction;
  32085. }
  32086. var newAncestorComponents = ancestorInstructions.concat([instruction]);
  32087. return _this._recognize(candidate.remaining, newAncestorComponents)
  32088. .then(function (childInstruction) {
  32089. if (lang_1.isBlank(childInstruction)) {
  32090. return null;
  32091. }
  32092. // redirect instructions are already absolute
  32093. if (childInstruction instanceof instruction_1.RedirectInstruction) {
  32094. return childInstruction;
  32095. }
  32096. instruction.child = childInstruction;
  32097. return instruction;
  32098. });
  32099. }
  32100. if (candidate instanceof route_recognizer_1.RedirectMatch) {
  32101. var instruction = _this.generate(candidate.redirectTo, ancestorInstructions);
  32102. return new instruction_1.RedirectInstruction(instruction.component, instruction.child, instruction.auxInstruction);
  32103. }
  32104. }); });
  32105. if ((lang_1.isBlank(parsedUrl) || parsedUrl.path == '') && possibleMatches.length == 0) {
  32106. return async_1.PromiseWrapper.resolve(this.generateDefault(parentComponent));
  32107. }
  32108. return async_1.PromiseWrapper.all(matchPromises).then(mostSpecific);
  32109. };
  32110. RouteRegistry.prototype._auxRoutesToUnresolved = function (auxRoutes, parentInstructions) {
  32111. var _this = this;
  32112. var unresolvedAuxInstructions = {};
  32113. auxRoutes.forEach(function (auxUrl) {
  32114. unresolvedAuxInstructions[auxUrl.path] = new instruction_1.UnresolvedInstruction(function () { return _this._recognize(auxUrl, parentInstructions, true); });
  32115. });
  32116. return unresolvedAuxInstructions;
  32117. };
  32118. /**
  32119. * Given a normalized list with component names and params like: `['user', {id: 3 }]`
  32120. * generates a url with a leading slash relative to the provided `parentComponent`.
  32121. *
  32122. * If the optional param `_aux` is `true`, then we generate starting at an auxiliary
  32123. * route boundary.
  32124. */
  32125. RouteRegistry.prototype.generate = function (linkParams, ancestorInstructions, _aux) {
  32126. if (_aux === void 0) { _aux = false; }
  32127. var normalizedLinkParams = splitAndFlattenLinkParams(linkParams);
  32128. var first = collection_1.ListWrapper.first(normalizedLinkParams);
  32129. var rest = collection_1.ListWrapper.slice(normalizedLinkParams, 1);
  32130. // The first segment should be either '.' (generate from parent) or '' (generate from root).
  32131. // When we normalize above, we strip all the slashes, './' becomes '.' and '/' becomes ''.
  32132. if (first == '') {
  32133. ancestorInstructions = [];
  32134. }
  32135. else if (first == '..') {
  32136. // we already captured the first instance of "..", so we need to pop off an ancestor
  32137. ancestorInstructions.pop();
  32138. while (collection_1.ListWrapper.first(rest) == '..') {
  32139. rest = collection_1.ListWrapper.slice(rest, 1);
  32140. ancestorInstructions.pop();
  32141. if (ancestorInstructions.length <= 0) {
  32142. throw new exceptions_1.BaseException("Link \"" + collection_1.ListWrapper.toJSON(linkParams) + "\" has too many \"../\" segments.");
  32143. }
  32144. }
  32145. }
  32146. else if (first != '.') {
  32147. var parentComponent = this._rootComponent;
  32148. var grandparentComponent = null;
  32149. if (ancestorInstructions.length > 1) {
  32150. parentComponent =
  32151. ancestorInstructions[ancestorInstructions.length - 1].component.componentType;
  32152. grandparentComponent =
  32153. ancestorInstructions[ancestorInstructions.length - 2].component.componentType;
  32154. }
  32155. else if (ancestorInstructions.length == 1) {
  32156. parentComponent = ancestorInstructions[0].component.componentType;
  32157. grandparentComponent = this._rootComponent;
  32158. }
  32159. // For a link with no leading `./`, `/`, or `../`, we look for a sibling and child.
  32160. // If both exist, we throw. Otherwise, we prefer whichever exists.
  32161. var childRouteExists = this.hasRoute(first, parentComponent);
  32162. var parentRouteExists = lang_1.isPresent(grandparentComponent) && this.hasRoute(first, grandparentComponent);
  32163. if (parentRouteExists && childRouteExists) {
  32164. var msg = "Link \"" + collection_1.ListWrapper.toJSON(linkParams) + "\" is ambiguous, use \"./\" or \"../\" to disambiguate.";
  32165. throw new exceptions_1.BaseException(msg);
  32166. }
  32167. if (parentRouteExists) {
  32168. ancestorInstructions.pop();
  32169. }
  32170. rest = linkParams;
  32171. }
  32172. if (rest[rest.length - 1] == '') {
  32173. rest.pop();
  32174. }
  32175. if (rest.length < 1) {
  32176. var msg = "Link \"" + collection_1.ListWrapper.toJSON(linkParams) + "\" must include a route name.";
  32177. throw new exceptions_1.BaseException(msg);
  32178. }
  32179. var generatedInstruction = this._generate(rest, ancestorInstructions, _aux);
  32180. for (var i = ancestorInstructions.length - 1; i >= 0; i--) {
  32181. var ancestorInstruction = ancestorInstructions[i];
  32182. generatedInstruction = ancestorInstruction.replaceChild(generatedInstruction);
  32183. }
  32184. return generatedInstruction;
  32185. };
  32186. /*
  32187. * Internal helper that does not make any assertions about the beginning of the link DSL
  32188. */
  32189. RouteRegistry.prototype._generate = function (linkParams, ancestorInstructions, _aux) {
  32190. var _this = this;
  32191. if (_aux === void 0) { _aux = false; }
  32192. var parentComponent = ancestorInstructions.length > 0 ?
  32193. ancestorInstructions[ancestorInstructions.length - 1].component.componentType :
  32194. this._rootComponent;
  32195. if (linkParams.length == 0) {
  32196. return this.generateDefault(parentComponent);
  32197. }
  32198. var linkIndex = 0;
  32199. var routeName = linkParams[linkIndex];
  32200. if (!lang_1.isString(routeName)) {
  32201. throw new exceptions_1.BaseException("Unexpected segment \"" + routeName + "\" in link DSL. Expected a string.");
  32202. }
  32203. else if (routeName == '' || routeName == '.' || routeName == '..') {
  32204. throw new exceptions_1.BaseException("\"" + routeName + "/\" is only allowed at the beginning of a link DSL.");
  32205. }
  32206. var params = {};
  32207. if (linkIndex + 1 < linkParams.length) {
  32208. var nextSegment_1 = linkParams[linkIndex + 1];
  32209. if (lang_1.isStringMap(nextSegment_1) && !lang_1.isArray(nextSegment_1)) {
  32210. params = nextSegment_1;
  32211. linkIndex += 1;
  32212. }
  32213. }
  32214. var auxInstructions = {};
  32215. var nextSegment;
  32216. while (linkIndex + 1 < linkParams.length && lang_1.isArray(nextSegment = linkParams[linkIndex + 1])) {
  32217. var auxParentInstruction = ancestorInstructions.length > 0 ?
  32218. [ancestorInstructions[ancestorInstructions.length - 1]] :
  32219. [];
  32220. var auxInstruction = this._generate(nextSegment, auxParentInstruction, true);
  32221. // TODO: this will not work for aux routes with parameters or multiple segments
  32222. auxInstructions[auxInstruction.component.urlPath] = auxInstruction;
  32223. linkIndex += 1;
  32224. }
  32225. var componentRecognizer = this._rules.get(parentComponent);
  32226. if (lang_1.isBlank(componentRecognizer)) {
  32227. throw new exceptions_1.BaseException("Component \"" + lang_1.getTypeNameForDebugging(parentComponent) + "\" has no route config.");
  32228. }
  32229. var routeRecognizer = (_aux ? componentRecognizer.auxNames : componentRecognizer.names).get(routeName);
  32230. if (!lang_1.isPresent(routeRecognizer)) {
  32231. throw new exceptions_1.BaseException("Component \"" + lang_1.getTypeNameForDebugging(parentComponent) + "\" has no route named \"" + routeName + "\".");
  32232. }
  32233. if (!lang_1.isPresent(routeRecognizer.handler.componentType)) {
  32234. var compInstruction = routeRecognizer.generateComponentPathValues(params);
  32235. return new instruction_1.UnresolvedInstruction(function () {
  32236. return routeRecognizer.handler.resolveComponentType().then(function (_) { return _this._generate(linkParams, ancestorInstructions, _aux); });
  32237. }, compInstruction['urlPath'], compInstruction['urlParams']);
  32238. }
  32239. var componentInstruction = _aux ? componentRecognizer.generateAuxiliary(routeName, params) :
  32240. componentRecognizer.generate(routeName, params);
  32241. var remaining = linkParams.slice(linkIndex + 1);
  32242. var instruction = new instruction_1.ResolvedInstruction(componentInstruction, null, auxInstructions);
  32243. // the component is sync
  32244. if (lang_1.isPresent(componentInstruction.componentType)) {
  32245. var childInstruction = null;
  32246. if (linkIndex + 1 < linkParams.length) {
  32247. var childAncestorComponents = ancestorInstructions.concat([instruction]);
  32248. childInstruction = this._generate(remaining, childAncestorComponents);
  32249. }
  32250. else if (!componentInstruction.terminal) {
  32251. // ... look for defaults
  32252. childInstruction = this.generateDefault(componentInstruction.componentType);
  32253. if (lang_1.isBlank(childInstruction)) {
  32254. throw new exceptions_1.BaseException("Link \"" + collection_1.ListWrapper.toJSON(linkParams) + "\" does not resolve to a terminal instruction.");
  32255. }
  32256. }
  32257. instruction.child = childInstruction;
  32258. }
  32259. return instruction;
  32260. };
  32261. RouteRegistry.prototype.hasRoute = function (name, parentComponent) {
  32262. var componentRecognizer = this._rules.get(parentComponent);
  32263. if (lang_1.isBlank(componentRecognizer)) {
  32264. return false;
  32265. }
  32266. return componentRecognizer.hasRoute(name);
  32267. };
  32268. RouteRegistry.prototype.generateDefault = function (componentCursor) {
  32269. var _this = this;
  32270. if (lang_1.isBlank(componentCursor)) {
  32271. return null;
  32272. }
  32273. var componentRecognizer = this._rules.get(componentCursor);
  32274. if (lang_1.isBlank(componentRecognizer) || lang_1.isBlank(componentRecognizer.defaultRoute)) {
  32275. return null;
  32276. }
  32277. var defaultChild = null;
  32278. if (lang_1.isPresent(componentRecognizer.defaultRoute.handler.componentType)) {
  32279. var componentInstruction = componentRecognizer.defaultRoute.generate({});
  32280. if (!componentRecognizer.defaultRoute.terminal) {
  32281. defaultChild = this.generateDefault(componentRecognizer.defaultRoute.handler.componentType);
  32282. }
  32283. return new instruction_1.DefaultInstruction(componentInstruction, defaultChild);
  32284. }
  32285. return new instruction_1.UnresolvedInstruction(function () {
  32286. return componentRecognizer.defaultRoute.handler.resolveComponentType().then(function (_) { return _this.generateDefault(componentCursor); });
  32287. });
  32288. };
  32289. RouteRegistry = __decorate([
  32290. core_1.Injectable(),
  32291. __param(0, core_1.Inject(exports.ROUTER_PRIMARY_COMPONENT)),
  32292. __metadata('design:paramtypes', [lang_1.Type])
  32293. ], RouteRegistry);
  32294. return RouteRegistry;
  32295. })();
  32296. exports.RouteRegistry = RouteRegistry;
  32297. /*
  32298. * Given: ['/a/b', {c: 2}]
  32299. * Returns: ['', 'a', 'b', {c: 2}]
  32300. */
  32301. function splitAndFlattenLinkParams(linkParams) {
  32302. return linkParams.reduce(function (accumulation, item) {
  32303. if (lang_1.isString(item)) {
  32304. var strItem = item;
  32305. return accumulation.concat(strItem.split('/'));
  32306. }
  32307. accumulation.push(item);
  32308. return accumulation;
  32309. }, []);
  32310. }
  32311. /*
  32312. * Given a list of instructions, returns the most specific instruction
  32313. */
  32314. function mostSpecific(instructions) {
  32315. return collection_1.ListWrapper.maximum(instructions, function (instruction) { return instruction.specificity; });
  32316. }
  32317. function assertTerminalComponent(component, path) {
  32318. if (!lang_1.isType(component)) {
  32319. return;
  32320. }
  32321. var annotations = reflection_1.reflector.annotations(component);
  32322. if (lang_1.isPresent(annotations)) {
  32323. for (var i = 0; i < annotations.length; i++) {
  32324. var annotation = annotations[i];
  32325. if (annotation instanceof route_config_impl_1.RouteConfig) {
  32326. throw new exceptions_1.BaseException("Child routes are not allowed for \"" + path + "\". Use \"...\" on the parent's route path.");
  32327. }
  32328. }
  32329. }
  32330. }
  32331. /***/ },
  32332. /* 227 */
  32333. /***/ function(module, exports, __webpack_require__) {
  32334. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  32335. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  32336. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  32337. 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;
  32338. return c > 3 && r && Object.defineProperty(target, key, r), r;
  32339. };
  32340. var __metadata = (this && this.__metadata) || function (k, v) {
  32341. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  32342. };
  32343. var lang_1 = __webpack_require__(5);
  32344. /**
  32345. * The `RouteConfig` decorator defines routes for a given component.
  32346. *
  32347. * It takes an array of {@link RouteDefinition}s.
  32348. */
  32349. var RouteConfig = (function () {
  32350. function RouteConfig(configs) {
  32351. this.configs = configs;
  32352. }
  32353. RouteConfig = __decorate([
  32354. lang_1.CONST(),
  32355. __metadata('design:paramtypes', [Array])
  32356. ], RouteConfig);
  32357. return RouteConfig;
  32358. })();
  32359. exports.RouteConfig = RouteConfig;
  32360. /**
  32361. * `Route` is a type of {@link RouteDefinition} used to route a path to a component.
  32362. *
  32363. * It has the following properties:
  32364. * - `path` is a string that uses the route matcher DSL.
  32365. * - `component` a component type.
  32366. * - `name` is an optional `CamelCase` string representing the name of the route.
  32367. * - `data` is an optional property of any type representing arbitrary route metadata for the given
  32368. * route. It is injectable via {@link RouteData}.
  32369. * - `useAsDefault` is a boolean value. If `true`, the child route will be navigated to if no child
  32370. * route is specified during the navigation.
  32371. *
  32372. * ### Example
  32373. * ```
  32374. * import {RouteConfig} from 'angular2/router';
  32375. *
  32376. * @RouteConfig([
  32377. * {path: '/home', component: HomeCmp, name: 'HomeCmp' }
  32378. * ])
  32379. * class MyApp {}
  32380. * ```
  32381. */
  32382. var Route = (function () {
  32383. function Route(_a) {
  32384. var path = _a.path, component = _a.component, name = _a.name, data = _a.data, useAsDefault = _a.useAsDefault;
  32385. // added next three properties to work around https://github.com/Microsoft/TypeScript/issues/4107
  32386. this.aux = null;
  32387. this.loader = null;
  32388. this.redirectTo = null;
  32389. this.path = path;
  32390. this.component = component;
  32391. this.name = name;
  32392. this.data = data;
  32393. this.useAsDefault = useAsDefault;
  32394. }
  32395. Route = __decorate([
  32396. lang_1.CONST(),
  32397. __metadata('design:paramtypes', [Object])
  32398. ], Route);
  32399. return Route;
  32400. })();
  32401. exports.Route = Route;
  32402. /**
  32403. * `AuxRoute` is a type of {@link RouteDefinition} used to define an auxiliary route.
  32404. *
  32405. * It takes an object with the following properties:
  32406. * - `path` is a string that uses the route matcher DSL.
  32407. * - `component` a component type.
  32408. * - `name` is an optional `CamelCase` string representing the name of the route.
  32409. * - `data` is an optional property of any type representing arbitrary route metadata for the given
  32410. * route. It is injectable via {@link RouteData}.
  32411. *
  32412. * ### Example
  32413. * ```
  32414. * import {RouteConfig, AuxRoute} from 'angular2/router';
  32415. *
  32416. * @RouteConfig([
  32417. * new AuxRoute({path: '/home', component: HomeCmp})
  32418. * ])
  32419. * class MyApp {}
  32420. * ```
  32421. */
  32422. var AuxRoute = (function () {
  32423. function AuxRoute(_a) {
  32424. var path = _a.path, component = _a.component, name = _a.name;
  32425. this.data = null;
  32426. // added next three properties to work around https://github.com/Microsoft/TypeScript/issues/4107
  32427. this.aux = null;
  32428. this.loader = null;
  32429. this.redirectTo = null;
  32430. this.useAsDefault = false;
  32431. this.path = path;
  32432. this.component = component;
  32433. this.name = name;
  32434. }
  32435. AuxRoute = __decorate([
  32436. lang_1.CONST(),
  32437. __metadata('design:paramtypes', [Object])
  32438. ], AuxRoute);
  32439. return AuxRoute;
  32440. })();
  32441. exports.AuxRoute = AuxRoute;
  32442. /**
  32443. * `AsyncRoute` is a type of {@link RouteDefinition} used to route a path to an asynchronously
  32444. * loaded component.
  32445. *
  32446. * It has the following properties:
  32447. * - `path` is a string that uses the route matcher DSL.
  32448. * - `loader` is a function that returns a promise that resolves to a component.
  32449. * - `name` is an optional `CamelCase` string representing the name of the route.
  32450. * - `data` is an optional property of any type representing arbitrary route metadata for the given
  32451. * route. It is injectable via {@link RouteData}.
  32452. * - `useAsDefault` is a boolean value. If `true`, the child route will be navigated to if no child
  32453. * route is specified during the navigation.
  32454. *
  32455. * ### Example
  32456. * ```
  32457. * import {RouteConfig} from 'angular2/router';
  32458. *
  32459. * @RouteConfig([
  32460. * {path: '/home', loader: () => Promise.resolve(MyLoadedCmp), name: 'MyLoadedCmp'}
  32461. * ])
  32462. * class MyApp {}
  32463. * ```
  32464. */
  32465. var AsyncRoute = (function () {
  32466. function AsyncRoute(_a) {
  32467. var path = _a.path, loader = _a.loader, name = _a.name, data = _a.data, useAsDefault = _a.useAsDefault;
  32468. this.aux = null;
  32469. this.path = path;
  32470. this.loader = loader;
  32471. this.name = name;
  32472. this.data = data;
  32473. this.useAsDefault = useAsDefault;
  32474. }
  32475. AsyncRoute = __decorate([
  32476. lang_1.CONST(),
  32477. __metadata('design:paramtypes', [Object])
  32478. ], AsyncRoute);
  32479. return AsyncRoute;
  32480. })();
  32481. exports.AsyncRoute = AsyncRoute;
  32482. /**
  32483. * `Redirect` is a type of {@link RouteDefinition} used to route a path to a canonical route.
  32484. *
  32485. * It has the following properties:
  32486. * - `path` is a string that uses the route matcher DSL.
  32487. * - `redirectTo` is an array representing the link DSL.
  32488. *
  32489. * Note that redirects **do not** affect how links are generated. For that, see the `useAsDefault`
  32490. * option.
  32491. *
  32492. * ### Example
  32493. * ```
  32494. * import {RouteConfig} from 'angular2/router';
  32495. *
  32496. * @RouteConfig([
  32497. * {path: '/', redirectTo: ['/Home'] },
  32498. * {path: '/home', component: HomeCmp, name: 'Home'}
  32499. * ])
  32500. * class MyApp {}
  32501. * ```
  32502. */
  32503. var Redirect = (function () {
  32504. function Redirect(_a) {
  32505. var path = _a.path, redirectTo = _a.redirectTo;
  32506. this.name = null;
  32507. // added next three properties to work around https://github.com/Microsoft/TypeScript/issues/4107
  32508. this.loader = null;
  32509. this.data = null;
  32510. this.aux = null;
  32511. this.useAsDefault = false;
  32512. this.path = path;
  32513. this.redirectTo = redirectTo;
  32514. }
  32515. Redirect = __decorate([
  32516. lang_1.CONST(),
  32517. __metadata('design:paramtypes', [Object])
  32518. ], Redirect);
  32519. return Redirect;
  32520. })();
  32521. exports.Redirect = Redirect;
  32522. /***/ },
  32523. /* 228 */
  32524. /***/ function(module, exports, __webpack_require__) {
  32525. var __extends = (this && this.__extends) || function (d, b) {
  32526. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  32527. function __() { this.constructor = d; }
  32528. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  32529. };
  32530. var lang_1 = __webpack_require__(5);
  32531. var exceptions_1 = __webpack_require__(14);
  32532. var promise_1 = __webpack_require__(61);
  32533. var collection_1 = __webpack_require__(12);
  32534. var instruction_1 = __webpack_require__(229);
  32535. var path_recognizer_1 = __webpack_require__(230);
  32536. var RouteMatch = (function () {
  32537. function RouteMatch() {
  32538. }
  32539. return RouteMatch;
  32540. })();
  32541. exports.RouteMatch = RouteMatch;
  32542. var PathMatch = (function (_super) {
  32543. __extends(PathMatch, _super);
  32544. function PathMatch(instruction, remaining, remainingAux) {
  32545. _super.call(this);
  32546. this.instruction = instruction;
  32547. this.remaining = remaining;
  32548. this.remainingAux = remainingAux;
  32549. }
  32550. return PathMatch;
  32551. })(RouteMatch);
  32552. exports.PathMatch = PathMatch;
  32553. var RedirectMatch = (function (_super) {
  32554. __extends(RedirectMatch, _super);
  32555. function RedirectMatch(redirectTo, specificity) {
  32556. _super.call(this);
  32557. this.redirectTo = redirectTo;
  32558. this.specificity = specificity;
  32559. }
  32560. return RedirectMatch;
  32561. })(RouteMatch);
  32562. exports.RedirectMatch = RedirectMatch;
  32563. var RedirectRecognizer = (function () {
  32564. function RedirectRecognizer(path, redirectTo) {
  32565. this.path = path;
  32566. this.redirectTo = redirectTo;
  32567. this._pathRecognizer = new path_recognizer_1.PathRecognizer(path);
  32568. this.hash = this._pathRecognizer.hash;
  32569. }
  32570. /**
  32571. * Returns `null` or a `ParsedUrl` representing the new path to match
  32572. */
  32573. RedirectRecognizer.prototype.recognize = function (beginningSegment) {
  32574. var match = null;
  32575. if (lang_1.isPresent(this._pathRecognizer.recognize(beginningSegment))) {
  32576. match = new RedirectMatch(this.redirectTo, this._pathRecognizer.specificity);
  32577. }
  32578. return promise_1.PromiseWrapper.resolve(match);
  32579. };
  32580. RedirectRecognizer.prototype.generate = function (params) {
  32581. throw new exceptions_1.BaseException("Tried to generate a redirect.");
  32582. };
  32583. return RedirectRecognizer;
  32584. })();
  32585. exports.RedirectRecognizer = RedirectRecognizer;
  32586. // represents something like '/foo/:bar'
  32587. var RouteRecognizer = (function () {
  32588. // TODO: cache component instruction instances by params and by ParsedUrl instance
  32589. function RouteRecognizer(path, handler) {
  32590. this.path = path;
  32591. this.handler = handler;
  32592. this.terminal = true;
  32593. this._cache = new collection_1.Map();
  32594. this._pathRecognizer = new path_recognizer_1.PathRecognizer(path);
  32595. this.specificity = this._pathRecognizer.specificity;
  32596. this.hash = this._pathRecognizer.hash;
  32597. this.terminal = this._pathRecognizer.terminal;
  32598. }
  32599. RouteRecognizer.prototype.recognize = function (beginningSegment) {
  32600. var _this = this;
  32601. var res = this._pathRecognizer.recognize(beginningSegment);
  32602. if (lang_1.isBlank(res)) {
  32603. return null;
  32604. }
  32605. return this.handler.resolveComponentType().then(function (_) {
  32606. var componentInstruction = _this._getInstruction(res['urlPath'], res['urlParams'], res['allParams']);
  32607. return new PathMatch(componentInstruction, res['nextSegment'], res['auxiliary']);
  32608. });
  32609. };
  32610. RouteRecognizer.prototype.generate = function (params) {
  32611. var generated = this._pathRecognizer.generate(params);
  32612. var urlPath = generated['urlPath'];
  32613. var urlParams = generated['urlParams'];
  32614. return this._getInstruction(urlPath, urlParams, params);
  32615. };
  32616. RouteRecognizer.prototype.generateComponentPathValues = function (params) {
  32617. return this._pathRecognizer.generate(params);
  32618. };
  32619. RouteRecognizer.prototype._getInstruction = function (urlPath, urlParams, params) {
  32620. if (lang_1.isBlank(this.handler.componentType)) {
  32621. throw new exceptions_1.BaseException("Tried to get instruction before the type was loaded.");
  32622. }
  32623. var hashKey = urlPath + '?' + urlParams.join('?');
  32624. if (this._cache.has(hashKey)) {
  32625. return this._cache.get(hashKey);
  32626. }
  32627. var instruction = new instruction_1.ComponentInstruction(urlPath, urlParams, this.handler.data, this.handler.componentType, this.terminal, this.specificity, params);
  32628. this._cache.set(hashKey, instruction);
  32629. return instruction;
  32630. };
  32631. return RouteRecognizer;
  32632. })();
  32633. exports.RouteRecognizer = RouteRecognizer;
  32634. /***/ },
  32635. /* 229 */
  32636. /***/ function(module, exports, __webpack_require__) {
  32637. var __extends = (this && this.__extends) || function (d, b) {
  32638. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  32639. function __() { this.constructor = d; }
  32640. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  32641. };
  32642. var collection_1 = __webpack_require__(12);
  32643. var lang_1 = __webpack_require__(5);
  32644. var async_1 = __webpack_require__(60);
  32645. /**
  32646. * `RouteParams` is an immutable map of parameters for the given route
  32647. * based on the url matcher and optional parameters for that route.
  32648. *
  32649. * You can inject `RouteParams` into the constructor of a component to use it.
  32650. *
  32651. * ### Example
  32652. *
  32653. * ```
  32654. * import {Component} from 'angular2/core';
  32655. * import {bootstrap} from 'angular2/platform/browser';
  32656. * import {Router, ROUTER_DIRECTIVES, ROUTER_PROVIDERS, RouteConfig} from 'angular2/router';
  32657. *
  32658. * @Component({directives: [ROUTER_DIRECTIVES]})
  32659. * @RouteConfig([
  32660. * {path: '/user/:id', component: UserCmp, as: 'UserCmp'},
  32661. * ])
  32662. * class AppCmp {}
  32663. *
  32664. * @Component({ template: 'user: {{id}}' })
  32665. * class UserCmp {
  32666. * id: string;
  32667. * constructor(params: RouteParams) {
  32668. * this.id = params.get('id');
  32669. * }
  32670. * }
  32671. *
  32672. * bootstrap(AppCmp, ROUTER_PROVIDERS);
  32673. * ```
  32674. */
  32675. var RouteParams = (function () {
  32676. function RouteParams(params) {
  32677. this.params = params;
  32678. }
  32679. RouteParams.prototype.get = function (param) { return lang_1.normalizeBlank(collection_1.StringMapWrapper.get(this.params, param)); };
  32680. return RouteParams;
  32681. })();
  32682. exports.RouteParams = RouteParams;
  32683. /**
  32684. * `RouteData` is an immutable map of additional data you can configure in your {@link Route}.
  32685. *
  32686. * You can inject `RouteData` into the constructor of a component to use it.
  32687. *
  32688. * ### Example
  32689. *
  32690. * ```
  32691. * import {Component, View} from 'angular2/core';
  32692. * import {bootstrap} from 'angular2/platform/browser';
  32693. * import {Router, ROUTER_DIRECTIVES, routerBindings, RouteConfig} from 'angular2/router';
  32694. *
  32695. * @Component({...})
  32696. * @View({directives: [ROUTER_DIRECTIVES]})
  32697. * @RouteConfig([
  32698. * {path: '/user/:id', component: UserCmp, as: 'UserCmp', data: {isAdmin: true}},
  32699. * ])
  32700. * class AppCmp {}
  32701. *
  32702. * @Component({...})
  32703. * @View({ template: 'user: {{isAdmin}}' })
  32704. * class UserCmp {
  32705. * string: isAdmin;
  32706. * constructor(data: RouteData) {
  32707. * this.isAdmin = data.get('isAdmin');
  32708. * }
  32709. * }
  32710. *
  32711. * bootstrap(AppCmp, routerBindings(AppCmp));
  32712. * ```
  32713. */
  32714. var RouteData = (function () {
  32715. function RouteData(data) {
  32716. if (data === void 0) { data = lang_1.CONST_EXPR({}); }
  32717. this.data = data;
  32718. }
  32719. RouteData.prototype.get = function (key) { return lang_1.normalizeBlank(collection_1.StringMapWrapper.get(this.data, key)); };
  32720. return RouteData;
  32721. })();
  32722. exports.RouteData = RouteData;
  32723. exports.BLANK_ROUTE_DATA = new RouteData();
  32724. /**
  32725. * `Instruction` is a tree of {@link ComponentInstruction}s with all the information needed
  32726. * to transition each component in the app to a given route, including all auxiliary routes.
  32727. *
  32728. * `Instruction`s can be created using {@link Router#generate}, and can be used to
  32729. * perform route changes with {@link Router#navigateByInstruction}.
  32730. *
  32731. * ### Example
  32732. *
  32733. * ```
  32734. * import {Component} from 'angular2/core';
  32735. * import {bootstrap} from 'angular2/platform/browser';
  32736. * import {Router, ROUTER_DIRECTIVES, ROUTER_PROVIDERS, RouteConfig} from 'angular2/router';
  32737. *
  32738. * @Component({directives: [ROUTER_DIRECTIVES]})
  32739. * @RouteConfig([
  32740. * {...},
  32741. * ])
  32742. * class AppCmp {
  32743. * constructor(router: Router) {
  32744. * var instruction = router.generate(['/MyRoute']);
  32745. * router.navigateByInstruction(instruction);
  32746. * }
  32747. * }
  32748. *
  32749. * bootstrap(AppCmp, ROUTER_PROVIDERS);
  32750. * ```
  32751. */
  32752. var Instruction = (function () {
  32753. function Instruction() {
  32754. this.auxInstruction = {};
  32755. }
  32756. Object.defineProperty(Instruction.prototype, "urlPath", {
  32757. get: function () { return this.component.urlPath; },
  32758. enumerable: true,
  32759. configurable: true
  32760. });
  32761. Object.defineProperty(Instruction.prototype, "urlParams", {
  32762. get: function () { return this.component.urlParams; },
  32763. enumerable: true,
  32764. configurable: true
  32765. });
  32766. Object.defineProperty(Instruction.prototype, "specificity", {
  32767. get: function () {
  32768. var total = 0;
  32769. if (lang_1.isPresent(this.component)) {
  32770. total += this.component.specificity;
  32771. }
  32772. if (lang_1.isPresent(this.child)) {
  32773. total += this.child.specificity;
  32774. }
  32775. return total;
  32776. },
  32777. enumerable: true,
  32778. configurable: true
  32779. });
  32780. /**
  32781. * converts the instruction into a URL string
  32782. */
  32783. Instruction.prototype.toRootUrl = function () { return this.toUrlPath() + this.toUrlQuery(); };
  32784. /** @internal */
  32785. Instruction.prototype._toNonRootUrl = function () {
  32786. return this._stringifyPathMatrixAuxPrefixed() +
  32787. (lang_1.isPresent(this.child) ? this.child._toNonRootUrl() : '');
  32788. };
  32789. Instruction.prototype.toUrlQuery = function () { return this.urlParams.length > 0 ? ('?' + this.urlParams.join('&')) : ''; };
  32790. /**
  32791. * Returns a new instruction that shares the state of the existing instruction, but with
  32792. * the given child {@link Instruction} replacing the existing child.
  32793. */
  32794. Instruction.prototype.replaceChild = function (child) {
  32795. return new ResolvedInstruction(this.component, child, this.auxInstruction);
  32796. };
  32797. /**
  32798. * If the final URL for the instruction is ``
  32799. */
  32800. Instruction.prototype.toUrlPath = function () {
  32801. return this.urlPath + this._stringifyAux() +
  32802. (lang_1.isPresent(this.child) ? this.child._toNonRootUrl() : '');
  32803. };
  32804. // default instructions override these
  32805. Instruction.prototype.toLinkUrl = function () {
  32806. return this.urlPath + this._stringifyAux() +
  32807. (lang_1.isPresent(this.child) ? this.child._toLinkUrl() : '');
  32808. };
  32809. // this is the non-root version (called recursively)
  32810. /** @internal */
  32811. Instruction.prototype._toLinkUrl = function () {
  32812. return this._stringifyPathMatrixAuxPrefixed() +
  32813. (lang_1.isPresent(this.child) ? this.child._toLinkUrl() : '');
  32814. };
  32815. /** @internal */
  32816. Instruction.prototype._stringifyPathMatrixAuxPrefixed = function () {
  32817. var primary = this._stringifyPathMatrixAux();
  32818. if (primary.length > 0) {
  32819. primary = '/' + primary;
  32820. }
  32821. return primary;
  32822. };
  32823. /** @internal */
  32824. Instruction.prototype._stringifyMatrixParams = function () {
  32825. return this.urlParams.length > 0 ? (';' + this.component.urlParams.join(';')) : '';
  32826. };
  32827. /** @internal */
  32828. Instruction.prototype._stringifyPathMatrixAux = function () {
  32829. if (lang_1.isBlank(this.component)) {
  32830. return '';
  32831. }
  32832. return this.urlPath + this._stringifyMatrixParams() + this._stringifyAux();
  32833. };
  32834. /** @internal */
  32835. Instruction.prototype._stringifyAux = function () {
  32836. var routes = [];
  32837. collection_1.StringMapWrapper.forEach(this.auxInstruction, function (auxInstruction, _) {
  32838. routes.push(auxInstruction._stringifyPathMatrixAux());
  32839. });
  32840. if (routes.length > 0) {
  32841. return '(' + routes.join('//') + ')';
  32842. }
  32843. return '';
  32844. };
  32845. return Instruction;
  32846. })();
  32847. exports.Instruction = Instruction;
  32848. /**
  32849. * a resolved instruction has an outlet instruction for itself, but maybe not for...
  32850. */
  32851. var ResolvedInstruction = (function (_super) {
  32852. __extends(ResolvedInstruction, _super);
  32853. function ResolvedInstruction(component, child, auxInstruction) {
  32854. _super.call(this);
  32855. this.component = component;
  32856. this.child = child;
  32857. this.auxInstruction = auxInstruction;
  32858. }
  32859. ResolvedInstruction.prototype.resolveComponent = function () {
  32860. return async_1.PromiseWrapper.resolve(this.component);
  32861. };
  32862. return ResolvedInstruction;
  32863. })(Instruction);
  32864. exports.ResolvedInstruction = ResolvedInstruction;
  32865. /**
  32866. * Represents a resolved default route
  32867. */
  32868. var DefaultInstruction = (function (_super) {
  32869. __extends(DefaultInstruction, _super);
  32870. function DefaultInstruction(component, child) {
  32871. _super.call(this);
  32872. this.component = component;
  32873. this.child = child;
  32874. }
  32875. DefaultInstruction.prototype.resolveComponent = function () {
  32876. return async_1.PromiseWrapper.resolve(this.component);
  32877. };
  32878. DefaultInstruction.prototype.toLinkUrl = function () { return ''; };
  32879. /** @internal */
  32880. DefaultInstruction.prototype._toLinkUrl = function () { return ''; };
  32881. return DefaultInstruction;
  32882. })(Instruction);
  32883. exports.DefaultInstruction = DefaultInstruction;
  32884. /**
  32885. * Represents a component that may need to do some redirection or lazy loading at a later time.
  32886. */
  32887. var UnresolvedInstruction = (function (_super) {
  32888. __extends(UnresolvedInstruction, _super);
  32889. function UnresolvedInstruction(_resolver, _urlPath, _urlParams) {
  32890. if (_urlPath === void 0) { _urlPath = ''; }
  32891. if (_urlParams === void 0) { _urlParams = lang_1.CONST_EXPR([]); }
  32892. _super.call(this);
  32893. this._resolver = _resolver;
  32894. this._urlPath = _urlPath;
  32895. this._urlParams = _urlParams;
  32896. }
  32897. Object.defineProperty(UnresolvedInstruction.prototype, "urlPath", {
  32898. get: function () {
  32899. if (lang_1.isPresent(this.component)) {
  32900. return this.component.urlPath;
  32901. }
  32902. if (lang_1.isPresent(this._urlPath)) {
  32903. return this._urlPath;
  32904. }
  32905. return '';
  32906. },
  32907. enumerable: true,
  32908. configurable: true
  32909. });
  32910. Object.defineProperty(UnresolvedInstruction.prototype, "urlParams", {
  32911. get: function () {
  32912. if (lang_1.isPresent(this.component)) {
  32913. return this.component.urlParams;
  32914. }
  32915. if (lang_1.isPresent(this._urlParams)) {
  32916. return this._urlParams;
  32917. }
  32918. return [];
  32919. },
  32920. enumerable: true,
  32921. configurable: true
  32922. });
  32923. UnresolvedInstruction.prototype.resolveComponent = function () {
  32924. var _this = this;
  32925. if (lang_1.isPresent(this.component)) {
  32926. return async_1.PromiseWrapper.resolve(this.component);
  32927. }
  32928. return this._resolver().then(function (resolution) {
  32929. _this.child = resolution.child;
  32930. return _this.component = resolution.component;
  32931. });
  32932. };
  32933. return UnresolvedInstruction;
  32934. })(Instruction);
  32935. exports.UnresolvedInstruction = UnresolvedInstruction;
  32936. var RedirectInstruction = (function (_super) {
  32937. __extends(RedirectInstruction, _super);
  32938. function RedirectInstruction(component, child, auxInstruction) {
  32939. _super.call(this, component, child, auxInstruction);
  32940. }
  32941. return RedirectInstruction;
  32942. })(ResolvedInstruction);
  32943. exports.RedirectInstruction = RedirectInstruction;
  32944. /**
  32945. * A `ComponentInstruction` represents the route state for a single component. An `Instruction` is
  32946. * composed of a tree of these `ComponentInstruction`s.
  32947. *
  32948. * `ComponentInstructions` is a public API. Instances of `ComponentInstruction` are passed
  32949. * to route lifecycle hooks, like {@link CanActivate}.
  32950. *
  32951. * `ComponentInstruction`s are [https://en.wikipedia.org/wiki/Hash_consing](hash consed). You should
  32952. * never construct one yourself with "new." Instead, rely on {@link Router/RouteRecognizer} to
  32953. * construct `ComponentInstruction`s.
  32954. *
  32955. * You should not modify this object. It should be treated as immutable.
  32956. */
  32957. var ComponentInstruction = (function () {
  32958. function ComponentInstruction(urlPath, urlParams, data, componentType, terminal, specificity, params) {
  32959. if (params === void 0) { params = null; }
  32960. this.urlPath = urlPath;
  32961. this.urlParams = urlParams;
  32962. this.componentType = componentType;
  32963. this.terminal = terminal;
  32964. this.specificity = specificity;
  32965. this.params = params;
  32966. this.reuse = false;
  32967. this.routeData = lang_1.isPresent(data) ? data : exports.BLANK_ROUTE_DATA;
  32968. }
  32969. return ComponentInstruction;
  32970. })();
  32971. exports.ComponentInstruction = ComponentInstruction;
  32972. /***/ },
  32973. /* 230 */
  32974. /***/ function(module, exports, __webpack_require__) {
  32975. var lang_1 = __webpack_require__(5);
  32976. var exceptions_1 = __webpack_require__(14);
  32977. var collection_1 = __webpack_require__(12);
  32978. var url_parser_1 = __webpack_require__(231);
  32979. var TouchMap = (function () {
  32980. function TouchMap(map) {
  32981. var _this = this;
  32982. this.map = {};
  32983. this.keys = {};
  32984. if (lang_1.isPresent(map)) {
  32985. collection_1.StringMapWrapper.forEach(map, function (value, key) {
  32986. _this.map[key] = lang_1.isPresent(value) ? value.toString() : null;
  32987. _this.keys[key] = true;
  32988. });
  32989. }
  32990. }
  32991. TouchMap.prototype.get = function (key) {
  32992. collection_1.StringMapWrapper.delete(this.keys, key);
  32993. return this.map[key];
  32994. };
  32995. TouchMap.prototype.getUnused = function () {
  32996. var _this = this;
  32997. var unused = {};
  32998. var keys = collection_1.StringMapWrapper.keys(this.keys);
  32999. keys.forEach(function (key) { return unused[key] = collection_1.StringMapWrapper.get(_this.map, key); });
  33000. return unused;
  33001. };
  33002. return TouchMap;
  33003. })();
  33004. function normalizeString(obj) {
  33005. if (lang_1.isBlank(obj)) {
  33006. return null;
  33007. }
  33008. else {
  33009. return obj.toString();
  33010. }
  33011. }
  33012. var ContinuationSegment = (function () {
  33013. function ContinuationSegment() {
  33014. this.name = '';
  33015. }
  33016. ContinuationSegment.prototype.generate = function (params) { return ''; };
  33017. ContinuationSegment.prototype.match = function (path) { return true; };
  33018. return ContinuationSegment;
  33019. })();
  33020. var StaticSegment = (function () {
  33021. function StaticSegment(path) {
  33022. this.path = path;
  33023. this.name = '';
  33024. }
  33025. StaticSegment.prototype.match = function (path) { return path == this.path; };
  33026. StaticSegment.prototype.generate = function (params) { return this.path; };
  33027. return StaticSegment;
  33028. })();
  33029. var DynamicSegment = (function () {
  33030. function DynamicSegment(name) {
  33031. this.name = name;
  33032. }
  33033. DynamicSegment.prototype.match = function (path) { return path.length > 0; };
  33034. DynamicSegment.prototype.generate = function (params) {
  33035. if (!collection_1.StringMapWrapper.contains(params.map, this.name)) {
  33036. throw new exceptions_1.BaseException("Route generator for '" + this.name + "' was not included in parameters passed.");
  33037. }
  33038. return normalizeString(params.get(this.name));
  33039. };
  33040. return DynamicSegment;
  33041. })();
  33042. var StarSegment = (function () {
  33043. function StarSegment(name) {
  33044. this.name = name;
  33045. }
  33046. StarSegment.prototype.match = function (path) { return true; };
  33047. StarSegment.prototype.generate = function (params) { return normalizeString(params.get(this.name)); };
  33048. return StarSegment;
  33049. })();
  33050. var paramMatcher = /^:([^\/]+)$/g;
  33051. var wildcardMatcher = /^\*([^\/]+)$/g;
  33052. function parsePathString(route) {
  33053. // normalize route as not starting with a "/". Recognition will
  33054. // also normalize.
  33055. if (route.startsWith("/")) {
  33056. route = route.substring(1);
  33057. }
  33058. var segments = splitBySlash(route);
  33059. var results = [];
  33060. var specificity = 0;
  33061. // The "specificity" of a path is used to determine which route is used when multiple routes match
  33062. // a URL.
  33063. // Static segments (like "/foo") are the most specific, followed by dynamic segments (like
  33064. // "/:id"). Star segments
  33065. // add no specificity. Segments at the start of the path are more specific than proceeding ones.
  33066. // The code below uses place values to combine the different types of segments into a single
  33067. // integer that we can
  33068. // sort later. Each static segment is worth hundreds of points of specificity (10000, 9900, ...,
  33069. // 200), and each
  33070. // dynamic segment is worth single points of specificity (100, 99, ... 2).
  33071. if (segments.length > 98) {
  33072. throw new exceptions_1.BaseException("'" + route + "' has more than the maximum supported number of segments.");
  33073. }
  33074. var limit = segments.length - 1;
  33075. for (var i = 0; i <= limit; i++) {
  33076. var segment = segments[i], match;
  33077. if (lang_1.isPresent(match = lang_1.RegExpWrapper.firstMatch(paramMatcher, segment))) {
  33078. results.push(new DynamicSegment(match[1]));
  33079. specificity += (100 - i);
  33080. }
  33081. else if (lang_1.isPresent(match = lang_1.RegExpWrapper.firstMatch(wildcardMatcher, segment))) {
  33082. results.push(new StarSegment(match[1]));
  33083. }
  33084. else if (segment == '...') {
  33085. if (i < limit) {
  33086. throw new exceptions_1.BaseException("Unexpected \"...\" before the end of the path for \"" + route + "\".");
  33087. }
  33088. results.push(new ContinuationSegment());
  33089. }
  33090. else {
  33091. results.push(new StaticSegment(segment));
  33092. specificity += 100 * (100 - i);
  33093. }
  33094. }
  33095. var result = collection_1.StringMapWrapper.create();
  33096. collection_1.StringMapWrapper.set(result, 'segments', results);
  33097. collection_1.StringMapWrapper.set(result, 'specificity', specificity);
  33098. return result;
  33099. }
  33100. // this function is used to determine whether a route config path like `/foo/:id` collides with
  33101. // `/foo/:name`
  33102. function pathDslHash(segments) {
  33103. return segments.map(function (segment) {
  33104. if (segment instanceof StarSegment) {
  33105. return '*';
  33106. }
  33107. else if (segment instanceof ContinuationSegment) {
  33108. return '...';
  33109. }
  33110. else if (segment instanceof DynamicSegment) {
  33111. return ':';
  33112. }
  33113. else if (segment instanceof StaticSegment) {
  33114. return segment.path;
  33115. }
  33116. })
  33117. .join('/');
  33118. }
  33119. function splitBySlash(url) {
  33120. return url.split('/');
  33121. }
  33122. var RESERVED_CHARS = lang_1.RegExpWrapper.create('//|\\(|\\)|;|\\?|=');
  33123. function assertPath(path) {
  33124. if (lang_1.StringWrapper.contains(path, '#')) {
  33125. throw new exceptions_1.BaseException("Path \"" + path + "\" should not include \"#\". Use \"HashLocationStrategy\" instead.");
  33126. }
  33127. var illegalCharacter = lang_1.RegExpWrapper.firstMatch(RESERVED_CHARS, path);
  33128. if (lang_1.isPresent(illegalCharacter)) {
  33129. throw new exceptions_1.BaseException("Path \"" + path + "\" contains \"" + illegalCharacter[0] + "\" which is not allowed in a route config.");
  33130. }
  33131. }
  33132. /**
  33133. * Parses a URL string using a given matcher DSL, and generates URLs from param maps
  33134. */
  33135. var PathRecognizer = (function () {
  33136. function PathRecognizer(path) {
  33137. this.path = path;
  33138. this.terminal = true;
  33139. assertPath(path);
  33140. var parsed = parsePathString(path);
  33141. this._segments = parsed['segments'];
  33142. this.specificity = parsed['specificity'];
  33143. this.hash = pathDslHash(this._segments);
  33144. var lastSegment = this._segments[this._segments.length - 1];
  33145. this.terminal = !(lastSegment instanceof ContinuationSegment);
  33146. }
  33147. PathRecognizer.prototype.recognize = function (beginningSegment) {
  33148. var nextSegment = beginningSegment;
  33149. var currentSegment;
  33150. var positionalParams = {};
  33151. var captured = [];
  33152. for (var i = 0; i < this._segments.length; i += 1) {
  33153. var segment = this._segments[i];
  33154. currentSegment = nextSegment;
  33155. if (segment instanceof ContinuationSegment) {
  33156. break;
  33157. }
  33158. if (lang_1.isPresent(currentSegment)) {
  33159. captured.push(currentSegment.path);
  33160. // the star segment consumes all of the remaining URL, including matrix params
  33161. if (segment instanceof StarSegment) {
  33162. positionalParams[segment.name] = currentSegment.toString();
  33163. nextSegment = null;
  33164. break;
  33165. }
  33166. if (segment instanceof DynamicSegment) {
  33167. positionalParams[segment.name] = currentSegment.path;
  33168. }
  33169. else if (!segment.match(currentSegment.path)) {
  33170. return null;
  33171. }
  33172. nextSegment = currentSegment.child;
  33173. }
  33174. else if (!segment.match('')) {
  33175. return null;
  33176. }
  33177. }
  33178. if (this.terminal && lang_1.isPresent(nextSegment)) {
  33179. return null;
  33180. }
  33181. var urlPath = captured.join('/');
  33182. var auxiliary;
  33183. var urlParams;
  33184. var allParams;
  33185. if (lang_1.isPresent(currentSegment)) {
  33186. // If this is the root component, read query params. Otherwise, read matrix params.
  33187. var paramsSegment = beginningSegment instanceof url_parser_1.RootUrl ? beginningSegment : currentSegment;
  33188. allParams = lang_1.isPresent(paramsSegment.params) ?
  33189. collection_1.StringMapWrapper.merge(paramsSegment.params, positionalParams) :
  33190. positionalParams;
  33191. urlParams = url_parser_1.serializeParams(paramsSegment.params);
  33192. auxiliary = currentSegment.auxiliary;
  33193. }
  33194. else {
  33195. allParams = positionalParams;
  33196. auxiliary = [];
  33197. urlParams = [];
  33198. }
  33199. return { urlPath: urlPath, urlParams: urlParams, allParams: allParams, auxiliary: auxiliary, nextSegment: nextSegment };
  33200. };
  33201. PathRecognizer.prototype.generate = function (params) {
  33202. var paramTokens = new TouchMap(params);
  33203. var path = [];
  33204. for (var i = 0; i < this._segments.length; i++) {
  33205. var segment = this._segments[i];
  33206. if (!(segment instanceof ContinuationSegment)) {
  33207. path.push(segment.generate(paramTokens));
  33208. }
  33209. }
  33210. var urlPath = path.join('/');
  33211. var nonPositionalParams = paramTokens.getUnused();
  33212. var urlParams = url_parser_1.serializeParams(nonPositionalParams);
  33213. return { urlPath: urlPath, urlParams: urlParams };
  33214. };
  33215. return PathRecognizer;
  33216. })();
  33217. exports.PathRecognizer = PathRecognizer;
  33218. /***/ },
  33219. /* 231 */
  33220. /***/ function(module, exports, __webpack_require__) {
  33221. var __extends = (this && this.__extends) || function (d, b) {
  33222. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  33223. function __() { this.constructor = d; }
  33224. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  33225. };
  33226. var collection_1 = __webpack_require__(12);
  33227. var lang_1 = __webpack_require__(5);
  33228. var exceptions_1 = __webpack_require__(14);
  33229. /**
  33230. * This class represents a parsed URL
  33231. */
  33232. var Url = (function () {
  33233. function Url(path, child, auxiliary, params) {
  33234. if (child === void 0) { child = null; }
  33235. if (auxiliary === void 0) { auxiliary = lang_1.CONST_EXPR([]); }
  33236. if (params === void 0) { params = null; }
  33237. this.path = path;
  33238. this.child = child;
  33239. this.auxiliary = auxiliary;
  33240. this.params = params;
  33241. }
  33242. Url.prototype.toString = function () {
  33243. return this.path + this._matrixParamsToString() + this._auxToString() + this._childString();
  33244. };
  33245. Url.prototype.segmentToString = function () { return this.path + this._matrixParamsToString(); };
  33246. /** @internal */
  33247. Url.prototype._auxToString = function () {
  33248. return this.auxiliary.length > 0 ?
  33249. ('(' + this.auxiliary.map(function (sibling) { return sibling.toString(); }).join('//') + ')') :
  33250. '';
  33251. };
  33252. Url.prototype._matrixParamsToString = function () {
  33253. if (lang_1.isBlank(this.params)) {
  33254. return '';
  33255. }
  33256. return ';' + serializeParams(this.params).join(';');
  33257. };
  33258. /** @internal */
  33259. Url.prototype._childString = function () { return lang_1.isPresent(this.child) ? ('/' + this.child.toString()) : ''; };
  33260. return Url;
  33261. })();
  33262. exports.Url = Url;
  33263. var RootUrl = (function (_super) {
  33264. __extends(RootUrl, _super);
  33265. function RootUrl(path, child, auxiliary, params) {
  33266. if (child === void 0) { child = null; }
  33267. if (auxiliary === void 0) { auxiliary = lang_1.CONST_EXPR([]); }
  33268. if (params === void 0) { params = null; }
  33269. _super.call(this, path, child, auxiliary, params);
  33270. }
  33271. RootUrl.prototype.toString = function () {
  33272. return this.path + this._auxToString() + this._childString() + this._queryParamsToString();
  33273. };
  33274. RootUrl.prototype.segmentToString = function () { return this.path + this._queryParamsToString(); };
  33275. RootUrl.prototype._queryParamsToString = function () {
  33276. if (lang_1.isBlank(this.params)) {
  33277. return '';
  33278. }
  33279. return '?' + serializeParams(this.params).join('&');
  33280. };
  33281. return RootUrl;
  33282. })(Url);
  33283. exports.RootUrl = RootUrl;
  33284. function pathSegmentsToUrl(pathSegments) {
  33285. var url = new Url(pathSegments[pathSegments.length - 1]);
  33286. for (var i = pathSegments.length - 2; i >= 0; i -= 1) {
  33287. url = new Url(pathSegments[i], url);
  33288. }
  33289. return url;
  33290. }
  33291. exports.pathSegmentsToUrl = pathSegmentsToUrl;
  33292. var SEGMENT_RE = lang_1.RegExpWrapper.create('^[^\\/\\(\\)\\?;=&#]+');
  33293. function matchUrlSegment(str) {
  33294. var match = lang_1.RegExpWrapper.firstMatch(SEGMENT_RE, str);
  33295. return lang_1.isPresent(match) ? match[0] : '';
  33296. }
  33297. var UrlParser = (function () {
  33298. function UrlParser() {
  33299. }
  33300. UrlParser.prototype.peekStartsWith = function (str) { return this._remaining.startsWith(str); };
  33301. UrlParser.prototype.capture = function (str) {
  33302. if (!this._remaining.startsWith(str)) {
  33303. throw new exceptions_1.BaseException("Expected \"" + str + "\".");
  33304. }
  33305. this._remaining = this._remaining.substring(str.length);
  33306. };
  33307. UrlParser.prototype.parse = function (url) {
  33308. this._remaining = url;
  33309. if (url == '' || url == '/') {
  33310. return new Url('');
  33311. }
  33312. return this.parseRoot();
  33313. };
  33314. // segment + (aux segments) + (query params)
  33315. UrlParser.prototype.parseRoot = function () {
  33316. if (this.peekStartsWith('/')) {
  33317. this.capture('/');
  33318. }
  33319. var path = matchUrlSegment(this._remaining);
  33320. this.capture(path);
  33321. var aux = [];
  33322. if (this.peekStartsWith('(')) {
  33323. aux = this.parseAuxiliaryRoutes();
  33324. }
  33325. if (this.peekStartsWith(';')) {
  33326. // TODO: should these params just be dropped?
  33327. this.parseMatrixParams();
  33328. }
  33329. var child = null;
  33330. if (this.peekStartsWith('/') && !this.peekStartsWith('//')) {
  33331. this.capture('/');
  33332. child = this.parseSegment();
  33333. }
  33334. var queryParams = null;
  33335. if (this.peekStartsWith('?')) {
  33336. queryParams = this.parseQueryParams();
  33337. }
  33338. return new RootUrl(path, child, aux, queryParams);
  33339. };
  33340. // segment + (matrix params) + (aux segments)
  33341. UrlParser.prototype.parseSegment = function () {
  33342. if (this._remaining.length == 0) {
  33343. return null;
  33344. }
  33345. if (this.peekStartsWith('/')) {
  33346. this.capture('/');
  33347. }
  33348. var path = matchUrlSegment(this._remaining);
  33349. this.capture(path);
  33350. var matrixParams = null;
  33351. if (this.peekStartsWith(';')) {
  33352. matrixParams = this.parseMatrixParams();
  33353. }
  33354. var aux = [];
  33355. if (this.peekStartsWith('(')) {
  33356. aux = this.parseAuxiliaryRoutes();
  33357. }
  33358. var child = null;
  33359. if (this.peekStartsWith('/') && !this.peekStartsWith('//')) {
  33360. this.capture('/');
  33361. child = this.parseSegment();
  33362. }
  33363. return new Url(path, child, aux, matrixParams);
  33364. };
  33365. UrlParser.prototype.parseQueryParams = function () {
  33366. var params = {};
  33367. this.capture('?');
  33368. this.parseParam(params);
  33369. while (this._remaining.length > 0 && this.peekStartsWith('&')) {
  33370. this.capture('&');
  33371. this.parseParam(params);
  33372. }
  33373. return params;
  33374. };
  33375. UrlParser.prototype.parseMatrixParams = function () {
  33376. var params = {};
  33377. while (this._remaining.length > 0 && this.peekStartsWith(';')) {
  33378. this.capture(';');
  33379. this.parseParam(params);
  33380. }
  33381. return params;
  33382. };
  33383. UrlParser.prototype.parseParam = function (params) {
  33384. var key = matchUrlSegment(this._remaining);
  33385. if (lang_1.isBlank(key)) {
  33386. return;
  33387. }
  33388. this.capture(key);
  33389. var value = true;
  33390. if (this.peekStartsWith('=')) {
  33391. this.capture('=');
  33392. var valueMatch = matchUrlSegment(this._remaining);
  33393. if (lang_1.isPresent(valueMatch)) {
  33394. value = valueMatch;
  33395. this.capture(value);
  33396. }
  33397. }
  33398. params[key] = value;
  33399. };
  33400. UrlParser.prototype.parseAuxiliaryRoutes = function () {
  33401. var routes = [];
  33402. this.capture('(');
  33403. while (!this.peekStartsWith(')') && this._remaining.length > 0) {
  33404. routes.push(this.parseSegment());
  33405. if (this.peekStartsWith('//')) {
  33406. this.capture('//');
  33407. }
  33408. }
  33409. this.capture(')');
  33410. return routes;
  33411. };
  33412. return UrlParser;
  33413. })();
  33414. exports.UrlParser = UrlParser;
  33415. exports.parser = new UrlParser();
  33416. function serializeParams(paramMap) {
  33417. var params = [];
  33418. if (lang_1.isPresent(paramMap)) {
  33419. collection_1.StringMapWrapper.forEach(paramMap, function (value, key) {
  33420. if (value == true) {
  33421. params.push(key);
  33422. }
  33423. else {
  33424. params.push(key + '=' + value);
  33425. }
  33426. });
  33427. }
  33428. return params;
  33429. }
  33430. exports.serializeParams = serializeParams;
  33431. /***/ },
  33432. /* 232 */
  33433. /***/ function(module, exports, __webpack_require__) {
  33434. var lang_1 = __webpack_require__(5);
  33435. var exceptions_1 = __webpack_require__(14);
  33436. var collection_1 = __webpack_require__(12);
  33437. var async_1 = __webpack_require__(60);
  33438. var route_recognizer_1 = __webpack_require__(228);
  33439. var route_config_impl_1 = __webpack_require__(227);
  33440. var async_route_handler_1 = __webpack_require__(233);
  33441. var sync_route_handler_1 = __webpack_require__(234);
  33442. /**
  33443. * `ComponentRecognizer` is responsible for recognizing routes for a single component.
  33444. * It is consumed by `RouteRegistry`, which knows how to recognize an entire hierarchy of
  33445. * components.
  33446. */
  33447. var ComponentRecognizer = (function () {
  33448. function ComponentRecognizer() {
  33449. this.names = new collection_1.Map();
  33450. // map from name to recognizer
  33451. this.auxNames = new collection_1.Map();
  33452. // map from starting path to recognizer
  33453. this.auxRoutes = new collection_1.Map();
  33454. // TODO: optimize this into a trie
  33455. this.matchers = [];
  33456. this.defaultRoute = null;
  33457. }
  33458. /**
  33459. * returns whether or not the config is terminal
  33460. */
  33461. ComponentRecognizer.prototype.config = function (config) {
  33462. var handler;
  33463. if (lang_1.isPresent(config.name) && config.name[0].toUpperCase() != config.name[0]) {
  33464. var suggestedName = config.name[0].toUpperCase() + config.name.substring(1);
  33465. 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 + "\".");
  33466. }
  33467. if (config instanceof route_config_impl_1.AuxRoute) {
  33468. handler = new sync_route_handler_1.SyncRouteHandler(config.component, config.data);
  33469. var path = config.path.startsWith('/') ? config.path.substring(1) : config.path;
  33470. var recognizer = new route_recognizer_1.RouteRecognizer(config.path, handler);
  33471. this.auxRoutes.set(path, recognizer);
  33472. if (lang_1.isPresent(config.name)) {
  33473. this.auxNames.set(config.name, recognizer);
  33474. }
  33475. return recognizer.terminal;
  33476. }
  33477. var useAsDefault = false;
  33478. if (config instanceof route_config_impl_1.Redirect) {
  33479. var redirector = new route_recognizer_1.RedirectRecognizer(config.path, config.redirectTo);
  33480. this._assertNoHashCollision(redirector.hash, config.path);
  33481. this.matchers.push(redirector);
  33482. return true;
  33483. }
  33484. if (config instanceof route_config_impl_1.Route) {
  33485. handler = new sync_route_handler_1.SyncRouteHandler(config.component, config.data);
  33486. useAsDefault = lang_1.isPresent(config.useAsDefault) && config.useAsDefault;
  33487. }
  33488. else if (config instanceof route_config_impl_1.AsyncRoute) {
  33489. handler = new async_route_handler_1.AsyncRouteHandler(config.loader, config.data);
  33490. useAsDefault = lang_1.isPresent(config.useAsDefault) && config.useAsDefault;
  33491. }
  33492. var recognizer = new route_recognizer_1.RouteRecognizer(config.path, handler);
  33493. this._assertNoHashCollision(recognizer.hash, config.path);
  33494. if (useAsDefault) {
  33495. if (lang_1.isPresent(this.defaultRoute)) {
  33496. throw new exceptions_1.BaseException("Only one route can be default");
  33497. }
  33498. this.defaultRoute = recognizer;
  33499. }
  33500. this.matchers.push(recognizer);
  33501. if (lang_1.isPresent(config.name)) {
  33502. this.names.set(config.name, recognizer);
  33503. }
  33504. return recognizer.terminal;
  33505. };
  33506. ComponentRecognizer.prototype._assertNoHashCollision = function (hash, path) {
  33507. this.matchers.forEach(function (matcher) {
  33508. if (hash == matcher.hash) {
  33509. throw new exceptions_1.BaseException("Configuration '" + path + "' conflicts with existing route '" + matcher.path + "'");
  33510. }
  33511. });
  33512. };
  33513. /**
  33514. * Given a URL, returns a list of `RouteMatch`es, which are partial recognitions for some route.
  33515. */
  33516. ComponentRecognizer.prototype.recognize = function (urlParse) {
  33517. var solutions = [];
  33518. this.matchers.forEach(function (routeRecognizer) {
  33519. var pathMatch = routeRecognizer.recognize(urlParse);
  33520. if (lang_1.isPresent(pathMatch)) {
  33521. solutions.push(pathMatch);
  33522. }
  33523. });
  33524. return solutions;
  33525. };
  33526. ComponentRecognizer.prototype.recognizeAuxiliary = function (urlParse) {
  33527. var routeRecognizer = this.auxRoutes.get(urlParse.path);
  33528. if (lang_1.isPresent(routeRecognizer)) {
  33529. return [routeRecognizer.recognize(urlParse)];
  33530. }
  33531. return [async_1.PromiseWrapper.resolve(null)];
  33532. };
  33533. ComponentRecognizer.prototype.hasRoute = function (name) { return this.names.has(name); };
  33534. ComponentRecognizer.prototype.componentLoaded = function (name) {
  33535. return this.hasRoute(name) && lang_1.isPresent(this.names.get(name).handler.componentType);
  33536. };
  33537. ComponentRecognizer.prototype.loadComponent = function (name) {
  33538. return this.names.get(name).handler.resolveComponentType();
  33539. };
  33540. ComponentRecognizer.prototype.generate = function (name, params) {
  33541. var pathRecognizer = this.names.get(name);
  33542. if (lang_1.isBlank(pathRecognizer)) {
  33543. return null;
  33544. }
  33545. return pathRecognizer.generate(params);
  33546. };
  33547. ComponentRecognizer.prototype.generateAuxiliary = function (name, params) {
  33548. var pathRecognizer = this.auxNames.get(name);
  33549. if (lang_1.isBlank(pathRecognizer)) {
  33550. return null;
  33551. }
  33552. return pathRecognizer.generate(params);
  33553. };
  33554. return ComponentRecognizer;
  33555. })();
  33556. exports.ComponentRecognizer = ComponentRecognizer;
  33557. /***/ },
  33558. /* 233 */
  33559. /***/ function(module, exports, __webpack_require__) {
  33560. var lang_1 = __webpack_require__(5);
  33561. var instruction_1 = __webpack_require__(229);
  33562. var AsyncRouteHandler = (function () {
  33563. function AsyncRouteHandler(_loader, data) {
  33564. if (data === void 0) { data = null; }
  33565. this._loader = _loader;
  33566. /** @internal */
  33567. this._resolvedComponent = null;
  33568. this.data = lang_1.isPresent(data) ? new instruction_1.RouteData(data) : instruction_1.BLANK_ROUTE_DATA;
  33569. }
  33570. AsyncRouteHandler.prototype.resolveComponentType = function () {
  33571. var _this = this;
  33572. if (lang_1.isPresent(this._resolvedComponent)) {
  33573. return this._resolvedComponent;
  33574. }
  33575. return this._resolvedComponent = this._loader().then(function (componentType) {
  33576. _this.componentType = componentType;
  33577. return componentType;
  33578. });
  33579. };
  33580. return AsyncRouteHandler;
  33581. })();
  33582. exports.AsyncRouteHandler = AsyncRouteHandler;
  33583. /***/ },
  33584. /* 234 */
  33585. /***/ function(module, exports, __webpack_require__) {
  33586. var async_1 = __webpack_require__(60);
  33587. var lang_1 = __webpack_require__(5);
  33588. var instruction_1 = __webpack_require__(229);
  33589. var SyncRouteHandler = (function () {
  33590. function SyncRouteHandler(componentType, data) {
  33591. this.componentType = componentType;
  33592. /** @internal */
  33593. this._resolvedComponent = null;
  33594. this._resolvedComponent = async_1.PromiseWrapper.resolve(componentType);
  33595. this.data = lang_1.isPresent(data) ? new instruction_1.RouteData(data) : instruction_1.BLANK_ROUTE_DATA;
  33596. }
  33597. SyncRouteHandler.prototype.resolveComponentType = function () { return this._resolvedComponent; };
  33598. return SyncRouteHandler;
  33599. })();
  33600. exports.SyncRouteHandler = SyncRouteHandler;
  33601. /***/ },
  33602. /* 235 */
  33603. /***/ function(module, exports, __webpack_require__) {
  33604. var route_config_decorator_1 = __webpack_require__(236);
  33605. var lang_1 = __webpack_require__(5);
  33606. var exceptions_1 = __webpack_require__(14);
  33607. /**
  33608. * Given a JS Object that represents a route config, returns a corresponding Route, AsyncRoute,
  33609. * AuxRoute or Redirect object.
  33610. *
  33611. * Also wraps an AsyncRoute's loader function to add the loaded component's route config to the
  33612. * `RouteRegistry`.
  33613. */
  33614. function normalizeRouteConfig(config, registry) {
  33615. if (config instanceof route_config_decorator_1.AsyncRoute) {
  33616. var wrappedLoader = wrapLoaderToReconfigureRegistry(config.loader, registry);
  33617. return new route_config_decorator_1.AsyncRoute({
  33618. path: config.path,
  33619. loader: wrappedLoader,
  33620. name: config.name,
  33621. data: config.data,
  33622. useAsDefault: config.useAsDefault
  33623. });
  33624. }
  33625. if (config instanceof route_config_decorator_1.Route || config instanceof route_config_decorator_1.Redirect || config instanceof route_config_decorator_1.AuxRoute) {
  33626. return config;
  33627. }
  33628. if ((+!!config.component) + (+!!config.redirectTo) + (+!!config.loader) != 1) {
  33629. throw new exceptions_1.BaseException("Route config should contain exactly one \"component\", \"loader\", or \"redirectTo\" property.");
  33630. }
  33631. if (config.as && config.name) {
  33632. throw new exceptions_1.BaseException("Route config should contain exactly one \"as\" or \"name\" property.");
  33633. }
  33634. if (config.as) {
  33635. config.name = config.as;
  33636. }
  33637. if (config.loader) {
  33638. var wrappedLoader = wrapLoaderToReconfigureRegistry(config.loader, registry);
  33639. return new route_config_decorator_1.AsyncRoute({
  33640. path: config.path,
  33641. loader: wrappedLoader,
  33642. name: config.name,
  33643. useAsDefault: config.useAsDefault
  33644. });
  33645. }
  33646. if (config.aux) {
  33647. return new route_config_decorator_1.AuxRoute({ path: config.aux, component: config.component, name: config.name });
  33648. }
  33649. if (config.component) {
  33650. if (typeof config.component == 'object') {
  33651. var componentDefinitionObject = config.component;
  33652. if (componentDefinitionObject.type == 'constructor') {
  33653. return new route_config_decorator_1.Route({
  33654. path: config.path,
  33655. component: componentDefinitionObject.constructor,
  33656. name: config.name,
  33657. data: config.data,
  33658. useAsDefault: config.useAsDefault
  33659. });
  33660. }
  33661. else if (componentDefinitionObject.type == 'loader') {
  33662. return new route_config_decorator_1.AsyncRoute({
  33663. path: config.path,
  33664. loader: componentDefinitionObject.loader,
  33665. name: config.name,
  33666. useAsDefault: config.useAsDefault
  33667. });
  33668. }
  33669. else {
  33670. throw new exceptions_1.BaseException("Invalid component type \"" + componentDefinitionObject.type + "\". Valid types are \"constructor\" and \"loader\".");
  33671. }
  33672. }
  33673. return new route_config_decorator_1.Route(config);
  33674. }
  33675. if (config.redirectTo) {
  33676. return new route_config_decorator_1.Redirect({ path: config.path, redirectTo: config.redirectTo });
  33677. }
  33678. return config;
  33679. }
  33680. exports.normalizeRouteConfig = normalizeRouteConfig;
  33681. function wrapLoaderToReconfigureRegistry(loader, registry) {
  33682. return function () {
  33683. return loader().then(function (componentType) {
  33684. registry.configFromComponent(componentType);
  33685. return componentType;
  33686. });
  33687. };
  33688. }
  33689. function assertComponentExists(component, path) {
  33690. if (!lang_1.isType(component)) {
  33691. throw new exceptions_1.BaseException("Component for route \"" + path + "\" is not defined, or is not a class.");
  33692. }
  33693. }
  33694. exports.assertComponentExists = assertComponentExists;
  33695. /***/ },
  33696. /* 236 */
  33697. /***/ function(module, exports, __webpack_require__) {
  33698. var route_config_impl_1 = __webpack_require__(227);
  33699. var decorators_1 = __webpack_require__(9);
  33700. var route_config_impl_2 = __webpack_require__(227);
  33701. exports.Route = route_config_impl_2.Route;
  33702. exports.Redirect = route_config_impl_2.Redirect;
  33703. exports.AuxRoute = route_config_impl_2.AuxRoute;
  33704. exports.AsyncRoute = route_config_impl_2.AsyncRoute;
  33705. // Copied from RouteConfig in route_config_impl.
  33706. /**
  33707. * The `RouteConfig` decorator defines routes for a given component.
  33708. *
  33709. * It takes an array of {@link RouteDefinition}s.
  33710. */
  33711. exports.RouteConfig = decorators_1.makeDecorator(route_config_impl_1.RouteConfig);
  33712. /***/ },
  33713. /* 237 */
  33714. /***/ function(module, exports, __webpack_require__) {
  33715. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  33716. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  33717. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  33718. 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;
  33719. return c > 3 && r && Object.defineProperty(target, key, r), r;
  33720. };
  33721. var __metadata = (this && this.__metadata) || function (k, v) {
  33722. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  33723. };
  33724. var location_strategy_1 = __webpack_require__(238);
  33725. var async_1 = __webpack_require__(60);
  33726. var core_1 = __webpack_require__(2);
  33727. /**
  33728. * `Location` is a service that applications can use to interact with a browser's URL.
  33729. * Depending on which {@link LocationStrategy} is used, `Location` will either persist
  33730. * to the URL's path or the URL's hash segment.
  33731. *
  33732. * Note: it's better to use {@link Router#navigate} service to trigger route changes. Use
  33733. * `Location` only if you need to interact with or create normalized URLs outside of
  33734. * routing.
  33735. *
  33736. * `Location` is responsible for normalizing the URL against the application's base href.
  33737. * A normalized URL is absolute from the URL host, includes the application's base href, and has no
  33738. * trailing slash:
  33739. * - `/my/app/user/123` is normalized
  33740. * - `my/app/user/123` **is not** normalized
  33741. * - `/my/app/user/123/` **is not** normalized
  33742. *
  33743. * ### Example
  33744. *
  33745. * ```
  33746. * import {Component} from 'angular2/core';
  33747. * import {
  33748. * ROUTER_DIRECTIVES,
  33749. * ROUTER_PROVIDERS,
  33750. * RouteConfig,
  33751. * Location
  33752. * } from 'angular2/router';
  33753. *
  33754. * @Component({directives: [ROUTER_DIRECTIVES]})
  33755. * @RouteConfig([
  33756. * {...},
  33757. * ])
  33758. * class AppCmp {
  33759. * constructor(location: Location) {
  33760. * location.go('/foo');
  33761. * }
  33762. * }
  33763. *
  33764. * bootstrap(AppCmp, [ROUTER_PROVIDERS]);
  33765. * ```
  33766. */
  33767. var Location = (function () {
  33768. function Location(platformStrategy) {
  33769. var _this = this;
  33770. this.platformStrategy = platformStrategy;
  33771. /** @internal */
  33772. this._subject = new async_1.EventEmitter();
  33773. var browserBaseHref = this.platformStrategy.getBaseHref();
  33774. this._baseHref = stripTrailingSlash(stripIndexHtml(browserBaseHref));
  33775. this.platformStrategy.onPopState(function (ev) {
  33776. async_1.ObservableWrapper.callEmit(_this._subject, { 'url': _this.path(), 'pop': true, 'type': ev.type });
  33777. });
  33778. }
  33779. /**
  33780. * Returns the normalized URL path.
  33781. */
  33782. Location.prototype.path = function () { return this.normalize(this.platformStrategy.path()); };
  33783. /**
  33784. * Given a string representing a URL, returns the normalized URL path without leading or
  33785. * trailing slashes
  33786. */
  33787. Location.prototype.normalize = function (url) {
  33788. return stripTrailingSlash(_stripBaseHref(this._baseHref, stripIndexHtml(url)));
  33789. };
  33790. /**
  33791. * Given a string representing a URL, returns the platform-specific external URL path.
  33792. * If the given URL doesn't begin with a leading slash (`'/'`), this method adds one
  33793. * before normalizing. This method will also add a hash if `HashLocationStrategy` is
  33794. * used, or the `APP_BASE_HREF` if the `PathLocationStrategy` is in use.
  33795. */
  33796. Location.prototype.prepareExternalUrl = function (url) {
  33797. if (url.length > 0 && !url.startsWith('/')) {
  33798. url = '/' + url;
  33799. }
  33800. return this.platformStrategy.prepareExternalUrl(url);
  33801. };
  33802. // TODO: rename this method to pushState
  33803. /**
  33804. * Changes the browsers URL to the normalized version of the given URL, and pushes a
  33805. * new item onto the platform's history.
  33806. */
  33807. Location.prototype.go = function (path, query) {
  33808. if (query === void 0) { query = ''; }
  33809. this.platformStrategy.pushState(null, '', path, query);
  33810. };
  33811. /**
  33812. * Changes the browsers URL to the normalized version of the given URL, and replaces
  33813. * the top item on the platform's history stack.
  33814. */
  33815. Location.prototype.replaceState = function (path, query) {
  33816. if (query === void 0) { query = ''; }
  33817. this.platformStrategy.replaceState(null, '', path, query);
  33818. };
  33819. /**
  33820. * Navigates forward in the platform's history.
  33821. */
  33822. Location.prototype.forward = function () { this.platformStrategy.forward(); };
  33823. /**
  33824. * Navigates back in the platform's history.
  33825. */
  33826. Location.prototype.back = function () { this.platformStrategy.back(); };
  33827. /**
  33828. * Subscribe to the platform's `popState` events.
  33829. */
  33830. Location.prototype.subscribe = function (onNext, onThrow, onReturn) {
  33831. if (onThrow === void 0) { onThrow = null; }
  33832. if (onReturn === void 0) { onReturn = null; }
  33833. return async_1.ObservableWrapper.subscribe(this._subject, onNext, onThrow, onReturn);
  33834. };
  33835. Location = __decorate([
  33836. core_1.Injectable(),
  33837. __metadata('design:paramtypes', [location_strategy_1.LocationStrategy])
  33838. ], Location);
  33839. return Location;
  33840. })();
  33841. exports.Location = Location;
  33842. function _stripBaseHref(baseHref, url) {
  33843. if (baseHref.length > 0 && url.startsWith(baseHref)) {
  33844. return url.substring(baseHref.length);
  33845. }
  33846. return url;
  33847. }
  33848. function stripIndexHtml(url) {
  33849. if (/\/index.html$/g.test(url)) {
  33850. // '/index.html'.length == 11
  33851. return url.substring(0, url.length - 11);
  33852. }
  33853. return url;
  33854. }
  33855. function stripTrailingSlash(url) {
  33856. if (/\/$/g.test(url)) {
  33857. url = url.substring(0, url.length - 1);
  33858. }
  33859. return url;
  33860. }
  33861. /***/ },
  33862. /* 238 */
  33863. /***/ function(module, exports, __webpack_require__) {
  33864. var lang_1 = __webpack_require__(5);
  33865. var core_1 = __webpack_require__(2);
  33866. /**
  33867. * `LocationStrategy` is responsible for representing and reading route state
  33868. * from the browser's URL. Angular provides two strategies:
  33869. * {@link HashLocationStrategy} (default) and {@link PathLocationStrategy}.
  33870. *
  33871. * This is used under the hood of the {@link Location} service.
  33872. *
  33873. * Applications should use the {@link Router} or {@link Location} services to
  33874. * interact with application route state.
  33875. *
  33876. * For instance, {@link HashLocationStrategy} produces URLs like
  33877. * `http://example.com#/foo`, and {@link PathLocationStrategy} produces
  33878. * `http://example.com/foo` as an equivalent URL.
  33879. *
  33880. * See these two classes for more.
  33881. */
  33882. var LocationStrategy = (function () {
  33883. function LocationStrategy() {
  33884. }
  33885. return LocationStrategy;
  33886. })();
  33887. exports.LocationStrategy = LocationStrategy;
  33888. /**
  33889. * The `APP_BASE_HREF` token represents the base href to be used with the
  33890. * {@link PathLocationStrategy}.
  33891. *
  33892. * If you're using {@link PathLocationStrategy}, you must provide a provider to a string
  33893. * representing the URL prefix that should be preserved when generating and recognizing
  33894. * URLs.
  33895. *
  33896. * ### Example
  33897. *
  33898. * ```
  33899. * import {Component} from 'angular2/core';
  33900. * import {ROUTER_DIRECTIVES, ROUTER_PROVIDERS, RouteConfig} from 'angular2/router';
  33901. *
  33902. * @Component({directives: [ROUTER_DIRECTIVES]})
  33903. * @RouteConfig([
  33904. * {...},
  33905. * ])
  33906. * class AppCmp {
  33907. * // ...
  33908. * }
  33909. *
  33910. * bootstrap(AppCmp, [
  33911. * ROUTER_PROVIDERS,
  33912. * PathLocationStrategy,
  33913. * provide(APP_BASE_HREF, {useValue: '/my/app'})
  33914. * ]);
  33915. * ```
  33916. */
  33917. exports.APP_BASE_HREF = lang_1.CONST_EXPR(new core_1.OpaqueToken('appBaseHref'));
  33918. function normalizeQueryParams(params) {
  33919. return (params.length > 0 && params.substring(0, 1) != '?') ? ('?' + params) : params;
  33920. }
  33921. exports.normalizeQueryParams = normalizeQueryParams;
  33922. function joinWithSlash(start, end) {
  33923. if (start.length == 0) {
  33924. return end;
  33925. }
  33926. if (end.length == 0) {
  33927. return start;
  33928. }
  33929. var slashes = 0;
  33930. if (start.endsWith('/')) {
  33931. slashes++;
  33932. }
  33933. if (end.startsWith('/')) {
  33934. slashes++;
  33935. }
  33936. if (slashes == 2) {
  33937. return start + end.substring(1);
  33938. }
  33939. if (slashes == 1) {
  33940. return start + end;
  33941. }
  33942. return start + '/' + end;
  33943. }
  33944. exports.joinWithSlash = joinWithSlash;
  33945. /***/ },
  33946. /* 239 */
  33947. /***/ function(module, exports, __webpack_require__) {
  33948. var lang_1 = __webpack_require__(5);
  33949. var lifecycle_annotations_impl_1 = __webpack_require__(240);
  33950. var reflection_1 = __webpack_require__(16);
  33951. function hasLifecycleHook(e, type) {
  33952. if (!(type instanceof lang_1.Type))
  33953. return false;
  33954. return e.name in type.prototype;
  33955. }
  33956. exports.hasLifecycleHook = hasLifecycleHook;
  33957. function getCanActivateHook(type) {
  33958. var annotations = reflection_1.reflector.annotations(type);
  33959. for (var i = 0; i < annotations.length; i += 1) {
  33960. var annotation = annotations[i];
  33961. if (annotation instanceof lifecycle_annotations_impl_1.CanActivate) {
  33962. return annotation.fn;
  33963. }
  33964. }
  33965. return null;
  33966. }
  33967. exports.getCanActivateHook = getCanActivateHook;
  33968. /***/ },
  33969. /* 240 */
  33970. /***/ function(module, exports, __webpack_require__) {
  33971. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  33972. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  33973. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  33974. 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;
  33975. return c > 3 && r && Object.defineProperty(target, key, r), r;
  33976. };
  33977. var __metadata = (this && this.__metadata) || function (k, v) {
  33978. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  33979. };
  33980. var lang_1 = __webpack_require__(5);
  33981. var RouteLifecycleHook = (function () {
  33982. function RouteLifecycleHook(name) {
  33983. this.name = name;
  33984. }
  33985. RouteLifecycleHook = __decorate([
  33986. lang_1.CONST(),
  33987. __metadata('design:paramtypes', [String])
  33988. ], RouteLifecycleHook);
  33989. return RouteLifecycleHook;
  33990. })();
  33991. exports.RouteLifecycleHook = RouteLifecycleHook;
  33992. var CanActivate = (function () {
  33993. function CanActivate(fn) {
  33994. this.fn = fn;
  33995. }
  33996. CanActivate = __decorate([
  33997. lang_1.CONST(),
  33998. __metadata('design:paramtypes', [Function])
  33999. ], CanActivate);
  34000. return CanActivate;
  34001. })();
  34002. exports.CanActivate = CanActivate;
  34003. exports.routerCanReuse = lang_1.CONST_EXPR(new RouteLifecycleHook("routerCanReuse"));
  34004. exports.routerCanDeactivate = lang_1.CONST_EXPR(new RouteLifecycleHook("routerCanDeactivate"));
  34005. exports.routerOnActivate = lang_1.CONST_EXPR(new RouteLifecycleHook("routerOnActivate"));
  34006. exports.routerOnReuse = lang_1.CONST_EXPR(new RouteLifecycleHook("routerOnReuse"));
  34007. exports.routerOnDeactivate = lang_1.CONST_EXPR(new RouteLifecycleHook("routerOnDeactivate"));
  34008. /***/ },
  34009. /* 241 */
  34010. /***/ function(module, exports, __webpack_require__) {
  34011. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  34012. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  34013. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  34014. 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;
  34015. return c > 3 && r && Object.defineProperty(target, key, r), r;
  34016. };
  34017. var __metadata = (this && this.__metadata) || function (k, v) {
  34018. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  34019. };
  34020. var __param = (this && this.__param) || function (paramIndex, decorator) {
  34021. return function (target, key) { decorator(target, key, paramIndex); }
  34022. };
  34023. var async_1 = __webpack_require__(60);
  34024. var collection_1 = __webpack_require__(12);
  34025. var lang_1 = __webpack_require__(5);
  34026. var exceptions_1 = __webpack_require__(14);
  34027. var core_1 = __webpack_require__(2);
  34028. var routerMod = __webpack_require__(225);
  34029. var instruction_1 = __webpack_require__(229);
  34030. var hookMod = __webpack_require__(242);
  34031. var route_lifecycle_reflector_1 = __webpack_require__(239);
  34032. var _resolveToTrue = async_1.PromiseWrapper.resolve(true);
  34033. /**
  34034. * A router outlet is a placeholder that Angular dynamically fills based on the application's route.
  34035. *
  34036. * ## Use
  34037. *
  34038. * ```
  34039. * <router-outlet></router-outlet>
  34040. * ```
  34041. */
  34042. var RouterOutlet = (function () {
  34043. function RouterOutlet(_elementRef, _loader, _parentRouter, nameAttr) {
  34044. this._elementRef = _elementRef;
  34045. this._loader = _loader;
  34046. this._parentRouter = _parentRouter;
  34047. this.name = null;
  34048. this._componentRef = null;
  34049. this._currentInstruction = null;
  34050. if (lang_1.isPresent(nameAttr)) {
  34051. this.name = nameAttr;
  34052. this._parentRouter.registerAuxOutlet(this);
  34053. }
  34054. else {
  34055. this._parentRouter.registerPrimaryOutlet(this);
  34056. }
  34057. }
  34058. /**
  34059. * Called by the Router to instantiate a new component during the commit phase of a navigation.
  34060. * This method in turn is responsible for calling the `routerOnActivate` hook of its child.
  34061. */
  34062. RouterOutlet.prototype.activate = function (nextInstruction) {
  34063. var _this = this;
  34064. var previousInstruction = this._currentInstruction;
  34065. this._currentInstruction = nextInstruction;
  34066. var componentType = nextInstruction.componentType;
  34067. var childRouter = this._parentRouter.childRouter(componentType);
  34068. var providers = core_1.Injector.resolve([
  34069. core_1.provide(instruction_1.RouteData, { useValue: nextInstruction.routeData }),
  34070. core_1.provide(instruction_1.RouteParams, { useValue: new instruction_1.RouteParams(nextInstruction.params) }),
  34071. core_1.provide(routerMod.Router, { useValue: childRouter })
  34072. ]);
  34073. return this._loader.loadNextToLocation(componentType, this._elementRef, providers)
  34074. .then(function (componentRef) {
  34075. _this._componentRef = componentRef;
  34076. if (route_lifecycle_reflector_1.hasLifecycleHook(hookMod.routerOnActivate, componentType)) {
  34077. return _this._componentRef.instance
  34078. .routerOnActivate(nextInstruction, previousInstruction);
  34079. }
  34080. });
  34081. };
  34082. /**
  34083. * Called by the {@link Router} during the commit phase of a navigation when an outlet
  34084. * reuses a component between different routes.
  34085. * This method in turn is responsible for calling the `routerOnReuse` hook of its child.
  34086. */
  34087. RouterOutlet.prototype.reuse = function (nextInstruction) {
  34088. var previousInstruction = this._currentInstruction;
  34089. this._currentInstruction = nextInstruction;
  34090. if (lang_1.isBlank(this._componentRef)) {
  34091. throw new exceptions_1.BaseException("Cannot reuse an outlet that does not contain a component.");
  34092. }
  34093. return async_1.PromiseWrapper.resolve(route_lifecycle_reflector_1.hasLifecycleHook(hookMod.routerOnReuse, this._currentInstruction.componentType) ?
  34094. this._componentRef.instance
  34095. .routerOnReuse(nextInstruction, previousInstruction) :
  34096. true);
  34097. };
  34098. /**
  34099. * Called by the {@link Router} when an outlet disposes of a component's contents.
  34100. * This method in turn is responsible for calling the `routerOnDeactivate` hook of its child.
  34101. */
  34102. RouterOutlet.prototype.deactivate = function (nextInstruction) {
  34103. var _this = this;
  34104. var next = _resolveToTrue;
  34105. if (lang_1.isPresent(this._componentRef) && lang_1.isPresent(this._currentInstruction) &&
  34106. route_lifecycle_reflector_1.hasLifecycleHook(hookMod.routerOnDeactivate, this._currentInstruction.componentType)) {
  34107. next = async_1.PromiseWrapper.resolve(this._componentRef.instance
  34108. .routerOnDeactivate(nextInstruction, this._currentInstruction));
  34109. }
  34110. return next.then(function (_) {
  34111. if (lang_1.isPresent(_this._componentRef)) {
  34112. _this._componentRef.dispose();
  34113. _this._componentRef = null;
  34114. }
  34115. });
  34116. };
  34117. /**
  34118. * Called by the {@link Router} during recognition phase of a navigation.
  34119. *
  34120. * If this resolves to `false`, the given navigation is cancelled.
  34121. *
  34122. * This method delegates to the child component's `routerCanDeactivate` hook if it exists,
  34123. * and otherwise resolves to true.
  34124. */
  34125. RouterOutlet.prototype.routerCanDeactivate = function (nextInstruction) {
  34126. if (lang_1.isBlank(this._currentInstruction)) {
  34127. return _resolveToTrue;
  34128. }
  34129. if (route_lifecycle_reflector_1.hasLifecycleHook(hookMod.routerCanDeactivate, this._currentInstruction.componentType)) {
  34130. return async_1.PromiseWrapper.resolve(this._componentRef.instance
  34131. .routerCanDeactivate(nextInstruction, this._currentInstruction));
  34132. }
  34133. return _resolveToTrue;
  34134. };
  34135. /**
  34136. * Called by the {@link Router} during recognition phase of a navigation.
  34137. *
  34138. * If the new child component has a different Type than the existing child component,
  34139. * this will resolve to `false`. You can't reuse an old component when the new component
  34140. * is of a different Type.
  34141. *
  34142. * Otherwise, this method delegates to the child component's `routerCanReuse` hook if it exists,
  34143. * or resolves to true if the hook is not present.
  34144. */
  34145. RouterOutlet.prototype.routerCanReuse = function (nextInstruction) {
  34146. var result;
  34147. if (lang_1.isBlank(this._currentInstruction) ||
  34148. this._currentInstruction.componentType != nextInstruction.componentType) {
  34149. result = false;
  34150. }
  34151. else if (route_lifecycle_reflector_1.hasLifecycleHook(hookMod.routerCanReuse, this._currentInstruction.componentType)) {
  34152. result = this._componentRef.instance
  34153. .routerCanReuse(nextInstruction, this._currentInstruction);
  34154. }
  34155. else {
  34156. result = nextInstruction == this._currentInstruction ||
  34157. (lang_1.isPresent(nextInstruction.params) && lang_1.isPresent(this._currentInstruction.params) &&
  34158. collection_1.StringMapWrapper.equals(nextInstruction.params, this._currentInstruction.params));
  34159. }
  34160. return async_1.PromiseWrapper.resolve(result);
  34161. };
  34162. RouterOutlet = __decorate([
  34163. core_1.Directive({ selector: 'router-outlet' }),
  34164. __param(3, core_1.Attribute('name')),
  34165. __metadata('design:paramtypes', [core_1.ElementRef, core_1.DynamicComponentLoader, routerMod.Router, String])
  34166. ], RouterOutlet);
  34167. return RouterOutlet;
  34168. })();
  34169. exports.RouterOutlet = RouterOutlet;
  34170. /***/ },
  34171. /* 242 */
  34172. /***/ function(module, exports, __webpack_require__) {
  34173. /**
  34174. * This indirection is needed to free up Component, etc symbols in the public API
  34175. * to be used by the decorator versions of these annotations.
  34176. */
  34177. var decorators_1 = __webpack_require__(9);
  34178. var lifecycle_annotations_impl_1 = __webpack_require__(240);
  34179. var lifecycle_annotations_impl_2 = __webpack_require__(240);
  34180. exports.routerCanReuse = lifecycle_annotations_impl_2.routerCanReuse;
  34181. exports.routerCanDeactivate = lifecycle_annotations_impl_2.routerCanDeactivate;
  34182. exports.routerOnActivate = lifecycle_annotations_impl_2.routerOnActivate;
  34183. exports.routerOnReuse = lifecycle_annotations_impl_2.routerOnReuse;
  34184. exports.routerOnDeactivate = lifecycle_annotations_impl_2.routerOnDeactivate;
  34185. /**
  34186. * Defines route lifecycle hook `CanActivate`, which is called by the router to determine
  34187. * if a component can be instantiated as part of a navigation.
  34188. *
  34189. * <aside class="is-right">
  34190. * Note that unlike other lifecycle hooks, this one uses an annotation rather than an interface.
  34191. * This is because the `CanActivate` function is called before the component is instantiated.
  34192. * </aside>
  34193. *
  34194. * The `CanActivate` hook is called with two {@link ComponentInstruction}s as parameters, the first
  34195. * representing the current route being navigated to, and the second parameter representing the
  34196. * previous route or `null`.
  34197. *
  34198. * ```typescript
  34199. * @CanActivate((next, prev) => boolean | Promise<boolean>)
  34200. * ```
  34201. *
  34202. * If `CanActivate` returns or resolves to `false`, the navigation is cancelled.
  34203. * If `CanActivate` throws or rejects, the navigation is also cancelled.
  34204. * If `CanActivate` returns or resolves to `true`, navigation continues, the component is
  34205. * instantiated, and the {@link OnActivate} hook of that component is called if implemented.
  34206. *
  34207. * ### Example
  34208. *
  34209. * {@example router/ts/can_activate/can_activate_example.ts region='canActivate' }
  34210. */
  34211. exports.CanActivate = decorators_1.makeDecorator(lifecycle_annotations_impl_1.CanActivate);
  34212. /***/ },
  34213. /* 243 */
  34214. /***/ function(module, exports, __webpack_require__) {
  34215. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  34216. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  34217. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  34218. 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;
  34219. return c > 3 && r && Object.defineProperty(target, key, r), r;
  34220. };
  34221. var __metadata = (this && this.__metadata) || function (k, v) {
  34222. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  34223. };
  34224. var core_1 = __webpack_require__(2);
  34225. var lang_1 = __webpack_require__(5);
  34226. var router_1 = __webpack_require__(225);
  34227. var location_1 = __webpack_require__(237);
  34228. /**
  34229. * The RouterLink directive lets you link to specific parts of your app.
  34230. *
  34231. * Consider the following route configuration:
  34232. * ```
  34233. * @RouteConfig([
  34234. * { path: '/user', component: UserCmp, as: 'User' }
  34235. * ]);
  34236. * class MyComp {}
  34237. * ```
  34238. *
  34239. * When linking to this `User` route, you can write:
  34240. *
  34241. * ```
  34242. * <a [routerLink]="['./User']">link to user component</a>
  34243. * ```
  34244. *
  34245. * RouterLink expects the value to be an array of route names, followed by the params
  34246. * for that level of routing. For instance `['/Team', {teamId: 1}, 'User', {userId: 2}]`
  34247. * means that we want to generate a link for the `Team` route with params `{teamId: 1}`,
  34248. * and with a child route `User` with params `{userId: 2}`.
  34249. *
  34250. * The first route name should be prepended with `/`, `./`, or `../`.
  34251. * If the route begins with `/`, the router will look up the route from the root of the app.
  34252. * If the route begins with `./`, the router will instead look in the current component's
  34253. * children for the route. And if the route begins with `../`, the router will look at the
  34254. * current component's parent.
  34255. */
  34256. var RouterLink = (function () {
  34257. function RouterLink(_router, _location) {
  34258. this._router = _router;
  34259. this._location = _location;
  34260. }
  34261. Object.defineProperty(RouterLink.prototype, "isRouteActive", {
  34262. get: function () { return this._router.isRouteActive(this._navigationInstruction); },
  34263. enumerable: true,
  34264. configurable: true
  34265. });
  34266. Object.defineProperty(RouterLink.prototype, "routeParams", {
  34267. set: function (changes) {
  34268. this._routeParams = changes;
  34269. this._navigationInstruction = this._router.generate(this._routeParams);
  34270. var navigationHref = this._navigationInstruction.toLinkUrl();
  34271. this.visibleHref = this._location.prepareExternalUrl(navigationHref);
  34272. },
  34273. enumerable: true,
  34274. configurable: true
  34275. });
  34276. RouterLink.prototype.onClick = function () {
  34277. // If no target, or if target is _self, prevent default browser behavior
  34278. if (!lang_1.isString(this.target) || this.target == '_self') {
  34279. this._router.navigateByInstruction(this._navigationInstruction);
  34280. return false;
  34281. }
  34282. return true;
  34283. };
  34284. RouterLink = __decorate([
  34285. core_1.Directive({
  34286. selector: '[routerLink]',
  34287. inputs: ['routeParams: routerLink', 'target: target'],
  34288. host: {
  34289. '(click)': 'onClick()',
  34290. '[attr.href]': 'visibleHref',
  34291. '[class.router-link-active]': 'isRouteActive'
  34292. }
  34293. }),
  34294. __metadata('design:paramtypes', [router_1.Router, location_1.Location])
  34295. ], RouterLink);
  34296. return RouterLink;
  34297. })();
  34298. exports.RouterLink = RouterLink;
  34299. /***/ },
  34300. /* 244 */
  34301. /***/ function(module, exports, __webpack_require__) {
  34302. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  34303. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  34304. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  34305. 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;
  34306. return c > 3 && r && Object.defineProperty(target, key, r), r;
  34307. };
  34308. var __metadata = (this && this.__metadata) || function (k, v) {
  34309. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  34310. };
  34311. var dom_adapter_1 = __webpack_require__(178);
  34312. var core_1 = __webpack_require__(2);
  34313. /**
  34314. * `PlatformLocation` encapsulates all of the direct calls to platform APIs.
  34315. * This class should not be used directly by an application developer. Instead, use
  34316. * {@link Location}.
  34317. */
  34318. var PlatformLocation = (function () {
  34319. function PlatformLocation() {
  34320. this._init();
  34321. }
  34322. // This is moved to its own method so that `MockPlatformLocationStrategy` can overwrite it
  34323. /** @internal */
  34324. PlatformLocation.prototype._init = function () {
  34325. this._location = dom_adapter_1.DOM.getLocation();
  34326. this._history = dom_adapter_1.DOM.getHistory();
  34327. };
  34328. PlatformLocation.prototype.getBaseHrefFromDOM = function () { return dom_adapter_1.DOM.getBaseHref(); };
  34329. PlatformLocation.prototype.onPopState = function (fn) {
  34330. dom_adapter_1.DOM.getGlobalEventTarget('window').addEventListener('popstate', fn, false);
  34331. };
  34332. PlatformLocation.prototype.onHashChange = function (fn) {
  34333. dom_adapter_1.DOM.getGlobalEventTarget('window').addEventListener('hashchange', fn, false);
  34334. };
  34335. Object.defineProperty(PlatformLocation.prototype, "pathname", {
  34336. get: function () { return this._location.pathname; },
  34337. set: function (newPath) { this._location.pathname = newPath; },
  34338. enumerable: true,
  34339. configurable: true
  34340. });
  34341. Object.defineProperty(PlatformLocation.prototype, "search", {
  34342. get: function () { return this._location.search; },
  34343. enumerable: true,
  34344. configurable: true
  34345. });
  34346. Object.defineProperty(PlatformLocation.prototype, "hash", {
  34347. get: function () { return this._location.hash; },
  34348. enumerable: true,
  34349. configurable: true
  34350. });
  34351. PlatformLocation.prototype.pushState = function (state, title, url) {
  34352. this._history.pushState(state, title, url);
  34353. };
  34354. PlatformLocation.prototype.replaceState = function (state, title, url) {
  34355. this._history.replaceState(state, title, url);
  34356. };
  34357. PlatformLocation.prototype.forward = function () { this._history.forward(); };
  34358. PlatformLocation.prototype.back = function () { this._history.back(); };
  34359. PlatformLocation = __decorate([
  34360. core_1.Injectable(),
  34361. __metadata('design:paramtypes', [])
  34362. ], PlatformLocation);
  34363. return PlatformLocation;
  34364. })();
  34365. exports.PlatformLocation = PlatformLocation;
  34366. /***/ },
  34367. /* 245 */
  34368. /***/ function(module, exports, __webpack_require__) {
  34369. var __extends = (this && this.__extends) || function (d, b) {
  34370. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  34371. function __() { this.constructor = d; }
  34372. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  34373. };
  34374. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  34375. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  34376. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  34377. 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;
  34378. return c > 3 && r && Object.defineProperty(target, key, r), r;
  34379. };
  34380. var __metadata = (this && this.__metadata) || function (k, v) {
  34381. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  34382. };
  34383. var __param = (this && this.__param) || function (paramIndex, decorator) {
  34384. return function (target, key) { decorator(target, key, paramIndex); }
  34385. };
  34386. var core_1 = __webpack_require__(2);
  34387. var location_strategy_1 = __webpack_require__(238);
  34388. var lang_1 = __webpack_require__(5);
  34389. var platform_location_1 = __webpack_require__(244);
  34390. /**
  34391. * `HashLocationStrategy` is a {@link LocationStrategy} used to configure the
  34392. * {@link Location} service to represent its state in the
  34393. * [hash fragment](https://en.wikipedia.org/wiki/Uniform_Resource_Locator#Syntax)
  34394. * of the browser's URL.
  34395. *
  34396. * For instance, if you call `location.go('/foo')`, the browser's URL will become
  34397. * `example.com#/foo`.
  34398. *
  34399. * ### Example
  34400. *
  34401. * ```
  34402. * import {Component, provide} from 'angular2/core';
  34403. * import {
  34404. * ROUTER_DIRECTIVES,
  34405. * ROUTER_PROVIDERS,
  34406. * RouteConfig,
  34407. * Location,
  34408. * LocationStrategy,
  34409. * HashLocationStrategy
  34410. * } from 'angular2/router';
  34411. *
  34412. * @Component({directives: [ROUTER_DIRECTIVES]})
  34413. * @RouteConfig([
  34414. * {...},
  34415. * ])
  34416. * class AppCmp {
  34417. * constructor(location: Location) {
  34418. * location.go('/foo');
  34419. * }
  34420. * }
  34421. *
  34422. * bootstrap(AppCmp, [
  34423. * ROUTER_PROVIDERS,
  34424. * provide(LocationStrategy, {useClass: HashLocationStrategy})
  34425. * ]);
  34426. * ```
  34427. */
  34428. var HashLocationStrategy = (function (_super) {
  34429. __extends(HashLocationStrategy, _super);
  34430. function HashLocationStrategy(_platformLocation, _baseHref) {
  34431. _super.call(this);
  34432. this._platformLocation = _platformLocation;
  34433. this._baseHref = '';
  34434. if (lang_1.isPresent(_baseHref)) {
  34435. this._baseHref = _baseHref;
  34436. }
  34437. }
  34438. HashLocationStrategy.prototype.onPopState = function (fn) {
  34439. this._platformLocation.onPopState(fn);
  34440. this._platformLocation.onHashChange(fn);
  34441. };
  34442. HashLocationStrategy.prototype.getBaseHref = function () { return this._baseHref; };
  34443. HashLocationStrategy.prototype.path = function () {
  34444. // the hash value is always prefixed with a `#`
  34445. // and if it is empty then it will stay empty
  34446. var path = this._platformLocation.hash;
  34447. // Dart will complain if a call to substring is
  34448. // executed with a position value that extends the
  34449. // length of string.
  34450. return (path.length > 0 ? path.substring(1) : path) +
  34451. location_strategy_1.normalizeQueryParams(this._platformLocation.search);
  34452. };
  34453. HashLocationStrategy.prototype.prepareExternalUrl = function (internal) {
  34454. var url = location_strategy_1.joinWithSlash(this._baseHref, internal);
  34455. return url.length > 0 ? ('#' + url) : url;
  34456. };
  34457. HashLocationStrategy.prototype.pushState = function (state, title, path, queryParams) {
  34458. var url = this.prepareExternalUrl(path + location_strategy_1.normalizeQueryParams(queryParams));
  34459. if (url.length == 0) {
  34460. url = this._platformLocation.pathname;
  34461. }
  34462. this._platformLocation.pushState(state, title, url);
  34463. };
  34464. HashLocationStrategy.prototype.replaceState = function (state, title, path, queryParams) {
  34465. var url = this.prepareExternalUrl(path + location_strategy_1.normalizeQueryParams(queryParams));
  34466. if (url.length == 0) {
  34467. url = this._platformLocation.pathname;
  34468. }
  34469. this._platformLocation.replaceState(state, title, url);
  34470. };
  34471. HashLocationStrategy.prototype.forward = function () { this._platformLocation.forward(); };
  34472. HashLocationStrategy.prototype.back = function () { this._platformLocation.back(); };
  34473. HashLocationStrategy = __decorate([
  34474. core_1.Injectable(),
  34475. __param(1, core_1.Optional()),
  34476. __param(1, core_1.Inject(location_strategy_1.APP_BASE_HREF)),
  34477. __metadata('design:paramtypes', [platform_location_1.PlatformLocation, String])
  34478. ], HashLocationStrategy);
  34479. return HashLocationStrategy;
  34480. })(location_strategy_1.LocationStrategy);
  34481. exports.HashLocationStrategy = HashLocationStrategy;
  34482. /***/ },
  34483. /* 246 */
  34484. /***/ function(module, exports, __webpack_require__) {
  34485. var __extends = (this && this.__extends) || function (d, b) {
  34486. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  34487. function __() { this.constructor = d; }
  34488. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  34489. };
  34490. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  34491. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  34492. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  34493. 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;
  34494. return c > 3 && r && Object.defineProperty(target, key, r), r;
  34495. };
  34496. var __metadata = (this && this.__metadata) || function (k, v) {
  34497. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  34498. };
  34499. var __param = (this && this.__param) || function (paramIndex, decorator) {
  34500. return function (target, key) { decorator(target, key, paramIndex); }
  34501. };
  34502. var core_1 = __webpack_require__(2);
  34503. var lang_1 = __webpack_require__(5);
  34504. var exceptions_1 = __webpack_require__(14);
  34505. var location_strategy_1 = __webpack_require__(238);
  34506. var platform_location_1 = __webpack_require__(244);
  34507. /**
  34508. * `PathLocationStrategy` is a {@link LocationStrategy} used to configure the
  34509. * {@link Location} service to represent its state in the
  34510. * [path](https://en.wikipedia.org/wiki/Uniform_Resource_Locator#Syntax) of the
  34511. * browser's URL.
  34512. *
  34513. * `PathLocationStrategy` is the default binding for {@link LocationStrategy}
  34514. * provided in {@link ROUTER_PROVIDERS}.
  34515. *
  34516. * If you're using `PathLocationStrategy`, you must provide a provider for
  34517. * {@link APP_BASE_HREF} to a string representing the URL prefix that should
  34518. * be preserved when generating and recognizing URLs.
  34519. *
  34520. * For instance, if you provide an `APP_BASE_HREF` of `'/my/app'` and call
  34521. * `location.go('/foo')`, the browser's URL will become
  34522. * `example.com/my/app/foo`.
  34523. *
  34524. * ### Example
  34525. *
  34526. * ```
  34527. * import {Component, provide} from 'angular2/core';
  34528. * import {
  34529. * APP_BASE_HREF
  34530. * ROUTER_DIRECTIVES,
  34531. * ROUTER_PROVIDERS,
  34532. * RouteConfig,
  34533. * Location
  34534. * } from 'angular2/router';
  34535. *
  34536. * @Component({directives: [ROUTER_DIRECTIVES]})
  34537. * @RouteConfig([
  34538. * {...},
  34539. * ])
  34540. * class AppCmp {
  34541. * constructor(location: Location) {
  34542. * location.go('/foo');
  34543. * }
  34544. * }
  34545. *
  34546. * bootstrap(AppCmp, [
  34547. * ROUTER_PROVIDERS, // includes binding to PathLocationStrategy
  34548. * provide(APP_BASE_HREF, {useValue: '/my/app'})
  34549. * ]);
  34550. * ```
  34551. */
  34552. var PathLocationStrategy = (function (_super) {
  34553. __extends(PathLocationStrategy, _super);
  34554. function PathLocationStrategy(_platformLocation, href) {
  34555. _super.call(this);
  34556. this._platformLocation = _platformLocation;
  34557. if (lang_1.isBlank(href)) {
  34558. href = this._platformLocation.getBaseHrefFromDOM();
  34559. }
  34560. if (lang_1.isBlank(href)) {
  34561. 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.");
  34562. }
  34563. this._baseHref = href;
  34564. }
  34565. PathLocationStrategy.prototype.onPopState = function (fn) {
  34566. this._platformLocation.onPopState(fn);
  34567. this._platformLocation.onHashChange(fn);
  34568. };
  34569. PathLocationStrategy.prototype.getBaseHref = function () { return this._baseHref; };
  34570. PathLocationStrategy.prototype.prepareExternalUrl = function (internal) { return location_strategy_1.joinWithSlash(this._baseHref, internal); };
  34571. PathLocationStrategy.prototype.path = function () {
  34572. return this._platformLocation.pathname + location_strategy_1.normalizeQueryParams(this._platformLocation.search);
  34573. };
  34574. PathLocationStrategy.prototype.pushState = function (state, title, url, queryParams) {
  34575. var externalUrl = this.prepareExternalUrl(url + location_strategy_1.normalizeQueryParams(queryParams));
  34576. this._platformLocation.pushState(state, title, externalUrl);
  34577. };
  34578. PathLocationStrategy.prototype.replaceState = function (state, title, url, queryParams) {
  34579. var externalUrl = this.prepareExternalUrl(url + location_strategy_1.normalizeQueryParams(queryParams));
  34580. this._platformLocation.replaceState(state, title, externalUrl);
  34581. };
  34582. PathLocationStrategy.prototype.forward = function () { this._platformLocation.forward(); };
  34583. PathLocationStrategy.prototype.back = function () { this._platformLocation.back(); };
  34584. PathLocationStrategy = __decorate([
  34585. core_1.Injectable(),
  34586. __param(1, core_1.Optional()),
  34587. __param(1, core_1.Inject(location_strategy_1.APP_BASE_HREF)),
  34588. __metadata('design:paramtypes', [platform_location_1.PlatformLocation, String])
  34589. ], PathLocationStrategy);
  34590. return PathLocationStrategy;
  34591. })(location_strategy_1.LocationStrategy);
  34592. exports.PathLocationStrategy = PathLocationStrategy;
  34593. /***/ },
  34594. /* 247 */
  34595. /***/ function(module, exports) {
  34596. /***/ },
  34597. /* 248 */
  34598. /***/ function(module, exports, __webpack_require__) {
  34599. var compiler_1 = __webpack_require__(147);
  34600. var core_1 = __webpack_require__(2);
  34601. var router_link_transform_1 = __webpack_require__(249);
  34602. var lang_1 = __webpack_require__(5);
  34603. var router_link_transform_2 = __webpack_require__(249);
  34604. exports.RouterLinkTransform = router_link_transform_2.RouterLinkTransform;
  34605. /**
  34606. * Enables the router link DSL.
  34607. *
  34608. * Warning. This feature is experimental and can change.
  34609. *
  34610. * To enable the transformer pass the router link DSL provider to `bootstrap`.
  34611. *
  34612. * ## Example:
  34613. * ```
  34614. * import {bootstrap} from 'angular2/platform/browser';
  34615. * import {ROUTER_LINK_DSL_PROVIDER} from 'angular2/router/router_link_dsl';
  34616. *
  34617. * bootstrap(CustomApp, [ROUTER_LINK_DSL_PROVIDER]);
  34618. * ```
  34619. *
  34620. * The DSL allows you to express router links as follows:
  34621. * ```
  34622. * <a [routerLink]="route:User"> <!-- Same as <a [routerLink]="['User']"> -->
  34623. * <a [routerLink]="route:/User"> <!-- Same as <a [routerLink]="['User']"> -->
  34624. * <a [routerLink]="route:./User"> <!-- Same as <a [routerLink]="['./User']"> -->
  34625. * <a [routerLink]="./User(id: value, name: 'Bob')"> <!-- Same as <a [routerLink]="['./User', {id:
  34626. * value, name: 'Bob'}]"> -->
  34627. * <a [routerLink]="/User/Modal"> <!-- Same as <a [routerLink]="['/User', 'Modal']"> -->
  34628. * <a [routerLink]="User[Modal]"> <!-- Same as <a [routerLink]="['User', ['Modal']]"> -->
  34629. * ```
  34630. */
  34631. 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 }));
  34632. /***/ },
  34633. /* 249 */
  34634. /***/ function(module, exports, __webpack_require__) {
  34635. var __extends = (this && this.__extends) || function (d, b) {
  34636. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  34637. function __() { this.constructor = d; }
  34638. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  34639. };
  34640. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  34641. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  34642. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  34643. 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;
  34644. return c > 3 && r && Object.defineProperty(target, key, r), r;
  34645. };
  34646. var __metadata = (this && this.__metadata) || function (k, v) {
  34647. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  34648. };
  34649. var compiler_1 = __webpack_require__(147);
  34650. var ast_1 = __webpack_require__(30);
  34651. var exceptions_1 = __webpack_require__(14);
  34652. var core_1 = __webpack_require__(2);
  34653. var parser_1 = __webpack_require__(32);
  34654. /**
  34655. * e.g., './User', 'Modal' in ./User[Modal(param: value)]
  34656. */
  34657. var FixedPart = (function () {
  34658. function FixedPart(value) {
  34659. this.value = value;
  34660. }
  34661. return FixedPart;
  34662. })();
  34663. /**
  34664. * The square bracket
  34665. */
  34666. var AuxiliaryStart = (function () {
  34667. function AuxiliaryStart() {
  34668. }
  34669. return AuxiliaryStart;
  34670. })();
  34671. /**
  34672. * The square bracket
  34673. */
  34674. var AuxiliaryEnd = (function () {
  34675. function AuxiliaryEnd() {
  34676. }
  34677. return AuxiliaryEnd;
  34678. })();
  34679. /**
  34680. * e.g., param:value in ./User[Modal(param: value)]
  34681. */
  34682. var Params = (function () {
  34683. function Params(ast) {
  34684. this.ast = ast;
  34685. }
  34686. return Params;
  34687. })();
  34688. var RouterLinkLexer = (function () {
  34689. function RouterLinkLexer(parser, exp) {
  34690. this.parser = parser;
  34691. this.exp = exp;
  34692. this.index = 0;
  34693. }
  34694. RouterLinkLexer.prototype.tokenize = function () {
  34695. var tokens = [];
  34696. while (this.index < this.exp.length) {
  34697. tokens.push(this._parseToken());
  34698. }
  34699. return tokens;
  34700. };
  34701. RouterLinkLexer.prototype._parseToken = function () {
  34702. var c = this.exp[this.index];
  34703. if (c == '[') {
  34704. this.index++;
  34705. return new AuxiliaryStart();
  34706. }
  34707. else if (c == ']') {
  34708. this.index++;
  34709. return new AuxiliaryEnd();
  34710. }
  34711. else if (c == '(') {
  34712. return this._parseParams();
  34713. }
  34714. else if (c == '/' && this.index !== 0) {
  34715. this.index++;
  34716. return this._parseFixedPart();
  34717. }
  34718. else {
  34719. return this._parseFixedPart();
  34720. }
  34721. };
  34722. RouterLinkLexer.prototype._parseParams = function () {
  34723. var start = this.index;
  34724. for (; this.index < this.exp.length; ++this.index) {
  34725. var c = this.exp[this.index];
  34726. if (c == ')') {
  34727. var paramsContent = this.exp.substring(start + 1, this.index);
  34728. this.index++;
  34729. return new Params(this.parser.parseBinding("{" + paramsContent + "}", null).ast);
  34730. }
  34731. }
  34732. throw new exceptions_1.BaseException("Cannot find ')'");
  34733. };
  34734. RouterLinkLexer.prototype._parseFixedPart = function () {
  34735. var start = this.index;
  34736. var sawNonSlash = false;
  34737. for (; this.index < this.exp.length; ++this.index) {
  34738. var c = this.exp[this.index];
  34739. if (c == '(' || c == '[' || c == ']' || (c == '/' && sawNonSlash)) {
  34740. break;
  34741. }
  34742. if (c != '.' && c != '/') {
  34743. sawNonSlash = true;
  34744. }
  34745. }
  34746. var fixed = this.exp.substring(start, this.index);
  34747. if (start === this.index || !sawNonSlash || fixed.startsWith('//')) {
  34748. throw new exceptions_1.BaseException("Invalid router link");
  34749. }
  34750. return new FixedPart(fixed);
  34751. };
  34752. return RouterLinkLexer;
  34753. })();
  34754. var RouterLinkAstGenerator = (function () {
  34755. function RouterLinkAstGenerator(tokens) {
  34756. this.tokens = tokens;
  34757. this.index = 0;
  34758. }
  34759. RouterLinkAstGenerator.prototype.generate = function () { return this._genAuxiliary(); };
  34760. RouterLinkAstGenerator.prototype._genAuxiliary = function () {
  34761. var arr = [];
  34762. for (; this.index < this.tokens.length; this.index++) {
  34763. var r = this.tokens[this.index];
  34764. if (r instanceof FixedPart) {
  34765. arr.push(new ast_1.LiteralPrimitive(r.value));
  34766. }
  34767. else if (r instanceof Params) {
  34768. arr.push(r.ast);
  34769. }
  34770. else if (r instanceof AuxiliaryEnd) {
  34771. break;
  34772. }
  34773. else if (r instanceof AuxiliaryStart) {
  34774. this.index++;
  34775. arr.push(this._genAuxiliary());
  34776. }
  34777. }
  34778. return new ast_1.LiteralArray(arr);
  34779. };
  34780. return RouterLinkAstGenerator;
  34781. })();
  34782. var RouterLinkAstTransformer = (function (_super) {
  34783. __extends(RouterLinkAstTransformer, _super);
  34784. function RouterLinkAstTransformer(parser) {
  34785. _super.call(this);
  34786. this.parser = parser;
  34787. }
  34788. RouterLinkAstTransformer.prototype.visitQuote = function (ast) {
  34789. if (ast.prefix == "route") {
  34790. return parseRouterLinkExpression(this.parser, ast.uninterpretedExpression);
  34791. }
  34792. else {
  34793. return _super.prototype.visitQuote.call(this, ast);
  34794. }
  34795. };
  34796. return RouterLinkAstTransformer;
  34797. })(ast_1.AstTransformer);
  34798. function parseRouterLinkExpression(parser, exp) {
  34799. var tokens = new RouterLinkLexer(parser, exp.trim()).tokenize();
  34800. return new RouterLinkAstGenerator(tokens).generate();
  34801. }
  34802. exports.parseRouterLinkExpression = parseRouterLinkExpression;
  34803. /**
  34804. * A compiler plugin that implements the router link DSL.
  34805. */
  34806. var RouterLinkTransform = (function () {
  34807. function RouterLinkTransform(parser) {
  34808. this.astTransformer = new RouterLinkAstTransformer(parser);
  34809. }
  34810. RouterLinkTransform.prototype.visitNgContent = function (ast, context) { return ast; };
  34811. RouterLinkTransform.prototype.visitEmbeddedTemplate = function (ast, context) { return ast; };
  34812. RouterLinkTransform.prototype.visitElement = function (ast, context) {
  34813. var _this = this;
  34814. var updatedChildren = ast.children.map(function (c) { return c.visit(_this, context); });
  34815. var updatedInputs = ast.inputs.map(function (c) { return c.visit(_this, context); });
  34816. var updatedDirectives = ast.directives.map(function (c) { return c.visit(_this, context); });
  34817. return new compiler_1.ElementAst(ast.name, ast.attrs, updatedInputs, ast.outputs, ast.exportAsVars, updatedDirectives, updatedChildren, ast.ngContentIndex, ast.sourceSpan);
  34818. };
  34819. RouterLinkTransform.prototype.visitVariable = function (ast, context) { return ast; };
  34820. RouterLinkTransform.prototype.visitEvent = function (ast, context) { return ast; };
  34821. RouterLinkTransform.prototype.visitElementProperty = function (ast, context) { return ast; };
  34822. RouterLinkTransform.prototype.visitAttr = function (ast, context) { return ast; };
  34823. RouterLinkTransform.prototype.visitBoundText = function (ast, context) { return ast; };
  34824. RouterLinkTransform.prototype.visitText = function (ast, context) { return ast; };
  34825. RouterLinkTransform.prototype.visitDirective = function (ast, context) {
  34826. var _this = this;
  34827. var updatedInputs = ast.inputs.map(function (c) { return c.visit(_this, context); });
  34828. return new compiler_1.DirectiveAst(ast.directive, updatedInputs, ast.hostProperties, ast.hostEvents, ast.exportAsVars, ast.sourceSpan);
  34829. };
  34830. RouterLinkTransform.prototype.visitDirectiveProperty = function (ast, context) {
  34831. var transformedValue = ast.value.visit(this.astTransformer);
  34832. return new compiler_1.BoundDirectivePropertyAst(ast.directiveName, ast.templateName, transformedValue, ast.sourceSpan);
  34833. };
  34834. RouterLinkTransform = __decorate([
  34835. core_1.Injectable(),
  34836. __metadata('design:paramtypes', [parser_1.Parser])
  34837. ], RouterLinkTransform);
  34838. return RouterLinkTransform;
  34839. })();
  34840. exports.RouterLinkTransform = RouterLinkTransform;
  34841. /***/ },
  34842. /* 250 */
  34843. /***/ function(module, exports, __webpack_require__) {
  34844. var profile_1 = __webpack_require__(45);
  34845. exports.wtfCreateScope = profile_1.wtfCreateScope;
  34846. exports.wtfLeave = profile_1.wtfLeave;
  34847. exports.wtfStartTimeRange = profile_1.wtfStartTimeRange;
  34848. exports.wtfEndTimeRange = profile_1.wtfEndTimeRange;
  34849. /***/ },
  34850. /* 251 */
  34851. /***/ function(module, exports, __webpack_require__) {
  34852. /**
  34853. * @module
  34854. * @description
  34855. * Adapter allowing AngularJS v1 and Angular v2 to run side by side in the same application.
  34856. */
  34857. var upgrade_adapter_1 = __webpack_require__(252);
  34858. exports.UpgradeAdapter = upgrade_adapter_1.UpgradeAdapter;
  34859. exports.UpgradeAdapterRef = upgrade_adapter_1.UpgradeAdapterRef;
  34860. /***/ },
  34861. /* 252 */
  34862. /***/ function(module, exports, __webpack_require__) {
  34863. var core_1 = __webpack_require__(2);
  34864. var async_1 = __webpack_require__(60);
  34865. var browser_1 = __webpack_require__(179);
  34866. var metadata_1 = __webpack_require__(253);
  34867. var util_1 = __webpack_require__(254);
  34868. var constants_1 = __webpack_require__(255);
  34869. var downgrade_ng2_adapter_1 = __webpack_require__(256);
  34870. var upgrade_ng1_adapter_1 = __webpack_require__(257);
  34871. var angular = __webpack_require__(258);
  34872. var upgradeCount = 0;
  34873. /**
  34874. * Use `UpgradeAdapter` to allow AngularJS v1 and Angular v2 to coexist in a single application.
  34875. *
  34876. * The `UpgradeAdapter` allows:
  34877. * 1. creation of Angular v2 component from AngularJS v1 component directive
  34878. * (See [UpgradeAdapter#upgradeNg1Component()])
  34879. * 2. creation of AngularJS v1 directive from Angular v2 component.
  34880. * (See [UpgradeAdapter#downgradeNg2Component()])
  34881. * 3. Bootstrapping of a hybrid Angular application which contains both of the frameworks
  34882. * coexisting in a single application.
  34883. *
  34884. * ## Mental Model
  34885. *
  34886. * When reasoning about how a hybrid application works it is useful to have a mental model which
  34887. * describes what is happening and explains what is happening at the lowest level.
  34888. *
  34889. * 1. There are two independent frameworks running in a single application, each framework treats
  34890. * the other as a black box.
  34891. * 2. Each DOM element on the page is owned exactly by one framework. Whichever framework
  34892. * instantiated the element is the owner. Each framework only updates/interacts with its own
  34893. * DOM elements and ignores others.
  34894. * 3. AngularJS v1 directives always execute inside AngularJS v1 framework codebase regardless of
  34895. * where they are instantiated.
  34896. * 4. Angular v2 components always execute inside Angular v2 framework codebase regardless of
  34897. * where they are instantiated.
  34898. * 5. An AngularJS v1 component can be upgraded to an Angular v2 component. This creates an
  34899. * Angular v2 directive, which bootstraps the AngularJS v1 component directive in that location.
  34900. * 6. An Angular v2 component can be downgraded to an AngularJS v1 component directive. This creates
  34901. * an AngularJS v1 directive, which bootstraps the Angular v2 component in that location.
  34902. * 7. Whenever an adapter component is instantiated the host element is owned by the framework
  34903. * doing the instantiation. The other framework then instantiates and owns the view for that
  34904. * component. This implies that component bindings will always follow the semantics of the
  34905. * instantiation framework. The syntax is always that of Angular v2 syntax.
  34906. * 8. AngularJS v1 is always bootstrapped first and owns the bottom most view.
  34907. * 9. The new application is running in Angular v2 zone, and therefore it no longer needs calls to
  34908. * `$apply()`.
  34909. *
  34910. * ### Example
  34911. *
  34912. * ```
  34913. * var adapter = new UpgradeAdapter();
  34914. * var module = angular.module('myExample', []);
  34915. * module.directive('ng2', adapter.downgradeNg2Component(Ng2));
  34916. *
  34917. * module.directive('ng1', function() {
  34918. * return {
  34919. * scope: { title: '=' },
  34920. * template: 'ng1[Hello {{title}}!](<span ng-transclude></span>)'
  34921. * };
  34922. * });
  34923. *
  34924. *
  34925. * @Component({
  34926. * selector: 'ng2',
  34927. * inputs: ['name'],
  34928. * template: 'ng2[<ng1 [title]="name">transclude</ng1>](<ng-content></ng-content>)',
  34929. * directives: [adapter.upgradeNg1Component('ng1')]
  34930. * })
  34931. * class Ng2 {
  34932. * }
  34933. *
  34934. * document.body.innerHTML = '<ng2 name="World">project</ng2>';
  34935. *
  34936. * adapter.bootstrap(document.body, ['myExample']).ready(function() {
  34937. * expect(document.body.textContent).toEqual(
  34938. * "ng2[ng1[Hello World!](transclude)](project)");
  34939. * });
  34940. * ```
  34941. */
  34942. var UpgradeAdapter = (function () {
  34943. function UpgradeAdapter() {
  34944. /* @internal */
  34945. this.idPrefix = "NG2_UPGRADE_" + upgradeCount++ + "_";
  34946. /* @internal */
  34947. this.upgradedComponents = [];
  34948. /* @internal */
  34949. this.downgradedComponents = {};
  34950. /* @internal */
  34951. this.providers = [];
  34952. }
  34953. /**
  34954. * Allows Angular v2 Component to be used from AngularJS v1.
  34955. *
  34956. * Use `downgradeNg2Component` to create an AngularJS v1 Directive Definition Factory from
  34957. * Angular v2 Component. The adapter will bootstrap Angular v2 component from within the
  34958. * AngularJS v1 template.
  34959. *
  34960. * ## Mental Model
  34961. *
  34962. * 1. The component is instantiated by being listed in AngularJS v1 template. This means that the
  34963. * host element is controlled by AngularJS v1, but the component's view will be controlled by
  34964. * Angular v2.
  34965. * 2. Even thought the component is instantiated in AngularJS v1, it will be using Angular v2
  34966. * syntax. This has to be done, this way because we must follow Angular v2 components do not
  34967. * declare how the attributes should be interpreted.
  34968. *
  34969. * ## Supported Features
  34970. *
  34971. * - Bindings:
  34972. * - Attribute: `<comp name="World">`
  34973. * - Interpolation: `<comp greeting="Hello {{name}}!">`
  34974. * - Expression: `<comp [name]="username">`
  34975. * - Event: `<comp (close)="doSomething()">`
  34976. * - Content projection: yes
  34977. *
  34978. * ### Example
  34979. *
  34980. * ```
  34981. * var adapter = new UpgradeAdapter();
  34982. * var module = angular.module('myExample', []);
  34983. * module.directive('greet', adapter.downgradeNg2Component(Greeter));
  34984. *
  34985. * @Component({
  34986. * selector: 'greet',
  34987. * template: '{{salutation}} {{name}}! - <ng-content></ng-content>'
  34988. * })
  34989. * class Greeter {
  34990. * @Input() salutation: string;
  34991. * @Input() name: string;
  34992. * }
  34993. *
  34994. * document.body.innerHTML =
  34995. * 'ng1 template: <greet salutation="Hello" [name]="world">text</greet>';
  34996. *
  34997. * adapter.bootstrap(document.body, ['myExample']).ready(function() {
  34998. * expect(document.body.textContent).toEqual("ng1 template: Hello world! - text");
  34999. * });
  35000. * ```
  35001. */
  35002. UpgradeAdapter.prototype.downgradeNg2Component = function (type) {
  35003. this.upgradedComponents.push(type);
  35004. var info = metadata_1.getComponentInfo(type);
  35005. return ng1ComponentDirective(info, "" + this.idPrefix + info.selector + "_c");
  35006. };
  35007. /**
  35008. * Allows AngularJS v1 Component to be used from Angular v2.
  35009. *
  35010. * Use `upgradeNg1Component` to create an Angular v2 component from AngularJS v1 Component
  35011. * directive. The adapter will bootstrap AngularJS v1 component from within the Angular v2
  35012. * template.
  35013. *
  35014. * ## Mental Model
  35015. *
  35016. * 1. The component is instantiated by being listed in Angular v2 template. This means that the
  35017. * host element is controlled by Angular v2, but the component's view will be controlled by
  35018. * AngularJS v1.
  35019. *
  35020. * ## Supported Features
  35021. *
  35022. * - Bindings:
  35023. * - Attribute: `<comp name="World">`
  35024. * - Interpolation: `<comp greeting="Hello {{name}}!">`
  35025. * - Expression: `<comp [name]="username">`
  35026. * - Event: `<comp (close)="doSomething()">`
  35027. * - Transclusion: yes
  35028. * - Only some of the features of
  35029. * [Directive Definition Object](https://docs.angularjs.org/api/ng/service/$compile) are
  35030. * supported:
  35031. * - `compile`: not supported because the host element is owned by Angular v2, which does
  35032. * not allow modifying DOM structure during compilation.
  35033. * - `controller`: supported. (NOTE: injection of `$attrs` and `$transclude` is not supported.)
  35034. * - `controllerAs': supported.
  35035. * - `bindToController': supported.
  35036. * - `link': supported. (NOTE: only pre-link function is supported.)
  35037. * - `name': supported.
  35038. * - `priority': ignored.
  35039. * - `replace': not supported.
  35040. * - `require`: supported.
  35041. * - `restrict`: must be set to 'E'.
  35042. * - `scope`: supported.
  35043. * - `template`: supported.
  35044. * - `templateUrl`: supported.
  35045. * - `terminal`: ignored.
  35046. * - `transclude`: supported.
  35047. *
  35048. *
  35049. * ### Example
  35050. *
  35051. * ```
  35052. * var adapter = new UpgradeAdapter();
  35053. * var module = angular.module('myExample', []);
  35054. *
  35055. * module.directive('greet', function() {
  35056. * return {
  35057. * scope: {salutation: '=', name: '=' },
  35058. * template: '{{salutation}} {{name}}! - <span ng-transclude></span>'
  35059. * };
  35060. * });
  35061. *
  35062. * module.directive('ng2', adapter.downgradeNg2Component(Ng2));
  35063. *
  35064. * @Component({
  35065. * selector: 'ng2',
  35066. * template: 'ng2 template: <greet salutation="Hello" [name]="world">text</greet>'
  35067. * directives: [adapter.upgradeNg1Component('greet')]
  35068. * })
  35069. * class Ng2 {
  35070. * }
  35071. *
  35072. * document.body.innerHTML = '<ng2></ng2>';
  35073. *
  35074. * adapter.bootstrap(document.body, ['myExample']).ready(function() {
  35075. * expect(document.body.textContent).toEqual("ng2 template: Hello world! - text");
  35076. * });
  35077. * ```
  35078. */
  35079. UpgradeAdapter.prototype.upgradeNg1Component = function (name) {
  35080. if (this.downgradedComponents.hasOwnProperty(name)) {
  35081. return this.downgradedComponents[name].type;
  35082. }
  35083. else {
  35084. return (this.downgradedComponents[name] = new upgrade_ng1_adapter_1.UpgradeNg1ComponentAdapterBuilder(name)).type;
  35085. }
  35086. };
  35087. /**
  35088. * Bootstrap a hybrid AngularJS v1 / Angular v2 application.
  35089. *
  35090. * This `bootstrap` method is a direct replacement (takes same arguments) for AngularJS v1
  35091. * [`bootstrap`](https://docs.angularjs.org/api/ng/function/angular.bootstrap) method. Unlike
  35092. * AngularJS v1, this bootstrap is asynchronous.
  35093. *
  35094. * ### Example
  35095. *
  35096. * ```
  35097. * var adapter = new UpgradeAdapter();
  35098. * var module = angular.module('myExample', []);
  35099. * module.directive('ng2', adapter.downgradeNg2Component(Ng2));
  35100. *
  35101. * module.directive('ng1', function() {
  35102. * return {
  35103. * scope: { title: '=' },
  35104. * template: 'ng1[Hello {{title}}!](<span ng-transclude></span>)'
  35105. * };
  35106. * });
  35107. *
  35108. *
  35109. * @Component({
  35110. * selector: 'ng2',
  35111. * inputs: ['name'],
  35112. * template: 'ng2[<ng1 [title]="name">transclude</ng1>](<ng-content></ng-content>)',
  35113. * directives: [adapter.upgradeNg1Component('ng1')]
  35114. * })
  35115. * class Ng2 {
  35116. * }
  35117. *
  35118. * document.body.innerHTML = '<ng2 name="World">project</ng2>';
  35119. *
  35120. * adapter.bootstrap(document.body, ['myExample']).ready(function() {
  35121. * expect(document.body.textContent).toEqual(
  35122. * "ng2[ng1[Hello World!](transclude)](project)");
  35123. * });
  35124. * ```
  35125. */
  35126. UpgradeAdapter.prototype.bootstrap = function (element, modules, config) {
  35127. var _this = this;
  35128. var upgrade = new UpgradeAdapterRef();
  35129. var ng1Injector = null;
  35130. var platformRef = core_1.platform(browser_1.BROWSER_PROVIDERS);
  35131. var applicationRef = platformRef.application([
  35132. browser_1.BROWSER_APP_PROVIDERS,
  35133. core_1.provide(constants_1.NG1_INJECTOR, { useFactory: function () { return ng1Injector; } }),
  35134. core_1.provide(constants_1.NG1_COMPILE, { useFactory: function () { return ng1Injector.get(constants_1.NG1_COMPILE); } }),
  35135. this.providers
  35136. ]);
  35137. var injector = applicationRef.injector;
  35138. var ngZone = injector.get(core_1.NgZone);
  35139. var compiler = injector.get(core_1.Compiler);
  35140. var delayApplyExps = [];
  35141. var original$applyFn;
  35142. var rootScopePrototype;
  35143. var rootScope;
  35144. var protoViewRefMap = {};
  35145. var ng1Module = angular.module(this.idPrefix, modules);
  35146. var ng1compilePromise = null;
  35147. ng1Module.value(constants_1.NG2_INJECTOR, injector)
  35148. .value(constants_1.NG2_ZONE, ngZone)
  35149. .value(constants_1.NG2_COMPILER, compiler)
  35150. .value(constants_1.NG2_PROTO_VIEW_REF_MAP, protoViewRefMap)
  35151. .value(constants_1.NG2_APP_VIEW_MANAGER, injector.get(core_1.AppViewManager))
  35152. .config([
  35153. '$provide',
  35154. function (provide) {
  35155. provide.decorator(constants_1.NG1_ROOT_SCOPE, [
  35156. '$delegate',
  35157. function (rootScopeDelegate) {
  35158. rootScopePrototype = rootScopeDelegate.constructor.prototype;
  35159. if (rootScopePrototype.hasOwnProperty('$apply')) {
  35160. original$applyFn = rootScopePrototype.$apply;
  35161. rootScopePrototype.$apply = function (exp) { return delayApplyExps.push(exp); };
  35162. }
  35163. else {
  35164. throw new Error("Failed to find '$apply' on '$rootScope'!");
  35165. }
  35166. return rootScope = rootScopeDelegate;
  35167. }
  35168. ]);
  35169. }
  35170. ])
  35171. .run([
  35172. '$injector',
  35173. '$rootScope',
  35174. function (injector, rootScope) {
  35175. ng1Injector = injector;
  35176. async_1.ObservableWrapper.subscribe(ngZone.onTurnDone, function (_) { ngZone.run(function () { return rootScope.$apply(); }); });
  35177. ng1compilePromise =
  35178. upgrade_ng1_adapter_1.UpgradeNg1ComponentAdapterBuilder.resolve(_this.downgradedComponents, injector);
  35179. }
  35180. ]);
  35181. angular.element(element).data(util_1.controllerKey(constants_1.NG2_INJECTOR), injector);
  35182. ngZone.run(function () { angular.bootstrap(element, [_this.idPrefix], config); });
  35183. Promise.all([this.compileNg2Components(compiler, protoViewRefMap), ng1compilePromise])
  35184. .then(function () {
  35185. ngZone.run(function () {
  35186. if (rootScopePrototype) {
  35187. rootScopePrototype.$apply = original$applyFn; // restore original $apply
  35188. while (delayApplyExps.length) {
  35189. rootScope.$apply(delayApplyExps.shift());
  35190. }
  35191. upgrade._bootstrapDone(applicationRef, ng1Injector);
  35192. rootScopePrototype = null;
  35193. }
  35194. });
  35195. }, util_1.onError);
  35196. return upgrade;
  35197. };
  35198. /**
  35199. * Adds a provider to the top level environment of a hybrid AngularJS v1 / Angular v2 application.
  35200. *
  35201. * In hybrid AngularJS v1 / Angular v2 application, there is no one root Angular v2 component,
  35202. * for this reason we provide an application global way of registering providers which is
  35203. * consistent with single global injection in AngularJS v1.
  35204. *
  35205. * ### Example
  35206. *
  35207. * ```
  35208. * class Greeter {
  35209. * greet(name) {
  35210. * alert('Hello ' + name + '!');
  35211. * }
  35212. * }
  35213. *
  35214. * @Component({
  35215. * selector: 'app',
  35216. * template: ''
  35217. * })
  35218. * class App {
  35219. * constructor(greeter: Greeter) {
  35220. * this.greeter('World');
  35221. * }
  35222. * }
  35223. *
  35224. * var adapter = new UpgradeAdapter();
  35225. * adapter.addProvider(Greeter);
  35226. *
  35227. * var module = angular.module('myExample', []);
  35228. * module.directive('app', adapter.downgradeNg2Component(App));
  35229. *
  35230. * document.body.innerHTML = '<app></app>'
  35231. * adapter.bootstrap(document.body, ['myExample']);
  35232. *```
  35233. */
  35234. UpgradeAdapter.prototype.addProvider = function (provider) { this.providers.push(provider); };
  35235. /**
  35236. * Allows AngularJS v1 service to be accessible from Angular v2.
  35237. *
  35238. *
  35239. * ### Example
  35240. *
  35241. * ```
  35242. * class Login { ... }
  35243. * class Server { ... }
  35244. *
  35245. * @Injectable()
  35246. * class Example {
  35247. * constructor(@Inject('server') server, login: Login) {
  35248. * ...
  35249. * }
  35250. * }
  35251. *
  35252. * var module = angular.module('myExample', []);
  35253. * module.service('server', Server);
  35254. * module.service('login', Login);
  35255. *
  35256. * var adapter = new UpgradeAdapter();
  35257. * adapter.upgradeNg1Provider('server');
  35258. * adapter.upgradeNg1Provider('login', {asToken: Login});
  35259. * adapter.addProvider(Example);
  35260. *
  35261. * adapter.bootstrap(document.body, ['myExample']).ready((ref) => {
  35262. * var example: Example = ref.ng2Injector.get(Example);
  35263. * });
  35264. *
  35265. * ```
  35266. */
  35267. UpgradeAdapter.prototype.upgradeNg1Provider = function (name, options) {
  35268. var token = options && options.asToken || name;
  35269. this.providers.push(core_1.provide(token, {
  35270. useFactory: function (ng1Injector) { return ng1Injector.get(name); },
  35271. deps: [constants_1.NG1_INJECTOR]
  35272. }));
  35273. };
  35274. /**
  35275. * Allows Angular v2 service to be accessible from AngularJS v1.
  35276. *
  35277. *
  35278. * ### Example
  35279. *
  35280. * ```
  35281. * class Example {
  35282. * }
  35283. *
  35284. * var adapter = new UpgradeAdapter();
  35285. * adapter.addProvider(Example);
  35286. *
  35287. * var module = angular.module('myExample', []);
  35288. * module.factory('example', adapter.downgradeNg2Provider(Example));
  35289. *
  35290. * adapter.bootstrap(document.body, ['myExample']).ready((ref) => {
  35291. * var example: Example = ref.ng1Injector.get('example');
  35292. * });
  35293. *
  35294. * ```
  35295. */
  35296. UpgradeAdapter.prototype.downgradeNg2Provider = function (token) {
  35297. var factory = function (injector) { return injector.get(token); };
  35298. factory.$inject = [constants_1.NG2_INJECTOR];
  35299. return factory;
  35300. };
  35301. /* @internal */
  35302. UpgradeAdapter.prototype.compileNg2Components = function (compiler, protoViewRefMap) {
  35303. var _this = this;
  35304. var promises = [];
  35305. var types = this.upgradedComponents;
  35306. for (var i = 0; i < types.length; i++) {
  35307. promises.push(compiler.compileInHost(types[i]));
  35308. }
  35309. return Promise.all(promises).then(function (protoViews) {
  35310. var types = _this.upgradedComponents;
  35311. for (var i = 0; i < protoViews.length; i++) {
  35312. protoViewRefMap[metadata_1.getComponentInfo(types[i]).selector] = protoViews[i];
  35313. }
  35314. return protoViewRefMap;
  35315. }, util_1.onError);
  35316. };
  35317. return UpgradeAdapter;
  35318. })();
  35319. exports.UpgradeAdapter = UpgradeAdapter;
  35320. function ng1ComponentDirective(info, idPrefix) {
  35321. directiveFactory.$inject = [constants_1.NG2_PROTO_VIEW_REF_MAP, constants_1.NG2_APP_VIEW_MANAGER, constants_1.NG1_PARSE];
  35322. function directiveFactory(protoViewRefMap, viewManager, parse) {
  35323. var protoView = protoViewRefMap[info.selector];
  35324. if (!protoView)
  35325. throw new Error('Expecting ProtoViewRef for: ' + info.selector);
  35326. var idCount = 0;
  35327. return {
  35328. restrict: 'E',
  35329. require: constants_1.REQUIRE_INJECTOR,
  35330. link: {
  35331. post: function (scope, element, attrs, parentInjector, transclude) {
  35332. var domElement = element[0];
  35333. var facade = new downgrade_ng2_adapter_1.DowngradeNg2ComponentAdapter(idPrefix + (idCount++), info, element, attrs, scope, parentInjector, parse, viewManager, protoView);
  35334. facade.setupInputs();
  35335. facade.bootstrapNg2();
  35336. facade.projectContent();
  35337. facade.setupOutputs();
  35338. facade.registerCleanup();
  35339. }
  35340. }
  35341. };
  35342. }
  35343. return directiveFactory;
  35344. }
  35345. /**
  35346. * Use `UgradeAdapterRef` to control a hybrid AngularJS v1 / Angular v2 application.
  35347. */
  35348. var UpgradeAdapterRef = (function () {
  35349. function UpgradeAdapterRef() {
  35350. /* @internal */
  35351. this._readyFn = null;
  35352. this.ng1RootScope = null;
  35353. this.ng1Injector = null;
  35354. this.ng2ApplicationRef = null;
  35355. this.ng2Injector = null;
  35356. }
  35357. /* @internal */
  35358. UpgradeAdapterRef.prototype._bootstrapDone = function (applicationRef, ng1Injector) {
  35359. this.ng2ApplicationRef = applicationRef;
  35360. this.ng2Injector = applicationRef.injector;
  35361. this.ng1Injector = ng1Injector;
  35362. this.ng1RootScope = ng1Injector.get(constants_1.NG1_ROOT_SCOPE);
  35363. this._readyFn && this._readyFn(this);
  35364. };
  35365. /**
  35366. * Register a callback function which is notified upon successful hybrid AngularJS v1 / Angular v2
  35367. * application has been bootstrapped.
  35368. *
  35369. * The `ready` callback function is invoked inside the Angular v2 zone, therefore it does not
  35370. * require a call to `$apply()`.
  35371. */
  35372. UpgradeAdapterRef.prototype.ready = function (fn) { this._readyFn = fn; };
  35373. /**
  35374. * Dispose of running hybrid AngularJS v1 / Angular v2 application.
  35375. */
  35376. UpgradeAdapterRef.prototype.dispose = function () {
  35377. this.ng1Injector.get(constants_1.NG1_ROOT_SCOPE).$destroy();
  35378. this.ng2ApplicationRef.dispose();
  35379. };
  35380. return UpgradeAdapterRef;
  35381. })();
  35382. exports.UpgradeAdapterRef = UpgradeAdapterRef;
  35383. /***/ },
  35384. /* 253 */
  35385. /***/ function(module, exports, __webpack_require__) {
  35386. var core_1 = __webpack_require__(2);
  35387. var COMPONENT_SELECTOR = /^[\w|-]*$/;
  35388. var SKEWER_CASE = /-(\w)/g;
  35389. var directiveResolver = new core_1.DirectiveResolver();
  35390. function getComponentInfo(type) {
  35391. var resolvedMetadata = directiveResolver.resolve(type);
  35392. var selector = resolvedMetadata.selector;
  35393. if (!selector.match(COMPONENT_SELECTOR)) {
  35394. throw new Error('Only selectors matching element names are supported, got: ' + selector);
  35395. }
  35396. var selector = selector.replace(SKEWER_CASE, function (all, letter) { return letter.toUpperCase(); });
  35397. return {
  35398. type: type,
  35399. selector: selector,
  35400. inputs: parseFields(resolvedMetadata.inputs),
  35401. outputs: parseFields(resolvedMetadata.outputs)
  35402. };
  35403. }
  35404. exports.getComponentInfo = getComponentInfo;
  35405. function parseFields(names) {
  35406. var attrProps = [];
  35407. if (names) {
  35408. for (var i = 0; i < names.length; i++) {
  35409. var parts = names[i].split(':');
  35410. var prop = parts[0].trim();
  35411. var attr = (parts[1] || parts[0]).trim();
  35412. var capitalAttr = attr.charAt(0).toUpperCase() + attr.substr(1);
  35413. attrProps.push({
  35414. prop: prop,
  35415. attr: attr,
  35416. bracketAttr: "[" + attr + "]",
  35417. parenAttr: "(" + attr + ")",
  35418. bracketParenAttr: "[(" + attr + ")]",
  35419. onAttr: "on" + capitalAttr,
  35420. bindAttr: "bind" + capitalAttr,
  35421. bindonAttr: "bindon" + capitalAttr
  35422. });
  35423. }
  35424. }
  35425. return attrProps;
  35426. }
  35427. exports.parseFields = parseFields;
  35428. /***/ },
  35429. /* 254 */
  35430. /***/ function(module, exports) {
  35431. function stringify(obj) {
  35432. if (typeof obj == 'function')
  35433. return obj.name || obj.toString();
  35434. return '' + obj;
  35435. }
  35436. exports.stringify = stringify;
  35437. function onError(e) {
  35438. // TODO: (misko): We seem to not have a stack trace here!
  35439. console.log(e, e.stack);
  35440. throw e;
  35441. }
  35442. exports.onError = onError;
  35443. function controllerKey(name) {
  35444. return '$' + name + 'Controller';
  35445. }
  35446. exports.controllerKey = controllerKey;
  35447. /***/ },
  35448. /* 255 */
  35449. /***/ function(module, exports) {
  35450. exports.NG2_APP_VIEW_MANAGER = 'ng2.AppViewManager';
  35451. exports.NG2_COMPILER = 'ng2.Compiler';
  35452. exports.NG2_INJECTOR = 'ng2.Injector';
  35453. exports.NG2_PROTO_VIEW_REF_MAP = 'ng2.ProtoViewRefMap';
  35454. exports.NG2_ZONE = 'ng2.NgZone';
  35455. exports.NG1_CONTROLLER = '$controller';
  35456. exports.NG1_SCOPE = '$scope';
  35457. exports.NG1_ROOT_SCOPE = '$rootScope';
  35458. exports.NG1_COMPILE = '$compile';
  35459. exports.NG1_HTTP_BACKEND = '$httpBackend';
  35460. exports.NG1_INJECTOR = '$injector';
  35461. exports.NG1_PARSE = '$parse';
  35462. exports.NG1_TEMPLATE_CACHE = '$templateCache';
  35463. exports.REQUIRE_INJECTOR = '^' + exports.NG2_INJECTOR;
  35464. /***/ },
  35465. /* 256 */
  35466. /***/ function(module, exports, __webpack_require__) {
  35467. var core_1 = __webpack_require__(2);
  35468. var constants_1 = __webpack_require__(255);
  35469. var INITIAL_VALUE = {
  35470. __UNINITIALIZED__: true
  35471. };
  35472. var DowngradeNg2ComponentAdapter = (function () {
  35473. function DowngradeNg2ComponentAdapter(id, info, element, attrs, scope, parentInjector, parse, viewManager, protoView) {
  35474. this.id = id;
  35475. this.info = info;
  35476. this.element = element;
  35477. this.attrs = attrs;
  35478. this.scope = scope;
  35479. this.parentInjector = parentInjector;
  35480. this.parse = parse;
  35481. this.viewManager = viewManager;
  35482. this.protoView = protoView;
  35483. this.component = null;
  35484. this.inputChangeCount = 0;
  35485. this.inputChanges = null;
  35486. this.hostViewRef = null;
  35487. this.changeDetector = null;
  35488. this.contentInserctionPoint = null;
  35489. this.element[0].id = id;
  35490. this.componentScope = scope.$new();
  35491. this.childNodes = element.contents();
  35492. }
  35493. DowngradeNg2ComponentAdapter.prototype.bootstrapNg2 = function () {
  35494. var childInjector = this.parentInjector.resolveAndCreateChild([core_1.provide(constants_1.NG1_SCOPE, { useValue: this.componentScope })]);
  35495. this.hostViewRef =
  35496. this.viewManager.createRootHostView(this.protoView, '#' + this.id, childInjector);
  35497. var renderer = this.hostViewRef.render;
  35498. var hostElement = this.viewManager.getHostElement(this.hostViewRef);
  35499. this.changeDetector = this.hostViewRef.changeDetectorRef;
  35500. this.component = this.viewManager.getComponent(hostElement);
  35501. this.contentInserctionPoint = renderer.rootContentInsertionPoints[0];
  35502. };
  35503. DowngradeNg2ComponentAdapter.prototype.setupInputs = function () {
  35504. var _this = this;
  35505. var attrs = this.attrs;
  35506. var inputs = this.info.inputs;
  35507. for (var i = 0; i < inputs.length; i++) {
  35508. var input = inputs[i];
  35509. var expr = null;
  35510. if (attrs.hasOwnProperty(input.attr)) {
  35511. var observeFn = (function (prop) {
  35512. var prevValue = INITIAL_VALUE;
  35513. return function (value) {
  35514. if (_this.inputChanges !== null) {
  35515. _this.inputChangeCount++;
  35516. _this.inputChanges[prop] =
  35517. new Ng1Change(value, prevValue === INITIAL_VALUE ? value : prevValue);
  35518. prevValue = value;
  35519. }
  35520. _this.component[prop] = value;
  35521. };
  35522. })(input.prop);
  35523. attrs.$observe(input.attr, observeFn);
  35524. }
  35525. else if (attrs.hasOwnProperty(input.bindAttr)) {
  35526. expr = attrs[input.bindAttr];
  35527. }
  35528. else if (attrs.hasOwnProperty(input.bracketAttr)) {
  35529. expr = attrs[input.bracketAttr];
  35530. }
  35531. else if (attrs.hasOwnProperty(input.bindonAttr)) {
  35532. expr = attrs[input.bindonAttr];
  35533. }
  35534. else if (attrs.hasOwnProperty(input.bracketParenAttr)) {
  35535. expr = attrs[input.bracketParenAttr];
  35536. }
  35537. if (expr != null) {
  35538. var watchFn = (function (prop) { return function (value, prevValue) {
  35539. if (_this.inputChanges != null) {
  35540. _this.inputChangeCount++;
  35541. _this.inputChanges[prop] = new Ng1Change(prevValue, value);
  35542. }
  35543. _this.component[prop] = value;
  35544. }; })(input.prop);
  35545. this.componentScope.$watch(expr, watchFn);
  35546. }
  35547. }
  35548. var prototype = this.info.type.prototype;
  35549. if (prototype && prototype.ngOnChanges) {
  35550. // Detect: OnChanges interface
  35551. this.inputChanges = {};
  35552. this.componentScope.$watch(function () { return _this.inputChangeCount; }, function () {
  35553. var inputChanges = _this.inputChanges;
  35554. _this.inputChanges = {};
  35555. _this.component.ngOnChanges(inputChanges);
  35556. });
  35557. }
  35558. this.componentScope.$watch(function () { return _this.changeDetector && _this.changeDetector.detectChanges(); });
  35559. };
  35560. DowngradeNg2ComponentAdapter.prototype.projectContent = function () {
  35561. var childNodes = this.childNodes;
  35562. if (this.contentInserctionPoint) {
  35563. var parent = this.contentInserctionPoint.parentNode;
  35564. for (var i = 0, ii = childNodes.length; i < ii; i++) {
  35565. parent.insertBefore(childNodes[i], this.contentInserctionPoint);
  35566. }
  35567. }
  35568. };
  35569. DowngradeNg2ComponentAdapter.prototype.setupOutputs = function () {
  35570. var _this = this;
  35571. var attrs = this.attrs;
  35572. var outputs = this.info.outputs;
  35573. for (var j = 0; j < outputs.length; j++) {
  35574. var output = outputs[j];
  35575. var expr = null;
  35576. var assignExpr = false;
  35577. var bindonAttr = output.bindonAttr ? output.bindonAttr.substring(0, output.bindonAttr.length - 6) : null;
  35578. var bracketParenAttr = output.bracketParenAttr ?
  35579. "[(" + output.bracketParenAttr.substring(2, output.bracketParenAttr.length - 8) + ")]" :
  35580. null;
  35581. if (attrs.hasOwnProperty(output.onAttr)) {
  35582. expr = attrs[output.onAttr];
  35583. }
  35584. else if (attrs.hasOwnProperty(output.parenAttr)) {
  35585. expr = attrs[output.parenAttr];
  35586. }
  35587. else if (attrs.hasOwnProperty(bindonAttr)) {
  35588. expr = attrs[bindonAttr];
  35589. assignExpr = true;
  35590. }
  35591. else if (attrs.hasOwnProperty(bracketParenAttr)) {
  35592. expr = attrs[bracketParenAttr];
  35593. assignExpr = true;
  35594. }
  35595. if (expr != null && assignExpr != null) {
  35596. var getter = this.parse(expr);
  35597. var setter = getter.assign;
  35598. if (assignExpr && !setter) {
  35599. throw new Error("Expression '" + expr + "' is not assignable!");
  35600. }
  35601. var emitter = this.component[output.prop];
  35602. if (emitter) {
  35603. emitter.subscribe({
  35604. next: assignExpr ? (function (setter) { return function (value) { return setter(_this.scope, value); }; })(setter) :
  35605. (function (getter) { return function (value) { return getter(_this.scope, { $event: value }); }; })(getter)
  35606. });
  35607. }
  35608. else {
  35609. throw new Error("Missing emitter '" + output.prop + "' on component '" + this.info.selector + "'!");
  35610. }
  35611. }
  35612. }
  35613. };
  35614. DowngradeNg2ComponentAdapter.prototype.registerCleanup = function () {
  35615. var _this = this;
  35616. this.element.bind('$remove', function () { return _this.viewManager.destroyRootHostView(_this.hostViewRef); });
  35617. };
  35618. return DowngradeNg2ComponentAdapter;
  35619. })();
  35620. exports.DowngradeNg2ComponentAdapter = DowngradeNg2ComponentAdapter;
  35621. var Ng1Change = (function () {
  35622. function Ng1Change(previousValue, currentValue) {
  35623. this.previousValue = previousValue;
  35624. this.currentValue = currentValue;
  35625. }
  35626. Ng1Change.prototype.isFirstChange = function () { return this.previousValue === this.currentValue; };
  35627. return Ng1Change;
  35628. })();
  35629. /***/ },
  35630. /* 257 */
  35631. /***/ function(module, exports, __webpack_require__) {
  35632. var core_1 = __webpack_require__(2);
  35633. var constants_1 = __webpack_require__(255);
  35634. var util_1 = __webpack_require__(254);
  35635. var angular = __webpack_require__(258);
  35636. var CAMEL_CASE = /([A-Z])/g;
  35637. var INITIAL_VALUE = {
  35638. __UNINITIALIZED__: true
  35639. };
  35640. var NOT_SUPPORTED = 'NOT_SUPPORTED';
  35641. var UpgradeNg1ComponentAdapterBuilder = (function () {
  35642. function UpgradeNg1ComponentAdapterBuilder(name) {
  35643. this.name = name;
  35644. this.inputs = [];
  35645. this.inputsRename = [];
  35646. this.outputs = [];
  35647. this.outputsRename = [];
  35648. this.propertyOutputs = [];
  35649. this.checkProperties = [];
  35650. this.propertyMap = {};
  35651. this.linkFn = null;
  35652. this.directive = null;
  35653. this.$controller = null;
  35654. var selector = name.replace(CAMEL_CASE, function (all, next) { return '-' + next.toLowerCase(); });
  35655. var self = this;
  35656. this.type =
  35657. core_1.Directive({ selector: selector, inputs: this.inputsRename, outputs: this.outputsRename })
  35658. .Class({
  35659. constructor: [
  35660. new core_1.Inject(constants_1.NG1_SCOPE),
  35661. core_1.ElementRef,
  35662. function (scope, elementRef) {
  35663. return new UpgradeNg1ComponentAdapter(self.linkFn, scope, self.directive, elementRef, self.$controller, self.inputs, self.outputs, self.propertyOutputs, self.checkProperties, self.propertyMap);
  35664. }
  35665. ],
  35666. ngOnChanges: function () { },
  35667. ngDoCheck: function () { }
  35668. });
  35669. }
  35670. UpgradeNg1ComponentAdapterBuilder.prototype.extractDirective = function (injector) {
  35671. var directives = injector.get(this.name + 'Directive');
  35672. if (directives.length > 1) {
  35673. throw new Error('Only support single directive definition for: ' + this.name);
  35674. }
  35675. var directive = directives[0];
  35676. if (directive.replace)
  35677. this.notSupported('replace');
  35678. if (directive.terminal)
  35679. this.notSupported('terminal');
  35680. var link = directive.link;
  35681. if (typeof link == 'object') {
  35682. if (link.post)
  35683. this.notSupported('link.post');
  35684. }
  35685. return directive;
  35686. };
  35687. UpgradeNg1ComponentAdapterBuilder.prototype.notSupported = function (feature) {
  35688. throw new Error("Upgraded directive '" + this.name + "' does not support '" + feature + "'.");
  35689. };
  35690. UpgradeNg1ComponentAdapterBuilder.prototype.extractBindings = function () {
  35691. var scope = this.directive.scope;
  35692. if (typeof scope == 'object') {
  35693. for (var name in scope) {
  35694. if (scope.hasOwnProperty(name)) {
  35695. var localName = scope[name];
  35696. var type = localName.charAt(0);
  35697. localName = localName.substr(1) || name;
  35698. var outputName = 'output_' + name;
  35699. var outputNameRename = outputName + ': ' + name;
  35700. var outputNameRenameChange = outputName + ': ' + name + 'Change';
  35701. var inputName = 'input_' + name;
  35702. var inputNameRename = inputName + ': ' + name;
  35703. switch (type) {
  35704. case '=':
  35705. this.propertyOutputs.push(outputName);
  35706. this.checkProperties.push(localName);
  35707. this.outputs.push(outputName);
  35708. this.outputsRename.push(outputNameRenameChange);
  35709. this.propertyMap[outputName] = localName;
  35710. // don't break; let it fall through to '@'
  35711. case '@':
  35712. this.inputs.push(inputName);
  35713. this.inputsRename.push(inputNameRename);
  35714. this.propertyMap[inputName] = localName;
  35715. break;
  35716. case '&':
  35717. this.outputs.push(outputName);
  35718. this.outputsRename.push(outputNameRename);
  35719. this.propertyMap[outputName] = localName;
  35720. break;
  35721. default:
  35722. var json = JSON.stringify(scope);
  35723. throw new Error("Unexpected mapping '" + type + "' in '" + json + "' in '" + this.name + "' directive.");
  35724. }
  35725. }
  35726. }
  35727. }
  35728. };
  35729. UpgradeNg1ComponentAdapterBuilder.prototype.compileTemplate = function (compile, templateCache, httpBackend) {
  35730. var _this = this;
  35731. if (this.directive.template !== undefined) {
  35732. this.linkFn = compileHtml(this.directive.template);
  35733. }
  35734. else if (this.directive.templateUrl) {
  35735. var url = this.directive.templateUrl;
  35736. var html = templateCache.get(url);
  35737. if (html !== undefined) {
  35738. this.linkFn = compileHtml(html);
  35739. }
  35740. else {
  35741. return new Promise(function (resolve, err) {
  35742. httpBackend('GET', url, null, function (status, response) {
  35743. if (status == 200) {
  35744. resolve(_this.linkFn = compileHtml(templateCache.put(url, response)));
  35745. }
  35746. else {
  35747. err("GET " + url + " returned " + status + ": " + response);
  35748. }
  35749. });
  35750. });
  35751. }
  35752. }
  35753. else {
  35754. throw new Error("Directive '" + this.name + "' is not a component, it is missing template.");
  35755. }
  35756. return null;
  35757. function compileHtml(html) {
  35758. var div = document.createElement('div');
  35759. div.innerHTML = html;
  35760. return compile(div.childNodes);
  35761. }
  35762. };
  35763. UpgradeNg1ComponentAdapterBuilder.resolve = function (exportedComponents, injector) {
  35764. var promises = [];
  35765. var compile = injector.get(constants_1.NG1_COMPILE);
  35766. var templateCache = injector.get(constants_1.NG1_TEMPLATE_CACHE);
  35767. var httpBackend = injector.get(constants_1.NG1_HTTP_BACKEND);
  35768. var $controller = injector.get(constants_1.NG1_CONTROLLER);
  35769. for (var name in exportedComponents) {
  35770. if (exportedComponents.hasOwnProperty(name)) {
  35771. var exportedComponent = exportedComponents[name];
  35772. exportedComponent.directive = exportedComponent.extractDirective(injector);
  35773. exportedComponent.$controller = $controller;
  35774. exportedComponent.extractBindings();
  35775. var promise = exportedComponent.compileTemplate(compile, templateCache, httpBackend);
  35776. if (promise)
  35777. promises.push(promise);
  35778. }
  35779. }
  35780. return Promise.all(promises);
  35781. };
  35782. return UpgradeNg1ComponentAdapterBuilder;
  35783. })();
  35784. exports.UpgradeNg1ComponentAdapterBuilder = UpgradeNg1ComponentAdapterBuilder;
  35785. var UpgradeNg1ComponentAdapter = (function () {
  35786. function UpgradeNg1ComponentAdapter(linkFn, scope, directive, elementRef, $controller, inputs, outputs, propOuts, checkProperties, propertyMap) {
  35787. this.directive = directive;
  35788. this.inputs = inputs;
  35789. this.outputs = outputs;
  35790. this.propOuts = propOuts;
  35791. this.checkProperties = checkProperties;
  35792. this.propertyMap = propertyMap;
  35793. this.destinationObj = null;
  35794. this.checkLastValues = [];
  35795. var element = elementRef.nativeElement;
  35796. var childNodes = [];
  35797. var childNode;
  35798. while (childNode = element.firstChild) {
  35799. element.removeChild(childNode);
  35800. childNodes.push(childNode);
  35801. }
  35802. var componentScope = scope.$new(!!directive.scope);
  35803. var $element = angular.element(element);
  35804. var controllerType = directive.controller;
  35805. var controller = null;
  35806. if (controllerType) {
  35807. var locals = { $scope: componentScope, $element: $element };
  35808. controller = $controller(controllerType, locals, null, directive.controllerAs);
  35809. $element.data(util_1.controllerKey(directive.name), controller);
  35810. }
  35811. var link = directive.link;
  35812. if (typeof link == 'object')
  35813. link = link.pre;
  35814. if (link) {
  35815. var attrs = NOT_SUPPORTED;
  35816. var transcludeFn = NOT_SUPPORTED;
  35817. var linkController = this.resolveRequired($element, directive.require);
  35818. directive.link(componentScope, $element, attrs, linkController, transcludeFn);
  35819. }
  35820. this.destinationObj = directive.bindToController && controller ? controller : componentScope;
  35821. linkFn(componentScope, function (clonedElement, scope) {
  35822. for (var i = 0, ii = clonedElement.length; i < ii; i++) {
  35823. element.appendChild(clonedElement[i]);
  35824. }
  35825. }, { parentBoundTranscludeFn: function (scope, cloneAttach) { cloneAttach(childNodes); } });
  35826. for (var i = 0; i < inputs.length; i++) {
  35827. this[inputs[i]] = null;
  35828. }
  35829. for (var j = 0; j < outputs.length; j++) {
  35830. var emitter = this[outputs[j]] = new core_1.EventEmitter();
  35831. this.setComponentProperty(outputs[j], (function (emitter) { return function (value) { return emitter.emit(value); }; })(emitter));
  35832. }
  35833. for (var k = 0; k < propOuts.length; k++) {
  35834. this[propOuts[k]] = new core_1.EventEmitter();
  35835. this.checkLastValues.push(INITIAL_VALUE);
  35836. }
  35837. }
  35838. UpgradeNg1ComponentAdapter.prototype.ngOnChanges = function (changes) {
  35839. for (var name in changes) {
  35840. if (changes.hasOwnProperty(name)) {
  35841. var change = changes[name];
  35842. this.setComponentProperty(name, change.currentValue);
  35843. }
  35844. }
  35845. };
  35846. UpgradeNg1ComponentAdapter.prototype.ngDoCheck = function () {
  35847. var count = 0;
  35848. var destinationObj = this.destinationObj;
  35849. var lastValues = this.checkLastValues;
  35850. var checkProperties = this.checkProperties;
  35851. for (var i = 0; i < checkProperties.length; i++) {
  35852. var value = destinationObj[checkProperties[i]];
  35853. var last = lastValues[i];
  35854. if (value !== last) {
  35855. if (typeof value == 'number' && isNaN(value) && typeof last == 'number' && isNaN(last)) {
  35856. }
  35857. else {
  35858. var eventEmitter = this[this.propOuts[i]];
  35859. eventEmitter.emit(lastValues[i] = value);
  35860. }
  35861. }
  35862. }
  35863. return count;
  35864. };
  35865. UpgradeNg1ComponentAdapter.prototype.setComponentProperty = function (name, value) {
  35866. this.destinationObj[this.propertyMap[name]] = value;
  35867. };
  35868. UpgradeNg1ComponentAdapter.prototype.resolveRequired = function ($element, require) {
  35869. if (!require) {
  35870. return undefined;
  35871. }
  35872. else if (typeof require == 'string') {
  35873. var name = require;
  35874. var isOptional = false;
  35875. var startParent = false;
  35876. var searchParents = false;
  35877. var ch;
  35878. if (name.charAt(0) == '?') {
  35879. isOptional = true;
  35880. name = name.substr(1);
  35881. }
  35882. if (name.charAt(0) == '^') {
  35883. searchParents = true;
  35884. name = name.substr(1);
  35885. }
  35886. if (name.charAt(0) == '^') {
  35887. startParent = true;
  35888. name = name.substr(1);
  35889. }
  35890. var key = util_1.controllerKey(name);
  35891. if (startParent)
  35892. $element = $element.parent();
  35893. var dep = searchParents ? $element.inheritedData(key) : $element.data(key);
  35894. if (!dep && !isOptional) {
  35895. throw new Error("Can not locate '" + require + "' in '" + this.directive.name + "'.");
  35896. }
  35897. return dep;
  35898. }
  35899. else if (require instanceof Array) {
  35900. var deps = [];
  35901. for (var i = 0; i < require.length; i++) {
  35902. deps.push(this.resolveRequired($element, require[i]));
  35903. }
  35904. return deps;
  35905. }
  35906. throw new Error("Directive '" + this.directive.name + "' require syntax unrecognized: " + this.directive.require);
  35907. };
  35908. return UpgradeNg1ComponentAdapter;
  35909. })();
  35910. /***/ },
  35911. /* 258 */
  35912. /***/ function(module, exports) {
  35913. function noNg() {
  35914. throw new Error('AngularJS v1.x is not loaded!');
  35915. }
  35916. var angular = { bootstrap: noNg, module: noNg, element: noNg, version: noNg };
  35917. try {
  35918. if (window.hasOwnProperty('angular')) {
  35919. angular = window.angular;
  35920. }
  35921. }
  35922. catch (e) {
  35923. }
  35924. exports.bootstrap = angular.bootstrap;
  35925. exports.module = angular.module;
  35926. exports.element = angular.element;
  35927. exports.version = angular.version;
  35928. /***/ }
  35929. /******/ ])
  35930. });
  35931. ;
  35932. //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCBmYjk5MzU2OTEzZjI2NGJiZWVhMSIsIndlYnBhY2s6Ly8vLi90b29scy9idWlsZC93ZWJwYWNrL2FuZ3VsYXIyLWFsbC51bWQuanMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL2NvcmUudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL21ldGFkYXRhLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9tZXRhZGF0YS9kaS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9kaS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvZGkvbWV0YWRhdGEudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2RpL2RlY29yYXRvcnMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL3V0aWwvZGVjb3JhdG9ycy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvZGkvZm9yd2FyZF9yZWYudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2RpL2luamVjdG9yLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24udHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2RpL3Byb3ZpZGVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9uX2hhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL3JlZmxlY3Rpb24vcmVmbGVjdGlvbi50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvcmVmbGVjdGlvbi9yZWZsZWN0b3IudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL3JlZmxlY3Rpb24vcmVmbGVjdGlvbl9jYXBhYmlsaXRpZXMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2RpL2tleS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvZGkvdHlwZV9saXRlcmFsLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9kaS9leGNlcHRpb25zLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9kaS9vcGFxdWVfdG9rZW4udHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL21ldGFkYXRhL2RpcmVjdGl2ZXMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24udHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vY2hhbmdlX2RldGVjdGlvbi50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9kaWZmZXJzL2l0ZXJhYmxlX2RpZmZlcnMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vZGlmZmVycy9kZWZhdWx0X2l0ZXJhYmxlX2RpZmZlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9kaWZmZXJzL2tleXZhbHVlX2RpZmZlcnMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vZGlmZmVycy9kZWZhdWx0X2tleXZhbHVlX2RpZmZlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9wYXJzZXIvYXN0LnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL3BhcnNlci9sZXhlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9wYXJzZXIvcGFyc2VyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL3BhcnNlci9sb2NhbHMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vZXhjZXB0aW9ucy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9pbnRlcmZhY2VzLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2NvbnN0YW50cy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9wcm90b19jaGFuZ2VfZGV0ZWN0b3IudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vY2hhbmdlX2RldGVjdGlvbl91dGlsLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL3BpcGVfbGlmZWN5Y2xlX3JlZmxlY3Rvci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9iaW5kaW5nX3JlY29yZC50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9kaXJlY3RpdmVfcmVjb3JkLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2R5bmFtaWNfY2hhbmdlX2RldGVjdG9yLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2Fic3RyYWN0X2NoYW5nZV9kZXRlY3Rvci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9jaGFuZ2VfZGV0ZWN0b3JfcmVmLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9wcm9maWxlL3Byb2ZpbGUudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL3Byb2ZpbGUvd3RmX2ltcGwudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vb2JzZXJ2YWJsZV9mYWNhZGUudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vcHJvdG9fcmVjb3JkLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2V2ZW50X2JpbmRpbmcudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vY29hbGVzY2UudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vaml0X3Byb3RvX2NoYW5nZV9kZXRlY3Rvci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9jaGFuZ2VfZGV0ZWN0aW9uX2ppdF9nZW5lcmF0b3IudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vY29kZWdlbl9uYW1lX3V0aWwudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vY29kZWdlbl9sb2dpY191dGlsLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2NvZGVnZW5fZmFjYWRlLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9tZXRhZGF0YS92aWV3LnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS91dGlsLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9wcm9kX21vZGUudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9mYWNhZGUvZmFjYWRlLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvZmFjYWRlL2FzeW5jLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvZmFjYWRlL3Byb21pc2UudHMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiUnhcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanNcIjpcInJ4anMvb2JzZXJ2YWJsZS9mcm9tUHJvbWlzZVwiLFwiY29tbW9uanMyXCI6XCJyeGpzL29ic2VydmFibGUvZnJvbVByb21pc2VcIixcImFtZFwiOlwicnhqcy9vYnNlcnZhYmxlL2Zyb21Qcm9taXNlXCIsXCJyb290XCI6W1wiUnhcIixcIk9ic2VydmFibGVcIl19Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qc1wiOlwicnhqcy9vcGVyYXRvci90b1Byb21pc2VcIixcImNvbW1vbmpzMlwiOlwicnhqcy9vcGVyYXRvci90b1Byb21pc2VcIixcImFtZFwiOlwicnhqcy9vcGVyYXRvci90b1Byb21pc2VcIixcInJvb3RcIjpbXCJSeFwiLFwiT2JzZXJ2YWJsZVwiLFwicHJvdG90eXBlXCJdfSIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvYXBwbGljYXRpb25fcmVmLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS96b25lL25nX3pvbmUudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2FwcGxpY2F0aW9uX3Rva2Vucy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvdGVzdGFiaWxpdHkvdGVzdGFiaWxpdHkudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9keW5hbWljX2NvbXBvbmVudF9sb2FkZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9jb21waWxlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL3Byb3RvX3ZpZXdfZmFjdG9yeS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvcmVuZGVyL2FwaS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvcGlwZXMvcGlwZV9wcm92aWRlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvcGlwZXMvcGlwZXMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vcGlwZXMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci92aWV3LnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvdmlld19yZWYudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL3JlbmRlci91dGlsLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvZWxlbWVudF9iaW5kZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9lbGVtZW50X2luamVjdG9yLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvdmlld19tYW5hZ2VyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvdmlld19tYW5hZ2VyX3V0aWxzLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvZWxlbWVudF9yZWYudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci90ZW1wbGF0ZV9yZWYudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci92aWV3X3Bvb2wudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci92aWV3X2xpc3RlbmVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvdmlld19jb250YWluZXJfcmVmLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvZGlyZWN0aXZlX2xpZmVjeWNsZV9yZWZsZWN0b3IudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9pbnRlcmZhY2VzLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvcXVlcnlfbGlzdC50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL2V2ZW50X2NvbmZpZy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL2RpcmVjdGl2ZV9yZXNvbHZlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL3ZpZXdfcmVzb2x2ZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9waXBlX3Jlc29sdmVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9wbGF0Zm9ybV9kaXJlY3RpdmVzX2FuZF9waXBlcy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL3RlbXBsYXRlX2NvbW1hbmRzLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9jb25zb2xlLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS96b25lLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9yZW5kZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvZGVidWcvZGVidWdfZWxlbWVudC50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvcGxhdGZvcm1fY29tbW9uX3Byb3ZpZGVycy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvYXBwbGljYXRpb25fY29tbW9uX3Byb3ZpZGVycy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvY29tbW9uLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL3BpcGVzLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL3BpcGVzL2FzeW5jX3BpcGUudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21tb24vcGlwZXMvaW52YWxpZF9waXBlX2FyZ3VtZW50X2V4Y2VwdGlvbi50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9waXBlcy91cHBlcmNhc2VfcGlwZS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9waXBlcy9sb3dlcmNhc2VfcGlwZS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9waXBlcy9qc29uX3BpcGUudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21tb24vcGlwZXMvc2xpY2VfcGlwZS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9waXBlcy9kYXRlX3BpcGUudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9mYWNhZGUvaW50bC50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9waXBlcy9udW1iZXJfcGlwZS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9kaXJlY3RpdmVzLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL2RpcmVjdGl2ZXMvbmdfY2xhc3MudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21tb24vZGlyZWN0aXZlcy9uZ19mb3IudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21tb24vZGlyZWN0aXZlcy9uZ19pZi50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9kaXJlY3RpdmVzL25nX3N0eWxlLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL2RpcmVjdGl2ZXMvbmdfc3dpdGNoLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL2RpcmVjdGl2ZXMvb2JzZXJ2YWJsZV9saXN0X2RpZmYudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21tb24vZGlyZWN0aXZlcy9jb3JlX2RpcmVjdGl2ZXMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21tb24vZm9ybXMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21tb24vZm9ybXMvbW9kZWwudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21tb24vZm9ybXMvZGlyZWN0aXZlcy9hYnN0cmFjdF9jb250cm9sX2RpcmVjdGl2ZS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9mb3Jtcy9kaXJlY3RpdmVzL2NvbnRyb2xfY29udGFpbmVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL2Zvcm1zL2RpcmVjdGl2ZXMvbmdfY29udHJvbF9uYW1lLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL2Zvcm1zL2RpcmVjdGl2ZXMvbmdfY29udHJvbC50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9mb3Jtcy9kaXJlY3RpdmVzL2NvbnRyb2xfdmFsdWVfYWNjZXNzb3IudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21tb24vZm9ybXMvZGlyZWN0aXZlcy9zaGFyZWQudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21tb24vZm9ybXMvdmFsaWRhdG9ycy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9mb3Jtcy9kaXJlY3RpdmVzL2RlZmF1bHRfdmFsdWVfYWNjZXNzb3IudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21tb24vZm9ybXMvZGlyZWN0aXZlcy9udW1iZXJfdmFsdWVfYWNjZXNzb3IudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21tb24vZm9ybXMvZGlyZWN0aXZlcy9jaGVja2JveF92YWx1ZV9hY2Nlc3Nvci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9mb3Jtcy9kaXJlY3RpdmVzL3NlbGVjdF9jb250cm9sX3ZhbHVlX2FjY2Vzc29yLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL2Zvcm1zL2RpcmVjdGl2ZXMvbm9ybWFsaXplX3ZhbGlkYXRvci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9mb3Jtcy9kaXJlY3RpdmVzL25nX2Zvcm1fY29udHJvbC50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9mb3Jtcy9kaXJlY3RpdmVzL25nX21vZGVsLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL2Zvcm1zL2RpcmVjdGl2ZXMvbmdfY29udHJvbF9ncm91cC50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9mb3Jtcy9kaXJlY3RpdmVzL25nX2Zvcm1fbW9kZWwudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21tb24vZm9ybXMvZGlyZWN0aXZlcy9uZ19mb3JtLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL2Zvcm1zL2RpcmVjdGl2ZXMvbmdfY29udHJvbF9zdGF0dXMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21tb24vZm9ybXMvZGlyZWN0aXZlcy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9mb3Jtcy9kaXJlY3RpdmVzL3ZhbGlkYXRvcnMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21tb24vZm9ybXMvZm9ybV9idWlsZGVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL2NvbW1vbl9kaXJlY3RpdmVzLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9jb21waWxlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3VybF9yZXNvbHZlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3hoci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbXBpbGVyL2NvbXBpbGVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tcGlsZXIvcnVudGltZV9jb21waWxlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3RlbXBsYXRlX2NvbXBpbGVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tcGlsZXIvZGlyZWN0aXZlX21ldGFkYXRhLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tcGlsZXIvc2VsZWN0b3IudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21waWxlci91dGlsLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tcGlsZXIvc291cmNlX21vZHVsZS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbXBpbGVyL2NoYW5nZV9kZXRlY3Rvcl9jb21waWxlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbXBpbGVyL2NoYW5nZV9kZWZpbml0aW9uX2ZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21waWxlci90ZW1wbGF0ZV9hc3QudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy90cmFuc2Zvcm0vdGVtcGxhdGVfY29tcGlsZXIvY2hhbmdlX2RldGVjdG9yX2NvZGVnZW4udHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21waWxlci9zdHlsZV9jb21waWxlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3NoYWRvd19jc3MudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21waWxlci9zdHlsZV91cmxfcmVzb2x2ZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL3JlbmRlci92aWV3X2ZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL3JlbmRlci92aWV3LnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tcGlsZXIvY29tbWFuZF9jb21waWxlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3RlbXBsYXRlX3BhcnNlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbXBpbGVyL2h0bWxfcGFyc2VyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tcGlsZXIvaHRtbF9hc3QudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21waWxlci9odG1sX2xleGVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tcGlsZXIvcGFyc2VfdXRpbC50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbXBpbGVyL2h0bWxfdGFncy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3NjaGVtYS9lbGVtZW50X3NjaGVtYV9yZWdpc3RyeS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3RlbXBsYXRlX3ByZXBhcnNlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3RlbXBsYXRlX25vcm1hbGl6ZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21waWxlci9ydW50aW1lX21ldGFkYXRhLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tcGlsZXIvc2NoZW1hL2RvbV9lbGVtZW50X3NjaGVtYV9yZWdpc3RyeS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9kb21fYWRhcHRlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvcGxhdGZvcm0vYnJvd3Nlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvYW5ndWxhcl9lbnRyeXBvaW50LnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcGxhdGZvcm0vYnJvd3Nlcl9jb21tb24udHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZXZlbnRzL2RvbV9ldmVudHMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZXZlbnRzL2V2ZW50X21hbmFnZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZXZlbnRzL2tleV9ldmVudHMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZXZlbnRzL2hhbW1lcl9nZXN0dXJlcy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9ldmVudHMvaGFtbWVyX2NvbW1vbi50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9kb21fdG9rZW5zLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2RvbV9yZW5kZXJlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2FuaW1hdGUvYW5pbWF0aW9uX2J1aWxkZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9hbmltYXRlL2Nzc19hbmltYXRpb25fYnVpbGRlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2FuaW1hdGUvY3NzX2FuaW1hdGlvbl9vcHRpb25zLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvYW5pbWF0ZS9hbmltYXRpb24udHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9mYWNhZGUvbWF0aC50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS91dGlsLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvYW5pbWF0ZS9icm93c2VyX2RldGFpbHMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vc2hhcmVkX3N0eWxlc19ob3N0LnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcGxhdGZvcm0vYnJvd3Nlci9icm93c2VyX2FkYXB0ZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9icm93c2VyL2dlbmVyaWNfYnJvd3Nlcl9hZGFwdGVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcGxhdGZvcm0vYnJvd3Nlci94aHJfaW1wbC50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2Jyb3dzZXIvdGVzdGFiaWxpdHkudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL3Byb2ZpbGUvd3RmX2luaXQudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9icm93c2VyL3RpdGxlLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9wbGF0Zm9ybS9jb21tb25fZG9tLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2RlYnVnL2J5LnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2RlYnVnL2RlYnVnX2VsZW1lbnRfdmlld19saXN0ZW5lci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2Jyb3dzZXIvdG9vbHMvdG9vbHMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9icm93c2VyL3Rvb2xzL2NvbW1vbl90b29scy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2ZhY2FkZS9icm93c2VyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9odHRwLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvaHR0cC9odHRwLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvaHR0cC9pbnRlcmZhY2VzLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvaHR0cC9zdGF0aWNfcmVxdWVzdC50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2h0dHAvaGVhZGVycy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2h0dHAvaHR0cF91dGlscy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2h0dHAvZW51bXMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9odHRwL2Jhc2VfcmVxdWVzdF9vcHRpb25zLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvaHR0cC91cmxfc2VhcmNoX3BhcmFtcy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2h0dHAvYmFja2VuZHMveGhyX2JhY2tlbmQudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9odHRwL3N0YXRpY19yZXNwb25zZS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2h0dHAvYmFzZV9yZXNwb25zZV9vcHRpb25zLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvaHR0cC9iYWNrZW5kcy9icm93c2VyX3hoci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2h0dHAvYmFja2VuZHMvanNvbnBfYmFja2VuZC50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2h0dHAvYmFja2VuZHMvYnJvd3Nlcl9qc29ucC50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvcm91dGVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcm91dGVyL3JvdXRlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3JvdXRlci9yb3V0ZV9yZWdpc3RyeS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3JvdXRlci9yb3V0ZV9jb25maWdfaW1wbC50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3JvdXRlci9yb3V0ZV9yZWNvZ25pemVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcm91dGVyL2luc3RydWN0aW9uLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcm91dGVyL3BhdGhfcmVjb2duaXplci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3JvdXRlci91cmxfcGFyc2VyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcm91dGVyL2NvbXBvbmVudF9yZWNvZ25pemVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcm91dGVyL2FzeW5jX3JvdXRlX2hhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9yb3V0ZXIvc3luY19yb3V0ZV9oYW5kbGVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcm91dGVyL3JvdXRlX2NvbmZpZ19ub21hbGl6ZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9yb3V0ZXIvcm91dGVfY29uZmlnX2RlY29yYXRvci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3JvdXRlci9sb2NhdGlvbi50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3JvdXRlci9sb2NhdGlvbl9zdHJhdGVneS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3JvdXRlci9yb3V0ZV9saWZlY3ljbGVfcmVmbGVjdG9yLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcm91dGVyL2xpZmVjeWNsZV9hbm5vdGF0aW9uc19pbXBsLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcm91dGVyL3JvdXRlcl9vdXRsZXQudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9yb3V0ZXIvbGlmZWN5Y2xlX2Fubm90YXRpb25zLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcm91dGVyL3JvdXRlcl9saW5rLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcm91dGVyL3BsYXRmb3JtX2xvY2F0aW9uLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcm91dGVyL2hhc2hfbG9jYXRpb25fc3RyYXRlZ3kudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9yb3V0ZXIvcGF0aF9sb2NhdGlvbl9zdHJhdGVneS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvcm91dGVyL3JvdXRlcl9saW5rX2RzbC50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3JvdXRlci9yb3V0ZXJfbGlua190cmFuc2Zvcm0udHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL2luc3RydW1lbnRhdGlvbi50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvdXBncmFkZS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3VwZ3JhZGUvdXBncmFkZV9hZGFwdGVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvdXBncmFkZS9tZXRhZGF0YS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3VwZ3JhZGUvdXRpbC50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3VwZ3JhZGUvY29uc3RhbnRzLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvdXBncmFkZS9kb3duZ3JhZGVfbmcyX2FkYXB0ZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy91cGdyYWRlL3VwZ3JhZGVfbmcxX2FkYXB0ZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy91cGdyYWRlL2FuZ3VsYXJfanMudHMiXSwibmFtZXMiOlsiQXR0cmlidXRlTWV0YWRhdGEiLCJBdHRyaWJ1dGVNZXRhZGF0YS5jb25zdHJ1Y3RvciIsIkF0dHJpYnV0ZU1ldGFkYXRhLnRva2VuIiwiQXR0cmlidXRlTWV0YWRhdGEudG9TdHJpbmciLCJRdWVyeU1ldGFkYXRhIiwiUXVlcnlNZXRhZGF0YS5jb25zdHJ1Y3RvciIsIlF1ZXJ5TWV0YWRhdGEuaXNWaWV3UXVlcnkiLCJRdWVyeU1ldGFkYXRhLnNlbGVjdG9yIiwiUXVlcnlNZXRhZGF0YS5pc1ZhckJpbmRpbmdRdWVyeSIsIlF1ZXJ5TWV0YWRhdGEudmFyQmluZGluZ3MiLCJRdWVyeU1ldGFkYXRhLnRvU3RyaW5nIiwiQ29udGVudENoaWxkcmVuTWV0YWRhdGEiLCJDb250ZW50Q2hpbGRyZW5NZXRhZGF0YS5jb25zdHJ1Y3RvciIsIkNvbnRlbnRDaGlsZE1ldGFkYXRhIiwiQ29udGVudENoaWxkTWV0YWRhdGEuY29uc3RydWN0b3IiLCJWaWV3UXVlcnlNZXRhZGF0YSIsIlZpZXdRdWVyeU1ldGFkYXRhLmNvbnN0cnVjdG9yIiwiVmlld1F1ZXJ5TWV0YWRhdGEuaXNWaWV3UXVlcnkiLCJWaWV3UXVlcnlNZXRhZGF0YS50b1N0cmluZyIsIlZpZXdDaGlsZHJlbk1ldGFkYXRhIiwiVmlld0NoaWxkcmVuTWV0YWRhdGEuY29uc3RydWN0b3IiLCJWaWV3Q2hpbGRNZXRhZGF0YSIsIlZpZXdDaGlsZE1ldGFkYXRhLmNvbnN0cnVjdG9yIiwiZ2V0VHlwZU5hbWVGb3JEZWJ1Z2dpbmciLCJsb2NrTW9kZSIsImVuYWJsZVByb2RNb2RlIiwiYXNzZXJ0aW9uc0VuYWJsZWQiLCJhc3NlcnQiLCJDT05TVF9FWFBSIiwiQ09OU1QiLCJpc1ByZXNlbnQiLCJpc0JsYW5rIiwiaXNTdHJpbmciLCJpc0Z1bmN0aW9uIiwiaXNUeXBlIiwiaXNTdHJpbmdNYXAiLCJpc1Byb21pc2UiLCJpc0FycmF5IiwiaXNOdW1iZXIiLCJpc0RhdGUiLCJub29wIiwic3RyaW5naWZ5Iiwic2VyaWFsaXplRW51bSIsImRlc2VyaWFsaXplRW51bSIsIlN0cmluZ1dyYXBwZXIiLCJTdHJpbmdXcmFwcGVyLmNvbnN0cnVjdG9yIiwiU3RyaW5nV3JhcHBlci5mcm9tQ2hhckNvZGUiLCJTdHJpbmdXcmFwcGVyLmNoYXJDb2RlQXQiLCJTdHJpbmdXcmFwcGVyLnNwbGl0IiwiU3RyaW5nV3JhcHBlci5lcXVhbHMiLCJTdHJpbmdXcmFwcGVyLnN0cmlwTGVmdCIsIlN0cmluZ1dyYXBwZXIuc3RyaXBSaWdodCIsIlN0cmluZ1dyYXBwZXIucmVwbGFjZSIsIlN0cmluZ1dyYXBwZXIucmVwbGFjZUFsbCIsIlN0cmluZ1dyYXBwZXIuc2xpY2UiLCJTdHJpbmdXcmFwcGVyLnJlcGxhY2VBbGxNYXBwZWQiLCJTdHJpbmdXcmFwcGVyLmNvbnRhaW5zIiwiU3RyaW5nV3JhcHBlci5jb21wYXJlIiwiU3RyaW5nSm9pbmVyIiwiU3RyaW5nSm9pbmVyLmNvbnN0cnVjdG9yIiwiU3RyaW5nSm9pbmVyLmFkZCIsIlN0cmluZ0pvaW5lci50b1N0cmluZyIsIk51bWJlclBhcnNlRXJyb3IiLCJOdW1iZXJQYXJzZUVycm9yLmNvbnN0cnVjdG9yIiwiTnVtYmVyUGFyc2VFcnJvci50b1N0cmluZyIsIk51bWJlcldyYXBwZXIiLCJOdW1iZXJXcmFwcGVyLmNvbnN0cnVjdG9yIiwiTnVtYmVyV3JhcHBlci50b0ZpeGVkIiwiTnVtYmVyV3JhcHBlci5lcXVhbCIsIk51bWJlcldyYXBwZXIucGFyc2VJbnRBdXRvUmFkaXgiLCJOdW1iZXJXcmFwcGVyLnBhcnNlSW50IiwiTnVtYmVyV3JhcHBlci5wYXJzZUZsb2F0IiwiTnVtYmVyV3JhcHBlci5OYU4iLCJOdW1iZXJXcmFwcGVyLmlzTmFOIiwiTnVtYmVyV3JhcHBlci5pc0ludGVnZXIiLCJSZWdFeHBXcmFwcGVyIiwiUmVnRXhwV3JhcHBlci5jb25zdHJ1Y3RvciIsIlJlZ0V4cFdyYXBwZXIuY3JlYXRlIiwiUmVnRXhwV3JhcHBlci5maXJzdE1hdGNoIiwiUmVnRXhwV3JhcHBlci50ZXN0IiwiUmVnRXhwV3JhcHBlci5tYXRjaGVyIiwiUmVnRXhwTWF0Y2hlcldyYXBwZXIiLCJSZWdFeHBNYXRjaGVyV3JhcHBlci5jb25zdHJ1Y3RvciIsIlJlZ0V4cE1hdGNoZXJXcmFwcGVyLm5leHQiLCJGdW5jdGlvbldyYXBwZXIiLCJGdW5jdGlvbldyYXBwZXIuY29uc3RydWN0b3IiLCJGdW5jdGlvbldyYXBwZXIuYXBwbHkiLCJsb29zZUlkZW50aWNhbCIsImdldE1hcEtleSIsIm5vcm1hbGl6ZUJsYW5rIiwibm9ybWFsaXplQm9vbCIsImlzSnNPYmplY3QiLCJwcmludCIsIkpzb24iLCJKc29uLmNvbnN0cnVjdG9yIiwiSnNvbi5wYXJzZSIsIkpzb24uc3RyaW5naWZ5IiwiRGF0ZVdyYXBwZXIiLCJEYXRlV3JhcHBlci5jb25zdHJ1Y3RvciIsIkRhdGVXcmFwcGVyLmNyZWF0ZSIsIkRhdGVXcmFwcGVyLmZyb21JU09TdHJpbmciLCJEYXRlV3JhcHBlci5mcm9tTWlsbGlzIiwiRGF0ZVdyYXBwZXIudG9NaWxsaXMiLCJEYXRlV3JhcHBlci5ub3ciLCJEYXRlV3JhcHBlci50b0pzb24iLCJzZXRWYWx1ZU9uUGF0aCIsImdldFN5bWJvbEl0ZXJhdG9yIiwiSW5qZWN0TWV0YWRhdGEiLCJJbmplY3RNZXRhZGF0YS5jb25zdHJ1Y3RvciIsIkluamVjdE1ldGFkYXRhLnRvU3RyaW5nIiwiT3B0aW9uYWxNZXRhZGF0YSIsIk9wdGlvbmFsTWV0YWRhdGEuY29uc3RydWN0b3IiLCJPcHRpb25hbE1ldGFkYXRhLnRvU3RyaW5nIiwiRGVwZW5kZW5jeU1ldGFkYXRhIiwiRGVwZW5kZW5jeU1ldGFkYXRhLmNvbnN0cnVjdG9yIiwiRGVwZW5kZW5jeU1ldGFkYXRhLnRva2VuIiwiSW5qZWN0YWJsZU1ldGFkYXRhIiwiSW5qZWN0YWJsZU1ldGFkYXRhLmNvbnN0cnVjdG9yIiwiU2VsZk1ldGFkYXRhIiwiU2VsZk1ldGFkYXRhLmNvbnN0cnVjdG9yIiwiU2VsZk1ldGFkYXRhLnRvU3RyaW5nIiwiU2tpcFNlbGZNZXRhZGF0YSIsIlNraXBTZWxmTWV0YWRhdGEuY29uc3RydWN0b3IiLCJTa2lwU2VsZk1ldGFkYXRhLnRvU3RyaW5nIiwiSG9zdE1ldGFkYXRhIiwiSG9zdE1ldGFkYXRhLmNvbnN0cnVjdG9yIiwiSG9zdE1ldGFkYXRhLnRvU3RyaW5nIiwiZXh0cmFjdEFubm90YXRpb24iLCJhcHBseVBhcmFtcyIsIkNsYXNzIiwibWFrZURlY29yYXRvciIsIm1ha2VEZWNvcmF0b3IuRGVjb3JhdG9yRmFjdG9yeSIsIm1ha2VEZWNvcmF0b3IuRGVjb3JhdG9yRmFjdG9yeS5UeXBlRGVjb3JhdG9yIiwibWFrZVBhcmFtRGVjb3JhdG9yIiwibWFrZVBhcmFtRGVjb3JhdG9yLlBhcmFtRGVjb3JhdG9yRmFjdG9yeSIsIm1ha2VQYXJhbURlY29yYXRvci5QYXJhbURlY29yYXRvckZhY3RvcnkuUGFyYW1EZWNvcmF0b3IiLCJtYWtlUHJvcERlY29yYXRvciIsIm1ha2VQcm9wRGVjb3JhdG9yLlByb3BEZWNvcmF0b3JGYWN0b3J5IiwibWFrZVByb3BEZWNvcmF0b3IuUHJvcERlY29yYXRvckZhY3RvcnkuUHJvcERlY29yYXRvciIsImZvcndhcmRSZWYiLCJyZXNvbHZlRm9yd2FyZFJlZiIsIlZpc2liaWxpdHkiLCJjYW5TZWUiLCJQcm90b0luamVjdG9ySW5saW5lU3RyYXRlZ3kiLCJQcm90b0luamVjdG9ySW5saW5lU3RyYXRlZ3kuY29uc3RydWN0b3IiLCJQcm90b0luamVjdG9ySW5saW5lU3RyYXRlZ3kuZ2V0UHJvdmlkZXJBdEluZGV4IiwiUHJvdG9JbmplY3RvcklubGluZVN0cmF0ZWd5LmNyZWF0ZUluamVjdG9yU3RyYXRlZ3kiLCJQcm90b0luamVjdG9yRHluYW1pY1N0cmF0ZWd5IiwiUHJvdG9JbmplY3RvckR5bmFtaWNTdHJhdGVneS5jb25zdHJ1Y3RvciIsIlByb3RvSW5qZWN0b3JEeW5hbWljU3RyYXRlZ3kuZ2V0UHJvdmlkZXJBdEluZGV4IiwiUHJvdG9JbmplY3RvckR5bmFtaWNTdHJhdGVneS5jcmVhdGVJbmplY3RvclN0cmF0ZWd5IiwiUHJvdG9JbmplY3RvciIsIlByb3RvSW5qZWN0b3IuY29uc3RydWN0b3IiLCJQcm90b0luamVjdG9yLmdldFByb3ZpZGVyQXRJbmRleCIsIkluamVjdG9ySW5saW5lU3RyYXRlZ3kiLCJJbmplY3RvcklubGluZVN0cmF0ZWd5LmNvbnN0cnVjdG9yIiwiSW5qZWN0b3JJbmxpbmVTdHJhdGVneS5yZXNldENvbnN0cnVjdGlvbkNvdW50ZXIiLCJJbmplY3RvcklubGluZVN0cmF0ZWd5Lmluc3RhbnRpYXRlUHJvdmlkZXIiLCJJbmplY3RvcklubGluZVN0cmF0ZWd5LmF0dGFjaCIsIkluamVjdG9ySW5saW5lU3RyYXRlZ3kuZ2V0T2JqQnlLZXlJZCIsIkluamVjdG9ySW5saW5lU3RyYXRlZ3kuZ2V0T2JqQXRJbmRleCIsIkluamVjdG9ySW5saW5lU3RyYXRlZ3kuZ2V0TWF4TnVtYmVyT2ZPYmplY3RzIiwiSW5qZWN0b3JEeW5hbWljU3RyYXRlZ3kiLCJJbmplY3RvckR5bmFtaWNTdHJhdGVneS5jb25zdHJ1Y3RvciIsIkluamVjdG9yRHluYW1pY1N0cmF0ZWd5LnJlc2V0Q29uc3RydWN0aW9uQ291bnRlciIsIkluamVjdG9yRHluYW1pY1N0cmF0ZWd5Lmluc3RhbnRpYXRlUHJvdmlkZXIiLCJJbmplY3RvckR5bmFtaWNTdHJhdGVneS5hdHRhY2giLCJJbmplY3RvckR5bmFtaWNTdHJhdGVneS5nZXRPYmpCeUtleUlkIiwiSW5qZWN0b3JEeW5hbWljU3RyYXRlZ3kuZ2V0T2JqQXRJbmRleCIsIkluamVjdG9yRHluYW1pY1N0cmF0ZWd5LmdldE1heE51bWJlck9mT2JqZWN0cyIsIlByb3ZpZGVyV2l0aFZpc2liaWxpdHkiLCJQcm92aWRlcldpdGhWaXNpYmlsaXR5LmNvbnN0cnVjdG9yIiwiUHJvdmlkZXJXaXRoVmlzaWJpbGl0eS5nZXRLZXlJZCIsIkluamVjdG9yIiwiSW5qZWN0b3IuY29uc3RydWN0b3IiLCJJbmplY3Rvci5yZXNvbHZlIiwiSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZSIsIkluamVjdG9yLmZyb21SZXNvbHZlZFByb3ZpZGVycyIsIkluamVjdG9yLmZyb21SZXNvbHZlZEJpbmRpbmdzIiwiSW5qZWN0b3IuZGVidWdDb250ZXh0IiwiSW5qZWN0b3IuZ2V0IiwiSW5qZWN0b3IuZ2V0T3B0aW9uYWwiLCJJbmplY3Rvci5nZXRBdCIsIkluamVjdG9yLnBhcmVudCIsIkluamVjdG9yLmludGVybmFsU3RyYXRlZ3kiLCJJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlQ2hpbGQiLCJJbmplY3Rvci5jcmVhdGVDaGlsZEZyb21SZXNvbHZlZCIsIkluamVjdG9yLnJlc29sdmVBbmRJbnN0YW50aWF0ZSIsIkluamVjdG9yLmluc3RhbnRpYXRlUmVzb2x2ZWQiLCJJbmplY3Rvci5fbmV3IiwiSW5qZWN0b3IuX2luc3RhbnRpYXRlUHJvdmlkZXIiLCJJbmplY3Rvci5faW5zdGFudGlhdGUiLCJJbmplY3Rvci5fZ2V0QnlEZXBlbmRlbmN5IiwiSW5qZWN0b3IuX2dldEJ5S2V5IiwiSW5qZWN0b3IuX3Rocm93T3JOdWxsIiwiSW5qZWN0b3IuX2dldEJ5S2V5U2VsZiIsIkluamVjdG9yLl9nZXRCeUtleUhvc3QiLCJJbmplY3Rvci5fZ2V0UHJpdmF0ZURlcGVuZGVuY3kiLCJJbmplY3Rvci5fZ2V0QnlLZXlEZWZhdWx0IiwiSW5qZWN0b3IuZGlzcGxheU5hbWUiLCJJbmplY3Rvci50b1N0cmluZyIsIl9tYXBQcm92aWRlcnMiLCJjcmVhdGVNYXBGcm9tUGFpcnMiLCJjcmVhdGVNYXBBbmRQb3B1bGF0ZUZyb21QYWlycyIsImNyZWF0ZU1hcEZyb21NYXAiLCJjcmVhdGVNYXBBbmRQb3B1bGF0ZUZyb21NYXAiLCJfY2xlYXJWYWx1ZXMiLCJfY2xlYXJWYWx1ZXNXaXRoRm9yZUVhY2giLCJjcmVhdGVBcnJheUZyb21NYXAiLCJjcmVhdGVBcnJheUZyb21NYXBXaXRoRm9yZWFjaCIsIk1hcFdyYXBwZXIiLCJNYXBXcmFwcGVyLmNvbnN0cnVjdG9yIiwiTWFwV3JhcHBlci5jbG9uZSIsIk1hcFdyYXBwZXIuY3JlYXRlRnJvbVN0cmluZ01hcCIsIk1hcFdyYXBwZXIudG9TdHJpbmdNYXAiLCJNYXBXcmFwcGVyLmNyZWF0ZUZyb21QYWlycyIsIk1hcFdyYXBwZXIuY2xlYXJWYWx1ZXMiLCJNYXBXcmFwcGVyLml0ZXJhYmxlIiwiTWFwV3JhcHBlci5rZXlzIiwiTWFwV3JhcHBlci52YWx1ZXMiLCJTdHJpbmdNYXBXcmFwcGVyIiwiU3RyaW5nTWFwV3JhcHBlci5jb25zdHJ1Y3RvciIsIlN0cmluZ01hcFdyYXBwZXIuY3JlYXRlIiwiU3RyaW5nTWFwV3JhcHBlci5jb250YWlucyIsIlN0cmluZ01hcFdyYXBwZXIuZ2V0IiwiU3RyaW5nTWFwV3JhcHBlci5zZXQiLCJTdHJpbmdNYXBXcmFwcGVyLmtleXMiLCJTdHJpbmdNYXBXcmFwcGVyLmlzRW1wdHkiLCJTdHJpbmdNYXBXcmFwcGVyLmRlbGV0ZSIsIlN0cmluZ01hcFdyYXBwZXIuZm9yRWFjaCIsIlN0cmluZ01hcFdyYXBwZXIubWVyZ2UiLCJTdHJpbmdNYXBXcmFwcGVyLmVxdWFscyIsIkxpc3RXcmFwcGVyIiwiTGlzdFdyYXBwZXIuY29uc3RydWN0b3IiLCJMaXN0V3JhcHBlci5jcmVhdGVGaXhlZFNpemUiLCJMaXN0V3JhcHBlci5jcmVhdGVHcm93YWJsZVNpemUiLCJMaXN0V3JhcHBlci5jbG9uZSIsIkxpc3RXcmFwcGVyLmZvckVhY2hXaXRoSW5kZXgiLCJMaXN0V3JhcHBlci5maXJzdCIsIkxpc3RXcmFwcGVyLmxhc3QiLCJMaXN0V3JhcHBlci5pbmRleE9mIiwiTGlzdFdyYXBwZXIuY29udGFpbnMiLCJMaXN0V3JhcHBlci5yZXZlcnNlZCIsIkxpc3RXcmFwcGVyLmNvbmNhdCIsIkxpc3RXcmFwcGVyLmluc2VydCIsIkxpc3RXcmFwcGVyLnJlbW92ZUF0IiwiTGlzdFdyYXBwZXIucmVtb3ZlQWxsIiwiTGlzdFdyYXBwZXIucmVtb3ZlIiwiTGlzdFdyYXBwZXIuY2xlYXIiLCJMaXN0V3JhcHBlci5pc0VtcHR5IiwiTGlzdFdyYXBwZXIuZmlsbCIsIkxpc3RXcmFwcGVyLmVxdWFscyIsIkxpc3RXcmFwcGVyLnNsaWNlIiwiTGlzdFdyYXBwZXIuc3BsaWNlIiwiTGlzdFdyYXBwZXIuc29ydCIsIkxpc3RXcmFwcGVyLnRvU3RyaW5nIiwiTGlzdFdyYXBwZXIudG9KU09OIiwiTGlzdFdyYXBwZXIubWF4aW11bSIsImlzTGlzdExpa2VJdGVyYWJsZSIsIml0ZXJhdGVMaXN0TGlrZSIsImNyZWF0ZVNldEZyb21MaXN0IiwiY3JlYXRlU2V0QW5kUG9wdWxhdGVGcm9tTGlzdCIsIlNldFdyYXBwZXIiLCJTZXRXcmFwcGVyLmNvbnN0cnVjdG9yIiwiU2V0V3JhcHBlci5jcmVhdGVGcm9tTGlzdCIsIlNldFdyYXBwZXIuaGFzIiwiU2V0V3JhcHBlci5kZWxldGUiLCJEZXBlbmRlbmN5IiwiRGVwZW5kZW5jeS5jb25zdHJ1Y3RvciIsIkRlcGVuZGVuY3kuZnJvbUtleSIsIlByb3ZpZGVyIiwiUHJvdmlkZXIuY29uc3RydWN0b3IiLCJQcm92aWRlci5tdWx0aSIsIkJpbmRpbmciLCJCaW5kaW5nLmNvbnN0cnVjdG9yIiwiQmluZGluZy50b0NsYXNzIiwiQmluZGluZy50b0FsaWFzIiwiQmluZGluZy50b0ZhY3RvcnkiLCJCaW5kaW5nLnRvVmFsdWUiLCJSZXNvbHZlZFByb3ZpZGVyXyIsIlJlc29sdmVkUHJvdmlkZXJfLmNvbnN0cnVjdG9yIiwiUmVzb2x2ZWRQcm92aWRlcl8ucmVzb2x2ZWRGYWN0b3J5IiwiUmVzb2x2ZWRGYWN0b3J5IiwiUmVzb2x2ZWRGYWN0b3J5LmNvbnN0cnVjdG9yIiwiYmluZCIsInByb3ZpZGUiLCJQcm92aWRlckJ1aWxkZXIiLCJQcm92aWRlckJ1aWxkZXIuY29uc3RydWN0b3IiLCJQcm92aWRlckJ1aWxkZXIudG9DbGFzcyIsIlByb3ZpZGVyQnVpbGRlci50b1ZhbHVlIiwiUHJvdmlkZXJCdWlsZGVyLnRvQWxpYXMiLCJQcm92aWRlckJ1aWxkZXIudG9GYWN0b3J5IiwicmVzb2x2ZUZhY3RvcnkiLCJyZXNvbHZlUHJvdmlkZXIiLCJyZXNvbHZlUHJvdmlkZXJzIiwiX05vcm1hbGl6ZWRQcm92aWRlciIsIl9Ob3JtYWxpemVkUHJvdmlkZXIuY29uc3RydWN0b3IiLCJfY3JlYXRlTGlzdE9mUHJvdmlkZXJzIiwiX25vcm1hbGl6ZVByb3ZpZGVycyIsIl9ub3JtYWxpemVQcm92aWRlciIsIl9jb25zdHJ1Y3REZXBlbmRlbmNpZXMiLCJfZGVwZW5kZW5jaWVzRm9yIiwiX2V4dHJhY3RUb2tlbiIsIl9jcmVhdGVEZXBlbmRlbmN5IiwiQmFzZUV4Y2VwdGlvbiIsIkJhc2VFeGNlcHRpb24uY29uc3RydWN0b3IiLCJCYXNlRXhjZXB0aW9uLnRvU3RyaW5nIiwiV3JhcHBlZEV4Y2VwdGlvbiIsIldyYXBwZWRFeGNlcHRpb24uY29uc3RydWN0b3IiLCJXcmFwcGVkRXhjZXB0aW9uLndyYXBwZXJNZXNzYWdlIiwiV3JhcHBlZEV4Y2VwdGlvbi53cmFwcGVyU3RhY2siLCJXcmFwcGVkRXhjZXB0aW9uLm9yaWdpbmFsRXhjZXB0aW9uIiwiV3JhcHBlZEV4Y2VwdGlvbi5vcmlnaW5hbFN0YWNrIiwiV3JhcHBlZEV4Y2VwdGlvbi5jb250ZXh0IiwiV3JhcHBlZEV4Y2VwdGlvbi5tZXNzYWdlIiwiV3JhcHBlZEV4Y2VwdGlvbi50b1N0cmluZyIsIm1ha2VUeXBlRXJyb3IiLCJ1bmltcGxlbWVudGVkIiwiX0FycmF5TG9nZ2VyIiwiX0FycmF5TG9nZ2VyLmNvbnN0cnVjdG9yIiwiX0FycmF5TG9nZ2VyLmxvZyIsIl9BcnJheUxvZ2dlci5sb2dFcnJvciIsIl9BcnJheUxvZ2dlci5sb2dHcm91cCIsIl9BcnJheUxvZ2dlci5sb2dHcm91cEVuZCIsIkV4Y2VwdGlvbkhhbmRsZXIiLCJFeGNlcHRpb25IYW5kbGVyLmNvbnN0cnVjdG9yIiwiRXhjZXB0aW9uSGFuZGxlci5leGNlcHRpb25Ub1N0cmluZyIsIkV4Y2VwdGlvbkhhbmRsZXIuY2FsbCIsIkV4Y2VwdGlvbkhhbmRsZXIuX2V4dHJhY3RNZXNzYWdlIiwiRXhjZXB0aW9uSGFuZGxlci5fbG9uZ1N0YWNrVHJhY2UiLCJFeGNlcHRpb25IYW5kbGVyLl9maW5kQ29udGV4dCIsIkV4Y2VwdGlvbkhhbmRsZXIuX2ZpbmRPcmlnaW5hbEV4Y2VwdGlvbiIsIkV4Y2VwdGlvbkhhbmRsZXIuX2ZpbmRPcmlnaW5hbFN0YWNrIiwiUmVmbGVjdGlvbkluZm8iLCJSZWZsZWN0aW9uSW5mby5jb25zdHJ1Y3RvciIsIlJlZmxlY3RvciIsIlJlZmxlY3Rvci5jb25zdHJ1Y3RvciIsIlJlZmxlY3Rvci5pc1JlZmxlY3Rpb25FbmFibGVkIiwiUmVmbGVjdG9yLnRyYWNrVXNhZ2UiLCJSZWZsZWN0b3IubGlzdFVudXNlZEtleXMiLCJSZWZsZWN0b3IucmVnaXN0ZXJGdW5jdGlvbiIsIlJlZmxlY3Rvci5yZWdpc3RlclR5cGUiLCJSZWZsZWN0b3IucmVnaXN0ZXJHZXR0ZXJzIiwiUmVmbGVjdG9yLnJlZ2lzdGVyU2V0dGVycyIsIlJlZmxlY3Rvci5yZWdpc3Rlck1ldGhvZHMiLCJSZWZsZWN0b3IuZmFjdG9yeSIsIlJlZmxlY3Rvci5wYXJhbWV0ZXJzIiwiUmVmbGVjdG9yLmFubm90YXRpb25zIiwiUmVmbGVjdG9yLnByb3BNZXRhZGF0YSIsIlJlZmxlY3Rvci5pbnRlcmZhY2VzIiwiUmVmbGVjdG9yLmdldHRlciIsIlJlZmxlY3Rvci5zZXR0ZXIiLCJSZWZsZWN0b3IubWV0aG9kIiwiUmVmbGVjdG9yLl9nZXRSZWZsZWN0aW9uSW5mbyIsIlJlZmxlY3Rvci5fY29udGFpbnNSZWZsZWN0aW9uSW5mbyIsIlJlZmxlY3Rvci5pbXBvcnRVcmkiLCJfbWVyZ2VNYXBzIiwiUmVmbGVjdGlvbkNhcGFiaWxpdGllcyIsIlJlZmxlY3Rpb25DYXBhYmlsaXRpZXMuY29uc3RydWN0b3IiLCJSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLmlzUmVmbGVjdGlvbkVuYWJsZWQiLCJSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLmZhY3RvcnkiLCJSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLl96aXBUeXBlc0FuZEFubm90YWlvbnMiLCJSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLnBhcmFtZXRlcnMiLCJSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLmFubm90YXRpb25zIiwiUmVmbGVjdGlvbkNhcGFiaWxpdGllcy5wcm9wTWV0YWRhdGEiLCJSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLmludGVyZmFjZXMiLCJSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLmdldHRlciIsIlJlZmxlY3Rpb25DYXBhYmlsaXRpZXMuc2V0dGVyIiwiUmVmbGVjdGlvbkNhcGFiaWxpdGllcy5tZXRob2QiLCJSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLmltcG9ydFVyaSIsIktleSIsIktleS5jb25zdHJ1Y3RvciIsIktleS5kaXNwbGF5TmFtZSIsIktleS5nZXQiLCJLZXkubnVtYmVyT2ZLZXlzIiwiS2V5UmVnaXN0cnkiLCJLZXlSZWdpc3RyeS5jb25zdHJ1Y3RvciIsIktleVJlZ2lzdHJ5LmdldCIsIktleVJlZ2lzdHJ5Lm51bWJlck9mS2V5cyIsIlR5cGVMaXRlcmFsIiwiVHlwZUxpdGVyYWwuY29uc3RydWN0b3IiLCJUeXBlTGl0ZXJhbC50eXBlIiwiZmluZEZpcnN0Q2xvc2VkQ3ljbGUiLCJjb25zdHJ1Y3RSZXNvbHZpbmdQYXRoIiwiQWJzdHJhY3RQcm92aWRlckVycm9yIiwiQWJzdHJhY3RQcm92aWRlckVycm9yLmNvbnN0cnVjdG9yIiwiQWJzdHJhY3RQcm92aWRlckVycm9yLmFkZEtleSIsIkFic3RyYWN0UHJvdmlkZXJFcnJvci5jb250ZXh0IiwiTm9Qcm92aWRlckVycm9yIiwiTm9Qcm92aWRlckVycm9yLmNvbnN0cnVjdG9yIiwiQ3ljbGljRGVwZW5kZW5jeUVycm9yIiwiQ3ljbGljRGVwZW5kZW5jeUVycm9yLmNvbnN0cnVjdG9yIiwiSW5zdGFudGlhdGlvbkVycm9yIiwiSW5zdGFudGlhdGlvbkVycm9yLmNvbnN0cnVjdG9yIiwiSW5zdGFudGlhdGlvbkVycm9yLmFkZEtleSIsIkluc3RhbnRpYXRpb25FcnJvci53cmFwcGVyTWVzc2FnZSIsIkluc3RhbnRpYXRpb25FcnJvci5jYXVzZUtleSIsIkluc3RhbnRpYXRpb25FcnJvci5jb250ZXh0IiwiSW52YWxpZFByb3ZpZGVyRXJyb3IiLCJJbnZhbGlkUHJvdmlkZXJFcnJvci5jb25zdHJ1Y3RvciIsIk5vQW5ub3RhdGlvbkVycm9yIiwiTm9Bbm5vdGF0aW9uRXJyb3IuY29uc3RydWN0b3IiLCJOb0Fubm90YXRpb25FcnJvci5fZ2VuTWVzc2FnZSIsIk91dE9mQm91bmRzRXJyb3IiLCJPdXRPZkJvdW5kc0Vycm9yLmNvbnN0cnVjdG9yIiwiTWl4aW5nTXVsdGlQcm92aWRlcnNXaXRoUmVndWxhclByb3ZpZGVyc0Vycm9yIiwiTWl4aW5nTXVsdGlQcm92aWRlcnNXaXRoUmVndWxhclByb3ZpZGVyc0Vycm9yLmNvbnN0cnVjdG9yIiwiT3BhcXVlVG9rZW4iLCJPcGFxdWVUb2tlbi5jb25zdHJ1Y3RvciIsIk9wYXF1ZVRva2VuLnRvU3RyaW5nIiwiRGlyZWN0aXZlTWV0YWRhdGEiLCJEaXJlY3RpdmVNZXRhZGF0YS5jb25zdHJ1Y3RvciIsIkRpcmVjdGl2ZU1ldGFkYXRhLmlucHV0cyIsIkRpcmVjdGl2ZU1ldGFkYXRhLnByb3BlcnRpZXMiLCJEaXJlY3RpdmVNZXRhZGF0YS5vdXRwdXRzIiwiRGlyZWN0aXZlTWV0YWRhdGEuZXZlbnRzIiwiRGlyZWN0aXZlTWV0YWRhdGEucHJvdmlkZXJzIiwiRGlyZWN0aXZlTWV0YWRhdGEuYmluZGluZ3MiLCJDb21wb25lbnRNZXRhZGF0YSIsIkNvbXBvbmVudE1ldGFkYXRhLmNvbnN0cnVjdG9yIiwiQ29tcG9uZW50TWV0YWRhdGEudmlld1Byb3ZpZGVycyIsIkNvbXBvbmVudE1ldGFkYXRhLnZpZXdCaW5kaW5ncyIsIlBpcGVNZXRhZGF0YSIsIlBpcGVNZXRhZGF0YS5jb25zdHJ1Y3RvciIsIlBpcGVNZXRhZGF0YS5wdXJlIiwiSW5wdXRNZXRhZGF0YSIsIklucHV0TWV0YWRhdGEuY29uc3RydWN0b3IiLCJPdXRwdXRNZXRhZGF0YSIsIk91dHB1dE1ldGFkYXRhLmNvbnN0cnVjdG9yIiwiSG9zdEJpbmRpbmdNZXRhZGF0YSIsIkhvc3RCaW5kaW5nTWV0YWRhdGEuY29uc3RydWN0b3IiLCJIb3N0TGlzdGVuZXJNZXRhZGF0YSIsIkhvc3RMaXN0ZW5lck1ldGFkYXRhLmNvbnN0cnVjdG9yIiwiSXRlcmFibGVEaWZmZXJzIiwiSXRlcmFibGVEaWZmZXJzLmNvbnN0cnVjdG9yIiwiSXRlcmFibGVEaWZmZXJzLmNyZWF0ZSIsIkl0ZXJhYmxlRGlmZmVycy5leHRlbmQiLCJJdGVyYWJsZURpZmZlcnMuZmluZCIsIkRlZmF1bHRJdGVyYWJsZURpZmZlckZhY3RvcnkiLCJEZWZhdWx0SXRlcmFibGVEaWZmZXJGYWN0b3J5LmNvbnN0cnVjdG9yIiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyRmFjdG9yeS5zdXBwb3J0cyIsIkRlZmF1bHRJdGVyYWJsZURpZmZlckZhY3RvcnkuY3JlYXRlIiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyIiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLmNvbnN0cnVjdG9yIiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLmNvbGxlY3Rpb24iLCJEZWZhdWx0SXRlcmFibGVEaWZmZXIubGVuZ3RoIiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLmZvckVhY2hJdGVtIiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLmZvckVhY2hQcmV2aW91c0l0ZW0iLCJEZWZhdWx0SXRlcmFibGVEaWZmZXIuZm9yRWFjaEFkZGVkSXRlbSIsIkRlZmF1bHRJdGVyYWJsZURpZmZlci5mb3JFYWNoTW92ZWRJdGVtIiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLmZvckVhY2hSZW1vdmVkSXRlbSIsIkRlZmF1bHRJdGVyYWJsZURpZmZlci5kaWZmIiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLm9uRGVzdHJveSIsIkRlZmF1bHRJdGVyYWJsZURpZmZlci5jaGVjayIsIkRlZmF1bHRJdGVyYWJsZURpZmZlci5pc0RpcnR5IiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLl9yZXNldCIsIkRlZmF1bHRJdGVyYWJsZURpZmZlci5fbWlzbWF0Y2giLCJEZWZhdWx0SXRlcmFibGVEaWZmZXIuX3ZlcmlmeVJlaW5zZXJ0aW9uIiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLl90cnVuY2F0ZSIsIkRlZmF1bHRJdGVyYWJsZURpZmZlci5fcmVpbnNlcnRBZnRlciIsIkRlZmF1bHRJdGVyYWJsZURpZmZlci5fbW92ZUFmdGVyIiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLl9hZGRBZnRlciIsIkRlZmF1bHRJdGVyYWJsZURpZmZlci5faW5zZXJ0QWZ0ZXIiLCJEZWZhdWx0SXRlcmFibGVEaWZmZXIuX3JlbW92ZSIsIkRlZmF1bHRJdGVyYWJsZURpZmZlci5fdW5saW5rIiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLl9hZGRUb01vdmVzIiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLl9hZGRUb1JlbW92YWxzIiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLnRvU3RyaW5nIiwiQ29sbGVjdGlvbkNoYW5nZVJlY29yZCIsIkNvbGxlY3Rpb25DaGFuZ2VSZWNvcmQuY29uc3RydWN0b3IiLCJDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkLnRvU3RyaW5nIiwiX0R1cGxpY2F0ZUl0ZW1SZWNvcmRMaXN0IiwiX0R1cGxpY2F0ZUl0ZW1SZWNvcmRMaXN0LmNvbnN0cnVjdG9yIiwiX0R1cGxpY2F0ZUl0ZW1SZWNvcmRMaXN0LmFkZCIsIl9EdXBsaWNhdGVJdGVtUmVjb3JkTGlzdC5nZXQiLCJfRHVwbGljYXRlSXRlbVJlY29yZExpc3QucmVtb3ZlIiwiX0R1cGxpY2F0ZU1hcCIsIl9EdXBsaWNhdGVNYXAuY29uc3RydWN0b3IiLCJfRHVwbGljYXRlTWFwLnB1dCIsIl9EdXBsaWNhdGVNYXAuZ2V0IiwiX0R1cGxpY2F0ZU1hcC5yZW1vdmUiLCJfRHVwbGljYXRlTWFwLmlzRW1wdHkiLCJfRHVwbGljYXRlTWFwLmNsZWFyIiwiX0R1cGxpY2F0ZU1hcC50b1N0cmluZyIsIktleVZhbHVlRGlmZmVycyIsIktleVZhbHVlRGlmZmVycy5jb25zdHJ1Y3RvciIsIktleVZhbHVlRGlmZmVycy5jcmVhdGUiLCJLZXlWYWx1ZURpZmZlcnMuZXh0ZW5kIiwiS2V5VmFsdWVEaWZmZXJzLmZpbmQiLCJEZWZhdWx0S2V5VmFsdWVEaWZmZXJGYWN0b3J5IiwiRGVmYXVsdEtleVZhbHVlRGlmZmVyRmFjdG9yeS5jb25zdHJ1Y3RvciIsIkRlZmF1bHRLZXlWYWx1ZURpZmZlckZhY3Rvcnkuc3VwcG9ydHMiLCJEZWZhdWx0S2V5VmFsdWVEaWZmZXJGYWN0b3J5LmNyZWF0ZSIsIkRlZmF1bHRLZXlWYWx1ZURpZmZlciIsIkRlZmF1bHRLZXlWYWx1ZURpZmZlci5jb25zdHJ1Y3RvciIsIkRlZmF1bHRLZXlWYWx1ZURpZmZlci5pc0RpcnR5IiwiRGVmYXVsdEtleVZhbHVlRGlmZmVyLmZvckVhY2hJdGVtIiwiRGVmYXVsdEtleVZhbHVlRGlmZmVyLmZvckVhY2hQcmV2aW91c0l0ZW0iLCJEZWZhdWx0S2V5VmFsdWVEaWZmZXIuZm9yRWFjaENoYW5nZWRJdGVtIiwiRGVmYXVsdEtleVZhbHVlRGlmZmVyLmZvckVhY2hBZGRlZEl0ZW0iLCJEZWZhdWx0S2V5VmFsdWVEaWZmZXIuZm9yRWFjaFJlbW92ZWRJdGVtIiwiRGVmYXVsdEtleVZhbHVlRGlmZmVyLmRpZmYiLCJEZWZhdWx0S2V5VmFsdWVEaWZmZXIub25EZXN0cm95IiwiRGVmYXVsdEtleVZhbHVlRGlmZmVyLmNoZWNrIiwiRGVmYXVsdEtleVZhbHVlRGlmZmVyLl9yZXNldCIsIkRlZmF1bHRLZXlWYWx1ZURpZmZlci5fdHJ1bmNhdGUiLCJEZWZhdWx0S2V5VmFsdWVEaWZmZXIuX2lzSW5SZW1vdmFscyIsIkRlZmF1bHRLZXlWYWx1ZURpZmZlci5fYWRkVG9SZW1vdmFscyIsIkRlZmF1bHRLZXlWYWx1ZURpZmZlci5fcmVtb3ZlRnJvbVNlcSIsIkRlZmF1bHRLZXlWYWx1ZURpZmZlci5fcmVtb3ZlRnJvbVJlbW92YWxzIiwiRGVmYXVsdEtleVZhbHVlRGlmZmVyLl9hZGRUb0FkZGl0aW9ucyIsIkRlZmF1bHRLZXlWYWx1ZURpZmZlci5fYWRkVG9DaGFuZ2VzIiwiRGVmYXVsdEtleVZhbHVlRGlmZmVyLnRvU3RyaW5nIiwiRGVmYXVsdEtleVZhbHVlRGlmZmVyLl9mb3JFYWNoIiwiS1ZDaGFuZ2VSZWNvcmQiLCJLVkNoYW5nZVJlY29yZC5jb25zdHJ1Y3RvciIsIktWQ2hhbmdlUmVjb3JkLnRvU3RyaW5nIiwiQVNUIiwiQVNULmNvbnN0cnVjdG9yIiwiQVNULnZpc2l0IiwiQVNULnRvU3RyaW5nIiwiUXVvdGUiLCJRdW90ZS5jb25zdHJ1Y3RvciIsIlF1b3RlLnZpc2l0IiwiUXVvdGUudG9TdHJpbmciLCJFbXB0eUV4cHIiLCJFbXB0eUV4cHIuY29uc3RydWN0b3IiLCJFbXB0eUV4cHIudmlzaXQiLCJJbXBsaWNpdFJlY2VpdmVyIiwiSW1wbGljaXRSZWNlaXZlci5jb25zdHJ1Y3RvciIsIkltcGxpY2l0UmVjZWl2ZXIudmlzaXQiLCJDaGFpbiIsIkNoYWluLmNvbnN0cnVjdG9yIiwiQ2hhaW4udmlzaXQiLCJDb25kaXRpb25hbCIsIkNvbmRpdGlvbmFsLmNvbnN0cnVjdG9yIiwiQ29uZGl0aW9uYWwudmlzaXQiLCJQcm9wZXJ0eVJlYWQiLCJQcm9wZXJ0eVJlYWQuY29uc3RydWN0b3IiLCJQcm9wZXJ0eVJlYWQudmlzaXQiLCJQcm9wZXJ0eVdyaXRlIiwiUHJvcGVydHlXcml0ZS5jb25zdHJ1Y3RvciIsIlByb3BlcnR5V3JpdGUudmlzaXQiLCJTYWZlUHJvcGVydHlSZWFkIiwiU2FmZVByb3BlcnR5UmVhZC5jb25zdHJ1Y3RvciIsIlNhZmVQcm9wZXJ0eVJlYWQudmlzaXQiLCJLZXllZFJlYWQiLCJLZXllZFJlYWQuY29uc3RydWN0b3IiLCJLZXllZFJlYWQudmlzaXQiLCJLZXllZFdyaXRlIiwiS2V5ZWRXcml0ZS5jb25zdHJ1Y3RvciIsIktleWVkV3JpdGUudmlzaXQiLCJCaW5kaW5nUGlwZSIsIkJpbmRpbmdQaXBlLmNvbnN0cnVjdG9yIiwiQmluZGluZ1BpcGUudmlzaXQiLCJMaXRlcmFsUHJpbWl0aXZlIiwiTGl0ZXJhbFByaW1pdGl2ZS5jb25zdHJ1Y3RvciIsIkxpdGVyYWxQcmltaXRpdmUudmlzaXQiLCJMaXRlcmFsQXJyYXkiLCJMaXRlcmFsQXJyYXkuY29uc3RydWN0b3IiLCJMaXRlcmFsQXJyYXkudmlzaXQiLCJMaXRlcmFsTWFwIiwiTGl0ZXJhbE1hcC5jb25zdHJ1Y3RvciIsIkxpdGVyYWxNYXAudmlzaXQiLCJJbnRlcnBvbGF0aW9uIiwiSW50ZXJwb2xhdGlvbi5jb25zdHJ1Y3RvciIsIkludGVycG9sYXRpb24udmlzaXQiLCJCaW5hcnkiLCJCaW5hcnkuY29uc3RydWN0b3IiLCJCaW5hcnkudmlzaXQiLCJQcmVmaXhOb3QiLCJQcmVmaXhOb3QuY29uc3RydWN0b3IiLCJQcmVmaXhOb3QudmlzaXQiLCJNZXRob2RDYWxsIiwiTWV0aG9kQ2FsbC5jb25zdHJ1Y3RvciIsIk1ldGhvZENhbGwudmlzaXQiLCJTYWZlTWV0aG9kQ2FsbCIsIlNhZmVNZXRob2RDYWxsLmNvbnN0cnVjdG9yIiwiU2FmZU1ldGhvZENhbGwudmlzaXQiLCJGdW5jdGlvbkNhbGwiLCJGdW5jdGlvbkNhbGwuY29uc3RydWN0b3IiLCJGdW5jdGlvbkNhbGwudmlzaXQiLCJBU1RXaXRoU291cmNlIiwiQVNUV2l0aFNvdXJjZS5jb25zdHJ1Y3RvciIsIkFTVFdpdGhTb3VyY2UudmlzaXQiLCJBU1RXaXRoU291cmNlLnRvU3RyaW5nIiwiVGVtcGxhdGVCaW5kaW5nIiwiVGVtcGxhdGVCaW5kaW5nLmNvbnN0cnVjdG9yIiwiUmVjdXJzaXZlQXN0VmlzaXRvciIsIlJlY3Vyc2l2ZUFzdFZpc2l0b3IuY29uc3RydWN0b3IiLCJSZWN1cnNpdmVBc3RWaXNpdG9yLnZpc2l0QmluYXJ5IiwiUmVjdXJzaXZlQXN0VmlzaXRvci52aXNpdENoYWluIiwiUmVjdXJzaXZlQXN0VmlzaXRvci52aXNpdENvbmRpdGlvbmFsIiwiUmVjdXJzaXZlQXN0VmlzaXRvci52aXNpdFBpcGUiLCJSZWN1cnNpdmVBc3RWaXNpdG9yLnZpc2l0RnVuY3Rpb25DYWxsIiwiUmVjdXJzaXZlQXN0VmlzaXRvci52aXNpdEltcGxpY2l0UmVjZWl2ZXIiLCJSZWN1cnNpdmVBc3RWaXNpdG9yLnZpc2l0SW50ZXJwb2xhdGlvbiIsIlJlY3Vyc2l2ZUFzdFZpc2l0b3IudmlzaXRLZXllZFJlYWQiLCJSZWN1cnNpdmVBc3RWaXNpdG9yLnZpc2l0S2V5ZWRXcml0ZSIsIlJlY3Vyc2l2ZUFzdFZpc2l0b3IudmlzaXRMaXRlcmFsQXJyYXkiLCJSZWN1cnNpdmVBc3RWaXNpdG9yLnZpc2l0TGl0ZXJhbE1hcCIsIlJlY3Vyc2l2ZUFzdFZpc2l0b3IudmlzaXRMaXRlcmFsUHJpbWl0aXZlIiwiUmVjdXJzaXZlQXN0VmlzaXRvci52aXNpdE1ldGhvZENhbGwiLCJSZWN1cnNpdmVBc3RWaXNpdG9yLnZpc2l0UHJlZml4Tm90IiwiUmVjdXJzaXZlQXN0VmlzaXRvci52aXNpdFByb3BlcnR5UmVhZCIsIlJlY3Vyc2l2ZUFzdFZpc2l0b3IudmlzaXRQcm9wZXJ0eVdyaXRlIiwiUmVjdXJzaXZlQXN0VmlzaXRvci52aXNpdFNhZmVQcm9wZXJ0eVJlYWQiLCJSZWN1cnNpdmVBc3RWaXNpdG9yLnZpc2l0U2FmZU1ldGhvZENhbGwiLCJSZWN1cnNpdmVBc3RWaXNpdG9yLnZpc2l0QWxsIiwiUmVjdXJzaXZlQXN0VmlzaXRvci52aXNpdFF1b3RlIiwiQXN0VHJhbnNmb3JtZXIiLCJBc3RUcmFuc2Zvcm1lci5jb25zdHJ1Y3RvciIsIkFzdFRyYW5zZm9ybWVyLnZpc2l0SW1wbGljaXRSZWNlaXZlciIsIkFzdFRyYW5zZm9ybWVyLnZpc2l0SW50ZXJwb2xhdGlvbiIsIkFzdFRyYW5zZm9ybWVyLnZpc2l0TGl0ZXJhbFByaW1pdGl2ZSIsIkFzdFRyYW5zZm9ybWVyLnZpc2l0UHJvcGVydHlSZWFkIiwiQXN0VHJhbnNmb3JtZXIudmlzaXRQcm9wZXJ0eVdyaXRlIiwiQXN0VHJhbnNmb3JtZXIudmlzaXRTYWZlUHJvcGVydHlSZWFkIiwiQXN0VHJhbnNmb3JtZXIudmlzaXRNZXRob2RDYWxsIiwiQXN0VHJhbnNmb3JtZXIudmlzaXRTYWZlTWV0aG9kQ2FsbCIsIkFzdFRyYW5zZm9ybWVyLnZpc2l0RnVuY3Rpb25DYWxsIiwiQXN0VHJhbnNmb3JtZXIudmlzaXRMaXRlcmFsQXJyYXkiLCJBc3RUcmFuc2Zvcm1lci52aXNpdExpdGVyYWxNYXAiLCJBc3RUcmFuc2Zvcm1lci52aXNpdEJpbmFyeSIsIkFzdFRyYW5zZm9ybWVyLnZpc2l0UHJlZml4Tm90IiwiQXN0VHJhbnNmb3JtZXIudmlzaXRDb25kaXRpb25hbCIsIkFzdFRyYW5zZm9ybWVyLnZpc2l0UGlwZSIsIkFzdFRyYW5zZm9ybWVyLnZpc2l0S2V5ZWRSZWFkIiwiQXN0VHJhbnNmb3JtZXIudmlzaXRLZXllZFdyaXRlIiwiQXN0VHJhbnNmb3JtZXIudmlzaXRBbGwiLCJBc3RUcmFuc2Zvcm1lci52aXNpdENoYWluIiwiQXN0VHJhbnNmb3JtZXIudmlzaXRRdW90ZSIsIlRva2VuVHlwZSIsIkxleGVyIiwiTGV4ZXIuY29uc3RydWN0b3IiLCJMZXhlci50b2tlbml6ZSIsIlRva2VuIiwiVG9rZW4uY29uc3RydWN0b3IiLCJUb2tlbi5pc0NoYXJhY3RlciIsIlRva2VuLmlzTnVtYmVyIiwiVG9rZW4uaXNTdHJpbmciLCJUb2tlbi5pc09wZXJhdG9yIiwiVG9rZW4uaXNJZGVudGlmaWVyIiwiVG9rZW4uaXNLZXl3b3JkIiwiVG9rZW4uaXNLZXl3b3JkVmFyIiwiVG9rZW4uaXNLZXl3b3JkTnVsbCIsIlRva2VuLmlzS2V5d29yZFVuZGVmaW5lZCIsIlRva2VuLmlzS2V5d29yZFRydWUiLCJUb2tlbi5pc0tleXdvcmRGYWxzZSIsIlRva2VuLnRvTnVtYmVyIiwiVG9rZW4udG9TdHJpbmciLCJuZXdDaGFyYWN0ZXJUb2tlbiIsIm5ld0lkZW50aWZpZXJUb2tlbiIsIm5ld0tleXdvcmRUb2tlbiIsIm5ld09wZXJhdG9yVG9rZW4iLCJuZXdTdHJpbmdUb2tlbiIsIm5ld051bWJlclRva2VuIiwiU2Nhbm5lckVycm9yIiwiU2Nhbm5lckVycm9yLmNvbnN0cnVjdG9yIiwiU2Nhbm5lckVycm9yLnRvU3RyaW5nIiwiX1NjYW5uZXIiLCJfU2Nhbm5lci5jb25zdHJ1Y3RvciIsIl9TY2FubmVyLmFkdmFuY2UiLCJfU2Nhbm5lci5zY2FuVG9rZW4iLCJfU2Nhbm5lci5zY2FuQ2hhcmFjdGVyIiwiX1NjYW5uZXIuc2Nhbk9wZXJhdG9yIiwiX1NjYW5uZXIuc2NhbkNvbXBsZXhPcGVyYXRvciIsIl9TY2FubmVyLnNjYW5JZGVudGlmaWVyIiwiX1NjYW5uZXIuc2Nhbk51bWJlciIsIl9TY2FubmVyLnNjYW5TdHJpbmciLCJfU2Nhbm5lci5lcnJvciIsImlzV2hpdGVzcGFjZSIsImlzSWRlbnRpZmllclN0YXJ0IiwiaXNJZGVudGlmaWVyIiwiaXNJZGVudGlmaWVyUGFydCIsImlzRGlnaXQiLCJpc0V4cG9uZW50U3RhcnQiLCJpc0V4cG9uZW50U2lnbiIsInVuZXNjYXBlIiwiUGFyc2VFeGNlcHRpb24iLCJQYXJzZUV4Y2VwdGlvbi5jb25zdHJ1Y3RvciIsIlBhcnNlciIsIlBhcnNlci5jb25zdHJ1Y3RvciIsIlBhcnNlci5wYXJzZUFjdGlvbiIsIlBhcnNlci5wYXJzZUJpbmRpbmciLCJQYXJzZXIucGFyc2VTaW1wbGVCaW5kaW5nIiwiUGFyc2VyLl9wYXJzZUJpbmRpbmdBc3QiLCJQYXJzZXIuX3BhcnNlUXVvdGUiLCJQYXJzZXIucGFyc2VUZW1wbGF0ZUJpbmRpbmdzIiwiUGFyc2VyLnBhcnNlSW50ZXJwb2xhdGlvbiIsIlBhcnNlci53cmFwTGl0ZXJhbFByaW1pdGl2ZSIsIlBhcnNlci5fY2hlY2tOb0ludGVycG9sYXRpb24iLCJQYXJzZXIuX2ZpbmRJbnRlcnBvbGF0aW9uRXJyb3JDb2x1bW4iLCJfUGFyc2VBU1QiLCJfUGFyc2VBU1QuY29uc3RydWN0b3IiLCJfUGFyc2VBU1QucGVlayIsIl9QYXJzZUFTVC5uZXh0IiwiX1BhcnNlQVNULmlucHV0SW5kZXgiLCJfUGFyc2VBU1QuYWR2YW5jZSIsIl9QYXJzZUFTVC5vcHRpb25hbENoYXJhY3RlciIsIl9QYXJzZUFTVC5vcHRpb25hbEtleXdvcmRWYXIiLCJfUGFyc2VBU1QucGVla0tleXdvcmRWYXIiLCJfUGFyc2VBU1QuZXhwZWN0Q2hhcmFjdGVyIiwiX1BhcnNlQVNULm9wdGlvbmFsT3BlcmF0b3IiLCJfUGFyc2VBU1QuZXhwZWN0T3BlcmF0b3IiLCJfUGFyc2VBU1QuZXhwZWN0SWRlbnRpZmllck9yS2V5d29yZCIsIl9QYXJzZUFTVC5leHBlY3RJZGVudGlmaWVyT3JLZXl3b3JkT3JTdHJpbmciLCJfUGFyc2VBU1QucGFyc2VDaGFpbiIsIl9QYXJzZUFTVC5wYXJzZVBpcGUiLCJfUGFyc2VBU1QucGFyc2VFeHByZXNzaW9uIiwiX1BhcnNlQVNULnBhcnNlQ29uZGl0aW9uYWwiLCJfUGFyc2VBU1QucGFyc2VMb2dpY2FsT3IiLCJfUGFyc2VBU1QucGFyc2VMb2dpY2FsQW5kIiwiX1BhcnNlQVNULnBhcnNlRXF1YWxpdHkiLCJfUGFyc2VBU1QucGFyc2VSZWxhdGlvbmFsIiwiX1BhcnNlQVNULnBhcnNlQWRkaXRpdmUiLCJfUGFyc2VBU1QucGFyc2VNdWx0aXBsaWNhdGl2ZSIsIl9QYXJzZUFTVC5wYXJzZVByZWZpeCIsIl9QYXJzZUFTVC5wYXJzZUNhbGxDaGFpbiIsIl9QYXJzZUFTVC5wYXJzZVByaW1hcnkiLCJfUGFyc2VBU1QucGFyc2VFeHByZXNzaW9uTGlzdCIsIl9QYXJzZUFTVC5wYXJzZUxpdGVyYWxNYXAiLCJfUGFyc2VBU1QucGFyc2VBY2Nlc3NNZW1iZXJPck1ldGhvZENhbGwiLCJfUGFyc2VBU1QucGFyc2VDYWxsQXJndW1lbnRzIiwiX1BhcnNlQVNULnBhcnNlQmxvY2tDb250ZW50IiwiX1BhcnNlQVNULmV4cGVjdFRlbXBsYXRlQmluZGluZ0tleSIsIl9QYXJzZUFTVC5wYXJzZVRlbXBsYXRlQmluZGluZ3MiLCJfUGFyc2VBU1QuZXJyb3IiLCJTaW1wbGVFeHByZXNzaW9uQ2hlY2tlciIsIlNpbXBsZUV4cHJlc3Npb25DaGVja2VyLmNvbnN0cnVjdG9yIiwiU2ltcGxlRXhwcmVzc2lvbkNoZWNrZXIuY2hlY2siLCJTaW1wbGVFeHByZXNzaW9uQ2hlY2tlci52aXNpdEltcGxpY2l0UmVjZWl2ZXIiLCJTaW1wbGVFeHByZXNzaW9uQ2hlY2tlci52aXNpdEludGVycG9sYXRpb24iLCJTaW1wbGVFeHByZXNzaW9uQ2hlY2tlci52aXNpdExpdGVyYWxQcmltaXRpdmUiLCJTaW1wbGVFeHByZXNzaW9uQ2hlY2tlci52aXNpdFByb3BlcnR5UmVhZCIsIlNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnZpc2l0UHJvcGVydHlXcml0ZSIsIlNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnZpc2l0U2FmZVByb3BlcnR5UmVhZCIsIlNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnZpc2l0TWV0aG9kQ2FsbCIsIlNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnZpc2l0U2FmZU1ldGhvZENhbGwiLCJTaW1wbGVFeHByZXNzaW9uQ2hlY2tlci52aXNpdEZ1bmN0aW9uQ2FsbCIsIlNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnZpc2l0TGl0ZXJhbEFycmF5IiwiU2ltcGxlRXhwcmVzc2lvbkNoZWNrZXIudmlzaXRMaXRlcmFsTWFwIiwiU2ltcGxlRXhwcmVzc2lvbkNoZWNrZXIudmlzaXRCaW5hcnkiLCJTaW1wbGVFeHByZXNzaW9uQ2hlY2tlci52aXNpdFByZWZpeE5vdCIsIlNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnZpc2l0Q29uZGl0aW9uYWwiLCJTaW1wbGVFeHByZXNzaW9uQ2hlY2tlci52aXNpdFBpcGUiLCJTaW1wbGVFeHByZXNzaW9uQ2hlY2tlci52aXNpdEtleWVkUmVhZCIsIlNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnZpc2l0S2V5ZWRXcml0ZSIsIlNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnZpc2l0QWxsIiwiU2ltcGxlRXhwcmVzc2lvbkNoZWNrZXIudmlzaXRDaGFpbiIsIlNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnZpc2l0UXVvdGUiLCJMb2NhbHMiLCJMb2NhbHMuY29uc3RydWN0b3IiLCJMb2NhbHMuY29udGFpbnMiLCJMb2NhbHMuZ2V0IiwiTG9jYWxzLnNldCIsIkxvY2Fscy5jbGVhclZhbHVlcyIsIkV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkRXhjZXB0aW9uIiwiRXhwcmVzc2lvbkNoYW5nZWRBZnRlckl0SGFzQmVlbkNoZWNrZWRFeGNlcHRpb24uY29uc3RydWN0b3IiLCJDaGFuZ2VEZXRlY3Rpb25FcnJvciIsIkNoYW5nZURldGVjdGlvbkVycm9yLmNvbnN0cnVjdG9yIiwiRGVoeWRyYXRlZEV4Y2VwdGlvbiIsIkRlaHlkcmF0ZWRFeGNlcHRpb24uY29uc3RydWN0b3IiLCJEZWJ1Z0NvbnRleHQiLCJEZWJ1Z0NvbnRleHQuY29uc3RydWN0b3IiLCJDaGFuZ2VEZXRlY3RvckdlbkNvbmZpZyIsIkNoYW5nZURldGVjdG9yR2VuQ29uZmlnLmNvbnN0cnVjdG9yIiwiQ2hhbmdlRGV0ZWN0b3JEZWZpbml0aW9uIiwiQ2hhbmdlRGV0ZWN0b3JEZWZpbml0aW9uLmNvbnN0cnVjdG9yIiwiQ2hhbmdlRGV0ZWN0b3JTdGF0ZSIsIkNoYW5nZURldGVjdGlvblN0cmF0ZWd5IiwiaXNEZWZhdWx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kiLCJEeW5hbWljUHJvdG9DaGFuZ2VEZXRlY3RvciIsIkR5bmFtaWNQcm90b0NoYW5nZURldGVjdG9yLmNvbnN0cnVjdG9yIiwiRHluYW1pY1Byb3RvQ2hhbmdlRGV0ZWN0b3IuaW5zdGFudGlhdGUiLCJjcmVhdGVQcm9wZXJ0eVJlY29yZHMiLCJjcmVhdGVFdmVudFJlY29yZHMiLCJQcm90b1JlY29yZEJ1aWxkZXIiLCJQcm90b1JlY29yZEJ1aWxkZXIuY29uc3RydWN0b3IiLCJQcm90b1JlY29yZEJ1aWxkZXIuYWRkIiwiUHJvdG9SZWNvcmRCdWlsZGVyLl9zZXRBcmd1bWVudFRvUHVyZUZ1bmN0aW9uIiwiUHJvdG9SZWNvcmRCdWlsZGVyLl9hcHBlbmRSZWNvcmRzIiwiX0NvbnZlcnRBc3RJbnRvUHJvdG9SZWNvcmRzIiwiX0NvbnZlcnRBc3RJbnRvUHJvdG9SZWNvcmRzLmNvbnN0cnVjdG9yIiwiX0NvbnZlcnRBc3RJbnRvUHJvdG9SZWNvcmRzLmFwcGVuZCIsIl9Db252ZXJ0QXN0SW50b1Byb3RvUmVjb3Jkcy5jcmVhdGUiLCJfQ29udmVydEFzdEludG9Qcm90b1JlY29yZHMudmlzaXRJbXBsaWNpdFJlY2VpdmVyIiwiX0NvbnZlcnRBc3RJbnRvUHJvdG9SZWNvcmRzLnZpc2l0SW50ZXJwb2xhdGlvbiIsIl9Db252ZXJ0QXN0SW50b1Byb3RvUmVjb3Jkcy52aXNpdExpdGVyYWxQcmltaXRpdmUiLCJfQ29udmVydEFzdEludG9Qcm90b1JlY29yZHMudmlzaXRQcm9wZXJ0eVJlYWQiLCJfQ29udmVydEFzdEludG9Qcm90b1JlY29yZHMudmlzaXRQcm9wZXJ0eVdyaXRlIiwiX0NvbnZlcnRBc3RJbnRvUHJvdG9SZWNvcmRzLnZpc2l0S2V5ZWRXcml0ZSIsIl9Db252ZXJ0QXN0SW50b1Byb3RvUmVjb3Jkcy52aXNpdFNhZmVQcm9wZXJ0eVJlYWQiLCJfQ29udmVydEFzdEludG9Qcm90b1JlY29yZHMudmlzaXRNZXRob2RDYWxsIiwiX0NvbnZlcnRBc3RJbnRvUHJvdG9SZWNvcmRzLnZpc2l0U2FmZU1ldGhvZENhbGwiLCJfQ29udmVydEFzdEludG9Qcm90b1JlY29yZHMudmlzaXRGdW5jdGlvbkNhbGwiLCJfQ29udmVydEFzdEludG9Qcm90b1JlY29yZHMudmlzaXRMaXRlcmFsQXJyYXkiLCJfQ29udmVydEFzdEludG9Qcm90b1JlY29yZHMudmlzaXRMaXRlcmFsTWFwIiwiX0NvbnZlcnRBc3RJbnRvUHJvdG9SZWNvcmRzLnZpc2l0QmluYXJ5IiwiX0NvbnZlcnRBc3RJbnRvUHJvdG9SZWNvcmRzLnZpc2l0UHJlZml4Tm90IiwiX0NvbnZlcnRBc3RJbnRvUHJvdG9SZWNvcmRzLnZpc2l0Q29uZGl0aW9uYWwiLCJfQ29udmVydEFzdEludG9Qcm90b1JlY29yZHMudmlzaXRQaXBlIiwiX0NvbnZlcnRBc3RJbnRvUHJvdG9SZWNvcmRzLnZpc2l0S2V5ZWRSZWFkIiwiX0NvbnZlcnRBc3RJbnRvUHJvdG9SZWNvcmRzLnZpc2l0Q2hhaW4iLCJfQ29udmVydEFzdEludG9Qcm90b1JlY29yZHMudmlzaXRRdW90ZSIsIl9Db252ZXJ0QXN0SW50b1Byb3RvUmVjb3Jkcy5fdmlzaXRBbGwiLCJfQ29udmVydEFzdEludG9Qcm90b1JlY29yZHMuX2FkZFJlY29yZCIsIl9hcnJheUZuIiwiX21hcFByaW1pdGl2ZU5hbWUiLCJfb3BlcmF0aW9uVG9QcmltaXRpdmVOYW1lIiwiX29wZXJhdGlvblRvRnVuY3Rpb24iLCJzIiwiX2ludGVycG9sYXRpb25GbiIsIldyYXBwZWRWYWx1ZSIsIldyYXBwZWRWYWx1ZS5jb25zdHJ1Y3RvciIsIldyYXBwZWRWYWx1ZS53cmFwIiwiU2ltcGxlQ2hhbmdlIiwiU2ltcGxlQ2hhbmdlLmNvbnN0cnVjdG9yIiwiU2ltcGxlQ2hhbmdlLmlzRmlyc3RDaGFuZ2UiLCJfc2ltcGxlQ2hhbmdlIiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbCIsIkNoYW5nZURldGVjdGlvblV0aWwuY29uc3RydWN0b3IiLCJDaGFuZ2VEZXRlY3Rpb25VdGlsLmFycmF5Rm4wIiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbC5hcnJheUZuMSIsIkNoYW5nZURldGVjdGlvblV0aWwuYXJyYXlGbjIiLCJDaGFuZ2VEZXRlY3Rpb25VdGlsLmFycmF5Rm4zIiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbC5hcnJheUZuNCIsIkNoYW5nZURldGVjdGlvblV0aWwuYXJyYXlGbjUiLCJDaGFuZ2VEZXRlY3Rpb25VdGlsLmFycmF5Rm42IiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbC5hcnJheUZuNyIsIkNoYW5nZURldGVjdGlvblV0aWwuYXJyYXlGbjgiLCJDaGFuZ2VEZXRlY3Rpb25VdGlsLmFycmF5Rm45IiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbC5vcGVyYXRpb25fbmVnYXRlIiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbC5vcGVyYXRpb25fYWRkIiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbC5vcGVyYXRpb25fc3VidHJhY3QiLCJDaGFuZ2VEZXRlY3Rpb25VdGlsLm9wZXJhdGlvbl9tdWx0aXBseSIsIkNoYW5nZURldGVjdGlvblV0aWwub3BlcmF0aW9uX2RpdmlkZSIsIkNoYW5nZURldGVjdGlvblV0aWwub3BlcmF0aW9uX3JlbWFpbmRlciIsIkNoYW5nZURldGVjdGlvblV0aWwub3BlcmF0aW9uX2VxdWFscyIsIkNoYW5nZURldGVjdGlvblV0aWwub3BlcmF0aW9uX25vdF9lcXVhbHMiLCJDaGFuZ2VEZXRlY3Rpb25VdGlsLm9wZXJhdGlvbl9pZGVudGljYWwiLCJDaGFuZ2VEZXRlY3Rpb25VdGlsLm9wZXJhdGlvbl9ub3RfaWRlbnRpY2FsIiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbC5vcGVyYXRpb25fbGVzc190aGVuIiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbC5vcGVyYXRpb25fZ3JlYXRlcl90aGVuIiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbC5vcGVyYXRpb25fbGVzc19vcl9lcXVhbHNfdGhlbiIsIkNoYW5nZURldGVjdGlvblV0aWwub3BlcmF0aW9uX2dyZWF0ZXJfb3JfZXF1YWxzX3RoZW4iLCJDaGFuZ2VEZXRlY3Rpb25VdGlsLmNvbmQiLCJDaGFuZ2VEZXRlY3Rpb25VdGlsLm1hcEZuIiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbC5tYXBGbi5idWlsZE1hcCIsIkNoYW5nZURldGVjdGlvblV0aWwua2V5ZWRBY2Nlc3MiLCJDaGFuZ2VEZXRlY3Rpb25VdGlsLnVud3JhcFZhbHVlIiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbC5jaGFuZ2VEZXRlY3Rpb25Nb2RlIiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbC5zaW1wbGVDaGFuZ2UiLCJDaGFuZ2VEZXRlY3Rpb25VdGlsLmlzVmFsdWVCbGFuayIsIkNoYW5nZURldGVjdGlvblV0aWwucyIsIkNoYW5nZURldGVjdGlvblV0aWwucHJvdG9CeUluZGV4IiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbC5jYWxsUGlwZU9uRGVzdHJveSIsIkNoYW5nZURldGVjdGlvblV0aWwuYmluZGluZ1RhcmdldCIsIkNoYW5nZURldGVjdGlvblV0aWwuZGlyZWN0aXZlSW5kZXgiLCJDaGFuZ2VEZXRlY3Rpb25VdGlsLmxvb3NlTm90SWRlbnRpY2FsIiwiaW1wbGVtZW50c09uRGVzdHJveSIsIkJpbmRpbmdUYXJnZXQiLCJCaW5kaW5nVGFyZ2V0LmNvbnN0cnVjdG9yIiwiQmluZGluZ1RhcmdldC5pc0RpcmVjdGl2ZSIsIkJpbmRpbmdUYXJnZXQuaXNFbGVtZW50UHJvcGVydHkiLCJCaW5kaW5nVGFyZ2V0LmlzRWxlbWVudEF0dHJpYnV0ZSIsIkJpbmRpbmdUYXJnZXQuaXNFbGVtZW50Q2xhc3MiLCJCaW5kaW5nVGFyZ2V0LmlzRWxlbWVudFN0eWxlIiwiQmluZGluZ1RhcmdldC5pc1RleHROb2RlIiwiQmluZGluZ1JlY29yZCIsIkJpbmRpbmdSZWNvcmQuY29uc3RydWN0b3IiLCJCaW5kaW5nUmVjb3JkLmlzRGlyZWN0aXZlTGlmZWN5Y2xlIiwiQmluZGluZ1JlY29yZC5jYWxsT25DaGFuZ2VzIiwiQmluZGluZ1JlY29yZC5pc0RlZmF1bHRDaGFuZ2VEZXRlY3Rpb24iLCJCaW5kaW5nUmVjb3JkLmNyZWF0ZURpcmVjdGl2ZURvQ2hlY2siLCJCaW5kaW5nUmVjb3JkLmNyZWF0ZURpcmVjdGl2ZU9uSW5pdCIsIkJpbmRpbmdSZWNvcmQuY3JlYXRlRGlyZWN0aXZlT25DaGFuZ2VzIiwiQmluZGluZ1JlY29yZC5jcmVhdGVGb3JEaXJlY3RpdmUiLCJCaW5kaW5nUmVjb3JkLmNyZWF0ZUZvckVsZW1lbnRQcm9wZXJ0eSIsIkJpbmRpbmdSZWNvcmQuY3JlYXRlRm9yRWxlbWVudEF0dHJpYnV0ZSIsIkJpbmRpbmdSZWNvcmQuY3JlYXRlRm9yRWxlbWVudENsYXNzIiwiQmluZGluZ1JlY29yZC5jcmVhdGVGb3JFbGVtZW50U3R5bGUiLCJCaW5kaW5nUmVjb3JkLmNyZWF0ZUZvckhvc3RQcm9wZXJ0eSIsIkJpbmRpbmdSZWNvcmQuY3JlYXRlRm9ySG9zdEF0dHJpYnV0ZSIsIkJpbmRpbmdSZWNvcmQuY3JlYXRlRm9ySG9zdENsYXNzIiwiQmluZGluZ1JlY29yZC5jcmVhdGVGb3JIb3N0U3R5bGUiLCJCaW5kaW5nUmVjb3JkLmNyZWF0ZUZvclRleHROb2RlIiwiQmluZGluZ1JlY29yZC5jcmVhdGVGb3JFdmVudCIsIkJpbmRpbmdSZWNvcmQuY3JlYXRlRm9ySG9zdEV2ZW50IiwiRGlyZWN0aXZlSW5kZXgiLCJEaXJlY3RpdmVJbmRleC5jb25zdHJ1Y3RvciIsIkRpcmVjdGl2ZUluZGV4Lm5hbWUiLCJEaXJlY3RpdmVSZWNvcmQiLCJEaXJlY3RpdmVSZWNvcmQuY29uc3RydWN0b3IiLCJEaXJlY3RpdmVSZWNvcmQuaXNEZWZhdWx0Q2hhbmdlRGV0ZWN0aW9uIiwiRHluYW1pY0NoYW5nZURldGVjdG9yIiwiRHluYW1pY0NoYW5nZURldGVjdG9yLmNvbnN0cnVjdG9yIiwiRHluYW1pY0NoYW5nZURldGVjdG9yLmhhbmRsZUV2ZW50SW50ZXJuYWwiLCJEeW5hbWljQ2hhbmdlRGV0ZWN0b3IuX3Byb2Nlc3NFdmVudEJpbmRpbmciLCJEeW5hbWljQ2hhbmdlRGV0ZWN0b3IuX2NvbXB1dGVTa2lwTGVuZ3RoIiwiRHluYW1pY0NoYW5nZURldGVjdG9yLl9tYXJrUGF0aEFzQ2hlY2tPbmNlIiwiRHluYW1pY0NoYW5nZURldGVjdG9yLl9tYXRjaGluZ0V2ZW50QmluZGluZ3MiLCJEeW5hbWljQ2hhbmdlRGV0ZWN0b3IuaHlkcmF0ZURpcmVjdGl2ZXMiLCJEeW5hbWljQ2hhbmdlRGV0ZWN0b3IuZGVoeWRyYXRlRGlyZWN0aXZlcyIsIkR5bmFtaWNDaGFuZ2VEZXRlY3Rvci5fZGVzdHJveVBpcGVzIiwiRHluYW1pY0NoYW5nZURldGVjdG9yLmNoZWNrTm9DaGFuZ2VzIiwiRHluYW1pY0NoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXNJblJlY29yZHNJbnRlcm5hbCIsIkR5bmFtaWNDaGFuZ2VEZXRlY3Rvci5fZmlyc3RJbkJpbmRpbmciLCJEeW5hbWljQ2hhbmdlRGV0ZWN0b3IuYWZ0ZXJDb250ZW50TGlmZWN5Y2xlQ2FsbGJhY2tzSW50ZXJuYWwiLCJEeW5hbWljQ2hhbmdlRGV0ZWN0b3IuYWZ0ZXJWaWV3TGlmZWN5Y2xlQ2FsbGJhY2tzSW50ZXJuYWwiLCJEeW5hbWljQ2hhbmdlRGV0ZWN0b3IuX3VwZGF0ZURpcmVjdGl2ZU9yRWxlbWVudCIsIkR5bmFtaWNDaGFuZ2VEZXRlY3Rvci5fYWRkQ2hhbmdlIiwiRHluYW1pY0NoYW5nZURldGVjdG9yLl9nZXREaXJlY3RpdmVGb3IiLCJEeW5hbWljQ2hhbmdlRGV0ZWN0b3IuX2dldERldGVjdG9yRm9yIiwiRHluYW1pY0NoYW5nZURldGVjdG9yLl9jaGVjayIsIkR5bmFtaWNDaGFuZ2VEZXRlY3Rvci5fcmVmZXJlbmNlQ2hlY2siLCJEeW5hbWljQ2hhbmdlRGV0ZWN0b3IuX2NhbGN1bGF0ZUN1cnJWYWx1ZSIsIkR5bmFtaWNDaGFuZ2VEZXRlY3Rvci5fcGlwZUNoZWNrIiwiRHluYW1pY0NoYW5nZURldGVjdG9yLl9waXBlRm9yIiwiRHluYW1pY0NoYW5nZURldGVjdG9yLl9yZWFkQ29udGV4dCIsIkR5bmFtaWNDaGFuZ2VEZXRlY3Rvci5fcmVhZFNlbGYiLCJEeW5hbWljQ2hhbmdlRGV0ZWN0b3IuX3dyaXRlU2VsZiIsIkR5bmFtaWNDaGFuZ2VEZXRlY3Rvci5fcmVhZFBpcGUiLCJEeW5hbWljQ2hhbmdlRGV0ZWN0b3IuX3dyaXRlUGlwZSIsIkR5bmFtaWNDaGFuZ2VEZXRlY3Rvci5fc2V0Q2hhbmdlZCIsIkR5bmFtaWNDaGFuZ2VEZXRlY3Rvci5fcHVyZUZ1bmNBbmRBcmdzRGlkTm90Q2hhbmdlIiwiRHluYW1pY0NoYW5nZURldGVjdG9yLl9hcmdzQ2hhbmdlZCIsIkR5bmFtaWNDaGFuZ2VEZXRlY3Rvci5fYXJnc09yQ29udGV4dENoYW5nZWQiLCJEeW5hbWljQ2hhbmdlRGV0ZWN0b3IuX3JlYWRBcmdzIiwiX0NvbnRleHQiLCJfQ29udGV4dC5jb25zdHJ1Y3RvciIsIkFic3RyYWN0Q2hhbmdlRGV0ZWN0b3IiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLmNvbnN0cnVjdG9yIiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5hZGRDb250ZW50Q2hpbGQiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLnJlbW92ZUNvbnRlbnRDaGlsZCIsIkFic3RyYWN0Q2hhbmdlRGV0ZWN0b3IuYWRkVmlld0NoaWxkIiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5yZW1vdmVWaWV3Q2hpbGQiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLnJlbW92ZSIsIkFic3RyYWN0Q2hhbmdlRGV0ZWN0b3IuaGFuZGxlRXZlbnQiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLmhhbmRsZUV2ZW50SW50ZXJuYWwiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLmNoZWNrTm9DaGFuZ2VzIiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5ydW5EZXRlY3RDaGFuZ2VzIiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzSW5SZWNvcmRzIiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzSW5SZWNvcmRzSW50ZXJuYWwiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLmh5ZHJhdGUiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLmh5ZHJhdGVEaXJlY3RpdmVzIiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5kZWh5ZHJhdGUiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLmRlaHlkcmF0ZURpcmVjdGl2ZXMiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLmh5ZHJhdGVkIiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5hZnRlckNvbnRlbnRMaWZlY3ljbGVDYWxsYmFja3MiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLmFmdGVyQ29udGVudExpZmVjeWNsZUNhbGxiYWNrc0ludGVybmFsIiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5hZnRlclZpZXdMaWZlY3ljbGVDYWxsYmFja3MiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLmFmdGVyVmlld0xpZmVjeWNsZUNhbGxiYWNrc0ludGVybmFsIiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5fZGV0ZWN0Q2hhbmdlc0NvbnRlbnRDaGlsZHJlbiIsIkFic3RyYWN0Q2hhbmdlRGV0ZWN0b3IuX2RldGVjdENoYW5nZXNJblZpZXdDaGlsZHJlbiIsIkFic3RyYWN0Q2hhbmdlRGV0ZWN0b3IubWFya0FzQ2hlY2tPbmNlIiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5tYXJrUGF0aFRvUm9vdEFzQ2hlY2tPbmNlIiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5fdW5zdWJzcmliZUZyb21PYnNlcnZhYmxlcyIsIkFic3RyYWN0Q2hhbmdlRGV0ZWN0b3Iub2JzZXJ2ZVZhbHVlIiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5vYnNlcnZlRGlyZWN0aXZlIiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5vYnNlcnZlQ29tcG9uZW50IiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5fY3JlYXRlQXJyYXlUb1N0b3JlT2JzZXJ2YWJsZXMiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLmdldERpcmVjdGl2ZUZvciIsIkFic3RyYWN0Q2hhbmdlRGV0ZWN0b3IuZ2V0RGV0ZWN0b3JGb3IiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLm5vdGlmeURpc3BhdGNoZXIiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLmxvZ0JpbmRpbmdVcGRhdGUiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLmFkZENoYW5nZSIsIkFic3RyYWN0Q2hhbmdlRGV0ZWN0b3IuX3Rocm93RXJyb3IiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLnRocm93T25DaGFuZ2VFcnJvciIsIkFic3RyYWN0Q2hhbmdlRGV0ZWN0b3IudGhyb3dEZWh5ZHJhdGVkRXJyb3IiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLl9jdXJyZW50QmluZGluZyIsIkNoYW5nZURldGVjdG9yUmVmIiwiQ2hhbmdlRGV0ZWN0b3JSZWYuY29uc3RydWN0b3IiLCJDaGFuZ2VEZXRlY3RvclJlZl8iLCJDaGFuZ2VEZXRlY3RvclJlZl8uY29uc3RydWN0b3IiLCJDaGFuZ2VEZXRlY3RvclJlZl8ubWFya0ZvckNoZWNrIiwiQ2hhbmdlRGV0ZWN0b3JSZWZfLmRldGFjaCIsIkNoYW5nZURldGVjdG9yUmVmXy5kZXRlY3RDaGFuZ2VzIiwiQ2hhbmdlRGV0ZWN0b3JSZWZfLmNoZWNrTm9DaGFuZ2VzIiwiQ2hhbmdlRGV0ZWN0b3JSZWZfLnJlYXR0YWNoIiwibm9vcFNjb3BlIiwiZGV0ZWN0V1RGIiwiY3JlYXRlU2NvcGUiLCJsZWF2ZSIsInN0YXJ0VGltZVJhbmdlIiwiZW5kVGltZVJhbmdlIiwiaXNPYnNlcnZhYmxlIiwiUmVjb3JkVHlwZSIsIlByb3RvUmVjb3JkIiwiUHJvdG9SZWNvcmQuY29uc3RydWN0b3IiLCJQcm90b1JlY29yZC5pc1B1cmVGdW5jdGlvbiIsIlByb3RvUmVjb3JkLmlzVXNlZEJ5T3RoZXJSZWNvcmQiLCJQcm90b1JlY29yZC5zaG91bGRCZUNoZWNrZWQiLCJQcm90b1JlY29yZC5pc1BpcGVSZWNvcmQiLCJQcm90b1JlY29yZC5pc0NvbmRpdGlvbmFsU2tpcFJlY29yZCIsIlByb3RvUmVjb3JkLmlzVW5jb25kaXRpb25hbFNraXBSZWNvcmQiLCJQcm90b1JlY29yZC5pc1NraXBSZWNvcmQiLCJQcm90b1JlY29yZC5pc0xpZmVDeWNsZVJlY29yZCIsIkV2ZW50QmluZGluZyIsIkV2ZW50QmluZGluZy5jb25zdHJ1Y3RvciIsImNvYWxlc2NlIiwiX29wdGltaXplU2tpcHMiLCJfbWF5QmVBZGRSZWNvcmQiLCJfZmluZEZpcnN0TWF0Y2giLCJfY2xvbmVBbmRVcGRhdGVJbmRleGVzIiwiX3NyY1RvRHN0U2VsZkluZGV4IiwiX2NyZWF0ZVNlbGZSZWNvcmQiLCJfaGF2ZVNhbWVEaXJJbmRleCIsIkppdFByb3RvQ2hhbmdlRGV0ZWN0b3IiLCJKaXRQcm90b0NoYW5nZURldGVjdG9yLmNvbnN0cnVjdG9yIiwiSml0UHJvdG9DaGFuZ2VEZXRlY3Rvci5pc1N1cHBvcnRlZCIsIkppdFByb3RvQ2hhbmdlRGV0ZWN0b3IuaW5zdGFudGlhdGUiLCJKaXRQcm90b0NoYW5nZURldGVjdG9yLl9jcmVhdGVGYWN0b3J5IiwiQ2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3IiLCJDaGFuZ2VEZXRlY3RvckpJVEdlbmVyYXRvci5jb25zdHJ1Y3RvciIsIkNoYW5nZURldGVjdG9ySklUR2VuZXJhdG9yLmdlbmVyYXRlIiwiQ2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3IuZ2VuZXJhdGVTb3VyY2UiLCJDaGFuZ2VEZXRlY3RvckpJVEdlbmVyYXRvci5fZ2VuUHJvcGVydHlCaW5kaW5nVGFyZ2V0cyIsIkNoYW5nZURldGVjdG9ySklUR2VuZXJhdG9yLl9nZW5EaXJlY3RpdmVJbmRpY2VzIiwiQ2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3IuX21heWJlR2VuSGFuZGxlRXZlbnRJbnRlcm5hbCIsIkNoYW5nZURldGVjdG9ySklUR2VuZXJhdG9yLl9nZW5FdmVudEJpbmRpbmciLCJDaGFuZ2VEZXRlY3RvckpJVEdlbmVyYXRvci5fZ2VuRXZlbnRCaW5kaW5nRXZhbCIsIkNoYW5nZURldGVjdG9ySklUR2VuZXJhdG9yLl9nZW5NYXJrUGF0aFRvUm9vdEFzQ2hlY2tPbmNlIiwiQ2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3IuX2dlblVwZGF0ZVByZXZlbnREZWZhdWx0IiwiQ2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3IuX21heWJlR2VuRGVoeWRyYXRlRGlyZWN0aXZlcyIsIkNoYW5nZURldGVjdG9ySklUR2VuZXJhdG9yLl9tYXliZUdlbkh5ZHJhdGVEaXJlY3RpdmVzIiwiQ2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3IuX21heWJlR2VuQWZ0ZXJDb250ZW50TGlmZWN5Y2xlQ2FsbGJhY2tzIiwiQ2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3IuX21heWJlR2VuQWZ0ZXJWaWV3TGlmZWN5Y2xlQ2FsbGJhY2tzIiwiQ2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3IuX2dlbkFsbFJlY29yZHMiLCJDaGFuZ2VEZXRlY3RvckpJVEdlbmVyYXRvci5fZ2VuQ29uZGl0aW9uYWxTa2lwIiwiQ2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3IuX2dlblVuY29uZGl0aW9uYWxTa2lwIiwiQ2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3IuX2dlbkVuZE9mU2tpcEJsb2NrIiwiQ2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3IuX2dlbkRpcmVjdGl2ZUxpZmVjeWNsZSIsIkNoYW5nZURldGVjdG9ySklUR2VuZXJhdG9yLl9nZW5QaXBlQ2hlY2siLCJDaGFuZ2VEZXRlY3RvckpJVEdlbmVyYXRvci5fZ2VuUmVmZXJlbmNlQ2hlY2siLCJDaGFuZ2VEZXRlY3RvckpJVEdlbmVyYXRvci5fZ2VuQ2hhbmdlTWFya2VyIiwiQ2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3IuX2dlblVwZGF0ZURpcmVjdGl2ZU9yRWxlbWVudCIsIkNoYW5nZURldGVjdG9ySklUR2VuZXJhdG9yLl9nZW5UaHJvd09uQ2hhbmdlQ2hlY2siLCJDaGFuZ2VEZXRlY3RvckpJVEdlbmVyYXRvci5fZ2VuQWRkVG9DaGFuZ2VzIiwiQ2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3IuX21heWJlRmlyc3RJbkJpbmRpbmciLCJDaGFuZ2VEZXRlY3RvckpJVEdlbmVyYXRvci5fbWF5YmVHZW5MYXN0SW5EaXJlY3RpdmUiLCJDaGFuZ2VEZXRlY3RvckpJVEdlbmVyYXRvci5fZ2VuT25DaGVjayIsIkNoYW5nZURldGVjdG9ySklUR2VuZXJhdG9yLl9nZW5PbkluaXQiLCJDaGFuZ2VEZXRlY3RvckpJVEdlbmVyYXRvci5fZ2VuT25DaGFuZ2UiLCJDaGFuZ2VEZXRlY3RvckpJVEdlbmVyYXRvci5fZ2VuTm90aWZ5T25QdXNoRGV0ZWN0b3JzIiwic2FuaXRpemVOYW1lIiwiQ29kZWdlbk5hbWVVdGlsIiwiQ29kZWdlbk5hbWVVdGlsLmNvbnN0cnVjdG9yIiwiQ29kZWdlbk5hbWVVdGlsLl9hZGRGaWVsZFByZWZpeCIsIkNvZGVnZW5OYW1lVXRpbC5nZXREaXNwYXRjaGVyTmFtZSIsIkNvZGVnZW5OYW1lVXRpbC5nZXRQaXBlc0FjY2Vzc29yTmFtZSIsIkNvZGVnZW5OYW1lVXRpbC5nZXRQcm90b3NOYW1lIiwiQ29kZWdlbk5hbWVVdGlsLmdldERpcmVjdGl2ZXNBY2Nlc3Nvck5hbWUiLCJDb2RlZ2VuTmFtZVV0aWwuZ2V0TG9jYWxzQWNjZXNzb3JOYW1lIiwiQ29kZWdlbk5hbWVVdGlsLmdldFN0YXRlTmFtZSIsIkNvZGVnZW5OYW1lVXRpbC5nZXRNb2RlTmFtZSIsIkNvZGVnZW5OYW1lVXRpbC5nZXRQcm9wZXJ0eUJpbmRpbmdJbmRleCIsIkNvZGVnZW5OYW1lVXRpbC5nZXRMb2NhbE5hbWUiLCJDb2RlZ2VuTmFtZVV0aWwuZ2V0RXZlbnRMb2NhbE5hbWUiLCJDb2RlZ2VuTmFtZVV0aWwuZ2V0Q2hhbmdlTmFtZSIsIkNvZGVnZW5OYW1lVXRpbC5nZW5Jbml0TG9jYWxzIiwiQ29kZWdlbk5hbWVVdGlsLmdlbkluaXRFdmVudExvY2FscyIsIkNvZGVnZW5OYW1lVXRpbC5nZXRQcmV2ZW50RGVmYXVsdEFjY2Vzb3IiLCJDb2RlZ2VuTmFtZVV0aWwuZ2V0RmllbGRDb3VudCIsIkNvZGVnZW5OYW1lVXRpbC5nZXRGaWVsZE5hbWUiLCJDb2RlZ2VuTmFtZVV0aWwuZ2V0QWxsRmllbGROYW1lcyIsIkNvZGVnZW5OYW1lVXRpbC5nZW5EZWh5ZHJhdGVGaWVsZHMiLCJDb2RlZ2VuTmFtZVV0aWwuZ2VuUGlwZU9uRGVzdHJveSIsIkNvZGVnZW5OYW1lVXRpbC5nZXRQaXBlTmFtZSIsIkNvZGVnZW5OYW1lVXRpbC5nZXREaXJlY3RpdmVOYW1lIiwiQ29kZWdlbk5hbWVVdGlsLmdldERldGVjdG9yTmFtZSIsIkNvZGVnZW5Mb2dpY1V0aWwiLCJDb2RlZ2VuTG9naWNVdGlsLmNvbnN0cnVjdG9yIiwiQ29kZWdlbkxvZ2ljVXRpbC5nZW5Qcm9wZXJ0eUJpbmRpbmdFdmFsVmFsdWUiLCJDb2RlZ2VuTG9naWNVdGlsLmdlbkV2ZW50QmluZGluZ0V2YWxWYWx1ZSIsIkNvZGVnZW5Mb2dpY1V0aWwuX2dlbkV2YWxWYWx1ZSIsIkNvZGVnZW5Mb2dpY1V0aWwuX29ic2VydmUiLCJDb2RlZ2VuTG9naWNVdGlsLmdlblByb3BlcnR5QmluZGluZ1RhcmdldHMiLCJDb2RlZ2VuTG9naWNVdGlsLmdlbkRpcmVjdGl2ZUluZGljZXMiLCJDb2RlZ2VuTG9naWNVdGlsLl9nZW5JbnRlcnBvbGF0aW9uIiwiQ29kZWdlbkxvZ2ljVXRpbC5nZW5IeWRyYXRlRGlyZWN0aXZlcyIsIkNvZGVnZW5Mb2dpY1V0aWwuX2dlblJlYWREaXJlY3RpdmUiLCJDb2RlZ2VuTG9naWNVdGlsLmdlbkh5ZHJhdGVEZXRlY3RvcnMiLCJDb2RlZ2VuTG9naWNVdGlsLmdlbkNvbnRlbnRMaWZlY3ljbGVDYWxsYmFja3MiLCJDb2RlZ2VuTG9naWNVdGlsLmdlblZpZXdMaWZlY3ljbGVDYWxsYmFja3MiLCJjb2RpZnkiLCJyYXdTdHJpbmciLCJjb21iaW5lR2VuZXJhdGVkU3RyaW5ncyIsIlZpZXdFbmNhcHN1bGF0aW9uIiwiVmlld01ldGFkYXRhIiwiVmlld01ldGFkYXRhLmNvbnN0cnVjdG9yIiwiVGltZXJXcmFwcGVyIiwiVGltZXJXcmFwcGVyLmNvbnN0cnVjdG9yIiwiVGltZXJXcmFwcGVyLnNldFRpbWVvdXQiLCJUaW1lcldyYXBwZXIuY2xlYXJUaW1lb3V0IiwiVGltZXJXcmFwcGVyLnNldEludGVydmFsIiwiVGltZXJXcmFwcGVyLmNsZWFySW50ZXJ2YWwiLCJPYnNlcnZhYmxlV3JhcHBlciIsIk9ic2VydmFibGVXcmFwcGVyLmNvbnN0cnVjdG9yIiwiT2JzZXJ2YWJsZVdyYXBwZXIuc3Vic2NyaWJlIiwiT2JzZXJ2YWJsZVdyYXBwZXIuaXNPYnNlcnZhYmxlIiwiT2JzZXJ2YWJsZVdyYXBwZXIuaGFzU3Vic2NyaWJlcnMiLCJPYnNlcnZhYmxlV3JhcHBlci5kaXNwb3NlIiwiT2JzZXJ2YWJsZVdyYXBwZXIuY2FsbE5leHQiLCJPYnNlcnZhYmxlV3JhcHBlci5jYWxsRW1pdCIsIk9ic2VydmFibGVXcmFwcGVyLmNhbGxFcnJvciIsIk9ic2VydmFibGVXcmFwcGVyLmNhbGxDb21wbGV0ZSIsIk9ic2VydmFibGVXcmFwcGVyLmZyb21Qcm9taXNlIiwiT2JzZXJ2YWJsZVdyYXBwZXIudG9Qcm9taXNlIiwiRXZlbnRFbWl0dGVyIiwiRXZlbnRFbWl0dGVyLmNvbnN0cnVjdG9yIiwiRXZlbnRFbWl0dGVyLmVtaXQiLCJFdmVudEVtaXR0ZXIubmV4dCIsIkV2ZW50RW1pdHRlci5zdWJzY3JpYmUiLCJQcm9taXNlV3JhcHBlciIsIlByb21pc2VXcmFwcGVyLmNvbnN0cnVjdG9yIiwiUHJvbWlzZVdyYXBwZXIucmVzb2x2ZSIsIlByb21pc2VXcmFwcGVyLnJlamVjdCIsIlByb21pc2VXcmFwcGVyLmNhdGNoRXJyb3IiLCJQcm9taXNlV3JhcHBlci5hbGwiLCJQcm9taXNlV3JhcHBlci50aGVuIiwiUHJvbWlzZVdyYXBwZXIud3JhcCIsIlByb21pc2VXcmFwcGVyLnNjaGVkdWxlTWljcm90YXNrIiwiUHJvbWlzZVdyYXBwZXIuaXNQcm9taXNlIiwiUHJvbWlzZVdyYXBwZXIuY29tcGxldGVyIiwiX2NvbXBvbmVudFByb3ZpZGVycyIsImNyZWF0ZU5nWm9uZSIsInBsYXRmb3JtIiwiZGlzcG9zZVBsYXRmb3JtIiwiX2NyZWF0ZVBsYXRmb3JtIiwiX3J1blBsYXRmb3JtSW5pdGlhbGl6ZXJzIiwiUGxhdGZvcm1SZWYiLCJQbGF0Zm9ybVJlZi5jb25zdHJ1Y3RvciIsIlBsYXRmb3JtUmVmLmluamVjdG9yIiwiUGxhdGZvcm1SZWZfIiwiUGxhdGZvcm1SZWZfLmNvbnN0cnVjdG9yIiwiUGxhdGZvcm1SZWZfLnJlZ2lzdGVyRGlzcG9zZUxpc3RlbmVyIiwiUGxhdGZvcm1SZWZfLmluamVjdG9yIiwiUGxhdGZvcm1SZWZfLmFwcGxpY2F0aW9uIiwiUGxhdGZvcm1SZWZfLmFzeW5jQXBwbGljYXRpb24iLCJQbGF0Zm9ybVJlZl8uX2luaXRBcHAiLCJQbGF0Zm9ybVJlZl8uZGlzcG9zZSIsIlBsYXRmb3JtUmVmXy5fYXBwbGljYXRpb25EaXNwb3NlZCIsIl9ydW5BcHBJbml0aWFsaXplcnMiLCJBcHBsaWNhdGlvblJlZiIsIkFwcGxpY2F0aW9uUmVmLmNvbnN0cnVjdG9yIiwiQXBwbGljYXRpb25SZWYuaW5qZWN0b3IiLCJBcHBsaWNhdGlvblJlZi56b25lIiwiQXBwbGljYXRpb25SZWYuY29tcG9uZW50VHlwZXMiLCJBcHBsaWNhdGlvblJlZl8iLCJBcHBsaWNhdGlvblJlZl8uY29uc3RydWN0b3IiLCJBcHBsaWNhdGlvblJlZl8ucmVnaXN0ZXJCb290c3RyYXBMaXN0ZW5lciIsIkFwcGxpY2F0aW9uUmVmXy5yZWdpc3RlckRpc3Bvc2VMaXN0ZW5lciIsIkFwcGxpY2F0aW9uUmVmXy5yZWdpc3RlckNoYW5nZURldGVjdG9yIiwiQXBwbGljYXRpb25SZWZfLnVucmVnaXN0ZXJDaGFuZ2VEZXRlY3RvciIsIkFwcGxpY2F0aW9uUmVmXy5ib290c3RyYXAiLCJBcHBsaWNhdGlvblJlZl8uX2xvYWRDb21wb25lbnQiLCJBcHBsaWNhdGlvblJlZl8uX3VubG9hZENvbXBvbmVudCIsIkFwcGxpY2F0aW9uUmVmXy5pbmplY3RvciIsIkFwcGxpY2F0aW9uUmVmXy56b25lIiwiQXBwbGljYXRpb25SZWZfLnRpY2siLCJBcHBsaWNhdGlvblJlZl8uZGlzcG9zZSIsIkFwcGxpY2F0aW9uUmVmXy5jb21wb25lbnRUeXBlcyIsIk5nWm9uZUVycm9yIiwiTmdab25lRXJyb3IuY29uc3RydWN0b3IiLCJOZ1pvbmUiLCJOZ1pvbmUuY29uc3RydWN0b3IiLCJOZ1pvbmUub3ZlcnJpZGVPblR1cm5TdGFydCIsIk5nWm9uZS5vblR1cm5TdGFydCIsIk5nWm9uZS5fbm90aWZ5T25UdXJuU3RhcnQiLCJOZ1pvbmUub3ZlcnJpZGVPblR1cm5Eb25lIiwiTmdab25lLm9uVHVybkRvbmUiLCJOZ1pvbmUuX25vdGlmeU9uVHVybkRvbmUiLCJOZ1pvbmUub3ZlcnJpZGVPbkV2ZW50RG9uZSIsIk5nWm9uZS5vbkV2ZW50RG9uZSIsIk5nWm9uZS5fbm90aWZ5T25FdmVudERvbmUiLCJOZ1pvbmUuaGFzUGVuZGluZ01pY3JvdGFza3MiLCJOZ1pvbmUuaGFzUGVuZGluZ1RpbWVycyIsIk5nWm9uZS5oYXNQZW5kaW5nQXN5bmNUYXNrcyIsIk5nWm9uZS5vdmVycmlkZU9uRXJyb3JIYW5kbGVyIiwiTmdab25lLm9uRXJyb3IiLCJOZ1pvbmUucnVuIiwiTmdab25lLnJ1bk91dHNpZGVBbmd1bGFyIiwiTmdab25lLl9jcmVhdGVJbm5lclpvbmUiLCJOZ1pvbmUuX25vdGlmeU9uRXJyb3IiLCJfYXBwSWRSYW5kb21Qcm92aWRlckZhY3RvcnkiLCJfcmFuZG9tQ2hhciIsIlRlc3RhYmlsaXR5IiwiVGVzdGFiaWxpdHkuY29uc3RydWN0b3IiLCJUZXN0YWJpbGl0eS5fd2F0Y2hBbmd1bGFyRXZlbnRzIiwiVGVzdGFiaWxpdHkuaW5jcmVhc2VQZW5kaW5nUmVxdWVzdENvdW50IiwiVGVzdGFiaWxpdHkuZGVjcmVhc2VQZW5kaW5nUmVxdWVzdENvdW50IiwiVGVzdGFiaWxpdHkuaXNTdGFibGUiLCJUZXN0YWJpbGl0eS5fcnVuQ2FsbGJhY2tzSWZSZWFkeSIsIlRlc3RhYmlsaXR5LndoZW5TdGFibGUiLCJUZXN0YWJpbGl0eS5nZXRQZW5kaW5nUmVxdWVzdENvdW50IiwiVGVzdGFiaWxpdHkuaXNBbmd1bGFyRXZlbnRQZW5kaW5nIiwiVGVzdGFiaWxpdHkuZmluZEJpbmRpbmdzIiwiVGVzdGFiaWxpdHkuZmluZFByb3ZpZGVycyIsIlRlc3RhYmlsaXR5UmVnaXN0cnkiLCJUZXN0YWJpbGl0eVJlZ2lzdHJ5LmNvbnN0cnVjdG9yIiwiVGVzdGFiaWxpdHlSZWdpc3RyeS5yZWdpc3RlckFwcGxpY2F0aW9uIiwiVGVzdGFiaWxpdHlSZWdpc3RyeS5nZXRUZXN0YWJpbGl0eSIsIlRlc3RhYmlsaXR5UmVnaXN0cnkuZ2V0QWxsVGVzdGFiaWxpdGllcyIsIlRlc3RhYmlsaXR5UmVnaXN0cnkuZmluZFRlc3RhYmlsaXR5SW5UcmVlIiwiX05vb3BHZXRUZXN0YWJpbGl0eSIsIl9Ob29wR2V0VGVzdGFiaWxpdHkuY29uc3RydWN0b3IiLCJfTm9vcEdldFRlc3RhYmlsaXR5LmFkZFRvV2luZG93IiwiX05vb3BHZXRUZXN0YWJpbGl0eS5maW5kVGVzdGFiaWxpdHlJblRyZWUiLCJzZXRUZXN0YWJpbGl0eUdldHRlciIsIkNvbXBvbmVudFJlZiIsIkNvbXBvbmVudFJlZi5jb25zdHJ1Y3RvciIsIkNvbXBvbmVudFJlZi5ob3N0VmlldyIsIkNvbXBvbmVudFJlZi5ob3N0Q29tcG9uZW50IiwiQ29tcG9uZW50UmVmXyIsIkNvbXBvbmVudFJlZl8uY29uc3RydWN0b3IiLCJDb21wb25lbnRSZWZfLmhvc3RDb21wb25lbnRUeXBlIiwiQ29tcG9uZW50UmVmXy5kaXNwb3NlIiwiRHluYW1pY0NvbXBvbmVudExvYWRlciIsIkR5bmFtaWNDb21wb25lbnRMb2FkZXIuY29uc3RydWN0b3IiLCJEeW5hbWljQ29tcG9uZW50TG9hZGVyXyIsIkR5bmFtaWNDb21wb25lbnRMb2FkZXJfLmNvbnN0cnVjdG9yIiwiRHluYW1pY0NvbXBvbmVudExvYWRlcl8ubG9hZEFzUm9vdCIsIkR5bmFtaWNDb21wb25lbnRMb2FkZXJfLmxvYWRJbnRvTG9jYXRpb24iLCJEeW5hbWljQ29tcG9uZW50TG9hZGVyXy5sb2FkTmV4dFRvTG9jYXRpb24iLCJDb21waWxlciIsIkNvbXBpbGVyLmNvbnN0cnVjdG9yIiwiX2lzQ29tcGlsZWRIb3N0VGVtcGxhdGUiLCJDb21waWxlcl8iLCJDb21waWxlcl8uY29uc3RydWN0b3IiLCJDb21waWxlcl8uY29tcGlsZUluSG9zdCIsIkNvbXBpbGVyXy5fY3JlYXRlUHJvdG9WaWV3IiwiQ29tcGlsZXJfLmNsZWFyQ2FjaGUiLCJpbnRlcm5hbENyZWF0ZVByb3RvVmlldyIsIlByb3RvVmlld0ZhY3RvcnkiLCJQcm90b1ZpZXdGYWN0b3J5LmNvbnN0cnVjdG9yIiwiUHJvdG9WaWV3RmFjdG9yeS5jbGVhckNhY2hlIiwiUHJvdG9WaWV3RmFjdG9yeS5jcmVhdGVIb3N0IiwiUHJvdG9WaWV3RmFjdG9yeS5fY3JlYXRlQ29tcG9uZW50IiwiUHJvdG9WaWV3RmFjdG9yeS5fY3JlYXRlRW1iZWRkZWRUZW1wbGF0ZSIsIlByb3RvVmlld0ZhY3RvcnkuaW5pdGlhbGl6ZVByb3RvVmlld0lmTmVlZGVkIiwiUHJvdG9WaWV3RmFjdG9yeS5faW5pdGlhbGl6ZVByb3RvVmlldyIsIlByb3RvVmlld0ZhY3RvcnkuX2JpbmRQaXBlIiwiUHJvdG9WaWV3RmFjdG9yeS5fZmxhdHRlblBpcGVzIiwiY3JlYXRlQ29tcG9uZW50IiwiY3JlYXRlRW1iZWRkZWRUZW1wbGF0ZSIsIl9Qcm90b1ZpZXdJbml0aWFsaXplciIsIl9Qcm90b1ZpZXdJbml0aWFsaXplci5jb25zdHJ1Y3RvciIsIl9Qcm90b1ZpZXdJbml0aWFsaXplci52aXNpdFRleHQiLCJfUHJvdG9WaWV3SW5pdGlhbGl6ZXIudmlzaXROZ0NvbnRlbnQiLCJfUHJvdG9WaWV3SW5pdGlhbGl6ZXIudmlzaXRCZWdpbkVsZW1lbnQiLCJfUHJvdG9WaWV3SW5pdGlhbGl6ZXIudmlzaXRFbmRFbGVtZW50IiwiX1Byb3RvVmlld0luaXRpYWxpemVyLnZpc2l0QmVnaW5Db21wb25lbnQiLCJfUHJvdG9WaWV3SW5pdGlhbGl6ZXIudmlzaXRFbmRDb21wb25lbnQiLCJfUHJvdG9WaWV3SW5pdGlhbGl6ZXIudmlzaXRFbWJlZGRlZFRlbXBsYXRlIiwiX1Byb3RvVmlld0luaXRpYWxpemVyLl92aXNpdEJlZ2luQm91bmRFbGVtZW50IiwiX1Byb3RvVmlld0luaXRpYWxpemVyLl92aXNpdEJlZ2luRWxlbWVudCIsIl9Qcm90b1ZpZXdJbml0aWFsaXplci5fdmlzaXRFbmRFbGVtZW50IiwiX2NyZWF0ZUVsZW1lbnRCaW5kZXIiLCJwcm92aWRlRGlyZWN0aXZlIiwiY3JlYXRlRGlyZWN0aXZlVmFyaWFibGVCaW5kaW5ncyIsImFycmF5VG9NYXAiLCJfZmxhdHRlbkFycmF5IiwiX2ZsYXR0ZW5TdHlsZUFyciIsIlJlbmRlclByb3RvVmlld1JlZiIsIlJlbmRlclByb3RvVmlld1JlZi5jb25zdHJ1Y3RvciIsIlJlbmRlckZyYWdtZW50UmVmIiwiUmVuZGVyRnJhZ21lbnRSZWYuY29uc3RydWN0b3IiLCJSZW5kZXJWaWV3UmVmIiwiUmVuZGVyVmlld1JlZi5jb25zdHJ1Y3RvciIsIlJlbmRlclRlbXBsYXRlQ21kIiwiUmVuZGVyVGVtcGxhdGVDbWQuY29uc3RydWN0b3IiLCJSZW5kZXJCZWdpbkNtZCIsIlJlbmRlckJlZ2luQ21kLmNvbnN0cnVjdG9yIiwiUmVuZGVyQmVnaW5DbWQubmdDb250ZW50SW5kZXgiLCJSZW5kZXJCZWdpbkNtZC5pc0JvdW5kIiwiUmVuZGVyVGV4dENtZCIsIlJlbmRlclRleHRDbWQuY29uc3RydWN0b3IiLCJSZW5kZXJUZXh0Q21kLnZhbHVlIiwiUmVuZGVyTmdDb250ZW50Q21kIiwiUmVuZGVyTmdDb250ZW50Q21kLmNvbnN0cnVjdG9yIiwiUmVuZGVyTmdDb250ZW50Q21kLmluZGV4IiwiUmVuZGVyTmdDb250ZW50Q21kLm5nQ29udGVudEluZGV4IiwiUmVuZGVyQmVnaW5FbGVtZW50Q21kIiwiUmVuZGVyQmVnaW5FbGVtZW50Q21kLmNvbnN0cnVjdG9yIiwiUmVuZGVyQmVnaW5FbGVtZW50Q21kLm5hbWUiLCJSZW5kZXJCZWdpbkVsZW1lbnRDbWQuYXR0ck5hbWVBbmRWYWx1ZXMiLCJSZW5kZXJCZWdpbkVsZW1lbnRDbWQuZXZlbnRUYXJnZXRBbmROYW1lcyIsIlJlbmRlckJlZ2luQ29tcG9uZW50Q21kIiwiUmVuZGVyQmVnaW5Db21wb25lbnRDbWQuY29uc3RydWN0b3IiLCJSZW5kZXJCZWdpbkNvbXBvbmVudENtZC50ZW1wbGF0ZUlkIiwiUmVuZGVyRW1iZWRkZWRUZW1wbGF0ZUNtZCIsIlJlbmRlckVtYmVkZGVkVGVtcGxhdGVDbWQuY29uc3RydWN0b3IiLCJSZW5kZXJFbWJlZGRlZFRlbXBsYXRlQ21kLmlzTWVyZ2VkIiwiUmVuZGVyRW1iZWRkZWRUZW1wbGF0ZUNtZC5jaGlsZHJlbiIsIlJlbmRlclZpZXdXaXRoRnJhZ21lbnRzIiwiUmVuZGVyVmlld1dpdGhGcmFnbWVudHMuY29uc3RydWN0b3IiLCJSZW5kZXJDb21wb25lbnRUZW1wbGF0ZSIsIlJlbmRlckNvbXBvbmVudFRlbXBsYXRlLmNvbnN0cnVjdG9yIiwiUmVuZGVyZXIiLCJSZW5kZXJlci5jb25zdHJ1Y3RvciIsIlBpcGVQcm92aWRlciIsIlBpcGVQcm92aWRlci5jb25zdHJ1Y3RvciIsIlBpcGVQcm92aWRlci5jcmVhdGVGcm9tVHlwZSIsIlByb3RvUGlwZXMiLCJQcm90b1BpcGVzLmNvbnN0cnVjdG9yIiwiUHJvdG9QaXBlcy5mcm9tUHJvdmlkZXJzIiwiUHJvdG9QaXBlcy5nZXQiLCJQaXBlcyIsIlBpcGVzLmNvbnN0cnVjdG9yIiwiUGlwZXMuZ2V0IiwiU2VsZWN0ZWRQaXBlIiwiU2VsZWN0ZWRQaXBlLmNvbnN0cnVjdG9yIiwiVmlld1R5cGUiLCJBcHBWaWV3Q29udGFpbmVyIiwiQXBwVmlld0NvbnRhaW5lci5jb25zdHJ1Y3RvciIsIkFwcFZpZXciLCJBcHBWaWV3LmNvbnN0cnVjdG9yIiwiQXBwVmlldy5pbml0IiwiQXBwVmlldy5zZXRMb2NhbCIsIkFwcFZpZXcuaHlkcmF0ZWQiLCJBcHBWaWV3LnRyaWdnZXJFdmVudEhhbmRsZXJzIiwiQXBwVmlldy5ub3RpZnlPbkJpbmRpbmciLCJBcHBWaWV3LmxvZ0JpbmRpbmdVcGRhdGUiLCJBcHBWaWV3Lm5vdGlmeUFmdGVyQ29udGVudENoZWNrZWQiLCJBcHBWaWV3Lm5vdGlmeUFmdGVyVmlld0NoZWNrZWQiLCJBcHBWaWV3LmdldERpcmVjdGl2ZUZvciIsIkFwcFZpZXcuZ2V0TmVzdGVkVmlldyIsIkFwcFZpZXcuZ2V0Q29udGFpbmVyRWxlbWVudCIsIkFwcFZpZXcuZ2V0RGVidWdDb250ZXh0IiwiQXBwVmlldy5nZXREZXRlY3RvckZvciIsIkFwcFZpZXcuaW52b2tlRWxlbWVudE1ldGhvZCIsIkFwcFZpZXcuZGlzcGF0Y2hSZW5kZXJFdmVudCIsIkFwcFZpZXcuZGlzcGF0Y2hFdmVudCIsIkFwcFZpZXcub3duQmluZGVyc0NvdW50IiwiX2xvY2Fsc1RvU3RyaW5nTWFwIiwiRXZlbnRFdmFsdWF0aW9uRXJyb3IiLCJFdmVudEV2YWx1YXRpb25FcnJvci5jb25zdHJ1Y3RvciIsIkFwcFByb3RvVmlld01lcmdlSW5mbyIsIkFwcFByb3RvVmlld01lcmdlSW5mby5jb25zdHJ1Y3RvciIsIkFwcFByb3RvVmlldyIsIkFwcFByb3RvVmlldy5jb25zdHJ1Y3RvciIsIkFwcFByb3RvVmlldy5pbml0IiwiQXBwUHJvdG9WaWV3LmlzSW5pdGlhbGl6ZWQiLCJpbnRlcm5hbFZpZXciLCJpbnRlcm5hbFByb3RvVmlldyIsIlZpZXdSZWYiLCJWaWV3UmVmLmNvbnN0cnVjdG9yIiwiVmlld1JlZi5jaGFuZ2VEZXRlY3RvclJlZiIsIlZpZXdSZWZfIiwiVmlld1JlZl8uY29uc3RydWN0b3IiLCJWaWV3UmVmXy5yZW5kZXIiLCJWaWV3UmVmXy5yZW5kZXJGcmFnbWVudCIsIlZpZXdSZWZfLmNoYW5nZURldGVjdG9yUmVmIiwiVmlld1JlZl8uc2V0TG9jYWwiLCJQcm90b1ZpZXdSZWYiLCJQcm90b1ZpZXdSZWYuY29uc3RydWN0b3IiLCJQcm90b1ZpZXdSZWZfIiwiUHJvdG9WaWV3UmVmXy5jb25zdHJ1Y3RvciIsImNhbWVsQ2FzZVRvRGFzaENhc2UiLCJkYXNoQ2FzZVRvQ2FtZWxDYXNlIiwiRWxlbWVudEJpbmRlciIsIkVsZW1lbnRCaW5kZXIuY29uc3RydWN0b3IiLCJTdGF0aWNLZXlzIiwiU3RhdGljS2V5cy5jb25zdHJ1Y3RvciIsIlN0YXRpY0tleXMuaW5zdGFuY2UiLCJUcmVlTm9kZSIsIlRyZWVOb2RlLmNvbnN0cnVjdG9yIiwiVHJlZU5vZGUuYWRkQ2hpbGQiLCJUcmVlTm9kZS5yZW1vdmUiLCJUcmVlTm9kZS5wYXJlbnQiLCJEaXJlY3RpdmVEZXBlbmRlbmN5IiwiRGlyZWN0aXZlRGVwZW5kZW5jeS5jb25zdHJ1Y3RvciIsIkRpcmVjdGl2ZURlcGVuZGVuY3kuX3ZlcmlmeSIsIkRpcmVjdGl2ZURlcGVuZGVuY3kuY3JlYXRlRnJvbSIsIkRpcmVjdGl2ZURlcGVuZGVuY3kuX2F0dHJpYnV0ZU5hbWUiLCJEaXJlY3RpdmVEZXBlbmRlbmN5Ll9xdWVyeSIsIkRpcmVjdGl2ZVByb3ZpZGVyIiwiRGlyZWN0aXZlUHJvdmlkZXIuY29uc3RydWN0b3IiLCJEaXJlY3RpdmVQcm92aWRlci5kaXNwbGF5TmFtZSIsIkRpcmVjdGl2ZVByb3ZpZGVyLnF1ZXJpZXMiLCJEaXJlY3RpdmVQcm92aWRlci5ldmVudEVtaXR0ZXJzIiwiRGlyZWN0aXZlUHJvdmlkZXIuY3JlYXRlRnJvbVByb3ZpZGVyIiwiRGlyZWN0aXZlUHJvdmlkZXIuY3JlYXRlRnJvbVR5cGUiLCJQcmVCdWlsdE9iamVjdHMiLCJQcmVCdWlsdE9iamVjdHMuY29uc3RydWN0b3IiLCJRdWVyeU1ldGFkYXRhV2l0aFNldHRlciIsIlF1ZXJ5TWV0YWRhdGFXaXRoU2V0dGVyLmNvbnN0cnVjdG9yIiwiRXZlbnRFbWl0dGVyQWNjZXNzb3IiLCJFdmVudEVtaXR0ZXJBY2Nlc3Nvci5jb25zdHJ1Y3RvciIsIkV2ZW50RW1pdHRlckFjY2Vzc29yLnN1YnNjcmliZSIsIl9jcmVhdGVFdmVudEVtaXR0ZXJBY2Nlc3NvcnMiLCJfY3JlYXRlUHJvdG9RdWVyeVJlZnMiLCJQcm90b0VsZW1lbnRJbmplY3RvciIsIlByb3RvRWxlbWVudEluamVjdG9yLmNvbnN0cnVjdG9yIiwiUHJvdG9FbGVtZW50SW5qZWN0b3IuY3JlYXRlIiwiUHJvdG9FbGVtZW50SW5qZWN0b3IuX2NyZWF0ZURpcmVjdGl2ZVByb3ZpZGVyV2l0aFZpc2liaWxpdHkiLCJQcm90b0VsZW1lbnRJbmplY3Rvci5fY3JlYXRlUHJvdmlkZXJzV2l0aFZpc2liaWxpdHkiLCJQcm90b0VsZW1lbnRJbmplY3Rvci5fY3JlYXRlUHJvdmlkZXJXaXRoVmlzaWJpbGl0eSIsIlByb3RvRWxlbWVudEluamVjdG9yLl9jcmVhdGVWaWV3UHJvdmlkZXJzV2l0aFZpc2liaWxpdHkiLCJQcm90b0VsZW1lbnRJbmplY3Rvci5pbnN0YW50aWF0ZSIsIlByb3RvRWxlbWVudEluamVjdG9yLmRpcmVjdFBhcmVudCIsIlByb3RvRWxlbWVudEluamVjdG9yLmhhc0JpbmRpbmdzIiwiUHJvdG9FbGVtZW50SW5qZWN0b3IuZ2V0UHJvdmlkZXJBdEluZGV4IiwiRWxlbWVudEluamVjdG9yIiwiRWxlbWVudEluamVjdG9yLmNvbnN0cnVjdG9yIiwiRWxlbWVudEluamVjdG9yLmRlaHlkcmF0ZSIsIkVsZW1lbnRJbmplY3Rvci5oeWRyYXRlIiwiRWxlbWVudEluamVjdG9yLl9kZWJ1Z0NvbnRleHQiLCJFbGVtZW50SW5qZWN0b3IuX3JlYXR0YWNoSW5qZWN0b3JzIiwiRWxlbWVudEluamVjdG9yLl9yZWF0dGFjaEluamVjdG9yIiwiRWxlbWVudEluamVjdG9yLmhhc1ZhcmlhYmxlQmluZGluZyIsIkVsZW1lbnRJbmplY3Rvci5nZXRWYXJpYWJsZUJpbmRpbmciLCJFbGVtZW50SW5qZWN0b3IuZ2V0IiwiRWxlbWVudEluamVjdG9yLmhhc0RpcmVjdGl2ZSIsIkVsZW1lbnRJbmplY3Rvci5nZXRFdmVudEVtaXR0ZXJBY2Nlc3NvcnMiLCJFbGVtZW50SW5qZWN0b3IuZ2V0RGlyZWN0aXZlVmFyaWFibGVCaW5kaW5ncyIsIkVsZW1lbnRJbmplY3Rvci5nZXRDb21wb25lbnQiLCJFbGVtZW50SW5qZWN0b3IuZ2V0SW5qZWN0b3IiLCJFbGVtZW50SW5qZWN0b3IuZ2V0RWxlbWVudFJlZiIsIkVsZW1lbnRJbmplY3Rvci5nZXRWaWV3Q29udGFpbmVyUmVmIiwiRWxlbWVudEluamVjdG9yLmdldE5lc3RlZFZpZXciLCJFbGVtZW50SW5qZWN0b3IuZ2V0VmlldyIsIkVsZW1lbnRJbmplY3Rvci5kaXJlY3RQYXJlbnQiLCJFbGVtZW50SW5qZWN0b3IuaXNDb21wb25lbnRLZXkiLCJFbGVtZW50SW5qZWN0b3IuZ2V0RGVwZW5kZW5jeSIsIkVsZW1lbnRJbmplY3Rvci5fYnVpbGRBdHRyaWJ1dGUiLCJFbGVtZW50SW5qZWN0b3IuYWRkRGlyZWN0aXZlc01hdGNoaW5nUXVlcnkiLCJFbGVtZW50SW5qZWN0b3IuX2J1aWxkUXVlcnlTdHJhdGVneSIsIkVsZW1lbnRJbmplY3Rvci5saW5rIiwiRWxlbWVudEluamVjdG9yLnVubGluayIsIkVsZW1lbnRJbmplY3Rvci5nZXREaXJlY3RpdmVBdEluZGV4IiwiRWxlbWVudEluamVjdG9yLmhhc0luc3RhbmNlcyIsIkVsZW1lbnRJbmplY3Rvci5nZXRIb3N0IiwiRWxlbWVudEluamVjdG9yLmdldEJvdW5kRWxlbWVudEluZGV4IiwiRWxlbWVudEluamVjdG9yLmdldFJvb3RWaWV3SW5qZWN0b3JzIiwiRWxlbWVudEluamVjdG9yLm5nQWZ0ZXJWaWV3Q2hlY2tlZCIsIkVsZW1lbnRJbmplY3Rvci5uZ0FmdGVyQ29udGVudENoZWNrZWQiLCJFbGVtZW50SW5qZWN0b3IudHJhdmVyc2VBbmRTZXRRdWVyaWVzQXNEaXJ0eSIsIkVsZW1lbnRJbmplY3Rvci5fc2V0UXVlcmllc0FzRGlydHkiLCJfRW1wdHlRdWVyeVN0cmF0ZWd5IiwiX0VtcHR5UXVlcnlTdHJhdGVneS5jb25zdHJ1Y3RvciIsIl9FbXB0eVF1ZXJ5U3RyYXRlZ3kuc2V0Q29udGVudFF1ZXJpZXNBc0RpcnR5IiwiX0VtcHR5UXVlcnlTdHJhdGVneS5zZXRWaWV3UXVlcmllc0FzRGlydHkiLCJfRW1wdHlRdWVyeVN0cmF0ZWd5Lmh5ZHJhdGUiLCJfRW1wdHlRdWVyeVN0cmF0ZWd5LmRlaHlkcmF0ZSIsIl9FbXB0eVF1ZXJ5U3RyYXRlZ3kudXBkYXRlQ29udGVudFF1ZXJpZXMiLCJfRW1wdHlRdWVyeVN0cmF0ZWd5LnVwZGF0ZVZpZXdRdWVyaWVzIiwiX0VtcHR5UXVlcnlTdHJhdGVneS5maW5kUXVlcnkiLCJJbmxpbmVRdWVyeVN0cmF0ZWd5IiwiSW5saW5lUXVlcnlTdHJhdGVneS5jb25zdHJ1Y3RvciIsIklubGluZVF1ZXJ5U3RyYXRlZ3kuc2V0Q29udGVudFF1ZXJpZXNBc0RpcnR5IiwiSW5saW5lUXVlcnlTdHJhdGVneS5zZXRWaWV3UXVlcmllc0FzRGlydHkiLCJJbmxpbmVRdWVyeVN0cmF0ZWd5Lmh5ZHJhdGUiLCJJbmxpbmVRdWVyeVN0cmF0ZWd5LmRlaHlkcmF0ZSIsIklubGluZVF1ZXJ5U3RyYXRlZ3kudXBkYXRlQ29udGVudFF1ZXJpZXMiLCJJbmxpbmVRdWVyeVN0cmF0ZWd5LnVwZGF0ZVZpZXdRdWVyaWVzIiwiSW5saW5lUXVlcnlTdHJhdGVneS5maW5kUXVlcnkiLCJEeW5hbWljUXVlcnlTdHJhdGVneSIsIkR5bmFtaWNRdWVyeVN0cmF0ZWd5LmNvbnN0cnVjdG9yIiwiRHluYW1pY1F1ZXJ5U3RyYXRlZ3kuc2V0Q29udGVudFF1ZXJpZXNBc0RpcnR5IiwiRHluYW1pY1F1ZXJ5U3RyYXRlZ3kuc2V0Vmlld1F1ZXJpZXNBc0RpcnR5IiwiRHluYW1pY1F1ZXJ5U3RyYXRlZ3kuaHlkcmF0ZSIsIkR5bmFtaWNRdWVyeVN0cmF0ZWd5LmRlaHlkcmF0ZSIsIkR5bmFtaWNRdWVyeVN0cmF0ZWd5LnVwZGF0ZUNvbnRlbnRRdWVyaWVzIiwiRHluYW1pY1F1ZXJ5U3RyYXRlZ3kudXBkYXRlVmlld1F1ZXJpZXMiLCJEeW5hbWljUXVlcnlTdHJhdGVneS5maW5kUXVlcnkiLCJFbGVtZW50SW5qZWN0b3JJbmxpbmVTdHJhdGVneSIsIkVsZW1lbnRJbmplY3RvcklubGluZVN0cmF0ZWd5LmNvbnN0cnVjdG9yIiwiRWxlbWVudEluamVjdG9ySW5saW5lU3RyYXRlZ3kuaHlkcmF0ZSIsIkVsZW1lbnRJbmplY3RvcklubGluZVN0cmF0ZWd5LmRlaHlkcmF0ZSIsIkVsZW1lbnRJbmplY3RvcklubGluZVN0cmF0ZWd5LmNhbGxPbkRlc3Ryb3kiLCJFbGVtZW50SW5qZWN0b3JJbmxpbmVTdHJhdGVneS5nZXRDb21wb25lbnQiLCJFbGVtZW50SW5qZWN0b3JJbmxpbmVTdHJhdGVneS5pc0NvbXBvbmVudEtleSIsIkVsZW1lbnRJbmplY3RvcklubGluZVN0cmF0ZWd5LmFkZERpcmVjdGl2ZXNNYXRjaGluZ1F1ZXJ5IiwiRWxlbWVudEluamVjdG9yRHluYW1pY1N0cmF0ZWd5IiwiRWxlbWVudEluamVjdG9yRHluYW1pY1N0cmF0ZWd5LmNvbnN0cnVjdG9yIiwiRWxlbWVudEluamVjdG9yRHluYW1pY1N0cmF0ZWd5Lmh5ZHJhdGUiLCJFbGVtZW50SW5qZWN0b3JEeW5hbWljU3RyYXRlZ3kuZGVoeWRyYXRlIiwiRWxlbWVudEluamVjdG9yRHluYW1pY1N0cmF0ZWd5LmNhbGxPbkRlc3Ryb3kiLCJFbGVtZW50SW5qZWN0b3JEeW5hbWljU3RyYXRlZ3kuZ2V0Q29tcG9uZW50IiwiRWxlbWVudEluamVjdG9yRHluYW1pY1N0cmF0ZWd5LmlzQ29tcG9uZW50S2V5IiwiRWxlbWVudEluamVjdG9yRHluYW1pY1N0cmF0ZWd5LmFkZERpcmVjdGl2ZXNNYXRjaGluZ1F1ZXJ5IiwiUHJvdG9RdWVyeVJlZiIsIlByb3RvUXVlcnlSZWYuY29uc3RydWN0b3IiLCJQcm90b1F1ZXJ5UmVmLnVzZXNQcm9wZXJ0eVN5bnRheCIsIlF1ZXJ5UmVmIiwiUXVlcnlSZWYuY29uc3RydWN0b3IiLCJRdWVyeVJlZi5pc1ZpZXdRdWVyeSIsIlF1ZXJ5UmVmLnVwZGF0ZSIsIlF1ZXJ5UmVmLl91cGRhdGUiLCJRdWVyeVJlZi5fdmlzaXQiLCJRdWVyeVJlZi5fdmlzaXRJbmplY3RvciIsIlF1ZXJ5UmVmLl92aXNpdFZpZXdDb250YWluZXIiLCJRdWVyeVJlZi5fdmlzaXRWaWV3IiwiUXVlcnlSZWYuX2FnZ3JlZ2F0ZVZhcmlhYmxlQmluZGluZyIsIlF1ZXJ5UmVmLl9hZ2dyZWdhdGVEaXJlY3RpdmUiLCJRdWVyeVJlZi5kZWh5ZHJhdGUiLCJRdWVyeVJlZi5oeWRyYXRlIiwiQXBwVmlld01hbmFnZXIiLCJBcHBWaWV3TWFuYWdlci5jb25zdHJ1Y3RvciIsIkFwcFZpZXdNYW5hZ2VyLmdldEhvc3RFbGVtZW50IiwiQXBwVmlld01hbmFnZXJfIiwiQXBwVmlld01hbmFnZXJfLmNvbnN0cnVjdG9yIiwiQXBwVmlld01hbmFnZXJfLmdldFZpZXdDb250YWluZXIiLCJBcHBWaWV3TWFuYWdlcl8uZ2V0TmFtZWRFbGVtZW50SW5Db21wb25lbnRWaWV3IiwiQXBwVmlld01hbmFnZXJfLmdldENvbXBvbmVudCIsIkFwcFZpZXdNYW5hZ2VyXy5jcmVhdGVSb290SG9zdFZpZXciLCJBcHBWaWV3TWFuYWdlcl8uZGVzdHJveVJvb3RIb3N0VmlldyIsIkFwcFZpZXdNYW5hZ2VyXy5jcmVhdGVFbWJlZGRlZFZpZXdJbkNvbnRhaW5lciIsIkFwcFZpZXdNYW5hZ2VyXy5jcmVhdGVIb3N0Vmlld0luQ29udGFpbmVyIiwiQXBwVmlld01hbmFnZXJfLl9jcmVhdGVWaWV3SW5Db250YWluZXIiLCJBcHBWaWV3TWFuYWdlcl8uX2F0dGFjaFJlbmRlclZpZXciLCJBcHBWaWV3TWFuYWdlcl8uZGVzdHJveVZpZXdJbkNvbnRhaW5lciIsIkFwcFZpZXdNYW5hZ2VyXy5hdHRhY2hWaWV3SW5Db250YWluZXIiLCJBcHBWaWV3TWFuYWdlcl8uZGV0YWNoVmlld0luQ29udGFpbmVyIiwiQXBwVmlld01hbmFnZXJfLl9jcmVhdGVNYWluVmlldyIsIkFwcFZpZXdNYW5hZ2VyXy5fY3JlYXRlUG9vbGVkVmlldyIsIkFwcFZpZXdNYW5hZ2VyXy5fZGVzdHJveVBvb2xlZFZpZXciLCJBcHBWaWV3TWFuYWdlcl8uX2Rlc3Ryb3lWaWV3SW5Db250YWluZXIiLCJBcHBWaWV3TWFuYWdlcl8uX3ZpZXdEZWh5ZHJhdGVSZWN1cnNlIiwiQXBwVmlld01hbmFnZXJVdGlscyIsIkFwcFZpZXdNYW5hZ2VyVXRpbHMuY29uc3RydWN0b3IiLCJBcHBWaWV3TWFuYWdlclV0aWxzLmdldENvbXBvbmVudEluc3RhbmNlIiwiQXBwVmlld01hbmFnZXJVdGlscy5jcmVhdGVWaWV3IiwiQXBwVmlld01hbmFnZXJVdGlscy5oeWRyYXRlUm9vdEhvc3RWaWV3IiwiQXBwVmlld01hbmFnZXJVdGlscy5hdHRhY2hWaWV3SW5Db250YWluZXIiLCJBcHBWaWV3TWFuYWdlclV0aWxzLmRldGFjaFZpZXdJbkNvbnRhaW5lciIsIkFwcFZpZXdNYW5hZ2VyVXRpbHMuaHlkcmF0ZVZpZXdJbkNvbnRhaW5lciIsIkFwcFZpZXdNYW5hZ2VyVXRpbHMuX2h5ZHJhdGVWaWV3IiwiQXBwVmlld01hbmFnZXJVdGlscy5fcG9wdWxhdGVWaWV3TG9jYWxzIiwiQXBwVmlld01hbmFnZXJVdGlscy5fc2V0VXBFdmVudEVtaXR0ZXJzIiwiQXBwVmlld01hbmFnZXJVdGlscy5kZWh5ZHJhdGVWaWV3IiwiRWxlbWVudFJlZiIsIkVsZW1lbnRSZWYuY29uc3RydWN0b3IiLCJFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQiLCJFbGVtZW50UmVmLnJlbmRlclZpZXciLCJFbGVtZW50UmVmXyIsIkVsZW1lbnRSZWZfLmNvbnN0cnVjdG9yIiwiRWxlbWVudFJlZl8ucmVuZGVyVmlldyIsIkVsZW1lbnRSZWZfLm5hdGl2ZUVsZW1lbnQiLCJUZW1wbGF0ZVJlZiIsIlRlbXBsYXRlUmVmLmNvbnN0cnVjdG9yIiwiVGVtcGxhdGVSZWZfIiwiVGVtcGxhdGVSZWZfLmNvbnN0cnVjdG9yIiwiVGVtcGxhdGVSZWZfLl9nZXRQcm90b1ZpZXciLCJUZW1wbGF0ZVJlZl8ucHJvdG9WaWV3UmVmIiwiVGVtcGxhdGVSZWZfLmhhc0xvY2FsIiwiQXBwVmlld1Bvb2wiLCJBcHBWaWV3UG9vbC5jb25zdHJ1Y3RvciIsIkFwcFZpZXdQb29sLmdldFZpZXciLCJBcHBWaWV3UG9vbC5yZXR1cm5WaWV3IiwiQXBwVmlld0xpc3RlbmVyIiwiQXBwVmlld0xpc3RlbmVyLmNvbnN0cnVjdG9yIiwiQXBwVmlld0xpc3RlbmVyLm9uVmlld0NyZWF0ZWQiLCJBcHBWaWV3TGlzdGVuZXIub25WaWV3RGVzdHJveWVkIiwiVmlld0NvbnRhaW5lclJlZiIsIlZpZXdDb250YWluZXJSZWYuY29uc3RydWN0b3IiLCJWaWV3Q29udGFpbmVyUmVmLmNsZWFyIiwiVmlld0NvbnRhaW5lclJlZi5sZW5ndGgiLCJWaWV3Q29udGFpbmVyUmVmXyIsIlZpZXdDb250YWluZXJSZWZfLmNvbnN0cnVjdG9yIiwiVmlld0NvbnRhaW5lclJlZl8uX2dldFZpZXdzIiwiVmlld0NvbnRhaW5lclJlZl8uZ2V0IiwiVmlld0NvbnRhaW5lclJlZl8ubGVuZ3RoIiwiVmlld0NvbnRhaW5lclJlZl8uY3JlYXRlRW1iZWRkZWRWaWV3IiwiVmlld0NvbnRhaW5lclJlZl8uY3JlYXRlSG9zdFZpZXciLCJWaWV3Q29udGFpbmVyUmVmXy5pbnNlcnQiLCJWaWV3Q29udGFpbmVyUmVmXy5pbmRleE9mIiwiVmlld0NvbnRhaW5lclJlZl8ucmVtb3ZlIiwiVmlld0NvbnRhaW5lclJlZl8uZGV0YWNoIiwiaGFzTGlmZWN5Y2xlSG9vayIsIkxpZmVjeWNsZUhvb2tzIiwiUXVlcnlMaXN0IiwiUXVlcnlMaXN0LmNvbnN0cnVjdG9yIiwiUXVlcnlMaXN0LmNoYW5nZXMiLCJRdWVyeUxpc3QubGVuZ3RoIiwiUXVlcnlMaXN0LmZpcnN0IiwiUXVlcnlMaXN0Lmxhc3QiLCJRdWVyeUxpc3QubWFwIiwiUXVlcnlMaXN0LmZpbHRlciIsIlF1ZXJ5TGlzdC5yZWR1Y2UiLCJRdWVyeUxpc3QudG9BcnJheSIsIlF1ZXJ5TGlzdFtnZXRTeW1ib2xJdGVyYXRvcigpXSIsIlF1ZXJ5TGlzdC50b1N0cmluZyIsIlF1ZXJ5TGlzdC5yZXNldCIsIlF1ZXJ5TGlzdC5ub3RpZnlPbkNoYW5nZXMiLCJFdmVudENvbmZpZyIsIkV2ZW50Q29uZmlnLmNvbnN0cnVjdG9yIiwiRXZlbnRDb25maWcucGFyc2UiLCJFdmVudENvbmZpZy5nZXRGdWxsTmFtZSIsIl9pc0RpcmVjdGl2ZU1ldGFkYXRhIiwiRGlyZWN0aXZlUmVzb2x2ZXIiLCJEaXJlY3RpdmVSZXNvbHZlci5jb25zdHJ1Y3RvciIsIkRpcmVjdGl2ZVJlc29sdmVyLnJlc29sdmUiLCJEaXJlY3RpdmVSZXNvbHZlci5fbWVyZ2VXaXRoUHJvcGVydHlNZXRhZGF0YSIsIkRpcmVjdGl2ZVJlc29sdmVyLl9tZXJnZSIsIlZpZXdSZXNvbHZlciIsIlZpZXdSZXNvbHZlci5jb25zdHJ1Y3RvciIsIlZpZXdSZXNvbHZlci5yZXNvbHZlIiwiVmlld1Jlc29sdmVyLl9yZXNvbHZlIiwiVmlld1Jlc29sdmVyLl90aHJvd01peGluZ1ZpZXdBbmRDb21wb25lbnQiLCJfaXNQaXBlTWV0YWRhdGEiLCJQaXBlUmVzb2x2ZXIiLCJQaXBlUmVzb2x2ZXIuY29uc3RydWN0b3IiLCJQaXBlUmVzb2x2ZXIucmVzb2x2ZSIsIkNvbXBpbGVkSG9zdFRlbXBsYXRlIiwiQ29tcGlsZWRIb3N0VGVtcGxhdGUuY29uc3RydWN0b3IiLCJDb21waWxlZENvbXBvbmVudFRlbXBsYXRlIiwiQ29tcGlsZWRDb21wb25lbnRUZW1wbGF0ZS5jb25zdHJ1Y3RvciIsIlRleHRDbWQiLCJUZXh0Q21kLmNvbnN0cnVjdG9yIiwiVGV4dENtZC52aXNpdCIsIk5nQ29udGVudENtZCIsIk5nQ29udGVudENtZC5jb25zdHJ1Y3RvciIsIk5nQ29udGVudENtZC52aXNpdCIsIklCZWdpbkVsZW1lbnRDbWQiLCJJQmVnaW5FbGVtZW50Q21kLmNvbnN0cnVjdG9yIiwiSUJlZ2luRWxlbWVudENtZC52YXJpYWJsZU5hbWVBbmRWYWx1ZXMiLCJJQmVnaW5FbGVtZW50Q21kLmV2ZW50VGFyZ2V0QW5kTmFtZXMiLCJJQmVnaW5FbGVtZW50Q21kLmRpcmVjdGl2ZXMiLCJCZWdpbkVsZW1lbnRDbWQiLCJCZWdpbkVsZW1lbnRDbWQuY29uc3RydWN0b3IiLCJCZWdpbkVsZW1lbnRDbWQudmlzaXQiLCJFbmRFbGVtZW50Q21kIiwiRW5kRWxlbWVudENtZC5jb25zdHJ1Y3RvciIsIkVuZEVsZW1lbnRDbWQudmlzaXQiLCJCZWdpbkNvbXBvbmVudENtZCIsIkJlZ2luQ29tcG9uZW50Q21kLmNvbnN0cnVjdG9yIiwiQmVnaW5Db21wb25lbnRDbWQudGVtcGxhdGVJZCIsIkJlZ2luQ29tcG9uZW50Q21kLnZpc2l0IiwiRW5kQ29tcG9uZW50Q21kIiwiRW5kQ29tcG9uZW50Q21kLmNvbnN0cnVjdG9yIiwiRW5kQ29tcG9uZW50Q21kLnZpc2l0IiwiRW1iZWRkZWRUZW1wbGF0ZUNtZCIsIkVtYmVkZGVkVGVtcGxhdGVDbWQuY29uc3RydWN0b3IiLCJFbWJlZGRlZFRlbXBsYXRlQ21kLnZpc2l0IiwidmlzaXRBbGxDb21tYW5kcyIsIkNvbnNvbGUiLCJDb25zb2xlLmNvbnN0cnVjdG9yIiwiQ29uc29sZS5sb2ciLCJEZWJ1Z0VsZW1lbnQiLCJEZWJ1Z0VsZW1lbnQuY29uc3RydWN0b3IiLCJEZWJ1Z0VsZW1lbnQuY29tcG9uZW50SW5zdGFuY2UiLCJEZWJ1Z0VsZW1lbnQubmF0aXZlRWxlbWVudCIsIkRlYnVnRWxlbWVudC5lbGVtZW50UmVmIiwiRGVidWdFbGVtZW50LmNoaWxkcmVuIiwiRGVidWdFbGVtZW50LmNvbXBvbmVudFZpZXdDaGlsZHJlbiIsIkRlYnVnRWxlbWVudC5xdWVyeSIsIkRlYnVnRWxlbWVudC5xdWVyeUFsbCIsIkRlYnVnRWxlbWVudF8iLCJEZWJ1Z0VsZW1lbnRfLmNvbnN0cnVjdG9yIiwiRGVidWdFbGVtZW50Xy5jb21wb25lbnRJbnN0YW5jZSIsIkRlYnVnRWxlbWVudF8ubmF0aXZlRWxlbWVudCIsIkRlYnVnRWxlbWVudF8uZWxlbWVudFJlZiIsIkRlYnVnRWxlbWVudF8uZ2V0RGlyZWN0aXZlSW5zdGFuY2UiLCJEZWJ1Z0VsZW1lbnRfLmNoaWxkcmVuIiwiRGVidWdFbGVtZW50Xy5jb21wb25lbnRWaWV3Q2hpbGRyZW4iLCJEZWJ1Z0VsZW1lbnRfLnRyaWdnZXJFdmVudEhhbmRsZXIiLCJEZWJ1Z0VsZW1lbnRfLmhhc0RpcmVjdGl2ZSIsIkRlYnVnRWxlbWVudF8uaW5qZWN0IiwiRGVidWdFbGVtZW50Xy5nZXRMb2NhbCIsIkRlYnVnRWxlbWVudF8uX2dldENoaWxkRWxlbWVudHMiLCJpbnNwZWN0RWxlbWVudCIsImFzTmF0aXZlRWxlbWVudHMiLCJTY29wZSIsIlNjb3BlLmNvbnN0cnVjdG9yIiwiU2NvcGUuYWxsIiwiU2NvcGUubGlnaHQiLCJTY29wZS52aWV3IiwiX3JlZmxlY3RvciIsIk9ic2VydmFibGVTdHJhdGVneSIsIk9ic2VydmFibGVTdHJhdGVneS5jb25zdHJ1Y3RvciIsIk9ic2VydmFibGVTdHJhdGVneS5jcmVhdGVTdWJzY3JpcHRpb24iLCJPYnNlcnZhYmxlU3RyYXRlZ3kuZGlzcG9zZSIsIk9ic2VydmFibGVTdHJhdGVneS5vbkRlc3Ryb3kiLCJQcm9taXNlU3RyYXRlZ3kiLCJQcm9taXNlU3RyYXRlZ3kuY29uc3RydWN0b3IiLCJQcm9taXNlU3RyYXRlZ3kuY3JlYXRlU3Vic2NyaXB0aW9uIiwiUHJvbWlzZVN0cmF0ZWd5LmRpc3Bvc2UiLCJQcm9taXNlU3RyYXRlZ3kub25EZXN0cm95IiwiQXN5bmNQaXBlIiwiQXN5bmNQaXBlLmNvbnN0cnVjdG9yIiwiQXN5bmNQaXBlLm5nT25EZXN0cm95IiwiQXN5bmNQaXBlLnRyYW5zZm9ybSIsIkFzeW5jUGlwZS5fc3Vic2NyaWJlIiwiQXN5bmNQaXBlLl9zZWxlY3RTdHJhdGVneSIsIkFzeW5jUGlwZS5fZGlzcG9zZSIsIkFzeW5jUGlwZS5fdXBkYXRlTGF0ZXN0VmFsdWUiLCJJbnZhbGlkUGlwZUFyZ3VtZW50RXhjZXB0aW9uIiwiSW52YWxpZFBpcGVBcmd1bWVudEV4Y2VwdGlvbi5jb25zdHJ1Y3RvciIsIlVwcGVyQ2FzZVBpcGUiLCJVcHBlckNhc2VQaXBlLmNvbnN0cnVjdG9yIiwiVXBwZXJDYXNlUGlwZS50cmFuc2Zvcm0iLCJMb3dlckNhc2VQaXBlIiwiTG93ZXJDYXNlUGlwZS5jb25zdHJ1Y3RvciIsIkxvd2VyQ2FzZVBpcGUudHJhbnNmb3JtIiwiSnNvblBpcGUiLCJKc29uUGlwZS5jb25zdHJ1Y3RvciIsIkpzb25QaXBlLnRyYW5zZm9ybSIsIlNsaWNlUGlwZSIsIlNsaWNlUGlwZS5jb25zdHJ1Y3RvciIsIlNsaWNlUGlwZS50cmFuc2Zvcm0iLCJTbGljZVBpcGUuc3VwcG9ydHMiLCJEYXRlUGlwZSIsIkRhdGVQaXBlLmNvbnN0cnVjdG9yIiwiRGF0ZVBpcGUudHJhbnNmb3JtIiwiRGF0ZVBpcGUuc3VwcG9ydHMiLCJOdW1iZXJGb3JtYXRTdHlsZSIsIk51bWJlckZvcm1hdHRlciIsIk51bWJlckZvcm1hdHRlci5jb25zdHJ1Y3RvciIsIk51bWJlckZvcm1hdHRlci5mb3JtYXQiLCJkaWdpdENvbmRpdGlvbiIsIm5hbWVDb25kaXRpb24iLCJleHRyYWN0Q29tcG9uZW50cyIsIkRhdGVGb3JtYXR0ZXIiLCJEYXRlRm9ybWF0dGVyLmNvbnN0cnVjdG9yIiwiRGF0ZUZvcm1hdHRlci5mb3JtYXQiLCJOdW1iZXJQaXBlIiwiTnVtYmVyUGlwZS5jb25zdHJ1Y3RvciIsIk51bWJlclBpcGUuX2Zvcm1hdCIsIkRlY2ltYWxQaXBlIiwiRGVjaW1hbFBpcGUuY29uc3RydWN0b3IiLCJEZWNpbWFsUGlwZS50cmFuc2Zvcm0iLCJQZXJjZW50UGlwZSIsIlBlcmNlbnRQaXBlLmNvbnN0cnVjdG9yIiwiUGVyY2VudFBpcGUudHJhbnNmb3JtIiwiQ3VycmVuY3lQaXBlIiwiQ3VycmVuY3lQaXBlLmNvbnN0cnVjdG9yIiwiQ3VycmVuY3lQaXBlLnRyYW5zZm9ybSIsIk5nQ2xhc3MiLCJOZ0NsYXNzLmNvbnN0cnVjdG9yIiwiTmdDbGFzcy5pbml0aWFsQ2xhc3NlcyIsIk5nQ2xhc3MucmF3Q2xhc3MiLCJOZ0NsYXNzLm5nRG9DaGVjayIsIk5nQ2xhc3MubmdPbkRlc3Ryb3kiLCJOZ0NsYXNzLl9jbGVhbnVwQ2xhc3NlcyIsIk5nQ2xhc3MuX2FwcGx5S2V5VmFsdWVDaGFuZ2VzIiwiTmdDbGFzcy5fYXBwbHlJdGVyYWJsZUNoYW5nZXMiLCJOZ0NsYXNzLl9hcHBseUluaXRpYWxDbGFzc2VzIiwiTmdDbGFzcy5fYXBwbHlDbGFzc2VzIiwiTmdDbGFzcy5fdG9nZ2xlQ2xhc3MiLCJOZ0ZvciIsIk5nRm9yLmNvbnN0cnVjdG9yIiwiTmdGb3IubmdGb3JPZiIsIk5nRm9yLm5nRm9yVGVtcGxhdGUiLCJOZ0Zvci5uZ0RvQ2hlY2siLCJOZ0Zvci5fYXBwbHlDaGFuZ2VzIiwiTmdGb3IuX3BlclZpZXdDaGFuZ2UiLCJOZ0Zvci5fYnVsa1JlbW92ZSIsIk5nRm9yLl9idWxrSW5zZXJ0IiwiUmVjb3JkVmlld1R1cGxlIiwiUmVjb3JkVmlld1R1cGxlLmNvbnN0cnVjdG9yIiwiTmdJZiIsIk5nSWYuY29uc3RydWN0b3IiLCJOZ0lmLm5nSWYiLCJOZ1N0eWxlIiwiTmdTdHlsZS5jb25zdHJ1Y3RvciIsIk5nU3R5bGUucmF3U3R5bGUiLCJOZ1N0eWxlLm5nRG9DaGVjayIsIk5nU3R5bGUuX2FwcGx5Q2hhbmdlcyIsIk5nU3R5bGUuX3NldFN0eWxlIiwiU3dpdGNoVmlldyIsIlN3aXRjaFZpZXcuY29uc3RydWN0b3IiLCJTd2l0Y2hWaWV3LmNyZWF0ZSIsIlN3aXRjaFZpZXcuZGVzdHJveSIsIk5nU3dpdGNoIiwiTmdTd2l0Y2guY29uc3RydWN0b3IiLCJOZ1N3aXRjaC5uZ1N3aXRjaCIsIk5nU3dpdGNoLl9vbldoZW5WYWx1ZUNoYW5nZWQiLCJOZ1N3aXRjaC5fZW1wdHlBbGxBY3RpdmVWaWV3cyIsIk5nU3dpdGNoLl9hY3RpdmF0ZVZpZXdzIiwiTmdTd2l0Y2guX3JlZ2lzdGVyVmlldyIsIk5nU3dpdGNoLl9kZXJlZ2lzdGVyVmlldyIsIk5nU3dpdGNoV2hlbiIsIk5nU3dpdGNoV2hlbi5jb25zdHJ1Y3RvciIsIk5nU3dpdGNoV2hlbi5uZ1N3aXRjaFdoZW4iLCJOZ1N3aXRjaERlZmF1bHQiLCJOZ1N3aXRjaERlZmF1bHQuY29uc3RydWN0b3IiLCJpc0NvbnRyb2wiLCJfZmluZCIsInRvT2JzZXJ2YWJsZSIsIkFic3RyYWN0Q29udHJvbCIsIkFic3RyYWN0Q29udHJvbC5jb25zdHJ1Y3RvciIsIkFic3RyYWN0Q29udHJvbC52YWx1ZSIsIkFic3RyYWN0Q29udHJvbC5zdGF0dXMiLCJBYnN0cmFjdENvbnRyb2wudmFsaWQiLCJBYnN0cmFjdENvbnRyb2wuZXJyb3JzIiwiQWJzdHJhY3RDb250cm9sLnByaXN0aW5lIiwiQWJzdHJhY3RDb250cm9sLmRpcnR5IiwiQWJzdHJhY3RDb250cm9sLnRvdWNoZWQiLCJBYnN0cmFjdENvbnRyb2wudW50b3VjaGVkIiwiQWJzdHJhY3RDb250cm9sLnZhbHVlQ2hhbmdlcyIsIkFic3RyYWN0Q29udHJvbC5zdGF0dXNDaGFuZ2VzIiwiQWJzdHJhY3RDb250cm9sLnBlbmRpbmciLCJBYnN0cmFjdENvbnRyb2wubWFya0FzVG91Y2hlZCIsIkFic3RyYWN0Q29udHJvbC5tYXJrQXNEaXJ0eSIsIkFic3RyYWN0Q29udHJvbC5tYXJrQXNQZW5kaW5nIiwiQWJzdHJhY3RDb250cm9sLnNldFBhcmVudCIsIkFic3RyYWN0Q29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5IiwiQWJzdHJhY3RDb250cm9sLl9ydW5WYWxpZGF0b3IiLCJBYnN0cmFjdENvbnRyb2wuX3J1bkFzeW5jVmFsaWRhdG9yIiwiQWJzdHJhY3RDb250cm9sLl9jYW5jZWxFeGlzdGluZ1N1YnNjcmlwdGlvbiIsIkFic3RyYWN0Q29udHJvbC5zZXRFcnJvcnMiLCJBYnN0cmFjdENvbnRyb2wuZmluZCIsIkFic3RyYWN0Q29udHJvbC5nZXRFcnJvciIsIkFic3RyYWN0Q29udHJvbC5oYXNFcnJvciIsIkFic3RyYWN0Q29udHJvbC5fdXBkYXRlQ29udHJvbHNFcnJvcnMiLCJBYnN0cmFjdENvbnRyb2wuX2luaXRPYnNlcnZhYmxlcyIsIkFic3RyYWN0Q29udHJvbC5fY2FsY3VsYXRlU3RhdHVzIiwiQ29udHJvbCIsIkNvbnRyb2wuY29uc3RydWN0b3IiLCJDb250cm9sLnVwZGF0ZVZhbHVlIiwiQ29udHJvbC5fdXBkYXRlVmFsdWUiLCJDb250cm9sLl9hbnlDb250cm9sc0hhdmVTdGF0dXMiLCJDb250cm9sLnJlZ2lzdGVyT25DaGFuZ2UiLCJDb250cm9sR3JvdXAiLCJDb250cm9sR3JvdXAuY29uc3RydWN0b3IiLCJDb250cm9sR3JvdXAuYWRkQ29udHJvbCIsIkNvbnRyb2xHcm91cC5yZW1vdmVDb250cm9sIiwiQ29udHJvbEdyb3VwLmluY2x1ZGUiLCJDb250cm9sR3JvdXAuZXhjbHVkZSIsIkNvbnRyb2xHcm91cC5jb250YWlucyIsIkNvbnRyb2xHcm91cC5fc2V0UGFyZW50Rm9yQ29udHJvbHMiLCJDb250cm9sR3JvdXAuX3VwZGF0ZVZhbHVlIiwiQ29udHJvbEdyb3VwLl9hbnlDb250cm9sc0hhdmVTdGF0dXMiLCJDb250cm9sR3JvdXAuX3JlZHVjZVZhbHVlIiwiQ29udHJvbEdyb3VwLl9yZWR1Y2VDaGlsZHJlbiIsIkNvbnRyb2xHcm91cC5faW5jbHVkZWQiLCJDb250cm9sQXJyYXkiLCJDb250cm9sQXJyYXkuY29uc3RydWN0b3IiLCJDb250cm9sQXJyYXkuYXQiLCJDb250cm9sQXJyYXkucHVzaCIsIkNvbnRyb2xBcnJheS5pbnNlcnQiLCJDb250cm9sQXJyYXkucmVtb3ZlQXQiLCJDb250cm9sQXJyYXkubGVuZ3RoIiwiQ29udHJvbEFycmF5Ll91cGRhdGVWYWx1ZSIsIkNvbnRyb2xBcnJheS5fYW55Q29udHJvbHNIYXZlU3RhdHVzIiwiQ29udHJvbEFycmF5Ll9zZXRQYXJlbnRGb3JDb250cm9scyIsIkFic3RyYWN0Q29udHJvbERpcmVjdGl2ZSIsIkFic3RyYWN0Q29udHJvbERpcmVjdGl2ZS5jb25zdHJ1Y3RvciIsIkFic3RyYWN0Q29udHJvbERpcmVjdGl2ZS5jb250cm9sIiwiQWJzdHJhY3RDb250cm9sRGlyZWN0aXZlLnZhbHVlIiwiQWJzdHJhY3RDb250cm9sRGlyZWN0aXZlLnZhbGlkIiwiQWJzdHJhY3RDb250cm9sRGlyZWN0aXZlLmVycm9ycyIsIkFic3RyYWN0Q29udHJvbERpcmVjdGl2ZS5wcmlzdGluZSIsIkFic3RyYWN0Q29udHJvbERpcmVjdGl2ZS5kaXJ0eSIsIkFic3RyYWN0Q29udHJvbERpcmVjdGl2ZS50b3VjaGVkIiwiQWJzdHJhY3RDb250cm9sRGlyZWN0aXZlLnVudG91Y2hlZCIsIkFic3RyYWN0Q29udHJvbERpcmVjdGl2ZS5wYXRoIiwiQ29udHJvbENvbnRhaW5lciIsIkNvbnRyb2xDb250YWluZXIuY29uc3RydWN0b3IiLCJDb250cm9sQ29udGFpbmVyLmZvcm1EaXJlY3RpdmUiLCJDb250cm9sQ29udGFpbmVyLnBhdGgiLCJOZ0NvbnRyb2xOYW1lIiwiTmdDb250cm9sTmFtZS5jb25zdHJ1Y3RvciIsIk5nQ29udHJvbE5hbWUubmdPbkNoYW5nZXMiLCJOZ0NvbnRyb2xOYW1lLm5nT25EZXN0cm95IiwiTmdDb250cm9sTmFtZS52aWV3VG9Nb2RlbFVwZGF0ZSIsIk5nQ29udHJvbE5hbWUucGF0aCIsIk5nQ29udHJvbE5hbWUuZm9ybURpcmVjdGl2ZSIsIk5nQ29udHJvbE5hbWUudmFsaWRhdG9yIiwiTmdDb250cm9sTmFtZS5hc3luY1ZhbGlkYXRvciIsIk5nQ29udHJvbE5hbWUuY29udHJvbCIsIk5nQ29udHJvbCIsIk5nQ29udHJvbC5jb25zdHJ1Y3RvciIsIk5nQ29udHJvbC52YWxpZGF0b3IiLCJOZ0NvbnRyb2wuYXN5bmNWYWxpZGF0b3IiLCJjb250cm9sUGF0aCIsInNldFVwQ29udHJvbCIsInNldFVwQ29udHJvbEdyb3VwIiwiX3Rocm93RXJyb3IiLCJjb21wb3NlVmFsaWRhdG9ycyIsImNvbXBvc2VBc3luY1ZhbGlkYXRvcnMiLCJpc1Byb3BlcnR5VXBkYXRlZCIsInNlbGVjdFZhbHVlQWNjZXNzb3IiLCJWYWxpZGF0b3JzIiwiVmFsaWRhdG9ycy5jb25zdHJ1Y3RvciIsIlZhbGlkYXRvcnMucmVxdWlyZWQiLCJWYWxpZGF0b3JzLm1pbkxlbmd0aCIsIlZhbGlkYXRvcnMubWF4TGVuZ3RoIiwiVmFsaWRhdG9ycy5udWxsVmFsaWRhdG9yIiwiVmFsaWRhdG9ycy5jb21wb3NlIiwiVmFsaWRhdG9ycy5jb21wb3NlQXN5bmMiLCJfY29udmVydFRvUHJvbWlzZSIsIl9leGVjdXRlVmFsaWRhdG9ycyIsIl9tZXJnZUVycm9ycyIsIkRlZmF1bHRWYWx1ZUFjY2Vzc29yIiwiRGVmYXVsdFZhbHVlQWNjZXNzb3IuY29uc3RydWN0b3IiLCJEZWZhdWx0VmFsdWVBY2Nlc3Nvci53cml0ZVZhbHVlIiwiRGVmYXVsdFZhbHVlQWNjZXNzb3IucmVnaXN0ZXJPbkNoYW5nZSIsIkRlZmF1bHRWYWx1ZUFjY2Vzc29yLnJlZ2lzdGVyT25Ub3VjaGVkIiwiTnVtYmVyVmFsdWVBY2Nlc3NvciIsIk51bWJlclZhbHVlQWNjZXNzb3IuY29uc3RydWN0b3IiLCJOdW1iZXJWYWx1ZUFjY2Vzc29yLndyaXRlVmFsdWUiLCJOdW1iZXJWYWx1ZUFjY2Vzc29yLnJlZ2lzdGVyT25DaGFuZ2UiLCJOdW1iZXJWYWx1ZUFjY2Vzc29yLnJlZ2lzdGVyT25Ub3VjaGVkIiwiQ2hlY2tib3hDb250cm9sVmFsdWVBY2Nlc3NvciIsIkNoZWNrYm94Q29udHJvbFZhbHVlQWNjZXNzb3IuY29uc3RydWN0b3IiLCJDaGVja2JveENvbnRyb2xWYWx1ZUFjY2Vzc29yLndyaXRlVmFsdWUiLCJDaGVja2JveENvbnRyb2xWYWx1ZUFjY2Vzc29yLnJlZ2lzdGVyT25DaGFuZ2UiLCJDaGVja2JveENvbnRyb2xWYWx1ZUFjY2Vzc29yLnJlZ2lzdGVyT25Ub3VjaGVkIiwiTmdTZWxlY3RPcHRpb24iLCJOZ1NlbGVjdE9wdGlvbi5jb25zdHJ1Y3RvciIsIlNlbGVjdENvbnRyb2xWYWx1ZUFjY2Vzc29yIiwiU2VsZWN0Q29udHJvbFZhbHVlQWNjZXNzb3IuY29uc3RydWN0b3IiLCJTZWxlY3RDb250cm9sVmFsdWVBY2Nlc3Nvci53cml0ZVZhbHVlIiwiU2VsZWN0Q29udHJvbFZhbHVlQWNjZXNzb3IucmVnaXN0ZXJPbkNoYW5nZSIsIlNlbGVjdENvbnRyb2xWYWx1ZUFjY2Vzc29yLnJlZ2lzdGVyT25Ub3VjaGVkIiwiU2VsZWN0Q29udHJvbFZhbHVlQWNjZXNzb3IuX3VwZGF0ZVZhbHVlV2hlbkxpc3RPZk9wdGlvbnNDaGFuZ2VzIiwibm9ybWFsaXplVmFsaWRhdG9yIiwiTmdGb3JtQ29udHJvbCIsIk5nRm9ybUNvbnRyb2wuY29uc3RydWN0b3IiLCJOZ0Zvcm1Db250cm9sLm5nT25DaGFuZ2VzIiwiTmdGb3JtQ29udHJvbC5wYXRoIiwiTmdGb3JtQ29udHJvbC52YWxpZGF0b3IiLCJOZ0Zvcm1Db250cm9sLmFzeW5jVmFsaWRhdG9yIiwiTmdGb3JtQ29udHJvbC5jb250cm9sIiwiTmdGb3JtQ29udHJvbC52aWV3VG9Nb2RlbFVwZGF0ZSIsIk5nRm9ybUNvbnRyb2wuX2lzQ29udHJvbENoYW5nZWQiLCJOZ01vZGVsIiwiTmdNb2RlbC5jb25zdHJ1Y3RvciIsIk5nTW9kZWwubmdPbkNoYW5nZXMiLCJOZ01vZGVsLmNvbnRyb2wiLCJOZ01vZGVsLnBhdGgiLCJOZ01vZGVsLnZhbGlkYXRvciIsIk5nTW9kZWwuYXN5bmNWYWxpZGF0b3IiLCJOZ01vZGVsLnZpZXdUb01vZGVsVXBkYXRlIiwiTmdDb250cm9sR3JvdXAiLCJOZ0NvbnRyb2xHcm91cC5jb25zdHJ1Y3RvciIsIk5nQ29udHJvbEdyb3VwLm5nT25Jbml0IiwiTmdDb250cm9sR3JvdXAubmdPbkRlc3Ryb3kiLCJOZ0NvbnRyb2xHcm91cC5jb250cm9sIiwiTmdDb250cm9sR3JvdXAucGF0aCIsIk5nQ29udHJvbEdyb3VwLmZvcm1EaXJlY3RpdmUiLCJOZ0NvbnRyb2xHcm91cC52YWxpZGF0b3IiLCJOZ0NvbnRyb2xHcm91cC5hc3luY1ZhbGlkYXRvciIsIk5nRm9ybU1vZGVsIiwiTmdGb3JtTW9kZWwuY29uc3RydWN0b3IiLCJOZ0Zvcm1Nb2RlbC5uZ09uQ2hhbmdlcyIsIk5nRm9ybU1vZGVsLmZvcm1EaXJlY3RpdmUiLCJOZ0Zvcm1Nb2RlbC5jb250cm9sIiwiTmdGb3JtTW9kZWwucGF0aCIsIk5nRm9ybU1vZGVsLmFkZENvbnRyb2wiLCJOZ0Zvcm1Nb2RlbC5nZXRDb250cm9sIiwiTmdGb3JtTW9kZWwucmVtb3ZlQ29udHJvbCIsIk5nRm9ybU1vZGVsLmFkZENvbnRyb2xHcm91cCIsIk5nRm9ybU1vZGVsLnJlbW92ZUNvbnRyb2xHcm91cCIsIk5nRm9ybU1vZGVsLmdldENvbnRyb2xHcm91cCIsIk5nRm9ybU1vZGVsLnVwZGF0ZU1vZGVsIiwiTmdGb3JtTW9kZWwub25TdWJtaXQiLCJOZ0Zvcm1Nb2RlbC5fdXBkYXRlRG9tVmFsdWUiLCJOZ0Zvcm0iLCJOZ0Zvcm0uY29uc3RydWN0b3IiLCJOZ0Zvcm0uZm9ybURpcmVjdGl2ZSIsIk5nRm9ybS5jb250cm9sIiwiTmdGb3JtLnBhdGgiLCJOZ0Zvcm0uY29udHJvbHMiLCJOZ0Zvcm0uYWRkQ29udHJvbCIsIk5nRm9ybS5nZXRDb250cm9sIiwiTmdGb3JtLnJlbW92ZUNvbnRyb2wiLCJOZ0Zvcm0uYWRkQ29udHJvbEdyb3VwIiwiTmdGb3JtLnJlbW92ZUNvbnRyb2xHcm91cCIsIk5nRm9ybS5nZXRDb250cm9sR3JvdXAiLCJOZ0Zvcm0udXBkYXRlTW9kZWwiLCJOZ0Zvcm0ub25TdWJtaXQiLCJOZ0Zvcm0uX2ZpbmRDb250YWluZXIiLCJOZ0NvbnRyb2xTdGF0dXMiLCJOZ0NvbnRyb2xTdGF0dXMuY29uc3RydWN0b3IiLCJOZ0NvbnRyb2xTdGF0dXMubmdDbGFzc1VudG91Y2hlZCIsIk5nQ29udHJvbFN0YXR1cy5uZ0NsYXNzVG91Y2hlZCIsIk5nQ29udHJvbFN0YXR1cy5uZ0NsYXNzUHJpc3RpbmUiLCJOZ0NvbnRyb2xTdGF0dXMubmdDbGFzc0RpcnR5IiwiTmdDb250cm9sU3RhdHVzLm5nQ2xhc3NWYWxpZCIsIk5nQ29udHJvbFN0YXR1cy5uZ0NsYXNzSW52YWxpZCIsIlJlcXVpcmVkVmFsaWRhdG9yIiwiUmVxdWlyZWRWYWxpZGF0b3IuY29uc3RydWN0b3IiLCJNaW5MZW5ndGhWYWxpZGF0b3IiLCJNaW5MZW5ndGhWYWxpZGF0b3IuY29uc3RydWN0b3IiLCJNaW5MZW5ndGhWYWxpZGF0b3IudmFsaWRhdGUiLCJNYXhMZW5ndGhWYWxpZGF0b3IiLCJNYXhMZW5ndGhWYWxpZGF0b3IuY29uc3RydWN0b3IiLCJNYXhMZW5ndGhWYWxpZGF0b3IudmFsaWRhdGUiLCJGb3JtQnVpbGRlciIsIkZvcm1CdWlsZGVyLmNvbnN0cnVjdG9yIiwiRm9ybUJ1aWxkZXIuZ3JvdXAiLCJGb3JtQnVpbGRlci5jb250cm9sIiwiRm9ybUJ1aWxkZXIuYXJyYXkiLCJGb3JtQnVpbGRlci5fcmVkdWNlQ29udHJvbHMiLCJGb3JtQnVpbGRlci5fY3JlYXRlQ29udHJvbCIsImNyZWF0ZVdpdGhvdXRQYWNrYWdlUHJlZml4IiwiVXJsUmVzb2x2ZXIiLCJVcmxSZXNvbHZlci5jb25zdHJ1Y3RvciIsIlVybFJlc29sdmVyLnJlc29sdmUiLCJnZXRVcmxTY2hlbWUiLCJfYnVpbGRGcm9tRW5jb2RlZFBhcnRzIiwiX0NvbXBvbmVudEluZGV4IiwiX3NwbGl0IiwiX3JlbW92ZURvdFNlZ21lbnRzIiwiX2pvaW5BbmRDYW5vbmljYWxpemVQYXRoIiwiX3Jlc29sdmVVcmwiLCJYSFIiLCJYSFIuY29uc3RydWN0b3IiLCJYSFIuZ2V0IiwiX2NyZWF0ZUNoYW5nZURldGVjdG9yR2VuQ29uZmlnIiwiUnVudGltZUNvbXBpbGVyIiwiUnVudGltZUNvbXBpbGVyLmNvbnN0cnVjdG9yIiwiUnVudGltZUNvbXBpbGVyXyIsIlJ1bnRpbWVDb21waWxlcl8uY29uc3RydWN0b3IiLCJSdW50aW1lQ29tcGlsZXJfLmNvbXBpbGVJbkhvc3QiLCJSdW50aW1lQ29tcGlsZXJfLmNsZWFyQ2FjaGUiLCJUZW1wbGF0ZUNvbXBpbGVyIiwiVGVtcGxhdGVDb21waWxlci5jb25zdHJ1Y3RvciIsIlRlbXBsYXRlQ29tcGlsZXIubm9ybWFsaXplRGlyZWN0aXZlTWV0YWRhdGEiLCJUZW1wbGF0ZUNvbXBpbGVyLmNvbXBpbGVIb3N0Q29tcG9uZW50UnVudGltZSIsIlRlbXBsYXRlQ29tcGlsZXIuY2xlYXJDYWNoZSIsIlRlbXBsYXRlQ29tcGlsZXIuX2NvbXBpbGVDb21wb25lbnRSdW50aW1lIiwiVGVtcGxhdGVDb21waWxlci5fY29tcGlsZUNvbW1hbmRzUnVudGltZSIsIlRlbXBsYXRlQ29tcGlsZXIuY29tcGlsZVRlbXBsYXRlc0NvZGVHZW4iLCJUZW1wbGF0ZUNvbXBpbGVyLmNvbXBpbGVTdHlsZXNoZWV0Q29kZUdlbiIsIlRlbXBsYXRlQ29tcGlsZXIuX3Byb2Nlc3NUZW1wbGF0ZUNvZGVHZW4iLCJOb3JtYWxpemVkQ29tcG9uZW50V2l0aFZpZXdEaXJlY3RpdmVzIiwiTm9ybWFsaXplZENvbXBvbmVudFdpdGhWaWV3RGlyZWN0aXZlcy5jb25zdHJ1Y3RvciIsImFzc2VydENvbXBvbmVudCIsInRlbXBsYXRlVmFyaWFibGVOYW1lIiwidGVtcGxhdGVHZXR0ZXJOYW1lIiwidGVtcGxhdGVNb2R1bGVVcmwiLCJhZGRBbGwiLCJjb2RlR2VuQ29tcG9uZW50VGVtcGxhdGVGYWN0b3J5IiwicmVtb3ZlRHVwbGljYXRlcyIsIkNvbXBpbGVUeXBlTWV0YWRhdGEiLCJDb21waWxlVHlwZU1ldGFkYXRhLmNvbnN0cnVjdG9yIiwiQ29tcGlsZVR5cGVNZXRhZGF0YS5mcm9tSnNvbiIsIkNvbXBpbGVUeXBlTWV0YWRhdGEudG9Kc29uIiwiQ29tcGlsZVRlbXBsYXRlTWV0YWRhdGEiLCJDb21waWxlVGVtcGxhdGVNZXRhZGF0YS5jb25zdHJ1Y3RvciIsIkNvbXBpbGVUZW1wbGF0ZU1ldGFkYXRhLmZyb21Kc29uIiwiQ29tcGlsZVRlbXBsYXRlTWV0YWRhdGEudG9Kc29uIiwiQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhIiwiQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhLmNvbnN0cnVjdG9yIiwiQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhLmNyZWF0ZSIsIkNvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YS5mcm9tSnNvbiIsIkNvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YS50b0pzb24iLCJjcmVhdGVIb3N0Q29tcG9uZW50TWV0YSIsIkNzc1NlbGVjdG9yIiwiQ3NzU2VsZWN0b3IuY29uc3RydWN0b3IiLCJDc3NTZWxlY3Rvci5wYXJzZSIsIkNzc1NlbGVjdG9yLmlzRWxlbWVudFNlbGVjdG9yIiwiQ3NzU2VsZWN0b3Iuc2V0RWxlbWVudCIsIkNzc1NlbGVjdG9yLmdldE1hdGNoaW5nRWxlbWVudFRlbXBsYXRlIiwiQ3NzU2VsZWN0b3IuYWRkQXR0cmlidXRlIiwiQ3NzU2VsZWN0b3IuYWRkQ2xhc3NOYW1lIiwiQ3NzU2VsZWN0b3IudG9TdHJpbmciLCJTZWxlY3Rvck1hdGNoZXIiLCJTZWxlY3Rvck1hdGNoZXIuY29uc3RydWN0b3IiLCJTZWxlY3Rvck1hdGNoZXIuY3JlYXRlTm90TWF0Y2hlciIsIlNlbGVjdG9yTWF0Y2hlci5hZGRTZWxlY3RhYmxlcyIsIlNlbGVjdG9yTWF0Y2hlci5fYWRkU2VsZWN0YWJsZSIsIlNlbGVjdG9yTWF0Y2hlci5fYWRkVGVybWluYWwiLCJTZWxlY3Rvck1hdGNoZXIuX2FkZFBhcnRpYWwiLCJTZWxlY3Rvck1hdGNoZXIubWF0Y2giLCJTZWxlY3Rvck1hdGNoZXIuX21hdGNoVGVybWluYWwiLCJTZWxlY3Rvck1hdGNoZXIuX21hdGNoUGFydGlhbCIsIlNlbGVjdG9yTGlzdENvbnRleHQiLCJTZWxlY3Rvckxpc3RDb250ZXh0LmNvbnN0cnVjdG9yIiwiU2VsZWN0b3JDb250ZXh0IiwiU2VsZWN0b3JDb250ZXh0LmNvbnN0cnVjdG9yIiwiU2VsZWN0b3JDb250ZXh0LmZpbmFsaXplIiwiZXNjYXBlU2luZ2xlUXVvdGVTdHJpbmciLCJlc2NhcGVEb3VibGVRdW90ZVN0cmluZyIsImVzY2FwZVN0cmluZyIsImNvZGVHZW5FeHBvcnRWYXJpYWJsZSIsImNvZGVHZW5Db25zdENvbnN0cnVjdG9yQ2FsbCIsImNvZGVHZW5WYWx1ZUZuIiwiY29kZUdlblRvU3RyaW5nIiwic3BsaXRBdENvbG9uIiwibW9kdWxlUmVmIiwiU291cmNlTW9kdWxlIiwiU291cmNlTW9kdWxlLmNvbnN0cnVjdG9yIiwiU291cmNlTW9kdWxlLmdldFNvdXJjZVdpdGhJbXBvcnRzIiwiU291cmNlRXhwcmVzc2lvbiIsIlNvdXJjZUV4cHJlc3Npb24uY29uc3RydWN0b3IiLCJTb3VyY2VFeHByZXNzaW9ucyIsIlNvdXJjZUV4cHJlc3Npb25zLmNvbnN0cnVjdG9yIiwiU291cmNlV2l0aEltcG9ydHMiLCJTb3VyY2VXaXRoSW1wb3J0cy5jb25zdHJ1Y3RvciIsIkNoYW5nZURldGVjdGlvbkNvbXBpbGVyIiwiQ2hhbmdlRGV0ZWN0aW9uQ29tcGlsZXIuY29uc3RydWN0b3IiLCJDaGFuZ2VEZXRlY3Rpb25Db21waWxlci5jb21waWxlQ29tcG9uZW50UnVudGltZSIsIkNoYW5nZURldGVjdGlvbkNvbXBpbGVyLl9jcmVhdGVDaGFuZ2VEZXRlY3RvckZhY3RvcnkiLCJDaGFuZ2VEZXRlY3Rpb25Db21waWxlci5jb21waWxlQ29tcG9uZW50Q29kZUdlbiIsImNyZWF0ZUNoYW5nZURldGVjdG9yRGVmaW5pdGlvbnMiLCJQcm90b1ZpZXdWaXNpdG9yIiwiUHJvdG9WaWV3VmlzaXRvci5jb25zdHJ1Y3RvciIsIlByb3RvVmlld1Zpc2l0b3IudmlzaXRFbWJlZGRlZFRlbXBsYXRlIiwiUHJvdG9WaWV3VmlzaXRvci52aXNpdEVsZW1lbnQiLCJQcm90b1ZpZXdWaXNpdG9yLnZpc2l0TmdDb250ZW50IiwiUHJvdG9WaWV3VmlzaXRvci52aXNpdFZhcmlhYmxlIiwiUHJvdG9WaWV3VmlzaXRvci52aXNpdEV2ZW50IiwiUHJvdG9WaWV3VmlzaXRvci52aXNpdEVsZW1lbnRQcm9wZXJ0eSIsIlByb3RvVmlld1Zpc2l0b3IudmlzaXRBdHRyIiwiUHJvdG9WaWV3VmlzaXRvci52aXNpdEJvdW5kVGV4dCIsIlByb3RvVmlld1Zpc2l0b3IudmlzaXRUZXh0IiwiUHJvdG9WaWV3VmlzaXRvci52aXNpdERpcmVjdGl2ZSIsIlByb3RvVmlld1Zpc2l0b3IudmlzaXREaXJlY3RpdmVQcm9wZXJ0eSIsImNyZWF0ZUNoYW5nZURlZmluaXRpb25zIiwiX2NvbGxlY3ROZXN0ZWRQcm90b1ZpZXdzVmFyaWFibGVOYW1lcyIsIlRleHRBc3QiLCJUZXh0QXN0LmNvbnN0cnVjdG9yIiwiVGV4dEFzdC52aXNpdCIsIkJvdW5kVGV4dEFzdCIsIkJvdW5kVGV4dEFzdC5jb25zdHJ1Y3RvciIsIkJvdW5kVGV4dEFzdC52aXNpdCIsIkF0dHJBc3QiLCJBdHRyQXN0LmNvbnN0cnVjdG9yIiwiQXR0ckFzdC52aXNpdCIsIkJvdW5kRWxlbWVudFByb3BlcnR5QXN0IiwiQm91bmRFbGVtZW50UHJvcGVydHlBc3QuY29uc3RydWN0b3IiLCJCb3VuZEVsZW1lbnRQcm9wZXJ0eUFzdC52aXNpdCIsIkJvdW5kRXZlbnRBc3QiLCJCb3VuZEV2ZW50QXN0LmNvbnN0cnVjdG9yIiwiQm91bmRFdmVudEFzdC52aXNpdCIsIkJvdW5kRXZlbnRBc3QuZnVsbE5hbWUiLCJWYXJpYWJsZUFzdCIsIlZhcmlhYmxlQXN0LmNvbnN0cnVjdG9yIiwiVmFyaWFibGVBc3QudmlzaXQiLCJFbGVtZW50QXN0IiwiRWxlbWVudEFzdC5jb25zdHJ1Y3RvciIsIkVsZW1lbnRBc3QudmlzaXQiLCJFbGVtZW50QXN0LmlzQm91bmQiLCJFbGVtZW50QXN0LmdldENvbXBvbmVudCIsIkVtYmVkZGVkVGVtcGxhdGVBc3QiLCJFbWJlZGRlZFRlbXBsYXRlQXN0LmNvbnN0cnVjdG9yIiwiRW1iZWRkZWRUZW1wbGF0ZUFzdC52aXNpdCIsIkJvdW5kRGlyZWN0aXZlUHJvcGVydHlBc3QiLCJCb3VuZERpcmVjdGl2ZVByb3BlcnR5QXN0LmNvbnN0cnVjdG9yIiwiQm91bmREaXJlY3RpdmVQcm9wZXJ0eUFzdC52aXNpdCIsIkRpcmVjdGl2ZUFzdCIsIkRpcmVjdGl2ZUFzdC5jb25zdHJ1Y3RvciIsIkRpcmVjdGl2ZUFzdC52aXNpdCIsIk5nQ29udGVudEFzdCIsIk5nQ29udGVudEFzdC5jb25zdHJ1Y3RvciIsIk5nQ29udGVudEFzdC52aXNpdCIsIlByb3BlcnR5QmluZGluZ1R5cGUiLCJ0ZW1wbGF0ZVZpc2l0QWxsIiwiQ29kZWdlbiIsIkNvZGVnZW4uY29uc3RydWN0b3IiLCJDb2RlZ2VuLmdlbmVyYXRlIiwiQ29kZWdlbi50b1N0cmluZyIsIlN0eWxlQ29tcGlsZXIiLCJTdHlsZUNvbXBpbGVyLmNvbnN0cnVjdG9yIiwiU3R5bGVDb21waWxlci5jb21waWxlQ29tcG9uZW50UnVudGltZSIsIlN0eWxlQ29tcGlsZXIuY29tcGlsZUNvbXBvbmVudENvZGVHZW4iLCJTdHlsZUNvbXBpbGVyLmNvbXBpbGVTdHlsZXNoZWV0Q29kZUdlbiIsIlN0eWxlQ29tcGlsZXIuY2xlYXJDYWNoZSIsIlN0eWxlQ29tcGlsZXIuX2xvYWRTdHlsZXMiLCJTdHlsZUNvbXBpbGVyLl9zdHlsZUNvZGVHZW4iLCJTdHlsZUNvbXBpbGVyLl9zdHlsZU1vZHVsZSIsIlN0eWxlQ29tcGlsZXIuX3NoaW1JZk5lZWRlZCIsIlN0eWxlQ29tcGlsZXIuX2NyZWF0ZU1vZHVsZVVybCIsIlNoYWRvd0NzcyIsIlNoYWRvd0Nzcy5jb25zdHJ1Y3RvciIsIlNoYWRvd0Nzcy5zaGltQ3NzVGV4dCIsIlNoYWRvd0Nzcy5faW5zZXJ0RGlyZWN0aXZlcyIsIlNoYWRvd0Nzcy5faW5zZXJ0UG9seWZpbGxEaXJlY3RpdmVzSW5Dc3NUZXh0IiwiU2hhZG93Q3NzLl9pbnNlcnRQb2x5ZmlsbFJ1bGVzSW5Dc3NUZXh0IiwiU2hhZG93Q3NzLl9zY29wZUNzc1RleHQiLCJTaGFkb3dDc3MuX2V4dHJhY3RVbnNjb3BlZFJ1bGVzRnJvbUNzc1RleHQiLCJTaGFkb3dDc3MuX2NvbnZlcnRDb2xvbkhvc3QiLCJTaGFkb3dDc3MuX2NvbnZlcnRDb2xvbkhvc3RDb250ZXh0IiwiU2hhZG93Q3NzLl9jb252ZXJ0Q29sb25SdWxlIiwiU2hhZG93Q3NzLl9jb2xvbkhvc3RDb250ZXh0UGFydFJlcGxhY2VyIiwiU2hhZG93Q3NzLl9jb2xvbkhvc3RQYXJ0UmVwbGFjZXIiLCJTaGFkb3dDc3MuX2NvbnZlcnRTaGFkb3dET01TZWxlY3RvcnMiLCJTaGFkb3dDc3MuX3Njb3BlU2VsZWN0b3JzIiwiU2hhZG93Q3NzLl9zY29wZVNlbGVjdG9yIiwiU2hhZG93Q3NzLl9zZWxlY3Rvck5lZWRzU2NvcGluZyIsIlNoYWRvd0Nzcy5fbWFrZVNjb3BlTWF0Y2hlciIsIlNoYWRvd0Nzcy5fYXBwbHlTZWxlY3RvclNjb3BlIiwiU2hhZG93Q3NzLl9hcHBseVNpbXBsZVNlbGVjdG9yU2NvcGUiLCJTaGFkb3dDc3MuX2FwcGx5U3RyaWN0U2VsZWN0b3JTY29wZSIsIlNoYWRvd0Nzcy5faW5zZXJ0UG9seWZpbGxIb3N0SW5Dc3NUZXh0Iiwic3RyaXBDb21tZW50cyIsIkNzc1J1bGUiLCJDc3NSdWxlLmNvbnN0cnVjdG9yIiwicHJvY2Vzc1J1bGVzIiwiU3RyaW5nV2l0aEVzY2FwZWRCbG9ja3MiLCJTdHJpbmdXaXRoRXNjYXBlZEJsb2Nrcy5jb25zdHJ1Y3RvciIsImVzY2FwZUJsb2NrcyIsIlN0eWxlV2l0aEltcG9ydHMiLCJTdHlsZVdpdGhJbXBvcnRzLmNvbnN0cnVjdG9yIiwiaXNTdHlsZVVybFJlc29sdmFibGUiLCJleHRyYWN0U3R5bGVVcmxzIiwiZW5jYXBzdWxhdGVTdHlsZXMiLCJjcmVhdGVSZW5kZXJWaWV3IiwiQnVpbGRDb250ZXh0IiwiQnVpbGRDb250ZXh0LmNvbnN0cnVjdG9yIiwiQnVpbGRDb250ZXh0LmJ1aWxkIiwiQnVpbGRDb250ZXh0Ll9idWlsZCIsIkJ1aWxkQ29udGV4dC5lbnF1ZXVlQ29tcG9uZW50QnVpbGRlciIsIkJ1aWxkQ29udGV4dC5lbnF1ZXVlRnJhZ21lbnRCdWlsZGVyIiwiQnVpbGRDb250ZXh0LmVucXVldWVSb290QnVpbGRlciIsIkJ1aWxkQ29udGV4dC5jb25zdW1lSW5wbGFjZUVsZW1lbnQiLCJCdWlsZENvbnRleHQuYWRkRXZlbnRMaXN0ZW5lciIsImNyZWF0ZUV2ZW50SGFuZGxlciIsImNyZWF0ZUdsb2JhbEV2ZW50QWRkZXIiLCJSZW5kZXJWaWV3QnVpbGRlciIsIlJlbmRlclZpZXdCdWlsZGVyLmNvbnN0cnVjdG9yIiwiUmVuZGVyVmlld0J1aWxkZXIuYnVpbGQiLCJSZW5kZXJWaWV3QnVpbGRlci5wYXJlbnQiLCJSZW5kZXJWaWV3QnVpbGRlci52aXNpdFRleHQiLCJSZW5kZXJWaWV3QnVpbGRlci52aXNpdE5nQ29udGVudCIsIlJlbmRlclZpZXdCdWlsZGVyLnZpc2l0QmVnaW5FbGVtZW50IiwiUmVuZGVyVmlld0J1aWxkZXIudmlzaXRFbmRFbGVtZW50IiwiUmVuZGVyVmlld0J1aWxkZXIudmlzaXRCZWdpbkNvbXBvbmVudCIsIlJlbmRlclZpZXdCdWlsZGVyLnZpc2l0RW5kQ29tcG9uZW50IiwiUmVuZGVyVmlld0J1aWxkZXIudmlzaXRFbWJlZGRlZFRlbXBsYXRlIiwiUmVuZGVyVmlld0J1aWxkZXIuX2JlZ2luRWxlbWVudCIsIlJlbmRlclZpZXdCdWlsZGVyLl9lbmRFbGVtZW50IiwiUmVuZGVyVmlld0J1aWxkZXIuX2FkZENoaWxkIiwiQ29tcG9uZW50IiwiQ29tcG9uZW50LmNvbnN0cnVjdG9yIiwiQ29tcG9uZW50LmFkZENvbnRlbnROb2RlIiwiQ29tcG9uZW50LnByb2plY3QiLCJfc2hpbUNvbnRlbnRBdHRyaWJ1dGUiLCJfc2hpbUhvc3RBdHRyaWJ1dGUiLCJEZWZhdWx0UHJvdG9WaWV3UmVmIiwiRGVmYXVsdFByb3RvVmlld1JlZi5jb25zdHJ1Y3RvciIsIkRlZmF1bHRSZW5kZXJGcmFnbWVudFJlZiIsIkRlZmF1bHRSZW5kZXJGcmFnbWVudFJlZi5jb25zdHJ1Y3RvciIsIkRlZmF1bHRSZW5kZXJWaWV3IiwiRGVmYXVsdFJlbmRlclZpZXcuY29uc3RydWN0b3IiLCJEZWZhdWx0UmVuZGVyVmlldy5oeWRyYXRlIiwiRGVmYXVsdFJlbmRlclZpZXcuZGVoeWRyYXRlIiwiRGVmYXVsdFJlbmRlclZpZXcuc2V0RXZlbnREaXNwYXRjaGVyIiwiRGVmYXVsdFJlbmRlclZpZXcuZGlzcGF0Y2hSZW5kZXJFdmVudCIsIkNvbW1hbmRDb21waWxlciIsIkNvbW1hbmRDb21waWxlci5jb25zdHJ1Y3RvciIsIkNvbW1hbmRDb21waWxlci5jb21waWxlQ29tcG9uZW50UnVudGltZSIsIkNvbW1hbmRDb21waWxlci5jb21waWxlQ29tcG9uZW50Q29kZUdlbiIsIlJ1bnRpbWVDb21tYW5kRmFjdG9yeSIsIlJ1bnRpbWVDb21tYW5kRmFjdG9yeS5jb25zdHJ1Y3RvciIsIlJ1bnRpbWVDb21tYW5kRmFjdG9yeS5fbWFwRGlyZWN0aXZlcyIsIlJ1bnRpbWVDb21tYW5kRmFjdG9yeS5jcmVhdGVUZXh0IiwiUnVudGltZUNvbW1hbmRGYWN0b3J5LmNyZWF0ZU5nQ29udGVudCIsIlJ1bnRpbWVDb21tYW5kRmFjdG9yeS5jcmVhdGVCZWdpbkVsZW1lbnQiLCJSdW50aW1lQ29tbWFuZEZhY3RvcnkuY3JlYXRlRW5kRWxlbWVudCIsIlJ1bnRpbWVDb21tYW5kRmFjdG9yeS5jcmVhdGVCZWdpbkNvbXBvbmVudCIsIlJ1bnRpbWVDb21tYW5kRmFjdG9yeS5jcmVhdGVFbmRDb21wb25lbnQiLCJSdW50aW1lQ29tbWFuZEZhY3RvcnkuY3JlYXRlRW1iZWRkZWRUZW1wbGF0ZSIsIkNvZGVnZW5Db21tYW5kRmFjdG9yeSIsIkNvZGVnZW5Db21tYW5kRmFjdG9yeS5jb25zdHJ1Y3RvciIsIkNvZGVnZW5Db21tYW5kRmFjdG9yeS5jcmVhdGVUZXh0IiwiQ29kZWdlbkNvbW1hbmRGYWN0b3J5LmNyZWF0ZU5nQ29udGVudCIsIkNvZGVnZW5Db21tYW5kRmFjdG9yeS5jcmVhdGVCZWdpbkVsZW1lbnQiLCJDb2RlZ2VuQ29tbWFuZEZhY3RvcnkuY3JlYXRlRW5kRWxlbWVudCIsIkNvZGVnZW5Db21tYW5kRmFjdG9yeS5jcmVhdGVCZWdpbkNvbXBvbmVudCIsIkNvZGVnZW5Db21tYW5kRmFjdG9yeS5jcmVhdGVFbmRDb21wb25lbnQiLCJDb2RlZ2VuQ29tbWFuZEZhY3RvcnkuY3JlYXRlRW1iZWRkZWRUZW1wbGF0ZSIsInZpc2l0QW5kUmV0dXJuQ29udGV4dCIsIkNvbW1hbmRCdWlsZGVyVmlzaXRvciIsIkNvbW1hbmRCdWlsZGVyVmlzaXRvci5jb25zdHJ1Y3RvciIsIkNvbW1hbmRCdWlsZGVyVmlzaXRvci5fcmVhZEF0dHJOYW1lQW5kVmFsdWVzIiwiQ29tbWFuZEJ1aWxkZXJWaXNpdG9yLnZpc2l0TmdDb250ZW50IiwiQ29tbWFuZEJ1aWxkZXJWaXNpdG9yLnZpc2l0RW1iZWRkZWRUZW1wbGF0ZSIsIkNvbW1hbmRCdWlsZGVyVmlzaXRvci52aXNpdEVsZW1lbnQiLCJDb21tYW5kQnVpbGRlclZpc2l0b3IudmlzaXRWYXJpYWJsZSIsIkNvbW1hbmRCdWlsZGVyVmlzaXRvci52aXNpdEF0dHIiLCJDb21tYW5kQnVpbGRlclZpc2l0b3IudmlzaXRCb3VuZFRleHQiLCJDb21tYW5kQnVpbGRlclZpc2l0b3IudmlzaXRUZXh0IiwiQ29tbWFuZEJ1aWxkZXJWaXNpdG9yLnZpc2l0RGlyZWN0aXZlIiwiQ29tbWFuZEJ1aWxkZXJWaXNpdG9yLnZpc2l0RXZlbnQiLCJDb21tYW5kQnVpbGRlclZpc2l0b3IudmlzaXREaXJlY3RpdmVQcm9wZXJ0eSIsIkNvbW1hbmRCdWlsZGVyVmlzaXRvci52aXNpdEVsZW1lbnRQcm9wZXJ0eSIsInJlbW92ZUtleVZhbHVlQXJyYXlEdXBsaWNhdGVzIiwia2V5VmFsdWVBcnJheVRvTWFwIiwibWFwVG9LZXlWYWx1ZUFycmF5IiwibWVyZ2VBdHRyaWJ1dGVWYWx1ZSIsIkRpcmVjdGl2ZUNvbnRleHQiLCJEaXJlY3RpdmVDb250ZXh0LmNvbnN0cnVjdG9yIiwiRXhwcmVzc2lvbiIsIkV4cHJlc3Npb24uY29uc3RydWN0b3IiLCJlc2NhcGVWYWx1ZSIsImNvZGVHZW5BcnJheSIsImNvZGVHZW5EaXJlY3RpdmVzQXJyYXkiLCJjb2RlR2VuVmlld0VuY2Fwc3VsYXRpb24iLCJUZW1wbGF0ZVBhcnNlRXJyb3IiLCJUZW1wbGF0ZVBhcnNlRXJyb3IuY29uc3RydWN0b3IiLCJUZW1wbGF0ZVBhcnNlciIsIlRlbXBsYXRlUGFyc2VyLmNvbnN0cnVjdG9yIiwiVGVtcGxhdGVQYXJzZXIucGFyc2UiLCJUZW1wbGF0ZVBhcnNlVmlzaXRvciIsIlRlbXBsYXRlUGFyc2VWaXNpdG9yLmNvbnN0cnVjdG9yIiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IuX3JlcG9ydEVycm9yIiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IuX3BhcnNlSW50ZXJwb2xhdGlvbiIsIlRlbXBsYXRlUGFyc2VWaXNpdG9yLl9wYXJzZUFjdGlvbiIsIlRlbXBsYXRlUGFyc2VWaXNpdG9yLl9wYXJzZUJpbmRpbmciLCJUZW1wbGF0ZVBhcnNlVmlzaXRvci5fcGFyc2VUZW1wbGF0ZUJpbmRpbmdzIiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IudmlzaXRUZXh0IiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IudmlzaXRBdHRyIiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IudmlzaXRFbGVtZW50IiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IuX3BhcnNlSW5saW5lVGVtcGxhdGVCaW5kaW5nIiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IuX3BhcnNlQXR0ciIsIlRlbXBsYXRlUGFyc2VWaXNpdG9yLl9ub3JtYWxpemVBdHRyaWJ1dGVOYW1lIiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IuX3BhcnNlVmFyaWFibGUiLCJUZW1wbGF0ZVBhcnNlVmlzaXRvci5fcGFyc2VQcm9wZXJ0eSIsIlRlbXBsYXRlUGFyc2VWaXNpdG9yLl9wYXJzZVByb3BlcnR5SW50ZXJwb2xhdGlvbiIsIlRlbXBsYXRlUGFyc2VWaXNpdG9yLl9wYXJzZVByb3BlcnR5QXN0IiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IuX3BhcnNlQXNzaWdubWVudEV2ZW50IiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IuX3BhcnNlRXZlbnQiLCJUZW1wbGF0ZVBhcnNlVmlzaXRvci5fcGFyc2VMaXRlcmFsQXR0ciIsIlRlbXBsYXRlUGFyc2VWaXNpdG9yLl9wYXJzZURpcmVjdGl2ZXMiLCJUZW1wbGF0ZVBhcnNlVmlzaXRvci5fY3JlYXRlRGlyZWN0aXZlQXN0cyIsIlRlbXBsYXRlUGFyc2VWaXNpdG9yLl9jcmVhdGVEaXJlY3RpdmVIb3N0UHJvcGVydHlBc3RzIiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IuX2NyZWF0ZURpcmVjdGl2ZUhvc3RFdmVudEFzdHMiLCJUZW1wbGF0ZVBhcnNlVmlzaXRvci5fY3JlYXRlRGlyZWN0aXZlUHJvcGVydHlBc3RzIiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IuX2NyZWF0ZUVsZW1lbnRQcm9wZXJ0eUFzdHMiLCJUZW1wbGF0ZVBhcnNlVmlzaXRvci5fY3JlYXRlRWxlbWVudFByb3BlcnR5QXN0IiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IuX2ZpbmRDb21wb25lbnREaXJlY3RpdmVOYW1lcyIsIlRlbXBsYXRlUGFyc2VWaXNpdG9yLl9hc3NlcnRPbmx5T25lQ29tcG9uZW50IiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IuX2Fzc2VydE5vQ29tcG9uZW50c05vckVsZW1lbnRCaW5kaW5nc09uVGVtcGxhdGUiLCJUZW1wbGF0ZVBhcnNlVmlzaXRvci5fYXNzZXJ0QWxsRXZlbnRzUHVibGlzaGVkQnlEaXJlY3RpdmVzIiwiTm9uQmluZGFibGVWaXNpdG9yIiwiTm9uQmluZGFibGVWaXNpdG9yLmNvbnN0cnVjdG9yIiwiTm9uQmluZGFibGVWaXNpdG9yLnZpc2l0RWxlbWVudCIsIk5vbkJpbmRhYmxlVmlzaXRvci52aXNpdEF0dHIiLCJOb25CaW5kYWJsZVZpc2l0b3IudmlzaXRUZXh0IiwiQm91bmRFbGVtZW50T3JEaXJlY3RpdmVQcm9wZXJ0eSIsIkJvdW5kRWxlbWVudE9yRGlyZWN0aXZlUHJvcGVydHkuY29uc3RydWN0b3IiLCJzcGxpdENsYXNzZXMiLCJDb21wb25lbnQuY3JlYXRlIiwiQ29tcG9uZW50LmZpbmROZ0NvbnRlbnRJbmRleCIsImNyZWF0ZUVsZW1lbnRDc3NTZWxlY3RvciIsIkh0bWxUcmVlRXJyb3IiLCJIdG1sVHJlZUVycm9yLmNvbnN0cnVjdG9yIiwiSHRtbFRyZWVFcnJvci5jcmVhdGUiLCJIdG1sUGFyc2VUcmVlUmVzdWx0IiwiSHRtbFBhcnNlVHJlZVJlc3VsdC5jb25zdHJ1Y3RvciIsIkh0bWxQYXJzZXIiLCJIdG1sUGFyc2VyLmNvbnN0cnVjdG9yIiwiSHRtbFBhcnNlci5wYXJzZSIsIlRyZWVCdWlsZGVyIiwiVHJlZUJ1aWxkZXIuY29uc3RydWN0b3IiLCJUcmVlQnVpbGRlci5idWlsZCIsIlRyZWVCdWlsZGVyLl9hZHZhbmNlIiwiVHJlZUJ1aWxkZXIuX2FkdmFuY2VJZiIsIlRyZWVCdWlsZGVyLl9jb25zdW1lQ2RhdGEiLCJUcmVlQnVpbGRlci5fY29uc3VtZUNvbW1lbnQiLCJUcmVlQnVpbGRlci5fY29uc3VtZVRleHQiLCJUcmVlQnVpbGRlci5fY2xvc2VWb2lkRWxlbWVudCIsIlRyZWVCdWlsZGVyLl9jb25zdW1lU3RhcnRUYWciLCJUcmVlQnVpbGRlci5fcHVzaEVsZW1lbnQiLCJUcmVlQnVpbGRlci5fY29uc3VtZUVuZFRhZyIsIlRyZWVCdWlsZGVyLl9wb3BFbGVtZW50IiwiVHJlZUJ1aWxkZXIuX2NvbnN1bWVBdHRyIiwiVHJlZUJ1aWxkZXIuX2dldFBhcmVudEVsZW1lbnQiLCJUcmVlQnVpbGRlci5fYWRkVG9QYXJlbnQiLCJtZXJnZU5zQW5kTmFtZSIsImdldEVsZW1lbnRGdWxsTmFtZSIsIkh0bWxUZXh0QXN0IiwiSHRtbFRleHRBc3QuY29uc3RydWN0b3IiLCJIdG1sVGV4dEFzdC52aXNpdCIsIkh0bWxBdHRyQXN0IiwiSHRtbEF0dHJBc3QuY29uc3RydWN0b3IiLCJIdG1sQXR0ckFzdC52aXNpdCIsIkh0bWxFbGVtZW50QXN0IiwiSHRtbEVsZW1lbnRBc3QuY29uc3RydWN0b3IiLCJIdG1sRWxlbWVudEFzdC52aXNpdCIsImh0bWxWaXNpdEFsbCIsIkh0bWxUb2tlblR5cGUiLCJIdG1sVG9rZW4iLCJIdG1sVG9rZW4uY29uc3RydWN0b3IiLCJIdG1sVG9rZW5FcnJvciIsIkh0bWxUb2tlbkVycm9yLmNvbnN0cnVjdG9yIiwiSHRtbFRva2VuaXplUmVzdWx0IiwiSHRtbFRva2VuaXplUmVzdWx0LmNvbnN0cnVjdG9yIiwidG9rZW5pemVIdG1sIiwidW5leHBlY3RlZENoYXJhY3RlckVycm9yTXNnIiwidW5rbm93bkVudGl0eUVycm9yTXNnIiwiQ29udHJvbEZsb3dFcnJvciIsIkNvbnRyb2xGbG93RXJyb3IuY29uc3RydWN0b3IiLCJfSHRtbFRva2VuaXplciIsIl9IdG1sVG9rZW5pemVyLmNvbnN0cnVjdG9yIiwiX0h0bWxUb2tlbml6ZXIuX3Byb2Nlc3NDYXJyaWFnZVJldHVybnMiLCJfSHRtbFRva2VuaXplci50b2tlbml6ZSIsIl9IdG1sVG9rZW5pemVyLl9nZXRMb2NhdGlvbiIsIl9IdG1sVG9rZW5pemVyLl9iZWdpblRva2VuIiwiX0h0bWxUb2tlbml6ZXIuX2VuZFRva2VuIiwiX0h0bWxUb2tlbml6ZXIuX2NyZWF0ZUVycm9yIiwiX0h0bWxUb2tlbml6ZXIuX2FkdmFuY2UiLCJfSHRtbFRva2VuaXplci5fYXR0ZW1wdENoYXIiLCJfSHRtbFRva2VuaXplci5fcmVxdWlyZUNoYXIiLCJfSHRtbFRva2VuaXplci5fYXR0ZW1wdENoYXJzIiwiX0h0bWxUb2tlbml6ZXIuX3JlcXVpcmVDaGFycyIsIl9IdG1sVG9rZW5pemVyLl9hdHRlbXB0VW50aWxGbiIsIl9IdG1sVG9rZW5pemVyLl9yZXF1aXJlVW50aWxGbiIsIl9IdG1sVG9rZW5pemVyLl9hdHRlbXB0VW50aWxDaGFyIiwiX0h0bWxUb2tlbml6ZXIuX3JlYWRDaGFyIiwiX0h0bWxUb2tlbml6ZXIuX2RlY29kZUVudGl0eSIsIl9IdG1sVG9rZW5pemVyLl9jb25zdW1lUmF3VGV4dCIsIl9IdG1sVG9rZW5pemVyLl9jb25zdW1lQ29tbWVudCIsIl9IdG1sVG9rZW5pemVyLl9jb25zdW1lQ2RhdGEiLCJfSHRtbFRva2VuaXplci5fY29uc3VtZURvY1R5cGUiLCJfSHRtbFRva2VuaXplci5fY29uc3VtZVByZWZpeEFuZE5hbWUiLCJfSHRtbFRva2VuaXplci5fY29uc3VtZVRhZ09wZW4iLCJfSHRtbFRva2VuaXplci5fY29uc3VtZVJhd1RleHRXaXRoVGFnQ2xvc2UiLCJfSHRtbFRva2VuaXplci5fY29uc3VtZVRhZ09wZW5TdGFydCIsIl9IdG1sVG9rZW5pemVyLl9jb25zdW1lQXR0cmlidXRlTmFtZSIsIl9IdG1sVG9rZW5pemVyLl9jb25zdW1lQXR0cmlidXRlVmFsdWUiLCJfSHRtbFRva2VuaXplci5fY29uc3VtZVRhZ09wZW5FbmQiLCJfSHRtbFRva2VuaXplci5fY29uc3VtZVRhZ0Nsb3NlIiwiX0h0bWxUb2tlbml6ZXIuX2NvbnN1bWVUZXh0IiwiX0h0bWxUb2tlbml6ZXIuX3NhdmVQb3NpdGlvbiIsIl9IdG1sVG9rZW5pemVyLl9yZXN0b3JlUG9zaXRpb24iLCJpc05vdFdoaXRlc3BhY2UiLCJpc05hbWVFbmQiLCJpc1ByZWZpeEVuZCIsImlzRGlnaXRFbnRpdHlFbmQiLCJpc05hbWVkRW50aXR5RW5kIiwiaXNUZXh0RW5kIiwiaXNBc2NpaUxldHRlciIsImlzQXNjaWlIZXhEaWdpdCIsIm1lcmdlVGV4dFRva2VucyIsIlBhcnNlTG9jYXRpb24iLCJQYXJzZUxvY2F0aW9uLmNvbnN0cnVjdG9yIiwiUGFyc2VMb2NhdGlvbi50b1N0cmluZyIsIlBhcnNlU291cmNlRmlsZSIsIlBhcnNlU291cmNlRmlsZS5jb25zdHJ1Y3RvciIsIlBhcnNlRXJyb3IiLCJQYXJzZUVycm9yLmNvbnN0cnVjdG9yIiwiUGFyc2VFcnJvci50b1N0cmluZyIsIlBhcnNlU291cmNlU3BhbiIsIlBhcnNlU291cmNlU3Bhbi5jb25zdHJ1Y3RvciIsIlBhcnNlU291cmNlU3Bhbi50b1N0cmluZyIsIkh0bWxUYWdDb250ZW50VHlwZSIsIkh0bWxUYWdEZWZpbml0aW9uIiwiSHRtbFRhZ0RlZmluaXRpb24uY29uc3RydWN0b3IiLCJIdG1sVGFnRGVmaW5pdGlvbi5yZXF1aXJlRXh0cmFQYXJlbnQiLCJIdG1sVGFnRGVmaW5pdGlvbi5pc0Nsb3NlZEJ5Q2hpbGQiLCJnZXRIdG1sVGFnRGVmaW5pdGlvbiIsInNwbGl0TnNOYW1lIiwiZ2V0TnNQcmVmaXgiLCJFbGVtZW50U2NoZW1hUmVnaXN0cnkiLCJFbGVtZW50U2NoZW1hUmVnaXN0cnkuY29uc3RydWN0b3IiLCJFbGVtZW50U2NoZW1hUmVnaXN0cnkuaGFzUHJvcGVydHkiLCJFbGVtZW50U2NoZW1hUmVnaXN0cnkuZ2V0TWFwcGVkUHJvcE5hbWUiLCJwcmVwYXJzZUVsZW1lbnQiLCJQcmVwYXJzZWRFbGVtZW50VHlwZSIsIlByZXBhcnNlZEVsZW1lbnQiLCJQcmVwYXJzZWRFbGVtZW50LmNvbnN0cnVjdG9yIiwibm9ybWFsaXplTmdDb250ZW50U2VsZWN0IiwiVGVtcGxhdGVOb3JtYWxpemVyIiwiVGVtcGxhdGVOb3JtYWxpemVyLmNvbnN0cnVjdG9yIiwiVGVtcGxhdGVOb3JtYWxpemVyLm5vcm1hbGl6ZVRlbXBsYXRlIiwiVGVtcGxhdGVOb3JtYWxpemVyLm5vcm1hbGl6ZUxvYWRlZFRlbXBsYXRlIiwiVGVtcGxhdGVQcmVwYXJzZVZpc2l0b3IiLCJUZW1wbGF0ZVByZXBhcnNlVmlzaXRvci5jb25zdHJ1Y3RvciIsIlRlbXBsYXRlUHJlcGFyc2VWaXNpdG9yLnZpc2l0RWxlbWVudCIsIlRlbXBsYXRlUHJlcGFyc2VWaXNpdG9yLnZpc2l0QXR0ciIsIlRlbXBsYXRlUHJlcGFyc2VWaXNpdG9yLnZpc2l0VGV4dCIsIlJ1bnRpbWVNZXRhZGF0YVJlc29sdmVyIiwiUnVudGltZU1ldGFkYXRhUmVzb2x2ZXIuY29uc3RydWN0b3IiLCJSdW50aW1lTWV0YWRhdGFSZXNvbHZlci5nZXRNZXRhZGF0YSIsIlJ1bnRpbWVNZXRhZGF0YVJlc29sdmVyLmdldFZpZXdEaXJlY3RpdmVzTWV0YWRhdGEiLCJmbGF0dGVuRGlyZWN0aXZlcyIsImZsYXR0ZW5BcnJheSIsImlzVmFsaWREaXJlY3RpdmUiLCJjYWxjTW9kdWxlVXJsIiwiRG9tRWxlbWVudFNjaGVtYVJlZ2lzdHJ5IiwiRG9tRWxlbWVudFNjaGVtYVJlZ2lzdHJ5LmNvbnN0cnVjdG9yIiwiRG9tRWxlbWVudFNjaGVtYVJlZ2lzdHJ5Ll9nZXRQcm90b0VsZW1lbnQiLCJEb21FbGVtZW50U2NoZW1hUmVnaXN0cnkuaGFzUHJvcGVydHkiLCJEb21FbGVtZW50U2NoZW1hUmVnaXN0cnkuZ2V0TWFwcGVkUHJvcE5hbWUiLCJzZXRSb290RG9tQWRhcHRlciIsIkRvbUFkYXB0ZXIiLCJEb21BZGFwdGVyLmNvbnN0cnVjdG9yIiwiYm9vdHN0cmFwIiwiQW5ndWxhckVudHJ5cG9pbnQiLCJBbmd1bGFyRW50cnlwb2ludC5jb25zdHJ1Y3RvciIsIl9leGNlcHRpb25IYW5kbGVyIiwiX2RvY3VtZW50IiwiaW5pdERvbUFkYXB0ZXIiLCJEb21FdmVudHNQbHVnaW4iLCJEb21FdmVudHNQbHVnaW4uY29uc3RydWN0b3IiLCJEb21FdmVudHNQbHVnaW4uc3VwcG9ydHMiLCJEb21FdmVudHNQbHVnaW4uYWRkRXZlbnRMaXN0ZW5lciIsIkRvbUV2ZW50c1BsdWdpbi5hZGRHbG9iYWxFdmVudExpc3RlbmVyIiwiRXZlbnRNYW5hZ2VyIiwiRXZlbnRNYW5hZ2VyLmNvbnN0cnVjdG9yIiwiRXZlbnRNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIiLCJFdmVudE1hbmFnZXIuYWRkR2xvYmFsRXZlbnRMaXN0ZW5lciIsIkV2ZW50TWFuYWdlci5nZXRab25lIiwiRXZlbnRNYW5hZ2VyLl9maW5kUGx1Z2luRm9yIiwiRXZlbnRNYW5hZ2VyUGx1Z2luIiwiRXZlbnRNYW5hZ2VyUGx1Z2luLmNvbnN0cnVjdG9yIiwiRXZlbnRNYW5hZ2VyUGx1Z2luLnN1cHBvcnRzIiwiRXZlbnRNYW5hZ2VyUGx1Z2luLmFkZEV2ZW50TGlzdGVuZXIiLCJFdmVudE1hbmFnZXJQbHVnaW4uYWRkR2xvYmFsRXZlbnRMaXN0ZW5lciIsIktleUV2ZW50c1BsdWdpbiIsIktleUV2ZW50c1BsdWdpbi5jb25zdHJ1Y3RvciIsIktleUV2ZW50c1BsdWdpbi5zdXBwb3J0cyIsIktleUV2ZW50c1BsdWdpbi5hZGRFdmVudExpc3RlbmVyIiwiS2V5RXZlbnRzUGx1Z2luLnBhcnNlRXZlbnROYW1lIiwiS2V5RXZlbnRzUGx1Z2luLmdldEV2ZW50RnVsbEtleSIsIktleUV2ZW50c1BsdWdpbi5ldmVudENhbGxiYWNrIiwiS2V5RXZlbnRzUGx1Z2luLl9ub3JtYWxpemVLZXkiLCJIYW1tZXJHZXN0dXJlc1BsdWdpbiIsIkhhbW1lckdlc3R1cmVzUGx1Z2luLmNvbnN0cnVjdG9yIiwiSGFtbWVyR2VzdHVyZXNQbHVnaW4uc3VwcG9ydHMiLCJIYW1tZXJHZXN0dXJlc1BsdWdpbi5hZGRFdmVudExpc3RlbmVyIiwiSGFtbWVyR2VzdHVyZXNQbHVnaW5Db21tb24iLCJIYW1tZXJHZXN0dXJlc1BsdWdpbkNvbW1vbi5jb25zdHJ1Y3RvciIsIkhhbW1lckdlc3R1cmVzUGx1Z2luQ29tbW9uLnN1cHBvcnRzIiwiRG9tUmVuZGVyZXIiLCJEb21SZW5kZXJlci5jb25zdHJ1Y3RvciIsIkRvbVJlbmRlcmVyLmdldE5hdGl2ZUVsZW1lbnRTeW5jIiwiRG9tUmVuZGVyZXIuZ2V0Um9vdE5vZGVzIiwiRG9tUmVuZGVyZXIuYXR0YWNoRnJhZ21lbnRBZnRlckZyYWdtZW50IiwiRG9tUmVuZGVyZXIuYW5pbWF0ZU5vZGVzRW50ZXIiLCJEb21SZW5kZXJlci5hdHRhY2hGcmFnbWVudEFmdGVyRWxlbWVudCIsIkRvbVJlbmRlcmVyLmh5ZHJhdGVWaWV3IiwiRG9tUmVuZGVyZXIuZGVoeWRyYXRlVmlldyIsIkRvbVJlbmRlcmVyLmNyZWF0ZVRlbXBsYXRlQW5jaG9yIiwiRG9tUmVuZGVyZXIuY3JlYXRlVGV4dCIsIkRvbVJlbmRlcmVyLmFwcGVuZENoaWxkIiwiRG9tUmVuZGVyZXIuc2V0RWxlbWVudFByb3BlcnR5IiwiRG9tUmVuZGVyZXIuc2V0RWxlbWVudEF0dHJpYnV0ZSIsIkRvbVJlbmRlcmVyLnNldEJpbmRpbmdEZWJ1Z0luZm8iLCJEb21SZW5kZXJlci5zZXRFbGVtZW50Q2xhc3MiLCJEb21SZW5kZXJlci5zZXRFbGVtZW50U3R5bGUiLCJEb21SZW5kZXJlci5pbnZva2VFbGVtZW50TWV0aG9kIiwiRG9tUmVuZGVyZXIuc2V0VGV4dCIsIkRvbVJlbmRlcmVyLnNldEV2ZW50RGlzcGF0Y2hlciIsIkRvbVJlbmRlcmVyXyIsIkRvbVJlbmRlcmVyXy5jb25zdHJ1Y3RvciIsIkRvbVJlbmRlcmVyXy5yZWdpc3RlckNvbXBvbmVudFRlbXBsYXRlIiwiRG9tUmVuZGVyZXJfLmNyZWF0ZVByb3RvVmlldyIsIkRvbVJlbmRlcmVyXy5yZXNvbHZlQ29tcG9uZW50VGVtcGxhdGUiLCJEb21SZW5kZXJlcl8uY3JlYXRlUm9vdEhvc3RWaWV3IiwiRG9tUmVuZGVyZXJfLmNyZWF0ZVZpZXciLCJEb21SZW5kZXJlcl8uX2NyZWF0ZVZpZXciLCJEb21SZW5kZXJlcl8uZGVzdHJveVZpZXciLCJEb21SZW5kZXJlcl8uYW5pbWF0ZU5vZGVFbnRlciIsIkRvbVJlbmRlcmVyXy5hbmltYXRlTm9kZUxlYXZlIiwiRG9tUmVuZGVyZXJfLmRldGFjaEZyYWdtZW50IiwiRG9tUmVuZGVyZXJfLmNyZWF0ZUVsZW1lbnQiLCJEb21SZW5kZXJlcl8ubWVyZ2VFbGVtZW50IiwiRG9tUmVuZGVyZXJfLl9zZXRBdHRyaWJ1dGVzIiwiRG9tUmVuZGVyZXJfLmNyZWF0ZVJvb3RDb250ZW50SW5zZXJ0aW9uUG9pbnQiLCJEb21SZW5kZXJlcl8uY3JlYXRlU2hhZG93Um9vdCIsIkRvbVJlbmRlcmVyXy5vbiIsIkRvbVJlbmRlcmVyXy5nbG9iYWxPbiIsInJlc29sdmVJbnRlcm5hbERvbVZpZXciLCJyZXNvbHZlSW50ZXJuYWxEb21GcmFnbWVudCIsIm1vdmVOb2Rlc0FmdGVyU2libGluZyIsImRlY29yYXRlUHJldmVudERlZmF1bHQiLCJzcGxpdE5hbWVzcGFjZSIsIkFuaW1hdGlvbkJ1aWxkZXIiLCJBbmltYXRpb25CdWlsZGVyLmNvbnN0cnVjdG9yIiwiQW5pbWF0aW9uQnVpbGRlci5jc3MiLCJDc3NBbmltYXRpb25CdWlsZGVyIiwiQ3NzQW5pbWF0aW9uQnVpbGRlci5jb25zdHJ1Y3RvciIsIkNzc0FuaW1hdGlvbkJ1aWxkZXIuYWRkQW5pbWF0aW9uQ2xhc3MiLCJDc3NBbmltYXRpb25CdWlsZGVyLmFkZENsYXNzIiwiQ3NzQW5pbWF0aW9uQnVpbGRlci5yZW1vdmVDbGFzcyIsIkNzc0FuaW1hdGlvbkJ1aWxkZXIuc2V0RHVyYXRpb24iLCJDc3NBbmltYXRpb25CdWlsZGVyLnNldERlbGF5IiwiQ3NzQW5pbWF0aW9uQnVpbGRlci5zZXRTdHlsZXMiLCJDc3NBbmltYXRpb25CdWlsZGVyLnNldEZyb21TdHlsZXMiLCJDc3NBbmltYXRpb25CdWlsZGVyLnNldFRvU3R5bGVzIiwiQ3NzQW5pbWF0aW9uQnVpbGRlci5zdGFydCIsIkNzc0FuaW1hdGlvbk9wdGlvbnMiLCJDc3NBbmltYXRpb25PcHRpb25zLmNvbnN0cnVjdG9yIiwiQW5pbWF0aW9uIiwiQW5pbWF0aW9uLmNvbnN0cnVjdG9yIiwiQW5pbWF0aW9uLnRvdGFsVGltZSIsIkFuaW1hdGlvbi53YWl0IiwiQW5pbWF0aW9uLnNldHVwIiwiQW5pbWF0aW9uLnN0YXJ0IiwiQW5pbWF0aW9uLmFwcGx5U3R5bGVzIiwiQW5pbWF0aW9uLmFkZENsYXNzZXMiLCJBbmltYXRpb24ucmVtb3ZlQ2xhc3NlcyIsIkFuaW1hdGlvbi5hZGRFdmVudHMiLCJBbmltYXRpb24uaGFuZGxlQW5pbWF0aW9uRXZlbnQiLCJBbmltYXRpb24uaGFuZGxlQW5pbWF0aW9uQ29tcGxldGVkIiwiQW5pbWF0aW9uLm9uQ29tcGxldGUiLCJBbmltYXRpb24ucGFyc2VEdXJhdGlvblN0cmluZyIsIkFuaW1hdGlvbi5zdHJpcExldHRlcnMiLCJCcm93c2VyRGV0YWlscyIsIkJyb3dzZXJEZXRhaWxzLmNvbnN0cnVjdG9yIiwiQnJvd3NlckRldGFpbHMuZG9lc0VsYXBzZWRUaW1lSW5jbHVkZXNEZWxheSIsIkJyb3dzZXJEZXRhaWxzLnJhZiIsIlJhZlF1ZXVlIiwiUmFmUXVldWUuY29uc3RydWN0b3IiLCJSYWZRdWV1ZS5fcmFmIiwiUmFmUXVldWUuX25leHRGcmFtZSIsIlJhZlF1ZXVlLmNhbmNlbCIsIlNoYXJlZFN0eWxlc0hvc3QiLCJTaGFyZWRTdHlsZXNIb3N0LmNvbnN0cnVjdG9yIiwiU2hhcmVkU3R5bGVzSG9zdC5hZGRTdHlsZXMiLCJTaGFyZWRTdHlsZXNIb3N0Lm9uU3R5bGVzQWRkZWQiLCJTaGFyZWRTdHlsZXNIb3N0LmdldEFsbFN0eWxlcyIsIkRvbVNoYXJlZFN0eWxlc0hvc3QiLCJEb21TaGFyZWRTdHlsZXNIb3N0LmNvbnN0cnVjdG9yIiwiRG9tU2hhcmVkU3R5bGVzSG9zdC5fYWRkU3R5bGVzVG9Ib3N0IiwiRG9tU2hhcmVkU3R5bGVzSG9zdC5hZGRIb3N0IiwiRG9tU2hhcmVkU3R5bGVzSG9zdC5yZW1vdmVIb3N0IiwiRG9tU2hhcmVkU3R5bGVzSG9zdC5vblN0eWxlc0FkZGVkIiwiQnJvd3NlckRvbUFkYXB0ZXIiLCJCcm93c2VyRG9tQWRhcHRlci5jb25zdHJ1Y3RvciIsIkJyb3dzZXJEb21BZGFwdGVyLnBhcnNlIiwiQnJvd3NlckRvbUFkYXB0ZXIubWFrZUN1cnJlbnQiLCJCcm93c2VyRG9tQWRhcHRlci5oYXNQcm9wZXJ0eSIsIkJyb3dzZXJEb21BZGFwdGVyLnNldFByb3BlcnR5IiwiQnJvd3NlckRvbUFkYXB0ZXIuZ2V0UHJvcGVydHkiLCJCcm93c2VyRG9tQWRhcHRlci5pbnZva2UiLCJCcm93c2VyRG9tQWRhcHRlci5sb2dFcnJvciIsIkJyb3dzZXJEb21BZGFwdGVyLmxvZyIsIkJyb3dzZXJEb21BZGFwdGVyLmxvZ0dyb3VwIiwiQnJvd3NlckRvbUFkYXB0ZXIubG9nR3JvdXBFbmQiLCJCcm93c2VyRG9tQWRhcHRlci5hdHRyVG9Qcm9wTWFwIiwiQnJvd3NlckRvbUFkYXB0ZXIucXVlcnkiLCJCcm93c2VyRG9tQWRhcHRlci5xdWVyeVNlbGVjdG9yIiwiQnJvd3NlckRvbUFkYXB0ZXIucXVlcnlTZWxlY3RvckFsbCIsIkJyb3dzZXJEb21BZGFwdGVyLm9uIiwiQnJvd3NlckRvbUFkYXB0ZXIub25BbmRDYW5jZWwiLCJCcm93c2VyRG9tQWRhcHRlci5kaXNwYXRjaEV2ZW50IiwiQnJvd3NlckRvbUFkYXB0ZXIuY3JlYXRlTW91c2VFdmVudCIsIkJyb3dzZXJEb21BZGFwdGVyLmNyZWF0ZUV2ZW50IiwiQnJvd3NlckRvbUFkYXB0ZXIucHJldmVudERlZmF1bHQiLCJCcm93c2VyRG9tQWRhcHRlci5pc1ByZXZlbnRlZCIsIkJyb3dzZXJEb21BZGFwdGVyLmdldElubmVySFRNTCIsIkJyb3dzZXJEb21BZGFwdGVyLmdldE91dGVySFRNTCIsIkJyb3dzZXJEb21BZGFwdGVyLm5vZGVOYW1lIiwiQnJvd3NlckRvbUFkYXB0ZXIubm9kZVZhbHVlIiwiQnJvd3NlckRvbUFkYXB0ZXIudHlwZSIsIkJyb3dzZXJEb21BZGFwdGVyLmNvbnRlbnQiLCJCcm93c2VyRG9tQWRhcHRlci5maXJzdENoaWxkIiwiQnJvd3NlckRvbUFkYXB0ZXIubmV4dFNpYmxpbmciLCJCcm93c2VyRG9tQWRhcHRlci5wYXJlbnRFbGVtZW50IiwiQnJvd3NlckRvbUFkYXB0ZXIuY2hpbGROb2RlcyIsIkJyb3dzZXJEb21BZGFwdGVyLmNoaWxkTm9kZXNBc0xpc3QiLCJCcm93c2VyRG9tQWRhcHRlci5jbGVhck5vZGVzIiwiQnJvd3NlckRvbUFkYXB0ZXIuYXBwZW5kQ2hpbGQiLCJCcm93c2VyRG9tQWRhcHRlci5yZW1vdmVDaGlsZCIsIkJyb3dzZXJEb21BZGFwdGVyLnJlcGxhY2VDaGlsZCIsIkJyb3dzZXJEb21BZGFwdGVyLnJlbW92ZSIsIkJyb3dzZXJEb21BZGFwdGVyLmluc2VydEJlZm9yZSIsIkJyb3dzZXJEb21BZGFwdGVyLmluc2VydEFsbEJlZm9yZSIsIkJyb3dzZXJEb21BZGFwdGVyLmluc2VydEFmdGVyIiwiQnJvd3NlckRvbUFkYXB0ZXIuc2V0SW5uZXJIVE1MIiwiQnJvd3NlckRvbUFkYXB0ZXIuZ2V0VGV4dCIsIkJyb3dzZXJEb21BZGFwdGVyLnNldFRleHQiLCJCcm93c2VyRG9tQWRhcHRlci5nZXRWYWx1ZSIsIkJyb3dzZXJEb21BZGFwdGVyLnNldFZhbHVlIiwiQnJvd3NlckRvbUFkYXB0ZXIuZ2V0Q2hlY2tlZCIsIkJyb3dzZXJEb21BZGFwdGVyLnNldENoZWNrZWQiLCJCcm93c2VyRG9tQWRhcHRlci5jcmVhdGVDb21tZW50IiwiQnJvd3NlckRvbUFkYXB0ZXIuY3JlYXRlVGVtcGxhdGUiLCJCcm93c2VyRG9tQWRhcHRlci5jcmVhdGVFbGVtZW50IiwiQnJvd3NlckRvbUFkYXB0ZXIuY3JlYXRlRWxlbWVudE5TIiwiQnJvd3NlckRvbUFkYXB0ZXIuY3JlYXRlVGV4dE5vZGUiLCJCcm93c2VyRG9tQWRhcHRlci5jcmVhdGVTY3JpcHRUYWciLCJCcm93c2VyRG9tQWRhcHRlci5jcmVhdGVTdHlsZUVsZW1lbnQiLCJCcm93c2VyRG9tQWRhcHRlci5jcmVhdGVTaGFkb3dSb290IiwiQnJvd3NlckRvbUFkYXB0ZXIuZ2V0U2hhZG93Um9vdCIsIkJyb3dzZXJEb21BZGFwdGVyLmdldEhvc3QiLCJCcm93c2VyRG9tQWRhcHRlci5jbG9uZSIsIkJyb3dzZXJEb21BZGFwdGVyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUiLCJCcm93c2VyRG9tQWRhcHRlci5nZXRFbGVtZW50c0J5VGFnTmFtZSIsIkJyb3dzZXJEb21BZGFwdGVyLmNsYXNzTGlzdCIsIkJyb3dzZXJEb21BZGFwdGVyLmFkZENsYXNzIiwiQnJvd3NlckRvbUFkYXB0ZXIucmVtb3ZlQ2xhc3MiLCJCcm93c2VyRG9tQWRhcHRlci5oYXNDbGFzcyIsIkJyb3dzZXJEb21BZGFwdGVyLnNldFN0eWxlIiwiQnJvd3NlckRvbUFkYXB0ZXIucmVtb3ZlU3R5bGUiLCJCcm93c2VyRG9tQWRhcHRlci5nZXRTdHlsZSIsIkJyb3dzZXJEb21BZGFwdGVyLmhhc1N0eWxlIiwiQnJvd3NlckRvbUFkYXB0ZXIudGFnTmFtZSIsIkJyb3dzZXJEb21BZGFwdGVyLmF0dHJpYnV0ZU1hcCIsIkJyb3dzZXJEb21BZGFwdGVyLmhhc0F0dHJpYnV0ZSIsIkJyb3dzZXJEb21BZGFwdGVyLmdldEF0dHJpYnV0ZSIsIkJyb3dzZXJEb21BZGFwdGVyLnNldEF0dHJpYnV0ZSIsIkJyb3dzZXJEb21BZGFwdGVyLnNldEF0dHJpYnV0ZU5TIiwiQnJvd3NlckRvbUFkYXB0ZXIucmVtb3ZlQXR0cmlidXRlIiwiQnJvd3NlckRvbUFkYXB0ZXIudGVtcGxhdGVBd2FyZVJvb3QiLCJCcm93c2VyRG9tQWRhcHRlci5jcmVhdGVIdG1sRG9jdW1lbnQiLCJCcm93c2VyRG9tQWRhcHRlci5kZWZhdWx0RG9jIiwiQnJvd3NlckRvbUFkYXB0ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwiQnJvd3NlckRvbUFkYXB0ZXIuZ2V0VGl0bGUiLCJCcm93c2VyRG9tQWRhcHRlci5zZXRUaXRsZSIsIkJyb3dzZXJEb21BZGFwdGVyLmVsZW1lbnRNYXRjaGVzIiwiQnJvd3NlckRvbUFkYXB0ZXIuaXNUZW1wbGF0ZUVsZW1lbnQiLCJCcm93c2VyRG9tQWRhcHRlci5pc1RleHROb2RlIiwiQnJvd3NlckRvbUFkYXB0ZXIuaXNDb21tZW50Tm9kZSIsIkJyb3dzZXJEb21BZGFwdGVyLmlzRWxlbWVudE5vZGUiLCJCcm93c2VyRG9tQWRhcHRlci5oYXNTaGFkb3dSb290IiwiQnJvd3NlckRvbUFkYXB0ZXIuaXNTaGFkb3dSb290IiwiQnJvd3NlckRvbUFkYXB0ZXIuaW1wb3J0SW50b0RvYyIsIkJyb3dzZXJEb21BZGFwdGVyLmFkb3B0Tm9kZSIsIkJyb3dzZXJEb21BZGFwdGVyLmdldEhyZWYiLCJCcm93c2VyRG9tQWRhcHRlci5nZXRFdmVudEtleSIsIkJyb3dzZXJEb21BZGFwdGVyLmdldEdsb2JhbEV2ZW50VGFyZ2V0IiwiQnJvd3NlckRvbUFkYXB0ZXIuZ2V0SGlzdG9yeSIsIkJyb3dzZXJEb21BZGFwdGVyLmdldExvY2F0aW9uIiwiQnJvd3NlckRvbUFkYXB0ZXIuZ2V0QmFzZUhyZWYiLCJCcm93c2VyRG9tQWRhcHRlci5yZXNldEJhc2VFbGVtZW50IiwiQnJvd3NlckRvbUFkYXB0ZXIuZ2V0VXNlckFnZW50IiwiQnJvd3NlckRvbUFkYXB0ZXIuc2V0RGF0YSIsIkJyb3dzZXJEb21BZGFwdGVyLmdldERhdGEiLCJCcm93c2VyRG9tQWRhcHRlci5nZXRDb21wdXRlZFN0eWxlIiwiQnJvd3NlckRvbUFkYXB0ZXIuc2V0R2xvYmFsVmFyIiwiQnJvd3NlckRvbUFkYXB0ZXIucmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwiQnJvd3NlckRvbUFkYXB0ZXIuY2FuY2VsQW5pbWF0aW9uRnJhbWUiLCJCcm93c2VyRG9tQWRhcHRlci5wZXJmb3JtYW5jZU5vdyIsImdldEJhc2VFbGVtZW50SHJlZiIsInJlbGF0aXZlUGF0aCIsIkdlbmVyaWNCcm93c2VyRG9tQWRhcHRlciIsIkdlbmVyaWNCcm93c2VyRG9tQWRhcHRlci5jb25zdHJ1Y3RvciIsIkdlbmVyaWNCcm93c2VyRG9tQWRhcHRlci5nZXRYSFIiLCJHZW5lcmljQnJvd3NlckRvbUFkYXB0ZXIuZ2V0RGlzdHJpYnV0ZWROb2RlcyIsIkdlbmVyaWNCcm93c2VyRG9tQWRhcHRlci5yZXNvbHZlQW5kU2V0SHJlZiIsIkdlbmVyaWNCcm93c2VyRG9tQWRhcHRlci5zdXBwb3J0c0RPTUV2ZW50cyIsIkdlbmVyaWNCcm93c2VyRG9tQWRhcHRlci5zdXBwb3J0c05hdGl2ZVNoYWRvd0RPTSIsIkdlbmVyaWNCcm93c2VyRG9tQWRhcHRlci5nZXRBbmltYXRpb25QcmVmaXgiLCJHZW5lcmljQnJvd3NlckRvbUFkYXB0ZXIuZ2V0VHJhbnNpdGlvbkVuZCIsIkdlbmVyaWNCcm93c2VyRG9tQWRhcHRlci5zdXBwb3J0c0FuaW1hdGlvbiIsIlhIUkltcGwiLCJYSFJJbXBsLmNvbnN0cnVjdG9yIiwiWEhSSW1wbC5nZXQiLCJQdWJsaWNUZXN0YWJpbGl0eSIsIlB1YmxpY1Rlc3RhYmlsaXR5LmNvbnN0cnVjdG9yIiwiUHVibGljVGVzdGFiaWxpdHkuaXNTdGFibGUiLCJQdWJsaWNUZXN0YWJpbGl0eS53aGVuU3RhYmxlIiwiUHVibGljVGVzdGFiaWxpdHkuZmluZEJpbmRpbmdzIiwiUHVibGljVGVzdGFiaWxpdHkuZmluZFByb3ZpZGVycyIsIkJyb3dzZXJHZXRUZXN0YWJpbGl0eSIsIkJyb3dzZXJHZXRUZXN0YWJpbGl0eS5jb25zdHJ1Y3RvciIsIkJyb3dzZXJHZXRUZXN0YWJpbGl0eS5pbml0IiwiQnJvd3NlckdldFRlc3RhYmlsaXR5LmFkZFRvV2luZG93IiwiQnJvd3NlckdldFRlc3RhYmlsaXR5LmZpbmRUZXN0YWJpbGl0eUluVHJlZSIsInd0ZkluaXQiLCJUaXRsZSIsIlRpdGxlLmNvbnN0cnVjdG9yIiwiVGl0bGUuZ2V0VGl0bGUiLCJUaXRsZS5zZXRUaXRsZSIsIkJ5IiwiQnkuY29uc3RydWN0b3IiLCJCeS5hbGwiLCJCeS5jc3MiLCJCeS5kaXJlY3RpdmUiLCJfc2V0RWxlbWVudElkIiwiX2dldEVsZW1lbnRJZCIsImluc3BlY3ROYXRpdmVFbGVtZW50IiwiRGVidWdFbGVtZW50Vmlld0xpc3RlbmVyIiwiRGVidWdFbGVtZW50Vmlld0xpc3RlbmVyLmNvbnN0cnVjdG9yIiwiRGVidWdFbGVtZW50Vmlld0xpc3RlbmVyLm9uVmlld0NyZWF0ZWQiLCJEZWJ1Z0VsZW1lbnRWaWV3TGlzdGVuZXIub25WaWV3RGVzdHJveWVkIiwiZW5hYmxlRGVidWdUb29scyIsImRpc2FibGVEZWJ1Z1Rvb2xzIiwiQW5ndWxhclRvb2xzIiwiQW5ndWxhclRvb2xzLmNvbnN0cnVjdG9yIiwiQW5ndWxhclByb2ZpbGVyIiwiQW5ndWxhclByb2ZpbGVyLmNvbnN0cnVjdG9yIiwiQW5ndWxhclByb2ZpbGVyLnRpbWVDaGFuZ2VEZXRlY3Rpb24iLCJodHRwUmVxdWVzdCIsIm1lcmdlT3B0aW9ucyIsIkh0dHAiLCJIdHRwLmNvbnN0cnVjdG9yIiwiSHR0cC5yZXF1ZXN0IiwiSHR0cC5nZXQiLCJIdHRwLnBvc3QiLCJIdHRwLnB1dCIsIkh0dHAuZGVsZXRlIiwiSHR0cC5wYXRjaCIsIkh0dHAuaGVhZCIsIkpzb25wIiwiSnNvbnAuY29uc3RydWN0b3IiLCJKc29ucC5yZXF1ZXN0IiwiQ29ubmVjdGlvbkJhY2tlbmQiLCJDb25uZWN0aW9uQmFja2VuZC5jb25zdHJ1Y3RvciIsIkNvbm5lY3Rpb24iLCJDb25uZWN0aW9uLmNvbnN0cnVjdG9yIiwiUmVxdWVzdCIsIlJlcXVlc3QuY29uc3RydWN0b3IiLCJSZXF1ZXN0LnRleHQiLCJIZWFkZXJzIiwiSGVhZGVycy5jb25zdHJ1Y3RvciIsIkhlYWRlcnMuZnJvbVJlc3BvbnNlSGVhZGVyU3RyaW5nIiwiSGVhZGVycy5hcHBlbmQiLCJIZWFkZXJzLmRlbGV0ZSIsIkhlYWRlcnMuZm9yRWFjaCIsIkhlYWRlcnMuZ2V0IiwiSGVhZGVycy5oYXMiLCJIZWFkZXJzLmtleXMiLCJIZWFkZXJzLnNldCIsIkhlYWRlcnMudmFsdWVzIiwiSGVhZGVycy50b0pTT04iLCJIZWFkZXJzLmdldEFsbCIsIkhlYWRlcnMuZW50cmllcyIsIm5vcm1hbGl6ZU1ldGhvZE5hbWUiLCJnZXRSZXNwb25zZVVSTCIsIlJlcXVlc3RNZXRob2QiLCJSZWFkeVN0YXRlIiwiUmVzcG9uc2VUeXBlIiwiUmVxdWVzdE9wdGlvbnMiLCJSZXF1ZXN0T3B0aW9ucy5jb25zdHJ1Y3RvciIsIlJlcXVlc3RPcHRpb25zLm1lcmdlIiwiQmFzZVJlcXVlc3RPcHRpb25zIiwiQmFzZVJlcXVlc3RPcHRpb25zLmNvbnN0cnVjdG9yIiwicGFyYW1QYXJzZXIiLCJVUkxTZWFyY2hQYXJhbXMiLCJVUkxTZWFyY2hQYXJhbXMuY29uc3RydWN0b3IiLCJVUkxTZWFyY2hQYXJhbXMuY2xvbmUiLCJVUkxTZWFyY2hQYXJhbXMuaGFzIiwiVVJMU2VhcmNoUGFyYW1zLmdldCIsIlVSTFNlYXJjaFBhcmFtcy5nZXRBbGwiLCJVUkxTZWFyY2hQYXJhbXMuc2V0IiwiVVJMU2VhcmNoUGFyYW1zLnNldEFsbCIsIlVSTFNlYXJjaFBhcmFtcy5hcHBlbmQiLCJVUkxTZWFyY2hQYXJhbXMuYXBwZW5kQWxsIiwiVVJMU2VhcmNoUGFyYW1zLnJlcGxhY2VBbGwiLCJVUkxTZWFyY2hQYXJhbXMudG9TdHJpbmciLCJVUkxTZWFyY2hQYXJhbXMuZGVsZXRlIiwiWEhSQ29ubmVjdGlvbiIsIlhIUkNvbm5lY3Rpb24uY29uc3RydWN0b3IiLCJYSFJCYWNrZW5kIiwiWEhSQmFja2VuZC5jb25zdHJ1Y3RvciIsIlhIUkJhY2tlbmQuY3JlYXRlQ29ubmVjdGlvbiIsIlJlc3BvbnNlIiwiUmVzcG9uc2UuY29uc3RydWN0b3IiLCJSZXNwb25zZS5ibG9iIiwiUmVzcG9uc2UuanNvbiIsIlJlc3BvbnNlLnRleHQiLCJSZXNwb25zZS5hcnJheUJ1ZmZlciIsIlJlc3BvbnNlT3B0aW9ucyIsIlJlc3BvbnNlT3B0aW9ucy5jb25zdHJ1Y3RvciIsIlJlc3BvbnNlT3B0aW9ucy5tZXJnZSIsIkJhc2VSZXNwb25zZU9wdGlvbnMiLCJCYXNlUmVzcG9uc2VPcHRpb25zLmNvbnN0cnVjdG9yIiwiQnJvd3NlclhociIsIkJyb3dzZXJYaHIuY29uc3RydWN0b3IiLCJCcm93c2VyWGhyLmJ1aWxkIiwiSlNPTlBDb25uZWN0aW9uIiwiSlNPTlBDb25uZWN0aW9uLmNvbnN0cnVjdG9yIiwiSlNPTlBDb25uZWN0aW9uXyIsIkpTT05QQ29ubmVjdGlvbl8uY29uc3RydWN0b3IiLCJKU09OUENvbm5lY3Rpb25fLmZpbmlzaGVkIiwiSlNPTlBCYWNrZW5kIiwiSlNPTlBCYWNrZW5kLmNvbnN0cnVjdG9yIiwiSlNPTlBCYWNrZW5kXyIsIkpTT05QQmFja2VuZF8uY29uc3RydWN0b3IiLCJKU09OUEJhY2tlbmRfLmNyZWF0ZUNvbm5lY3Rpb24iLCJfZ2V0SnNvbnBDb25uZWN0aW9ucyIsIkJyb3dzZXJKc29ucCIsIkJyb3dzZXJKc29ucC5jb25zdHJ1Y3RvciIsIkJyb3dzZXJKc29ucC5idWlsZCIsIkJyb3dzZXJKc29ucC5uZXh0UmVxdWVzdElEIiwiQnJvd3Nlckpzb25wLnJlcXVlc3RDYWxsYmFjayIsIkJyb3dzZXJKc29ucC5leHBvc2VDb25uZWN0aW9uIiwiQnJvd3Nlckpzb25wLnJlbW92ZUNvbm5lY3Rpb24iLCJCcm93c2VySnNvbnAuc2VuZCIsIkJyb3dzZXJKc29ucC5jbGVhbnVwIiwicm91dGVyRmFjdG9yeSIsInJvdXRlclByaW1hcnlDb21wb25lbnRGYWN0b3J5IiwiUm91dGVyIiwiUm91dGVyLmNvbnN0cnVjdG9yIiwiUm91dGVyLmNoaWxkUm91dGVyIiwiUm91dGVyLmF1eFJvdXRlciIsIlJvdXRlci5yZWdpc3RlclByaW1hcnlPdXRsZXQiLCJSb3V0ZXIucmVnaXN0ZXJBdXhPdXRsZXQiLCJSb3V0ZXIuaXNSb3V0ZUFjdGl2ZSIsIlJvdXRlci5jb25maWciLCJSb3V0ZXIubmF2aWdhdGUiLCJSb3V0ZXIubmF2aWdhdGVCeVVybCIsIlJvdXRlci5uYXZpZ2F0ZUJ5SW5zdHJ1Y3Rpb24iLCJSb3V0ZXIuX25hdmlnYXRlIiwiUm91dGVyLl9zZXR0bGVJbnN0cnVjdGlvbiIsIlJvdXRlci5fZW1pdE5hdmlnYXRpb25GaW5pc2giLCJSb3V0ZXIuX2FmdGVyUHJvbWlzZUZpbmlzaE5hdmlnYXRpbmciLCJSb3V0ZXIuX3JvdXRlckNhblJldXNlIiwiUm91dGVyLl9jYW5BY3RpdmF0ZSIsIlJvdXRlci5fcm91dGVyQ2FuRGVhY3RpdmF0ZSIsIlJvdXRlci5jb21taXQiLCJSb3V0ZXIuX3N0YXJ0TmF2aWdhdGluZyIsIlJvdXRlci5fZmluaXNoTmF2aWdhdGluZyIsIlJvdXRlci5zdWJzY3JpYmUiLCJSb3V0ZXIuZGVhY3RpdmF0ZSIsIlJvdXRlci5yZWNvZ25pemUiLCJSb3V0ZXIuX2dldEFuY2VzdG9ySW5zdHJ1Y3Rpb25zIiwiUm91dGVyLnJlbmF2aWdhdGUiLCJSb3V0ZXIuZ2VuZXJhdGUiLCJSb290Um91dGVyIiwiUm9vdFJvdXRlci5jb25zdHJ1Y3RvciIsIlJvb3RSb3V0ZXIuY29tbWl0IiwiUm9vdFJvdXRlci5kaXNwb3NlIiwiQ2hpbGRSb3V0ZXIiLCJDaGlsZFJvdXRlci5jb25zdHJ1Y3RvciIsIkNoaWxkUm91dGVyLm5hdmlnYXRlQnlVcmwiLCJDaGlsZFJvdXRlci5uYXZpZ2F0ZUJ5SW5zdHJ1Y3Rpb24iLCJjYW5BY3RpdmF0ZU9uZSIsIlJvdXRlUmVnaXN0cnkiLCJSb3V0ZVJlZ2lzdHJ5LmNvbnN0cnVjdG9yIiwiUm91dGVSZWdpc3RyeS5jb25maWciLCJSb3V0ZVJlZ2lzdHJ5LmNvbmZpZ0Zyb21Db21wb25lbnQiLCJSb3V0ZVJlZ2lzdHJ5LnJlY29nbml6ZSIsIlJvdXRlUmVnaXN0cnkuX3JlY29nbml6ZSIsIlJvdXRlUmVnaXN0cnkuX2F1eFJvdXRlc1RvVW5yZXNvbHZlZCIsIlJvdXRlUmVnaXN0cnkuZ2VuZXJhdGUiLCJSb3V0ZVJlZ2lzdHJ5Ll9nZW5lcmF0ZSIsIlJvdXRlUmVnaXN0cnkuaGFzUm91dGUiLCJSb3V0ZVJlZ2lzdHJ5LmdlbmVyYXRlRGVmYXVsdCIsInNwbGl0QW5kRmxhdHRlbkxpbmtQYXJhbXMiLCJtb3N0U3BlY2lmaWMiLCJhc3NlcnRUZXJtaW5hbENvbXBvbmVudCIsIlJvdXRlQ29uZmlnIiwiUm91dGVDb25maWcuY29uc3RydWN0b3IiLCJSb3V0ZSIsIlJvdXRlLmNvbnN0cnVjdG9yIiwiQXV4Um91dGUiLCJBdXhSb3V0ZS5jb25zdHJ1Y3RvciIsIkFzeW5jUm91dGUiLCJBc3luY1JvdXRlLmNvbnN0cnVjdG9yIiwiUmVkaXJlY3QiLCJSZWRpcmVjdC5jb25zdHJ1Y3RvciIsIlJvdXRlTWF0Y2giLCJSb3V0ZU1hdGNoLmNvbnN0cnVjdG9yIiwiUGF0aE1hdGNoIiwiUGF0aE1hdGNoLmNvbnN0cnVjdG9yIiwiUmVkaXJlY3RNYXRjaCIsIlJlZGlyZWN0TWF0Y2guY29uc3RydWN0b3IiLCJSZWRpcmVjdFJlY29nbml6ZXIiLCJSZWRpcmVjdFJlY29nbml6ZXIuY29uc3RydWN0b3IiLCJSZWRpcmVjdFJlY29nbml6ZXIucmVjb2duaXplIiwiUmVkaXJlY3RSZWNvZ25pemVyLmdlbmVyYXRlIiwiUm91dGVSZWNvZ25pemVyIiwiUm91dGVSZWNvZ25pemVyLmNvbnN0cnVjdG9yIiwiUm91dGVSZWNvZ25pemVyLnJlY29nbml6ZSIsIlJvdXRlUmVjb2duaXplci5nZW5lcmF0ZSIsIlJvdXRlUmVjb2duaXplci5nZW5lcmF0ZUNvbXBvbmVudFBhdGhWYWx1ZXMiLCJSb3V0ZVJlY29nbml6ZXIuX2dldEluc3RydWN0aW9uIiwiUm91dGVQYXJhbXMiLCJSb3V0ZVBhcmFtcy5jb25zdHJ1Y3RvciIsIlJvdXRlUGFyYW1zLmdldCIsIlJvdXRlRGF0YSIsIlJvdXRlRGF0YS5jb25zdHJ1Y3RvciIsIlJvdXRlRGF0YS5nZXQiLCJJbnN0cnVjdGlvbiIsIkluc3RydWN0aW9uLmNvbnN0cnVjdG9yIiwiSW5zdHJ1Y3Rpb24udXJsUGF0aCIsIkluc3RydWN0aW9uLnVybFBhcmFtcyIsIkluc3RydWN0aW9uLnNwZWNpZmljaXR5IiwiSW5zdHJ1Y3Rpb24udG9Sb290VXJsIiwiSW5zdHJ1Y3Rpb24uX3RvTm9uUm9vdFVybCIsIkluc3RydWN0aW9uLnRvVXJsUXVlcnkiLCJJbnN0cnVjdGlvbi5yZXBsYWNlQ2hpbGQiLCJJbnN0cnVjdGlvbi50b1VybFBhdGgiLCJJbnN0cnVjdGlvbi50b0xpbmtVcmwiLCJJbnN0cnVjdGlvbi5fdG9MaW5rVXJsIiwiSW5zdHJ1Y3Rpb24uX3N0cmluZ2lmeVBhdGhNYXRyaXhBdXhQcmVmaXhlZCIsIkluc3RydWN0aW9uLl9zdHJpbmdpZnlNYXRyaXhQYXJhbXMiLCJJbnN0cnVjdGlvbi5fc3RyaW5naWZ5UGF0aE1hdHJpeEF1eCIsIkluc3RydWN0aW9uLl9zdHJpbmdpZnlBdXgiLCJSZXNvbHZlZEluc3RydWN0aW9uIiwiUmVzb2x2ZWRJbnN0cnVjdGlvbi5jb25zdHJ1Y3RvciIsIlJlc29sdmVkSW5zdHJ1Y3Rpb24ucmVzb2x2ZUNvbXBvbmVudCIsIkRlZmF1bHRJbnN0cnVjdGlvbiIsIkRlZmF1bHRJbnN0cnVjdGlvbi5jb25zdHJ1Y3RvciIsIkRlZmF1bHRJbnN0cnVjdGlvbi5yZXNvbHZlQ29tcG9uZW50IiwiRGVmYXVsdEluc3RydWN0aW9uLnRvTGlua1VybCIsIkRlZmF1bHRJbnN0cnVjdGlvbi5fdG9MaW5rVXJsIiwiVW5yZXNvbHZlZEluc3RydWN0aW9uIiwiVW5yZXNvbHZlZEluc3RydWN0aW9uLmNvbnN0cnVjdG9yIiwiVW5yZXNvbHZlZEluc3RydWN0aW9uLnVybFBhdGgiLCJVbnJlc29sdmVkSW5zdHJ1Y3Rpb24udXJsUGFyYW1zIiwiVW5yZXNvbHZlZEluc3RydWN0aW9uLnJlc29sdmVDb21wb25lbnQiLCJSZWRpcmVjdEluc3RydWN0aW9uIiwiUmVkaXJlY3RJbnN0cnVjdGlvbi5jb25zdHJ1Y3RvciIsIkNvbXBvbmVudEluc3RydWN0aW9uIiwiQ29tcG9uZW50SW5zdHJ1Y3Rpb24uY29uc3RydWN0b3IiLCJUb3VjaE1hcCIsIlRvdWNoTWFwLmNvbnN0cnVjdG9yIiwiVG91Y2hNYXAuZ2V0IiwiVG91Y2hNYXAuZ2V0VW51c2VkIiwibm9ybWFsaXplU3RyaW5nIiwiQ29udGludWF0aW9uU2VnbWVudCIsIkNvbnRpbnVhdGlvblNlZ21lbnQuY29uc3RydWN0b3IiLCJDb250aW51YXRpb25TZWdtZW50LmdlbmVyYXRlIiwiQ29udGludWF0aW9uU2VnbWVudC5tYXRjaCIsIlN0YXRpY1NlZ21lbnQiLCJTdGF0aWNTZWdtZW50LmNvbnN0cnVjdG9yIiwiU3RhdGljU2VnbWVudC5tYXRjaCIsIlN0YXRpY1NlZ21lbnQuZ2VuZXJhdGUiLCJEeW5hbWljU2VnbWVudCIsIkR5bmFtaWNTZWdtZW50LmNvbnN0cnVjdG9yIiwiRHluYW1pY1NlZ21lbnQubWF0Y2giLCJEeW5hbWljU2VnbWVudC5nZW5lcmF0ZSIsIlN0YXJTZWdtZW50IiwiU3RhclNlZ21lbnQuY29uc3RydWN0b3IiLCJTdGFyU2VnbWVudC5tYXRjaCIsIlN0YXJTZWdtZW50LmdlbmVyYXRlIiwicGFyc2VQYXRoU3RyaW5nIiwicGF0aERzbEhhc2giLCJzcGxpdEJ5U2xhc2giLCJhc3NlcnRQYXRoIiwiUGF0aFJlY29nbml6ZXIiLCJQYXRoUmVjb2duaXplci5jb25zdHJ1Y3RvciIsIlBhdGhSZWNvZ25pemVyLnJlY29nbml6ZSIsIlBhdGhSZWNvZ25pemVyLmdlbmVyYXRlIiwiVXJsIiwiVXJsLmNvbnN0cnVjdG9yIiwiVXJsLnRvU3RyaW5nIiwiVXJsLnNlZ21lbnRUb1N0cmluZyIsIlVybC5fYXV4VG9TdHJpbmciLCJVcmwuX21hdHJpeFBhcmFtc1RvU3RyaW5nIiwiVXJsLl9jaGlsZFN0cmluZyIsIlJvb3RVcmwiLCJSb290VXJsLmNvbnN0cnVjdG9yIiwiUm9vdFVybC50b1N0cmluZyIsIlJvb3RVcmwuc2VnbWVudFRvU3RyaW5nIiwiUm9vdFVybC5fcXVlcnlQYXJhbXNUb1N0cmluZyIsInBhdGhTZWdtZW50c1RvVXJsIiwibWF0Y2hVcmxTZWdtZW50IiwiVXJsUGFyc2VyIiwiVXJsUGFyc2VyLmNvbnN0cnVjdG9yIiwiVXJsUGFyc2VyLnBlZWtTdGFydHNXaXRoIiwiVXJsUGFyc2VyLmNhcHR1cmUiLCJVcmxQYXJzZXIucGFyc2UiLCJVcmxQYXJzZXIucGFyc2VSb290IiwiVXJsUGFyc2VyLnBhcnNlU2VnbWVudCIsIlVybFBhcnNlci5wYXJzZVF1ZXJ5UGFyYW1zIiwiVXJsUGFyc2VyLnBhcnNlTWF0cml4UGFyYW1zIiwiVXJsUGFyc2VyLnBhcnNlUGFyYW0iLCJVcmxQYXJzZXIucGFyc2VBdXhpbGlhcnlSb3V0ZXMiLCJzZXJpYWxpemVQYXJhbXMiLCJDb21wb25lbnRSZWNvZ25pemVyIiwiQ29tcG9uZW50UmVjb2duaXplci5jb25zdHJ1Y3RvciIsIkNvbXBvbmVudFJlY29nbml6ZXIuY29uZmlnIiwiQ29tcG9uZW50UmVjb2duaXplci5fYXNzZXJ0Tm9IYXNoQ29sbGlzaW9uIiwiQ29tcG9uZW50UmVjb2duaXplci5yZWNvZ25pemUiLCJDb21wb25lbnRSZWNvZ25pemVyLnJlY29nbml6ZUF1eGlsaWFyeSIsIkNvbXBvbmVudFJlY29nbml6ZXIuaGFzUm91dGUiLCJDb21wb25lbnRSZWNvZ25pemVyLmNvbXBvbmVudExvYWRlZCIsIkNvbXBvbmVudFJlY29nbml6ZXIubG9hZENvbXBvbmVudCIsIkNvbXBvbmVudFJlY29nbml6ZXIuZ2VuZXJhdGUiLCJDb21wb25lbnRSZWNvZ25pemVyLmdlbmVyYXRlQXV4aWxpYXJ5IiwiQXN5bmNSb3V0ZUhhbmRsZXIiLCJBc3luY1JvdXRlSGFuZGxlci5jb25zdHJ1Y3RvciIsIkFzeW5jUm91dGVIYW5kbGVyLnJlc29sdmVDb21wb25lbnRUeXBlIiwiU3luY1JvdXRlSGFuZGxlciIsIlN5bmNSb3V0ZUhhbmRsZXIuY29uc3RydWN0b3IiLCJTeW5jUm91dGVIYW5kbGVyLnJlc29sdmVDb21wb25lbnRUeXBlIiwibm9ybWFsaXplUm91dGVDb25maWciLCJ3cmFwTG9hZGVyVG9SZWNvbmZpZ3VyZVJlZ2lzdHJ5IiwiYXNzZXJ0Q29tcG9uZW50RXhpc3RzIiwiTG9jYXRpb24iLCJMb2NhdGlvbi5jb25zdHJ1Y3RvciIsIkxvY2F0aW9uLnBhdGgiLCJMb2NhdGlvbi5ub3JtYWxpemUiLCJMb2NhdGlvbi5wcmVwYXJlRXh0ZXJuYWxVcmwiLCJMb2NhdGlvbi5nbyIsIkxvY2F0aW9uLnJlcGxhY2VTdGF0ZSIsIkxvY2F0aW9uLmZvcndhcmQiLCJMb2NhdGlvbi5iYWNrIiwiTG9jYXRpb24uc3Vic2NyaWJlIiwiX3N0cmlwQmFzZUhyZWYiLCJzdHJpcEluZGV4SHRtbCIsInN0cmlwVHJhaWxpbmdTbGFzaCIsIkxvY2F0aW9uU3RyYXRlZ3kiLCJMb2NhdGlvblN0cmF0ZWd5LmNvbnN0cnVjdG9yIiwibm9ybWFsaXplUXVlcnlQYXJhbXMiLCJqb2luV2l0aFNsYXNoIiwiZ2V0Q2FuQWN0aXZhdGVIb29rIiwiUm91dGVMaWZlY3ljbGVIb29rIiwiUm91dGVMaWZlY3ljbGVIb29rLmNvbnN0cnVjdG9yIiwiQ2FuQWN0aXZhdGUiLCJDYW5BY3RpdmF0ZS5jb25zdHJ1Y3RvciIsIlJvdXRlck91dGxldCIsIlJvdXRlck91dGxldC5jb25zdHJ1Y3RvciIsIlJvdXRlck91dGxldC5hY3RpdmF0ZSIsIlJvdXRlck91dGxldC5yZXVzZSIsIlJvdXRlck91dGxldC5kZWFjdGl2YXRlIiwiUm91dGVyT3V0bGV0LnJvdXRlckNhbkRlYWN0aXZhdGUiLCJSb3V0ZXJPdXRsZXQucm91dGVyQ2FuUmV1c2UiLCJSb3V0ZXJMaW5rIiwiUm91dGVyTGluay5jb25zdHJ1Y3RvciIsIlJvdXRlckxpbmsuaXNSb3V0ZUFjdGl2ZSIsIlJvdXRlckxpbmsucm91dGVQYXJhbXMiLCJSb3V0ZXJMaW5rLm9uQ2xpY2siLCJQbGF0Zm9ybUxvY2F0aW9uIiwiUGxhdGZvcm1Mb2NhdGlvbi5jb25zdHJ1Y3RvciIsIlBsYXRmb3JtTG9jYXRpb24uX2luaXQiLCJQbGF0Zm9ybUxvY2F0aW9uLmdldEJhc2VIcmVmRnJvbURPTSIsIlBsYXRmb3JtTG9jYXRpb24ub25Qb3BTdGF0ZSIsIlBsYXRmb3JtTG9jYXRpb24ub25IYXNoQ2hhbmdlIiwiUGxhdGZvcm1Mb2NhdGlvbi5wYXRobmFtZSIsIlBsYXRmb3JtTG9jYXRpb24uc2VhcmNoIiwiUGxhdGZvcm1Mb2NhdGlvbi5oYXNoIiwiUGxhdGZvcm1Mb2NhdGlvbi5wdXNoU3RhdGUiLCJQbGF0Zm9ybUxvY2F0aW9uLnJlcGxhY2VTdGF0ZSIsIlBsYXRmb3JtTG9jYXRpb24uZm9yd2FyZCIsIlBsYXRmb3JtTG9jYXRpb24uYmFjayIsIkhhc2hMb2NhdGlvblN0cmF0ZWd5IiwiSGFzaExvY2F0aW9uU3RyYXRlZ3kuY29uc3RydWN0b3IiLCJIYXNoTG9jYXRpb25TdHJhdGVneS5vblBvcFN0YXRlIiwiSGFzaExvY2F0aW9uU3RyYXRlZ3kuZ2V0QmFzZUhyZWYiLCJIYXNoTG9jYXRpb25TdHJhdGVneS5wYXRoIiwiSGFzaExvY2F0aW9uU3RyYXRlZ3kucHJlcGFyZUV4dGVybmFsVXJsIiwiSGFzaExvY2F0aW9uU3RyYXRlZ3kucHVzaFN0YXRlIiwiSGFzaExvY2F0aW9uU3RyYXRlZ3kucmVwbGFjZVN0YXRlIiwiSGFzaExvY2F0aW9uU3RyYXRlZ3kuZm9yd2FyZCIsIkhhc2hMb2NhdGlvblN0cmF0ZWd5LmJhY2siLCJQYXRoTG9jYXRpb25TdHJhdGVneSIsIlBhdGhMb2NhdGlvblN0cmF0ZWd5LmNvbnN0cnVjdG9yIiwiUGF0aExvY2F0aW9uU3RyYXRlZ3kub25Qb3BTdGF0ZSIsIlBhdGhMb2NhdGlvblN0cmF0ZWd5LmdldEJhc2VIcmVmIiwiUGF0aExvY2F0aW9uU3RyYXRlZ3kucHJlcGFyZUV4dGVybmFsVXJsIiwiUGF0aExvY2F0aW9uU3RyYXRlZ3kucGF0aCIsIlBhdGhMb2NhdGlvblN0cmF0ZWd5LnB1c2hTdGF0ZSIsIlBhdGhMb2NhdGlvblN0cmF0ZWd5LnJlcGxhY2VTdGF0ZSIsIlBhdGhMb2NhdGlvblN0cmF0ZWd5LmZvcndhcmQiLCJQYXRoTG9jYXRpb25TdHJhdGVneS5iYWNrIiwiRml4ZWRQYXJ0IiwiRml4ZWRQYXJ0LmNvbnN0cnVjdG9yIiwiQXV4aWxpYXJ5U3RhcnQiLCJBdXhpbGlhcnlTdGFydC5jb25zdHJ1Y3RvciIsIkF1eGlsaWFyeUVuZCIsIkF1eGlsaWFyeUVuZC5jb25zdHJ1Y3RvciIsIlBhcmFtcyIsIlBhcmFtcy5jb25zdHJ1Y3RvciIsIlJvdXRlckxpbmtMZXhlciIsIlJvdXRlckxpbmtMZXhlci5jb25zdHJ1Y3RvciIsIlJvdXRlckxpbmtMZXhlci50b2tlbml6ZSIsIlJvdXRlckxpbmtMZXhlci5fcGFyc2VUb2tlbiIsIlJvdXRlckxpbmtMZXhlci5fcGFyc2VQYXJhbXMiLCJSb3V0ZXJMaW5rTGV4ZXIuX3BhcnNlRml4ZWRQYXJ0IiwiUm91dGVyTGlua0FzdEdlbmVyYXRvciIsIlJvdXRlckxpbmtBc3RHZW5lcmF0b3IuY29uc3RydWN0b3IiLCJSb3V0ZXJMaW5rQXN0R2VuZXJhdG9yLmdlbmVyYXRlIiwiUm91dGVyTGlua0FzdEdlbmVyYXRvci5fZ2VuQXV4aWxpYXJ5IiwiUm91dGVyTGlua0FzdFRyYW5zZm9ybWVyIiwiUm91dGVyTGlua0FzdFRyYW5zZm9ybWVyLmNvbnN0cnVjdG9yIiwiUm91dGVyTGlua0FzdFRyYW5zZm9ybWVyLnZpc2l0UXVvdGUiLCJwYXJzZVJvdXRlckxpbmtFeHByZXNzaW9uIiwiUm91dGVyTGlua1RyYW5zZm9ybSIsIlJvdXRlckxpbmtUcmFuc2Zvcm0uY29uc3RydWN0b3IiLCJSb3V0ZXJMaW5rVHJhbnNmb3JtLnZpc2l0TmdDb250ZW50IiwiUm91dGVyTGlua1RyYW5zZm9ybS52aXNpdEVtYmVkZGVkVGVtcGxhdGUiLCJSb3V0ZXJMaW5rVHJhbnNmb3JtLnZpc2l0RWxlbWVudCIsIlJvdXRlckxpbmtUcmFuc2Zvcm0udmlzaXRWYXJpYWJsZSIsIlJvdXRlckxpbmtUcmFuc2Zvcm0udmlzaXRFdmVudCIsIlJvdXRlckxpbmtUcmFuc2Zvcm0udmlzaXRFbGVtZW50UHJvcGVydHkiLCJSb3V0ZXJMaW5rVHJhbnNmb3JtLnZpc2l0QXR0ciIsIlJvdXRlckxpbmtUcmFuc2Zvcm0udmlzaXRCb3VuZFRleHQiLCJSb3V0ZXJMaW5rVHJhbnNmb3JtLnZpc2l0VGV4dCIsIlJvdXRlckxpbmtUcmFuc2Zvcm0udmlzaXREaXJlY3RpdmUiLCJSb3V0ZXJMaW5rVHJhbnNmb3JtLnZpc2l0RGlyZWN0aXZlUHJvcGVydHkiLCJVcGdyYWRlQWRhcHRlciIsIlVwZ3JhZGVBZGFwdGVyLmNvbnN0cnVjdG9yIiwiVXBncmFkZUFkYXB0ZXIuZG93bmdyYWRlTmcyQ29tcG9uZW50IiwiVXBncmFkZUFkYXB0ZXIudXBncmFkZU5nMUNvbXBvbmVudCIsIlVwZ3JhZGVBZGFwdGVyLmJvb3RzdHJhcCIsIlVwZ3JhZGVBZGFwdGVyLmFkZFByb3ZpZGVyIiwiVXBncmFkZUFkYXB0ZXIudXBncmFkZU5nMVByb3ZpZGVyIiwiVXBncmFkZUFkYXB0ZXIuZG93bmdyYWRlTmcyUHJvdmlkZXIiLCJVcGdyYWRlQWRhcHRlci5jb21waWxlTmcyQ29tcG9uZW50cyIsIm5nMUNvbXBvbmVudERpcmVjdGl2ZSIsIm5nMUNvbXBvbmVudERpcmVjdGl2ZS5kaXJlY3RpdmVGYWN0b3J5IiwiVXBncmFkZUFkYXB0ZXJSZWYiLCJVcGdyYWRlQWRhcHRlclJlZi5jb25zdHJ1Y3RvciIsIlVwZ3JhZGVBZGFwdGVyUmVmLl9ib290c3RyYXBEb25lIiwiVXBncmFkZUFkYXB0ZXJSZWYucmVhZHkiLCJVcGdyYWRlQWRhcHRlclJlZi5kaXNwb3NlIiwiZ2V0Q29tcG9uZW50SW5mbyIsInBhcnNlRmllbGRzIiwib25FcnJvciIsImNvbnRyb2xsZXJLZXkiLCJEb3duZ3JhZGVOZzJDb21wb25lbnRBZGFwdGVyIiwiRG93bmdyYWRlTmcyQ29tcG9uZW50QWRhcHRlci5jb25zdHJ1Y3RvciIsIkRvd25ncmFkZU5nMkNvbXBvbmVudEFkYXB0ZXIuYm9vdHN0cmFwTmcyIiwiRG93bmdyYWRlTmcyQ29tcG9uZW50QWRhcHRlci5zZXR1cElucHV0cyIsIkRvd25ncmFkZU5nMkNvbXBvbmVudEFkYXB0ZXIucHJvamVjdENvbnRlbnQiLCJEb3duZ3JhZGVOZzJDb21wb25lbnRBZGFwdGVyLnNldHVwT3V0cHV0cyIsIkRvd25ncmFkZU5nMkNvbXBvbmVudEFkYXB0ZXIucmVnaXN0ZXJDbGVhbnVwIiwiTmcxQ2hhbmdlIiwiTmcxQ2hhbmdlLmNvbnN0cnVjdG9yIiwiTmcxQ2hhbmdlLmlzRmlyc3RDaGFuZ2UiLCJVcGdyYWRlTmcxQ29tcG9uZW50QWRhcHRlckJ1aWxkZXIiLCJVcGdyYWRlTmcxQ29tcG9uZW50QWRhcHRlckJ1aWxkZXIuY29uc3RydWN0b3IiLCJVcGdyYWRlTmcxQ29tcG9uZW50QWRhcHRlckJ1aWxkZXIuZXh0cmFjdERpcmVjdGl2ZSIsIlVwZ3JhZGVOZzFDb21wb25lbnRBZGFwdGVyQnVpbGRlci5ub3RTdXBwb3J0ZWQiLCJVcGdyYWRlTmcxQ29tcG9uZW50QWRhcHRlckJ1aWxkZXIuZXh0cmFjdEJpbmRpbmdzIiwiVXBncmFkZU5nMUNvbXBvbmVudEFkYXB0ZXJCdWlsZGVyLmNvbXBpbGVUZW1wbGF0ZSIsIlVwZ3JhZGVOZzFDb21wb25lbnRBZGFwdGVyQnVpbGRlci5jb21waWxlVGVtcGxhdGUuY29tcGlsZUh0bWwiLCJVcGdyYWRlTmcxQ29tcG9uZW50QWRhcHRlckJ1aWxkZXIucmVzb2x2ZSIsIlVwZ3JhZGVOZzFDb21wb25lbnRBZGFwdGVyIiwiVXBncmFkZU5nMUNvbXBvbmVudEFkYXB0ZXIuY29uc3RydWN0b3IiLCJVcGdyYWRlTmcxQ29tcG9uZW50QWRhcHRlci5uZ09uQ2hhbmdlcyIsIlVwZ3JhZGVOZzFDb21wb25lbnRBZGFwdGVyLm5nRG9DaGVjayIsIlVwZ3JhZGVOZzFDb21wb25lbnRBZGFwdGVyLnNldENvbXBvbmVudFByb3BlcnR5IiwiVXBncmFkZU5nMUNvbXBvbmVudEFkYXB0ZXIucmVzb2x2ZVJlcXVpcmVkIiwibm9OZyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELE87QUNWQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1QkFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQ3RDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUNBLFFBQVFBLEVBQUVBLENBQUNBO2FBQ2hDQSxJQUFJQSxDQUFDQSxXQUFXQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxVQUFVQSxDQUFDQTtTQUN2Q0EsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDZkEsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsUUFBUUEsQ0FBQ0E7YUFDakNBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBO2FBQ2hDQSxJQUFJQSxDQUFDQSxXQUFXQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxVQUFVQSxDQUFDQTtTQUN2Q0EsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDZkEsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsUUFBUUEsQ0FBQ0E7YUFDakNBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBO2FBQ2hDQSxJQUFJQSxDQUFDQSxXQUFXQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxVQUFVQSxDQUFDQTtTQUN2Q0EsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDZkEsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsUUFBUUEsQ0FBQ0E7YUFDakNBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBO2FBQ2hDQSxJQUFJQSxDQUFDQSxXQUFXQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxVQUFVQSxDQUFDQTtTQUN2Q0EsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDZkEsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsUUFBUUEsQ0FBQ0E7YUFDakNBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBO2FBQ2hDQSxJQUFJQSxDQUFDQSxXQUFXQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxVQUFVQSxDQUFDQTtTQUN2Q0EsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDZkEsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsUUFBUUEsQ0FBQ0E7YUFDakNBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBO2FBQ2hDQSxJQUFJQSxDQUFDQSxXQUFXQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxVQUFVQSxDQUFDQTtTQUN2Q0EsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDZkEsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsUUFBUUEsQ0FBQ0E7YUFDakNBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBO2FBQ2hDQSxJQUFJQSxDQUFDQSxXQUFXQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxVQUFVQSxDQUFDQTtTQUN2Q0EsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDZkEsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsUUFBUUEsQ0FBQ0E7YUFDakNBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBO2FBQ2hDQSxJQUFJQSxDQUFDQSxXQUFXQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxVQUFVQSxDQUFDQTtTQUN2Q0EsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDZkEsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsUUFBUUEsQ0FBQ0E7YUFDakNBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBO2FBQ2hDQSxJQUFJQSxDQUFDQSxXQUFXQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxVQUFVQSxDQUFDQTtTQUN2Q0EsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFREQsd0RBQWtCQSxHQUFsQkEsVUFBbUJBLEtBQWFBO1NBQzlCRSxFQUFFQSxDQUFDQSxDQUFDQSxLQUFLQSxJQUFJQSxDQUFDQSxDQUFDQTthQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQTtTQUN0Q0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsS0FBS0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0E7U0FDdENBLEVBQUVBLENBQUNBLENBQUNBLEtBQUtBLElBQUlBLENBQUNBLENBQUNBO2FBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBO1NBQ3RDQSxFQUFFQSxDQUFDQSxDQUFDQSxLQUFLQSxJQUFJQSxDQUFDQSxDQUFDQTthQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQTtTQUN0Q0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsS0FBS0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0E7U0FDdENBLEVBQUVBLENBQUNBLENBQUNBLEtBQUtBLElBQUlBLENBQUNBLENBQUNBO2FBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBO1NBQ3RDQSxFQUFFQSxDQUFDQSxDQUFDQSxLQUFLQSxJQUFJQSxDQUFDQSxDQUFDQTthQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQTtTQUN0Q0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsS0FBS0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0E7U0FDdENBLEVBQUVBLENBQUNBLENBQUNBLEtBQUtBLElBQUlBLENBQUNBLENBQUNBO2FBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBO1NBQ3RDQSxFQUFFQSxDQUFDQSxDQUFDQSxLQUFLQSxJQUFJQSxDQUFDQSxDQUFDQTthQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQTtTQUN0Q0EsTUFBTUEsSUFBSUEsNkJBQWdCQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQTtLQUNwQ0EsQ0FBQ0E7S0FFREYsNERBQXNCQSxHQUF0QkEsVUFBdUJBLFFBQWtCQTtTQUN2Q0csTUFBTUEsQ0FBQ0EsSUFBSUEsc0JBQXNCQSxDQUFDQSxRQUFRQSxFQUFFQSxJQUFJQSxDQUFD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QSxDQUFDQSxDQUFDQSxDQUFDQSxNQUFNQSxLQUFLQSxLQUFLQSxJQUFJQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxXQUFXQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUM1REEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsS0FBS0EsaUJBQVNBLENBQUNBLENBQUNBLENBQUNBO2lCQUM1QkEsSUFBSUEsQ0FBQ0EsSUFBSUEsR0FBR0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0E7YUFDbkRBLENBQUNBO2FBQ0RBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBO1NBQ25CQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxNQUFNQSxLQUFLQSxLQUFLQSxJQUFJQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxXQUFXQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUM1REEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsS0FBS0EsaUJBQVNBLENBQUNBLENBQUNBLENBQUNBO2lCQUM1QkEsSUFBSUEsQ0FBQ0EsSUFBSUEsR0FBR0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0E7YUFDbkRBLENBQUNBO2FBQ0RBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBO1NBQ25CQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxNQUFNQSxLQUFLQSxLQUFLQSxJQUFJQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxXQUFXQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUM1REEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsS0FBS0EsaUJBQVNBLENBQUNBLENBQUNBLENBQUNBO2lCQUM1QkEsSUFBSUEsQ0FBQ0EsSUFBSUEsR0FBR0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0E7YUFDbkRBLENBQUNBO2FBQ0RBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBO1NBQ25CQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxNQUFNQSxLQUFLQSxLQUFLQSxJQUFJQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxXQUFXQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUM1REEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsS0FBS0EsaUJBQVNBLENBQUNBLENBQUNBLENBQUNBO2lCQUM1QkEsSUFBSUEsQ0FBQ0EsSUFBSUEsR0FBR0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0E7YUFDbkRBLENBQUNBO2FBQ0RBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBO1NBQ25CQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxNQUFNQSxLQUFLQSxLQUFLQSxJQUFJQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxXQUFXQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUM1REEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsS0FBS0EsaUJBQVNBLENBQUNBLENBQUNBLENBQUNBO2lCQUM1QkEsSUFBSUEsQ0FBQ0EsSUFBSUEsR0FBR0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0E7YUFDbkRBLENBQUNBO2FBQ0RBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBO1NBQ25CQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxNQUFNQSxLQUFLQSxLQUFLQSxJQUFJQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxXQUFXQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUM1REEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsS0FBS0EsaUJBQVNBLENBQUNBLENBQUNBLENBQUNBO2lCQUM1QkEsSUFBSUEsQ0FBQ0EsSUFBSUEsR0FBR0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0E7YUFDbkRBLENBQUNBO2FBQ0RBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBO1NBQ25CQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxNQUFNQSxLQUFLQSxLQUFLQSxJQUFJQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxXQUFXQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUM1REEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsS0FBS0EsaUJBQVNBLENBQUNBLENBQUNBLENBQUNBO2lCQUM1QkEsSUFBSUEsQ0FBQ0EsSUFBSUEsR0FBR0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0E7YUFDbkRBLENBQUNBO2FBQ0RBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBO1NBQ25CQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxNQUFNQSxLQUFLQSxLQUFLQSxJQUFJQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxXQUFXQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUM1REEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsS0FBS0EsaUJBQVNBLENBQUNBLENBQUNBLENBQUNBO2lCQUM1QkEsSUFBSUEsQ0FBQ0EsSUFBSUEsR0FBR0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0E7YUFDbkRBLENBQUNBO2FBQ0RBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBO1NBQ25CQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxNQUFNQSxLQUFLQSxLQUFLQSxJQUFJQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxXQUFXQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUM1REEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsS0FBS0EsaUJBQVNBLENBQUNBLENBQUNBLENBQUNBO2lCQUM1QkEsSUFBSUEsQ0FBQ0EsSUFBSUEsR0FBR0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0E7YUFDbkRBLENBQUNBO2FBQ0RBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBO1NBQ25CQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxNQUFNQSxLQUFLQSxLQUFLQSxJQUFJQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxXQUFXQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUM1REEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsS0FBS0EsaUJBQVNBLENBQUNBLENBQUNBLENBQUNBO2lCQUM1QkEsSUFBSUEsQ0FBQ0EsSUFBSUEsR0FBR0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0E7YUFDbkRBLENBQUNBO2FBQ0RBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBO1NBQ25CQSxDQUFDQTtTQUVEQSxNQUFNQSxDQUFDQSxpQkFBU0EsQ0FBQ0E7S0FDbkJBLENBQUNBO0tBRURMLDhDQUFhQSxHQUFiQSxVQUFjQSxLQUFhQTtTQUN6Qk0sRUFBRUEsQ0FBQ0EsQ0FBQ0EsS0FBS0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7U0FDakNBLEVBQUVBLENBQUNBLENBQUNBLEtBQUtBLElBQUlBLENBQUNBLENBQUNBO2FBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBO1NBQ2pDQSxFQUFFQSxDQUFDQSxDQUFDQSxLQUFLQSxJQUFJQSxDQUFDQSxDQUFDQTthQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQTtTQUNqQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsS0FBS0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7U0FDakNBLEVBQUVBLENBQUNBLENBQUNBLEtBQUtBLElBQUlBLENBQUNBLENBQUNBO2FBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBO1NBQ2pDQSxFQUFFQSxDQUFDQSxDQUFDQSxLQUFLQSxJQUFJQSxDQUFDQSxDQUFDQTthQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQTtTQUNqQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsS0FBS0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7U0FDakNBLEVBQUVBLENBQUNBLENBQUNB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QUN4Q0EsSUFBSUEsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0E7U0FFekJBLElBQUlBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBO1NBQzdGQSxJQUFJQSxDQUFDQTthQUNIQSxFQUFFQSxHQUFHQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQzlFQSxFQUFFQSxHQUFHQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQzlFQSxFQUFFQSxHQUFHQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQzlFQSxFQUFFQSxHQUFHQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQzlFQSxFQUFFQSxHQUFHQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQzlFQSxFQUFFQSxHQUFHQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQzlFQSxFQUFFQSxHQUFHQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQzlFQSxFQUFFQSxHQUFHQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQzlFQSxFQUFFQSxHQUFHQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQzlFQSxFQUFFQSxHQUFHQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQzlFQSxHQUFHQSxHQUFHQSxNQUFNQSxHQUFHQSxFQUFFQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQ2pGQSxHQUFHQSxHQUFHQSxNQUFNQSxHQUFHQSxFQUFFQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQ2pGQSxHQUFHQSxHQUFHQSxNQUFNQSxHQUFHQSxFQUFFQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQ2pGQSxHQUFHQSxHQUFHQSxNQUFNQSxHQUFHQSxFQUFFQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQ2pGQSxHQUFHQSxHQUFHQSxNQUFNQSxHQUFHQSxFQUFFQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQ2pGQSxHQUFHQSxHQUFHQSxNQUFNQSxHQUFHQSxFQUFFQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQ2pGQSxHQUFHQSxHQUFHQSxNQUFNQSxHQUFHQSxFQUFFQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQ2pGQSxHQUFHQSxHQUFHQSxNQUFNQSxHQUFHQSxFQUFFQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQ2pGQSxHQUFHQSxHQUFHQSxNQUFNQSxHQUFHQSxFQUFFQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQ2pGQSxHQUFHQSxHQUFHQSxNQUFNQSxHQUFHQSxFQUFFQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO1NBQ25GQSxDQUFFQTtTQUFBQSxLQUFLQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNYQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxZQUFZQSxrQ0FBcUJBLElBQUlBLENBQUNBLFlBQVlBLCtCQUFrQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQzFFQSxDQUFDQSxDQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxFQUFFQSxRQUFRQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQTthQUMvQkEsQ0FBQ0E7YUFDREEsTUFBTUEsQ0FBQ0EsQ0FBQ0E7U0FDVkEsQ0FBQ0E7U0FFREEsSUFBSUEsR0FBR0EsQ0FBQ0E7U0FDUkEsSUFBSUEsQ0FBQ0E7YUFDSEEsTUFBTUEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQ2ZBLEtBQUtBLENBQUNBO3FCQUNKQSxHQUFHQSxHQUFHQSxPQUFPQSxFQUFFQSxDQUFDQTtxQkFDaEJBLEtBQUtBLENBQUNBO2lCQUNSQSxLQUFLQSxDQUFDQTtxQkFDSkEsR0FBR0EsR0FBR0EsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0E7cUJBQ2xCQSxLQUFLQSxDQUFDQTtpQkFDUkEsS0FBS0EsQ0FBQ0E7cUJBQ0pBLEdBQUdBLEdBQUdBLE9BQU9BLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLENBQUNBLENBQUNBO3FCQUN0QkEsS0FBS0EsQ0FBQ0E7aUJBQ1JBLEtBQUtBLENBQUNBO3FCQUNKQSxHQUFHQSxHQUFHQSxPQUFPQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxDQUFDQSxDQUFDQTtxQkFDMUJBLEtBQUtBLENBQUNBO2lCQUNSQSxLQUFLQSxDQUFDQTtxQkFDSkEsR0FBR0EsR0FBR0EsT0FBT0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0E7cUJBQzlCQSxLQUFLQSxDQUFDQTtpQkFDUkEsS0FBS0EsQ0FBQ0E7cUJBQ0pBLEdBQUdBLEdBQUdBLE9BQU9BLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLENBQUNBLENBQUNBO3FCQUNsQ0EsS0FBS0EsQ0FBQ0E7aUJBQ1JBLEtBQUtBLENBQUNBO3FCQUNKQSxHQUFHQSxHQUFHQSxPQUFPQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxDQUFDQSxDQUFDQTtxQkFDdENBLEtBQUtBLENBQUNBO2lCQUNSQSxLQUFLQSxDQUFDQTtxQkFDSkEsR0FBR0EsR0FBR0EsT0FBT0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0E7cUJBQzFDQSxLQUFLQSxDQUFDQTtpQkFDUkEsS0FBS0EsQ0FBQ0E7cUJBQ0pBLEdBQUdBLEdBQUdBLE9BQU9BLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLENBQUNBLENBQUNBO3FCQUM5Q0EsS0FBS0EsQ0FBQ0E7aUJBQ1JBLEtBQUtBLENBQUNBO3FCQUNKQSxHQUFHQSxHQUFHQSxPQUFPQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxDQUFDQSxDQUFDQTtxQkFDbERBLEtBQUtBLENBQUNBO2lCQUNSQSxLQUFLQSxFQUFFQTtxQkFDTEEsR0FBR0EsR0FBR0EsT0FBT0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0E7cUJBQ3REQSxLQUFLQSxDQUFDQTtpQkFDUkEsS0FBS0EsRUFBRUE7cUJBQ0xBLEdBQUdBLEdBQUdBLE9BQU9BLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBO3FCQUMzREEsS0FBS0EsQ0FBQ0E7aUJBQ1JBLEtBQUtBLEVBQUVBO3FCQUNMQSxHQUFHQSxHQUFHQSxPQUFPQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQTtxQkFDaEVBLEtBQUtBLENBQUNBO2lCQUNSQSxLQUFLQSxFQUFFQTtxQkFDTEEsR0FBR0EsR0FBR0EsT0FBT0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0E7cUJBQ3JFQSxLQUFLQSxDQUFDQTtpQkFDUkEsS0FBS0EsRUFBRUE7cUJBQ0xBLEdBQUdBLEdBQUdBLE9BQU9BLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBO3FCQUMxRUEsS0FBS0EsQ0FBQ0E7aUJBQ1JBLEtBQUtBLEVBQUVBO3FCQUNMQSxHQUFHQSxHQUFHQSxPQUFPQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQTtxQkFDL0VBLEtBQUtBLENBQUNBO2lCQUNSQSxLQUFLQSxFQUFFQTtxQkFDTEEsR0FBR0EsR0FBR0EsT0FBT0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0E7cUJBQ3BGQSxLQUFLQSxDQUFDQTtpQkFDUkEsS0FBS0EsRUFBRUE7cUJBQ0xBLEdBQUdBLEdBQUdBLE9BQU9BLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBO3FCQUN6RkEsS0FBS0EsQ0FBQ0E7aUJBQ1JBLEtBQUtBLEVBQUVBO3FCQUNMQSxHQUFHQSxHQUFHQSxPQUFPQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUN6RUEsR0FBR0EsQ0FBQ0EsQ0FBQ0E7cUJBQ25CQSxLQUFLQSxDQUFDQTtpQkFDUkEsS0FBS0EsRUFBRUE7cUJBQ0xBLEdBQUdBLEdBQUdBLE9BQU9BLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVB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LENBQUNBO2FBQ2pCQSxLQUFLQSxDQUFDQTtpQkFDSkEsTUFBTUEsQ0FBQ0EsY0FBTUEsV0FBSUEsQ0FBQ0EsRUFBRUEsRUFBUEEsQ0FBT0EsQ0FBQ0E7YUFDdkJBLEtBQUtBLENBQUNBO2lCQUNKQSxNQUFNQSxDQUFDQSxVQUFDQSxFQUFFQSxJQUFLQSxXQUFJQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFUQSxDQUFTQSxDQUFDQTthQUMzQkEsS0FBS0EsQ0FBQ0E7aUJBQ0pBLE1BQU1BLENBQUNBLFVBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLElBQUtBLFdBQUlBLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLENBQUNBLEVBQWJBLENBQWFBLENBQUNBO2FBQ25DQSxLQUFLQSxDQUFDQTtpQkFDSkEsTUFBTUEsQ0FBQ0EsVUFBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsSUFBS0EsV0FBSUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsRUFBakJBLENBQWlCQSxDQUFDQTthQUMzQ0EsS0FBS0EsQ0FBQ0E7aUJBQ0pBLE1BQU1BLENBQUNBLFVBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLElBQUtBLFdBQUlBLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLENBQUNBLEVBQXJCQSxDQUFxQkEsQ0FBQ0E7YUFDbkRBLEtBQUtBLENBQUNBO2lCQUNKQSxNQUFNQSxDQUFDQSxVQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxJQUFLQSxXQUFJQSxDQUFDQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxDQUFDQSxFQUF6QkEsQ0FBeUJBLENBQUNBO2FBQzNEQSxLQUFLQSxDQUFDQTtpQkFDSkEsTUFBTUEsQ0FBQ0EsVUFBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsSUFBS0EsV0FBSUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsRUFBN0JBLENBQTZCQSxDQUFDQTthQUNuRUEsS0FBS0EsQ0FBQ0E7aUJBQ0pBLE1BQU1BLENBQUNBLFVBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLElBQUtBLFdBQUlBLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLENBQUNBLEVBQWpDQSxDQUFpQ0EsQ0FBQ0E7YUFDM0VBLEtBQUtBLENBQUNBO2lCQUNKQSxNQUFNQSxDQUFDQSxVQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxJQUFLQSxXQUFJQSxDQUFDQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxDQUFDQSxFQUFyQ0EsQ0FBcUNBLENBQUNBO2FBQ25GQSxLQUFLQSxDQUFDQTtpQkFDSkEsTUFBTUEsQ0FBQ0EsVUFBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsSUFBS0EsV0FBSUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsRUFBekNBLENBQXlDQSxDQUFDQTthQUMzRkEsS0FBS0EsRUFBRUE7aUJBQ0xBLE1BQU1BLENBQUNBLFVBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEdBQUdBOzRCQUNwQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsR0FBR0EsQ0FBQ0E7aUJBQTlDQSxDQUE4Q0EsQ0FBQ0E7YUFDNURBLEtBQUtBLEVBQUVBO2lCQUNMQSxNQUFNQSxDQUFDQSxVQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQTs0QkFDekNBLElBQUlBLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBO2lCQUFuREEsQ0FBbURBLENBQUNBO2FBQ2pFQSxLQUFLQSxFQUFFQTtpQkFDTEEsTUFBTUEsQ0FBQ0EsVUFBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0E7NEJBQzlDQSxJQUFJQSxDQUFDQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQTtpQkFBeERBLENBQXdEQSxDQUFDQTthQUN0RUEsS0FBS0EsRUFBRUE7aUJBQ0xBLE1BQU1BLENBQUNBLFVBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBOzRCQUNuREEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0E7aUJBQTdEQSxDQUE2REEsQ0FBQ0E7YUFDM0VBLEtBQUtBLEVBQUVBO2lCQUNMQSxNQUFNQSxDQUFDQSxVQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQTs0QkFDeERBLElBQUlBLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBO2lCQUFsRUEsQ0FBa0VBLENBQUNBO2FBQ2hGQSxLQUFLQSxFQUFFQTtpQkFDTEEsTUFBTUEsQ0FBQ0EsVUFBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0E7NEJBQzdEQSxJQUFJQSxDQUFDQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQTtpQkFBdkVBLENBQXVFQSxDQUFDQTthQUNyRkEsS0FBS0EsRUFBRUE7aUJBQ0xBLE1BQU1BLENBQUNBLFVBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBOzRCQUNsRUEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0E7aUJBQTVFQSxDQUE0RUEsQ0FBQ0E7YUFDMUZBLEtBQUtBLEVBQUVBO2lCQUNMQSxNQUFNQSxDQUFDQSxVQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQTs0QkFDdkVBLElBQUlBLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQ3JFQSxHQUFHQSxDQUFDQTtpQkFEVkEsQ0FDVUEsQ0FBQ0E7YUFDeEJBLEtBQUtBLEVBQUVBO2lCQUNMQSxNQUFNQSxDQUFDQSxVQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQTs0QkFDNUVBLElBQUlBLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQzFFQSxHQUFHQSxDQUFDQTtpQkFEVkEsQ0FDVUEsQ0FBQ0E7YUFDeEJBLEtBQUtBLEVBQUVBO2lCQUNMQSxNQUFNQSxDQUFDQSxVQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUMvRUEsR0FBR0E7NEJBQUtBLElBQUlBLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQ3JFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQTtpQkFEcEJBLENBQ29CQSxDQUFDQTthQUN2Q0EsS0FBS0EsRUFBRUE7aUJBQ0xBLE1BQU1BLENBQUNBLFVBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVB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QSxFQUFFQSxDQUFDQSxDQUFDQSxLQUFLQSxDQUFDQSxNQUFNQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUN0QkEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7U0FDZEEsQ0FBQ0E7U0FDREEsSUFBSUEsT0FBT0EsR0FBR0EsRUFBRUEsQ0FBQ0E7U0FDakJBLElBQUlBLFdBQVdBLEdBQUdBLEVBQUVBLENBQUNBO1NBRXJCQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxLQUFLQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQSxFQUFFQSxFQUFFQSxDQUFDQTthQUN0Q0EsSUFBSUEsSUFBSUEsR0FBV0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDNUJBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2lCQUNoQkEsZUFBZUE7aUJBQ2ZBLE9BQU9BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO2FBQ3JCQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxFQUFFQSxDQUFDQSxNQUFNQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDbENBLElBQUlBLE1BQU1BLEdBQUdBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLFFBQVFBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO2lCQUN4Q0EsSUFBSUEsR0FBR0EsR0FBR0EsSUFBSUEsU0FBU0EsQ0FBQ0EsS0FBS0EsRUFBRUEsUUFBUUEsRUFBRUEsTUFBTUEsRUFBRUEsSUFBSUEsQ0FBQ0EsVUFBVUEsRUFBRUEsS0FBS0EsQ0FBQ0EsQ0FBQ0EsVUFBVUEsRUFBRUEsQ0FBQ0E7aUJBQ3RGQSxXQUFXQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQTthQUN4QkEsQ0FBQ0E7YUFBQ0Es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QUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2lCQUN0Q0EsTUFBTUEsR0FBR0EsSUFBSUEsWUFBTUEsQ0FBQ0EsR0FBR0EsRUFBRUEsTUFBTUEsRUFBRUEsSUFBSUEsQ0FBQ0EsV0FBV0EsRUFBRUEsQ0FBQ0EsQ0FBQ0E7YUFDdkRBLENBQUNBO2FBQUNBLElBQUlBLENBQUNBLENBQUNBO2lCQUNOQSxNQUFNQSxDQUFDQSxNQUFNQSxDQUFDQTthQUNoQkEsQ0FBQ0E7U0FDSEEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFRHZCLCtCQUFXQSxHQUFYQTtTQUNFd0IsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUMvQkEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsV0FBV0EsRUFBRUEsQ0FBQ0E7U0FDNUJBLENBQUNBO1NBQUNBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDdENBLE1BQU1BLENBQUNBLElBQUlBLFlBQU1BLENBQUNBLEdBQUdBLEVBQUVBLElBQUlBLHNCQUFnQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsSUFBSUEsQ0FBQ0EsV0FBV0EsRUFBRUEsQ0FBQ0EsQ0FBQ0E7U0FDdEVBLENBQUNBO1NBQUNBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDdENBLE1BQU1BLENBQUNBLElBQUlBLGVBQVNBLENBQUNBLElBQUlBLENBQUNBLFdBQVdBLEVBQUVBLENBQUNBLENBQUNBO1NBQzNDQSxDQUFDQTtTQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTthQUNOQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxjQUFjQSxFQUFFQSxDQUFDQTtTQUMvQkEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FF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Q0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7U0FDOUJBLElBQUlBLEdBQUdBLEdBQUdBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO1NBQzlCQSxJQUFJQSxLQUFLQSxHQUFHQSxHQUFHQSxDQUFDQSxLQUFLQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUNsQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EseUJBQVVBLENBQUNBLFVBQVVBLEVBQUVBLElBQUlBLEVBQUVBLElBQUlBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEtBQUtBLENBQUNBLEVBQUVBLElBQUlBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBO0tBQ3JGQSxDQUFDQTtLQUVEVCwyREFBcUJBLEdBQXJCQSxVQUFzQkEsR0FBcUJBO1NBQ3pDVSxJQUFJQSxRQUFRQSxHQUFHQSxHQUFHQSxDQUFDQSxRQUFRQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUN4Q0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EseUJBQVVBLENBQUNBLFlBQVlBLEVBQUVBLEdBQUdBLENBQUNBLElBQUlBLEVBQUVBLEdBQUdBLENBQUNBLE1BQU1BLEVBQUVBLEVBQUVBLEVBQUVBLElBQUlBLEVBQUVBLFFBQVFBLENBQUNBLENBQUNBO0tBQzVGQSxDQUFDQTtLQUVEVixxREFBZUEsR0FBZkEsVUFBZ0JBLEdBQWVBO1NBQzdCVyxJQUFJQSxRQUFRQSxHQUFHQSxHQUFHQSxDQUFDQSxRQUFRQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUN4Q0EsSUFBSUEsSUFBSUEsR0FBR0EsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7U0FDcENBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxJQUFJQSx3QkFBV0Es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R0FBR0EsSUFBSUEsQ0FBQ0E7S0FDeENBLElBQUlBLEVBQUVBLEdBQUdBLE1BQU1BLEdBQUdBLENBQUNBLEdBQUdBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO0tBQ3hDQSxJQUFJQSxFQUFFQSxHQUFHQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQTtLQUN4Q0EsSUFBSUEsRUFBRUEsR0FBR0EsTUFBTUEsR0FBR0EsQ0FBQ0EsR0FBR0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0E7S0FDeENBLElBQUlBLEVBQUVBLEdBQUdBLE1BQU1BLEdBQUdBLENBQUNBLEdBQUdBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO0tBQ3hDQSxNQUFNQSxDQUFDQSxDQUFDQSxNQUFNQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtTQUNuQkEsS0FBS0EsQ0FBQ0E7YUFDSkEsTUFBTUEsQ0FBQ0EsVUFBQ0EsRUFBRUEsSUFBS0EsU0FBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsRUFBRUEsRUFBZkEsQ0FBZUEsQ0FBQ0E7U0FDakNBLEtBQUtBLENBQUNBO2FBQ0pBLE1BQU1BLENBQUNBLFVBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLElBQUtBLFNBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEVBQTVCQSxDQUE0QkEsQ0FBQ0E7U0FDbERBLEtBQUtBLENBQUNBO2FBQ0pBLE1BQU1BLENBQUNBLFVBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLElBQUtBLFNBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEVBQXpDQSxDQUF5Q0EsQ0FBQ0E7U0FDbkVBLEtBQUtBLENBQUNBO2FBQ0pBLE1BQU1BLENBQUNBLFVBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLElBQUtBLFNBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEVBQXREQSxDQUFzREEsQ0FBQ0E7U0FDcEZBLEtBQUtBLENBQUNBO2FBQ0pBLE1BQU1BLENBQUNBLFVBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBO3dCQUNmQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQTthQUFuRUEsQ0FBbUVBLENBQUNBO1NBQ2pGQSxLQUFLQSxDQUFDQTthQUNKQSxNQUFNQSxDQUFDQSxVQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQTt3QkFDbkJBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBO2FBQWhGQSxDQUFnRkEsQ0FBQ0E7U0FDOUZBLEtBQUtBLENBQUNBO2FBQ0pBLE1BQU1BLENBQUNBLFVBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLElBQUtBLFNBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBO2lCQUNqREEsRUFBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsRUFBRUEsRUFEekNBLENBQ3lDQSxDQUFDQTtTQUNuRkEsS0FBS0EsQ0FBQ0E7YUFDSkEsTUFBTUEsQ0FBQ0EsVUFBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsSUFBS0EsU0FBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0E7aUJBQ2pEQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQTtpQkFDakRBLEVBQUVBLEVBRkZBLENBRUVBLENBQUNBO1NBQ2hEQSxLQUFLQSxDQUFDQTthQUNKQSxNQUFNQSxDQUFDQSxVQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxJQUFLQSxTQUFFQSxHQUFHQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQTtpQkFDekNBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBO2lCQUM1Q0EsRUFBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsRUFBRUEsRUFGNUJBLENBRTRCQSxDQUFDQTtTQUM5RUE7YUFDRUEsTUFBTUEsSUFBSUEsMEJBQWFBLENBQUNBLDBDQUEwQ0EsQ0FBQ0EsQ0FBQ0E7S0FDeEVBLENBQUNBO0FBQ0hBLEVBQUNBOzs7Ozs7O0FDdGRELGtD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RUEsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDNUROLDRCQUFRQSxHQUFmQSxVQUFnQkEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsSUFBV08sTUFBTUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDcEVQLDRCQUFRQSxHQUFmQSxVQUFnQkEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsSUFBV1EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDNUVSLDRCQUFRQSxHQUFmQSxVQUFnQkEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsSUFBV1MsTUFBTUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDcEZULDRCQUFRQSxHQUFmQSxVQUFnQkEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUE7U0FDNUNVLE1BQU1BLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLENBQUNBLENB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LEVBQUVBLENBQUNBLENBQUNBLDJDQUFtQkEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtxQkFDaEVBLFNBQVNBLEdBQUdBLDJDQUFtQkEsQ0FBQ0EsV0FBV0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0E7cUJBRXZEQSxFQUFFQSxDQUFDQSxDQUFDQSxLQUFLQSxDQUFDQSxhQUFhQSxDQUFDQSxDQUFDQSxDQUFDQTt5QkFDeEJBLElBQUlBLE1BQU1BLEdBQUdBLDJDQUFtQkEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsQ0FBQ0EsQ0FBQ0E7eUJBQ3BFQSxFQUFFQSxDQUFDQSxDQUFDQSxhQUFhQSxDQUFDQTs2QkFBQ0EsSUFBSUEsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxDQUFDQSxDQUFDQTt5QkFFakVBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLEtBQUtBLEVBQUVBLFNBQVNBLEVBQUVBLE1BQU1BLENBQUNBLENBQUNBO3lCQUMxQ0EsSUFBSUEsQ0FBQ0EsV0FBV0EsQ0FBQ0EsS0FBS0EsRUFBRUEsSUFBSUEsQ0FBQ0EsQ0FBQ0E7eUJBRTlCQSxNQUFNQSxDQUFDQSxNQUFNQSxDQUFDQTtxQkFFaEJBLENBQUNBO3FCQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTt5QkFDTkEsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsS0FBS0EsRUFBRUEsU0FBU0EsRUFBRUEsTUFBTUEsQ0FBQ0EsQ0FBQ0E7eUJBQzFDQSxJQUFJQSxDQUFDQSxXQUFXQSxDQUFDQSxLQUFLQSxFQUFFQSxJQUFJQSxDQUFDQSxDQUFDQTt5QkFDOUJBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBO3FCQUNkQSxDQUFDQTtpQkFDSEEsQ0FBQ0E7aUJBQUNBLElBQUlBLENBQUNBLENBQUNBO3FCQUNOQSxJQUFJQSxDQUFDQSxXQUFXQSxDQUFDQSxLQUFLQSxFQUFFQSxLQUFLQSxDQUFDQSxDQUFDQTtxQkFDL0JBLE1BQU1BLENB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Q0FBQ0E7U0FFREEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsSUFBSUEsR0FBR0EsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsTUFBTUEsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsRUFBRUEsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0E7YUFDM0RBLElBQUlBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQzNCQSxFQUFFQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxZQUFZQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDdkJBLFNBQVNBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLFdBQVdBLENBQUNBLEdBQUdBLENBQUNBLFNBQVNBLENBQUNBLENBQUNBLENBQUNBO2FBQ2xEQSxDQUFDQTtTQUNIQSxDQUFDQTtTQUVEQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxJQUFJQSxHQUFHQSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLE1BQU1BLEVBQUVBLENBQUNBLEdBQUdBLElBQUlBLEVBQUVBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBO2FBQ3BFQSxJQUFJQSxJQUFJQSxHQUFHQSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQ3JDQSxTQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLENBQUNBLENBQUNBO2FBQzNEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSx3QkFBd0JBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBO2lCQUNyQ0EsU0FBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7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QSxRQUFRQSxFQUFFQSxFQUExQkEsQ0FBMEJBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO3FCQUN2REEsY0FBUUEsZUFBZUEsQ0FBQ0EsUUFBUUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDckVBLENBQUNBO1NBQ0hBLENBQUNBO1NBQUNBLElBQUlBLENBQUNBLENBQUNBO2FBQ05BLFdBQVdBLEdBQUdBLElBQUlBLENBQUNBLFFBQVFBLEdBQUdBLFVBQUNBLEtBQUtBLElBQU9BLFVBQVVBLENBQUNBLGNBQU1BLHNCQUFlQSxDQUFDQSxLQUFLQSxDQUFDQSxFQUF0QkEsQ0FBc0JBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2lCQUN4REEsVUFBQ0EsS0FBS0EsSUFBT0EsZUFBZUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFFckVBLEVBQUVBLENBQUNBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBLENBQUNBO2lCQUNWQSxPQUFPQTtxQkFDSEEsSUFBSUEsQ0FBQ0EsUUFBUUEsR0FBR0EsVUFBQ0EsR0FBR0EsSUFBT0EsVUFBVUEsQ0FBQ0EsY0FBTUEsWUFBS0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBVkEsQ0FBVUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsVUFBQ0EsR0FBR0EsSUFBT0EsS0FBS0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDNUZBLENBQUNBO2FBRURBLEVBQUVBLENBQUNBLENBQUNBLFFBQVFBLENBQUNBLENBQUNBLENBQUNBO2lCQUNiQSxVQUFVQTtxQkFDTkEsSUFBSUEsQ0FBQ0EsUUFBUUEsR0FBR0EsY0FBUUEsVUFBVUEsQ0FBQ0EsY0FBTUEsZUFBUUEsRUFBRUEsRUFBVkEsQ0FBVUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsY0FBUUEsUUFBUUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDdEZBLENBQUNBO1NBQ0hBLENBQUNBO1NBRURBLE1BQU1B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QUNBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO1NBQ2pDQSxDQUFDQTtTQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTthQUNOQSxNQUFNQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtTQUNqQ0EsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FDREEsTUFBTUEsQ0FBQ0EsTUFBTUEsQ0FBQ0E7QUFDaEJBLEVBQUNBO0FBRUQsd0JBQXVCLElBQVcsRUFBRSxHQUFtQztLQUNyRUMsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsTUFBTUEsRUFBRUEsQ0FBQ0EsRUFBRUEsRUFBRUEsQ0FBQ0E7U0FDckNBLElBQUlBLElBQUlBLEdBQUdBLHNCQUFpQkEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7U0FDdENBLEVBQUVBLENBQUNBLENBQUNBLGNBQU9BLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQ2xCQSxhQUFhQSxDQUFDQSxJQUFJQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQTtTQUMzQkEsQ0FBQ0E7U0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFDTkEsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7U0FDakJBLENBQUNBO0tBQ0hBLENBQUNBO0FBQ0hBLEVBQUNBO0FBRUQsMkJBQTBCLEdBQTBCLEVBQUUsR0FBYTtLQUNqRUMsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsR0FBR0EsQ0FBQ0EsTUFBTUEsRUFBRUEsQ0FBQ0EsRUFBRUEsRUFBRUEsQ0FBQ0E7U0FDcENBLElBQUlB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RUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsaUJBQWlCQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDMUJBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLGtCQUFrQkEsQ0FBQ0EsVUFBVUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsRUFBRUEsWUFBWUEsQ0FBQ0EsQ0FBQ0E7YUFDckVBLENBQUNBO2FBQUNBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLGtCQUFrQkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQ2xDQSxJQUFJQSxDQUFDQSxRQUFRQSxDQUFDQSxtQkFBbUJBLENBQUNBLFVBQVVBLEVBQUVBLENBQUNBLENBQUNBLElBQUlBLEVBQ2xCQSxnQkFBU0EsQ0FBQ0EsWUFBWUEsQ0FBQ0EsR0FBR0EsS0FBR0EsWUFBY0EsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFDeEZBLENBQUNBO2FBQUNBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLGNBQWNBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBO2lCQUM5QkEsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsVUFBVUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsRUFBRUEsWUFBWUEsQ0FBQ0EsQ0FBQ0E7YUFDbEVBLENBQUNBO2FBQUNBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLGNBQWNBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBO2lCQUM5QkEsSUFBSUEsSUFBSUEsR0FBR0EsZ0JBQVNBLENBQUNBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLElBQUlBLEdBQUdBLEVBQUVBLENBQUNBO2lCQUMzQ0EsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsVUFBVUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsRUFDbEJBLGdCQUFTQSxDQUFDQSxZQUFZQSxDQUFDQSxHQUFH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LFNBQVNBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLENBQUNBLENBQUNBO1NBQ3ZFQSxFQUFFQSxDQUFDQSxDQUFDQSxTQUFTQSxDQUFDQSxNQUFNQSxHQUFHQSxDQUFDQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxHQUFHQSxJQUFJQSxRQUFRQSxDQUFDQSxTQUFTQSxDQUFDQSxDQUFDQSxDQUFDQSxFQUFFQSxFQUFFQSxDQUFDQSxDQUFDQTtTQUN2RUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0E7YUFBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsR0FBR0EsSUFBSUEsUUFBUUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0E7S0FDekVBLENBQUNBO0tBRURELHNEQUF3QkEsR0FBeEJBO1NBQ0VFLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxXQUFXQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQTtTQUNqRkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLFdBQVdBLENBQUNBO2FBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBO1NBQ2pGQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsV0FBV0EsQ0FBQ0E7YUFBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0E7S0FDbkZBLENBQUNBO0tBRURGLG1EQUFxQkEsR0FBckJBO1NBQ0VHLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxXQUFXQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQTtTQUNoRkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLFdBQVdBLENBQUNBO2FBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBO1NBQ2hGQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsV0FBV0EsQ0FBQ0E7YUFBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0E7S0FDbEZBLENBQUNBO0tBRURILHFDQUFPQSxHQUFQQTtTQUNFSSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0E7YUFBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsT0FBT0EsRUFBRUEsQ0FBQ0E7U0FDbERBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxPQUFPQSxFQUFFQSxDQUFDQTtTQUNsREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBO2FBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLE9BQU9BLEVBQUVBLENBQUNBO0tBQ3BEQSxDQUFDQTtLQUVESix1Q0FBU0EsR0FBVEE7U0FDRUssRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBO2FBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBO1NBQ3BEQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0E7YUFBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0E7U0FDcERBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQTtLQUN0REEsQ0FBQ0E7S0FFREwsa0RBQW9CQSxHQUFwQkE7U0FDRU0sRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLFdBQVdBLENBQUNBLENBQUNBLENBQUNBO2FBQ3ZEQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQTtTQUN2QkEsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLFdBQVdBLENBQUNBLENBQUNBLENBQUNBO2FBQ3ZEQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQTtTQUN2QkEsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLFdBQVdBLENBQUNBLENBQUNBLENBQUNBO2FBQ3ZEQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQTtTQUN2QkEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFRE4sK0NBQWlCQSxHQUFqQkE7U0FDRU8sRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLFdBQVdBLENBQUNBLENBQUNBLENBQUNBO2FBQ3REQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQTtTQUN2QkEsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLFdBQVdBLENBQUNBLENBQUNBLENBQUNBO2FBQ3REQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQTtTQUN2QkEsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLFdBQVdBLENBQUNBLENBQUNBLENBQUNBO2FBQ3REQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQTtTQUN2QkEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFRFAsdUNBQVNBLEdBQVRBLFVBQVVBLEtBQW9CQTtTQUM1QlEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLGFBQWFBLENBQUNBLEtBQUtBLEtBQUtBLEtBQUtBLENBQUNBLENBQUNBLENBQUNBO2FBQ3hFQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQTtTQUNyQkEsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNB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QUNBLENBQUNBLENBQUNBO2FBQ25EQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxXQUFXQSxFQUFFQSxDQUFDQTtTQUN2QkEsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsWUFBWUEsaUJBQWlCQTthQUNwQkEsQ0FBQ0EsQ0FBQ0EsU0FBVUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDbkRBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLFdBQVdBLEVBQUVBLENBQUNBO1NBQ3ZCQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxTQUFTQSxZQUFZQSxpQkFBaUJBO2FBQ3BCQSxDQUFDQSxDQUFDQSxTQUFVQSxDQUFDQSxhQUFhQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNuREEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsV0FBV0EsRUFBRUEsQ0FBQ0E7U0FDdkJBLENBQUNBO1NBQ0RBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLFNBQVNBLFlBQVlBLGlCQUFpQkE7YUFDcEJBLENBQUNBLENBQUNBLFNBQVVBLENBQUNBLGFBQWFBLENBQUNBLENBQUNBLENBQUNBO2FBQ25EQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxXQUFXQSxFQUFFQSxDQUFDQTtTQUN2QkEsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsWUFBWUEsaUJBQWlCQTthQUNwQkEsQ0FBQ0EsQ0FBQ0EsU0FBVUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDbkRBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLFdBQVdBLEVBQUVBLENBQUNBO1NBQ3ZCQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxTQUFTQSxZQUFZQSxpQkFBaUJBO2FBQ3BCQSxDQUFDQSxDQUFDQSxTQUFVQSxDQUFDQSxhQUFhQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNuREEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsV0FBV0EsRUFBRUEsQ0FBQ0E7U0FDdkJBLENBQUNBO1NBQ0RBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLFNBQVNBLFlBQVlBLGlCQUFpQkE7YUFDcEJBLENBQUNBLENBQUNBLFNBQVVBLENBQUNBLGFBQWFBLENBQUNBLENBQUNBLENBQUNBO2FBQ25EQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxXQUFXQSxFQUFFQSxDQUFDQTtTQUN2QkEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFREosb0RBQVlBLEdBQVpBLGNBQXNCSyxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBO0tBRTFETCxzREFBY0EsR0FBZEEsVUFBZUEsR0FBUUE7U0FDckJNLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLE1BQU1BLENBQUNBLHlCQUF5QkEsSUFBSUEsZ0JBQVNBLENBQUNBLEdBQUdBLENBQUNBO2FBQzNEQSxHQUFHQSxDQUFDQSxFQUFFQSxLQUFLQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLGFBQWFBLENBQUNBLE1BQU1BLENBQUNBO0tBQy9EQSxDQUFDQTtLQUVETixrRUFBMEJBLEdBQTFCQSxVQUEyQkEsS0FBb0JBLEVBQUVBLElBQVdBO1NBQzFETyxJQUFJQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBO1NBQzlCQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxhQUFhQSxDQUFDQTtTQUV4QkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLENBQUNBLENBQUNBLFNBQVNBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLFNBQVNBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLEtBQUtBLEtBQUtBLENBQUNBLFFBQVFBLENBQUNBLENBQUNBLENBQUNBO2FBQ3ZFQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxJQUFJQSxLQUFLQSxvQkFBU0EsQ0FBQ0E7aUJBQUNBLENBQUNBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0E7YUFDckZBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO1NBQ3BCQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsS0FBS0EsS0FBS0EsS0FBS0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDdkVBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLElBQUlBLEtBQUtBLG9CQUFTQSxDQUFDQTtpQkFBQ0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxDQUFDQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxDQUFDQSxXQUFXQSxDQUFDQSxDQUFDQTthQUNyRkEsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7U0FDcEJBLENBQUNBO1NBQ0RBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxDQUFDQSxDQUFDQSxTQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxTQUFTQSxDQUFDQSxHQUFHQSxDQUFDQSxLQUFLQSxLQUFLQSxLQUFLQSxDQUFDQSxRQUFRQSxDQUFDQSxDQUFDQSxDQUFDQTthQUN2RUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsS0FBS0Esb0JBQVNBLENBQUNBO2lCQUFDQSxDQUFDQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxtQkFBbUJBLENBQUNBLENBQUNBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLENBQUNBLFdBQVdBLENBQUNBLENBQUNBO2FBQ3JGQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUNwQkEsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLENBQUNBLENBQUNBLFNBQVNBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLFNBQVNBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLEtBQUtBLEtBQUtBLENBQUNBLFFBQVFBLENBQUNBLENBQUNBLENBQUNBO2FBQ3ZFQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxJQUFJQSxLQUFLQSxvQkFBU0EsQ0FBQ0E7aUJBQUNBLENBQUNBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0E7YUFDckZBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO1NBQ3BCQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsS0FBS0EsS0FBS0EsS0FBS0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDdkVBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLElBQUlBLEtBQUtBLG9CQUFTQSxDQUFDQTtpQkFBQ0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxDQUFDQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxDQUFDQSxXQUFXQSxDQUFDQSxDQUFDQTthQUNyRkEsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7U0FDcEJBLENBQUNBO1NBQ0RBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxDQUFDQSxDQUFDQSxTQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxTQUFTQSxDQUFDQSxHQUFHQSxDQUFDQSxLQUFLQSxLQUFLQSxLQUFLQSxDQUFDQSxRQUFRQSxDQUFDQSxDQUFDQSxDQUFDQTthQUN2RUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsS0FBS0Esb0JBQVNBLENBQUNBO2lCQUFDQSxDQUFDQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxtQkFBbUJBLENBQUNBLENBQUNBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLENBQUNBLFdBQVdBLENBQUNBLENBQUNBO2FBQ3JGQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUNwQkEsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLENBQUNBLENBQUNBLFNBQVNBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLFNBQVNBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLEtBQUtBLEtBQUtBLENBQUNBLFFBQVFBLENBQUNBLENBQUNBLENBQUNBO2FBQ3ZFQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxJQUFJQSxLQUFLQSxvQkFBU0EsQ0FBQ0E7aUJBQUNBLENBQUNBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0E7YUFDckZBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO1NBQ3BCQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsS0FBS0EsS0FBS0EsS0FBS0EsQ0FBQ0EsUUFB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Q0FBQ0E7QUFDakRBLEVBQUNBO0FBRUQ7Ozs7OztLQU1JO0FBQ0osNkJBQTRCLElBQVk7S0FDdENDLEVBQUVBLENBQUNBLENBQUNBLElBQUlBLElBQUlBLEdBQUdBLENBQUNBO1NBQUNBLE1BQU1BLENBQUNBLEdBQUdBLENBQUNBO0tBRTVCQSxJQUFJQSxZQUFZQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxJQUFJQSxHQUFHQSxHQUFHQSxHQUFHQSxHQUFHQSxFQUFFQSxDQUFDQTtLQUM3Q0EsSUFBSUEsYUFBYUEsR0FBR0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsS0FBS0EsR0FBR0EsR0FBR0EsR0FBR0EsR0FBR0EsRUFBRUEsQ0FBQ0E7S0FDN0RBLElBQUlBLFFBQVFBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBO0tBRS9CQSxJQUFJQSxHQUFHQSxHQUFhQSxFQUFFQSxDQUFDQTtLQUN2QkEsSUFBSUEsRUFBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0E7S0FDWEEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsR0FBR0EsQ0FBQ0EsRUFBRUEsR0FBR0EsR0FBR0EsUUFBUUEsQ0FBQ0EsTUFBTUEsRUFBRUEsR0FBR0EsRUFBRUEsRUFBRUEsQ0FBQ0E7U0FDL0NBLElBQUlBLE9BQU9BLEdBQUdBLFFBQVFBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBO1NBQzVCQSxNQUFNQSxDQUFDQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNoQkEsS0FBS0EsRUFBRUEsQ0FBQ0E7YUFDUkEsS0FBS0EsR0FBR0E7aUJBQ05BLEtBQUtBLENBQUNBO2FBQ1JBLEtBQUtBLElBQUlBO2lCQUNQQSxFQUFFQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxNQUFNQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtxQkFDbkJBLEdBQUdBLENBQUNBLEdBQUdBLEVBQUVBLENBQUNBO2lCQUNaQSxDQUFDQTtpQkFBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7cUJBQ05BLEVBQUVBLEVBQUVBLENBQUNBO2lCQUNQQSxDQUFDQTtpQkFDREEsS0FBS0EsQ0FBQ0E7YUFDUkE7aUJBQ0VBLEdBQUdBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBO1NBQ3RCQSxDQUFDQTtLQUNIQSxDQUFDQTtLQUVEQSxFQUFFQSxDQUFDQSxDQUFDQSxZQUFZQSxJQUFJQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQTtTQUN2QkEsT0FBT0EsRUFBRUEsRUFBRUEsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0E7YUFDaEJBLEdBQUdBLENBQUNBLE9BQU9BLENBQUNBLElBQUlBLENBQUNBLENBQUNBO1NBQ3BCQSxDQUFDQTtTQUVEQSxFQUFFQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxNQUFNQSxLQUFLQSxDQUFDQSxDQUFDQTthQUFDQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQTtLQUN0Q0EsQ0FBQ0E7S0FFREEsTUFBTUEsQ0FBQ0EsWUFBWUEsR0FBR0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsYUFBYUEsQ0FBQ0E7QUFDdERBLEVBQUNBO0FBRUQ7Ozs7O0lBS0c7QUFDSCxtQ0FBa0MsS0FBWTtLQUM1Q0MsSUFBSUEsSUFBSUEsR0FBR0EsS0FBS0EsQ0FBQ0EsZUFBZUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7S0FDdkNBLElBQUlBLEdBQUdBLGNBQU9BLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLGtCQUFrQkEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7S0FDckRBLEtBQUtBLENBQUNBLGVBQWVBLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO0tBRW5DQSxNQUFNQSxDQUFDQSxzQkFBc0JBLENBQUNBLEtBQUtBLENBQUNBLGVBQWVBLENBQUNBLE1BQU1BLENBQUNBLEVBQUVBLEtBQUtBLENBQUNBLGVBQWVBLENBQUNBLFFBQVFBLENBQUNBLEVBQzlEQSxLQUFLQSxDQUFDQSxlQUFlQSxDQUFDQSxNQUFNQSxDQUFDQSxFQUFFQSxLQUFLQSxDQUFDQSxlQUFlQSxDQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxJQUFJQSxFQUNoRUEsS0FBS0EsQ0FBQ0EsZUFBZUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsRUFBRUEsS0FBS0EsQ0FBQ0EsZUFBZUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7QUFDbkdBLEVBQUNBO0FBRUQ7Ozs7O0lBS0c7QUFDSCxzQkFBcUIsSUFBWSxFQUFFLEdBQVc7S0FDNUNDLElBQUlBLEtBQUtBLEdBQUdBLE1BQU1BLENBQUNBLFNBQVNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBO0tBQ25DQSxJQUFJQSxTQUFTQSxHQUFHQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtLQUU3QkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLEtBQUtBLENBQUNBLGVBQWVBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO1NBQzdDQSxNQUFNQSxDQUFDQSx3QkFBd0JBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBO0tBQ3pDQSxDQUFDQTtLQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUNOQSxLQUFLQSxDQUFDQSxlQUFlQSxDQUFDQSxNQUFNQSxDQUFDQSxHQUFHQSxTQUFTQSxDQUFDQSxlQUFlQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQTtLQUNwRUEsQ0FBQ0E7S0FFREEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsZUFBZUEsQ0FBQ0EsTUFBTUEsRUFBRUEsQ0FBQ0EsSUFBSUEsZUFBZUEsQ0FBQ0EsSUFBSUEsRUFBRUEsQ0FBQ0EsRUFBRUEsRUFBRUEsQ0FBQ0E7U0FDcEVBLEVBQUVBLENBQUNBLENBQUNBLGNBQU9BLENBQUNBLEtBQUtBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNB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Q0MsWUFBT0EsR0FBUEEsT0FBT0EsQ0FBUUE7U0FBU0EsUUFBR0EsR0FBSEEsR0FBR0EsQ0FBUUE7S0FBR0EsQ0FBQ0E7S0FDNURELHNCQUFDQTtBQUFEQSxFQUFDQSxJQUFBO0FBRlksd0JBQWUsa0JBRTNCO0FBRUQ7S0FDRUUsb0JBQW1CQSxRQUF1QkEsRUFBU0EsR0FBV0E7U0FBM0NDLGFBQVFBLEdBQVJBLFFBQVFBLENBQWVBO1NBQVNBLFFBQUdBLEdBQUhBLEdBQUdBLENBQVFBO0tBQUdBLENBQUNBO0tBRWxFRCw2QkFBUUEsR0FBUkE7U0FDRUUsSUFBSUEsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0E7U0FDeENBLElBQUlBLFFBQVFBLEdBQUdBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLE1BQU1BLENBQUNBO1NBQ3BDQSxFQUFFQSxDQUFDQSxDQUFDQSxRQUFRQSxHQUFHQSxNQUFNQSxDQUFDQSxNQUFNQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNqQ0EsUUFBUUEsR0FBR0EsTUFBTUEsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0E7U0FDL0JBLENBQUNBO1NBQ0RBLElBQUlBLE1BQU1BLEdBQUdBLFFBQVFBLENBQUNBO1NBQ3RCQSxJQUFJQSxNQUFNQSxHQUFHQSxDQUFDQSxDQUFDQTtTQUNmQSxJQUFJQSxRQUFRQSxHQUFHQSxDQUFDQSxDQUFDQTtTQUVqQkEsT0FBT0EsTUFBTUEsR0FBR0EsR0FBR0EsSUFBSUEsUUFBUUEsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0E7YUFDcENBLFFBQVFBLEVBQUVBLENBQUNBO2FBQ1hBLE1BQU1BLEVBQUVBLENBQUNBO2FBQ1RBLEVBQUVBLENBQUNBLENBQUNBLE1BQU1BLENBQUNBLFFBQVFBLENBQUNBLElBQUlBLElBQUlBLENBQUNBLENBQUNBLENBQUNBO2lCQUM3QkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsUUFBUUEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0Es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QU0sRUFBRSxRQUFRO0tBQ2hCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLEtBQUssRUFBRSxRQUFRO0tBQ2YsUUFBUSxFQUFFLFFBQVE7S0FDbEIsUUFBUSxFQUFFLFFBQVE7S0FDbEIsT0FBTyxFQUFFLFFBQVE7S0FDakIsTUFBTSxFQUFFLFFBQVE7S0FDaEIsS0FBSyxFQUFFLFFBQVE7S0FDZixLQUFLLEVBQUUsUUFBUTtLQUNmLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLEtBQUssRUFBRSxRQUFRO0tBQ2YsUUFBUSxFQUFFLFFBQVE7S0FDbEIsUUFBUSxFQUFFLFFBQVE7S0FDbEIsUUFBUSxFQUFFLFFBQVE7S0FDbEIsTUFBTSxFQUFFLFFBQVE7S0FDaEIsTUFBTSxFQUFFLFFBQVE7S0FDaEIsS0FBSyxFQUFFLFFBQVE7S0FDZixPQUFPLEVBQUUsUUFBUTtLQUNqQixPQUFPLEVBQUUsUUFBUTtLQUNqQixPQUFPLEVBQUUsUUFBUTtLQUNqQixRQUFRLEVBQUUsUUFBUTtLQUNsQixRQUFRLEVBQUUsUUFBUTtLQUNsQixRQUFRLEVBQUUsUUFBUTtLQUNsQixPQUFPLEVBQUUsUUFBUTtLQUNqQixPQUFPLEVBQUUsUUFBUTtLQUNqQixRQUFRLEVBQUUsUUFBUTtLQUNsQixRQUFRLEVBQUUsUUFBUTtLQUNsQixPQUFPLEVBQUUsUUFBUTtLQUNqQixNQUFNLEVBQUUsUUFBUTtLQUNoQixNQUFNLEVBQUUsUUFBUTtLQUNoQixTQUFTLEVBQUUsUUFBUTtLQUNuQixTQUFTLEVBQUUsUUFBUTtLQUNuQixPQUFPLEVBQUUsUUFBUTtLQUNqQixLQUFLLEVBQUUsUUFBUTtLQUNmLEtBQUssRUFBRSxRQUFRO0tBQ2YsS0FBSyxFQUFFLFFBQVE7S0FDZixLQUFLLEVBQUUsUUFBUTtLQUNmLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLElBQUksRUFBRSxRQUFRO0tBQ2QsSUFBSSxFQUFFLEdBQUc7S0FDVCxNQUFNLEVBQUUsUUFBUTtLQUNoQixNQUFNLEVBQUUsUUFBUTtLQUNoQixRQUFRLEVBQUUsUUFBUTtLQUNsQixRQUFRLEVBQUUsUUFBUTtLQUNsQixRQUFRLEVBQUUsUUFBUTtLQUNsQixRQUFRLEVBQUUsUUFBUTtLQUNsQixPQUFPLEVBQUUsUUFBUTtLQUNqQixPQUFPLEVBQUUsUUFBUTtLQUNqQixPQUFPLEVBQUUsUUFBUTtLQUNqQixRQUFRLEVBQUUsUUFBUTtLQUNsQixRQUFRLEVBQUUsUUFBUTtLQUNsQixPQUFPLEVBQUUsUUFBUTtLQUNqQixPQUFPLEVBQUUsUUFBUTtLQUNqQixLQUFLLEVBQUUsUUFBUTtLQUNmLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLElBQUksRUFBRSxRQUFRO0tBQ2QsUUFBUSxFQUFFLFFBQVE7S0FDbEIsUUFBUSxFQUFFLFFBQVE7S0FDbEIsS0FBSyxFQUFFLFFBQVE7S0FDZixLQUFLLEVBQUUsUUFBUTtLQUNmLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLElBQUksRUFBRSxHQUFHO0tBQ1QsTUFBTSxFQUFFLFFBQVE7S0FDaEIsT0FBTyxFQUFFLFFBQVE7S0FDakIsT0FBTyxFQUFFLFFBQVE7S0FDakIsUUFBUSxFQUFFLFFBQVE7S0FDbEIsT0FBTyxFQUFFLFFBQVE7S0FDakIsSUFBSSxFQUFFLFFBQVE7S0FDZCxJQUFJLEVBQUUsUUFBUTtLQUNkLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLElBQUksRUFBRSxRQUFRO0tBQ2QsSUFBSSxFQUFFLFFBQVE7S0FDZCxLQUFLLEVBQUUsUUFBUTtLQUNmLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLElBQUksRUFBRSxRQUFRO0tBQ2QsSUFBSSxFQUFFLFFBQVE7S0FDZCxRQUFRLEVBQUUsUUFBUTtLQUNsQixRQUFRLEVBQUUsUUFBUTtLQUNsQixPQUFPLEVBQUUsUUFBUTtLQUNqQixPQUFPLEVBQUUsUUFBUTtLQUNqQixPQUFPLEVBQUUsUUFBUTtLQUNqQixPQUFPLEVBQUUsUUFBUTtLQUNqQixRQUFRLEVBQUUsUUFBUTtLQUNsQixRQUFRLEVBQUUsUUFBUTtLQUNsQixPQUFPLEVBQUUsUUFBUTtLQUNqQixPQUFPLEVBQUUsUUFBUTtLQUNqQixPQUFPLEVBQUUsUUFBUTtLQUNqQixTQUFTLEVBQUUsUUFBUTtLQUNuQixTQUFTLEVBQUUsUUFBUTtLQUNuQixPQUFPLEVBQUUsUUFBUTtLQUNqQixJQUFJLEVBQUUsUUFBUTtLQUNkLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLEtBQUssRUFBRSxRQUFRO0tBQ2YsS0FBSyxFQUFFLFFBQVE7S0FDZixJQUFJLEVBQUUsUUFBUTtLQUNkLElBQUksRUFBRSxRQUFRO0tBQ2QsS0FBSyxFQUFFLFFBQVE7S0FDZixRQUFRLEVBQUUsUUFBUTtLQUNsQixPQUFPLEVBQUUsUUFBUTtLQUNqQixPQUFPLEVBQUUsUUFBUTtLQUNqQixPQUFPLEVBQUUsUUFBUTtLQUNqQixNQUFNLEVBQUUsUUFBUTtLQUNoQixNQUFNLEVBQUUsUUFBUTtLQUNoQixLQUFLLEVBQUUsUUFBUTtLQUNmLEtBQUssRUFBRSxRQUFRO0tBQ2YsTUFBTSxFQUFFLFFBQVE7S0FDaEIsT0FBTyxFQUFFLFFBQVE7S0FDakIsTUFBTSxFQUFFLFFBQVE7S0FDaEIsT0FBTyxFQUFFLFFBQVE7S0FDakIsTUFBTSxFQUFFLFFBQVE7S0FDaEIsTUFBTSxFQUFFLFFBQVE7S0FDaEIsT0FBTyxFQUFFLFFBQVE7S0FDakIsT0FBTyxFQUFFLFFBQVE7S0FDakIsTUFBTSxFQUFFLFFBQVE7S0FDaEIsS0FBSyxFQUFFLFFBQVE7S0FDZixRQUFRLEVBQUUsUUFBUTtLQUNsQixLQUFLLEVBQUUsUUFBUTtLQUNmLEtBQUssRUFBRSxRQUFRO0tBQ2YsS0FBSyxFQUFFLFFBQVE7S0FDZixRQUFRLEVBQUUsUUFBUTtLQUNsQixPQUFPLEVBQUUsUUFBUTtLQUNqQixPQUFPLEVBQUUsUUFBUTtLQUNqQixRQUFRLEVBQUUsUUFBUTtLQUNsQixRQUFRLEVBQUUsUUFBUTtLQUNsQixNQUFNLEVBQUUsUUFBUTtLQUNoQixNQUFNLEVBQUUsUUFBUTtLQUNoQixLQUFLLEVBQUUsUUFBUTtLQUNmLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLEtBQUssRUFBRSxRQUFRO0tBQ2YsUUFBUSxFQUFFLFFBQVE7S0FDbEIsS0FBSyxFQUFFLFFBQVE7S0FDZixNQUFNLEVBQUUsUUFBUTtLQUNoQixLQUFLLEVBQUUsUUFBUTtLQUNmLEtBQUssRUFBRSxRQUFRO0tBQ2YsTUFBTSxFQUFFLFFBQVE7S0FDaEIsTUFBTSxFQUFFLFFBQVE7S0FDaEIsTUFBTSxFQUFFLFFBQVE7S0FDaEIsTUFBTSxFQUFFLFFBQVE7S0FDaEIsT0FBTyxFQUFFLFFBQVE7S0FDakIsS0FBSyxFQUFFLFFBQVE7S0FDZixLQUFLLEVBQUUsUUFBUTtLQUNmLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLFVBQVUsRUFBRSxRQUFRO0tBQ3BCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLEtBQUssRUFBRSxRQUFRO0tBQ2YsT0FBTyxFQUFFLFFBQVE7S0FDakIsU0FBUyxFQUFFLFFBQVE7S0FDbkIsU0FBUyxFQUFFLFFBQVE7S0FDbkIsTUFBTSxFQUFFLFFBQVE7S0FDaEIsTUFBTSxFQUFFLFFBQVE7S0FDaEIsUUFBUSxFQUFFLFFBQVE7S0FDbEIsSUFBSSxFQUFF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LElBQUlBLENBQUNBO1NBQzFDQSxJQUFJQSxDQUFDQSxHQUFHQSxHQUFHQSxnQkFBU0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsR0FBR0EsR0FBR0EsSUFBSUEsQ0FBQ0E7U0FDdkNBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLGdCQUFTQSxDQUFDQSxNQUFNQSxDQUFDQSxHQUFHQSxDQUFDQSxlQUFRQSxDQUFDQSxNQUFNQSxDQUFDQSxHQUFHQSxJQUFJQSxtQ0FBZUEsQ0FBU0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0E7YUFDcEJBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBO2FBQzlDQSxJQUFJQSxDQUFDQTtLQUN6Q0EsQ0FBQ0E7S0FFREQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztRQXdCR0E7S0FDSEEsOEJBQUtBLEdBQUxBLFVBQU1BLE9BQTRCQTtTQUNoQ0UsTUFBTUEsQ0FBQ0EsSUFBSUEsY0FBY0EsQ0FBQ0E7YUFDeEJBLE1BQU1BLEVBQUVBLGdCQUFTQSxDQUFDQSxPQUFPQSxDQUFDQSxJQUFJQSxnQkFBU0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsR0FBR0EsT0FBT0EsQ0FBQ0EsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsTUFBTUE7YUFDdEZBLE9BQU9BLEVBQUVBLGdCQUFTQSxDQUFDQSxPQUFPQSxDQUFDQSxJQUFJQSxnQkFBU0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsR0FBR0EsT0FBT0EsQ0FBQ0EsT0FBT0EsR0FBR0EsSUFBSUEsQ0FBQ0EsT0FBT0E7YUFDMUZBLElBQUlBLEVBQUVBLGdCQUFTQSxDQUFDQSxPQUFPQSxDQUFDQSxJQUFJQSxnQkFBU0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsT0FBT0EsQ0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsQ0FBQ0EsSUFBSUE7YUFDOUVBLEdBQUdBLEVBQUVBLGdCQUFTQSxDQUFDQSxPQUFPQSxDQUFDQSxJQUFJQSxnQkFBU0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBQ0Es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QUNBO1NBQzdFQSxNQUFNQSxDQUFDQSxJQUFJQSxtQ0FBVUEsQ0FBQ0E7YUFDcEJBLElBQUlBLEVBQUVBLE1BQU1BLENBQUNBLElBQUlBO2FBQ2pCQSxNQUFNQSxFQUFFQSxhQUFhQTthQUNyQkEsSUFBSUEsRUFBRUEsTUFBTUEsQ0FBQ0EsSUFBSUE7YUFDakJBLElBQUlBLEVBQUVBLE1BQU1BLENBQUNBLElBQUlBO2FBQ2pCQSxZQUFZQSxFQUFFQSxNQUFNQSxDQUFDQSxZQUFZQTtVQUNsQ0EsQ0FBQ0EsQ0FBQ0E7S0FDTEEsQ0FBQ0E7S0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsWUFBWUEsOEJBQUtBLElBQUlBLE1BQU1BLFlBQVlBLGlDQUFRQSxJQUFJQSxNQUFNQSxZQUFZQSxpQ0FBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7U0FDeEZBLE1BQU1BLENBQWtCQSxNQUFNQSxDQUFDQTtLQUNqQ0EsQ0FBQ0E7S0FFREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7U0FDN0VBLE1BQU1BLElBQUlBLDBCQUFhQSxDQUNuQkEsZ0dBQTBGQSxDQUFDQSxDQUFDQTtLQUNsR0EsQ0FBQ0E7S0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsRUFBRUEsSUFBSUEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7U0FDN0JBLE1BQU1BLElBQUlBLDBCQUFhQSxDQUFDQSxzRUFBa0VBLENBQUNBLENBQUNBO0tBQzlGQSxDQUFDQTtLQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxNQUFNQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQTtTQUNkQSxNQUFNQSxD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Q0FBQ0E7aUNBQ25CQSxJQUFJQSxTQUFTQSxDQUFDQSxLQUFLQSxFQUFFQSxTQUFTQSxLQUFLQSxhQUFhQSxHQUFHQSxLQUFLQSxHQUFHQSxTQUFTQSxDQUFDQSxDQUFDQTs2QkFDMUVBLFNBQVNBLEdBQUdBLEtBQUtBLENBQUNBO3lCQUNwQkEsQ0FBQ0E7eUJBQ0RBLEtBQUlBLENBQUNBLFNBQVNBLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLEtBQUtBLENBQUNBO3FCQUMvQkEsQ0FBQ0EsQ0FBQ0E7aUJBQ0pBLENBQUNBLENBQUNBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO2lCQUNmQSxLQUFLQSxDQUFDQSxRQUFRQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxFQUFFQSxTQUFTQSxDQUFDQSxDQUFDQTthQUN4Q0EsQ0FBQ0E7YUFBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsY0FBY0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQ2hEQSxJQUFJQSxHQUFHQSxLQUFLQSxDQUFDQSxLQUFLQSxDQUFDQSxRQUFRQSxDQUFDQSxDQUFDQTthQUMvQkEsQ0FBQ0E7YUFBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsY0FBY0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQ25EQSxJQUFJQSxHQUFHQSxLQUFLQSxDQUFDQSxLQUFLQSxDQUFDQSxXQUFXQSxDQUFDQSxDQUFDQTthQUNsQ0EsQ0FBQ0E7YUFBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsY0FBY0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsVUFBVUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQ2xEQSxJQUFJQSxHQUFHQSxLQUFLQSxDQUFDQSxLQUFLQSxDQUFDQSxVQUFVQSxDQUFDQSxDQUFDQTthQUNqQ0EsQ0FBQ0E7YUFB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LmRldi5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIlJ4XCIpLCByZXF1aXJlKFwicnhqcy9vYnNlcnZhYmxlL2Zyb21Qcm9taXNlXCIpLCByZXF1aXJlKFwicnhqcy9vcGVyYXRvci90b1Byb21pc2VcIikpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW1wiUnhcIiwgXCJyeGpzL29ic2VydmFibGUvZnJvbVByb21pc2VcIiwgXCJyeGpzL29wZXJhdG9yL3RvUHJvbWlzZVwiXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJuZ1wiXSA9IGZhY3RvcnkocmVxdWlyZShcIlJ4XCIpLCByZXF1aXJlKFwicnhqcy9vYnNlcnZhYmxlL2Zyb21Qcm9taXNlXCIpLCByZXF1aXJlKFwicnhqcy9vcGVyYXRvci90b1Byb21pc2VcIikpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIm5nXCJdID0gZmFjdG9yeShyb290W1wiUnhcIl0sIHJvb3RbXCJSeFwiXVtcIk9ic2VydmFibGVcIl0sIHJvb3RbXCJSeFwiXVtcIk9ic2VydmFibGVcIl1bXCJwcm90b3R5cGVcIl0pO1xufSkodGhpcywgZnVuY3Rpb24oX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV82Ml9fLCBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzYzX18sIF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfNjRfXykge1xucmV0dXJuIFxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIHdlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvblxuICoqLyIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRleHBvcnRzOiB7fSxcbiBcdFx0XHRpZDogbW9kdWxlSWQsXG4gXHRcdFx0bG9hZGVkOiBmYWxzZVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sb2FkZWQgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogd2VicGFjay9ib290c3RyYXAgZmI5OTM1NjkxM2YyNjRiYmVlYTFcbiAqKi8iLCJleHBvcnRzLmNvcmUgPSByZXF1aXJlKCdhbmd1bGFyMi9jb3JlJyk7XG5leHBvcnRzLmNvbW1vbiA9IHJlcXVpcmUoJ2FuZ3VsYXIyL2NvbW1vbicpO1xuZXhwb3J0cy5jb21waWxlciA9IHJlcXVpcmUoJ2FuZ3VsYXIyL2NvbXBpbGVyJyk7XG5leHBvcnRzLnBsYXRmb3JtID0ge1xuICBicm93c2VyOiByZXF1aXJlKCdhbmd1bGFyMi9wbGF0Zm9ybS9icm93c2VyJyksXG4gIGNvbW1vbl9kb206IHJlcXVpcmUoJ2FuZ3VsYXIyL3BsYXRmb3JtL2NvbW1vbl9kb20nKVxufTtcbmV4cG9ydHMuaHR0cCA9IHJlcXVpcmUoJ2FuZ3VsYXIyL2h0dHAnKTtcbmV4cG9ydHMucm91dGVyID0gcmVxdWlyZSgnYW5ndWxhcjIvcm91dGVyJyk7XG5leHBvcnRzLnJvdXRlcl9saW5rX2RzbCA9IHJlcXVpcmUoJ2FuZ3VsYXIyL3JvdXRlci9yb3V0ZXJfbGlua19kc2wuanMnKTtcbmV4cG9ydHMuaW5zdHJ1bWVudGF0aW9uID0gcmVxdWlyZSgnYW5ndWxhcjIvaW5zdHJ1bWVudGF0aW9uJyk7XG5leHBvcnRzLnVwZ3JhZGUgPSByZXF1aXJlKCdhbmd1bGFyMi91cGdyYWRlJyk7XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vdG9vbHMvYnVpbGQvd2VicGFjay9hbmd1bGFyMi1hbGwudW1kLmpzXG4gKiogbW9kdWxlIGlkID0gMVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLyoqXG4gKiBAbW9kdWxlXG4gKiBAZGVzY3JpcHRpb25cbiAqIFN0YXJ0aW5nIHBvaW50IHRvIGltcG9ydCBhbGwgcHVibGljIGNvcmUgQVBJcy5cbiAqL1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvY29yZS9tZXRhZGF0YSc7XG5leHBvcnQgKiBmcm9tICcuL3NyYy9jb3JlL3V0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvY29yZS9wcm9kX21vZGUnO1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvY29yZS9kaSc7XG5leHBvcnQgKiBmcm9tICcuL3NyYy9mYWNhZGUvZmFjYWRlJztcbmV4cG9ydCB7ZW5hYmxlUHJvZE1vZGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5leHBvcnQge3BsYXRmb3JtLCBjcmVhdGVOZ1pvbmUsIFBsYXRmb3JtUmVmLCBBcHBsaWNhdGlvblJlZn0gZnJvbSAnLi9zcmMvY29yZS9hcHBsaWNhdGlvbl9yZWYnO1xuZXhwb3J0IHtcbiAgQVBQX0lELFxuICBBUFBfQ09NUE9ORU5ULFxuICBBUFBfSU5JVElBTElaRVIsXG4gIFBBQ0tBR0VfUk9PVF9VUkwsXG4gIFBMQVRGT1JNX0lOSVRJQUxJWkVSXG59IGZyb20gJy4vc3JjL2NvcmUvYXBwbGljYXRpb25fdG9rZW5zJztcbmV4cG9ydCAqIGZyb20gJy4vc3JjL2NvcmUvem9uZSc7XG5leHBvcnQgKiBmcm9tICcuL3NyYy9jb3JlL3JlbmRlcic7XG5leHBvcnQgKiBmcm9tICcuL3NyYy9jb3JlL2xpbmtlcic7XG5leHBvcnQge1xuICBEZWJ1Z0VsZW1lbnQsXG4gIFNjb3BlLFxuICBpbnNwZWN0RWxlbWVudCxcbiAgYXNOYXRpdmVFbGVtZW50c1xufSBmcm9tICcuL3NyYy9jb3JlL2RlYnVnL2RlYnVnX2VsZW1lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvY29yZS90ZXN0YWJpbGl0eS90ZXN0YWJpbGl0eSc7XG5leHBvcnQgKiBmcm9tICcuL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvY29yZS9wbGF0Zm9ybV9kaXJlY3RpdmVzX2FuZF9waXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL3NyYy9jb3JlL3BsYXRmb3JtX2NvbW1vbl9wcm92aWRlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvY29yZS9hcHBsaWNhdGlvbl9jb21tb25fcHJvdmlkZXJzJztcbmV4cG9ydCAqIGZyb20gJy4vc3JjL2NvcmUvcmVmbGVjdGlvbi9yZWZsZWN0aW9uJztcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL2NvcmUudHNcbiAqKi8iLCIvKipcbiAqIFRoaXMgaW5kaXJlY3Rpb24gaXMgbmVlZGVkIHRvIGZyZWUgdXAgQ29tcG9uZW50LCBldGMgc3ltYm9scyBpbiB0aGUgcHVibGljIEFQSVxuICogdG8gYmUgdXNlZCBieSB0aGUgZGVjb3JhdG9yIHZlcnNpb25zIG9mIHRoZXNlIGFubm90YXRpb25zLlxuICovXG5cbmV4cG9ydCB7XG4gIFF1ZXJ5TWV0YWRhdGEsXG4gIENvbnRlbnRDaGlsZHJlbk1ldGFkYXRhLFxuICBDb250ZW50Q2hpbGRNZXRhZGF0YSxcbiAgVmlld0NoaWxkcmVuTWV0YWRhdGEsXG4gIFZpZXdRdWVyeU1ldGFkYXRhLFxuICBWaWV3Q2hpbGRNZXRhZGF0YSxcbiAgQXR0cmlidXRlTWV0YWRhdGFcbn0gZnJvbSAnLi9tZXRhZGF0YS9kaSc7XG5cbmV4cG9ydCB7XG4gIENvbXBvbmVudE1ldGFkYXRhLFxuICBEaXJlY3RpdmVNZXRhZGF0YSxcbiAgUGlwZU1ldGFkYXRhLFxuICBJbnB1dE1ldGFkYXRhLFxuICBPdXRwdXRNZXRhZGF0YSxcbiAgSG9zdEJpbmRpbmdNZXRhZGF0YSxcbiAgSG9zdExpc3RlbmVyTWV0YWRhdGFcbn0gZnJvbSAnLi9tZXRhZGF0YS9kaXJlY3RpdmVzJztcblxuZXhwb3J0IHtWaWV3TWV0YWRhdGEsIFZpZXdFbmNhcHN1bGF0aW9ufSBmcm9tICcuL21ldGFkYXRhL3ZpZXcnO1xuXG5pbXBvcnQge1xuICBRdWVyeU1ldGFkYXRhLFxuICBDb250ZW50Q2hpbGRyZW5NZXRhZGF0YSxcbiAgQ29udGVudENoaWxkTWV0YWRhdGEsXG4gIFZpZXdDaGlsZHJlbk1ldGFkYXRhLFxuICBWaWV3Q2hpbGRNZXRhZGF0YSxcbiAgVmlld1F1ZXJ5TWV0YWRhdGEsXG4gIEF0dHJpYnV0ZU1ldGFkYXRhXG59IGZyb20gJy4vbWV0YWRhdGEvZGknO1xuXG5pbXBvcnQge1xuICBDb21wb25lbnRNZXRhZGF0YSxcbiAgRGlyZWN0aXZlTWV0YWRhdGEsXG4gIFBpcGVNZXRhZGF0YSxcbiAgSW5wdXRNZXRhZGF0YSxcbiAgT3V0cHV0TWV0YWRhdGEsXG4gIEhvc3RCaW5kaW5nTWV0YWRhdGEsXG4gIEhvc3RMaXN0ZW5lck1ldGFkYXRhXG59IGZyb20gJy4vbWV0YWRhdGEvZGlyZWN0aXZlcyc7XG5cbmltcG9ydCB7Vmlld01ldGFkYXRhLCBWaWV3RW5jYXBzdWxhdGlvbn0gZnJvbSAnLi9tZXRhZGF0YS92aWV3JztcbmltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3l9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vY2hhbmdlX2RldGVjdGlvbic7XG5cbmltcG9ydCB7XG4gIG1ha2VEZWNvcmF0b3IsXG4gIG1ha2VQYXJhbURlY29yYXRvcixcbiAgbWFrZVByb3BEZWNvcmF0b3IsXG4gIFR5cGVEZWNvcmF0b3IsXG4gIENsYXNzXG59IGZyb20gJy4vdXRpbC9kZWNvcmF0b3JzJztcbmltcG9ydCB7VHlwZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIHRoZSB7QGxpbmsgRGlyZWN0aXZlTWV0YWRhdGF9IGRlY29yYXRvciBmdW5jdGlvbi5cbiAqXG4gKiBTZWUge0BsaW5rIERpcmVjdGl2ZUZhY3Rvcnl9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERpcmVjdGl2ZURlY29yYXRvciBleHRlbmRzIFR5cGVEZWNvcmF0b3Ige31cblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIHRoZSB7QGxpbmsgQ29tcG9uZW50TWV0YWRhdGF9IGRlY29yYXRvciBmdW5jdGlvbi5cbiAqXG4gKiBTZWUge0BsaW5rIENvbXBvbmVudEZhY3Rvcnl9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudERlY29yYXRvciBleHRlbmRzIFR5cGVEZWNvcmF0b3Ige1xuICAvKipcbiAgICogQ2hhaW4ge0BsaW5rIFZpZXdNZXRhZGF0YX0gYW5ub3RhdGlvbi5cbiAgICovXG4gIFZpZXcob2JqOiB7XG4gICAgdGVtcGxhdGVVcmw/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+IElNb2R1bGUsXG4gIGVsZW1lbnQ6IChlOiBFbGVtZW50KSA9PiBJQXVnbWVudGVkSlF1ZXJ5LFxuICB2ZXJzaW9uOiB7bWFqb3I6IG51bWJlcn1cbn0gPSA8YW55Pntib290c3RyYXA6IG5vTmcsIG1vZHVsZTogbm9OZywgZWxlbWVudDogbm9OZywgdmVyc2lvbjogbm9OZ307XG5cblxudHJ5IHtcbiAgaWYgKHdpbmRvdy5oYXNPd25Qcm9wZXJ0eSgnYW5ndWxhcicpKSB7XG4gICAgYW5ndWxhciA9ICg8YW55PndpbmRvdykuYW5ndWxhcjtcbiAgfVxufSBjYXRjaCAoZSkge1xuICAvLyBpZ25vcmUgaW4gQ0pTIG1vZGUuXG59XG5cbmV4cG9ydCB2YXIgYm9vdHN0cmFwID0gYW5ndWxhci5ib290c3RyYXA7XG5leHBvcnQgdmFyIG1vZHVsZSA9IGFuZ3VsYXIubW9kdWxlO1xuZXhwb3J0IHZhciBlbGVtZW50ID0gYW5ndWxhci5lbGVtZW50O1xuZXhwb3J0IHZhciB2ZXJzaW9uID0gYW5ndWxhci52ZXJzaW9uO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3VwZ3JhZGUvYW5ndWxhcl9qcy50c1xuICoqLyJdLCJzb3VyY2VSb290IjoiIn0=